blob: 7fe996e1f7515942d7363a982e110e24b7d6b445 [file] [log] [blame]
Subrata Banik2871e0e2020-09-27 11:30:58 +05301/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <assert.h>
Subrata Banik99289a82020-12-22 10:54:44 +05304#include <cbfs.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +05305#include <console/console.h>
6#include <device/device.h>
7#include <device/pci.h>
8#include <fsp/api.h>
9#include <fsp/ppi/mp_service_ppi.h>
10#include <fsp/util.h>
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060011#include <intelblocks/irq.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053012#include <intelblocks/lpss.h>
13#include <intelblocks/xdci.h>
14#include <intelpch/lockdown.h>
15#include <intelblocks/mp_init.h>
Deepti Deshatty8e7facf2021-05-12 17:45:37 +053016#include <intelblocks/tcss.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053017#include <soc/gpio_soc_defs.h>
18#include <soc/intel/common/vbt.h>
19#include <soc/pci_devs.h>
Eric Lai5b302b22020-12-05 16:49:43 +080020#include <soc/pcie.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053021#include <soc/ramstage.h>
22#include <soc/soc_chip.h>
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060023#include <stdlib.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053024#include <string.h>
25
26/* THC assignment definition */
27#define THC_NONE 0
28#define THC_0 1
29#define THC_1 2
30
31/* SATA DEVSLP idle timeout default values */
32#define DEF_DMVAL 15
33#define DEF_DITOVAL 625
34
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -060035/*
36 * ME End of Post configuration
37 * 0 - Disable EOP.
38 * 1 - Send in PEI (Applicable for FSP in API mode)
39 * 2 - Send in DXE (Not applicable for FSP in API mode)
40 */
41enum fsp_end_of_post {
42 EOP_DISABLE = 0,
43 EOP_PEI = 1,
44 EOP_DXE = 2,
45};
46
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060047static const struct slot_irq_constraints irq_constraints[] = {
48 {
49 .slot = SA_DEV_SLOT_IGD,
50 .fns = {
51 ANY_PIRQ(SA_DEVFN_IGD),
52 },
53 },
54 {
55 .slot = SA_DEV_SLOT_DPTF,
56 .fns = {
57 ANY_PIRQ(SA_DEVFN_DPTF),
58 },
59 },
60 {
61 .slot = SA_DEV_SLOT_IPU,
62 .fns = {
63 ANY_PIRQ(SA_DEVFN_IPU),
64 },
65 },
66 {
67 .slot = SA_DEV_SLOT_CPU_6,
68 .fns = {
69 ANY_PIRQ(SA_DEVFN_CPU_PCIE6_0),
70 ANY_PIRQ(SA_DEVFN_CPU_PCIE6_2),
71 },
72 },
73 {
74 .slot = SA_DEV_SLOT_TBT,
75 .fns = {
76 ANY_PIRQ(SA_DEVFN_TBT0),
77 ANY_PIRQ(SA_DEVFN_TBT1),
78 ANY_PIRQ(SA_DEVFN_TBT2),
79 ANY_PIRQ(SA_DEVFN_TBT3),
80 },
81 },
82 {
83 .slot = SA_DEV_SLOT_TCSS,
84 .fns = {
85 ANY_PIRQ(SA_DEVFN_TCSS_XHCI),
86 },
87 },
88 {
89 .slot = PCH_DEV_SLOT_ISH,
90 .fns = {
91 DIRECT_IRQ(PCH_DEVFN_ISH),
92 DIRECT_IRQ(PCH_DEVFN_GSPI2),
93 },
94 },
95 {
96 .slot = PCH_DEV_SLOT_XHCI,
97 .fns = {
98 ANY_PIRQ(PCH_DEVFN_XHCI),
99 ANY_PIRQ(PCH_DEVFN_CNVI_WIFI),
100 },
101 },
102 {
103 .slot = PCH_DEV_SLOT_SIO3,
104 .fns = {
105 DIRECT_IRQ(PCH_DEVFN_I2C0),
106 DIRECT_IRQ(PCH_DEVFN_I2C1),
107 DIRECT_IRQ(PCH_DEVFN_I2C2),
108 DIRECT_IRQ(PCH_DEVFN_I2C3),
109 },
110 },
111 {
112 .slot = PCH_DEV_SLOT_CSE,
113 .fns = {
114 ANY_PIRQ(PCH_DEVFN_CSE),
115 ANY_PIRQ(PCH_DEVFN_CSE_2),
116 ANY_PIRQ(PCH_DEVFN_CSE_IDER),
117 ANY_PIRQ(PCH_DEVFN_CSE_KT),
118 ANY_PIRQ(PCH_DEVFN_CSE_3),
119 ANY_PIRQ(PCH_DEVFN_CSE_4),
120 },
121 },
122 {
123 .slot = PCH_DEV_SLOT_SATA,
124 .fns = {
125 ANY_PIRQ(PCH_DEVFN_SATA),
126 },
127 },
128 {
129 .slot = PCH_DEV_SLOT_SIO4,
130 .fns = {
131 DIRECT_IRQ(PCH_DEVFN_I2C4),
132 DIRECT_IRQ(PCH_DEVFN_I2C5),
133 DIRECT_IRQ(PCH_DEVFN_UART2),
134 },
135 },
136 {
137 .slot = PCH_DEV_SLOT_PCIE,
138 .fns = {
139 FIXED_INT_PIRQ(PCH_DEVFN_PCIE1, PCI_INT_A, PIRQ_A),
140 FIXED_INT_PIRQ(PCH_DEVFN_PCIE2, PCI_INT_B, PIRQ_B),
141 FIXED_INT_PIRQ(PCH_DEVFN_PCIE3, PCI_INT_C, PIRQ_C),
142 FIXED_INT_PIRQ(PCH_DEVFN_PCIE4, PCI_INT_D, PIRQ_D),
143 FIXED_INT_PIRQ(PCH_DEVFN_PCIE5, PCI_INT_A, PIRQ_A),
144 FIXED_INT_PIRQ(PCH_DEVFN_PCIE6, PCI_INT_B, PIRQ_B),
145 FIXED_INT_PIRQ(PCH_DEVFN_PCIE7, PCI_INT_C, PIRQ_C),
146 FIXED_INT_PIRQ(PCH_DEVFN_PCIE8, PCI_INT_D, PIRQ_D),
147 },
148 },
149 {
150 .slot = PCH_DEV_SLOT_PCIE_1,
151 .fns = {
152 FIXED_INT_PIRQ(PCH_DEVFN_PCIE9, PCI_INT_A, PIRQ_A),
153 FIXED_INT_PIRQ(PCH_DEVFN_PCIE10, PCI_INT_B, PIRQ_B),
154 FIXED_INT_PIRQ(PCH_DEVFN_PCIE11, PCI_INT_C, PIRQ_C),
155 FIXED_INT_PIRQ(PCH_DEVFN_PCIE12, PCI_INT_D, PIRQ_D),
156 },
157 },
158 {
159 .slot = PCH_DEV_SLOT_SIO5,
160 .fns = {
161 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART0, PCI_INT_A),
162 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART1, PCI_INT_B),
163 ANY_PIRQ(PCH_DEVFN_GSPI0),
164 ANY_PIRQ(PCH_DEVFN_GSPI1),
165 },
166 },
167 {
168 .slot = PCH_DEV_SLOT_ESPI,
169 .fns = {
170 ANY_PIRQ(PCH_DEVFN_HDA),
171 ANY_PIRQ(PCH_DEVFN_SMBUS),
172 ANY_PIRQ(PCH_DEVFN_GBE),
173 FIXED_INT_ANY_PIRQ(PCH_DEVFN_TRACEHUB, PCI_INT_A),
174 },
175 },
176};
177
178static const SI_PCH_DEVICE_INTERRUPT_CONFIG *pci_irq_to_fsp(size_t *out_count)
179{
180 const struct pci_irq_entry *entry = get_cached_pci_irqs();
181 SI_PCH_DEVICE_INTERRUPT_CONFIG *config;
182 size_t pch_total = 0;
183 size_t cfg_count = 0;
184
185 if (!entry)
186 return NULL;
187
188 /* Count PCH devices */
189 while (entry) {
190 if (PCI_SLOT(entry->devfn) >= MIN_PCH_SLOT)
191 ++pch_total;
192 entry = entry->next;
193 }
194
195 /* Convert PCH device entries to FSP format */
196 config = calloc(pch_total, sizeof(*config));
197 entry = get_cached_pci_irqs();
198 while (entry) {
199 if (PCI_SLOT(entry->devfn) < MIN_PCH_SLOT) {
200 entry = entry->next;
201 continue;
202 }
203
204 config[cfg_count].Device = PCI_SLOT(entry->devfn);
205 config[cfg_count].Function = PCI_FUNC(entry->devfn);
206 config[cfg_count].IntX = (SI_PCH_INT_PIN)entry->pin;
207 config[cfg_count].Irq = entry->irq;
208 ++cfg_count;
209
210 entry = entry->next;
211 }
212
213 *out_count = cfg_count;
214
215 return config;
216}
217
Subrata Banik2871e0e2020-09-27 11:30:58 +0530218/*
219 * Chip config parameter PcieRpL1Substates uses (UPD value + 1)
220 * because UPD value of 0 for PcieRpL1Substates means disabled for FSP.
221 * In order to ensure that mainboard setting does not disable L1 substates
222 * incorrectly, chip config parameter values are offset by 1 with 0 meaning
223 * use FSP UPD default. get_l1_substate_control() ensures that the right UPD
224 * value is set in fsp_params.
225 * 0: Use FSP UPD default
226 * 1: Disable L1 substates
227 * 2: Use L1.1
228 * 3: Use L1.2 (FSP UPD default)
229 */
230static int get_l1_substate_control(enum L1_substates_control ctl)
231{
232 if ((ctl > L1_SS_L1_2) || (ctl == L1_SS_FSP_DEFAULT))
233 ctl = L1_SS_L1_2;
234 return ctl - 1;
235}
236
Subrata Banikb03cadf2021-06-09 22:19:04 +0530237__weak void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530238{
Subrata Banikb03cadf2021-06-09 22:19:04 +0530239 /* Override settings per board. */
240}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530241
Subrata Banikb03cadf2021-06-09 22:19:04 +0530242static void fill_fsps_lpss_params(FSP_S_CONFIG *s_cfg,
243 const struct soc_intel_alderlake_config *config)
244{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530245 for (int i = 0; i < CONFIG_SOC_INTEL_I2C_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530246 s_cfg->SerialIoI2cMode[i] = config->SerialIoI2cMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530247
248 for (int i = 0; i < CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX; i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530249 s_cfg->SerialIoSpiMode[i] = config->SerialIoGSpiMode[i];
250 s_cfg->SerialIoSpiCsMode[i] = config->SerialIoGSpiCsMode[i];
251 s_cfg->SerialIoSpiCsState[i] = config->SerialIoGSpiCsState[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530252 }
253
254 for (int i = 0; i < CONFIG_SOC_INTEL_UART_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530255 s_cfg->SerialIoUartMode[i] = config->SerialIoUartMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530256}
257
Subrata Banikb03cadf2021-06-09 22:19:04 +0530258static void fill_fsps_cpu_params(FSP_S_CONFIG *s_cfg,
259 const struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530260{
Subrata Banik99289a82020-12-22 10:54:44 +0530261 const struct microcode *microcode_file;
262 size_t microcode_len;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530263
Subrata Banikb03cadf2021-06-09 22:19:04 +0530264 /* Locate microcode and pass to FSP-S for 2nd microcode loading */
Subrata Banik99289a82020-12-22 10:54:44 +0530265 microcode_file = cbfs_map("cpu_microcode_blob.bin", &microcode_len);
266
267 if ((microcode_file != NULL) && (microcode_len != 0)) {
268 /* Update CPU Microcode patch base address/size */
Subrata Banikc0983c92021-06-15 13:02:01 +0530269 s_cfg->MicrocodeRegionBase = (uint32_t)microcode_file;
270 s_cfg->MicrocodeRegionSize = (uint32_t)microcode_len;
Subrata Banik99289a82020-12-22 10:54:44 +0530271 }
272
Subrata Banikb03cadf2021-06-09 22:19:04 +0530273 /* Use coreboot MP PPI services if Kconfig is enabled */
274 if (CONFIG(USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI))
275 s_cfg->CpuMpPpi = (uintptr_t) mp_fill_ppi_services_data();
276}
277
278static void fill_fsps_igd_params(FSP_S_CONFIG *s_cfg,
279 const struct soc_intel_alderlake_config *config)
280{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530281 /* Load VBT before devicetree-specific config. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530282 s_cfg->GraphicsConfigPtr = (uintptr_t)vbt_get();
Subrata Banik2871e0e2020-09-27 11:30:58 +0530283
284 /* Check if IGD is present and fill Graphics init param accordingly */
Subrata Banikc0983c92021-06-15 13:02:01 +0530285 s_cfg->PeiGraphicsPeimInit = CONFIG(RUN_FSP_GOP) && is_devfn_enabled(SA_DEVFN_IGD);
286 s_cfg->LidStatus = CONFIG(RUN_FSP_GOP);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530287}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530288
Subrata Banikb03cadf2021-06-09 22:19:04 +0530289static void fill_fsps_tcss_params(FSP_S_CONFIG *s_cfg,
290 const struct soc_intel_alderlake_config *config)
291{
Subrata Banikc0983c92021-06-15 13:02:01 +0530292 s_cfg->TcssAuxOri = config->TcssAuxOri;
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530293
294 /* Explicitly clear this field to avoid using defaults */
Subrata Banikc0983c92021-06-15 13:02:01 +0530295 memset(s_cfg->IomTypeCPortPadCfg, 0, sizeof(s_cfg->IomTypeCPortPadCfg));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530296
297 /*
298 * Set FSPS UPD ITbtConnectTopologyTimeoutInMs with value 0. FSP will
299 * evaluate this UPD value and skip sending command. There will be no
300 * delay for command completion.
301 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530302 s_cfg->ITbtConnectTopologyTimeoutInMs = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530303
Subrata Banikb03cadf2021-06-09 22:19:04 +0530304 /* D3Hot and D3Cold for TCSS */
305 s_cfg->D3HotEnable = !config->TcssD3HotDisable;
306 s_cfg->D3ColdEnable = !config->TcssD3ColdDisable;
307}
308
309static void fill_fsps_chipset_lockdown_params(FSP_S_CONFIG *s_cfg,
310 const struct soc_intel_alderlake_config *config)
311{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530312 /* Chipset Lockdown */
313 if (get_lockdown_config() == CHIPSET_LOCKDOWN_COREBOOT) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530314 s_cfg->PchLockDownGlobalSmi = 0;
315 s_cfg->PchLockDownBiosInterface = 0;
316 s_cfg->PchUnlockGpioPads = 1;
317 s_cfg->RtcMemoryLock = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530318 } else {
Subrata Banikc0983c92021-06-15 13:02:01 +0530319 s_cfg->PchLockDownGlobalSmi = 1;
320 s_cfg->PchLockDownBiosInterface = 1;
321 s_cfg->PchUnlockGpioPads = 0;
322 s_cfg->RtcMemoryLock = 1;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530323 }
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -0600324
325 /* coreboot will send EOP before loading payload */
326 s_cfg->EndOfPostMessage = EOP_DISABLE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530327}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530328
Subrata Banikb03cadf2021-06-09 22:19:04 +0530329static void fill_fsps_xhci_params(FSP_S_CONFIG *s_cfg,
330 const struct soc_intel_alderlake_config *config)
331{
332 int i;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530333 /* USB */
334 for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530335 s_cfg->PortUsb20Enable[i] = config->usb2_ports[i].enable;
336 s_cfg->Usb2PhyPetxiset[i] = config->usb2_ports[i].pre_emp_bias;
337 s_cfg->Usb2PhyTxiset[i] = config->usb2_ports[i].tx_bias;
338 s_cfg->Usb2PhyPredeemp[i] = config->usb2_ports[i].tx_emp_enable;
339 s_cfg->Usb2PhyPehalfbit[i] = config->usb2_ports[i].pre_emp_bit;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530340
341 if (config->usb2_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530342 s_cfg->Usb2OverCurrentPin[i] = config->usb2_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530343 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530344 s_cfg->Usb2OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530345 }
346
347 for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530348 s_cfg->PortUsb30Enable[i] = config->usb3_ports[i].enable;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530349 if (config->usb3_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530350 s_cfg->Usb3OverCurrentPin[i] = config->usb3_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530351 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530352 s_cfg->Usb3OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530353
354 if (config->usb3_ports[i].tx_de_emp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530355 s_cfg->Usb3HsioTxDeEmphEnable[i] = 1;
356 s_cfg->Usb3HsioTxDeEmph[i] = config->usb3_ports[i].tx_de_emp;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530357 }
358 if (config->usb3_ports[i].tx_downscale_amp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530359 s_cfg->Usb3HsioTxDownscaleAmpEnable[i] = 1;
360 s_cfg->Usb3HsioTxDownscaleAmp[i] =
Subrata Banik2871e0e2020-09-27 11:30:58 +0530361 config->usb3_ports[i].tx_downscale_amp;
362 }
363 }
364
Maulik V Vaghela69353502021-04-14 14:01:02 +0530365 for (i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
366 if (config->tcss_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530367 s_cfg->CpuUsb3OverCurrentPin[i] = config->tcss_ports[i].ocpin;
Maulik V Vaghela69353502021-04-14 14:01:02 +0530368 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530369}
Maulik V Vaghela69353502021-04-14 14:01:02 +0530370
Subrata Banikb03cadf2021-06-09 22:19:04 +0530371static void fill_fsps_xdci_params(FSP_S_CONFIG *s_cfg,
372 const struct soc_intel_alderlake_config *config)
373{
Angel Ponsc7cfe0b2021-06-23 12:39:22 +0200374 s_cfg->XdciEnable = xdci_can_enable(PCH_DEVFN_USBOTG);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530375}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530376
Subrata Banikb03cadf2021-06-09 22:19:04 +0530377static void fill_fsps_uart_params(FSP_S_CONFIG *s_cfg,
378 const struct soc_intel_alderlake_config *config)
379{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530380 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530381 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
382 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
383 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530384}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530385
Subrata Banikb03cadf2021-06-09 22:19:04 +0530386static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
387 const struct soc_intel_alderlake_config *config)
388{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530389 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530390 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
391 if (s_cfg->SataEnable) {
392 s_cfg->SataMode = config->SataMode;
393 s_cfg->SataSalpSupport = config->SataSalpSupport;
394 memcpy(s_cfg->SataPortsEnable, config->SataPortsEnable,
395 sizeof(s_cfg->SataPortsEnable));
396 memcpy(s_cfg->SataPortsDevSlp, config->SataPortsDevSlp,
397 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530398 }
399
400 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530401 * Power Optimizer for SATA.
402 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530403 * Boards not needing the optimizers explicitly disables them by setting
404 * these disable variables to 1 in devicetree overrides.
405 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530406 s_cfg->SataPwrOptEnable = !(config->SataPwrOptimizeDisable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530407 /*
408 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
409 * SataPortsDmVal is the DITO multiplier. Default is 15.
410 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
411 * The default values can be changed from devicetree.
412 */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530413 for (size_t i = 0; i < ARRAY_SIZE(config->SataPortsEnableDitoConfig); i++) {
Subrata Banik2871e0e2020-09-27 11:30:58 +0530414 if (config->SataPortsEnableDitoConfig[i]) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530415 s_cfg->SataPortsDmVal[i] = config->SataPortsDmVal[i];
416 s_cfg->SataPortsDitoVal[i] = config->SataPortsDitoVal[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530417 }
418 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530419}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530420
Subrata Banikb03cadf2021-06-09 22:19:04 +0530421static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
422 const struct soc_intel_alderlake_config *config)
423{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530424 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530425 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530426
427 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530428 s_cfg->TccActivationOffset = config->tcc_offset;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530429}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530430
Subrata Banikb03cadf2021-06-09 22:19:04 +0530431static void fill_fsps_lan_params(FSP_S_CONFIG *s_cfg,
432 const struct soc_intel_alderlake_config *config)
433{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530434 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530435 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530436}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530437
Subrata Banikb03cadf2021-06-09 22:19:04 +0530438static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
439 const struct soc_intel_alderlake_config *config)
440{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530441 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530442 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
443 s_cfg->CnviBtCore = config->CnviBtCore;
444 s_cfg->CnviBtAudioOffload = config->CnviBtAudioOffload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800445 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530446 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800447 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530448 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530449}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530450
Subrata Banikb03cadf2021-06-09 22:19:04 +0530451static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
452 const struct soc_intel_alderlake_config *config)
453{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530454 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530455 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530456}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530457
Subrata Banikb03cadf2021-06-09 22:19:04 +0530458static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
459 const struct soc_intel_alderlake_config *config)
460{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530461 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530462 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
463 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530464}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530465
Subrata Banikb03cadf2021-06-09 22:19:04 +0530466static void fill_fsps_tbt_params(FSP_S_CONFIG *s_cfg,
467 const struct soc_intel_alderlake_config *config)
468{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700469 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530470 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530471 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530472}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700473
Subrata Banikb03cadf2021-06-09 22:19:04 +0530474static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
475 const struct soc_intel_alderlake_config *config)
476{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530477 /* Legacy 8254 timer support */
Subrata Banikc0983c92021-06-15 13:02:01 +0530478 s_cfg->Enable8254ClockGating = !CONFIG(USE_LEGACY_8254_TIMER);
479 s_cfg->Enable8254ClockGatingOnS3 = !CONFIG(USE_LEGACY_8254_TIMER);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530480}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530481
Subrata Banikb03cadf2021-06-09 22:19:04 +0530482static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
483 const struct soc_intel_alderlake_config *config)
484{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530485 /* Enable Hybrid storage auto detection */
Subrata Banikc0983c92021-06-15 13:02:01 +0530486 s_cfg->HybridStorageMode = config->HybridStorageMode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530487}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530488
Subrata Banikb03cadf2021-06-09 22:19:04 +0530489static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
490 const struct soc_intel_alderlake_config *config)
491{
492 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
493 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800494 if (!(enable_mask & BIT(i)))
495 continue;
496 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530497 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800498 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530499 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
500 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
501 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
502 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530503 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530504}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530505
Subrata Banikb03cadf2021-06-09 22:19:04 +0530506static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
507 const struct soc_intel_alderlake_config *config)
508{
509 /*
510 * Power Optimizer for DMI
511 * DmiPwrOptimizeDisable is default to 0.
512 * Boards not needing the optimizers explicitly disables them by setting
513 * these disable variables to 1 in devicetree overrides.
514 */
515 s_cfg->PchPwrOptEnable = !(config->DmiPwrOptimizeDisable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530516 s_cfg->PmSupport = 1;
517 s_cfg->Hwp = 1;
518 s_cfg->Cx = 1;
519 s_cfg->PsOnEnable = 1;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530520}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530521
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600522static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
523 const struct soc_intel_alderlake_config *config)
524{
525 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
526 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
527
528 size_t pch_count = 0;
529 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
530
531 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
532 s_cfg->NumOfDevIntConfig = pch_count;
533 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
534}
535
Subrata Banik6f1cb402021-06-09 22:11:12 +0530536static void arch_silicon_init_params(FSPS_ARCH_UPD *s_arch_cfg)
537{
538 /* EnableMultiPhaseSiliconInit for running MultiPhaseSiInit */
539 s_arch_cfg->EnableMultiPhaseSiliconInit = 1;
540}
541
Subrata Banikb03cadf2021-06-09 22:19:04 +0530542static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
543 struct soc_intel_alderlake_config *config)
544{
545 /* Override settings per board if required. */
546 mainboard_update_soc_chip_config(config);
547
V Sowmya6464c2a2021-06-25 10:20:25 +0530548 const void (*fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530549 const struct soc_intel_alderlake_config *config) = {
550 fill_fsps_lpss_params,
551 fill_fsps_cpu_params,
552 fill_fsps_igd_params,
553 fill_fsps_tcss_params,
554 fill_fsps_chipset_lockdown_params,
555 fill_fsps_xhci_params,
556 fill_fsps_xdci_params,
557 fill_fsps_uart_params,
558 fill_fsps_sata_params,
559 fill_fsps_thermal_params,
560 fill_fsps_lan_params,
561 fill_fsps_cnvi_params,
562 fill_fsps_vmd_params,
563 fill_fsps_thc_params,
564 fill_fsps_tbt_params,
565 fill_fsps_8254_params,
566 fill_fsps_storage_params,
567 fill_fsps_pcie_params,
568 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600569 fill_fsps_irq_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530570 };
571
572 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
573 fill_fsps_params[i](s_cfg, config);
574}
575
Subrata Banik6f1cb402021-06-09 22:11:12 +0530576/* UPD parameters to be initialized before SiliconInit */
577void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
578{
579 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530580 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530581 FSPS_ARCH_UPD *s_arch_cfg = &supd->FspsArchUpd;
582
583 config = config_of_soc();
Subrata Banik6f1cb402021-06-09 22:11:12 +0530584 arch_silicon_init_params(s_arch_cfg);
Subrata Banikc0983c92021-06-15 13:02:01 +0530585 soc_silicon_init_params(s_cfg, config);
586 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530587}
588
Subrata Banik2871e0e2020-09-27 11:30:58 +0530589/*
590 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
591 * This platform supports below MultiPhaseSIInit Phase(s):
592 * Phase | FSP return point | Purpose
593 * ------- + ------------------------------------------------ + -------------------------------
594 * 1 | After TCSS initialization completed | for TCSS specific init
595 */
596void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
597{
598 switch (phase_index) {
599 case 1:
600 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530601 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
602 __FILE__, __func__);
603
604 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
605 const config_t *config = config_of_soc();
606 tcss_configure(config->typec_aux_bias_pads);
607 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530608 break;
609 default:
610 break;
611 }
612}
613
614/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530615__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530616{
617 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
618}