blob: 50343fb7a7c8f692586074ad740cd0482327acdf [file] [log] [blame]
Subrata Banik292afef2020-09-09 13:34:18 +05301/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <assert.h>
4#include <console/console.h>
5#include <cpu/x86/msr.h>
Meera Ravindranath3b037982021-11-11 18:02:13 +05306#include <cpu/intel/cpu_ids.h>
Subrata Banik292afef2020-09-09 13:34:18 +05307#include <device/device.h>
Tim Wawrzynczak6f73a202022-02-04 12:45:37 -07008#include <drivers/wifi/generic/wifi.h>
Tarun Tulieed31cb2023-01-31 18:14:35 +00009#include <elog.h>
Subrata Banik7cb6d722022-03-23 01:33:27 +053010#include <fsp/fsp_debug_event.h>
Subrata Banik292afef2020-09-09 13:34:18 +053011#include <fsp/util.h>
Dinesh Gehlotd910fec2022-12-25 13:00:04 +000012#include <gpio.h>
Sridhar Siricilladddaeed2022-04-28 23:34:14 +053013#include <intelbasecode/debug_feature.h>
Subrata Banik292afef2020-09-09 13:34:18 +053014#include <intelblocks/cpulib.h>
Eric Lai5b302b22020-12-05 16:49:43 +080015#include <intelblocks/pcie_rp.h>
Felix Singera182fae2021-12-31 00:30:55 +010016#include <option.h>
Subrata Banik292afef2020-09-09 13:34:18 +053017#include <soc/iomap.h>
18#include <soc/msr.h>
19#include <soc/pci_devs.h>
Eric Lai5b302b22020-12-05 16:49:43 +080020#include <soc/pcie.h>
Subrata Banik292afef2020-09-09 13:34:18 +053021#include <soc/romstage.h>
22#include <soc/soc_chip.h>
23#include <string.h>
24
Jeremy Compostellae3884a12023-01-19 11:41:30 -070025#include "ux.h"
26
Eric Lai5b302b22020-12-05 16:49:43 +080027#define FSP_CLK_NOTUSED 0xFF
28#define FSP_CLK_LAN 0x70
29#define FSP_CLK_FREE_RUNNING 0x80
30
31#define CPU_PCIE_BASE 0x40
32
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +053033enum vtd_base_index_type {
34 VTD_GFX,
35 VTD_IPU,
36 VTD_VTVCO,
Sridhar Siricillad0479272021-05-28 20:00:02 +053037 VTD_TBT0,
38 VTD_TBT1,
39 VTD_TBT2,
40 VTD_TBT3,
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +053041};
42
Eric Lai5b302b22020-12-05 16:49:43 +080043static uint8_t clk_src_to_fsp(enum pcie_rp_type type, int rp_number)
44{
Tim Wawrzynczak461ff1d2021-12-02 16:16:48 -070045 assert(type == PCIE_RP_PCH || type == PCIE_RP_CPU);
Eric Lai5b302b22020-12-05 16:49:43 +080046
Tim Wawrzynczak461ff1d2021-12-02 16:16:48 -070047 if (type == PCIE_RP_PCH)
Eric Lai5b302b22020-12-05 16:49:43 +080048 return rp_number;
Tim Wawrzynczak461ff1d2021-12-02 16:16:48 -070049 else // type == PCIE_RP_CPU
Eric Lai5b302b22020-12-05 16:49:43 +080050 return CPU_PCIE_BASE + rp_number;
51}
52
53static void pcie_rp_init(FSP_M_CONFIG *m_cfg, uint32_t en_mask, enum pcie_rp_type type,
54 const struct pcie_rp_config *cfg, size_t cfg_count)
55{
56 size_t i;
Kane Chenff553ba2021-12-16 17:46:33 +080057 /* bitmask to save the status of clkreq assignment */
58 static unsigned int clk_req_mapping = 0;
Eric Lai5b302b22020-12-05 16:49:43 +080059
60 for (i = 0; i < cfg_count; i++) {
Sridahr Siricilla096ce142021-09-17 22:25:17 +053061 if (CONFIG(SOC_INTEL_COMPLIANCE_TEST_MODE)) {
62 m_cfg->PcieClkSrcUsage[i] = FSP_CLK_FREE_RUNNING;
63 continue;
64 }
Eric Lai5b302b22020-12-05 16:49:43 +080065 if (!(en_mask & BIT(i)))
66 continue;
67 if (cfg[i].flags & PCIE_RP_CLK_SRC_UNUSED)
68 continue;
Cliff Huangedf71a02022-04-28 18:55:48 -070069 if (!cfg[i].flags && cfg[i].clk_src == 0 && cfg[i].clk_req == 0) {
70 printk(BIOS_WARNING, "Missing root port clock structure definition\n");
71 continue;
72 }
Kane Chenff553ba2021-12-16 17:46:33 +080073 if (clk_req_mapping & (1 << cfg[i].clk_req))
74 printk(BIOS_WARNING, "Found overlapped clkreq assignment on clk req %d\n"
75 , cfg[i].clk_req);
76 if (!(cfg[i].flags & PCIE_RP_CLK_REQ_UNUSED)) {
Eric Lai5b302b22020-12-05 16:49:43 +080077 m_cfg->PcieClkSrcClkReq[cfg[i].clk_src] = cfg[i].clk_req;
Kane Chenff553ba2021-12-16 17:46:33 +080078 clk_req_mapping |= 1 << cfg[i].clk_req;
79 }
Eric Lai5b302b22020-12-05 16:49:43 +080080 m_cfg->PcieClkSrcUsage[cfg[i].clk_src] = clk_src_to_fsp(type, i);
81 }
82}
83
Subrata Banik85c9dda2021-06-09 22:03:57 +053084static void fill_fspm_pcie_rp_params(FSP_M_CONFIG *m_cfg,
85 const struct soc_intel_alderlake_config *config)
86{
87 /* Disable all PCIe clock sources by default. And set RP irrelevant clock. */
88 unsigned int i;
89
90 for (i = 0; i < CONFIG_MAX_PCIE_CLOCK_SRC; i++) {
91 if (config->pcie_clk_config_flag[i] & PCIE_CLK_FREE_RUNNING)
92 m_cfg->PcieClkSrcUsage[i] = FSP_CLK_FREE_RUNNING;
93 else if (config->pcie_clk_config_flag[i] & PCIE_CLK_LAN)
94 m_cfg->PcieClkSrcUsage[i] = FSP_CLK_LAN;
95 else
96 m_cfg->PcieClkSrcUsage[i] = FSP_CLK_NOTUSED;
97 m_cfg->PcieClkSrcClkReq[i] = FSP_CLK_NOTUSED;
98 }
99
100 /* Configure PCH PCIE ports */
101 m_cfg->PcieRpEnableMask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
Tim Wawrzynczak461ff1d2021-12-02 16:16:48 -0700102 pcie_rp_init(m_cfg, m_cfg->PcieRpEnableMask, PCIE_RP_PCH, config->pch_pcie_rp,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530103 CONFIG_MAX_PCH_ROOT_PORTS);
104
105 /* Configure CPU PCIE ports */
106 m_cfg->CpuPcieRpEnableMask = pcie_rp_enable_mask(get_cpu_pcie_rp_table());
Tim Wawrzynczak461ff1d2021-12-02 16:16:48 -0700107 pcie_rp_init(m_cfg, m_cfg->CpuPcieRpEnableMask, PCIE_RP_CPU, config->cpu_pcie_rp,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530108 CONFIG_MAX_CPU_ROOT_PORTS);
109}
110
111static void fill_fspm_igd_params(FSP_M_CONFIG *m_cfg,
Subrata Banik2871e0e2020-09-27 11:30:58 +0530112 const struct soc_intel_alderlake_config *config)
Subrata Banik292afef2020-09-09 13:34:18 +0530113{
Eric Lai5b302b22020-12-05 16:49:43 +0800114 unsigned int i;
Subrata Banik8a18bd82021-06-09 21:57:49 +0530115 const struct ddi_port_upds {
116 uint8_t *ddc;
117 uint8_t *hpd;
118 } ddi_port_upds[] = {
119 [DDI_PORT_A] = {&m_cfg->DdiPortADdc, &m_cfg->DdiPortAHpd},
120 [DDI_PORT_B] = {&m_cfg->DdiPortBDdc, &m_cfg->DdiPortBHpd},
121 [DDI_PORT_C] = {&m_cfg->DdiPortCDdc, &m_cfg->DdiPortCHpd},
122 [DDI_PORT_1] = {&m_cfg->DdiPort1Ddc, &m_cfg->DdiPort1Hpd},
123 [DDI_PORT_2] = {&m_cfg->DdiPort2Ddc, &m_cfg->DdiPort2Hpd},
124 [DDI_PORT_3] = {&m_cfg->DdiPort3Ddc, &m_cfg->DdiPort3Hpd},
125 [DDI_PORT_4] = {&m_cfg->DdiPort4Ddc, &m_cfg->DdiPort4Hpd},
126 };
Subrata Banik50134ec2021-06-09 04:14:50 +0530127 m_cfg->InternalGfx = !CONFIG(SOC_INTEL_DISABLE_IGD) && is_devfn_enabled(SA_DEVFN_IGD);
Subrata Banik8a18bd82021-06-09 21:57:49 +0530128 if (m_cfg->InternalGfx) {
129 /* IGD is enabled, set IGD stolen size to 60MB. */
130 m_cfg->IgdDvmt50PreAlloc = IGD_SM_60MB;
131 /* DP port config */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530132 m_cfg->DdiPortAConfig = config->ddi_portA_config;
133 m_cfg->DdiPortBConfig = config->ddi_portB_config;
Subrata Banik8a18bd82021-06-09 21:57:49 +0530134 for (i = 0; i < ARRAY_SIZE(ddi_port_upds); i++) {
135 *ddi_port_upds[i].ddc = !!(config->ddi_ports_config[i] &
136 DDI_ENABLE_DDC);
137 *ddi_port_upds[i].hpd = !!(config->ddi_ports_config[i] &
138 DDI_ENABLE_HPD);
139 }
140 } else {
141 /* IGD is disabled, skip IGD init in FSP. */
142 m_cfg->IgdDvmt50PreAlloc = 0;
143 /* DP port config */
144 m_cfg->DdiPortAConfig = 0;
145 m_cfg->DdiPortBConfig = 0;
146 for (i = 0; i < ARRAY_SIZE(ddi_port_upds); i++) {
147 *ddi_port_upds[i].ddc = 0;
148 *ddi_port_upds[i].hpd = 0;
149 }
150 }
Subrata Banik85c9dda2021-06-09 22:03:57 +0530151}
152static void fill_fspm_mrc_params(FSP_M_CONFIG *m_cfg,
153 const struct soc_intel_alderlake_config *config)
154{
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530155 m_cfg->SaGv = config->sagv;
Subrata Banik292afef2020-09-09 13:34:18 +0530156 m_cfg->RMT = config->RMT;
Franklin Lin759bb4c2022-07-15 17:53:13 +0800157 if (config->max_dram_speed_mts) {
Scott Chaoab638c12022-04-20 15:16:06 +0800158 m_cfg->DdrFreqLimit = config->max_dram_speed_mts;
Franklin Lin759bb4c2022-07-15 17:53:13 +0800159 m_cfg->DdrSpeedControl = 1;
160 }
Subrata Banik85c9dda2021-06-09 22:03:57 +0530161}
Subrata Banik292afef2020-09-09 13:34:18 +0530162
Subrata Banik85c9dda2021-06-09 22:03:57 +0530163static void fill_fspm_cpu_params(FSP_M_CONFIG *m_cfg,
164 const struct soc_intel_alderlake_config *config)
165{
166 m_cfg->TsegSize = CONFIG_SMM_TSEG_SIZE;
Subrata Banik292afef2020-09-09 13:34:18 +0530167 /* CpuRatio Settings */
168 if (config->cpu_ratio_override)
169 m_cfg->CpuRatio = config->cpu_ratio_override;
170 else
171 /* Set CpuRatio to match existing MSR value */
172 m_cfg->CpuRatio = (rdmsr(MSR_FLEX_RATIO).lo >> 8) & 0xff;
173
Subrata Banik80835a12020-09-23 17:46:11 +0530174 m_cfg->PrmrrSize = get_valid_prmrr_size();
Subrata Banik292afef2020-09-09 13:34:18 +0530175 m_cfg->EnableC6Dram = config->enable_c6dram;
Felix Singera182fae2021-12-31 00:30:55 +0100176 m_cfg->HyperThreading = get_uint_option("hyper_threading", CONFIG(FSP_HYPERTHREADING));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530177}
178
179static void fill_fspm_security_params(FSP_M_CONFIG *m_cfg,
180 const struct soc_intel_alderlake_config *config)
181{
Subrata Banik292afef2020-09-09 13:34:18 +0530182 /* Disable BIOS Guard */
183 m_cfg->BiosGuard = 0;
Subrata Banik1e71fe12022-08-15 15:40:59 +0530184 m_cfg->TmeEnable = CONFIG(INTEL_TME) && is_tme_supported();
Subrata Banik85c9dda2021-06-09 22:03:57 +0530185}
Subrata Banik292afef2020-09-09 13:34:18 +0530186
Subrata Banik85c9dda2021-06-09 22:03:57 +0530187static void fill_fspm_uart_params(FSP_M_CONFIG *m_cfg,
188 const struct soc_intel_alderlake_config *config)
189{
Subrata Banik292afef2020-09-09 13:34:18 +0530190 if (CONFIG(DRIVERS_UART_8250IO))
191 m_cfg->PcdIsaSerialUartBase = ISA_SERIAL_BASE_ADDR_3F8;
192 m_cfg->SerialIoUartDebugMode = PchSerialIoSkipInit;
193 m_cfg->SerialIoUartDebugControllerNumber = CONFIG_UART_FOR_CONSOLE;
Subrata Banik85c9dda2021-06-09 22:03:57 +0530194}
Subrata Banik292afef2020-09-09 13:34:18 +0530195
Subrata Banik85c9dda2021-06-09 22:03:57 +0530196static void fill_fspm_ipu_params(FSP_M_CONFIG *m_cfg,
197 const struct soc_intel_alderlake_config *config)
198{
Subrata Banik292afef2020-09-09 13:34:18 +0530199 /* Image clock: disable all clocks for bypassing FSP pin mux */
200 memset(m_cfg->ImguClkOutEn, 0, sizeof(m_cfg->ImguClkOutEn));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530201 /* IPU */
202 m_cfg->SaIpuEnable = is_devfn_enabled(SA_DEVFN_IPU);
203}
Subrata Banik292afef2020-09-09 13:34:18 +0530204
Subrata Banik85c9dda2021-06-09 22:03:57 +0530205static void fill_fspm_smbus_params(FSP_M_CONFIG *m_cfg,
206 const struct soc_intel_alderlake_config *config)
207{
208 m_cfg->SmbusEnable = is_devfn_enabled(PCH_DEVFN_SMBUS);
209}
210
211static void fill_fspm_misc_params(FSP_M_CONFIG *m_cfg,
212 const struct soc_intel_alderlake_config *config)
213{
Subrata Banik292afef2020-09-09 13:34:18 +0530214 /* Disable Lock PCU Thermal Management registers */
215 m_cfg->LockPTMregs = 0;
Subrata Banik292afef2020-09-09 13:34:18 +0530216
Subrata Banik85c9dda2021-06-09 22:03:57 +0530217 /* Skip CPU replacement check */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530218 m_cfg->SkipCpuReplacementCheck = !config->cpu_replacement_check;
Subrata Banik85c9dda2021-06-09 22:03:57 +0530219
220 /* Skip GPIO configuration from FSP */
221 m_cfg->GpioOverride = 0x1;
MAULIK V VAGHELA9a7fbbc2021-10-13 11:52:17 +0530222
Ronak Kanabarfc69b9d2021-10-06 13:02:34 +0530223 /* CNVi DDR RFI Mitigation */
Tim Wawrzynczak6f73a202022-02-04 12:45:37 -0700224 const struct device_path path[] = {
225 { .type = DEVICE_PATH_PCI, .pci.devfn = PCH_DEVFN_CNVI_WIFI },
226 { .type = DEVICE_PATH_GENERIC, .generic.id = 0 } };
227 const struct device *dev = find_dev_nested_path(pci_root_bus(), path,
228 ARRAY_SIZE(path));
229 if (is_dev_enabled(dev))
230 m_cfg->CnviDdrRfim = wifi_generic_cnvi_ddr_rfim_enabled(dev);
V Sowmya2bc54e72022-08-04 22:50:51 +0530231
232 /* Skip MBP HOB */
Kapil Porwal23ef60d2023-01-16 16:07:48 +0000233 m_cfg->SkipMbpHob = !CONFIG(FSP_PUBLISH_MBP_HOB);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530234}
235
236static void fill_fspm_audio_params(FSP_M_CONFIG *m_cfg,
237 const struct soc_intel_alderlake_config *config)
238{
Subrata Banik292afef2020-09-09 13:34:18 +0530239 /* Audio: HDAUDIO_LINK_MODE I2S/SNDW */
Subrata Banik50134ec2021-06-09 04:14:50 +0530240 m_cfg->PchHdaEnable = is_devfn_enabled(PCH_DEVFN_HDA);
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530241 m_cfg->PchHdaDspEnable = config->pch_hda_dsp_enable;
242 m_cfg->PchHdaIDispLinkTmode = config->pch_hda_idisp_link_tmode;
243 m_cfg->PchHdaIDispLinkFrequency = config->pch_hda_idisp_link_frequency;
244 m_cfg->PchHdaIDispCodecDisconnect = !config->pch_hda_idisp_codec_enable;
Sean Rhodes7bfc2562023-01-06 10:50:53 +0000245 m_cfg->PchHdaAudioLinkHdaEnable = config->pch_hda_audio_link_hda_enable;
Furquan Shaikhc1c1ba52021-04-20 16:57:59 -0700246 memset(m_cfg->PchHdaAudioLinkDmicEnable, 0, sizeof(m_cfg->PchHdaAudioLinkDmicEnable));
247 memset(m_cfg->PchHdaAudioLinkSspEnable, 0, sizeof(m_cfg->PchHdaAudioLinkSspEnable));
248 memset(m_cfg->PchHdaAudioLinkSndwEnable, 0, sizeof(m_cfg->PchHdaAudioLinkSndwEnable));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530249}
Subrata Banik292afef2020-09-09 13:34:18 +0530250
Subrata Banik85c9dda2021-06-09 22:03:57 +0530251static void fill_fspm_ish_params(FSP_M_CONFIG *m_cfg,
252 const struct soc_intel_alderlake_config *config)
253{
Subrata Banik50134ec2021-06-09 04:14:50 +0530254 m_cfg->PchIshEnable = is_devfn_enabled(PCH_DEVFN_ISH);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530255}
Subrata Banik292afef2020-09-09 13:34:18 +0530256
Subrata Banik85c9dda2021-06-09 22:03:57 +0530257static void fill_fspm_tcss_params(FSP_M_CONFIG *m_cfg,
258 const struct soc_intel_alderlake_config *config)
259{
Subrata Banik292afef2020-09-09 13:34:18 +0530260 /* Tcss USB */
Subrata Banik50134ec2021-06-09 04:14:50 +0530261 m_cfg->TcssXhciEn = is_devfn_enabled(SA_DEVFN_TCSS_XHCI);
262 m_cfg->TcssXdciEn = is_devfn_enabled(SA_DEVFN_TCSS_XDCI);
Subrata Banik292afef2020-09-09 13:34:18 +0530263
264 /* TCSS DMA */
Subrata Banik50134ec2021-06-09 04:14:50 +0530265 m_cfg->TcssDma0En = is_devfn_enabled(SA_DEVFN_TCSS_DMA0);
266 m_cfg->TcssDma1En = is_devfn_enabled(SA_DEVFN_TCSS_DMA1);
Kane Chen8327a7e2022-09-27 09:54:30 +0800267
268#if CONFIG(SOC_INTEL_RAPTORLAKE)
269 m_cfg->DisableDynamicTccoldHandshake =
270 config->disable_dynamic_tccold_handshake;
271#endif
Subrata Banik85c9dda2021-06-09 22:03:57 +0530272}
Subrata Banik292afef2020-09-09 13:34:18 +0530273
Subrata Banik85c9dda2021-06-09 22:03:57 +0530274static void fill_fspm_usb4_params(FSP_M_CONFIG *m_cfg,
275 const struct soc_intel_alderlake_config *config)
276{
Subrata Banik50134ec2021-06-09 04:14:50 +0530277 m_cfg->TcssItbtPcie0En = is_devfn_enabled(SA_DEVFN_TBT0);
278 m_cfg->TcssItbtPcie1En = is_devfn_enabled(SA_DEVFN_TBT1);
279 m_cfg->TcssItbtPcie2En = is_devfn_enabled(SA_DEVFN_TBT2);
280 m_cfg->TcssItbtPcie3En = is_devfn_enabled(SA_DEVFN_TBT3);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530281}
Subrata Banik292afef2020-09-09 13:34:18 +0530282
Subrata Banik85c9dda2021-06-09 22:03:57 +0530283static void fill_fspm_vtd_params(FSP_M_CONFIG *m_cfg,
284 const struct soc_intel_alderlake_config *config)
285{
Meera Ravindranath3b037982021-11-11 18:02:13 +0530286 const uint32_t cpuid = cpu_get_cpuid();
287
288 /* Disable VT-d for early silicon steppings as it results in a CPU hard hang */
Lean Sheng Tan9e78dd12022-04-01 12:03:51 +0200289 if (cpuid == CPUID_ALDERLAKE_J0 || cpuid == CPUID_ALDERLAKE_Q0) {
Meera Ravindranath3b037982021-11-11 18:02:13 +0530290 m_cfg->VtdDisable = 1;
291 return;
292 }
293
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530294 m_cfg->VtdBaseAddress[VTD_GFX] = GFXVT_BASE_ADDRESS;
295 m_cfg->VtdBaseAddress[VTD_IPU] = IPUVT_BASE_ADDRESS;
296 m_cfg->VtdBaseAddress[VTD_VTVCO] = VTVC0_BASE_ADDRESS;
297
298 m_cfg->VtdDisable = 0;
299 m_cfg->VtdIopEnable = !m_cfg->VtdDisable;
300 m_cfg->VtdIgdEnable = m_cfg->InternalGfx;
301 m_cfg->VtdIpuEnable = m_cfg->SaIpuEnable;
302
Michał Żygowskic7fee242022-10-15 16:39:46 +0200303 m_cfg->PreBootDmaMask = CONFIG(ENABLE_EARLY_DMA_PROTECTION);
304
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530305 if (m_cfg->VtdIgdEnable && m_cfg->VtdBaseAddress[VTD_GFX] == 0) {
306 m_cfg->VtdIgdEnable = 0;
Julius Wernere9665952022-01-21 17:06:20 -0800307 printk(BIOS_ERR, "Requested IGD VT-d, but GFXVT_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530308 }
309
310 if (m_cfg->VtdIpuEnable && m_cfg->VtdBaseAddress[VTD_IPU] == 0) {
311 m_cfg->VtdIpuEnable = 0;
Julius Wernere9665952022-01-21 17:06:20 -0800312 printk(BIOS_ERR, "Requested IPU VT-d, but IPUVT_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530313 }
314
315 if (!m_cfg->VtdDisable && m_cfg->VtdBaseAddress[VTD_VTVCO] == 0) {
316 m_cfg->VtdDisable = 1;
Julius Wernere9665952022-01-21 17:06:20 -0800317 printk(BIOS_ERR, "Requested VT-d, but VTVCO_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530318 }
Subrata Banik292afef2020-09-09 13:34:18 +0530319
Sridhar Siricillad0479272021-05-28 20:00:02 +0530320 if (m_cfg->TcssDma0En || m_cfg->TcssDma1En)
321 m_cfg->VtdItbtEnable = 1;
322
323 if (m_cfg->TcssItbtPcie0En)
324 m_cfg->VtdBaseAddress[VTD_TBT0] = TBT0_BASE_ADDRESS;
325
326 if (m_cfg->TcssItbtPcie1En)
327 m_cfg->VtdBaseAddress[VTD_TBT1] = TBT1_BASE_ADDRESS;
328
329 if (m_cfg->TcssItbtPcie2En)
330 m_cfg->VtdBaseAddress[VTD_TBT2] = TBT2_BASE_ADDRESS;
331
332 if (m_cfg->TcssItbtPcie3En)
333 m_cfg->VtdBaseAddress[VTD_TBT3] = TBT3_BASE_ADDRESS;
334
Subrata Banik292afef2020-09-09 13:34:18 +0530335 /* Change VmxEnable UPD value according to ENABLE_VMX Kconfig */
336 m_cfg->VmxEnable = CONFIG(ENABLE_VMX);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530337}
Subrata Banik292afef2020-09-09 13:34:18 +0530338
Subrata Banik85c9dda2021-06-09 22:03:57 +0530339static void fill_fspm_trace_params(FSP_M_CONFIG *m_cfg,
340 const struct soc_intel_alderlake_config *config)
341{
342 /* Set debug probe type */
343 m_cfg->PlatformDebugConsent = CONFIG_SOC_INTEL_ALDERLAKE_DEBUG_CONSENT;
Francois Toguocea4f922021-04-16 21:20:39 -0700344
345 /* CrashLog config */
Subrata Banik7b8d11b2021-07-14 13:11:53 +0530346 m_cfg->CpuCrashLogDevice = CONFIG(SOC_INTEL_CRASHLOG) && is_devfn_enabled(SA_DEVFN_TMT);
347 m_cfg->CpuCrashLogEnable = m_cfg->CpuCrashLogDevice;
Subrata Banik292afef2020-09-09 13:34:18 +0530348}
349
Maximilian Brune2c984882022-10-24 20:31:18 +0200350static void fill_fspm_ibecc_params(FSP_M_CONFIG *m_cfg,
351 const struct soc_intel_alderlake_config *config)
352{
353 /* In-Band ECC configuration */
354 if (config->ibecc.enable) {
355 m_cfg->Ibecc = config->ibecc.enable;
356 m_cfg->IbeccOperationMode = config->ibecc.mode;
357 if (m_cfg->IbeccOperationMode == IBECC_MODE_PER_REGION) {
358 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeEnable,
359 config->ibecc.range_enable);
360 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeBase,
361 config->ibecc.range_base);
362 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeMask,
363 config->ibecc.range_mask);
364 }
365 }
366}
367
Subrata Banik85c9dda2021-06-09 22:03:57 +0530368static void soc_memory_init_params(FSP_M_CONFIG *m_cfg,
369 const struct soc_intel_alderlake_config *config)
370{
Arthur Heymans02967e62022-02-18 13:22:25 +0100371 void (*const fill_fspm_params[])(FSP_M_CONFIG *m_cfg,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530372 const struct soc_intel_alderlake_config *config) = {
373 fill_fspm_igd_params,
374 fill_fspm_mrc_params,
375 fill_fspm_cpu_params,
376 fill_fspm_security_params,
377 fill_fspm_uart_params,
378 fill_fspm_ipu_params,
379 fill_fspm_smbus_params,
380 fill_fspm_misc_params,
381 fill_fspm_audio_params,
382 fill_fspm_pcie_rp_params,
383 fill_fspm_ish_params,
384 fill_fspm_tcss_params,
385 fill_fspm_usb4_params,
386 fill_fspm_vtd_params,
387 fill_fspm_trace_params,
Maximilian Brune2c984882022-10-24 20:31:18 +0200388 fill_fspm_ibecc_params,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530389 };
390
391 for (size_t i = 0; i < ARRAY_SIZE(fill_fspm_params); i++)
392 fill_fspm_params[i](m_cfg, config);
393}
394
Sridhar Siricilladddaeed2022-04-28 23:34:14 +0530395static void debug_override_memory_init_params(FSP_M_CONFIG *mupd)
396{
397 debug_get_pch_cpu_tracehub_modes(&mupd->CpuTraceHubMode, &mupd->PchTraceHubMode);
398}
399
Subrata Banik292afef2020-09-09 13:34:18 +0530400void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
401{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530402 const struct soc_intel_alderlake_config *config;
Subrata Banik292afef2020-09-09 13:34:18 +0530403 FSP_M_CONFIG *m_cfg = &mupd->FspmConfig;
Subrata Banik7cb6d722022-03-23 01:33:27 +0530404 FSPM_ARCH_UPD *arch_upd = &mupd->FspmArchUpd;
405
Subrata Banik88381c92022-03-29 11:26:11 +0530406 if (CONFIG(FSP_USES_CB_DEBUG_EVENT_HANDLER)) {
407 if (CONFIG(CONSOLE_SERIAL) && CONFIG(FSP_ENABLE_SERIAL_DEBUG)) {
408 enum fsp_log_level log_level = fsp_map_console_log_level();
409 arch_upd->FspEventHandler = (UINT32)((FSP_EVENT_HANDLER *)
410 fsp_debug_event_handler);
411 /* Set Serial debug message level */
412 m_cfg->PcdSerialDebugLevel = log_level;
413 /* Set MRC debug level */
414 m_cfg->SerialDebugMrcLevel = log_level;
415 } else {
416 /* Disable Serial debug message */
417 m_cfg->PcdSerialDebugLevel = 0;
418 /* Disable MRC debug message */
419 m_cfg->SerialDebugMrcLevel = 0;
420 }
421 }
Jeremy Compostella1f4d7c72023-01-04 09:41:52 -0700422
423 /*
424 * If valid MRC cache data is not found, FSP should perform a memory
425 * training. Memory training can take a while so let's inform the end
426 * user with an on-screen text message.
427 */
Tarun Tulieed31cb2023-01-31 18:14:35 +0000428 if (!arch_upd->NvsBufferPtr) {
429 if (ux_inform_user_of_update_operation("memory training"))
430 elog_add_event_byte(ELOG_TYPE_FW_EARLY_SOL, ELOG_FW_EARLY_SOL_MRC);
431 }
Subrata Banik292afef2020-09-09 13:34:18 +0530432 config = config_of_soc();
433
434 soc_memory_init_params(m_cfg, config);
Zhuohao Lee09f3b6c2022-01-20 21:30:12 +0800435 mainboard_memory_init_params(mupd);
Sridhar Siricilladddaeed2022-04-28 23:34:14 +0530436
437 /* Override the memory init params through runtime debug capability */
438 if (CONFIG(SOC_INTEL_COMMON_BASECODE_DEBUG_FEATURE))
439 debug_override_memory_init_params(m_cfg);
Jeremy Compostella9df11972022-12-02 10:59:49 -0700440
441 if (CONFIG(HWBASE_STATIC_MMIO))
442 m_cfg->GttMmAdr = CONFIG_GFX_GMA_DEFAULT_MMIO;
Subrata Banik292afef2020-09-09 13:34:18 +0530443}
444
Zhuohao Lee09f3b6c2022-01-20 21:30:12 +0800445__weak void mainboard_memory_init_params(FSPM_UPD *memupd)
Subrata Banik292afef2020-09-09 13:34:18 +0530446{
447 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
448}