blob: e29133e18853a3441ab049df83478869eb871acf [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;
Bernardo Perez Priego421ce562021-06-09 09:40:31 -0700307
308 s_cfg->UsbTcPortEn = 0;
309 for (int i = 0; i < MAX_TYPE_C_PORTS; i++) {
310 /* TCSS xHCI --> Root Hub --> Type-C Port */
311 const struct device_path port_path[] = {
312 {.type = DEVICE_PATH_PCI, .pci.devfn = SA_DEVFN_TCSS_XHCI},
313 {.type = DEVICE_PATH_USB, .usb.port_type = 0, .usb.port_id = 0},
314 {.type = DEVICE_PATH_USB, .usb.port_type = 3, .usb.port_id = i} };
315 const struct device *port = find_dev_nested_path(pci_root_bus(), port_path,
316 ARRAY_SIZE(port_path));
317
318 if (is_dev_enabled(port))
319 s_cfg->UsbTcPortEn |= BIT(i);
320 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530321}
322
323static void fill_fsps_chipset_lockdown_params(FSP_S_CONFIG *s_cfg,
324 const struct soc_intel_alderlake_config *config)
325{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530326 /* Chipset Lockdown */
327 if (get_lockdown_config() == CHIPSET_LOCKDOWN_COREBOOT) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530328 s_cfg->PchLockDownGlobalSmi = 0;
329 s_cfg->PchLockDownBiosInterface = 0;
330 s_cfg->PchUnlockGpioPads = 1;
331 s_cfg->RtcMemoryLock = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530332 } else {
Subrata Banikc0983c92021-06-15 13:02:01 +0530333 s_cfg->PchLockDownGlobalSmi = 1;
334 s_cfg->PchLockDownBiosInterface = 1;
335 s_cfg->PchUnlockGpioPads = 0;
336 s_cfg->RtcMemoryLock = 1;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530337 }
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -0600338
339 /* coreboot will send EOP before loading payload */
340 s_cfg->EndOfPostMessage = EOP_DISABLE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530341}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530342
Subrata Banikb03cadf2021-06-09 22:19:04 +0530343static void fill_fsps_xhci_params(FSP_S_CONFIG *s_cfg,
344 const struct soc_intel_alderlake_config *config)
345{
346 int i;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530347 /* USB */
348 for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530349 s_cfg->PortUsb20Enable[i] = config->usb2_ports[i].enable;
350 s_cfg->Usb2PhyPetxiset[i] = config->usb2_ports[i].pre_emp_bias;
351 s_cfg->Usb2PhyTxiset[i] = config->usb2_ports[i].tx_bias;
352 s_cfg->Usb2PhyPredeemp[i] = config->usb2_ports[i].tx_emp_enable;
353 s_cfg->Usb2PhyPehalfbit[i] = config->usb2_ports[i].pre_emp_bit;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530354
355 if (config->usb2_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530356 s_cfg->Usb2OverCurrentPin[i] = config->usb2_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530357 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530358 s_cfg->Usb2OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530359 }
360
361 for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530362 s_cfg->PortUsb30Enable[i] = config->usb3_ports[i].enable;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530363 if (config->usb3_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530364 s_cfg->Usb3OverCurrentPin[i] = config->usb3_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530365 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530366 s_cfg->Usb3OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530367
368 if (config->usb3_ports[i].tx_de_emp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530369 s_cfg->Usb3HsioTxDeEmphEnable[i] = 1;
370 s_cfg->Usb3HsioTxDeEmph[i] = config->usb3_ports[i].tx_de_emp;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530371 }
372 if (config->usb3_ports[i].tx_downscale_amp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530373 s_cfg->Usb3HsioTxDownscaleAmpEnable[i] = 1;
374 s_cfg->Usb3HsioTxDownscaleAmp[i] =
Subrata Banik2871e0e2020-09-27 11:30:58 +0530375 config->usb3_ports[i].tx_downscale_amp;
376 }
377 }
378
Maulik V Vaghela69353502021-04-14 14:01:02 +0530379 for (i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
380 if (config->tcss_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530381 s_cfg->CpuUsb3OverCurrentPin[i] = config->tcss_ports[i].ocpin;
Maulik V Vaghela69353502021-04-14 14:01:02 +0530382 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530383}
Maulik V Vaghela69353502021-04-14 14:01:02 +0530384
Subrata Banikb03cadf2021-06-09 22:19:04 +0530385static void fill_fsps_xdci_params(FSP_S_CONFIG *s_cfg,
386 const struct soc_intel_alderlake_config *config)
387{
Angel Ponsc7cfe0b2021-06-23 12:39:22 +0200388 s_cfg->XdciEnable = xdci_can_enable(PCH_DEVFN_USBOTG);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530389}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530390
Subrata Banikb03cadf2021-06-09 22:19:04 +0530391static void fill_fsps_uart_params(FSP_S_CONFIG *s_cfg,
392 const struct soc_intel_alderlake_config *config)
393{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530394 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530395 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
396 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
397 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530398}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530399
Subrata Banikb03cadf2021-06-09 22:19:04 +0530400static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
401 const struct soc_intel_alderlake_config *config)
402{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530403 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530404 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
405 if (s_cfg->SataEnable) {
406 s_cfg->SataMode = config->SataMode;
407 s_cfg->SataSalpSupport = config->SataSalpSupport;
408 memcpy(s_cfg->SataPortsEnable, config->SataPortsEnable,
409 sizeof(s_cfg->SataPortsEnable));
410 memcpy(s_cfg->SataPortsDevSlp, config->SataPortsDevSlp,
411 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530412 }
413
414 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530415 * Power Optimizer for SATA.
416 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530417 * Boards not needing the optimizers explicitly disables them by setting
418 * these disable variables to 1 in devicetree overrides.
419 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530420 s_cfg->SataPwrOptEnable = !(config->SataPwrOptimizeDisable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530421 /*
422 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
423 * SataPortsDmVal is the DITO multiplier. Default is 15.
424 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
425 * The default values can be changed from devicetree.
426 */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530427 for (size_t i = 0; i < ARRAY_SIZE(config->SataPortsEnableDitoConfig); i++) {
Subrata Banik2871e0e2020-09-27 11:30:58 +0530428 if (config->SataPortsEnableDitoConfig[i]) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530429 s_cfg->SataPortsDmVal[i] = config->SataPortsDmVal[i];
430 s_cfg->SataPortsDitoVal[i] = config->SataPortsDitoVal[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530431 }
432 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530433}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530434
Subrata Banikb03cadf2021-06-09 22:19:04 +0530435static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
436 const struct soc_intel_alderlake_config *config)
437{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530438 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530439 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530440
441 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530442 s_cfg->TccActivationOffset = config->tcc_offset;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530443}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530444
Subrata Banikb03cadf2021-06-09 22:19:04 +0530445static void fill_fsps_lan_params(FSP_S_CONFIG *s_cfg,
446 const struct soc_intel_alderlake_config *config)
447{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530448 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530449 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530450}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530451
Subrata Banikb03cadf2021-06-09 22:19:04 +0530452static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
453 const struct soc_intel_alderlake_config *config)
454{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530455 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530456 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
457 s_cfg->CnviBtCore = config->CnviBtCore;
458 s_cfg->CnviBtAudioOffload = config->CnviBtAudioOffload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800459 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530460 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800461 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530462 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530463}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530464
Subrata Banikb03cadf2021-06-09 22:19:04 +0530465static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
466 const struct soc_intel_alderlake_config *config)
467{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530468 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530469 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530470}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530471
Subrata Banikb03cadf2021-06-09 22:19:04 +0530472static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
473 const struct soc_intel_alderlake_config *config)
474{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530475 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530476 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
477 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530478}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530479
Subrata Banikb03cadf2021-06-09 22:19:04 +0530480static void fill_fsps_tbt_params(FSP_S_CONFIG *s_cfg,
481 const struct soc_intel_alderlake_config *config)
482{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700483 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530484 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530485 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530486}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700487
Subrata Banikb03cadf2021-06-09 22:19:04 +0530488static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
489 const struct soc_intel_alderlake_config *config)
490{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530491 /* Legacy 8254 timer support */
Subrata Banikc0983c92021-06-15 13:02:01 +0530492 s_cfg->Enable8254ClockGating = !CONFIG(USE_LEGACY_8254_TIMER);
493 s_cfg->Enable8254ClockGatingOnS3 = !CONFIG(USE_LEGACY_8254_TIMER);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530494}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530495
Subrata Banikb03cadf2021-06-09 22:19:04 +0530496static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
497 const struct soc_intel_alderlake_config *config)
498{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530499 /* Enable Hybrid storage auto detection */
Subrata Banikc0983c92021-06-15 13:02:01 +0530500 s_cfg->HybridStorageMode = config->HybridStorageMode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530501}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530502
Subrata Banikb03cadf2021-06-09 22:19:04 +0530503static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
504 const struct soc_intel_alderlake_config *config)
505{
506 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
507 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800508 if (!(enable_mask & BIT(i)))
509 continue;
510 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530511 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800512 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530513 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
514 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
515 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
516 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530517 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530518}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530519
Subrata Banikb03cadf2021-06-09 22:19:04 +0530520static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
521 const struct soc_intel_alderlake_config *config)
522{
523 /*
524 * Power Optimizer for DMI
525 * DmiPwrOptimizeDisable is default to 0.
526 * Boards not needing the optimizers explicitly disables them by setting
527 * these disable variables to 1 in devicetree overrides.
528 */
529 s_cfg->PchPwrOptEnable = !(config->DmiPwrOptimizeDisable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530530 s_cfg->PmSupport = 1;
531 s_cfg->Hwp = 1;
532 s_cfg->Cx = 1;
533 s_cfg->PsOnEnable = 1;
V Sowmya844dcb32021-06-21 10:03:53 +0530534 /* Enable the energy efficient turbo mode */
535 s_cfg->EnergyEfficientTurbo = 1;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530536}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530537
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600538static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
539 const struct soc_intel_alderlake_config *config)
540{
541 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
542 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
543
544 size_t pch_count = 0;
545 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
546
547 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
548 s_cfg->NumOfDevIntConfig = pch_count;
549 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
550}
551
Subrata Banik6f1cb402021-06-09 22:11:12 +0530552static void arch_silicon_init_params(FSPS_ARCH_UPD *s_arch_cfg)
553{
554 /* EnableMultiPhaseSiliconInit for running MultiPhaseSiInit */
555 s_arch_cfg->EnableMultiPhaseSiliconInit = 1;
556}
557
Subrata Banikb03cadf2021-06-09 22:19:04 +0530558static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
559 struct soc_intel_alderlake_config *config)
560{
561 /* Override settings per board if required. */
562 mainboard_update_soc_chip_config(config);
563
V Sowmya6464c2a2021-06-25 10:20:25 +0530564 const void (*fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530565 const struct soc_intel_alderlake_config *config) = {
566 fill_fsps_lpss_params,
567 fill_fsps_cpu_params,
568 fill_fsps_igd_params,
569 fill_fsps_tcss_params,
570 fill_fsps_chipset_lockdown_params,
571 fill_fsps_xhci_params,
572 fill_fsps_xdci_params,
573 fill_fsps_uart_params,
574 fill_fsps_sata_params,
575 fill_fsps_thermal_params,
576 fill_fsps_lan_params,
577 fill_fsps_cnvi_params,
578 fill_fsps_vmd_params,
579 fill_fsps_thc_params,
580 fill_fsps_tbt_params,
581 fill_fsps_8254_params,
582 fill_fsps_storage_params,
583 fill_fsps_pcie_params,
584 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600585 fill_fsps_irq_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530586 };
587
588 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
589 fill_fsps_params[i](s_cfg, config);
590}
591
Subrata Banik6f1cb402021-06-09 22:11:12 +0530592/* UPD parameters to be initialized before SiliconInit */
593void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
594{
595 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530596 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530597 FSPS_ARCH_UPD *s_arch_cfg = &supd->FspsArchUpd;
598
599 config = config_of_soc();
Subrata Banik6f1cb402021-06-09 22:11:12 +0530600 arch_silicon_init_params(s_arch_cfg);
Subrata Banikc0983c92021-06-15 13:02:01 +0530601 soc_silicon_init_params(s_cfg, config);
602 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530603}
604
Subrata Banik2871e0e2020-09-27 11:30:58 +0530605/*
606 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
607 * This platform supports below MultiPhaseSIInit Phase(s):
608 * Phase | FSP return point | Purpose
609 * ------- + ------------------------------------------------ + -------------------------------
610 * 1 | After TCSS initialization completed | for TCSS specific init
611 */
612void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
613{
614 switch (phase_index) {
615 case 1:
616 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530617 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
618 __FILE__, __func__);
619
620 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
621 const config_t *config = config_of_soc();
622 tcss_configure(config->typec_aux_bias_pads);
623 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530624 break;
625 default:
626 break;
627 }
628}
629
630/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530631__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530632{
633 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
634}