CorebootModulePkg/CbSupportDxe: Remove SCI_EN setting
Current implemenation sets PM1_CNT.SCI_EN bit at ReadyToBoot event. However, this should not be done because this causes OS to skip triggering FADT.SMI_CMD, which leads to the functions implemented in the SMI handler being omitted. This issue was identified by Matt Delco <delco@google.com>. The fix does the following: - The SCI_EN bit setting is removed from CbSupportDxe driver. - Some additional checks are added in CbParseFadtInfo() in CbParseLib.c to output some error message and ASSERT (FALSE) if ALL of the following conditions are met: 1) HARDWARE_REDUCED_ACPI is not set; 2) SMI_CMD field is zero; 3) SCI_EN bit is zero; which indicates the ACPI enabling status is inconsistent: SCI is not enabled but the ACPI table does not provide a means to enable it through FADT->SMI_CMD. This may cause issues in OS. Cc: Maurice Ma <maurice.ma@intel.com> Cc: Prince Agyeman <prince.agyeman@intel.com> Cc: Matt Delco <delco@google.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Benjamin You <benjamin.you@intel.com> Reviewed-by: Maurice Ma <maurice.ma@intel.com> Reviewed-by: Matt Delco <delco@google.com>
This commit is contained in:
@ -18,6 +18,7 @@
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/CbParseLib.h>
|
||||
|
||||
#include <IndustryStandard/Acpi.h>
|
||||
@ -477,6 +478,39 @@ CbParseFadtInfo (
|
||||
ASSERT(Fadt->Pm1aEvtBlk != 0);
|
||||
ASSERT(Fadt->Gpe0Blk != 0);
|
||||
|
||||
DEBUG_CODE_BEGIN ();
|
||||
BOOLEAN SciEnabled;
|
||||
|
||||
//
|
||||
// Check the consistency of SCI enabling
|
||||
//
|
||||
|
||||
//
|
||||
// Get SCI_EN value
|
||||
//
|
||||
if (Fadt->Pm1CntLen == 4) {
|
||||
SciEnabled = (IoRead32 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
|
||||
} else {
|
||||
//
|
||||
// if (Pm1CntLen == 2), use 16 bit IO read;
|
||||
// if (Pm1CntLen != 2 && Pm1CntLen != 4), use 16 bit IO read as a fallback
|
||||
//
|
||||
SciEnabled = (IoRead16 (Fadt->Pm1aCntBlk) & BIT0)? TRUE : FALSE;
|
||||
}
|
||||
|
||||
if (!(Fadt->Flags & EFI_ACPI_5_0_HW_REDUCED_ACPI) &&
|
||||
(Fadt->SmiCmd == 0) &&
|
||||
!SciEnabled) {
|
||||
//
|
||||
// The ACPI enabling status is inconsistent: SCI is not enabled but ACPI
|
||||
// table does not provide a means to enable it through FADT->SmiCmd
|
||||
//
|
||||
DEBUG ((DEBUG_ERROR, "ERROR: The ACPI enabling status is inconsistent: SCI is not"
|
||||
" enabled but the ACPI table does not provide a means to enable it through FADT->SmiCmd."
|
||||
" This may cause issues in OS.\n"));
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
DEBUG_CODE_END ();
|
||||
return RETURN_SUCCESS;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user