blob: 36fd50de17911e32f0b6f797b1915ec5c5d451a0 [file] [log] [blame]
Subrata Banik2871e0e2020-09-27 11:30:58 +05301/* SPDX-License-Identifier: GPL-2.0-only */
2
3#include <assert.h>
4#include <console/console.h>
Subrata Banik7b523a42021-09-22 16:46:16 +05305#include <cpu/intel/microcode.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +05306#include <device/device.h>
7#include <device/pci.h>
V Sowmya458708f2021-07-09 22:11:04 +05308#include <device/pci_ids.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +05309#include <fsp/api.h>
Subrata Banik7cb6d722022-03-23 01:33:27 +053010#include <fsp/fsp_debug_event.h>
Subrata Banik2871e0e2020-09-27 11:30:58 +053011#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 */
Curtis Chenea1bb5f2021-11-25 13:17:42 +080041#define MILLIAMPS_TO_AMPS 1000
42#define ICC_MAX_TDP_45W 34250
43#define ICC_MAX_TDP_15W_28W 32000
44#define ICC_MAX_ID_ADL_M_MA 12000
V Sowmya2af96022022-04-05 17:03:04 +053045#define ICC_MAX_ID_ADL_N_MA 27000
Michał Żygowskibda2a152022-04-25 15:02:10 +020046#define ICC_MAX_ADL_S 33000
V Sowmya458708f2021-07-09 22:11:04 +053047
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -060048/*
49 * ME End of Post configuration
50 * 0 - Disable EOP.
51 * 1 - Send in PEI (Applicable for FSP in API mode)
52 * 2 - Send in DXE (Not applicable for FSP in API mode)
53 */
54enum fsp_end_of_post {
55 EOP_DISABLE = 0,
56 EOP_PEI = 1,
57 EOP_DXE = 2,
58};
59
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060060static const struct slot_irq_constraints irq_constraints[] = {
61 {
62 .slot = SA_DEV_SLOT_IGD,
63 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060064 /* INTERRUPT_PIN is RO/0x01 */
65 FIXED_INT_ANY_PIRQ(SA_DEVFN_IGD, PCI_INT_A),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060066 },
67 },
68 {
69 .slot = SA_DEV_SLOT_DPTF,
70 .fns = {
71 ANY_PIRQ(SA_DEVFN_DPTF),
72 },
73 },
74 {
75 .slot = SA_DEV_SLOT_IPU,
76 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060077 /* INTERRUPT_PIN is RO/0x01, and INTERRUPT_LINE is RW,
78 but S0ix fails when not set to 16 (b/193434192) */
79 FIXED_INT_PIRQ(SA_DEVFN_IPU, PCI_INT_A, PIRQ_A),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060080 },
81 },
82 {
83 .slot = SA_DEV_SLOT_CPU_6,
84 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060085 FIXED_INT_PIRQ(SA_DEVFN_CPU_PCIE6_0, PCI_INT_A, PIRQ_A),
86 FIXED_INT_PIRQ(SA_DEVFN_CPU_PCIE6_2, PCI_INT_C, PIRQ_C),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -060087 },
88 },
89 {
90 .slot = SA_DEV_SLOT_TBT,
91 .fns = {
92 ANY_PIRQ(SA_DEVFN_TBT0),
93 ANY_PIRQ(SA_DEVFN_TBT1),
94 ANY_PIRQ(SA_DEVFN_TBT2),
95 ANY_PIRQ(SA_DEVFN_TBT3),
96 },
97 },
98 {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -060099 .slot = SA_DEV_SLOT_GNA,
100 .fns = {
101 /* INTERRUPT_PIN is RO/0x01 */
102 FIXED_INT_ANY_PIRQ(SA_DEVFN_GNA, PCI_INT_A),
103 },
104 },
105 {
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600106 .slot = SA_DEV_SLOT_TCSS,
107 .fns = {
108 ANY_PIRQ(SA_DEVFN_TCSS_XHCI),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600109 ANY_PIRQ(SA_DEVFN_TCSS_XDCI),
110 },
111 },
112 {
113 .slot = PCH_DEV_SLOT_SIO0,
114 .fns = {
115 DIRECT_IRQ(PCH_DEVFN_I2C6),
116 DIRECT_IRQ(PCH_DEVFN_I2C7),
117 ANY_PIRQ(PCH_DEVFN_THC0),
118 ANY_PIRQ(PCH_DEVFN_THC1),
119 },
120 },
121 {
122 .slot = PCH_DEV_SLOT_SIO6,
123 .fns = {
124 DIRECT_IRQ(PCH_DEVFN_UART3),
125 DIRECT_IRQ(PCH_DEVFN_UART4),
126 DIRECT_IRQ(PCH_DEVFN_UART5),
127 DIRECT_IRQ(PCH_DEVFN_UART6),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600128 },
129 },
130 {
131 .slot = PCH_DEV_SLOT_ISH,
132 .fns = {
133 DIRECT_IRQ(PCH_DEVFN_ISH),
134 DIRECT_IRQ(PCH_DEVFN_GSPI2),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600135 ANY_PIRQ(PCH_DEVFN_UFS),
136 },
137 },
138 {
139 .slot = PCH_DEV_SLOT_SIO2,
140 .fns = {
141 DIRECT_IRQ(PCH_DEVFN_GSPI3),
142 DIRECT_IRQ(PCH_DEVFN_GSPI4),
143 DIRECT_IRQ(PCH_DEVFN_GSPI5),
144 DIRECT_IRQ(PCH_DEVFN_GSPI6),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600145 },
146 },
147 {
148 .slot = PCH_DEV_SLOT_XHCI,
149 .fns = {
150 ANY_PIRQ(PCH_DEVFN_XHCI),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600151 DIRECT_IRQ(PCH_DEVFN_USBOTG),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600152 ANY_PIRQ(PCH_DEVFN_CNVI_WIFI),
153 },
154 },
155 {
156 .slot = PCH_DEV_SLOT_SIO3,
157 .fns = {
158 DIRECT_IRQ(PCH_DEVFN_I2C0),
159 DIRECT_IRQ(PCH_DEVFN_I2C1),
160 DIRECT_IRQ(PCH_DEVFN_I2C2),
161 DIRECT_IRQ(PCH_DEVFN_I2C3),
162 },
163 },
164 {
165 .slot = PCH_DEV_SLOT_CSE,
166 .fns = {
167 ANY_PIRQ(PCH_DEVFN_CSE),
168 ANY_PIRQ(PCH_DEVFN_CSE_2),
169 ANY_PIRQ(PCH_DEVFN_CSE_IDER),
170 ANY_PIRQ(PCH_DEVFN_CSE_KT),
171 ANY_PIRQ(PCH_DEVFN_CSE_3),
172 ANY_PIRQ(PCH_DEVFN_CSE_4),
173 },
174 },
175 {
176 .slot = PCH_DEV_SLOT_SATA,
177 .fns = {
178 ANY_PIRQ(PCH_DEVFN_SATA),
179 },
180 },
181 {
182 .slot = PCH_DEV_SLOT_SIO4,
183 .fns = {
184 DIRECT_IRQ(PCH_DEVFN_I2C4),
185 DIRECT_IRQ(PCH_DEVFN_I2C5),
186 DIRECT_IRQ(PCH_DEVFN_UART2),
187 },
188 },
Krishna Prasad Bhata6d642f2022-01-16 23:16:24 +0530189#if CONFIG(SOC_INTEL_ALDERLAKE_PCH_N)
190 {
191 .slot = PCH_DEV_SLOT_EMMC,
192 .fns = {
193 ANY_PIRQ(PCH_DEVFN_EMMC),
194 },
195 },
196#endif
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600197 {
198 .slot = PCH_DEV_SLOT_PCIE,
199 .fns = {
200 FIXED_INT_PIRQ(PCH_DEVFN_PCIE1, PCI_INT_A, PIRQ_A),
201 FIXED_INT_PIRQ(PCH_DEVFN_PCIE2, PCI_INT_B, PIRQ_B),
202 FIXED_INT_PIRQ(PCH_DEVFN_PCIE3, PCI_INT_C, PIRQ_C),
203 FIXED_INT_PIRQ(PCH_DEVFN_PCIE4, PCI_INT_D, PIRQ_D),
204 FIXED_INT_PIRQ(PCH_DEVFN_PCIE5, PCI_INT_A, PIRQ_A),
205 FIXED_INT_PIRQ(PCH_DEVFN_PCIE6, PCI_INT_B, PIRQ_B),
206 FIXED_INT_PIRQ(PCH_DEVFN_PCIE7, PCI_INT_C, PIRQ_C),
207 FIXED_INT_PIRQ(PCH_DEVFN_PCIE8, PCI_INT_D, PIRQ_D),
208 },
209 },
210 {
211 .slot = PCH_DEV_SLOT_PCIE_1,
212 .fns = {
213 FIXED_INT_PIRQ(PCH_DEVFN_PCIE9, PCI_INT_A, PIRQ_A),
214 FIXED_INT_PIRQ(PCH_DEVFN_PCIE10, PCI_INT_B, PIRQ_B),
215 FIXED_INT_PIRQ(PCH_DEVFN_PCIE11, PCI_INT_C, PIRQ_C),
216 FIXED_INT_PIRQ(PCH_DEVFN_PCIE12, PCI_INT_D, PIRQ_D),
217 },
218 },
219 {
220 .slot = PCH_DEV_SLOT_SIO5,
221 .fns = {
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600222 /* UART0 shares an interrupt line with TSN0, so must use
223 a PIRQ */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600224 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART0, PCI_INT_A),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600225 /* UART1 shares an interrupt line with TSN1, so must use
226 a PIRQ */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600227 FIXED_INT_ANY_PIRQ(PCH_DEVFN_UART1, PCI_INT_B),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600228 DIRECT_IRQ(PCH_DEVFN_GSPI0),
229 DIRECT_IRQ(PCH_DEVFN_GSPI1),
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600230 },
231 },
232 {
233 .slot = PCH_DEV_SLOT_ESPI,
234 .fns = {
235 ANY_PIRQ(PCH_DEVFN_HDA),
236 ANY_PIRQ(PCH_DEVFN_SMBUS),
237 ANY_PIRQ(PCH_DEVFN_GBE),
Tim Wawrzynczak82225b82021-07-09 10:23:10 -0600238 /* INTERRUPT_PIN is RO/0x01 */
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600239 FIXED_INT_ANY_PIRQ(PCH_DEVFN_TRACEHUB, PCI_INT_A),
240 },
241 },
242};
243
244static const SI_PCH_DEVICE_INTERRUPT_CONFIG *pci_irq_to_fsp(size_t *out_count)
245{
246 const struct pci_irq_entry *entry = get_cached_pci_irqs();
247 SI_PCH_DEVICE_INTERRUPT_CONFIG *config;
248 size_t pch_total = 0;
249 size_t cfg_count = 0;
250
251 if (!entry)
252 return NULL;
253
254 /* Count PCH devices */
255 while (entry) {
256 if (PCI_SLOT(entry->devfn) >= MIN_PCH_SLOT)
257 ++pch_total;
258 entry = entry->next;
259 }
260
261 /* Convert PCH device entries to FSP format */
262 config = calloc(pch_total, sizeof(*config));
263 entry = get_cached_pci_irqs();
264 while (entry) {
265 if (PCI_SLOT(entry->devfn) < MIN_PCH_SLOT) {
266 entry = entry->next;
267 continue;
268 }
269
270 config[cfg_count].Device = PCI_SLOT(entry->devfn);
271 config[cfg_count].Function = PCI_FUNC(entry->devfn);
272 config[cfg_count].IntX = (SI_PCH_INT_PIN)entry->pin;
273 config[cfg_count].Irq = entry->irq;
274 ++cfg_count;
275
276 entry = entry->next;
277 }
278
279 *out_count = cfg_count;
280
281 return config;
282}
283
Subrata Banik2871e0e2020-09-27 11:30:58 +0530284/*
285 * Chip config parameter PcieRpL1Substates uses (UPD value + 1)
286 * because UPD value of 0 for PcieRpL1Substates means disabled for FSP.
287 * In order to ensure that mainboard setting does not disable L1 substates
288 * incorrectly, chip config parameter values are offset by 1 with 0 meaning
289 * use FSP UPD default. get_l1_substate_control() ensures that the right UPD
290 * value is set in fsp_params.
291 * 0: Use FSP UPD default
292 * 1: Disable L1 substates
293 * 2: Use L1.1
294 * 3: Use L1.2 (FSP UPD default)
295 */
296static int get_l1_substate_control(enum L1_substates_control ctl)
297{
298 if ((ctl > L1_SS_L1_2) || (ctl == L1_SS_FSP_DEFAULT))
299 ctl = L1_SS_L1_2;
300 return ctl - 1;
301}
302
Kevin Chang6e52c1d2022-03-18 21:04:07 +0800303/*
304 * Chip config parameter pcie_rp_aspm uses (UPD value + 1) because
305 * a UPD value of 0 for pcie_rp_aspm means disabled. In order to ensure
306 * that the mainboard setting does not disable ASPM incorrectly, chip
307 * config parameter values are offset by 1 with 0 meaning use FSP UPD default.
308 * get_aspm_control() ensures that the right UPD value is set in fsp_params.
309 * 0: Use FSP UPD default
310 * 1: Disable ASPM
311 * 2: L0s only
312 * 3: L1 only
313 * 4: L0s and L1
314 * 5: Auto configuration
315 */
316static unsigned int get_aspm_control(enum ASPM_control ctl)
317{
318 if ((ctl > ASPM_AUTO) || (ctl == ASPM_DEFAULT))
319 ctl = ASPM_AUTO;
320 return ctl - 1;
321}
322
Michał Żygowskibda2a152022-04-25 15:02:10 +0200323/* This function returns the VccIn Aux Imon IccMax values for ADL-P and ADL-S SKU's */
V Sowmya458708f2021-07-09 22:11:04 +0530324static uint16_t get_vccin_aux_imon_iccmax(void)
325{
326 uint16_t mch_id = 0;
Curtis Chenea1bb5f2021-11-25 13:17:42 +0800327 uint8_t tdp;
V Sowmya458708f2021-07-09 22:11:04 +0530328
329 if (!mch_id) {
330 struct device *dev = pcidev_path_on_root(SA_DEVFN_ROOT);
331 mch_id = dev ? pci_read_config16(dev, PCI_DEVICE_ID) : 0xffff;
332 }
333
334 switch (mch_id) {
Felix Singer43b7f412022-03-07 04:34:52 +0100335 case PCI_DID_INTEL_ADL_P_ID_1:
336 case PCI_DID_INTEL_ADL_P_ID_3:
Curtis Chen3fc3e6c2022-03-10 11:51:38 +0800337 case PCI_DID_INTEL_ADL_P_ID_4:
Felix Singer43b7f412022-03-07 04:34:52 +0100338 case PCI_DID_INTEL_ADL_P_ID_5:
339 case PCI_DID_INTEL_ADL_P_ID_6:
340 case PCI_DID_INTEL_ADL_P_ID_7:
Curtis Chen3fc3e6c2022-03-10 11:51:38 +0800341 case PCI_DID_INTEL_ADL_P_ID_8:
342 case PCI_DID_INTEL_ADL_P_ID_9:
343 case PCI_DID_INTEL_ADL_P_ID_10:
Curtis Chenea1bb5f2021-11-25 13:17:42 +0800344 tdp = get_cpu_tdp();
345 if (tdp == TDP_45W)
346 return ICC_MAX_TDP_45W;
347 return ICC_MAX_TDP_15W_28W;
Felix Singer43b7f412022-03-07 04:34:52 +0100348 case PCI_DID_INTEL_ADL_M_ID_1:
349 case PCI_DID_INTEL_ADL_M_ID_2:
Bora Guvendik31605952021-09-01 17:32:07 -0700350 return ICC_MAX_ID_ADL_M_MA;
V Sowmya2af96022022-04-05 17:03:04 +0530351 case PCI_DID_INTEL_ADL_N_ID_1:
352 case PCI_DID_INTEL_ADL_N_ID_2:
353 case PCI_DID_INTEL_ADL_N_ID_3:
354 case PCI_DID_INTEL_ADL_N_ID_4:
355 return ICC_MAX_ID_ADL_N_MA;
Michał Żygowskibda2a152022-04-25 15:02:10 +0200356 case PCI_DID_INTEL_ADL_S_ID_1:
357 case PCI_DID_INTEL_ADL_S_ID_3:
358 case PCI_DID_INTEL_ADL_S_ID_8:
359 case PCI_DID_INTEL_ADL_S_ID_10:
360 return ICC_MAX_ADL_S;
V Sowmya458708f2021-07-09 22:11:04 +0530361 default:
362 printk(BIOS_ERR, "Unknown MCH ID: 0x%4x, skipping VccInAuxImonIccMax config\n",
363 mch_id);
364 return 0;
365 }
366}
367
Subrata Banikb03cadf2021-06-09 22:19:04 +0530368__weak void mainboard_update_soc_chip_config(struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530369{
Subrata Banikb03cadf2021-06-09 22:19:04 +0530370 /* Override settings per board. */
371}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530372
Subrata Banikb03cadf2021-06-09 22:19:04 +0530373static void fill_fsps_lpss_params(FSP_S_CONFIG *s_cfg,
374 const struct soc_intel_alderlake_config *config)
375{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530376 for (int i = 0; i < CONFIG_SOC_INTEL_I2C_DEV_MAX; i++)
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530377 s_cfg->SerialIoI2cMode[i] = config->serial_io_i2c_mode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530378
379 for (int i = 0; i < CONFIG_SOC_INTEL_COMMON_BLOCK_GSPI_MAX; i++) {
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530380 s_cfg->SerialIoSpiMode[i] = config->serial_io_gspi_mode[i];
381 s_cfg->SerialIoSpiCsMode[i] = config->serial_io_gspi_cs_mode[i];
382 s_cfg->SerialIoSpiCsState[i] = config->serial_io_gspi_cs_state[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530383 }
384
385 for (int i = 0; i < CONFIG_SOC_INTEL_UART_DEV_MAX; i++)
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530386 s_cfg->SerialIoUartMode[i] = config->serial_io_uart_mode[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530387}
388
Subrata Banikb03cadf2021-06-09 22:19:04 +0530389static void fill_fsps_cpu_params(FSP_S_CONFIG *s_cfg,
390 const struct soc_intel_alderlake_config *config)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530391{
Subrata Banik99289a82020-12-22 10:54:44 +0530392 const struct microcode *microcode_file;
393 size_t microcode_len;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530394
Subrata Banikb03cadf2021-06-09 22:19:04 +0530395 /* Locate microcode and pass to FSP-S for 2nd microcode loading */
Subrata Banik7b523a42021-09-22 16:46:16 +0530396 microcode_file = intel_microcode_find();
Subrata Banik99289a82020-12-22 10:54:44 +0530397
Selma Bensaid291294d2021-10-11 16:37:36 -0700398 if (microcode_file != NULL) {
399 microcode_len = get_microcode_size(microcode_file);
400 if (microcode_len != 0) {
401 /* Update CPU Microcode patch base address/size */
402 s_cfg->MicrocodeRegionBase = (uint32_t)(uintptr_t)microcode_file;
403 s_cfg->MicrocodeRegionSize = (uint32_t)microcode_len;
404 }
Subrata Banik99289a82020-12-22 10:54:44 +0530405 }
406
Subrata Banikb03cadf2021-06-09 22:19:04 +0530407 /* Use coreboot MP PPI services if Kconfig is enabled */
408 if (CONFIG(USE_INTEL_FSP_TO_CALL_COREBOOT_PUBLISH_MP_PPI))
409 s_cfg->CpuMpPpi = (uintptr_t) mp_fill_ppi_services_data();
410}
411
412static void fill_fsps_igd_params(FSP_S_CONFIG *s_cfg,
413 const struct soc_intel_alderlake_config *config)
414{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530415 /* Load VBT before devicetree-specific config. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530416 s_cfg->GraphicsConfigPtr = (uintptr_t)vbt_get();
Subrata Banik2871e0e2020-09-27 11:30:58 +0530417
418 /* Check if IGD is present and fill Graphics init param accordingly */
Subrata Banikc0983c92021-06-15 13:02:01 +0530419 s_cfg->PeiGraphicsPeimInit = CONFIG(RUN_FSP_GOP) && is_devfn_enabled(SA_DEVFN_IGD);
420 s_cfg->LidStatus = CONFIG(RUN_FSP_GOP);
Lean Sheng Tane8df93a2022-04-01 19:07:53 +0200421 s_cfg->PavpEnable = CONFIG(PAVP);
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_tcss_params(FSP_S_CONFIG *s_cfg,
425 const struct soc_intel_alderlake_config *config)
426{
Furquan Shaikheafca1f2021-09-22 13:59:39 -0700427 const struct device *tcss_port_arr[] = {
428 DEV_PTR(tcss_usb3_port1),
429 DEV_PTR(tcss_usb3_port2),
430 DEV_PTR(tcss_usb3_port3),
431 DEV_PTR(tcss_usb3_port4),
432 };
433
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530434 s_cfg->TcssAuxOri = config->tcss_aux_ori;
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530435
436 /* Explicitly clear this field to avoid using defaults */
Subrata Banikc0983c92021-06-15 13:02:01 +0530437 memset(s_cfg->IomTypeCPortPadCfg, 0, sizeof(s_cfg->IomTypeCPortPadCfg));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530438
439 /*
440 * Set FSPS UPD ITbtConnectTopologyTimeoutInMs with value 0. FSP will
441 * evaluate this UPD value and skip sending command. There will be no
442 * delay for command completion.
443 */
Subrata Banikc0983c92021-06-15 13:02:01 +0530444 s_cfg->ITbtConnectTopologyTimeoutInMs = 0;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530445
Subrata Banikb03cadf2021-06-09 22:19:04 +0530446 /* D3Hot and D3Cold for TCSS */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530447 s_cfg->D3HotEnable = !config->tcss_d3_hot_disable;
448 s_cfg->D3ColdEnable = !config->tcss_d3_cold_disable;
Bernardo Perez Priego421ce562021-06-09 09:40:31 -0700449
450 s_cfg->UsbTcPortEn = 0;
451 for (int i = 0; i < MAX_TYPE_C_PORTS; i++) {
Furquan Shaikheafca1f2021-09-22 13:59:39 -0700452 if (is_dev_enabled(tcss_port_arr[i]))
Bernardo Perez Priego421ce562021-06-09 09:40:31 -0700453 s_cfg->UsbTcPortEn |= BIT(i);
454 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530455}
456
457static void fill_fsps_chipset_lockdown_params(FSP_S_CONFIG *s_cfg,
458 const struct soc_intel_alderlake_config *config)
459{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530460 /* Chipset Lockdown */
Felix Singerf9d7dc72021-05-03 02:33:15 +0200461 const bool lockdown_by_fsp = get_lockdown_config() == CHIPSET_LOCKDOWN_FSP;
462 s_cfg->PchLockDownGlobalSmi = lockdown_by_fsp;
463 s_cfg->PchLockDownBiosInterface = lockdown_by_fsp;
Subrata Banik393b0932022-01-11 11:59:39 +0530464 s_cfg->PchUnlockGpioPads = lockdown_by_fsp;
Felix Singerf9d7dc72021-05-03 02:33:15 +0200465 s_cfg->RtcMemoryLock = lockdown_by_fsp;
Tim Wawrzynczak091dfa12021-08-24 09:32:09 -0600466 s_cfg->SkipPamLock = !lockdown_by_fsp;
Tim Wawrzynczakc0e82e72021-06-17 12:42:35 -0600467
468 /* coreboot will send EOP before loading payload */
469 s_cfg->EndOfPostMessage = EOP_DISABLE;
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_xhci_params(FSP_S_CONFIG *s_cfg,
473 const struct soc_intel_alderlake_config *config)
474{
475 int i;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530476 /* USB */
477 for (i = 0; i < ARRAY_SIZE(config->usb2_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530478 s_cfg->PortUsb20Enable[i] = config->usb2_ports[i].enable;
479 s_cfg->Usb2PhyPetxiset[i] = config->usb2_ports[i].pre_emp_bias;
480 s_cfg->Usb2PhyTxiset[i] = config->usb2_ports[i].tx_bias;
481 s_cfg->Usb2PhyPredeemp[i] = config->usb2_ports[i].tx_emp_enable;
482 s_cfg->Usb2PhyPehalfbit[i] = config->usb2_ports[i].pre_emp_bit;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530483
484 if (config->usb2_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530485 s_cfg->Usb2OverCurrentPin[i] = config->usb2_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530486 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530487 s_cfg->Usb2OverCurrentPin[i] = OC_SKIP;
Anil Kumarc6b65c12022-02-01 12:59:03 -0800488
489 if (config->usb2_ports[i].type_c)
490 s_cfg->PortResetMessageEnable[i] = 1;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530491 }
492
493 for (i = 0; i < ARRAY_SIZE(config->usb3_ports); i++) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530494 s_cfg->PortUsb30Enable[i] = config->usb3_ports[i].enable;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530495 if (config->usb3_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530496 s_cfg->Usb3OverCurrentPin[i] = config->usb3_ports[i].ocpin;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530497 else
Subrata Banikc0983c92021-06-15 13:02:01 +0530498 s_cfg->Usb3OverCurrentPin[i] = OC_SKIP;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530499
500 if (config->usb3_ports[i].tx_de_emp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530501 s_cfg->Usb3HsioTxDeEmphEnable[i] = 1;
502 s_cfg->Usb3HsioTxDeEmph[i] = config->usb3_ports[i].tx_de_emp;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530503 }
504 if (config->usb3_ports[i].tx_downscale_amp) {
Subrata Banikc0983c92021-06-15 13:02:01 +0530505 s_cfg->Usb3HsioTxDownscaleAmpEnable[i] = 1;
506 s_cfg->Usb3HsioTxDownscaleAmp[i] =
Subrata Banik2871e0e2020-09-27 11:30:58 +0530507 config->usb3_ports[i].tx_downscale_amp;
508 }
509 }
510
Maulik V Vaghela69353502021-04-14 14:01:02 +0530511 for (i = 0; i < ARRAY_SIZE(config->tcss_ports); i++) {
512 if (config->tcss_ports[i].enable)
Subrata Banikc0983c92021-06-15 13:02:01 +0530513 s_cfg->CpuUsb3OverCurrentPin[i] = config->tcss_ports[i].ocpin;
Maulik V Vaghela69353502021-04-14 14:01:02 +0530514 }
Sridhar Siricilla37c33052022-04-02 10:33:00 +0530515
516 s_cfg->PmcUsb2PhySusPgEnable = !config->usb2_phy_sus_pg_disable;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530517}
Maulik V Vaghela69353502021-04-14 14:01:02 +0530518
Subrata Banikb03cadf2021-06-09 22:19:04 +0530519static void fill_fsps_xdci_params(FSP_S_CONFIG *s_cfg,
520 const struct soc_intel_alderlake_config *config)
521{
Angel Ponsc7cfe0b2021-06-23 12:39:22 +0200522 s_cfg->XdciEnable = xdci_can_enable(PCH_DEVFN_USBOTG);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530523}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530524
Subrata Banikb03cadf2021-06-09 22:19:04 +0530525static void fill_fsps_uart_params(FSP_S_CONFIG *s_cfg,
526 const struct soc_intel_alderlake_config *config)
527{
Subrata Banik88381c92022-03-29 11:26:11 +0530528 if (CONFIG(FSP_USES_CB_DEBUG_EVENT_HANDLER) && CONFIG(CONSOLE_SERIAL) &&
529 CONFIG(FSP_ENABLE_SERIAL_DEBUG))
530 s_cfg->FspEventHandler = (UINT32)((FSP_EVENT_HANDLER *)
531 fsp_debug_event_handler);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530532 /* PCH UART selection for FSP Debug */
Subrata Banikc0983c92021-06-15 13:02:01 +0530533 s_cfg->SerialIoDebugUartNumber = CONFIG_UART_FOR_CONSOLE;
534 ASSERT(ARRAY_SIZE(s_cfg->SerialIoUartAutoFlow) > CONFIG_UART_FOR_CONSOLE);
535 s_cfg->SerialIoUartAutoFlow[CONFIG_UART_FOR_CONSOLE] = 0;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530536}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530537
Subrata Banikb03cadf2021-06-09 22:19:04 +0530538static void fill_fsps_sata_params(FSP_S_CONFIG *s_cfg,
539 const struct soc_intel_alderlake_config *config)
540{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530541 /* SATA */
Subrata Banikc0983c92021-06-15 13:02:01 +0530542 s_cfg->SataEnable = is_devfn_enabled(PCH_DEVFN_SATA);
543 if (s_cfg->SataEnable) {
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530544 s_cfg->SataMode = config->sata_mode;
545 s_cfg->SataSalpSupport = config->sata_salp_support;
546 memcpy(s_cfg->SataPortsEnable, config->sata_ports_enable,
Subrata Banikc0983c92021-06-15 13:02:01 +0530547 sizeof(s_cfg->SataPortsEnable));
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530548 memcpy(s_cfg->SataPortsDevSlp, config->sata_ports_dev_slp,
Subrata Banikc0983c92021-06-15 13:02:01 +0530549 sizeof(s_cfg->SataPortsDevSlp));
Subrata Banik2871e0e2020-09-27 11:30:58 +0530550 }
551
552 /*
Subrata Banikb03cadf2021-06-09 22:19:04 +0530553 * Power Optimizer for SATA.
554 * SataPwrOptimizeDisable is default to 0.
Subrata Banik2871e0e2020-09-27 11:30:58 +0530555 * Boards not needing the optimizers explicitly disables them by setting
556 * these disable variables to 1 in devicetree overrides.
557 */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530558 s_cfg->SataPwrOptEnable = !(config->sata_pwr_optimize_disable);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530559 /*
560 * Enable DEVSLP Idle Timeout settings DmVal and DitoVal.
561 * SataPortsDmVal is the DITO multiplier. Default is 15.
562 * SataPortsDitoVal is the DEVSLP Idle Timeout (DITO), Default is 625ms.
563 * The default values can be changed from devicetree.
564 */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530565 for (size_t i = 0; i < ARRAY_SIZE(config->sata_ports_enable_dito_config); i++) {
566 if (config->sata_ports_enable_dito_config[i]) {
567 s_cfg->SataPortsDmVal[i] = config->sata_ports_dm_val[i];
568 s_cfg->SataPortsDitoVal[i] = config->sata_ports_dito_val[i];
Subrata Banik2871e0e2020-09-27 11:30:58 +0530569 }
570 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530571}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530572
Subrata Banikb03cadf2021-06-09 22:19:04 +0530573static void fill_fsps_thermal_params(FSP_S_CONFIG *s_cfg,
574 const struct soc_intel_alderlake_config *config)
575{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530576 /* Enable TCPU for processor thermal control */
Subrata Banikc0983c92021-06-15 13:02:01 +0530577 s_cfg->Device4Enable = is_devfn_enabled(SA_DEVFN_DPTF);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530578
579 /* Set TccActivationOffset */
Subrata Banikc0983c92021-06-15 13:02:01 +0530580 s_cfg->TccActivationOffset = config->tcc_offset;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530581}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530582
Subrata Banikb03cadf2021-06-09 22:19:04 +0530583static void fill_fsps_lan_params(FSP_S_CONFIG *s_cfg,
584 const struct soc_intel_alderlake_config *config)
585{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530586 /* LAN */
Subrata Banikc0983c92021-06-15 13:02:01 +0530587 s_cfg->PchLanEnable = is_devfn_enabled(PCH_DEVFN_GBE);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530588}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530589
Subrata Banikb03cadf2021-06-09 22:19:04 +0530590static void fill_fsps_cnvi_params(FSP_S_CONFIG *s_cfg,
591 const struct soc_intel_alderlake_config *config)
592{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530593 /* CNVi */
Subrata Banikc0983c92021-06-15 13:02:01 +0530594 s_cfg->CnviMode = is_devfn_enabled(PCH_DEVFN_CNVI_WIFI);
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530595 s_cfg->CnviBtCore = config->cnvi_bt_core;
596 s_cfg->CnviBtAudioOffload = config->cnvi_bt_audio_offload;
Cliff Huangbc1941f2021-02-10 17:41:41 -0800597 /* Assert if CNVi BT is enabled without CNVi being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530598 assert(s_cfg->CnviMode || !s_cfg->CnviBtCore);
Cliff Huangbc1941f2021-02-10 17:41:41 -0800599 /* Assert if CNVi BT offload is enabled without CNVi BT being enabled. */
Subrata Banikc0983c92021-06-15 13:02:01 +0530600 assert(s_cfg->CnviBtCore || !s_cfg->CnviBtAudioOffload);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530601}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530602
Subrata Banikb03cadf2021-06-09 22:19:04 +0530603static void fill_fsps_vmd_params(FSP_S_CONFIG *s_cfg,
604 const struct soc_intel_alderlake_config *config)
605{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530606 /* VMD */
Subrata Banikc0983c92021-06-15 13:02:01 +0530607 s_cfg->VmdEnable = is_devfn_enabled(SA_DEVFN_VMD);
Subrata Banikb03cadf2021-06-09 22:19:04 +0530608}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530609
Subrata Banikb03cadf2021-06-09 22:19:04 +0530610static void fill_fsps_thc_params(FSP_S_CONFIG *s_cfg,
611 const struct soc_intel_alderlake_config *config)
612{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530613 /* THC */
Subrata Banikc0983c92021-06-15 13:02:01 +0530614 s_cfg->ThcPort0Assignment = is_devfn_enabled(PCH_DEVFN_THC0) ? THC_0 : THC_NONE;
615 s_cfg->ThcPort1Assignment = is_devfn_enabled(PCH_DEVFN_THC1) ? THC_1 : THC_NONE;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530616}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530617
Subrata Banikb03cadf2021-06-09 22:19:04 +0530618static void fill_fsps_tbt_params(FSP_S_CONFIG *s_cfg,
619 const struct soc_intel_alderlake_config *config)
620{
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700621 /* USB4/TBT */
Subrata Banikb03cadf2021-06-09 22:19:04 +0530622 for (int i = 0; i < ARRAY_SIZE(s_cfg->ITbtPcieRootPortEn); i++)
Subrata Banikc0983c92021-06-15 13:02:01 +0530623 s_cfg->ITbtPcieRootPortEn[i] = is_devfn_enabled(SA_DEVFN_TBT(i));
Subrata Banikb03cadf2021-06-09 22:19:04 +0530624}
Bernardo Perez Priego095f97b2021-05-18 18:39:19 -0700625
Subrata Banikb03cadf2021-06-09 22:19:04 +0530626static void fill_fsps_8254_params(FSP_S_CONFIG *s_cfg,
627 const struct soc_intel_alderlake_config *config)
628{
Subrata Banik2871e0e2020-09-27 11:30:58 +0530629 /* Legacy 8254 timer support */
Sean Rhodesbc35bed2021-07-13 13:36:28 +0100630 bool use_8254 = get_uint_option("legacy_8254_timer", CONFIG(USE_LEGACY_8254_TIMER));
631 s_cfg->Enable8254ClockGating = !use_8254;
632 s_cfg->Enable8254ClockGatingOnS3 = !use_8254;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530633}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530634
Michael Niewöhner0e905802021-09-25 00:10:30 +0200635static void fill_fsps_pm_timer_params(FSP_S_CONFIG *s_cfg,
636 const struct soc_intel_alderlake_config *config)
637{
638 /*
639 * Legacy PM ACPI Timer (and TCO Timer)
640 * This *must* be 1 in any case to keep FSP from
641 * 1) enabling PM ACPI Timer emulation in uCode.
642 * 2) disabling the PM ACPI Timer.
643 * We handle both by ourself!
644 */
645 s_cfg->EnableTcoTimer = 1;
646}
647
Subrata Banikb03cadf2021-06-09 22:19:04 +0530648static void fill_fsps_storage_params(FSP_S_CONFIG *s_cfg,
649 const struct soc_intel_alderlake_config *config)
650{
Krishna Prasad Bhata6d642f2022-01-16 23:16:24 +0530651#if CONFIG(SOC_INTEL_ALDERLAKE_PCH_N)
652 /* eMMC Configuration */
653 s_cfg->ScsEmmcEnabled = is_devfn_enabled(PCH_DEVFN_EMMC);
654 if (s_cfg->ScsEmmcEnabled)
655 s_cfg->ScsEmmcHs400Enabled = config->emmc_enable_hs400_mode;
656#endif
Meera Ravindranathd8ea3602022-03-16 15:27:00 +0530657
658 /* UFS Configuration */
659 s_cfg->UfsEnable[0] = 0; /* UFS Controller 0 is fuse disabled */
660 s_cfg->UfsEnable[1] = is_devfn_enabled(PCH_DEVFN_UFS);
661
Subrata Banik2871e0e2020-09-27 11:30:58 +0530662 /* Enable Hybrid storage auto detection */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530663 s_cfg->HybridStorageMode = config->hybrid_storage_mode;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530664}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530665
Subrata Banikb03cadf2021-06-09 22:19:04 +0530666static void fill_fsps_pcie_params(FSP_S_CONFIG *s_cfg,
667 const struct soc_intel_alderlake_config *config)
668{
669 uint32_t enable_mask = pcie_rp_enable_mask(get_pch_pcie_rp_table());
670 for (int i = 0; i < CONFIG_MAX_PCH_ROOT_PORTS; i++) {
Eric Lai5b302b22020-12-05 16:49:43 +0800671 if (!(enable_mask & BIT(i)))
672 continue;
673 const struct pcie_rp_config *rp_cfg = &config->pch_pcie_rp[i];
Subrata Banikc0983c92021-06-15 13:02:01 +0530674 s_cfg->PcieRpL1Substates[i] =
Eric Lai5b302b22020-12-05 16:49:43 +0800675 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
Subrata Banikc0983c92021-06-15 13:02:01 +0530676 s_cfg->PcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
677 s_cfg->PcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
678 s_cfg->PcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
679 s_cfg->PcieRpClkReqDetect[i] = !!(rp_cfg->flags & PCIE_RP_CLK_REQ_DETECT);
Kevin Chang6e52c1d2022-03-18 21:04:07 +0800680 if (rp_cfg->pcie_rp_aspm)
681 s_cfg->PcieRpAspm[i] = get_aspm_control(rp_cfg->pcie_rp_aspm);
Cliff Huang61a442ec2022-04-28 18:06:54 -0700682 /* PcieRpSlotImplemented default to 1 (slot implemented) in FSP; 0: built-in */
683 if (!!(rp_cfg->flags & PCIE_RP_BUILT_IN))
684 s_cfg->PcieRpSlotImplemented[i] = 0;
685 s_cfg->PcieRpDetectTimeoutMs[i] = rp_cfg->pcie_rp_detect_timeout_ms;
Subrata Banik2871e0e2020-09-27 11:30:58 +0530686 }
Subrata Banikb03cadf2021-06-09 22:19:04 +0530687}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530688
Tim Wawrzynczakf9440522021-12-16 15:07:15 -0700689static void fill_fsps_cpu_pcie_params(FSP_S_CONFIG *s_cfg,
690 const struct soc_intel_alderlake_config *config)
691{
692 if (!CONFIG_MAX_CPU_ROOT_PORTS)
693 return;
694
695 const uint32_t enable_mask = pcie_rp_enable_mask(get_cpu_pcie_rp_table());
696 for (int i = 0; i < CONFIG_MAX_CPU_ROOT_PORTS; i++) {
697 if (!(enable_mask & BIT(i)))
698 continue;
699
700 const struct pcie_rp_config *rp_cfg = &config->cpu_pcie_rp[i];
701 s_cfg->CpuPcieRpL1Substates[i] =
702 get_l1_substate_control(rp_cfg->PcieRpL1Substates);
703 s_cfg->CpuPcieRpLtrEnable[i] = !!(rp_cfg->flags & PCIE_RP_LTR);
704 s_cfg->CpuPcieRpAdvancedErrorReporting[i] = !!(rp_cfg->flags & PCIE_RP_AER);
705 s_cfg->CpuPcieRpHotPlug[i] = !!(rp_cfg->flags & PCIE_RP_HOTPLUG);
706 s_cfg->PtmEnabled[i] = 0;
707 }
708}
709
Subrata Banikb03cadf2021-06-09 22:19:04 +0530710static void fill_fsps_misc_power_params(FSP_S_CONFIG *s_cfg,
711 const struct soc_intel_alderlake_config *config)
712{
Subrata Banikd6da4ef2021-10-07 00:39:31 +0530713 /* Skip setting D0I3 bit for all HECI devices */
714 s_cfg->DisableD0I3SettingForHeci = 1;
Subrata Banikb03cadf2021-06-09 22:19:04 +0530715 /*
716 * Power Optimizer for DMI
717 * DmiPwrOptimizeDisable is default to 0.
718 * Boards not needing the optimizers explicitly disables them by setting
719 * these disable variables to 1 in devicetree overrides.
720 */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530721 s_cfg->PchPwrOptEnable = !(config->dmi_power_optimize_disable);
Subrata Banikc0983c92021-06-15 13:02:01 +0530722 s_cfg->PmSupport = 1;
723 s_cfg->Hwp = 1;
724 s_cfg->Cx = 1;
725 s_cfg->PsOnEnable = 1;
V Sowmya844dcb32021-06-21 10:03:53 +0530726 /* Enable the energy efficient turbo mode */
727 s_cfg->EnergyEfficientTurbo = 1;
V Sowmyaaf429062021-06-21 10:23:33 +0530728 s_cfg->PkgCStateLimit = LIMIT_AUTO;
V Sowmya458708f2021-07-09 22:11:04 +0530729
730 /* VccIn Aux Imon IccMax. Values are in 1/4 Amp increments and range is 0-512. */
731 s_cfg->VccInAuxImonIccImax = get_vccin_aux_imon_iccmax() * 4 / MILLIAMPS_TO_AMPS;
V Sowmyac6d71662021-07-15 08:11:08 +0530732
733 /* VrConfig Settings for IA and GT domains */
734 for (size_t i = 0; i < ARRAY_SIZE(config->domain_vr_config); i++)
735 fill_vr_domain_config(s_cfg, i, &config->domain_vr_config[i]);
Tim Wawrzynczake2b8f302021-07-19 15:35:47 -0600736
Nick Vaccaro577afe62022-01-12 12:03:41 -0800737 s_cfg->PmcLpmS0ixSubStateEnableMask = get_supported_lpm_mask();
Tim Wawrzynczakab0e0812021-09-21 10:28:16 -0600738
739 /* Apply minimum assertion width settings */
740 if (config->pch_slp_s3_min_assertion_width == SLP_S3_ASSERTION_DEFAULT)
741 s_cfg->PchPmSlpS3MinAssert = SLP_S3_ASSERTION_50_MS;
742 else
743 s_cfg->PchPmSlpS3MinAssert = config->pch_slp_s3_min_assertion_width;
744
745 if (config->pch_slp_s4_min_assertion_width == SLP_S4_ASSERTION_DEFAULT)
746 s_cfg->PchPmSlpS4MinAssert = SLP_S4_ASSERTION_1S;
747 else
748 s_cfg->PchPmSlpS4MinAssert = config->pch_slp_s4_min_assertion_width;
749
750 if (config->pch_slp_sus_min_assertion_width == SLP_SUS_ASSERTION_DEFAULT)
751 s_cfg->PchPmSlpSusMinAssert = SLP_SUS_ASSERTION_4_S;
752 else
753 s_cfg->PchPmSlpSusMinAssert = config->pch_slp_sus_min_assertion_width;
754
755 if (config->pch_slp_a_min_assertion_width == SLP_A_ASSERTION_DEFAULT)
756 s_cfg->PchPmSlpAMinAssert = SLP_A_ASSERTION_2_S;
757 else
758 s_cfg->PchPmSlpAMinAssert = config->pch_slp_a_min_assertion_width;
759
760 unsigned int power_cycle_duration = config->pch_reset_power_cycle_duration;
761 if (power_cycle_duration == POWER_CYCLE_DURATION_DEFAULT)
762 power_cycle_duration = POWER_CYCLE_DURATION_4S;
763
764 s_cfg->PchPmPwrCycDur = get_pm_pwr_cyc_dur(s_cfg->PchPmSlpS4MinAssert,
765 s_cfg->PchPmSlpS3MinAssert,
766 s_cfg->PchPmSlpAMinAssert,
767 power_cycle_duration);
Ryan Lin4a48dbe2021-09-28 15:59:34 +0800768
769 /* Set PsysPmax if it is available from DT */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530770 if (config->platform_pmax) {
771 printk(BIOS_DEBUG, "PsysPmax = %dW\n", config->platform_pmax);
Ryan Lin4a48dbe2021-09-28 15:59:34 +0800772 /* PsysPmax is in unit of 1/8 Watt */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530773 s_cfg->PsysPmax = config->platform_pmax * 8;
Ryan Lin4a48dbe2021-09-28 15:59:34 +0800774 }
MAULIK V VAGHELA99356382022-03-03 13:07:57 +0530775
776 s_cfg->C1StateAutoDemotion = !config->disable_c1_state_auto_demotion;
Lean Sheng Tan4b45d4c2022-04-01 19:01:59 +0200777
778 s_cfg->VrPowerDeliveryDesign = config->vr_power_delivery_design;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530779}
Subrata Banik2871e0e2020-09-27 11:30:58 +0530780
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600781static void fill_fsps_irq_params(FSP_S_CONFIG *s_cfg,
782 const struct soc_intel_alderlake_config *config)
783{
784 if (!assign_pci_irqs(irq_constraints, ARRAY_SIZE(irq_constraints)))
785 die("ERROR: Unable to assign PCI IRQs, and no _PRT table available\n");
786
787 size_t pch_count = 0;
788 const SI_PCH_DEVICE_INTERRUPT_CONFIG *upd_irqs = pci_irq_to_fsp(&pch_count);
789
790 s_cfg->DevIntConfigPtr = (UINT32)((uintptr_t)upd_irqs);
791 s_cfg->NumOfDevIntConfig = pch_count;
792 printk(BIOS_INFO, "IRQ: Using dynamically assigned PCI IO-APIC IRQs\n");
793}
794
V Sowmya418d37e2021-06-21 08:47:17 +0530795static void fill_fsps_fivr_params(FSP_S_CONFIG *s_cfg,
796 const struct soc_intel_alderlake_config *config)
797{
798 /* PCH FIVR settings override */
799 if (!config->ext_fivr_settings.configure_ext_fivr)
800 return;
801
802 s_cfg->PchFivrExtV1p05RailEnabledStates =
803 config->ext_fivr_settings.v1p05_enable_bitmap;
804
805 s_cfg->PchFivrExtV1p05RailSupportedVoltageStates =
806 config->ext_fivr_settings.v1p05_supported_voltage_bitmap;
807
808 s_cfg->PchFivrExtVnnRailEnabledStates =
809 config->ext_fivr_settings.vnn_enable_bitmap;
810
811 s_cfg->PchFivrExtVnnRailSupportedVoltageStates =
812 config->ext_fivr_settings.vnn_supported_voltage_bitmap;
813
814 s_cfg->PchFivrExtVnnRailSxEnabledStates =
Bora Guvendikfbf874f2021-10-18 14:17:41 -0700815 config->ext_fivr_settings.vnn_sx_enable_bitmap;
V Sowmya418d37e2021-06-21 08:47:17 +0530816
817 /* Convert the voltages to increments of 2.5mv */
818 s_cfg->PchFivrExtV1p05RailVoltage =
819 (config->ext_fivr_settings.v1p05_voltage_mv * 10) / 25;
820
821 s_cfg->PchFivrExtVnnRailVoltage =
822 (config->ext_fivr_settings.vnn_voltage_mv * 10) / 25;
823
824 s_cfg->PchFivrExtVnnRailSxVoltage =
825 (config->ext_fivr_settings.vnn_sx_voltage_mv * 10 / 25);
826
827 s_cfg->PchFivrExtV1p05RailIccMaximum =
828 config->ext_fivr_settings.v1p05_icc_max_ma;
829
830 s_cfg->PchFivrExtVnnRailIccMaximum =
831 config->ext_fivr_settings.vnn_icc_max_ma;
832}
833
Wisley Chend0cef2a2021-11-01 16:13:55 +0600834static void fill_fsps_fivr_rfi_params(FSP_S_CONFIG *s_cfg,
835 const struct soc_intel_alderlake_config *config)
836{
837 /* transform from Hz to 100 KHz */
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530838 s_cfg->FivrRfiFrequency = config->fivr_rfi_frequency / (100 * KHz);
839 s_cfg->FivrSpreadSpectrum = config->fivr_spread_spectrum;
Wisley Chend0cef2a2021-11-01 16:13:55 +0600840}
841
Wisley Chenc5103462021-11-04 18:12:58 +0600842static void fill_fsps_acoustic_params(FSP_S_CONFIG *s_cfg,
843 const struct soc_intel_alderlake_config *config)
844{
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530845 s_cfg->AcousticNoiseMitigation = config->acoustic_noise_mitigation;
Wisley Chenc5103462021-11-04 18:12:58 +0600846
847 if (s_cfg->AcousticNoiseMitigation) {
leo.chouaef916a2022-05-13 10:41:03 +0800848 s_cfg->PreWake = config->PreWake;
Wisley Chenc5103462021-11-04 18:12:58 +0600849 for (int i = 0; i < NUM_VR_DOMAINS; i++) {
MAULIK V VAGHELA215a97e2022-03-07 18:39:17 +0530850 s_cfg->FastPkgCRampDisable[i] = config->fast_pkg_c_ramp_disable[i];
851 s_cfg->SlowSlewRate[i] = config->slow_slew_rate[i];
Wisley Chenc5103462021-11-04 18:12:58 +0600852 }
853 }
854}
855
Subrata Banikb03cadf2021-06-09 22:19:04 +0530856static void soc_silicon_init_params(FSP_S_CONFIG *s_cfg,
857 struct soc_intel_alderlake_config *config)
858{
859 /* Override settings per board if required. */
860 mainboard_update_soc_chip_config(config);
861
Arthur Heymans02967e62022-02-18 13:22:25 +0100862 void (*const fill_fsps_params[])(FSP_S_CONFIG *s_cfg,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530863 const struct soc_intel_alderlake_config *config) = {
864 fill_fsps_lpss_params,
865 fill_fsps_cpu_params,
866 fill_fsps_igd_params,
867 fill_fsps_tcss_params,
868 fill_fsps_chipset_lockdown_params,
869 fill_fsps_xhci_params,
870 fill_fsps_xdci_params,
871 fill_fsps_uart_params,
872 fill_fsps_sata_params,
873 fill_fsps_thermal_params,
874 fill_fsps_lan_params,
875 fill_fsps_cnvi_params,
876 fill_fsps_vmd_params,
877 fill_fsps_thc_params,
878 fill_fsps_tbt_params,
879 fill_fsps_8254_params,
Michael Niewöhner0e905802021-09-25 00:10:30 +0200880 fill_fsps_pm_timer_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530881 fill_fsps_storage_params,
882 fill_fsps_pcie_params,
Tim Wawrzynczakf9440522021-12-16 15:07:15 -0700883 fill_fsps_cpu_pcie_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530884 fill_fsps_misc_power_params,
Tim Wawrzynczak43607e42021-05-18 09:04:42 -0600885 fill_fsps_irq_params,
V Sowmya418d37e2021-06-21 08:47:17 +0530886 fill_fsps_fivr_params,
Wisley Chend0cef2a2021-11-01 16:13:55 +0600887 fill_fsps_fivr_rfi_params,
Wisley Chenc5103462021-11-04 18:12:58 +0600888 fill_fsps_acoustic_params,
Subrata Banikb03cadf2021-06-09 22:19:04 +0530889 };
890
891 for (size_t i = 0; i < ARRAY_SIZE(fill_fsps_params); i++)
892 fill_fsps_params[i](s_cfg, config);
893}
894
Subrata Banik6f1cb402021-06-09 22:11:12 +0530895/* UPD parameters to be initialized before SiliconInit */
896void platform_fsp_silicon_init_params_cb(FSPS_UPD *supd)
897{
898 struct soc_intel_alderlake_config *config;
Subrata Banikc0983c92021-06-15 13:02:01 +0530899 FSP_S_CONFIG *s_cfg = &supd->FspsConfig;
Subrata Banik6f1cb402021-06-09 22:11:12 +0530900
901 config = config_of_soc();
Subrata Banikc0983c92021-06-15 13:02:01 +0530902 soc_silicon_init_params(s_cfg, config);
903 mainboard_silicon_init_params(s_cfg);
Subrata Banik2871e0e2020-09-27 11:30:58 +0530904}
905
Subrata Banik2871e0e2020-09-27 11:30:58 +0530906/*
907 * Callbacks for SoC/Mainboard specific overrides for FspMultiPhaseSiInit
908 * This platform supports below MultiPhaseSIInit Phase(s):
909 * Phase | FSP return point | Purpose
910 * ------- + ------------------------------------------------ + -------------------------------
911 * 1 | After TCSS initialization completed | for TCSS specific init
912 */
913void platform_fsp_multi_phase_init_cb(uint32_t phase_index)
914{
915 switch (phase_index) {
916 case 1:
917 /* TCSS specific initialization here */
Deepti Deshatty8e7facf2021-05-12 17:45:37 +0530918 printk(BIOS_DEBUG, "FSP MultiPhaseSiInit %s/%s called\n",
919 __FILE__, __func__);
920
921 if (CONFIG(SOC_INTEL_COMMON_BLOCK_TCSS)) {
922 const config_t *config = config_of_soc();
923 tcss_configure(config->typec_aux_bias_pads);
924 }
Subrata Banik2871e0e2020-09-27 11:30:58 +0530925 break;
926 default:
927 break;
928 }
929}
930
931/* Mainboard GPIO Configuration */
Subrata Banikc0983c92021-06-15 13:02:01 +0530932__weak void mainboard_silicon_init_params(FSP_S_CONFIG *s_cfg)
Subrata Banik2871e0e2020-09-27 11:30:58 +0530933{
934 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
935}