Change MRC parameters in FSP-M UPD to enable different memory configurations.
Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: David Wei <david....@intel.com> CC: Mike Wu <mike...@intel.com> CC: Mang Guo <mang....@intel.com> --- .../Board/UP2/BoardInitPreMem/BoardInitMiscs.c | 145 ++++++++++++++++----- .../Board/UP2/BoardInitPreMem/PlatformId.c | 59 +++++++++ .../Board/UP2/BoardInitPreMem/PlatformId.h | 7 + .../PlatformSetupDxe/SouthClusterConfig.vfi | 4 +- 4 files changed, 184 insertions(+), 31 deletions(-) diff --git a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/BoardInitMiscs.c b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/BoardInitMiscs.c index d5092c2490..b155830523 100644 --- a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/BoardInitMiscs.c +++ b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/BoardInitMiscs.c @@ -15,6 +15,7 @@ #include "BoardInitMiscs.h" #include "MmrcData.h" +#include "PlatformId.h" UPDATE_FSPM_UPD_FUNC mUp2UpdateFspmUpdPtr = Up2UpdateFspmUpd; DRAM_CREATE_POLICY_DEFAULTS_FUNC mUp2DramCreatePolicyDefaultsPtr = Up2DramCreatePolicyDefaults; @@ -43,6 +44,10 @@ Up2UpdateFspmUpd ( BOOT_VARIABLE_NV_DATA *BootVariableNvData; MRC_PARAMS_SAVE_RESTORE *MrcParamsHob; BOOT_VARIABLE_NV_DATA *BootVariableNvDataHob; + SYSTEM_CONFIGURATION SystemConfiguration; + UINTN VariableSize; + EFI_PEI_READ_ONLY_VARIABLE2_PPI *VariablePpi; + UINT8 DdrId; Status = (*PeiServices)->LocatePpi ( PeiServices, @@ -98,13 +103,6 @@ Up2UpdateFspmUpd ( } } - // - // Override RankEnable settings for UP2 - // - FspUpdRgn->FspmConfig.Ch0_RankEnable = 1; - FspUpdRgn->FspmConfig.Ch1_RankEnable = 1; - FspUpdRgn->FspmConfig.Ch2_RankEnable = 0; - FspUpdRgn->FspmConfig.Ch3_RankEnable = 0; DEBUG ((DEBUG_INFO, "UpdateFspmUpd - gEfiPlatformInfoGuid\n")); Hob.Raw = GetFirstGuidHob (&gEfiPlatformInfoGuid); @@ -131,34 +129,97 @@ Up2UpdateFspmUpd ( FspUpdRgn->FspmConfig.DIMM1SPDAddress = 0; FspUpdRgn->FspmConfig.DDR3LPageSize = 0; FspUpdRgn->FspmConfig.DDR3LASR = 0; - - FspUpdRgn->FspmConfig.Ch0_RankEnable = 1; // - FspUpdRgn->FspmConfig.Ch0_DeviceWidth = 1; - FspUpdRgn->FspmConfig.Ch0_DramDensity = 2; - FspUpdRgn->FspmConfig.Ch0_Option = 3; - - FspUpdRgn->FspmConfig.Ch1_RankEnable = 1; - FspUpdRgn->FspmConfig.Ch1_DeviceWidth = 1; // x16 - FspUpdRgn->FspmConfig.Ch1_DramDensity = 2; // 8GB - FspUpdRgn->FspmConfig.Ch1_Option = 3; - - FspUpdRgn->FspmConfig.Ch2_RankEnable = 0; // empty - FspUpdRgn->FspmConfig.Ch2_DeviceWidth = 1; - FspUpdRgn->FspmConfig.Ch2_DramDensity = 2; - FspUpdRgn->FspmConfig.Ch2_Option = 3; - - FspUpdRgn->FspmConfig.Ch3_RankEnable = 0; - FspUpdRgn->FspmConfig.Ch3_DeviceWidth = 1; - FspUpdRgn->FspmConfig.Ch3_DramDensity = 2; - FspUpdRgn->FspmConfig.Ch3_Option = 3; - FspUpdRgn->FspmConfig.ChannelHashMask = 0; FspUpdRgn->FspmConfig.SliceHashMask = 0; FspUpdRgn->FspmConfig.ChannelsSlicesEnable = 0; FspUpdRgn->FspmConfig.ScramblerSupport = 1; FspUpdRgn->FspmConfig.InterleavedMode = 0; FspUpdRgn->FspmConfig.MinRefRate2xEnable = 0; - FspUpdRgn->FspmConfig.DualRankSupportEnable = 0; + + // + // DDR_ID1 DDR_ID0 Memory + // GPIO_215 GPIO_214 + // 0 0 2G + // 0 1 4G + // 1 0 8G + // + Status = Up2GetDdrId(PeiServices, &DdrId); + + if (DdrId == 0x00) { // 2GB, SK, Single Rank + + FspUpdRgn->FspmConfig.DualRankSupportEnable = 0; + + FspUpdRgn->FspmConfig.Ch0_RankEnable = 1; + FspUpdRgn->FspmConfig.Ch0_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch0_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch0_Option = 3; + + FspUpdRgn->FspmConfig.Ch1_RankEnable = 1; + FspUpdRgn->FspmConfig.Ch1_DeviceWidth = 1; // x16 + FspUpdRgn->FspmConfig.Ch1_DramDensity = 2; // 8GB + FspUpdRgn->FspmConfig.Ch1_Option = 3; + + FspUpdRgn->FspmConfig.Ch2_RankEnable = 0; // empty + FspUpdRgn->FspmConfig.Ch2_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch2_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch2_Option = 3; + + FspUpdRgn->FspmConfig.Ch3_RankEnable = 0; // empty + FspUpdRgn->FspmConfig.Ch3_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch3_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch3_Option = 3; + + }else if (DdrId == 0x01) { // 4GB, SK, Single Rank + + FspUpdRgn->FspmConfig.DualRankSupportEnable = 0; + + FspUpdRgn->FspmConfig.Ch0_RankEnable = 1; // + FspUpdRgn->FspmConfig.Ch0_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch0_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch0_Option = 3; + + FspUpdRgn->FspmConfig.Ch1_RankEnable = 1; + FspUpdRgn->FspmConfig.Ch1_DeviceWidth = 1; // x16 + FspUpdRgn->FspmConfig.Ch1_DramDensity = 2; // 8GB + FspUpdRgn->FspmConfig.Ch1_Option = 3; + + FspUpdRgn->FspmConfig.Ch2_RankEnable = 1; // empty + FspUpdRgn->FspmConfig.Ch2_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch2_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch2_Option = 3; + + FspUpdRgn->FspmConfig.Ch3_RankEnable = 1; + FspUpdRgn->FspmConfig.Ch3_DeviceWidth = 1; + FspUpdRgn->FspmConfig.Ch3_DramDensity = 2; + FspUpdRgn->FspmConfig.Ch3_Option = 3; + + }else if (DdrId == 0x02) { // 8GB, Micron, Dual Rank + + // + // Micron #MT53B512M32D2NP-062 AIT:C) from Platfrom4 profile + // + FspUpdRgn->FspmConfig.DualRankSupportEnable = 1; + + FspUpdRgn->FspmConfig.Ch0_RankEnable = 0x03; // [0]: Rank 0 [1]: Rank 1 + FspUpdRgn->FspmConfig.Ch0_DeviceWidth = 0x01; // x16 + FspUpdRgn->FspmConfig.Ch0_DramDensity = 0x02; // 8Gb + FspUpdRgn->FspmConfig.Ch0_Option = 0x03; + + FspUpdRgn->FspmConfig.Ch1_RankEnable = 0x03; // [0]: Rank 0 [1]: Rank 1 + FspUpdRgn->FspmConfig.Ch1_DeviceWidth = 0x01; // x16 + FspUpdRgn->FspmConfig.Ch1_DramDensity = 0x02; // 8Gb + FspUpdRgn->FspmConfig.Ch1_Option = 0x03; + + FspUpdRgn->FspmConfig.Ch2_RankEnable = 0x03; // [0]: Rank 0 [1]: Rank 1 + FspUpdRgn->FspmConfig.Ch2_DeviceWidth = 0x01; // x16 + FspUpdRgn->FspmConfig.Ch2_DramDensity = 0x02; // 8Gb + FspUpdRgn->FspmConfig.Ch2_Option = 0x03; + + FspUpdRgn->FspmConfig.Ch3_RankEnable = 0x03; // [0]: Rank 0 [1]: Rank 1 + FspUpdRgn->FspmConfig.Ch3_DeviceWidth = 0x01; // x16 + FspUpdRgn->FspmConfig.Ch3_DramDensity = 0x02; // 8Gb + FspUpdRgn->FspmConfig.Ch3_Option = 0x03; + } // // Swizzling @@ -170,6 +231,32 @@ Up2UpdateFspmUpd ( CopyMem (&(FspUpdRgn->FspmConfig.Ch3_Bit_swizzling), ChSwizzle_UP2[3], DRAM_POLICY_NUMBER_BITS * sizeof(UINT8)); } + + // + // Enable or disable NPK based on DciEn + // + Status = PeiServicesLocatePpi (&gEfiPeiReadOnlyVariable2PpiGuid, 0, NULL, (VOID **) &VariablePpi); + if (!EFI_ERROR (Status)) { + VariableSize = sizeof (SYSTEM_CONFIGURATION); + Status = VariablePpi->GetVariable ( + VariablePpi, + PLATFORM_SETUP_VARIABLE_NAME, + &gEfiSetupVariableGuid, + NULL, + &VariableSize, + &SystemConfiguration + ); + if (!EFI_ERROR (Status)) { + if (SystemConfiguration.DciEn == 0) { + FspUpdRgn->FspmConfig.NpkEn = 0; + } else if (SystemConfiguration.DciAutoDetect == 1) { + FspUpdRgn->FspmConfig.NpkEn = 3; + } else { + FspUpdRgn->FspmConfig.NpkEn = 1; + } + } + } + return EFI_SUCCESS; } diff --git a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.c b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.c index 5708e05dae..20fdb6fb21 100644 --- a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.c +++ b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.c @@ -54,4 +54,63 @@ Up2GetEmbeddedBoardIdFabId( return EFI_SUCCESS; } +EFI_STATUS +EFIAPI +Up2GetDdrId( + IN CONST EFI_PEI_SERVICES **PeiServices, + OUT UINT8 *DdrId + ) +{ + BXT_CONF_PAD0 padConfg0; + BXT_CONF_PAD1 padConfg1; + IN UINT32 CommAndOffset; + + // + // DDR_ID1 DDR_ID0 Memory + // GPIO_215 GPIO_214 + // 0 0 2G + // 0 1 4G + // 1 0 8G + // + + //BXT_GPIO_PAD_CONF(L"GPIO_214 PMIC_BCUDISW2", M0 , GPO ,GPIO_D, HI , NA ,Wake_Disabled, P_20K_L, NA , NA ,NA , NA, GPIO_PADBAR+0x00D8, NORTHWEST),//Feature: BT WAKE to Device Net in Sch: NGFF_BT_DEV_WAKE_N + //BXT_GPIO_PAD_CONF(L"GPIO_215 PMIC_BCUDISCRIT", M0 , GPO ,GPIO_D, HI , NA ,Wake_Disabled, P_20K_L, NA , NA ,NA , NA, GPIO_PADBAR+0x00E0, NORTHWEST),//Feature: RF_KILL_GPS Net in Sch: RF_KILL_GPS_1P8_N + + // + // DDR_ID0: GPIO_214 + // + CommAndOffset = GetCommOffset (NORTHWEST, 0x00D8); + padConfg0.padCnf0 = GpioPadRead (CommAndOffset + BXT_GPIO_PAD_CONF0_OFFSET); + padConfg0.r.PMode = 0; + padConfg0.r.GPIORxTxDis = 0x1; + GpioPadWrite (CommAndOffset + BXT_GPIO_PAD_CONF0_OFFSET, padConfg0.padCnf0); + // + // Set to Pull Up 20K + // + padConfg1.r.Term = 0xC; + GpioPadWrite (CommAndOffset + BXT_GPIO_PAD_CONF1_OFFSET, padConfg1.padCnf1); + + + // + // DDR_ID1: GPIO_215 + // + CommAndOffset = GetCommOffset (NORTHWEST, 0x00E0); + padConfg0.padCnf0 = GpioPadRead (CommAndOffset + BXT_GPIO_PAD_CONF0_OFFSET); + padConfg0.r.PMode = 0; + padConfg0.r.GPIORxTxDis = 0x1; + GpioPadWrite (CommAndOffset + BXT_GPIO_PAD_CONF0_OFFSET, padConfg0.padCnf0); + //Set to Pull Up 20K + padConfg1.r.Term = 0xC; + GpioPadWrite (CommAndOffset + BXT_GPIO_PAD_CONF1_OFFSET, padConfg1.padCnf1); + + + *DdrId = (UINT8) (((GpioPadRead (GetCommOffset (NORTHWEST, 0x00D8) + BXT_GPIO_PAD_CONF0_OFFSET) & BIT1) >> 1) | \ + (((GpioPadRead (GetCommOffset (NORTHWEST, 0x00E0) + BXT_GPIO_PAD_CONF0_OFFSET) & BIT1) >> 1) << 1)); + + DEBUG ((EFI_D_INFO, "Ddr4Id is: %02X\n", *DdrId)); + + + return EFI_SUCCESS; +} + diff --git a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.h b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.h index 8e98dcdce8..2288bc1e7d 100644 --- a/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.h +++ b/Platform/BroxtonPlatformPkg/Board/UP2/BoardInitPreMem/PlatformId.h @@ -70,5 +70,12 @@ Up2GetBomIdPss ( OUT UINT8 *BomIdPss ); +EFI_STATUS +EFIAPI +Up2GetDdrId( + IN CONST EFI_PEI_SERVICES **PeiServices, + OUT UINT8 *DdrId + ); + #endif diff --git a/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/SouthClusterConfig.vfi b/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/SouthClusterConfig.vfi index 9d2c9783eb..9738e4d912 100644 --- a/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/SouthClusterConfig.vfi +++ b/Platform/BroxtonPlatformPkg/Common/PlatformSettings/PlatformSetupDxe/SouthClusterConfig.vfi @@ -163,8 +163,8 @@ form formid = MISC_OPTIONS_FORM_ID, oneof varid = Setup.DciEn, prompt = STRING_TOKEN(STR_DCI_HDCIEN_PROMPT), help = STRING_TOKEN(STR_DCI_HDCIEN_HELP), - option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; - option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_DISABLE), value = 0, flags = RESET_REQUIRED; + option text = STRING_TOKEN(STR_ENABLE), value = 1, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; endoneof; suppressif ideqval Setup.DciEn == 1; -- 2.14.1.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel