/** @file Source code for the board SA configuration Pcd init functions in Pre-Memory init phase. Copyright (c) 2020, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "BoardSaConfigPreMem.h" #include "SaPolicyCommon.h" #include "UpXtremeInit.h" #include #include // // Display DDI settings for UP Xtreme // GLOBAL_REMOVE_IF_UNREFERENCED const UINT8 mUpXtremeRowDisplayDdiConfig[9] = { DdiPortAEdp, // DDI Port A Config : DdiPortADisabled = Disabled, DdiPortAEdp = eDP, DdiPortAMipiDsi = MIPI DSI DdiHpdEnable, // DDI Port B HPD : DdiHpdDisable = Disable, DdiHpdEnable = Enable HPD DdiHpdEnable, // DDI Port C HPD : DdiHpdDisable = Disable, DdiHpdEnable = Enable HPD DdiHpdEnable, // DDI Port D HPD : DdiHpdDisable = Disable, DdiHpdEnable = Enable HPD DdiHpdEnable, // DDI Port F HPD : DdiHpdDisable = Disable, DdiHpdEnable = Enable HPD DdiDdcEnable, // DDI Port B DDC : DdiDisable = Disable, DdiDdcEnable = Enable DDC DdiDdcEnable, // DDI Port C DDC : DdiDisable = Disable, DdiDdcEnable = Enable DDC DdiDdcEnable, // DDI Port D DDC : DdiDisable = Disable, DdiDdcEnable = Enable DDC DdiDisable // DDI Port F DDC : DdiDisable = Disable, DdiDdcEnable = Enable DDC }; /** MRC configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS SaMiscConfigInit ( IN UINT16 BoardId ) { // // UserBd // switch (BoardId) { case BoardIdUpXtreme: // // Assign UserBd to 5 which is assigned to MrcInputs->BoardType btUser4 for ULT platforms. // This is required to skip Memory voltage programming based on GPIO's in MRC // PcdSet8S (PcdSaMiscUserBd, 5); // MrcBoardType btUser4 for UP Xtreme (ULT/ULX/Modile Halo) break; default: // MiscPeiPreMemConfig.UserBd = 0 by default. break; } PcdSet16S (PcdSaDdrFreqLimit, 0); return EFI_SUCCESS; } /** Board Memory Init related configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integrer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS MrcConfigInit ( IN UINT16 BoardId ) { CPU_FAMILY CpuFamilyId; UINT8 BomId; CpuFamilyId = GetCpuFamily(); if (CpuFamilyId == EnumCpuCflDtHalo) { PcdSetBoolS (PcdDualDimmPerChannelBoardType, TRUE); } else { PcdSetBoolS (PcdDualDimmPerChannelBoardType, FALSE); } // // Example policy for DIMM slots implementation boards: // 1. Assign Smbus address of DIMMs and SpdData will be updated later // by reading from DIMM SPD. // 2. No need to apply hardcoded SpdData buffers here for such board. // // Whiskey Lake U RVP has removable DIMM slots. // So assign all Smbus address of DIMMs and leave PcdMrcSpdData set to 0. // Example: // PcdMrcSpdData = 0 // PcdMrcSpdDataSize = 0 // PcdMrcSpdAddressTable0 = 0xA0 // PcdMrcSpdAddressTable1 = 0xA2 // PcdMrcSpdAddressTable2 = 0xA4 // PcdMrcSpdAddressTable3 = 0xA6 // // If a board has soldered down memory. It should use the following settings. // Example: // PcdMrcSpdAddressTable0 = 0 // PcdMrcSpdAddressTable1 = 0 // PcdMrcSpdAddressTable2 = 0 // PcdMrcSpdAddressTable3 = 0 // PcdMrcSpdData = static data buffer // PcdMrcSpdDataSize = sizeof (static data buffer) // // // SPD Address Table // // BOMID [1:0] // 0: 16G A & B CH // 1: 8G A CH // 2: 8G A & B CH // 3: 4G A CH BomId = PcdGet8(PcdBoardBomId); DEBUG ((DEBUG_INFO, "Up Xtreme Bom ID 0x%x\n",BomId)); if ((BomId & BIT1) == BIT1) { PcdSet32S (PcdMrcSpdData, (UINTN) mUpXtremeSamsungDdr4Spd); PcdSet16S (PcdMrcSpdDataSize, mUpXtremeSamsungDdr4SpdSize); DEBUG ((DEBUG_INFO, "Using Xtreme SPD Samsung Ddr4\n")); } else { PcdSet32S (PcdMrcSpdData, (UINTN) mUpXtremeSkhynixDdr4Spd); PcdSet16S (PcdMrcSpdDataSize, mUpXtremeSkhynixDdr4SpdSize); DEBUG ((DEBUG_INFO, "Using Xtreme SPD Skhynix Ddr4\n")); } PcdSet8S (PcdMrcSpdAddressTable0, 0); PcdSet8S (PcdMrcSpdAddressTable1, 0); PcdSet8S (PcdMrcSpdAddressTable2, 0); PcdSet8S (PcdMrcSpdAddressTable3, 0); // // DRAM SPD Data & related configuration // PcdSet32S (PcdMrcDqByteMap, (UINTN) mDqByteMapUpXtreme); PcdSet16S (PcdMrcDqByteMapSize, sizeof (mDqByteMapUpXtreme)); PcdSet32S (PcdMrcDqsMapCpu2Dram, (UINTN) mDqsMapCpu2DramUpXtreme); PcdSet16S (PcdMrcDqsMapCpu2DramSize, sizeof (mDqsMapCpu2DramUpXtreme)); switch (BoardId) { case BoardIdUpXtreme: PcdSet32S (PcdMrcRcompResistor, (UINTN) RcompResistorUpXtreme); PcdSet32S (PcdMrcRcompTarget, (UINTN) RcompTargetUpXtreme); PcdSetBoolS (PcdMrcDqPinsInterleavedControl, FALSE); PcdSetBoolS (PcdMrcDqPinsInterleaved, FALSE); break; default: break; } // // CA Vref routing: board-dependent // 0 - VREF_CA goes to both CH_A and CH_B (LPDDR3/DDR3L) // 1 - VREF_CA to CH_A, VREF_DQ_A to CH_B (should not be used) // 2 - VREF_CA to CH_A, VREF_DQ_B to CH_B (DDR4) // switch (BoardId) { case BoardIdUpXtreme: PcdSet8S (PcdMrcCaVrefConfig, 2); // DDR4 boards break; default: PcdSet8S (PcdMrcCaVrefConfig, 0); // All DDR3L/LPDDR3/LPDDR4 boards break; } return EFI_SUCCESS; } /** Board SA related GPIO configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS SaGpioConfigInit ( IN UINT16 BoardId ) { // // Update board's GPIO for PEG slot reset // PcdSetBoolS (PcdPegGpioResetControl, TRUE); PcdSetBoolS (PcdPegGpioResetSupoort, FALSE); PcdSet32S (PcdPeg0ResetGpioPad, 0); PcdSetBoolS (PcdPeg0ResetGpioActive, FALSE); PcdSet32S (PcdPeg3ResetGpioPad, 0); PcdSetBoolS (PcdPeg3ResetGpioActive, FALSE); // // PCIE RTD3 GPIO // switch (BoardId) { // todo for UP Xtreme case BoardIdWhiskeyLakeRvp: PcdSet8S(PcdRootPortIndex, 4); PcdSet8S (PcdPcie0GpioSupport, PchGpio); PcdSet32S (PcdPcie0WakeGpioNo, 0); PcdSet8S (PcdPcie0HoldRstExpanderNo, 0); PcdSet32S (PcdPcie0HoldRstGpioNo, GPIO_CNL_LP_GPP_C15); PcdSetBoolS (PcdPcie0HoldRstActive, FALSE); PcdSet8S (PcdPcie0PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie0PwrEnableGpioNo, GPIO_CNL_LP_GPP_C14); PcdSetBoolS (PcdPcie0PwrEnableActive, FALSE); PcdSet8S (PcdPcie1GpioSupport, NotSupported); PcdSet32S (PcdPcie1WakeGpioNo, 0); PcdSet8S (PcdPcie1HoldRstExpanderNo, 0); PcdSet32S (PcdPcie1HoldRstGpioNo, 0); PcdSetBoolS (PcdPcie1HoldRstActive, FALSE); PcdSet8S (PcdPcie1PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie1PwrEnableGpioNo, 0); PcdSetBoolS (PcdPcie1PwrEnableActive, FALSE); PcdSet8S (PcdPcie2GpioSupport, NotSupported); PcdSet32S (PcdPcie2WakeGpioNo, 0); PcdSet8S (PcdPcie2HoldRstExpanderNo, 0); PcdSet32S (PcdPcie2HoldRstGpioNo, 0); PcdSetBoolS (PcdPcie2HoldRstActive, FALSE); PcdSet8S (PcdPcie2PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie2PwrEnableGpioNo, 0); PcdSetBoolS (PcdPcie2PwrEnableActive, FALSE); break; default: PcdSet8S(PcdRootPortIndex, 0xFF); PcdSet8S (PcdPcie0GpioSupport, NotSupported); PcdSet32S (PcdPcie0WakeGpioNo, 0); PcdSet8S (PcdPcie0HoldRstExpanderNo, 0); PcdSet32S (PcdPcie0HoldRstGpioNo, 0); PcdSetBoolS (PcdPcie0HoldRstActive, FALSE); PcdSet8S (PcdPcie0PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie0PwrEnableGpioNo, 0); PcdSetBoolS (PcdPcie0PwrEnableActive, FALSE); PcdSet8S (PcdPcie1GpioSupport, NotSupported); PcdSet32S (PcdPcie1WakeGpioNo, 0); PcdSet8S (PcdPcie1HoldRstExpanderNo, 0); PcdSet32S (PcdPcie1HoldRstGpioNo, 0); PcdSetBoolS (PcdPcie1HoldRstActive, FALSE); PcdSet8S (PcdPcie1PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie1PwrEnableGpioNo, 0); PcdSetBoolS (PcdPcie1PwrEnableActive, FALSE); PcdSet8S (PcdPcie2GpioSupport, NotSupported); PcdSet32S (PcdPcie2WakeGpioNo, 0); PcdSet8S (PcdPcie2HoldRstExpanderNo, 0); PcdSet32S (PcdPcie2HoldRstGpioNo, 0); PcdSetBoolS (PcdPcie2HoldRstActive, FALSE); PcdSet8S (PcdPcie2PwrEnableExpanderNo, 0); PcdSet32S (PcdPcie2PwrEnableGpioNo, 0); PcdSetBoolS (PcdPcie2PwrEnableActive, FALSE); break; } return EFI_SUCCESS; } /** SA Display DDI configuration init function for PEI pre-memory phase. @param[in] BoardId An unsigned integer represent the board id. @retval EFI_SUCCESS The function completed successfully. **/ EFI_STATUS SaDisplayConfigInit ( IN UINT16 BoardId ) { // // Update Display DDI Config // switch (BoardId) { case BoardIdUpXtreme: PcdSet32S (PcdSaDisplayConfigTable, (UINTN) mUpXtremeRowDisplayDdiConfig); PcdSet16S (PcdSaDisplayConfigTableSize, sizeof (mUpXtremeRowDisplayDdiConfig)); break; default: break; } return EFI_SUCCESS; }