blob: a92883cb5022764961de7ff904b697b3504c0e4b [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>
Subrata Banik7b523a42021-09-22 16:46:16 +05306#include <cpu/intel/microcode.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +05307#include <device/device.h>
8#include <device/pci.h>
V Sowmya458708f2021-07-09 22:11:04 +05309#include <device/pci_ids.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053010#include <fsp/api.h>
11#include <fsp/ppi/mp_service_ppi.h>
12#include <fsp/util.h>
Sean Rhodesbc35bed2021-07-13 13:36:28 +010013#include <option.h>
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060014#include <intelblocks/irq.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053015#include <intelblocks/lpss.h>
Tim Wawrzynczakab0e0812021-09-21 10:28:16 -060016#include <intelblocks/pmclib.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053017#include <intelblocks/xdci.h>
18#include <intelpch/lockdown.h>
Deepti Deshatty8e7facf2021-05-12 17:45:37 +053019#include <intelblocks/tcss.h>
Tim Wawrzynczake2b8f302021-07-19 15:35:47 -060020#include <soc/cpu.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053021#include <soc/gpio_soc_defs.h>
22#include <soc/intel/common/vbt.h>
23#include <soc/pci_devs.h>
Eric Lai5b302b22020-12-05 16:49:43 +080024#include <soc/pcie.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053025#include <soc/ramstage.h>
26#include <soc/soc_chip.h>
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060027#include <stdlib.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053028#include <string.h>
Sean Rhodesbc35bed2021-07-13 13:36:28 +010029#include <types.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053030
31/* THC assignment definition */
32#define THC_NONE 0
33#define THC_0 1
34#define THC_1 2
35
36/* SATA DEVSLP idle timeout default values */
37#define DEF_DMVAL 15
38#define DEF_DITOVAL 625
39
V Sowmya458708f2021-07-09 22:11:04 +053040/* VccIn Aux Imon IccMax values in mA */
41#define MILLIAMPS_TO_AMPS 1000
42#define ICC_MAX_ID_ADL_P_3_MA 34250
43#define ICC_MAX_ID_ADL_P_5_MA 32000
44#define ICC_MAX_ID_ADL_P_7_MA 32000
45
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -060046/*
47 * ME End of Post configuration
48 * 0 - Disable EOP.
49 * 1 - Send in PEI (Applicable for FSP in API mode)
50 * 2 - Send in DXE (Not applicable for FSP in API mode)
51 */
52enum fsp_end_of_post {
53 EOP_DISABLE = 0,
54 EOP_PEI = 1,
55 EOP_DXE = 2,
56};
57
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060058static const struct slot_irq_constraints irq_constraints[] = {
59 {
60 .slot = SA_DEV_SLOT_IGD,
61 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060062 /* INTERRUPT_PIN is RO/0x01 */
63 FIXED_INT_ANY_PIRQ(SA_DEVFN_IGD, PCI_INT_A),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060064 },
65 },
66 {
67 .slot = SA_DEV_SLOT_DPTF,
68 .fns = {
69 ANY_PIRQ(SA_DEVFN_DPTF),
70 },
71 },
72 {
73 .slot = SA_DEV_SLOT_IPU,
74 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060075 /* INTERRUPT_PIN is RO/0x01, and INTERRUPT_LINE is RW,
76 but S0ix fails when not set to 16 (b/193434192) */
77 FIXED_INT_PIRQ(SA_DEVFN_IPU, PCI_INT_A, PIRQ_A),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060078 },
79 },
80 {
81 .slot = SA_DEV_SLOT_CPU_6,
82 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060083 FIXED_INT_PIRQ(SA_DEVFN_CPU_PCIE6_0, PCI_INT_A, PIRQ_A),
84 FIXED_INT_PIRQ(SA_DEVFN_CPU_PCIE6_2, PCI_INT_C, PIRQ_C),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060085 },
86 },
87 {
88 .slot = SA_DEV_SLOT_TBT,
89 .fns = {
90 ANY_PIRQ(SA_DEVFN_TBT0),
91 ANY_PIRQ(SA_DEVFN_TBT1),
92 ANY_PIRQ(SA_DEVFN_TBT2),
93 ANY_PIRQ(SA_DEVFN_TBT3),
94 },
95 },
96 {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060097 .slot = SA_DEV_SLOT_GNA,
98 .fns = {
99 /* INTERRUPT_PIN is RO/0x01 */
100 FIXED_INT_ANY_PIRQ(SA_DEVFN_GNA, PCI_INT_A),
101 },
102 },
103 {
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600104 .slot = SA_DEV_SLOT_TCSS,
105 .fns = {
106 ANY_PIRQ(SA_DEVFN_TCSS_XHCI),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600107 ANY_PIRQ(SA_DEVFN_TCSS_XDCI),
108 },
109 },
110 {
111 .slot = PCH_DEV_SLOT_SIO0,
112 .fns = {
113 DIRECT_IRQ(PCH_DEVFN_I2C6),
114 DIRECT_IRQ(PCH_DEVFN_I2C7),
115 ANY_PIRQ(PCH_DEVFN_THC0),
116 ANY_PIRQ(PCH_DEVFN_THC1),
117 },
118 },
119 {
120 .slot = PCH_DEV_SLOT_SIO6,
121 .fns = {
122 DIRECT_IRQ(PCH_DEVFN_UART3),
123 DIRECT_IRQ(PCH_DEVFN_UART4),
124 DIRECT_IRQ(PCH_DEVFN_UART5),
125 DIRECT_IRQ(PCH_DEVFN_UART6),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600126 },
127 },
128 {
129 .slot = PCH_DEV_SLOT_ISH,
130 .fns = {
131 DIRECT_IRQ(PCH_DEVFN_ISH),
132 DIRECT_IRQ(PCH_DEVFN_GSPI2),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600133 ANY_PIRQ(PCH_DEVFN_UFS),
134 },
135 },
136 {
137 .slot = PCH_DEV_SLOT_SIO2,
138 .fns = {
139 DIRECT_IRQ(PCH_DEVFN_GSPI3),
140 DIRECT_IRQ(PCH_DEVFN_GSPI4),
141 DIRECT_IRQ(PCH_DEVFN_GSPI5),
142 DIRECT_IRQ(PCH_DEVFN_GSPI6),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600143 },
144 },
145 {
146 .slot = PCH_DEV_SLOT_XHCI,
147 .fns = {
148 ANY_PIRQ(PCH_DEVFN_XHCI),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600149 DIRECT_IRQ(PCH_DEVFN_USBOTG),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600150 ANY_PIRQ(PCH_DEVFN_CNVI_WIFI),
151 },
152 },
153 {
154 .slot = PCH_DEV_SLOT_SIO3,
155 .fns = {
156 DIRECT_IRQ(PCH_DEVFN_I2C0),
157 DIRECT_IRQ(PCH_DEVFN_I2C1),
158 DIRECT_IRQ(PCH_DEVFN_I2C2),
159 DIRECT_IRQ(PCH_DEVFN_I2C3),
160 },
161 },
162 {
163 .slot = PCH_DEV_SLOT_CSE,
164 .fns = {
165 ANY_PIRQ(PCH_DEVFN_CSE),
166 ANY_PIRQ(PCH_DEVFN_CSE_2),
167 ANY_PIRQ(PCH_DEVFN_CSE_IDER),
168 ANY_PIRQ(PCH_DEVFN_CSE_KT),
169 ANY_PIRQ(PCH_DEVFN_CSE_3),
170 ANY_PIRQ(PCH_DEVFN_CSE_4),
171 },
172 },
173 {
174 .slot = PCH_DEV_SLOT_SATA,
175 .fns = {
176 ANY_PIRQ(PCH_DEVFN_SATA),
177 },
178 },
179 {
180 .slot = PCH_DEV_SLOT_SIO4,
181 .fns = {
182 DIRECT_IRQ(PCH_DEVFN_I2C4),
183 DIRECT_IRQ(PCH_DEVFN_I2C5),
184 DIRECT_IRQ(PCH_DEVFN_UART2),
185 },
186 },
187 {
188 .slot = PCH_DEV_SLOT_PCIE,
189 .fns = {
190 FIXED_INT_PIRQ(PCH_DEVFN_PCIE1, PCI_INT_A, PIRQ_A),
191 FIXED_INT_PIRQ(PCH_DEVFN_PCIE2, PCI_INT_B, PIRQ_B),
192 FIXED_INT_PIRQ(PCH_DEVFN_PCIE3, PCI_INT_C, PIRQ_C),
193 FIXED_INT_PIRQ(PCH_DEVFN_PCIE4, PCI_INT_D, PIRQ_D),
194 FIXED_INT_PIRQ(PCH_DEVFN_PCIE5, PCI_INT_A, PIRQ_A),
195 FIXED_INT_PIRQ(PCH_DEVFN_PCIE6, PCI_INT_B, PIRQ_B),
196 FIXED_INT_PIRQ(PCH_DEVFN_PCIE7, PCI_INT_C, PIRQ_C),
197 FIXED_INT_PIRQ(PCH_DEVFN_PCIE8, PCI_INT_D, PIRQ_D),
198 },
199 },
200 {
201 .slot = PCH_DEV_SLOT_PCIE_1,
202 .fns = {
203 FIXED_INT_PIRQ(PCH_DEVFN_PCIE9, PCI_INT_A, PIRQ_A),
204 FIXED_INT_PIRQ(PCH_DEVFN_PCIE10, PCI_INT_B, PIRQ_B),
205 FIXED_INT_PIRQ(PCH_DEVFN_PCIE11, PCI_INT_C, PIRQ_C),
206 FIXED_INT_PIRQ(PCH_DEVFN_PCIE12, PCI_INT_D, PIRQ_D),
207 },
208 },
209 {
210 .slot = PCH_DEV_SLOT_SIO5,
211 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600212 /* UART0 shares an interrupt line with TSN0, so must use
213 a PIRQ */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600214 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART0, PCI_INT_A),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600215 /* UART1 shares an interrupt line with TSN1, so must use
216 a PIRQ */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600217 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART1, PCI_INT_B),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600218 DIRECT_IRQ(PCH_DEVFN_GSPI0),
219 DIRECT_IRQ(PCH_DEVFN_GSPI1),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600220 },
221 },
222 {
223 .slot = PCH_DEV_SLOT_ESPI,
224 .fns = {
225 ANY_PIRQ(PCH_DEVFN_HDA),
226 ANY_PIRQ(PCH_DEVFN_SMBUS),
227 ANY_PIRQ(PCH_DEVFN_GBE),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600228 /* INTERRUPT_PIN is RO/0x01 */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600229 FIXED_INT_ANY_PIRQ(PCH_DEVFN_TRACEHUB, PCI_INT_A),
230 },
231 },
232};
233
234static const SI_PCH_DEVICE_INTERRUPT_CONFIG *pci_irq_to_fsp(size_t *out_count)
235{
236 const struct pci_irq_entry *entry = get_cached_pci_irqs();
237 SI_PCH_DEVICE_INTERRUPT_CONFIG *config;
238 size_t pch_total = 0;
239 size_t cfg_count = 0;
240
241 if (!entry)
242 return NULL;
243
244 /* Count PCH devices */
245 while (entry) {
246 if (PCI_SLOT(entry->devfn) >= MIN_PCH_SLOT)
247 ++pch_total;
248 entry = entry->next;
249 }
250
251 /* Convert PCH device entries to FSP format */
252 config = calloc(pch_total, sizeof(*config));
253 entry = get_cached_pci_irqs();
254 while (entry) {
255 if (PCI_SLOT(entry->devfn) < MIN_PCH_SLOT) {
256 entry = entry->next;
257 continue;
258 }
259
260 config[cfg_count].Device = PCI_SLOT(entry->devfn);
261 config[cfg_count].Function = PCI_FUNC(entry->devfn);
262 config[cfg_count].IntX = (SI_PCH_INT_PIN)entry->pin;
263 config[cfg_count].Irq = entry->irq;
264 ++cfg_count;
265
266 entry = entry->next;
267 }
268
269 *out_count = cfg_count;
270
271 return config;
272}
273
Subrata Banik2871e0e2020-09-27 11:30:58 +0530274/*
275 * Chip config parameter PcieRpL1Substates uses (UPD value + 1)
276 * because UPD value of 0 for PcieRpL1Substates means disabled for FSP.
277 * In order to ensure that mainboard setting does not disable L1 substates
278 * incorrectly, chip config parameter values are offset by 1 with 0 meaning
279 * use FSP UPD default. get_l1_substate_control() ensures that the right UPD
280 * value is set in fsp_params.
281 * 0: Use FSP UPD default
282 * 1: Disable L1 substates
283 * 2: Use L1.1
284 * 3: Use L1.2 (FSP UPD default)
285 */
286static int get_l1_substate_control(enum L1_substates_control ctl)
287{
288 if ((ctl > L1_SS_L1_2) || (ctl == L1_SS_FSP_DEFAULT))
289 ctl = L1_SS_L1_2;
290 return ctl - 1;
291}
292
V Sowmya458708f2021-07-09 22:11:04 +0530293/* This function returns the VccIn Aux Imon IccMax values for ADL-P SKU's */
294static uint16_t get_vccin_aux_imon_iccmax(void)
295{
296 uint16_t mch_id = 0;
297
298 if (!mch_id) {
299 struct device *dev = pcidev_path_on_root(SA_DEVFN_ROOT);
300 mch_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
301 }
302
303 switch (mch_id) {
304 case PCI_DEVICE_ID_INTEL_ADL_P_ID_3:
305 return ICC_MAX_ID_ADL_P_3_MA;
306 case PCI_DEVICE_ID_INTEL_ADL_P_ID_5:
307 return ICC_MAX_ID_ADL_P_5_MA;
308 case PCI_DEVICE_ID_INTEL_ADL_P_ID_7:
309 return ICC_MAX_ID_ADL_P_7_MA;
310 default:
311 printk(BIOS_ERR, "Unknown MCH ID: 0x%4x, skipping VccInAuxImonIccMax config\n",
312 mch_id);
313 return 0;
314 }
315}
316
Subrata Banikb03cadf2021-06-09 22:19:04 +0530317__weak void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530318{
Subrata Banikb03cadf2021-06-09 22:19:04 +0530319 /* Override settings per board. */
320}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530321
Subrata Banikb03cadf2021-06-09 22:19:04 +0530322static void fill_fsps_lpss_params(FSP_S_CONFIG *s_cfg,
323 const struct soc_intel_alderlake_config *config)
324{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530325 for (int i = 0; i < CONFIG_SOC_INTEL_I2C_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530326 s_cfg->SerialIoI2cMode[i] = config->SerialIoI2cMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530327
328 for (int i = 0; i < CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX; i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530329 s_cfg->SerialIoSpiMode[i] = config->SerialIoGSpiMode[i];
330 s_cfg->SerialIoSpiCsMode[i] = config->SerialIoGSpiCsMode[i];
331 s_cfg->SerialIoSpiCsState[i] = config->SerialIoGSpiCsState[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530332 }
333
334 for (int i = 0; i < CONFIG_SOC_INTEL_UART_DEV_MAX; i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530335 s_cfg->SerialIoUartMode[i] = config->SerialIoUartMode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530336}
337
Subrata Banikb03cadf2021-06-09 22:19:04 +0530338static void fill_fsps_cpu_params(FSP_S_CONFIG *s_cfg,
339 const struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530340{
Subrata Banik99289a82020-12-22 10:54:44 +0530341 const struct microcode *microcode_file;
342 size_t microcode_len;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530343
Subrata Banikb03cadf2021-06-09 22:19:04 +0530344 /* Locate microcode and pass to FSP-S for 2nd microcode loading */
Subrata Banik7b523a42021-09-22 16:46:16 +0530345 microcode_file = intel_microcode_find();
346 microcode_len = get_microcode_size(microcode_file);
Subrata Banik99289a82020-12-22 10:54:44 +0530347
348 if ((microcode_file != NULL) && (microcode_len != 0)) {
349 /* Update CPU Microcode patch base address/size */
Subrata Banik7b523a42021-09-22 16:46:16 +0530350 s_cfg->MicrocodeRegionBase = (uint32_t)(uintptr_t)microcode_file;
Subrata Banikc0983c92021-06-15 13:02:01 +0530351 s_cfg->MicrocodeRegionSize = (uint32_t)microcode_len;
Subrata Banik99289a82020-12-22 10:54:44 +0530352 }
353
Subrata Banikb03cadf2021-06-09 22:19:04 +0530354 /* Use coreboot MP PPI services if Kconfig is enabled */
355 if (CONFIG(USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI))
356 s_cfg->CpuMpPpi = (uintptr_t) mp_fill_ppi_services_data();
357}
358
359static void fill_fsps_igd_params(FSP_S_CONFIG *s_cfg,
360 const struct soc_intel_alderlake_config *config)
361{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530362 /* Load VBT before devicetree-specific config. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530363 s_cfg->GraphicsConfigPtr = (uintptr_t)vbt_get();
Subrata Banik2871e0e2020-09-27 11:30:58 +0530364
365 /* Check if IGD is present and fill Graphics init param accordingly */
Subrata Banikc0983c92021-06-15 13:02:01 +0530366 s_cfg->PeiGraphicsPeimInit = CONFIG(RUN_FSP_GOP) && is_devfn_enabled(SA_DEVFN_IGD);
367 s_cfg->LidStatus = CONFIG(RUN_FSP_GOP);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530368}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530369
Subrata Banikb03cadf2021-06-09 22:19:04 +0530370static void fill_fsps_tcss_params(FSP_S_CONFIG *s_cfg,
371 const struct soc_intel_alderlake_config *config)
372{
Furquan Shaikheafca1f2021-09-22 13:59:39 -0700373 const struct device *tcss_port_arr[] = {
374 DEV_PTR(tcss_usb3_port1),
375 DEV_PTR(tcss_usb3_port2),
376 DEV_PTR(tcss_usb3_port3),
377 DEV_PTR(tcss_usb3_port4),
378 };
379
Subrata Banikc0983c92021-06-15 13:02:01 +0530380 s_cfg->TcssAuxOri = config->TcssAuxOri;
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530381
382 /* Explicitly clear this field to avoid using defaults */
Subrata Banikc0983c92021-06-15 13:02:01 +0530383 memset(s_cfg->IomTypeCPortPadCfg, 0, sizeof(s_cfg->IomTypeCPortPadCfg));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530384
385 /*
386 * Set FSPS UPD ITbtConnectTopologyTimeoutInMs with value 0. FSP will
387 * evaluate this UPD value and skip sending command. There will be no
388 * delay for command completion.
389 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530390 s_cfg->ITbtConnectTopologyTimeoutInMs = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530391
Subrata Banikb03cadf2021-06-09 22:19:04 +0530392 /* D3Hot and D3Cold for TCSS */
393 s_cfg->D3HotEnable = !config->TcssD3HotDisable;
394 s_cfg->D3ColdEnable = !config->TcssD3ColdDisable;
Bernardo Perez Priego421ce562021-06-09 09:40:31 -0700395
396 s_cfg->UsbTcPortEn = 0;
397 for (int i = 0; i < MAX_TYPE_C_PORTS; i++) {
Furquan Shaikheafca1f2021-09-22 13:59:39 -0700398 if (is_dev_enabled(tcss_port_arr[i]))
Bernardo Perez Priego421ce562021-06-09 09:40:31 -0700399 s_cfg->UsbTcPortEn |= BIT(i);
400 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530401}
402
403static void fill_fsps_chipset_lockdown_params(FSP_S_CONFIG *s_cfg,
404 const struct soc_intel_alderlake_config *config)
405{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530406 /* Chipset Lockdown */
Felix Singerf9d7dc72021-05-03 02:33:15 +0200407 const bool lockdown_by_fsp = get_lockdown_config() == CHIPSET_LOCKDOWN_FSP;
408 s_cfg->PchLockDownGlobalSmi = lockdown_by_fsp;
409 s_cfg->PchLockDownBiosInterface = lockdown_by_fsp;
410 s_cfg->PchUnlockGpioPads = !lockdown_by_fsp;
411 s_cfg->RtcMemoryLock = lockdown_by_fsp;
Tim Wawrzynczak091dfa12021-08-24 09:32:09 -0600412 s_cfg->SkipPamLock = !lockdown_by_fsp;
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -0600413
414 /* coreboot will send EOP before loading payload */
415 s_cfg->EndOfPostMessage = EOP_DISABLE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530416}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530417
Subrata Banikb03cadf2021-06-09 22:19:04 +0530418static void fill_fsps_xhci_params(FSP_S_CONFIG *s_cfg,
419 const struct soc_intel_alderlake_config *config)
420{
421 int i;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530422 /* USB */
423 for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530424 s_cfg->PortUsb20Enable[i] = config->usb2_ports[i].enable;
425 s_cfg->Usb2PhyPetxiset[i] = config->usb2_ports[i].pre_emp_bias;
426 s_cfg->Usb2PhyTxiset[i] = config->usb2_ports[i].tx_bias;
427 s_cfg->Usb2PhyPredeemp[i] = config->usb2_ports[i].tx_emp_enable;
428 s_cfg->Usb2PhyPehalfbit[i] = config->usb2_ports[i].pre_emp_bit;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530429
430 if (config->usb2_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530431 s_cfg->Usb2OverCurrentPin[i] = config->usb2_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530432 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530433 s_cfg->Usb2OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530434 }
435
436 for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530437 s_cfg->PortUsb30Enable[i] = config->usb3_ports[i].enable;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530438 if (config->usb3_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530439 s_cfg->Usb3OverCurrentPin[i] = config->usb3_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530440 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530441 s_cfg->Usb3OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530442
443 if (config->usb3_ports[i].tx_de_emp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530444 s_cfg->Usb3HsioTxDeEmphEnable[i] = 1;
445 s_cfg->Usb3HsioTxDeEmph[i] = config->usb3_ports[i].tx_de_emp;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530446 }
447 if (config->usb3_ports[i].tx_downscale_amp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530448 s_cfg->Usb3HsioTxDownscaleAmpEnable[i] = 1;
449 s_cfg->Usb3HsioTxDownscaleAmp[i] =
Subrata Banik2871e0e2020-09-27 11:30:58 +0530450 config->usb3_ports[i].tx_downscale_amp;
451 }
452 }
453
Maulik V Vaghela69353502021-04-14 14:01:02 +0530454 for (i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
455 if (config->tcss_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530456 s_cfg->CpuUsb3OverCurrentPin[i] = config->tcss_ports[i].ocpin;
Maulik V Vaghela69353502021-04-14 14:01:02 +0530457 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530458}
Maulik V Vaghela69353502021-04-14 14:01:02 +0530459
Subrata Banikb03cadf2021-06-09 22:19:04 +0530460static void fill_fsps_xdci_params(FSP_S_CONFIG *s_cfg,
461 const struct soc_intel_alderlake_config *config)
462{
Angel Ponsc7cfe0b2021-06-23 12:39:22 +0200463 s_cfg->XdciEnable = xdci_can_enable(PCH_DEVFN_USBOTG);
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_uart_params(FSP_S_CONFIG *s_cfg,
467 const struct soc_intel_alderlake_config *config)
468{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530469 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530470 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
471 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
472 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530473}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530474
Subrata Banikb03cadf2021-06-09 22:19:04 +0530475static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
476 const struct soc_intel_alderlake_config *config)
477{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530478 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530479 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
480 if (s_cfg->SataEnable) {
481 s_cfg->SataMode = config->SataMode;
482 s_cfg->SataSalpSupport = config->SataSalpSupport;
483 memcpy(s_cfg->SataPortsEnable, config->SataPortsEnable,
484 sizeof(s_cfg->SataPortsEnable));
485 memcpy(s_cfg->SataPortsDevSlp, config->SataPortsDevSlp,
486 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530487 }
488
489 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530490 * Power Optimizer for SATA.
491 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530492 * Boards not needing the optimizers explicitly disables them by setting
493 * these disable variables to 1 in devicetree overrides.
494 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530495 s_cfg->SataPwrOptEnable = !(config->SataPwrOptimizeDisable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530496 /*
497 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
498 * SataPortsDmVal is the DITO multiplier. Default is 15.
499 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
500 * The default values can be changed from devicetree.
501 */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530502 for (size_t i = 0; i < ARRAY_SIZE(config->SataPortsEnableDitoConfig); i++) {
Subrata Banik2871e0e2020-09-27 11:30:58 +0530503 if (config->SataPortsEnableDitoConfig[i]) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530504 s_cfg->SataPortsDmVal[i] = config->SataPortsDmVal[i];
505 s_cfg->SataPortsDitoVal[i] = config->SataPortsDitoVal[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530506 }
507 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530508}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530509
Subrata Banikb03cadf2021-06-09 22:19:04 +0530510static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
511 const struct soc_intel_alderlake_config *config)
512{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530513 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530514 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530515
516 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530517 s_cfg->TccActivationOffset = config->tcc_offset;
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_lan_params(FSP_S_CONFIG *s_cfg,
521 const struct soc_intel_alderlake_config *config)
522{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530523 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530524 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530525}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530526
Subrata Banikb03cadf2021-06-09 22:19:04 +0530527static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
528 const struct soc_intel_alderlake_config *config)
529{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530530 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530531 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
532 s_cfg->CnviBtCore = config->CnviBtCore;
533 s_cfg->CnviBtAudioOffload = config->CnviBtAudioOffload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800534 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530535 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800536 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530537 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530538}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530539
Subrata Banikb03cadf2021-06-09 22:19:04 +0530540static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
541 const struct soc_intel_alderlake_config *config)
542{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530543 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530544 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530545}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530546
Subrata Banikb03cadf2021-06-09 22:19:04 +0530547static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
548 const struct soc_intel_alderlake_config *config)
549{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530550 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530551 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
552 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530553}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530554
Subrata Banikb03cadf2021-06-09 22:19:04 +0530555static void fill_fsps_tbt_params(FSP_S_CONFIG *s_cfg,
556 const struct soc_intel_alderlake_config *config)
557{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700558 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530559 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530560 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530561}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700562
Subrata Banikb03cadf2021-06-09 22:19:04 +0530563static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
564 const struct soc_intel_alderlake_config *config)
565{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530566 /* Legacy 8254 timer support */
Sean Rhodesbc35bed2021-07-13 13:36:28 +0100567 bool use_8254 = get_uint_option("legacy_8254_timer", CONFIG(USE_LEGACY_8254_TIMER));
568 s_cfg->Enable8254ClockGating = !use_8254;
569 s_cfg->Enable8254ClockGatingOnS3 = !use_8254;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530570}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530571
Subrata Banikb03cadf2021-06-09 22:19:04 +0530572static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
573 const struct soc_intel_alderlake_config *config)
574{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530575 /* Enable Hybrid storage auto detection */
Subrata Banikc0983c92021-06-15 13:02:01 +0530576 s_cfg->HybridStorageMode = config->HybridStorageMode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530577}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530578
Subrata Banikb03cadf2021-06-09 22:19:04 +0530579static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
580 const struct soc_intel_alderlake_config *config)
581{
582 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
583 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800584 if (!(enable_mask & BIT(i)))
585 continue;
586 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530587 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800588 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530589 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
590 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
591 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
592 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530593 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530594}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530595
Subrata Banikb03cadf2021-06-09 22:19:04 +0530596static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
597 const struct soc_intel_alderlake_config *config)
598{
599 /*
600 * Power Optimizer for DMI
601 * DmiPwrOptimizeDisable is default to 0.
602 * Boards not needing the optimizers explicitly disables them by setting
603 * these disable variables to 1 in devicetree overrides.
604 */
605 s_cfg->PchPwrOptEnable = !(config->DmiPwrOptimizeDisable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530606 s_cfg->PmSupport = 1;
607 s_cfg->Hwp = 1;
608 s_cfg->Cx = 1;
609 s_cfg->PsOnEnable = 1;
V Sowmya844dcb32021-06-21 10:03:53 +0530610 /* Enable the energy efficient turbo mode */
611 s_cfg->EnergyEfficientTurbo = 1;
V Sowmyaaf429062021-06-21 10:23:33 +0530612 s_cfg->PkgCStateLimit = LIMIT_AUTO;
V Sowmya458708f2021-07-09 22:11:04 +0530613
614 /* VccIn Aux Imon IccMax. Values are in 1/4 Amp increments and range is 0-512. */
615 s_cfg->VccInAuxImonIccImax = get_vccin_aux_imon_iccmax() * 4 / MILLIAMPS_TO_AMPS;
V Sowmyac6d71662021-07-15 08:11:08 +0530616
617 /* VrConfig Settings for IA and GT domains */
618 for (size_t i = 0; i < ARRAY_SIZE(config->domain_vr_config); i++)
619 fill_vr_domain_config(s_cfg, i, &config->domain_vr_config[i]);
Tim Wawrzynczake2b8f302021-07-19 15:35:47 -0600620
621 s_cfg->LpmStateEnableMask = get_supported_lpm_mask();
Tim Wawrzynczakab0e0812021-09-21 10:28:16 -0600622
623 /* Apply minimum assertion width settings */
624 if (config->pch_slp_s3_min_assertion_width == SLP_S3_ASSERTION_DEFAULT)
625 s_cfg->PchPmSlpS3MinAssert = SLP_S3_ASSERTION_50_MS;
626 else
627 s_cfg->PchPmSlpS3MinAssert = config->pch_slp_s3_min_assertion_width;
628
629 if (config->pch_slp_s4_min_assertion_width == SLP_S4_ASSERTION_DEFAULT)
630 s_cfg->PchPmSlpS4MinAssert = SLP_S4_ASSERTION_1S;
631 else
632 s_cfg->PchPmSlpS4MinAssert = config->pch_slp_s4_min_assertion_width;
633
634 if (config->pch_slp_sus_min_assertion_width == SLP_SUS_ASSERTION_DEFAULT)
635 s_cfg->PchPmSlpSusMinAssert = SLP_SUS_ASSERTION_4_S;
636 else
637 s_cfg->PchPmSlpSusMinAssert = config->pch_slp_sus_min_assertion_width;
638
639 if (config->pch_slp_a_min_assertion_width == SLP_A_ASSERTION_DEFAULT)
640 s_cfg->PchPmSlpAMinAssert = SLP_A_ASSERTION_2_S;
641 else
642 s_cfg->PchPmSlpAMinAssert = config->pch_slp_a_min_assertion_width;
643
644 unsigned int power_cycle_duration = config->pch_reset_power_cycle_duration;
645 if (power_cycle_duration == POWER_CYCLE_DURATION_DEFAULT)
646 power_cycle_duration = POWER_CYCLE_DURATION_4S;
647
648 s_cfg->PchPmPwrCycDur = get_pm_pwr_cyc_dur(s_cfg->PchPmSlpS4MinAssert,
649 s_cfg->PchPmSlpS3MinAssert,
650 s_cfg->PchPmSlpAMinAssert,
651 power_cycle_duration);
Subrata Banik6f1cb402021-06-09 22:11:12 +0530652}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530653
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600654static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
655 const struct soc_intel_alderlake_config *config)
656{
657 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
658 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
659
660 size_t pch_count = 0;
661 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
662
663 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
664 s_cfg->NumOfDevIntConfig = pch_count;
665 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
666}
667
V Sowmya418d37e2021-06-21 08:47:17 +0530668static void fill_fsps_fivr_params(FSP_S_CONFIG *s_cfg,
669 const struct soc_intel_alderlake_config *config)
670{
671 /* PCH FIVR settings override */
672 if (!config->ext_fivr_settings.configure_ext_fivr)
673 return;
674
675 s_cfg->PchFivrExtV1p05RailEnabledStates =
676 config->ext_fivr_settings.v1p05_enable_bitmap;
677
678 s_cfg->PchFivrExtV1p05RailSupportedVoltageStates =
679 config->ext_fivr_settings.v1p05_supported_voltage_bitmap;
680
681 s_cfg->PchFivrExtVnnRailEnabledStates =
682 config->ext_fivr_settings.vnn_enable_bitmap;
683
684 s_cfg->PchFivrExtVnnRailSupportedVoltageStates =
685 config->ext_fivr_settings.vnn_supported_voltage_bitmap;
686
687 s_cfg->PchFivrExtVnnRailSxEnabledStates =
688 config->ext_fivr_settings.vnn_enable_bitmap;
689
690 /* Convert the voltages to increments of 2.5mv */
691 s_cfg->PchFivrExtV1p05RailVoltage =
692 (config->ext_fivr_settings.v1p05_voltage_mv * 10) / 25;
693
694 s_cfg->PchFivrExtVnnRailVoltage =
695 (config->ext_fivr_settings.vnn_voltage_mv * 10) / 25;
696
697 s_cfg->PchFivrExtVnnRailSxVoltage =
698 (config->ext_fivr_settings.vnn_sx_voltage_mv * 10 / 25);
699
700 s_cfg->PchFivrExtV1p05RailIccMaximum =
701 config->ext_fivr_settings.v1p05_icc_max_ma;
702
703 s_cfg->PchFivrExtVnnRailIccMaximum =
704 config->ext_fivr_settings.vnn_icc_max_ma;
705}
706
Subrata Banikb03cadf2021-06-09 22:19:04 +0530707static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
708 struct soc_intel_alderlake_config *config)
709{
710 /* Override settings per board if required. */
711 mainboard_update_soc_chip_config(config);
712
V Sowmya6464c2a2021-06-25 10:20:25 +0530713 const void (*fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530714 const struct soc_intel_alderlake_config *config) = {
715 fill_fsps_lpss_params,
716 fill_fsps_cpu_params,
717 fill_fsps_igd_params,
718 fill_fsps_tcss_params,
719 fill_fsps_chipset_lockdown_params,
720 fill_fsps_xhci_params,
721 fill_fsps_xdci_params,
722 fill_fsps_uart_params,
723 fill_fsps_sata_params,
724 fill_fsps_thermal_params,
725 fill_fsps_lan_params,
726 fill_fsps_cnvi_params,
727 fill_fsps_vmd_params,
728 fill_fsps_thc_params,
729 fill_fsps_tbt_params,
730 fill_fsps_8254_params,
731 fill_fsps_storage_params,
732 fill_fsps_pcie_params,
733 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600734 fill_fsps_irq_params,
V Sowmya418d37e2021-06-21 08:47:17 +0530735 fill_fsps_fivr_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530736 };
737
738 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
739 fill_fsps_params[i](s_cfg, config);
740}
741
Subrata Banik6f1cb402021-06-09 22:11:12 +0530742/* UPD parameters to be initialized before SiliconInit */
743void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
744{
745 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530746 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530747
748 config = config_of_soc();
Subrata Banikc0983c92021-06-15 13:02:01 +0530749 soc_silicon_init_params(s_cfg, config);
750 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530751}
752
Subrata Banik2871e0e2020-09-27 11:30:58 +0530753/*
754 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
755 * This platform supports below MultiPhaseSIInit Phase(s):
756 * Phase | FSP return point | Purpose
757 * ------- + ------------------------------------------------ + -------------------------------
758 * 1 | After TCSS initialization completed | for TCSS specific init
759 */
760void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
761{
762 switch (phase_index) {
763 case 1:
764 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530765 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
766 __FILE__, __func__);
767
768 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
769 const config_t *config = config_of_soc();
770 tcss_configure(config->typec_aux_bias_pads);
771 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530772 break;
773 default:
774 break;
775 }
776}
777
778/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530779__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530780{
781 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
782}