From a7460bcb9170aee87f09eb472d945b5fdf5b0dcb Mon Sep 17 00:00:00 2001 From: raghavag Date: Mon, 14 Oct 2019 13:20:38 -0700 Subject: [PATCH] [WHL] Fix firmware update failure (#374) Current code set payload id depending on the gpio settings and user selection from configuration data. When UEFI payload is selected using GPIO or config data, payload id is being set to UEFI irrespective of boot mode, which cause notification function to get called, this locks the spi which inturn fails firmware update Modified code to set payload id only in non-firmware update boot mode. Signed-off-by: Raghava Gudla --- .../Stage2BoardInitLib/Stage2BoardInitLib.c | 4 + .../Stage2BoardInitLib/Stage2BoardInitLib.c | 102 ++++++++++-------- 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/Platform/ApollolakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c b/Platform/ApollolakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c index 29f4d313..9a8fe908 100644 --- a/Platform/ApollolakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c +++ b/Platform/ApollolakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c @@ -629,6 +629,10 @@ UpdatePayloadId ( UINT32 PayloadId; UINT32 GpioLevel; + if (GetBootMode() == BOOT_ON_FLASH_UPDATE) { + return; + } + PayloadId = 0; GenericCfgData = (GEN_CFG_DATA *)FindConfigDataByTag (CDATA_GEN_TAG); if (GenericCfgData != NULL) { diff --git a/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c b/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c index bf0ea3ea..ddf3a659 100644 --- a/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c +++ b/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c @@ -91,7 +91,6 @@ ((UINT32) (((A).PinNum) | (((A).Group) << 16))) FVID_TABLE *mFvidPointer = NULL; -SILICON_CFG_DATA *mSiliconCfgData = NULL; /// /// Overcurrent pins, the values match the setting of EDS, please refer to EDS for more details /// @@ -617,7 +616,6 @@ PatchCpuSsdtTable ( } } - /** Update bootloader reserved region. @@ -1002,6 +1000,58 @@ GpioInit ( return GpioConfigurePads (GpioEntries, (GPIO_INIT_CONFIG *) GpioCfgDataBuffer); } +/** + Update current boot Payload ID. + +**/ +VOID +UpdatePayloadId ( + VOID + ) +{ + EFI_STATUS Status; + GEN_CFG_DATA *GenericCfgData; + SILICON_CFG_DATA *SiliconCfgData; + UINT32 PayloadSelGpioData; + UINT32 PayloadSelGpioPad; + UINT32 PayloadId; + + PayloadId = GetPayloadId (); + GenericCfgData = (GEN_CFG_DATA *)FindConfigDataByTag (CDATA_GEN_TAG); + if (GenericCfgData != NULL) { + if (GenericCfgData->PayloadId == AUTO_PAYLOAD_ID_SIGNATURE) { + PayloadId = 0; + } else { + PayloadId = GenericCfgData->PayloadId; + } + } + + // + // Switch payloads based on configured GPIO pin + // + SiliconCfgData = (SILICON_CFG_DATA *)FindConfigDataByTag (CDATA_SILICON_TAG); + if ((SiliconCfgData != NULL) && (SiliconCfgData->PayloadSelGpio.Enable != 0)){ + if (IsPchLp() == TRUE) { + PayloadSelGpioPad = GPIO_CFG_PIN_TO_PAD(SiliconCfgData->PayloadSelGpio) | (GPIO_CNL_LP_CHIPSET_ID << 24); + } else { + PayloadSelGpioPad = GPIO_CFG_PIN_TO_PAD(SiliconCfgData->PayloadSelGpio) | (GPIO_CNL_H_CHIPSET_ID << 24); + } + Status = GpioGetInputValue (PayloadSelGpioPad, &PayloadSelGpioData); + if (!EFI_ERROR (Status)) { + if (PayloadSelGpioData == 0) { + PayloadId = 0; + } else { + if ((GenericCfgData != NULL) && (GenericCfgData->PayloadId == AUTO_PAYLOAD_ID_SIGNATURE)) { + PayloadId = UEFI_PAYLOAD_ID_SIGNATURE; + } + } + DEBUG ((DEBUG_INFO, "Set PayloadId to 0x%08X based on GPIO config\n", PayloadId)); + } + } + + SetPayloadId (PayloadId); +} + /** Initialize Board specific things in Stage2 Phase @@ -1013,7 +1063,6 @@ BoardInit ( IN BOARD_INIT_PHASE InitPhase ) { - GEN_CFG_DATA *GenericCfgData; SILICON_CFG_DATA *SiliconCfgData; EFI_STATUS Status; UINT32 RgnBase; @@ -1025,9 +1074,7 @@ BoardInit ( UINT32 AddressPort; UINTN SpiBar0; UINT32 Length; - UINT32 PayloadSelGpioData; - UINT32 PayloadSelGpioPad; - UINT32 PayloadId; + EFI_PEI_GRAPHICS_INFO_HOB *FspGfxHob; LOADER_GLOBAL_DATA *LdrGlobal; @@ -1037,43 +1084,8 @@ BoardInit ( GpioInit (); SpiConstructor (); - PayloadId = GetPayloadId (); - GenericCfgData = (GEN_CFG_DATA *)FindConfigDataByTag (CDATA_GEN_TAG); - if (GenericCfgData != NULL) { - if (GenericCfgData->PayloadId == AUTO_PAYLOAD_ID_SIGNATURE) { - PayloadId = 0; - } else { - PayloadId = GenericCfgData->PayloadId; - } - } - - // - // Switch payloads based on configured GPIO pin - // - SiliconCfgData = (SILICON_CFG_DATA *)FindConfigDataByTag (CDATA_SILICON_TAG); - if ((SiliconCfgData != NULL) && (SiliconCfgData->PayloadSelGpio.Enable != 0)){ - if (IsPchLp() == TRUE) { - PayloadSelGpioPad = GPIO_CFG_PIN_TO_PAD(SiliconCfgData->PayloadSelGpio) | (GPIO_CNL_LP_CHIPSET_ID << 24); - } else { - PayloadSelGpioPad = GPIO_CFG_PIN_TO_PAD(SiliconCfgData->PayloadSelGpio) | (GPIO_CNL_H_CHIPSET_ID << 24); - } - Status = GpioGetInputValue (PayloadSelGpioPad, &PayloadSelGpioData); - if (!EFI_ERROR (Status)) { - if (PayloadSelGpioData == 0) { - PayloadId = 0; - } else { - if ((GenericCfgData != NULL) && (GenericCfgData->PayloadId == AUTO_PAYLOAD_ID_SIGNATURE)) { - PayloadId = UEFI_PAYLOAD_ID_SIGNATURE; - } - } - DEBUG ((DEBUG_INFO, "Set PayloadId to 0x%08X based on GPIO config\n", PayloadId)); - } - } - mSiliconCfgData = SiliconCfgData; - - SetPayloadId (PayloadId); - - if (GetLoaderGlobalDataPointer ()->BootMode != BOOT_ON_FLASH_UPDATE) { + if (GetBootMode() != BOOT_ON_FLASH_UPDATE) { + UpdatePayloadId (); UpdateBlRsvdRegion (); } Status = GetComponentInfo (FLASH_MAP_SIG_VARIABLE, &RgnBase, &RgnSize); @@ -2028,6 +2040,7 @@ PlatformUpdateAcpiTable ( UINT16 Size; LOADER_GLOBAL_DATA *LdrGlobal; EFI_STATUS Status; + SILICON_CFG_DATA *SiliconCfgData; LdrGlobal = (LOADER_GLOBAL_DATA *)GetLoaderGlobalDataPointer(); @@ -2038,7 +2051,8 @@ PlatformUpdateAcpiTable ( End = (UINT8 *)Table + Table->Length; if (Table->Signature == EFI_ACPI_5_0_EMBEDDED_CONTROLLER_BOOT_RESOURCES_TABLE_SIGNATURE) { - if ((mSiliconCfgData == NULL) || (mSiliconCfgData->ECEnable == 0)) { + SiliconCfgData = (SILICON_CFG_DATA *)FindConfigDataByTag (CDATA_SILICON_TAG); + if ((SiliconCfgData == NULL) || (SiliconCfgData->ECEnable == 0)) { return EFI_UNSUPPORTED; } }