coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
finalize.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <bootstate.h>
5 #include <console/console.h>
6 #include <cpu/x86/mp.h>
7 #include <cpu/x86/smm.h>
8 #include <device/mmio.h>
9 #include <device/pci.h>
10 #include <device/pci_ops.h>
11 #include <intelblocks/cpulib.h>
12 #include <intelblocks/cse.h>
13 #include <intelblocks/lpc_lib.h>
14 #include <intelblocks/p2sb.h>
15 #include <intelblocks/pcr.h>
16 #include <intelblocks/pmclib.h>
17 #include <intelblocks/tco.h>
18 #include <intelblocks/thermal.h>
19 #include <soc/me.h>
20 #include <soc/p2sb.h>
21 #include <soc/pci_devs.h>
22 #include <soc/pcr_ids.h>
23 #include <soc/pm.h>
24 #include <soc/smbus.h>
25 #include <soc/systemagent.h>
26 #include <spi-generic.h>
27 
28 #include "chip.h"
29 
30 #define PSF_BASE_ADDRESS 0xA00
31 #define PCR_PSFX_T0_SHDW_PCIEN 0x1C
32 #define PCR_PSFX_T0_SHDW_PCIEN_FUNDIS (1 << 8)
33 
35 {
36  /* unhide p2sb device */
37  p2sb_unhide();
38 
39  /* disable heci */
42 
44 }
45 
46 static void pch_finalize_script(struct device *dev)
47 {
48  tco_lockdown();
49 
50  /* Display me status before we hide it */
52 
53  /*
54  * Set low maximum temp value used for dynamic thermal sensor
55  * shutdown consideration.
56  *
57  * If Dynamic Thermal Shutdown is enabled then PMC logic shuts down the
58  * thermal sensor when CPU is in a C-state and DTS Temp <= LTT.
59  */
61 
62  /* we should disable Heci1 based on the config */
63  if (CONFIG(DISABLE_HECI1_AT_PRE_BOOT))
64  heci1_disable();
65 
66  /* Hide p2sb device as the OS must not change BAR0. */
67  p2sb_hide();
68 
70 }
71 
72 static void soc_lockdown(struct device *dev)
73 {
75  u8 reg8;
76 
77  config = config_of(dev);
78 
79  /* Global SMI Lock */
80  if (config->LockDownConfigGlobalSmi == 0) {
81  reg8 = pci_read_config8(dev, GEN_PMCON_A);
82  reg8 |= SMI_LOCK;
83  pci_write_config8(dev, GEN_PMCON_A, reg8);
84  }
85 
86  /*
87  * Lock chipset memory registers to protect SMM.
88  * When SkipMpInit=0, this is done by FSP.
89  */
90  if (!CONFIG(USE_INTEL_FSP_MP_INIT))
92 }
93 
94 static void soc_finalize(void *unused)
95 {
96  struct device *dev;
97 
98  dev = PCH_DEV_PMC;
99 
100  /* Check if PMC is enabled, else return */
101  if (dev == NULL)
102  return;
103 
104  printk(BIOS_DEBUG, "Finalizing chipset.\n");
105 
106  pch_finalize_script(dev);
107 
108  soc_lockdown(dev);
110 
111  /* Indicate finalize step with post code */
113 }
114 
#define PID_PSF1
Definition: pcr_ids.h:27
@ BS_PAYLOAD_LOAD
Definition: bootstate.h:88
@ BS_OS_RESUME
Definition: bootstate.h:86
@ BS_ON_ENTRY
Definition: bootstate.h:95
@ BS_ON_EXIT
Definition: bootstate.h:96
void p2sb_hide(void)
Definition: p2sb.c:83
void p2sb_disable_sideband_access(void)
Definition: p2sb.c:107
void p2sb_unhide(void)
Definition: p2sb.c:78
void pcr_or32(uint8_t pid, uint16_t offset, uint32_t ordata)
Definition: pcr.c:184
#define printk(level,...)
Definition: stdlib.h:16
void cpu_lt_lock_memory(void)
Definition: cpulib.c:392
void heci1_disable(void)
Definition: disable_heci.c:84
@ CONFIG
Definition: dsi_common.h:201
#define APM_CNT_FINALIZE
Definition: smm.h:24
static DEVTREE_CONST void * config_of(const struct device *dev)
Definition: device.h:382
static __always_inline u8 pci_read_config8(const struct device *dev, u16 reg)
Definition: pci_ops.h:46
static __always_inline void pci_write_config8(const struct device *dev, u16 reg, u8 val)
Definition: pci_ops.h:64
#define GEN_PMCON_A
Definition: pmc.h:14
#define SMI_LOCK
Definition: pmc.h:60
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
enum board_config config
Definition: memory.c:448
#define post_code(value)
Definition: post_code.h:12
#define POST_OS_BOOT
Final code before OS boots.
Definition: post_codes.h:414
int apm_control(u8 cmd)
Definition: smi_trigger.c:31
BOOT_STATE_INIT_ENTRY(BS_OS_RESUME, BS_ON_ENTRY, soc_finalize, NULL)
#define PCH_DEV_PMC
Definition: pci_devs.h:236
void intel_me_status(void)
Definition: me_status.c:194
void pmc_clear_pmcon_sts(void)
void tco_lockdown(void)
Definition: tco.c:50
void pch_thermal_configuration(void)
Definition: thermal_pci.c:13
#define PCR_PSFX_T0_SHDW_PCIEN
Definition: finalize.c:31
#define PSF_BASE_ADDRESS
Definition: finalize.c:30
static void soc_lockdown(struct device *dev)
Definition: finalize.c:72
#define PCR_PSFX_T0_SHDW_PCIEN_FUNDIS
Definition: finalize.c:32
static void soc_finalize(void *unused)
Definition: finalize.c:94
static void pch_finalize_script(struct device *dev)
Definition: finalize.c:46
void soc_disable_heci1_using_pcr(void)
Definition: finalize.c:34
#define NULL
Definition: stddef.h:19
uint8_t u8
Definition: stdint.h:45
Definition: device.h:107