blob: 1326cb5c1aefcd4e634f3fad9522accf122ccae1 [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 }
Bora Guvendik433343e2023-04-24 15:50:15 -0700161#if CONFIG(SOC_INTEL_RAPTORLAKE)
162 m_cfg->LowerBasicMemTestSize = config->lower_basic_mem_test_size;
163#endif
Subrata Banik85c9dda2021-06-09 22:03:57 +0530164}
Subrata Banik292afef2020-09-09 13:34:18 +0530165
Subrata Banik85c9dda2021-06-09 22:03:57 +0530166static void fill_fspm_cpu_params(FSP_M_CONFIG *m_cfg,
167 const struct soc_intel_alderlake_config *config)
168{
169 m_cfg->TsegSize = CONFIG_SMM_TSEG_SIZE;
Subrata Banik292afef2020-09-09 13:34:18 +0530170 /* CpuRatio Settings */
171 if (config->cpu_ratio_override)
172 m_cfg->CpuRatio = config->cpu_ratio_override;
173 else
174 /* Set CpuRatio to match existing MSR value */
175 m_cfg->CpuRatio = (rdmsr(MSR_FLEX_RATIO).lo >> 8) & 0xff;
176
Subrata Banik80835a12020-09-23 17:46:11 +0530177 m_cfg->PrmrrSize = get_valid_prmrr_size();
Subrata Banik292afef2020-09-09 13:34:18 +0530178 m_cfg->EnableC6Dram = config->enable_c6dram;
Felix Singera182fae2021-12-31 00:30:55 +0100179 m_cfg->HyperThreading = get_uint_option("hyper_threading", CONFIG(FSP_HYPERTHREADING));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530180}
181
182static void fill_fspm_security_params(FSP_M_CONFIG *m_cfg,
183 const struct soc_intel_alderlake_config *config)
184{
Subrata Banik292afef2020-09-09 13:34:18 +0530185 /* Disable BIOS Guard */
186 m_cfg->BiosGuard = 0;
Subrata Banik1e71fe12022-08-15 15:40:59 +0530187 m_cfg->TmeEnable = CONFIG(INTEL_TME) && is_tme_supported();
Subrata Banik85c9dda2021-06-09 22:03:57 +0530188}
Subrata Banik292afef2020-09-09 13:34:18 +0530189
Subrata Banik85c9dda2021-06-09 22:03:57 +0530190static void fill_fspm_uart_params(FSP_M_CONFIG *m_cfg,
191 const struct soc_intel_alderlake_config *config)
192{
Subrata Banik292afef2020-09-09 13:34:18 +0530193 if (CONFIG(DRIVERS_UART_8250IO))
194 m_cfg->PcdIsaSerialUartBase = ISA_SERIAL_BASE_ADDR_3F8;
195 m_cfg->SerialIoUartDebugMode = PchSerialIoSkipInit;
196 m_cfg->SerialIoUartDebugControllerNumber = CONFIG_UART_FOR_CONSOLE;
Subrata Banik85c9dda2021-06-09 22:03:57 +0530197}
Subrata Banik292afef2020-09-09 13:34:18 +0530198
Subrata Banik85c9dda2021-06-09 22:03:57 +0530199static void fill_fspm_ipu_params(FSP_M_CONFIG *m_cfg,
200 const struct soc_intel_alderlake_config *config)
201{
Subrata Banik292afef2020-09-09 13:34:18 +0530202 /* Image clock: disable all clocks for bypassing FSP pin mux */
203 memset(m_cfg->ImguClkOutEn, 0, sizeof(m_cfg->ImguClkOutEn));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530204 /* IPU */
205 m_cfg->SaIpuEnable = is_devfn_enabled(SA_DEVFN_IPU);
206}
Subrata Banik292afef2020-09-09 13:34:18 +0530207
Subrata Banik85c9dda2021-06-09 22:03:57 +0530208static void fill_fspm_smbus_params(FSP_M_CONFIG *m_cfg,
209 const struct soc_intel_alderlake_config *config)
210{
211 m_cfg->SmbusEnable = is_devfn_enabled(PCH_DEVFN_SMBUS);
212}
213
214static void fill_fspm_misc_params(FSP_M_CONFIG *m_cfg,
215 const struct soc_intel_alderlake_config *config)
216{
Subrata Banik292afef2020-09-09 13:34:18 +0530217 /* Disable Lock PCU Thermal Management registers */
218 m_cfg->LockPTMregs = 0;
Subrata Banik292afef2020-09-09 13:34:18 +0530219
Subrata Banik85c9dda2021-06-09 22:03:57 +0530220 /* Skip CPU replacement check */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530221 m_cfg->SkipCpuReplacementCheck = !config->cpu_replacement_check;
Subrata Banik85c9dda2021-06-09 22:03:57 +0530222
223 /* Skip GPIO configuration from FSP */
224 m_cfg->GpioOverride = 0x1;
MAULIK V VAGHELA9a7fbbc2021-10-13 11:52:17 +0530225
Ronak Kanabarfc69b9d2021-10-06 13:02:34 +0530226 /* CNVi DDR RFI Mitigation */
Tim Wawrzynczak6f73a202022-02-04 12:45:37 -0700227 const struct device_path path[] = {
228 { .type = DEVICE_PATH_PCI, .pci.devfn = PCH_DEVFN_CNVI_WIFI },
229 { .type = DEVICE_PATH_GENERIC, .generic.id = 0 } };
230 const struct device *dev = find_dev_nested_path(pci_root_bus(), path,
231 ARRAY_SIZE(path));
232 if (is_dev_enabled(dev))
233 m_cfg->CnviDdrRfim = wifi_generic_cnvi_ddr_rfim_enabled(dev);
V Sowmya2bc54e72022-08-04 22:50:51 +0530234
235 /* Skip MBP HOB */
Kapil Porwal23ef60d2023-01-16 16:07:48 +0000236 m_cfg->SkipMbpHob = !CONFIG(FSP_PUBLISH_MBP_HOB);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530237}
238
239static void fill_fspm_audio_params(FSP_M_CONFIG *m_cfg,
240 const struct soc_intel_alderlake_config *config)
241{
Subrata Banik292afef2020-09-09 13:34:18 +0530242 /* Audio: HDAUDIO_LINK_MODE I2S/SNDW */
Subrata Banik50134ec2021-06-09 04:14:50 +0530243 m_cfg->PchHdaEnable = is_devfn_enabled(PCH_DEVFN_HDA);
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530244 m_cfg->PchHdaDspEnable = config->pch_hda_dsp_enable;
245 m_cfg->PchHdaIDispLinkTmode = config->pch_hda_idisp_link_tmode;
246 m_cfg->PchHdaIDispLinkFrequency = config->pch_hda_idisp_link_frequency;
247 m_cfg->PchHdaIDispCodecDisconnect = !config->pch_hda_idisp_codec_enable;
Sean Rhodes7bfc2562023-01-06 10:50:53 +0000248 m_cfg->PchHdaAudioLinkHdaEnable = config->pch_hda_audio_link_hda_enable;
Furquan Shaikhc1c1ba52021-04-20 16:57:59 -0700249 memset(m_cfg->PchHdaAudioLinkDmicEnable, 0, sizeof(m_cfg->PchHdaAudioLinkDmicEnable));
250 memset(m_cfg->PchHdaAudioLinkSspEnable, 0, sizeof(m_cfg->PchHdaAudioLinkSspEnable));
251 memset(m_cfg->PchHdaAudioLinkSndwEnable, 0, sizeof(m_cfg->PchHdaAudioLinkSndwEnable));
Subrata Banik85c9dda2021-06-09 22:03:57 +0530252}
Subrata Banik292afef2020-09-09 13:34:18 +0530253
Subrata Banik85c9dda2021-06-09 22:03:57 +0530254static void fill_fspm_ish_params(FSP_M_CONFIG *m_cfg,
255 const struct soc_intel_alderlake_config *config)
256{
Subrata Banik50134ec2021-06-09 04:14:50 +0530257 m_cfg->PchIshEnable = is_devfn_enabled(PCH_DEVFN_ISH);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530258}
Subrata Banik292afef2020-09-09 13:34:18 +0530259
Subrata Banik85c9dda2021-06-09 22:03:57 +0530260static void fill_fspm_tcss_params(FSP_M_CONFIG *m_cfg,
261 const struct soc_intel_alderlake_config *config)
262{
Subrata Banik292afef2020-09-09 13:34:18 +0530263 /* Tcss USB */
Subrata Banik50134ec2021-06-09 04:14:50 +0530264 m_cfg->TcssXhciEn = is_devfn_enabled(SA_DEVFN_TCSS_XHCI);
265 m_cfg->TcssXdciEn = is_devfn_enabled(SA_DEVFN_TCSS_XDCI);
Subrata Banik292afef2020-09-09 13:34:18 +0530266
267 /* TCSS DMA */
Subrata Banik50134ec2021-06-09 04:14:50 +0530268 m_cfg->TcssDma0En = is_devfn_enabled(SA_DEVFN_TCSS_DMA0);
269 m_cfg->TcssDma1En = is_devfn_enabled(SA_DEVFN_TCSS_DMA1);
Kane Chen8327a7e2022-09-27 09:54:30 +0800270
271#if CONFIG(SOC_INTEL_RAPTORLAKE)
272 m_cfg->DisableDynamicTccoldHandshake =
273 config->disable_dynamic_tccold_handshake;
274#endif
Subrata Banik85c9dda2021-06-09 22:03:57 +0530275}
Subrata Banik292afef2020-09-09 13:34:18 +0530276
Subrata Banik85c9dda2021-06-09 22:03:57 +0530277static void fill_fspm_usb4_params(FSP_M_CONFIG *m_cfg,
278 const struct soc_intel_alderlake_config *config)
279{
Subrata Banik50134ec2021-06-09 04:14:50 +0530280 m_cfg->TcssItbtPcie0En = is_devfn_enabled(SA_DEVFN_TBT0);
281 m_cfg->TcssItbtPcie1En = is_devfn_enabled(SA_DEVFN_TBT1);
282 m_cfg->TcssItbtPcie2En = is_devfn_enabled(SA_DEVFN_TBT2);
283 m_cfg->TcssItbtPcie3En = is_devfn_enabled(SA_DEVFN_TBT3);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530284}
Subrata Banik292afef2020-09-09 13:34:18 +0530285
Subrata Banik85c9dda2021-06-09 22:03:57 +0530286static void fill_fspm_vtd_params(FSP_M_CONFIG *m_cfg,
287 const struct soc_intel_alderlake_config *config)
288{
Meera Ravindranath3b037982021-11-11 18:02:13 +0530289 const uint32_t cpuid = cpu_get_cpuid();
290
291 /* Disable VT-d for early silicon steppings as it results in a CPU hard hang */
Lean Sheng Tan9e78dd12022-04-01 12:03:51 +0200292 if (cpuid == CPUID_ALDERLAKE_J0 || cpuid == CPUID_ALDERLAKE_Q0) {
Meera Ravindranath3b037982021-11-11 18:02:13 +0530293 m_cfg->VtdDisable = 1;
294 return;
295 }
296
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530297 m_cfg->VtdBaseAddress[VTD_GFX] = GFXVT_BASE_ADDRESS;
298 m_cfg->VtdBaseAddress[VTD_IPU] = IPUVT_BASE_ADDRESS;
299 m_cfg->VtdBaseAddress[VTD_VTVCO] = VTVC0_BASE_ADDRESS;
300
301 m_cfg->VtdDisable = 0;
302 m_cfg->VtdIopEnable = !m_cfg->VtdDisable;
303 m_cfg->VtdIgdEnable = m_cfg->InternalGfx;
304 m_cfg->VtdIpuEnable = m_cfg->SaIpuEnable;
305
Michał Żygowskic7fee242022-10-15 16:39:46 +0200306 m_cfg->PreBootDmaMask = CONFIG(ENABLE_EARLY_DMA_PROTECTION);
307
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530308 if (m_cfg->VtdIgdEnable && m_cfg->VtdBaseAddress[VTD_GFX] == 0) {
309 m_cfg->VtdIgdEnable = 0;
Julius Wernere9665952022-01-21 17:06:20 -0800310 printk(BIOS_ERR, "Requested IGD VT-d, but GFXVT_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530311 }
312
313 if (m_cfg->VtdIpuEnable && m_cfg->VtdBaseAddress[VTD_IPU] == 0) {
314 m_cfg->VtdIpuEnable = 0;
Julius Wernere9665952022-01-21 17:06:20 -0800315 printk(BIOS_ERR, "Requested IPU VT-d, but IPUVT_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530316 }
317
318 if (!m_cfg->VtdDisable && m_cfg->VtdBaseAddress[VTD_VTVCO] == 0) {
319 m_cfg->VtdDisable = 1;
Julius Wernere9665952022-01-21 17:06:20 -0800320 printk(BIOS_ERR, "Requested VT-d, but VTVCO_BASE_ADDRESS is 0\n");
Meera Ravindranatha3f7deb2021-03-26 15:10:48 +0530321 }
Subrata Banik292afef2020-09-09 13:34:18 +0530322
Sridhar Siricillad0479272021-05-28 20:00:02 +0530323 if (m_cfg->TcssDma0En || m_cfg->TcssDma1En)
324 m_cfg->VtdItbtEnable = 1;
325
326 if (m_cfg->TcssItbtPcie0En)
327 m_cfg->VtdBaseAddress[VTD_TBT0] = TBT0_BASE_ADDRESS;
328
329 if (m_cfg->TcssItbtPcie1En)
330 m_cfg->VtdBaseAddress[VTD_TBT1] = TBT1_BASE_ADDRESS;
331
332 if (m_cfg->TcssItbtPcie2En)
333 m_cfg->VtdBaseAddress[VTD_TBT2] = TBT2_BASE_ADDRESS;
334
335 if (m_cfg->TcssItbtPcie3En)
336 m_cfg->VtdBaseAddress[VTD_TBT3] = TBT3_BASE_ADDRESS;
337
Subrata Banik292afef2020-09-09 13:34:18 +0530338 /* Change VmxEnable UPD value according to ENABLE_VMX Kconfig */
339 m_cfg->VmxEnable = CONFIG(ENABLE_VMX);
Subrata Banik85c9dda2021-06-09 22:03:57 +0530340}
Subrata Banik292afef2020-09-09 13:34:18 +0530341
Subrata Banik85c9dda2021-06-09 22:03:57 +0530342static void fill_fspm_trace_params(FSP_M_CONFIG *m_cfg,
343 const struct soc_intel_alderlake_config *config)
344{
345 /* Set debug probe type */
346 m_cfg->PlatformDebugConsent = CONFIG_SOC_INTEL_ALDERLAKE_DEBUG_CONSENT;
Francois Toguocea4f922021-04-16 21:20:39 -0700347
348 /* CrashLog config */
Subrata Banik7b8d11b2021-07-14 13:11:53 +0530349 m_cfg->CpuCrashLogDevice = CONFIG(SOC_INTEL_CRASHLOG) && is_devfn_enabled(SA_DEVFN_TMT);
350 m_cfg->CpuCrashLogEnable = m_cfg->CpuCrashLogDevice;
Subrata Banik292afef2020-09-09 13:34:18 +0530351}
352
Maximilian Brune2c984882022-10-24 20:31:18 +0200353static void fill_fspm_ibecc_params(FSP_M_CONFIG *m_cfg,
354 const struct soc_intel_alderlake_config *config)
355{
356 /* In-Band ECC configuration */
357 if (config->ibecc.enable) {
358 m_cfg->Ibecc = config->ibecc.enable;
359 m_cfg->IbeccOperationMode = config->ibecc.mode;
360 if (m_cfg->IbeccOperationMode == IBECC_MODE_PER_REGION) {
361 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeEnable,
362 config->ibecc.range_enable);
363 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeBase,
364 config->ibecc.range_base);
365 FSP_ARRAY_LOAD(m_cfg->IbeccProtectedRangeMask,
366 config->ibecc.range_mask);
367 }
368 }
369}
370
Subrata Banik85c9dda2021-06-09 22:03:57 +0530371static void soc_memory_init_params(FSP_M_CONFIG *m_cfg,
372 const struct soc_intel_alderlake_config *config)
373{
Arthur Heymans02967e62022-02-18 13:22:25 +0100374 void (*const fill_fspm_params[])(FSP_M_CONFIG *m_cfg,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530375 const struct soc_intel_alderlake_config *config) = {
376 fill_fspm_igd_params,
377 fill_fspm_mrc_params,
378 fill_fspm_cpu_params,
379 fill_fspm_security_params,
380 fill_fspm_uart_params,
381 fill_fspm_ipu_params,
382 fill_fspm_smbus_params,
383 fill_fspm_misc_params,
384 fill_fspm_audio_params,
385 fill_fspm_pcie_rp_params,
386 fill_fspm_ish_params,
387 fill_fspm_tcss_params,
388 fill_fspm_usb4_params,
389 fill_fspm_vtd_params,
390 fill_fspm_trace_params,
Maximilian Brune2c984882022-10-24 20:31:18 +0200391 fill_fspm_ibecc_params,
Subrata Banik85c9dda2021-06-09 22:03:57 +0530392 };
393
394 for (size_t i = 0; i < ARRAY_SIZE(fill_fspm_params); i++)
395 fill_fspm_params[i](m_cfg, config);
396}
397
Sridhar Siricilladddaeed2022-04-28 23:34:14 +0530398static void debug_override_memory_init_params(FSP_M_CONFIG *mupd)
399{
400 debug_get_pch_cpu_tracehub_modes(&mupd->CpuTraceHubMode, &mupd->PchTraceHubMode);
401}
402
Subrata Banik292afef2020-09-09 13:34:18 +0530403void platform_fsp_memory_init_params_cb(FSPM_UPD *mupd, uint32_t version)
404{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530405 const struct soc_intel_alderlake_config *config;
Subrata Banik292afef2020-09-09 13:34:18 +0530406 FSP_M_CONFIG *m_cfg = &mupd->FspmConfig;
Subrata Banik7cb6d722022-03-23 01:33:27 +0530407 FSPM_ARCH_UPD *arch_upd = &mupd->FspmArchUpd;
408
Subrata Banik88381c92022-03-29 11:26:11 +0530409 if (CONFIG(FSP_USES_CB_DEBUG_EVENT_HANDLER)) {
410 if (CONFIG(CONSOLE_SERIAL) && CONFIG(FSP_ENABLE_SERIAL_DEBUG)) {
411 enum fsp_log_level log_level = fsp_map_console_log_level();
412 arch_upd->FspEventHandler = (UINT32)((FSP_EVENT_HANDLER *)
413 fsp_debug_event_handler);
414 /* Set Serial debug message level */
415 m_cfg->PcdSerialDebugLevel = log_level;
416 /* Set MRC debug level */
417 m_cfg->SerialDebugMrcLevel = log_level;
418 } else {
419 /* Disable Serial debug message */
420 m_cfg->PcdSerialDebugLevel = 0;
421 /* Disable MRC debug message */
422 m_cfg->SerialDebugMrcLevel = 0;
423 }
424 }
Jeremy Compostella1f4d7c72023-01-04 09:41:52 -0700425
426 /*
427 * If valid MRC cache data is not found, FSP should perform a memory
428 * training. Memory training can take a while so let's inform the end
429 * user with an on-screen text message.
430 */
Tarun Tulieed31cb2023-01-31 18:14:35 +0000431 if (!arch_upd->NvsBufferPtr) {
432 if (ux_inform_user_of_update_operation("memory training"))
433 elog_add_event_byte(ELOG_TYPE_FW_EARLY_SOL, ELOG_FW_EARLY_SOL_MRC);
434 }
Subrata Banik292afef2020-09-09 13:34:18 +0530435 config = config_of_soc();
436
437 soc_memory_init_params(m_cfg, config);
Zhuohao Lee09f3b6c2022-01-20 21:30:12 +0800438 mainboard_memory_init_params(mupd);
Sridhar Siricilladddaeed2022-04-28 23:34:14 +0530439
440 /* Override the memory init params through runtime debug capability */
441 if (CONFIG(SOC_INTEL_COMMON_BASECODE_DEBUG_FEATURE))
442 debug_override_memory_init_params(m_cfg);
Jeremy Compostella9df11972022-12-02 10:59:49 -0700443
444 if (CONFIG(HWBASE_STATIC_MMIO))
445 m_cfg->GttMmAdr = CONFIG_GFX_GMA_DEFAULT_MMIO;
Subrata Banik292afef2020-09-09 13:34:18 +0530446}
447
Zhuohao Lee09f3b6c2022-01-20 21:30:12 +0800448__weak void mainboard_memory_init_params(FSPM_UPD *memupd)
Subrata Banik292afef2020-09-09 13:34:18 +0530449{
450 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
451}