blob: c814d8c3ee3b65359fc4e33cacf2be6e62ffa8f0 [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{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530374 /* Enable xDCI controller if enabled in devicetree and allowed */
Subrata Banike6338042021-06-21 19:26:10 +0530375 if (!xdci_can_enable())
376 devfn_disable(pci_root_bus(), PCH_DEVFN_USBOTG);
Subrata Banikc0983c92021-06-15 13:02:01 +0530377 s_cfg->XdciEnable = is_devfn_enabled(PCH_DEVFN_USBOTG);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530378}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530379
Subrata Banikb03cadf2021-06-09 22:19:04 +0530380static void fill_fsps_uart_params(FSP_S_CONFIG *s_cfg,
381 const struct soc_intel_alderlake_config *config)
382{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530383 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530384 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
385 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
386 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530387}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530388
Subrata Banikb03cadf2021-06-09 22:19:04 +0530389static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
390 const struct soc_intel_alderlake_config *config)
391{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530392 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530393 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
394 if (s_cfg->SataEnable) {
395 s_cfg->SataMode = config->SataMode;
396 s_cfg->SataSalpSupport = config->SataSalpSupport;
397 memcpy(s_cfg->SataPortsEnable, config->SataPortsEnable,
398 sizeof(s_cfg->SataPortsEnable));
399 memcpy(s_cfg->SataPortsDevSlp, config->SataPortsDevSlp,
400 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530401 }
402
403 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530404 * Power Optimizer for SATA.
405 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530406 * Boards not needing the optimizers explicitly disables them by setting
407 * these disable variables to 1 in devicetree overrides.
408 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530409 s_cfg->SataPwrOptEnable = !(config->SataPwrOptimizeDisable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530410 /*
411 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
412 * SataPortsDmVal is the DITO multiplier. Default is 15.
413 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
414 * The default values can be changed from devicetree.
415 */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530416 for (size_t i = 0; i < ARRAY_SIZE(config->SataPortsEnableDitoConfig); i++) {
Subrata Banik2871e0e2020-09-27 11:30:58 +0530417 if (config->SataPortsEnableDitoConfig[i]) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530418 s_cfg->SataPortsDmVal[i] = config->SataPortsDmVal[i];
419 s_cfg->SataPortsDitoVal[i] = config->SataPortsDitoVal[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530420 }
421 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530422}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530423
Subrata Banikb03cadf2021-06-09 22:19:04 +0530424static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
425 const struct soc_intel_alderlake_config *config)
426{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530427 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530428 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530429
430 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530431 s_cfg->TccActivationOffset = config->tcc_offset;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530432}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530433
Subrata Banikb03cadf2021-06-09 22:19:04 +0530434static void fill_fsps_lan_params(FSP_S_CONFIG *s_cfg,
435 const struct soc_intel_alderlake_config *config)
436{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530437 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530438 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530439}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530440
Subrata Banikb03cadf2021-06-09 22:19:04 +0530441static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
442 const struct soc_intel_alderlake_config *config)
443{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530444 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530445 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
446 s_cfg->CnviBtCore = config->CnviBtCore;
447 s_cfg->CnviBtAudioOffload = config->CnviBtAudioOffload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800448 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530449 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800450 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530451 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530452}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530453
Subrata Banikb03cadf2021-06-09 22:19:04 +0530454static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
455 const struct soc_intel_alderlake_config *config)
456{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530457 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530458 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530459}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530460
Subrata Banikb03cadf2021-06-09 22:19:04 +0530461static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
462 const struct soc_intel_alderlake_config *config)
463{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530464 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530465 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
466 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530467}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530468
Subrata Banikb03cadf2021-06-09 22:19:04 +0530469static void fill_fsps_tbt_params(FSP_S_CONFIG *s_cfg,
470 const struct soc_intel_alderlake_config *config)
471{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700472 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530473 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530474 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530475}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700476
Subrata Banikb03cadf2021-06-09 22:19:04 +0530477static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
478 const struct soc_intel_alderlake_config *config)
479{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530480 /* Legacy 8254 timer support */
Subrata Banikc0983c92021-06-15 13:02:01 +0530481 s_cfg->Enable8254ClockGating = !CONFIG(USE_LEGACY_8254_TIMER);
482 s_cfg->Enable8254ClockGatingOnS3 = !CONFIG(USE_LEGACY_8254_TIMER);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530483}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530484
Subrata Banikb03cadf2021-06-09 22:19:04 +0530485static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
486 const struct soc_intel_alderlake_config *config)
487{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530488 /* Enable Hybrid storage auto detection */
Subrata Banikc0983c92021-06-15 13:02:01 +0530489 s_cfg->HybridStorageMode = config->HybridStorageMode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530490}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530491
Subrata Banikb03cadf2021-06-09 22:19:04 +0530492static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
493 const struct soc_intel_alderlake_config *config)
494{
495 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
496 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800497 if (!(enable_mask & BIT(i)))
498 continue;
499 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530500 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800501 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530502 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
503 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
504 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
505 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530506 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530507}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530508
Subrata Banikb03cadf2021-06-09 22:19:04 +0530509static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
510 const struct soc_intel_alderlake_config *config)
511{
512 /*
513 * Power Optimizer for DMI
514 * DmiPwrOptimizeDisable is default to 0.
515 * Boards not needing the optimizers explicitly disables them by setting
516 * these disable variables to 1 in devicetree overrides.
517 */
518 s_cfg->PchPwrOptEnable = !(config->DmiPwrOptimizeDisable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530519 s_cfg->PmSupport = 1;
520 s_cfg->Hwp = 1;
521 s_cfg->Cx = 1;
522 s_cfg->PsOnEnable = 1;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530523}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530524
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600525static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
526 const struct soc_intel_alderlake_config *config)
527{
528 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
529 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
530
531 size_t pch_count = 0;
532 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
533
534 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
535 s_cfg->NumOfDevIntConfig = pch_count;
536 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
537}
538
Subrata Banik6f1cb402021-06-09 22:11:12 +0530539static void arch_silicon_init_params(FSPS_ARCH_UPD *s_arch_cfg)
540{
541 /* EnableMultiPhaseSiliconInit for running MultiPhaseSiInit */
542 s_arch_cfg->EnableMultiPhaseSiliconInit = 1;
543}
544
Subrata Banikb03cadf2021-06-09 22:19:04 +0530545static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
546 struct soc_intel_alderlake_config *config)
547{
548 /* Override settings per board if required. */
549 mainboard_update_soc_chip_config(config);
550
V Sowmya6464c2a2021-06-25 10:20:25 +0530551 const void (*fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530552 const struct soc_intel_alderlake_config *config) = {
553 fill_fsps_lpss_params,
554 fill_fsps_cpu_params,
555 fill_fsps_igd_params,
556 fill_fsps_tcss_params,
557 fill_fsps_chipset_lockdown_params,
558 fill_fsps_xhci_params,
559 fill_fsps_xdci_params,
560 fill_fsps_uart_params,
561 fill_fsps_sata_params,
562 fill_fsps_thermal_params,
563 fill_fsps_lan_params,
564 fill_fsps_cnvi_params,
565 fill_fsps_vmd_params,
566 fill_fsps_thc_params,
567 fill_fsps_tbt_params,
568 fill_fsps_8254_params,
569 fill_fsps_storage_params,
570 fill_fsps_pcie_params,
571 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600572 fill_fsps_irq_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530573 };
574
575 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
576 fill_fsps_params[i](s_cfg, config);
577}
578
Subrata Banik6f1cb402021-06-09 22:11:12 +0530579/* UPD parameters to be initialized before SiliconInit */
580void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
581{
582 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530583 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530584 FSPS_ARCH_UPD *s_arch_cfg = &supd->FspsArchUpd;
585
586 config = config_of_soc();
Subrata Banik6f1cb402021-06-09 22:11:12 +0530587 arch_silicon_init_params(s_arch_cfg);
Subrata Banikc0983c92021-06-15 13:02:01 +0530588 soc_silicon_init_params(s_cfg, config);
589 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530590}
591
Subrata Banik2871e0e2020-09-27 11:30:58 +0530592/*
593 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
594 * This platform supports below MultiPhaseSIInit Phase(s):
595 * Phase | FSP return point | Purpose
596 * ------- + ------------------------------------------------ + -------------------------------
597 * 1 | After TCSS initialization completed | for TCSS specific init
598 */
599void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
600{
601 switch (phase_index) {
602 case 1:
603 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530604 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
605 __FILE__, __func__);
606
607 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
608 const config_t *config = config_of_soc();
609 tcss_configure(config->typec_aux_bias_pads);
610 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530611 break;
612 default:
613 break;
614 }
615}
616
617/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530618__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530619{
620 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
621}