[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 <raghava.gudla@intel.com>
This commit is contained in:
raghavag
2019-10-14 13:20:38 -07:00
committed by Aiden Park
parent 7b222b6c5f
commit a7460bcb91
2 changed files with 62 additions and 44 deletions
@@ -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) {
@@ -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;
}
}