blob: c9b6d93d5091cf3db09d10a5c90406cf2d7ef2dc [file] [log] [blame]
Patrick Georgiac959032020-05-05 22:49:26 +02001/* SPDX-License-Identifier: GPL-2.0-or-later */
Elyes HAOUASd2b9ec12018-10-27 09:41:02 +02002
Andrey Petrov87fb1a62016-02-10 17:47:03 -08003#include <bootblock_common.h>
Aaron Durbin5c9df702018-04-18 01:05:25 -06004#include <cpu/x86/pae.h>
Andrey Petrov87fb1a62016-02-10 17:47:03 -08005#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02006#include <device/pci_ops.h>
Barnali Sarkar66fe0c42017-05-23 18:17:14 +05307#include <intelblocks/cpulib.h>
Barnali Sarkare70142c2017-03-28 16:32:33 +05308#include <intelblocks/fast_spi.h>
Kyösti Mälkkib7908d22019-08-18 06:01:41 +03009#include <intelblocks/lpc_lib.h>
Subrata Banik7837c202018-05-07 17:13:40 +053010#include <intelblocks/p2sb.h>
Subrata Banikccd87002017-03-08 17:55:26 +053011#include <intelblocks/pcr.h>
Subrata Banik8bf69d32017-03-09 13:43:54 +053012#include <intelblocks/rtc.h>
Barnali Sarkare70142c2017-03-28 16:32:33 +053013#include <intelblocks/systemagent.h>
Shaunak Saha93cdc8b2017-04-18 15:42:09 -070014#include <intelblocks/pmclib.h>
Subrata Banik7bc4dc52018-05-17 18:40:32 +053015#include <intelblocks/tco.h>
Subrata Banikafa07f72018-05-24 12:21:06 +053016#include <intelblocks/uart.h>
Andrey Petrovf87275f2016-03-29 14:19:53 -070017#include <soc/iomap.h>
Andrey Petrov32d39952016-02-12 13:26:57 -080018#include <soc/cpu.h>
Andrey Petrov4520c5e2016-04-18 13:36:19 -070019#include <soc/gpio.h>
Sean Rhodes2d58d5c2022-01-19 08:13:38 +000020#include <soc/soc_chip.h>
Subrata Banik7952e282017-03-14 18:26:27 +053021#include <soc/systemagent.h>
Andrey Petrov87fb1a62016-02-10 17:47:03 -080022#include <soc/pci_devs.h>
Andrey Petrov3dbea292016-06-14 22:20:28 -070023#include <soc/pm.h>
Furquan Shaikh6ac226d2016-06-15 17:13:20 -070024#include <spi-generic.h>
Alexandru Gagniucdfc2b312015-10-06 17:16:41 -070025
Andrey Petrov4520c5e2016-04-18 13:36:19 -070026static const struct pad_config tpm_spi_configs[] = {
Angel Ponsb36100f2020-09-07 13:18:10 +020027#if CONFIG(SOC_INTEL_GEMINILAKE)
Hannah Williams3ff14a02017-05-05 16:30:22 -070028 PAD_CFG_NF(GPIO_81, NATIVE, DEEP, NF3), /* FST_SPI_CS2_N */
29#else
Andrey Petrov4520c5e2016-04-18 13:36:19 -070030 PAD_CFG_NF(GPIO_106, NATIVE, DEEP, NF3), /* FST_SPI_CS2_N */
Hannah Williams3ff14a02017-05-05 16:30:22 -070031#endif
Andrey Petrov4520c5e2016-04-18 13:36:19 -070032};
33
34static void tpm_enable(void)
35{
36 /* Configure gpios */
37 gpio_configure_pads(tpm_spi_configs, ARRAY_SIZE(tpm_spi_configs));
38}
39
Lee Leahy2d154e82017-03-09 10:38:09 -080040asmlinkage void bootblock_c_entry(uint64_t base_timestamp)
Alexandru Gagniucdfc2b312015-10-06 17:16:41 -070041{
Elyes HAOUASc8a649c2018-06-10 23:36:44 +020042 pci_devfn_t dev;
Andrey Petrov87fb1a62016-02-10 17:47:03 -080043
Subrata Banik7952e282017-03-14 18:26:27 +053044 bootblock_systemagent_early_init();
Andrey Petrov87fb1a62016-02-10 17:47:03 -080045
Subrata Banik7837c202018-05-07 17:13:40 +053046 p2sb_enable_bar();
47 p2sb_configure_hpet();
Andrey Petrov87fb1a62016-02-10 17:47:03 -080048
Aaron Durbinbef75e72016-05-26 11:00:44 -050049 /* Decode the ACPI I/O port range for early firmware verification.*/
Subrata Banik2ee54db2017-03-05 12:37:00 +053050 dev = PCH_DEV_PMC;
Barnali Sarkar9e55ff62017-06-05 20:01:14 +053051 pci_write_config16(dev, PCI_BASE_ADDRESS_4, ACPI_BASE_ADDRESS);
Aaron Durbinbef75e72016-05-26 11:00:44 -050052 pci_write_config16(dev, PCI_COMMAND,
53 PCI_COMMAND_IO | PCI_COMMAND_MASTER);
54
Subrata Banik8bf69d32017-03-09 13:43:54 +053055 enable_rtc_upper_bank();
Furquan Shaikh8d66bee2016-07-30 18:06:23 -070056
Andrey Petrov87fb1a62016-02-10 17:47:03 -080057 /* Call lib/bootblock.c main */
Kyösti Mälkki101ef0b2019-08-18 06:58:42 +030058 bootblock_main_with_basetime(base_timestamp);
Alexandru Gagniucdfc2b312015-10-06 17:16:41 -070059}
Andrey Petrov32d39952016-02-12 13:26:57 -080060
Andrey Petrov33fd66b2016-06-22 18:58:14 -070061static void enable_pmcbar(void)
62{
Elyes HAOUASc8a649c2018-06-10 23:36:44 +020063 pci_devfn_t pmc = PCH_DEV_PMC;
Andrey Petrov33fd66b2016-06-22 18:58:14 -070064
65 /* Set PMC base addresses and enable decoding. */
Subrata Banik480e7e52022-02-01 19:01:36 +053066 pci_write_config32(pmc, PCI_BASE_ADDRESS_0, PCH_PWRM_BASE_ADDRESS);
Andrey Petrov33fd66b2016-06-22 18:58:14 -070067 pci_write_config32(pmc, PCI_BASE_ADDRESS_1, 0); /* 64-bit BAR */
68 pci_write_config32(pmc, PCI_BASE_ADDRESS_2, PMC_BAR1);
69 pci_write_config32(pmc, PCI_BASE_ADDRESS_3, 0); /* 64-bit BAR */
Barnali Sarkar9e55ff62017-06-05 20:01:14 +053070 pci_write_config16(pmc, PCI_BASE_ADDRESS_4, ACPI_BASE_ADDRESS);
Andrey Petrov33fd66b2016-06-22 18:58:14 -070071 pci_write_config16(pmc, PCI_COMMAND,
72 PCI_COMMAND_IO | PCI_COMMAND_MEMORY |
73 PCI_COMMAND_MASTER);
74}
75
Aaron Durbin672be9a2016-02-24 19:02:58 -060076void bootblock_soc_early_init(void)
77{
Andrey Petrov33fd66b2016-06-22 18:58:14 -070078 enable_pmcbar();
79
Andrey Petrov3dbea292016-06-14 22:20:28 -070080 /* Clear global reset promotion bit */
Shaunak Saha93cdc8b2017-04-18 15:42:09 -070081 pmc_global_reset_enable(0);
Andrey Petrov3dbea292016-06-14 22:20:28 -070082
Aaron Durbin672be9a2016-02-24 19:02:58 -060083 /* Prepare UART for serial console. */
Julius Wernercd49cce2019-03-05 16:53:33 -080084 if (CONFIG(INTEL_LPSS_UART_FOR_CONSOLE))
Subrata Banikafa07f72018-05-24 12:21:06 +053085 uart_bootblock_init();
Sean Rhodes2d58d5c2022-01-19 08:13:38 +000086
87 uint16_t io_enables = LPC_IOE_SUPERIO_2E_2F | LPC_IOE_KBC_60_64 |
88 LPC_IOE_EC_62_66;
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))
99 lpc_io_setup_comm_a_b();
100 }
101
102 /* IO Decode Enable */
103 lpc_enable_fixed_io_ranges(io_enables);
Andrey Petrov4520c5e2016-04-18 13:36:19 -0700104
Sean Rhodes7a82a802022-06-02 11:28:43 +0100105 /* Program generic IO Decode Range */
106 pch_enable_lpc();
107
Julius Wernercd49cce2019-03-05 16:53:33 -0800108 if (CONFIG(TPM_ON_FAST_SPI))
Andrey Petrov4520c5e2016-04-18 13:36:19 -0700109 tpm_enable();
Andrey Petrove976bd42016-02-05 11:27:44 -0800110
Andrey Petrov3b637532016-11-30 17:39:16 -0800111 enable_pm_timer_emulation();
Andrey Petrovf87275f2016-03-29 14:19:53 -0700112
Bora Guvendik7fe9e8e2018-06-13 14:46:10 -0700113 fast_spi_early_init(SPI_BASE_ADDRESS);
Furquan Shaikh6ac226d2016-06-15 17:13:20 -0700114
Aaron Durbin5391e552017-06-02 12:16:04 -0500115 fast_spi_cache_bios_region();
Duncan Lauriea673d1c2016-09-19 12:02:54 -0700116
117 /* Initialize GPE for use as interrupt status */
118 pmc_gpe_init();
Vadim Bendebury0d0408a2017-11-20 16:18:45 -0800119
Subrata Banik7bc4dc52018-05-17 18:40:32 +0530120 /* Program TCO Timer Halt */
121 tco_configure();
Aaron Durbin5c9df702018-04-18 01:05:25 -0600122
123 /* Use Nx and paging to prevent the frontend from writing back dirty
124 * cache-as-ram lines to backing store that doesn't exist when the L1I
125 * speculatively fetches a line that is sitting in the L1D. */
Julius Wernercd49cce2019-03-05 16:53:33 -0800126 if (CONFIG(PAGING_IN_CACHE_AS_RAM)) {
Aaron Durbin5c9df702018-04-18 01:05:25 -0600127 paging_set_nxe(1);
128 paging_set_default_pat();
129 paging_enable_for_car("pdpt", "pt");
130 }
Aaron Durbin672be9a2016-02-24 19:02:58 -0600131}