blob: fb179e65dcfe6617e492ba04123a1aafe17ffddd [file] [log] [blame]
Martin Roth433659a2014-05-12 21:55:00 -06001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2013-2014 Sage Electronic Engineering, LLC.
York Yangf226a4d2015-07-07 11:09:02 -07005 * Copyright (C) 2014-2015 Intel Corporation
Martin Roth433659a2014-05-12 21:55:00 -06006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
Martin Roth433659a2014-05-12 21:55:00 -060015 */
16
17#include <types.h>
18#include <string.h>
Martin Roth433659a2014-05-12 21:55:00 -060019#include <console/console.h>
20#include <bootstate.h>
21#include <cbmem.h>
22#include <device/device.h>
23#include <device/pci_def.h>
Ben Gardnerfa6014a2015-12-08 21:20:25 -060024#include <soc/pci_devs.h>
Marc Jones78687972015-04-22 23:16:31 -060025#include <drivers/intel/fsp1_0/fsp_util.h>
Martin Roth433659a2014-05-12 21:55:00 -060026#include "../chip.h"
Mohan D'Costaed0c8382014-09-18 15:57:06 +090027#include <arch/io.h>
Ben Gardnerfa6014a2015-12-08 21:20:25 -060028#include <soc/reset.h>
29#include <soc/pmc.h>
30#include <soc/acpi.h>
31#include <soc/iomap.h>
32#include <soc/smm.h>
Martin Roth433659a2014-05-12 21:55:00 -060033
34#ifdef __PRE_RAM__
Ben Gardnerfa6014a2015-12-08 21:20:25 -060035#include <soc/romstage.h>
Martin Roth433659a2014-05-12 21:55:00 -060036#endif
37
38#ifdef __PRE_RAM__
39
40/* Copy the default UPD region and settings to a buffer for modification */
41static void GetUpdDefaultFromFsp (FSP_INFO_HEADER *FspInfo, UPD_DATA_REGION *UpdData)
42{
43 VPD_DATA_REGION *VpdDataRgnPtr;
44 UPD_DATA_REGION *UpdDataRgnPtr;
45 VpdDataRgnPtr = (VPD_DATA_REGION *)(UINT32)(FspInfo->CfgRegionOffset + FspInfo->ImageBase);
46 UpdDataRgnPtr = (UPD_DATA_REGION *)(UINT32)(VpdDataRgnPtr->PcdUpdRegionOffset + FspInfo->ImageBase);
47 memcpy((void*)UpdData, (void*)UpdDataRgnPtr, sizeof(UPD_DATA_REGION));
48}
49
50/* default to just enabling HDMI audio */
51const PCH_AZALIA_CONFIG mAzaliaConfig = {
52 .Pme = 1,
53 .DS = 1,
54 .DA = 0,
55 .HdmiCodec = 1,
56 .AzaliaVCi = 1,
57 .Rsvdbits = 0,
58 .AzaliaVerbTableNum = 0,
59 .AzaliaVerbTable = NULL,
60 .ResetWaitTimer = 300
61};
62
63typedef struct soc_intel_fsp_baytrail_config config_t;
64
Martin Roth12d86e72014-11-16 20:53:14 -070065static const char *acpi_pci_mode_strings[] = {
66 "Disabled",
67 "Enabled in PCI Mode",
68 "Enabled in ACPI Mode"
69};
70
71static const char *emmc_mode_strings[] = {
72 "Disabled",
73 "Auto",
74 "eMMC 4.1",
75 "eMMC 4.5"
76};
77
Martin Roth433659a2014-05-12 21:55:00 -060078/**
79 * Update the UPD data based on values from devicetree.cb
80 *
81 * @param UpdData Pointer to the UPD Data structure
82 */
York Yangfc1c1b52014-11-04 17:04:37 -070083static void ConfigureDefaultUpdData(FSP_INFO_HEADER *FspInfo, UPD_DATA_REGION *UpdData)
Martin Roth433659a2014-05-12 21:55:00 -060084{
85 ROMSTAGE_CONST struct device *dev;
86 ROMSTAGE_CONST config_t *config;
Martin Rothbdfe98f2014-11-18 19:52:46 -070087 printk(FSP_INFO_LEVEL, "Configure Default UPD Data\n");
Martin Roth433659a2014-05-12 21:55:00 -060088
89 dev = dev_find_slot(0, SOC_DEV_FUNC);
90 config = dev->chip_info;
91
92 /* Set up default verb tables - Just HDMI audio */
93 UpdData->AzaliaConfigPtr = (UINT32)&mAzaliaConfig;
94
95 /* Set SPD addresses */
Martin Roth8d936ce2014-11-16 20:07:16 -070096 UPD_SPD_CHECK(PcdMrcInitSPDAddr1);
97 UPD_SPD_CHECK(PcdMrcInitSPDAddr2);
Martin Roth433659a2014-05-12 21:55:00 -060098
Martin Rothe8d19012014-11-16 20:06:23 -070099 UPD_DEFAULT_CHECK(PcdSataMode);
100 UPD_DEFAULT_CHECK(PcdLpssSioEnablePciMode);
101 UPD_DEFAULT_CHECK(PcdMrcInitMmioSize);
102 UPD_DEFAULT_CHECK(PcdIgdDvmt50PreAlloc);
103 UPD_DEFAULT_CHECK(PcdApertureSize);
104 UPD_DEFAULT_CHECK(PcdGttSize);
105 UPD_DEFAULT_CHECK(SerialDebugPortAddress);
106 UPD_DEFAULT_CHECK(SerialDebugPortType);
107 UPD_DEFAULT_CHECK(PcdMrcDebugMsg);
108 UPD_DEFAULT_CHECK(PcdSccEnablePciMode);
109 UPD_DEFAULT_CHECK(IgdRenderStandby);
110 UPD_DEFAULT_CHECK(TxeUmaEnable);
York Yangf226a4d2015-07-07 11:09:02 -0700111 UPD_DEFAULT_CHECK(PcdOsSelection);
112 UPD_DEFAULT_CHECK(PcdEMMC45DDR50Enabled);
113 UPD_DEFAULT_CHECK(PcdEMMC45HS200Enabled);
114 UPD_DEFAULT_CHECK(PcdEMMC45RetuneTimerValue);
115 UPD_DEFAULT_CHECK(PcdEnableIgd);
Ben Gardner39686532016-01-14 17:15:37 -0600116 UPD_DEFAULT_CHECK(AutoSelfRefreshEnable);
117 UPD_DEFAULT_CHECK(APTaskTimeoutCnt);
Martin Roth433659a2014-05-12 21:55:00 -0600118
Martin Rothe55a7c52014-11-16 17:09:15 -0700119 if ((config->PcdeMMCBootMode != EMMC_USE_DEFAULT) ||
120 (config->PcdeMMCBootMode != EMMC_FOLLOWS_DEVICETREE))
121 UpdData->PcdeMMCBootMode = config->PcdeMMCBootMode;
Martin Roth433659a2014-05-12 21:55:00 -0600122
Martin Roth30eda3e2014-11-16 20:28:57 -0700123 UpdData->PcdMrcInitTsegSize = smm_region_size() >> 20;
Martin Rothe8d19012014-11-16 20:06:23 -0700124
Martin Rothbdfe98f2014-11-18 19:52:46 -0700125 printk(FSP_INFO_LEVEL, "GTT Size:\t\t%d MB\n", UpdData->PcdGttSize);
126 printk(FSP_INFO_LEVEL, "Tseg Size:\t\t%d MB\n", UpdData->PcdMrcInitTsegSize);
127 printk(FSP_INFO_LEVEL, "Aperture Size:\t\t%d MB\n",
Martin Roth433659a2014-05-12 21:55:00 -0600128 APERTURE_SIZE_BASE << UpdData->PcdApertureSize);
Martin Rothbdfe98f2014-11-18 19:52:46 -0700129 printk(FSP_INFO_LEVEL, "IGD Memory Size:\t%d MB\n",
Martin Rothe8d19012014-11-16 20:06:23 -0700130 UpdData->PcdIgdDvmt50PreAlloc * IGD_MEMSIZE_MULTIPLIER);
Martin Rothbdfe98f2014-11-18 19:52:46 -0700131 printk(FSP_INFO_LEVEL, "MMIO Size:\t\t%d MB\n", UpdData->PcdMrcInitMmioSize);
Martin Roth433659a2014-05-12 21:55:00 -0600132
133 /* Advance dev to PCI device 0.0 */
134 for (dev = &dev_root; dev; dev = dev_find_next_pci_device(dev)){
135 if (dev->path.type != DEVICE_PATH_PCI)
136 continue;
137 if (dev->path.pci.devfn == PCI_DEVFN(0x0,0))
138 break;
139 }
140
141 /*
142 * Loop through all the SOC devices in the devicetree
143 * enabling and disabling them as requested.
144 */
145 for (; dev; dev = dev->sibling) {
146
147 if (dev->path.type != DEVICE_PATH_PCI)
148 continue;
149
150 switch (dev->path.pci.devfn) {
Martin Roth12d86e72014-11-16 20:53:14 -0700151 UPD_DEVICE_CHECK(SDIO_DEV_FUNC, PcdEnableSdio, "Sdio:\t\t\t");
152 UPD_DEVICE_CHECK(SD_DEV_FUNC, PcdEnableSdcard, "Sdcard:\t\t\t");
153 UPD_DEVICE_CHECK(SIO_DMA1_DEV_FUNC, PcdEnableDma0, "SIO Dma 0:\t\t");
154 UPD_DEVICE_CHECK(I2C1_DEV_FUNC, PcdEnableI2C0, "SIO I2C0:\t\t");
155 UPD_DEVICE_CHECK(I2C2_DEV_FUNC, PcdEnableI2C1, "SIO I2C1:\t\t");
156 UPD_DEVICE_CHECK(I2C3_DEV_FUNC, PcdEnableI2C2, "SIO I2C2:\t\t");
157 UPD_DEVICE_CHECK(I2C4_DEV_FUNC, PcdEnableI2C3, "SIO I2C3:\t\t");
158 UPD_DEVICE_CHECK(I2C5_DEV_FUNC, PcdEnableI2C4, "SIO I2C4:\t\t");
159 UPD_DEVICE_CHECK(I2C6_DEV_FUNC, PcdEnableI2C5, "SIO I2C5:\t\t");
160 UPD_DEVICE_CHECK(I2C7_DEV_FUNC, PcdEnableI2C6, "SIO I2C6:\t\t");
161 UPD_DEVICE_CHECK(SIO_DMA2_DEV_FUNC, PcdEnableDma1, "SIO Dma1:\t\t");
162 UPD_DEVICE_CHECK(PWM1_DEV_FUNC, PcdEnablePwm0, "Pwm0:\t\t\t");
163 UPD_DEVICE_CHECK(PWM2_DEV_FUNC, PcdEnablePwm1, "Pwm1:\t\t\t");
164 UPD_DEVICE_CHECK(HSUART1_DEV_FUNC, PcdEnableHsuart0, "Hsuart0:\t\t");
165 UPD_DEVICE_CHECK(HSUART2_DEV_FUNC, PcdEnableHsuart1, "Hsuart1:\t\t");
166 UPD_DEVICE_CHECK(SPI_DEV_FUNC, PcdEnableSpi, "Spi:\t\t\t");
167 UPD_DEVICE_CHECK(SATA_DEV_FUNC, PcdEnableSata, "SATA:\t\t\t");
168 UPD_DEVICE_CHECK(HDA_DEV_FUNC, PcdEnableAzalia, "Azalia:\t\t\t");
169
Martin Roth433659a2014-05-12 21:55:00 -0600170 case MIPI_DEV_FUNC: /* Camera / Image Signal Processing */
York Yangfc1c1b52014-11-04 17:04:37 -0700171 if (FspInfo->ImageRevision >= FSP_GOLD3_REV_ID) {
172 UpdData->ISPEnable = dev->enabled;
173 } else {
David Imhoff6b0933a2015-05-06 21:42:37 +0200174 /* Gold2 and earlier FSP: ISPEnable is the field */
York Yangfc1c1b52014-11-04 17:04:37 -0700175 /* next to PcdGttSize in UPD_DATA_REGION struct */
176 *(&(UpdData->PcdGttSize)+sizeof(UINT8)) = dev->enabled;
Martin Rothbdfe98f2014-11-18 19:52:46 -0700177 printk (FSP_INFO_LEVEL,
York Yangfc1c1b52014-11-04 17:04:37 -0700178 "Baytrail Gold2 or earlier FSP, adjust ISPEnable offset.\n");
179 }
Martin Rothbdfe98f2014-11-18 19:52:46 -0700180 printk(FSP_INFO_LEVEL, "MIPI/ISP:\t\t%s\n",
David Imhoff6b0933a2015-05-06 21:42:37 +0200181 dev->enabled?"Enabled":"Disabled");
Martin Roth433659a2014-05-12 21:55:00 -0600182 break;
183 case EMMC_DEV_FUNC: /* EMMC 4.1*/
184 if ((dev->enabled) &&
Martin Rothe55a7c52014-11-16 17:09:15 -0700185 (config->PcdeMMCBootMode == EMMC_FOLLOWS_DEVICETREE))
Martin Roth433659a2014-05-12 21:55:00 -0600186 UpdData->PcdeMMCBootMode = EMMC_4_1 - EMMC_DISABLED;
187 break;
Martin Roth433659a2014-05-12 21:55:00 -0600188 case MMC45_DEV_FUNC: /* MMC 4.5*/
189 if ((dev->enabled) &&
Martin Rothe55a7c52014-11-16 17:09:15 -0700190 (config->PcdeMMCBootMode == EMMC_FOLLOWS_DEVICETREE))
Martin Roth433659a2014-05-12 21:55:00 -0600191 UpdData->PcdeMMCBootMode = EMMC_4_5 - EMMC_DISABLED;
192 break;
Martin Roth12d86e72014-11-16 20:53:14 -0700193 case XHCI_DEV_FUNC:
194 UpdData->PcdEnableXhci = dev->enabled;
Martin Roth433659a2014-05-12 21:55:00 -0600195 break;
196 case EHCI_DEV_FUNC:
197 UpdData->PcdEnableXhci = !(dev->enabled);
198 break;
Martin Roth12d86e72014-11-16 20:53:14 -0700199
200 case LPE_DEV_FUNC:
201 if (dev->enabled)
202 UpdData->PcdEnableLpe = config->LpeAcpiModeEnable;
203 else
204 UpdData->PcdEnableLpe = 0;
Martin Roth433659a2014-05-12 21:55:00 -0600205 break;
206 }
207 }
208
Martin Roth12d86e72014-11-16 20:53:14 -0700209 if (UpdData->PcdEnableLpe < sizeof(acpi_pci_mode_strings) / sizeof (char *))
Martin Rothbdfe98f2014-11-18 19:52:46 -0700210 printk(FSP_INFO_LEVEL, "Lpe:\t\t\t%s\n",
Martin Roth12d86e72014-11-16 20:53:14 -0700211 acpi_pci_mode_strings[UpdData->PcdEnableLpe]);
212
213 if (UpdData->PcdeMMCBootMode < sizeof(emmc_mode_strings) / sizeof (char *))
Ben Gardnerd347f6c2015-12-02 12:42:28 -0600214 printk(FSP_INFO_LEVEL, "eMMC Mode:\t\t%s\n",
Martin Roth12d86e72014-11-16 20:53:14 -0700215 emmc_mode_strings[UpdData->PcdeMMCBootMode]);
216
217 if (UpdData->PcdEnableSata)
Martin Rothbdfe98f2014-11-18 19:52:46 -0700218 printk(FSP_INFO_LEVEL, "SATA Mode:\t\t%s\n",
Martin Roth12d86e72014-11-16 20:53:14 -0700219 UpdData->PcdSataMode?"AHCI":"IDE");
220
Martin Rothbdfe98f2014-11-18 19:52:46 -0700221 printk(FSP_INFO_LEVEL, "Xhci:\t\t\t%s\n",
Martin Roth433659a2014-05-12 21:55:00 -0600222 UpdData->PcdEnableXhci?"Enabled":"Disabled");
223
Martin Roth5c8e7a42014-12-02 10:49:21 -0700224 /*
225 * set memory down parameters
226 * Skip setting values if memory down is disabled
227 * Skip setting values if FSP is earlier than gold 3
228 */
229 if (FspInfo->ImageRevision >= FSP_GOLD3_REV_ID) {
230 UPD_MEMDOWN_CHECK(EnableMemoryDown, DECREMENT_FOR_DEFAULT);
231 if (UpdData->PcdMemoryParameters.EnableMemoryDown) {
232 UPD_MEMDOWN_CHECK(DRAMSpeed, DECREMENT_FOR_DEFAULT);
233 UPD_MEMDOWN_CHECK(DRAMType, DECREMENT_FOR_DEFAULT);
234 UPD_MEMDOWN_CHECK(DIMM0Enable, DECREMENT_FOR_DEFAULT);
235 UPD_MEMDOWN_CHECK(DIMM1Enable, DECREMENT_FOR_DEFAULT);
236 UPD_MEMDOWN_CHECK(DIMMDWidth, DECREMENT_FOR_DEFAULT);
237 UPD_MEMDOWN_CHECK(DIMMDensity, DECREMENT_FOR_DEFAULT);
238 UPD_MEMDOWN_CHECK(DIMMBusWidth, DECREMENT_FOR_DEFAULT);
239 UPD_MEMDOWN_CHECK(DIMMSides, DECREMENT_FOR_DEFAULT);
240 UPD_MEMDOWN_CHECK(DIMMtCL, NO_DECREMENT_FOR_DEFAULT);
241 UPD_MEMDOWN_CHECK(DIMMtRPtRCD, NO_DECREMENT_FOR_DEFAULT);
242 UPD_MEMDOWN_CHECK(DIMMtWR, NO_DECREMENT_FOR_DEFAULT);
243 UPD_MEMDOWN_CHECK(DIMMtWTR, NO_DECREMENT_FOR_DEFAULT);
244 UPD_MEMDOWN_CHECK(DIMMtRRD, NO_DECREMENT_FOR_DEFAULT);
245 UPD_MEMDOWN_CHECK(DIMMtRTP, NO_DECREMENT_FOR_DEFAULT);
246 UPD_MEMDOWN_CHECK(DIMMtFAW, NO_DECREMENT_FOR_DEFAULT);
York Yangfc1c1b52014-11-04 17:04:37 -0700247
Martin Rothbdfe98f2014-11-18 19:52:46 -0700248 printk (FSP_INFO_LEVEL,
Martin Roth5c8e7a42014-12-02 10:49:21 -0700249 "Memory Down Data Existed : %s\n"\
250 "- Speed (0: 800, 1: 1066, 2: 1333, 3: 1600): %d\n"\
251 "- Type (0: DDR3, 1: DDR3L) : %d\n"\
252 "- DIMM0 : %s\n"\
253 "- DIMM1 : %s\n"\
254 "- Width : x%d\n"\
255 "- Density : %dGbit\n"
256 "- BudWidth : %dbit\n"\
257 "- Rank # : %d\n"\
258 "- tCL : %02X\n"\
259 "- tRPtRCD : %02X\n"\
260 "- tWR : %02X\n"\
261 "- tWTR : %02X\n"\
262 "- tRRD : %02X\n"\
263 "- tRTP : %02X\n"\
264 "- tFAW : %02X\n"
265 , (UpdData->PcdMemoryParameters.EnableMemoryDown) ? "Enabled" : "Disabled"
266 , UpdData->PcdMemoryParameters.DRAMSpeed
267 , UpdData->PcdMemoryParameters.DRAMType
268 , (UpdData->PcdMemoryParameters.DIMM0Enable) ? "Enabled" : "Disabled"
269 , (UpdData->PcdMemoryParameters.DIMM1Enable) ? "Enabled" : "Disabled"
270 , 8 << (UpdData->PcdMemoryParameters.DIMMDWidth)
271 , 1 << (UpdData->PcdMemoryParameters.DIMMDensity)
272 , 8 << (UpdData->PcdMemoryParameters.DIMMBusWidth)
273 , (UpdData->PcdMemoryParameters.DIMMSides) + 1
274 , UpdData->PcdMemoryParameters.DIMMtCL
275 , UpdData->PcdMemoryParameters.DIMMtRPtRCD
276 , UpdData->PcdMemoryParameters.DIMMtWR
277 , UpdData->PcdMemoryParameters.DIMMtWTR
278 , UpdData->PcdMemoryParameters.DIMMtRRD
279 , UpdData->PcdMemoryParameters.DIMMtRTP
280 , UpdData->PcdMemoryParameters.DIMMtFAW
York Yangfc1c1b52014-11-04 17:04:37 -0700281 );
Martin Roth5c8e7a42014-12-02 10:49:21 -0700282 }
York Yangfc1c1b52014-11-04 17:04:37 -0700283 }
Martin Roth433659a2014-05-12 21:55:00 -0600284}
285
286/* Set up the Baytrail specific structures for the call into the FSP */
287void chipset_fsp_early_init(FSP_INIT_PARAMS *pFspInitParams,
288 FSP_INFO_HEADER *fsp_ptr)
289{
290 FSP_INIT_RT_BUFFER *pFspRtBuffer = pFspInitParams->RtBufferPtr;
Mohan D'Costaed0c8382014-09-18 15:57:06 +0900291 uint32_t prev_sleep_state;
292
293 /* Get previous sleep state but don't clear */
294 prev_sleep_state = chipset_prev_sleep_state(0);
295 printk(BIOS_INFO, "prev_sleep_state = S%d\n", prev_sleep_state);
Martin Roth433659a2014-05-12 21:55:00 -0600296
297 /* Initialize the UPD Data */
298 GetUpdDefaultFromFsp (fsp_ptr, pFspRtBuffer->Common.UpdDataRgnPtr);
York Yangfc1c1b52014-11-04 17:04:37 -0700299 ConfigureDefaultUpdData(fsp_ptr, pFspRtBuffer->Common.UpdDataRgnPtr);
Martin Roth433659a2014-05-12 21:55:00 -0600300 pFspInitParams->NvsBufferPtr = NULL;
Martin Roth433659a2014-05-12 21:55:00 -0600301
Mohan D'Costaed0c8382014-09-18 15:57:06 +0900302#if IS_ENABLED(CONFIG_ENABLE_MRC_CACHE)
Martin Roth433659a2014-05-12 21:55:00 -0600303 /* Find the fastboot cache that was saved in the ROM */
304 pFspInitParams->NvsBufferPtr = find_and_set_fastboot_cache();
305#endif
306
Aaron Durbin15e439a2016-07-13 23:22:01 -0500307 if (prev_sleep_state == ACPI_S3) {
Mohan D'Costaed0c8382014-09-18 15:57:06 +0900308 /* S3 resume */
309 if ( pFspInitParams->NvsBufferPtr == NULL) {
310 /* If waking from S3 and no cache then. */
311 printk(BIOS_WARNING, "No MRC cache found in S3 resume path.\n");
312 post_code(POST_RESUME_FAILURE);
313 /* Clear Sleep Type */
314 outl(inl(ACPI_BASE_ADDRESS + PM1_CNT) &
315 ~(SLP_TYP), ACPI_BASE_ADDRESS + PM1_CNT);
316 /* Reboot */
317 printk(BIOS_WARNING,"Rebooting..\n" );
318 warm_reset();
319 /* Should not reach here.. */
320 die("Reboot System\n");
321 }
322 pFspRtBuffer->Common.BootMode = BOOT_ON_S3_RESUME;
323 } else {
324 /* Not S3 resume */
325 pFspRtBuffer->Common.BootMode = BOOT_WITH_FULL_CONFIGURATION;
326 }
327
Martin Roth433659a2014-05-12 21:55:00 -0600328 return;
329}
330
331/* The FSP returns here after the fsp_early_init call */
332void ChipsetFspReturnPoint(EFI_STATUS Status,
333 VOID *HobListPtr)
334{
Martin Roth582b2ae2015-01-11 14:29:29 -0700335 *(void **)CBMEM_FSP_HOB_PTR=HobListPtr;
336
Martin Roth433659a2014-05-12 21:55:00 -0600337 if (Status == 0xFFFFFFFF) {
338 warm_reset();
339 }
340 romstage_main_continue(Status, HobListPtr);
341}
342
343#endif /* __PRE_RAM__ */