coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
lockdown.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootstate.h>
4 #include <intelblocks/cfg.h>
5 #include <intelblocks/fast_spi.h>
6 #include <intelblocks/lpc_lib.h>
7 #include <intelblocks/pcr.h>
9 #include <intelpch/lockdown.h>
10 #include <intelblocks/gpmr.h>
11 #include <soc/pci_devs.h>
12 #include <soc/pcr_ids.h>
13 #include <soc/soc_chip.h>
14 
15 /*
16  * This function will get lockdown config specific to soc.
17  *
18  * Return values:
19  * 0 = CHIPSET_LOCKDOWN_COREBOOT = Use coreboot to lockdown IPs
20  * 1 = CHIPSET_LOCKDOWN_FSP = use FSP's lockdown functionality to lockdown IPs
21  */
23 {
24  const struct soc_intel_common_config *common_config;
25  common_config = chip_get_common_soc_structure();
26 
27  return common_config->chipset_lockdown;
28 }
29 
30 static void gpmr_lockdown_cfg(void)
31 {
32  /*
33  * GCS reg of DMI
34  *
35  * When set, prevents GCS.BBS from being changed
36  * GCS.BBS: (Boot BIOS Strap) This field determines the destination
37  * of accesses to the BIOS memory range.
38  * Bits Description
39  * "0b": SPI
40  * "1b": LPC/eSPI
41  */
43 
44  /*
45  * Set Secure Register Lock (SRL) bit in DMI control register to lock
46  * DMI configuration.
47  */
49 }
50 
52 {
53  if (!CONFIG(SOC_INTEL_COMMON_BLOCK_FAST_SPI))
54  return;
55 
56  /* Set FAST_SPI opcode menu */
58 
59  /* Discrete Lock Flash PR registers */
61 
62  /* Check if SPI transaction is pending */
64 
65  /* Clear any outstanding status bits like AEL, FCERR, FDONE, SAF etc. */
67 
68  /* Lock FAST_SPIBAR */
70 
71  /* Set Vendor Component Lock (VCL) */
73 
74  /* Set BIOS Interface Lock, BIOS Lock */
76  /* BIOS Interface Lock */
78 
79  /* Only allow writes in SMM */
80  if (CONFIG(BOOTMEDIA_SMM_BWP)) {
83  }
84 
85  /* BIOS Lock */
87 
88  /* EXT BIOS Lock */
90  }
91 }
92 
94 {
95  /* Set BIOS Interface Lock, BIOS Lock */
97  /* BIOS Interface Lock */
99 
100  /* Only allow writes in SMM */
101  if (CONFIG(BOOTMEDIA_SMM_BWP)) {
102  lpc_set_eiss();
103  lpc_enable_wp();
104  }
105 
106  /* BIOS Lock */
108  }
109 }
110 
112 {
113  if (!CONFIG(SOC_INTEL_COMMON_BLOCK_SA))
114  return;
115 
117  sa_lock_pam();
118 }
119 
120 /*
121  * platform_lockdown_config has 2 major part.
122  * 1. Common SoC lockdown configuration.
123  * 2. SoC specific lockdown configuration as per Silicon
124  * guideline.
125  */
126 static void platform_lockdown_config(void *unused)
127 {
128  int chipset_lockdown;
130 
131  /* SPI lock down configuration */
133 
134  /* LPC/eSPI lock down configuration */
136 
137  /* GPMR lock down configuration */
139 
140  /* SA lock down configuration */
142 
143  /* SoC lock down configuration */
145 }
146 
148  NULL);
@ BS_DEV_RESOURCES
Definition: bootstate.h:81
@ BS_ON_EXIT
Definition: bootstate.h:96
void sa_lock_pam(void)
Definition: systemagent.c:309
@ CONFIG
Definition: dsi_common.h:201
void fast_spi_set_lock_enable(void)
Definition: fast_spi.c:93
void fast_spi_set_ext_bios_lock_enable(void)
Definition: fast_spi.c:103
void fast_spi_vscc0_lock(void)
Definition: fast_spi.c:176
void fast_spi_set_eiss(void)
Definition: fast_spi.c:116
void fast_spi_enable_wp(void)
Definition: fast_spi.c:428
void fast_spi_clear_outstanding_status(void)
Definition: fast_spi.c:449
void fast_spi_set_bios_interface_lock_down(void)
Definition: fast_spi.c:83
void fast_spi_pr_dlock(void)
Definition: fast_spi.c:160
void fast_spi_lock_bar(void)
Definition: fast_spi.c:145
void fast_spi_set_opcode_menu(void)
Definition: fast_spi.c:126
int fast_spi_cycle_in_progress(void)
void gpmr_or32(uint16_t offset, uint32_t ordata)
Definition: gpmr.c:20
void lpc_set_lock_enable(void)
Definition: lpc_lib.c:185
void lpc_enable_wp(void)
Definition: lpc_lib.c:212
void lpc_set_eiss(void)
Definition: lpc_lib.c:193
void lpc_set_bios_interface_lock_down(void)
Definition: lpc_lib.c:177
#define GPMR_GCS_BILD
Definition: pcr_gpmr.h:11
#define GPMR_GCS
Definition: pcr_gpmr.h:10
#define GPMR_DMICTL_SRLOCK
Definition: pcr_gpmr.h:8
#define GPMR_DMICTL
Definition: pcr_gpmr.h:7
BOOT_STATE_INIT_ENTRY(BS_DEV_RESOURCES, BS_ON_ENTRY, lock, NULL)
void soc_lockdown_config(int chipset_lockdown)
Definition: lockdown.c:50
const struct soc_intel_common_config * chip_get_common_soc_structure(void)
Definition: chip.c:5
@ CHIPSET_LOCKDOWN_COREBOOT
Definition: cfg.h:12
static void lpc_lockdown_config(int chipset_lockdown)
Definition: lockdown.c:93
static void sa_lockdown_config(int chipset_lockdown)
Definition: lockdown.c:111
int get_lockdown_config(void)
Definition: lockdown.c:22
static void fast_spi_lockdown_cfg(int chipset_lockdown)
Definition: lockdown.c:51
static void platform_lockdown_config(void *unused)
Definition: lockdown.c:126
static void gpmr_lockdown_cfg(void)
Definition: lockdown.c:30
#define NULL
Definition: stddef.h:19