blob: 612bc4ed31955f76b33a42e7256af07f94774c7f [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 Wawrzynczak43607e42021-05-18 09:04:42 -060035static const struct slot_irq_constraints irq_constraints[] = {
36 {
37 .slot = SA_DEV_SLOT_IGD,
38 .fns = {
39 ANY_PIRQ(SA_DEVFN_IGD),
40 },
41 },
42 {
43 .slot = SA_DEV_SLOT_DPTF,
44 .fns = {
45 ANY_PIRQ(SA_DEVFN_DPTF),
46 },
47 },
48 {
49 .slot = SA_DEV_SLOT_IPU,
50 .fns = {
51 ANY_PIRQ(SA_DEVFN_IPU),
52 },
53 },
54 {
55 .slot = SA_DEV_SLOT_CPU_6,
56 .fns = {
57 ANY_PIRQ(SA_DEVFN_CPU_PCIE6_0),
58 ANY_PIRQ(SA_DEVFN_CPU_PCIE6_2),
59 },
60 },
61 {
62 .slot = SA_DEV_SLOT_TBT,
63 .fns = {
64 ANY_PIRQ(SA_DEVFN_TBT0),
65 ANY_PIRQ(SA_DEVFN_TBT1),
66 ANY_PIRQ(SA_DEVFN_TBT2),
67 ANY_PIRQ(SA_DEVFN_TBT3),
68 },
69 },
70 {
71 .slot = SA_DEV_SLOT_TCSS,
72 .fns = {
73 ANY_PIRQ(SA_DEVFN_TCSS_XHCI),
74 },
75 },
76 {
77 .slot = PCH_DEV_SLOT_ISH,
78 .fns = {
79 DIRECT_IRQ(PCH_DEVFN_ISH),
80 DIRECT_IRQ(PCH_DEVFN_GSPI2),
81 },
82 },
83 {
84 .slot = PCH_DEV_SLOT_XHCI,
85 .fns = {
86 ANY_PIRQ(PCH_DEVFN_XHCI),
87 ANY_PIRQ(PCH_DEVFN_CNVI_WIFI),
88 },
89 },
90 {
91 .slot = PCH_DEV_SLOT_SIO3,
92 .fns = {
93 DIRECT_IRQ(PCH_DEVFN_I2C0),
94 DIRECT_IRQ(PCH_DEVFN_I2C1),
95 DIRECT_IRQ(PCH_DEVFN_I2C2),
96 DIRECT_IRQ(PCH_DEVFN_I2C3),
97 },
98 },
99 {
100 .slot = PCH_DEV_SLOT_CSE,
101 .fns = {
102 ANY_PIRQ(PCH_DEVFN_CSE),
103 ANY_PIRQ(PCH_DEVFN_CSE_2),
104 ANY_PIRQ(PCH_DEVFN_CSE_IDER),
105 ANY_PIRQ(PCH_DEVFN_CSE_KT),
106 ANY_PIRQ(PCH_DEVFN_CSE_3),
107 ANY_PIRQ(PCH_DEVFN_CSE_4),
108 },
109 },
110 {
111 .slot = PCH_DEV_SLOT_SATA,
112 .fns = {
113 ANY_PIRQ(PCH_DEVFN_SATA),
114 },
115 },
116 {
117 .slot = PCH_DEV_SLOT_SIO4,
118 .fns = {
119 DIRECT_IRQ(PCH_DEVFN_I2C4),
120 DIRECT_IRQ(PCH_DEVFN_I2C5),
121 DIRECT_IRQ(PCH_DEVFN_UART2),
122 },
123 },
124 {
125 .slot = PCH_DEV_SLOT_PCIE,
126 .fns = {
127 FIXED_INT_PIRQ(PCH_DEVFN_PCIE1, PCI_INT_A, PIRQ_A),
128 FIXED_INT_PIRQ(PCH_DEVFN_PCIE2, PCI_INT_B, PIRQ_B),
129 FIXED_INT_PIRQ(PCH_DEVFN_PCIE3, PCI_INT_C, PIRQ_C),
130 FIXED_INT_PIRQ(PCH_DEVFN_PCIE4, PCI_INT_D, PIRQ_D),
131 FIXED_INT_PIRQ(PCH_DEVFN_PCIE5, PCI_INT_A, PIRQ_A),
132 FIXED_INT_PIRQ(PCH_DEVFN_PCIE6, PCI_INT_B, PIRQ_B),
133 FIXED_INT_PIRQ(PCH_DEVFN_PCIE7, PCI_INT_C, PIRQ_C),
134 FIXED_INT_PIRQ(PCH_DEVFN_PCIE8, PCI_INT_D, PIRQ_D),
135 },
136 },
137 {
138 .slot = PCH_DEV_SLOT_PCIE_1,
139 .fns = {
140 FIXED_INT_PIRQ(PCH_DEVFN_PCIE9, PCI_INT_A, PIRQ_A),
141 FIXED_INT_PIRQ(PCH_DEVFN_PCIE10, PCI_INT_B, PIRQ_B),
142 FIXED_INT_PIRQ(PCH_DEVFN_PCIE11, PCI_INT_C, PIRQ_C),
143 FIXED_INT_PIRQ(PCH_DEVFN_PCIE12, PCI_INT_D, PIRQ_D),
144 },
145 },
146 {
147 .slot = PCH_DEV_SLOT_SIO5,
148 .fns = {
149 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART0, PCI_INT_A),
150 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART1, PCI_INT_B),
151 ANY_PIRQ(PCH_DEVFN_GSPI0),
152 ANY_PIRQ(PCH_DEVFN_GSPI1),
153 },
154 },
155 {
156 .slot = PCH_DEV_SLOT_ESPI,
157 .fns = {
158 ANY_PIRQ(PCH_DEVFN_HDA),
159 ANY_PIRQ(PCH_DEVFN_SMBUS),
160 ANY_PIRQ(PCH_DEVFN_GBE),
161 FIXED_INT_ANY_PIRQ(PCH_DEVFN_TRACEHUB, PCI_INT_A),
162 },
163 },
164};
165
166static const SI_PCH_DEVICE_INTERRUPT_CONFIG *pci_irq_to_fsp(size_t *out_count)
167{
168 const struct pci_irq_entry *entry = get_cached_pci_irqs();
169 SI_PCH_DEVICE_INTERRUPT_CONFIG *config;
170 size_t pch_total = 0;
171 size_t cfg_count = 0;
172
173 if (!entry)
174 return NULL;
175
176 /* Count PCH devices */
177 while (entry) {
178 if (PCI_SLOT(entry->devfn) >= MIN_PCH_SLOT)
179 ++pch_total;
180 entry = entry->next;
181 }
182
183 /* Convert PCH device entries to FSP format */
184 config = calloc(pch_total, sizeof(*config));
185 entry = get_cached_pci_irqs();
186 while (entry) {
187 if (PCI_SLOT(entry->devfn) < MIN_PCH_SLOT) {
188 entry = entry->next;
189 continue;
190 }
191
192 config[cfg_count].Device = PCI_SLOT(entry->devfn);
193 config[cfg_count].Function = PCI_FUNC(entry->devfn);
194 config[cfg_count].IntX = (SI_PCH_INT_PIN)entry->pin;
195 config[cfg_count].Irq = entry->irq;
196 ++cfg_count;
197
198 entry = entry->next;
199 }
200
201 *out_count = cfg_count;
202
203 return config;
204}
205
Subrata Banik2871e0e2020-09-27 11:30:58 +0530206/*
207 * Chip config parameter PcieRpL1Substates uses (UPD value + 1)
208 * because UPD value of 0 for PcieRpL1Substates means disabled for FSP.
209 * In order to ensure that mainboard setting does not disable L1 substates
210 * incorrectly, chip config parameter values are offset by 1 with 0 meaning
211 * use FSP UPD default. get_l1_substate_control() ensures that the right UPD
212 * value is set in fsp_params.
213 * 0: Use FSP UPD default
214 * 1: Disable L1 substates
215 * 2: Use L1.1
216 * 3: Use L1.2 (FSP UPD default)
217 */
218static int get_l1_substate_control(enum L1_substates_control ctl)
219{
220 if ((ctl > L1_SS_L1_2) || (ctl == L1_SS_FSP_DEFAULT))
221 ctl = L1_SS_L1_2;
222 return ctl - 1;
223}
224
Subrata Banikb03cadf2021-06-09 22:19:04 +0530225__weak void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530226{
Subrata Banikb03cadf2021-06-09 22:19:04 +0530227 /* Override settings per board. */
228}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530229
Subrata Banikb03cadf2021-06-09 22:19:04 +0530230static void fill_fsps_lpss_params(FSP_S_CONFIG *s_cfg,
231 const struct soc_intel_alderlake_config *config)
232{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530233 for (int i = 0; i < CONFIG_SOC_INTEL_I2C_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530234 s_cfg->SerialIoI2cMode[i] = config->SerialIoI2cMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530235
236 for (int i = 0; i < CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX; i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530237 s_cfg->SerialIoSpiMode[i] = config->SerialIoGSpiMode[i];
238 s_cfg->SerialIoSpiCsMode[i] = config->SerialIoGSpiCsMode[i];
239 s_cfg->SerialIoSpiCsState[i] = config->SerialIoGSpiCsState[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530240 }
241
242 for (int i = 0; i < CONFIG_SOC_INTEL_UART_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530243 s_cfg->SerialIoUartMode[i] = config->SerialIoUartMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530244}
245
Subrata Banikb03cadf2021-06-09 22:19:04 +0530246static void fill_fsps_cpu_params(FSP_S_CONFIG *s_cfg,
247 const struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530248{
Subrata Banik99289a82020-12-22 10:54:44 +0530249 const struct microcode *microcode_file;
250 size_t microcode_len;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530251
Subrata Banikb03cadf2021-06-09 22:19:04 +0530252 /* Locate microcode and pass to FSP-S for 2nd microcode loading */
Subrata Banik99289a82020-12-22 10:54:44 +0530253 microcode_file = cbfs_map("cpu_microcode_blob.bin", &microcode_len);
254
255 if ((microcode_file != NULL) && (microcode_len != 0)) {
256 /* Update CPU Microcode patch base address/size */
Subrata Banikc0983c92021-06-15 13:02:01 +0530257 s_cfg->MicrocodeRegionBase = (uint32_t)microcode_file;
258 s_cfg->MicrocodeRegionSize = (uint32_t)microcode_len;
Subrata Banik99289a82020-12-22 10:54:44 +0530259 }
260
Subrata Banikb03cadf2021-06-09 22:19:04 +0530261 /* Use coreboot MP PPI services if Kconfig is enabled */
262 if (CONFIG(USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI))
263 s_cfg->CpuMpPpi = (uintptr_t) mp_fill_ppi_services_data();
264}
265
266static void fill_fsps_igd_params(FSP_S_CONFIG *s_cfg,
267 const struct soc_intel_alderlake_config *config)
268{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530269 /* Load VBT before devicetree-specific config. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530270 s_cfg->GraphicsConfigPtr = (uintptr_t)vbt_get();
Subrata Banik2871e0e2020-09-27 11:30:58 +0530271
272 /* Check if IGD is present and fill Graphics init param accordingly */
Subrata Banikc0983c92021-06-15 13:02:01 +0530273 s_cfg->PeiGraphicsPeimInit = CONFIG(RUN_FSP_GOP) && is_devfn_enabled(SA_DEVFN_IGD);
274 s_cfg->LidStatus = CONFIG(RUN_FSP_GOP);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530275}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530276
Subrata Banikb03cadf2021-06-09 22:19:04 +0530277static void fill_fsps_tcss_params(FSP_S_CONFIG *s_cfg,
278 const struct soc_intel_alderlake_config *config)
279{
Subrata Banikc0983c92021-06-15 13:02:01 +0530280 s_cfg->TcssAuxOri = config->TcssAuxOri;
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530281
282 /* Explicitly clear this field to avoid using defaults */
Subrata Banikc0983c92021-06-15 13:02:01 +0530283 memset(s_cfg->IomTypeCPortPadCfg, 0, sizeof(s_cfg->IomTypeCPortPadCfg));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530284
285 /*
286 * Set FSPS UPD ITbtConnectTopologyTimeoutInMs with value 0. FSP will
287 * evaluate this UPD value and skip sending command. There will be no
288 * delay for command completion.
289 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530290 s_cfg->ITbtConnectTopologyTimeoutInMs = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530291
Subrata Banikb03cadf2021-06-09 22:19:04 +0530292 /* D3Hot and D3Cold for TCSS */
293 s_cfg->D3HotEnable = !config->TcssD3HotDisable;
294 s_cfg->D3ColdEnable = !config->TcssD3ColdDisable;
295}
296
297static void fill_fsps_chipset_lockdown_params(FSP_S_CONFIG *s_cfg,
298 const struct soc_intel_alderlake_config *config)
299{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530300 /* Chipset Lockdown */
301 if (get_lockdown_config() == CHIPSET_LOCKDOWN_COREBOOT) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530302 s_cfg->PchLockDownGlobalSmi = 0;
303 s_cfg->PchLockDownBiosInterface = 0;
304 s_cfg->PchUnlockGpioPads = 1;
305 s_cfg->RtcMemoryLock = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530306 } else {
Subrata Banikc0983c92021-06-15 13:02:01 +0530307 s_cfg->PchLockDownGlobalSmi = 1;
308 s_cfg->PchLockDownBiosInterface = 1;
309 s_cfg->PchUnlockGpioPads = 0;
310 s_cfg->RtcMemoryLock = 1;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530311 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530312}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530313
Subrata Banikb03cadf2021-06-09 22:19:04 +0530314static void fill_fsps_xhci_params(FSP_S_CONFIG *s_cfg,
315 const struct soc_intel_alderlake_config *config)
316{
317 int i;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530318 /* USB */
319 for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530320 s_cfg->PortUsb20Enable[i] = config->usb2_ports[i].enable;
321 s_cfg->Usb2PhyPetxiset[i] = config->usb2_ports[i].pre_emp_bias;
322 s_cfg->Usb2PhyTxiset[i] = config->usb2_ports[i].tx_bias;
323 s_cfg->Usb2PhyPredeemp[i] = config->usb2_ports[i].tx_emp_enable;
324 s_cfg->Usb2PhyPehalfbit[i] = config->usb2_ports[i].pre_emp_bit;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530325
326 if (config->usb2_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530327 s_cfg->Usb2OverCurrentPin[i] = config->usb2_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530328 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530329 s_cfg->Usb2OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530330 }
331
332 for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530333 s_cfg->PortUsb30Enable[i] = config->usb3_ports[i].enable;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530334 if (config->usb3_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530335 s_cfg->Usb3OverCurrentPin[i] = config->usb3_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530336 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530337 s_cfg->Usb3OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530338
339 if (config->usb3_ports[i].tx_de_emp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530340 s_cfg->Usb3HsioTxDeEmphEnable[i] = 1;
341 s_cfg->Usb3HsioTxDeEmph[i] = config->usb3_ports[i].tx_de_emp;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530342 }
343 if (config->usb3_ports[i].tx_downscale_amp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530344 s_cfg->Usb3HsioTxDownscaleAmpEnable[i] = 1;
345 s_cfg->Usb3HsioTxDownscaleAmp[i] =
Subrata Banik2871e0e2020-09-27 11:30:58 +0530346 config->usb3_ports[i].tx_downscale_amp;
347 }
348 }
349
Maulik V Vaghela69353502021-04-14 14:01:02 +0530350 for (i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
351 if (config->tcss_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530352 s_cfg->CpuUsb3OverCurrentPin[i] = config->tcss_ports[i].ocpin;
Maulik V Vaghela69353502021-04-14 14:01:02 +0530353 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530354}
Maulik V Vaghela69353502021-04-14 14:01:02 +0530355
Subrata Banikb03cadf2021-06-09 22:19:04 +0530356static void fill_fsps_xdci_params(FSP_S_CONFIG *s_cfg,
357 const struct soc_intel_alderlake_config *config)
358{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530359 /* Enable xDCI controller if enabled in devicetree and allowed */
Subrata Banike6338042021-06-21 19:26:10 +0530360 if (!xdci_can_enable())
361 devfn_disable(pci_root_bus(), PCH_DEVFN_USBOTG);
Subrata Banikc0983c92021-06-15 13:02:01 +0530362 s_cfg->XdciEnable = is_devfn_enabled(PCH_DEVFN_USBOTG);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530363}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530364
Subrata Banikb03cadf2021-06-09 22:19:04 +0530365static void fill_fsps_uart_params(FSP_S_CONFIG *s_cfg,
366 const struct soc_intel_alderlake_config *config)
367{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530368 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530369 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
370 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
371 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530372}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530373
Subrata Banikb03cadf2021-06-09 22:19:04 +0530374static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
375 const struct soc_intel_alderlake_config *config)
376{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530377 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530378 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
379 if (s_cfg->SataEnable) {
380 s_cfg->SataMode = config->SataMode;
381 s_cfg->SataSalpSupport = config->SataSalpSupport;
382 memcpy(s_cfg->SataPortsEnable, config->SataPortsEnable,
383 sizeof(s_cfg->SataPortsEnable));
384 memcpy(s_cfg->SataPortsDevSlp, config->SataPortsDevSlp,
385 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530386 }
387
388 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530389 * Power Optimizer for SATA.
390 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530391 * Boards not needing the optimizers explicitly disables them by setting
392 * these disable variables to 1 in devicetree overrides.
393 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530394 s_cfg->SataPwrOptEnable = !(config->SataPwrOptimizeDisable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530395 /*
396 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
397 * SataPortsDmVal is the DITO multiplier. Default is 15.
398 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
399 * The default values can be changed from devicetree.
400 */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530401 for (size_t i = 0; i < ARRAY_SIZE(config->SataPortsEnableDitoConfig); i++) {
Subrata Banik2871e0e2020-09-27 11:30:58 +0530402 if (config->SataPortsEnableDitoConfig[i]) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530403 s_cfg->SataPortsDmVal[i] = config->SataPortsDmVal[i];
404 s_cfg->SataPortsDitoVal[i] = config->SataPortsDitoVal[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530405 }
406 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530407}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530408
Subrata Banikb03cadf2021-06-09 22:19:04 +0530409static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
410 const struct soc_intel_alderlake_config *config)
411{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530412 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530413 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530414
415 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530416 s_cfg->TccActivationOffset = config->tcc_offset;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530417}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530418
Subrata Banikb03cadf2021-06-09 22:19:04 +0530419static void fill_fsps_lan_params(FSP_S_CONFIG *s_cfg,
420 const struct soc_intel_alderlake_config *config)
421{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530422 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530423 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530424}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530425
Subrata Banikb03cadf2021-06-09 22:19:04 +0530426static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
427 const struct soc_intel_alderlake_config *config)
428{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530429 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530430 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
431 s_cfg->CnviBtCore = config->CnviBtCore;
432 s_cfg->CnviBtAudioOffload = config->CnviBtAudioOffload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800433 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530434 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800435 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530436 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530437}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530438
Subrata Banikb03cadf2021-06-09 22:19:04 +0530439static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
440 const struct soc_intel_alderlake_config *config)
441{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530442 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530443 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530444}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530445
Subrata Banikb03cadf2021-06-09 22:19:04 +0530446static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
447 const struct soc_intel_alderlake_config *config)
448{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530449 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530450 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
451 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
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_tbt_params(FSP_S_CONFIG *s_cfg,
455 const struct soc_intel_alderlake_config *config)
456{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700457 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530458 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530459 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530460}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700461
Subrata Banikb03cadf2021-06-09 22:19:04 +0530462static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
463 const struct soc_intel_alderlake_config *config)
464{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530465 /* Legacy 8254 timer support */
Subrata Banikc0983c92021-06-15 13:02:01 +0530466 s_cfg->Enable8254ClockGating = !CONFIG(USE_LEGACY_8254_TIMER);
467 s_cfg->Enable8254ClockGatingOnS3 = !CONFIG(USE_LEGACY_8254_TIMER);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530468}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530469
Subrata Banikb03cadf2021-06-09 22:19:04 +0530470static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
471 const struct soc_intel_alderlake_config *config)
472{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530473 /* Enable Hybrid storage auto detection */
Subrata Banikc0983c92021-06-15 13:02:01 +0530474 s_cfg->HybridStorageMode = config->HybridStorageMode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530475}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530476
Subrata Banikb03cadf2021-06-09 22:19:04 +0530477static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
478 const struct soc_intel_alderlake_config *config)
479{
480 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
481 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800482 if (!(enable_mask & BIT(i)))
483 continue;
484 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530485 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800486 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530487 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
488 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
489 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
490 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530491 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530492}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530493
Subrata Banikb03cadf2021-06-09 22:19:04 +0530494static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
495 const struct soc_intel_alderlake_config *config)
496{
497 /*
498 * Power Optimizer for DMI
499 * DmiPwrOptimizeDisable is default to 0.
500 * Boards not needing the optimizers explicitly disables them by setting
501 * these disable variables to 1 in devicetree overrides.
502 */
503 s_cfg->PchPwrOptEnable = !(config->DmiPwrOptimizeDisable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530504 s_cfg->PmSupport = 1;
505 s_cfg->Hwp = 1;
506 s_cfg->Cx = 1;
507 s_cfg->PsOnEnable = 1;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530508}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530509
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600510static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
511 const struct soc_intel_alderlake_config *config)
512{
513 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
514 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
515
516 size_t pch_count = 0;
517 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
518
519 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
520 s_cfg->NumOfDevIntConfig = pch_count;
521 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
522}
523
Subrata Banik6f1cb402021-06-09 22:11:12 +0530524static void arch_silicon_init_params(FSPS_ARCH_UPD *s_arch_cfg)
525{
526 /* EnableMultiPhaseSiliconInit for running MultiPhaseSiInit */
527 s_arch_cfg->EnableMultiPhaseSiliconInit = 1;
528}
529
Subrata Banikb03cadf2021-06-09 22:19:04 +0530530static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
531 struct soc_intel_alderlake_config *config)
532{
533 /* Override settings per board if required. */
534 mainboard_update_soc_chip_config(config);
535
V Sowmya6464c2a2021-06-25 10:20:25 +0530536 const void (*fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530537 const struct soc_intel_alderlake_config *config) = {
538 fill_fsps_lpss_params,
539 fill_fsps_cpu_params,
540 fill_fsps_igd_params,
541 fill_fsps_tcss_params,
542 fill_fsps_chipset_lockdown_params,
543 fill_fsps_xhci_params,
544 fill_fsps_xdci_params,
545 fill_fsps_uart_params,
546 fill_fsps_sata_params,
547 fill_fsps_thermal_params,
548 fill_fsps_lan_params,
549 fill_fsps_cnvi_params,
550 fill_fsps_vmd_params,
551 fill_fsps_thc_params,
552 fill_fsps_tbt_params,
553 fill_fsps_8254_params,
554 fill_fsps_storage_params,
555 fill_fsps_pcie_params,
556 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600557 fill_fsps_irq_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530558 };
559
560 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
561 fill_fsps_params[i](s_cfg, config);
562}
563
Subrata Banik6f1cb402021-06-09 22:11:12 +0530564/* UPD parameters to be initialized before SiliconInit */
565void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
566{
567 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530568 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530569 FSPS_ARCH_UPD *s_arch_cfg = &supd->FspsArchUpd;
570
571 config = config_of_soc();
572
573 arch_silicon_init_params(s_arch_cfg);
Subrata Banikc0983c92021-06-15 13:02:01 +0530574 soc_silicon_init_params(s_cfg, config);
575 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530576}
577
Subrata Banik2871e0e2020-09-27 11:30:58 +0530578/*
579 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
580 * This platform supports below MultiPhaseSIInit Phase(s):
581 * Phase | FSP return point | Purpose
582 * ------- + ------------------------------------------------ + -------------------------------
583 * 1 | After TCSS initialization completed | for TCSS specific init
584 */
585void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
586{
587 switch (phase_index) {
588 case 1:
589 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530590 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
591 __FILE__, __func__);
592
593 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
594 const config_t *config = config_of_soc();
595 tcss_configure(config->typec_aux_bias_pads);
596 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530597 break;
598 default:
599 break;
600 }
601}
602
603/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530604__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530605{
606 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
607}