coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
bootblock.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <bootblock_common.h>
4 #include <cpu/x86/pae.h>
5 #include <device/pci.h>
6 #include <device/pci_ops.h>
7 #include <intelblocks/cpulib.h>
8 #include <intelblocks/fast_spi.h>
9 #include <intelblocks/lpc_lib.h>
10 #include <intelblocks/p2sb.h>
11 #include <intelblocks/pcr.h>
12 #include <intelblocks/rtc.h>
14 #include <intelblocks/pmclib.h>
15 #include <intelblocks/tco.h>
16 #include <intelblocks/uart.h>
17 #include <soc/iomap.h>
18 #include <soc/cpu.h>
19 #include <soc/gpio.h>
20 #include <soc/soc_chip.h>
21 #include <soc/systemagent.h>
22 #include <soc/pci_devs.h>
23 #include <soc/pm.h>
24 #include <spi-generic.h>
25 
26 static const struct pad_config tpm_spi_configs[] = {
27 #if CONFIG(SOC_INTEL_GEMINILAKE)
28  PAD_CFG_NF(GPIO_81, NATIVE, DEEP, NF3), /* FST_SPI_CS2_N */
29 #else
30  PAD_CFG_NF(GPIO_106, NATIVE, DEEP, NF3), /* FST_SPI_CS2_N */
31 #endif
32 };
33 
34 static void tpm_enable(void)
35 {
36  /* Configure gpios */
38 }
39 
41 {
42  pci_devfn_t dev;
43 
45 
48 
49  /* Decode the ACPI I/O port range for early firmware verification.*/
50  dev = PCH_DEV_PMC;
54 
56 
57  /* Call lib/bootblock.c main */
58  bootblock_main_with_basetime(base_timestamp);
59 }
60 
61 static void enable_pmcbar(void)
62 {
64 
65  /* Set PMC base addresses and enable decoding. */
67  pci_write_config32(pmc, PCI_BASE_ADDRESS_1, 0); /* 64-bit BAR */
69  pci_write_config32(pmc, PCI_BASE_ADDRESS_3, 0); /* 64-bit BAR */
74 }
75 
77 {
78  enable_pmcbar();
79 
80  /* Clear global reset promotion bit */
82 
83  /* Prepare UART for serial console. */
84  if (CONFIG(INTEL_LPSS_UART_FOR_CONSOLE))
86 
89 
90  const config_t *config = config_of_soc();
91 
92 
93  if (config->lpc_ioe) {
94  io_enables = config->lpc_ioe & 0x3f0f;
95  lpc_set_fixed_io_ranges(config->lpc_iod, 0x1377);
96  } else {
97  /* IO Decode Range */
98  if (CONFIG(DRIVERS_UART_8250IO))
100  }
101 
102  /* IO Decode Enable */
103  lpc_enable_fixed_io_ranges(io_enables);
104 
105  if (CONFIG(TPM_ON_FAST_SPI))
106  tpm_enable();
107 
109 
111 
113 
114  /* Initialize GPE for use as interrupt status */
115  pmc_gpe_init();
116 
117  /* Program TCO Timer Halt */
118  tco_configure();
119 
120  /* Use Nx and paging to prevent the frontend from writing back dirty
121  * cache-as-ram lines to backing store that doesn't exist when the L1I
122  * speculatively fetches a line that is sitting in the L1D. */
123  if (CONFIG(PAGING_IN_CACHE_AS_RAM)) {
124  paging_set_nxe(1);
126  paging_enable_for_car("pdpt", "pt");
127  }
128 }
#define SPI_BASE_ADDRESS
Definition: iomap.h:8
#define asmlinkage
Definition: cpu.h:8
#define ARRAY_SIZE(a)
Definition: helpers.h:12
void p2sb_enable_bar(void)
Definition: p2sb.c:19
void p2sb_configure_hpet(void)
Definition: p2sb.c:29
void bootblock_systemagent_early_init(void)
void bootblock_soc_early_init(void)
Definition: bootblock.c:20
asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
Definition: bootblock.c:26
@ CONFIG
Definition: dsi_common.h:201
void fast_spi_early_init(uintptr_t spi_base_address)
Definition: fast_spi.c:378
void fast_spi_cache_bios_region(void)
Definition: fast_spi.c:292
#define config_of_soc()
Definition: device.h:394
static __always_inline void pci_write_config32(const struct device *dev, u16 reg, u32 val)
Definition: pci_ops.h:76
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
#define PCH_PWRM_BASE_ADDRESS
Definition: iomap.h:70
#define ACPI_BASE_ADDRESS
Definition: iomap.h:99
#define PMC_BAR1
Definition: iomap.h:27
void bootblock_main_with_basetime(uint64_t base_timestamp)
Definition: bootblock.c:71
#define LPC_IOE_EC_62_66
Definition: lpc_lib.h:18
uint16_t lpc_set_fixed_io_ranges(uint16_t io_ranges, uint16_t mask)
Definition: lpc_lib.c:39
#define LPC_IOE_SUPERIO_2E_2F
Definition: lpc_lib.h:17
#define LPC_IOE_KBC_60_64
Definition: lpc_lib.h:19
uint16_t lpc_enable_fixed_io_ranges(uint16_t io_enables)
Definition: lpc_lib.c:21
void lpc_io_setup_comm_a_b(void)
Definition: lpc_lib.c:249
enum board_config config
Definition: memory.c:448
#define PCI_COMMAND_IO
Definition: pci_def.h:11
#define PCI_COMMAND_MASTER
Definition: pci_def.h:13
#define PCI_COMMAND_MEMORY
Definition: pci_def.h:12
#define PCI_BASE_ADDRESS_2
Definition: pci_def.h:65
#define PCI_BASE_ADDRESS_0
Definition: pci_def.h:63
#define PCI_COMMAND
Definition: pci_def.h:10
#define PCI_BASE_ADDRESS_4
Definition: pci_def.h:67
#define PCI_BASE_ADDRESS_1
Definition: pci_def.h:64
#define PCI_BASE_ADDRESS_3
Definition: pci_def.h:66
u32 pci_devfn_t
Definition: pci_type.h:8
void paging_set_default_pat(void)
Definition: pgtbl.c:315
void paging_set_nxe(int enable)
Definition: pgtbl.c:279
int paging_enable_for_car(const char *pdpt_name, const char *pt_name)
Definition: pgtbl.c:324
void enable_pm_timer_emulation(void)
#define GPIO_106
Definition: gpio.h:71
void gpio_configure_pads(const struct soc_amd_gpio *gpio_list_ptr, size_t size)
program a particular set of GPIO
Definition: gpio.c:307
#define GPIO_81
Definition: gpio.h:68
#define PCH_DEV_PMC
Definition: pci_devs.h:236
static void tpm_enable(void)
Definition: bootblock.c:34
static void enable_pmcbar(void)
Definition: bootblock.c:61
static const struct pad_config tpm_spi_configs[]
Definition: bootblock.c:26
void uart_bootblock_init(void)
Definition: uart.c:97
#define PAD_CFG_NF(pad, pull, rst, func)
Definition: gpio_defs.h:197
void pmc_global_reset_enable(bool enable)
void pmc_gpe_init(void)
Definition: pmclib.c:535
void enable_rtc_upper_bank(void)
Definition: rtc.c:18
void tco_configure(void)
Definition: tco.c:130
static struct tegra_pmc_regs * pmc
Definition: clock.c:19
unsigned short uint16_t
Definition: stdint.h:11
unsigned long long uint64_t
Definition: stdint.h:17