feat: [EHL] add EfiResetShutdown in ResetSystemLib

The patch handles EfiResetShutdown. With the patch, one can
test "reset off" under OS Loader.

The patch also
 - fixes a wrong reference error in ResetSystemLib.inf.
 - add shutdown text in CmdReset.c

Signed-off-by: Stanley Chang <stanley.chang@intel.com>
This commit is contained in:
Stanley Chang 2023-08-22 11:10:20 +08:00 committed by Guo Dong
parent e4ff07171f
commit ca071fd9e3
4 changed files with 52 additions and 2 deletions

View File

@ -83,7 +83,11 @@ ShellCommandResetFunc (
FuncResetSystem = PlatformService->ResetSystem; FuncResetSystem = PlatformService->ResetSystem;
} }
ShellPrint (L"Resetting...\n"); if (ResetType == EfiResetShutdown) {
ShellPrint (L"Start shutdowning...\n");
} else {
ShellPrint (L"Resetting...\n");
}
FuncResetSystem (ResetType); FuncResetSystem (ResetType);
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -12,6 +12,7 @@
#include <Library/IoLib.h> #include <Library/IoLib.h>
#include <Library/ResetSystemLib.h> #include <Library/ResetSystemLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <Register/PmcRegs.h>
#include <PchAccess.h> #include <PchAccess.h>
#include <FspEas/FspApi.h> #include <FspEas/FspApi.h>
@ -55,6 +56,46 @@ ResetWarm (
IoWrite8 ((UINTN) R_RST_CNT, V_RST_CNT_HARDRESET); IoWrite8 ((UINTN) R_RST_CNT, V_RST_CNT_HARDRESET);
} }
/**
Calling this function causes the system to enter a power state equivalent
to the ACPI G2/S5 or G3 states.
System shutdown should not return, if it returns, it means the system does
not support shut down reset.
**/
VOID
ResetShutdown (
VOID
)
{
UINT32 Data32;
///
/// Firstly, GPE0_EN should be disabled to avoid any GPI waking up the system from S5
///
IoWrite32 (ACPI_BASE_ADDRESS + R_ACPI_IO_GPE0_EN_127_96, 0);
///
/// Secondly, PwrSts register must be cleared
///
/// Write a "1" to bit[8] of power button status register at
/// (PM_BASE + PM1_STS_OFFSET) to clear this bit
///
IoWrite16 (ACPI_BASE_ADDRESS + R_ACPI_IO_PM1_STS, B_ACPI_IO_PM1_STS_PWRBTN);
///
/// Finally, transform system into S5 sleep state
///
Data32 = IoRead32 (ACPI_BASE_ADDRESS + R_ACPI_IO_PM1_CNT);
Data32 = (UINT32) ((Data32 &~(B_ACPI_IO_PM1_CNT_SLP_TYP + B_ACPI_IO_PM1_CNT_SLP_EN)) | V_ACPI_IO_PM1_CNT_S5);
IoWrite32 (ACPI_BASE_ADDRESS + R_ACPI_IO_PM1_CNT, Data32);
Data32 = Data32 | B_ACPI_IO_PM1_CNT_SLP_EN;
IoWrite32 (ACPI_BASE_ADDRESS + R_ACPI_IO_PM1_CNT, Data32);
}
/** /**
Calling this function causes a PCH Global reset in addition to system-wide Calling this function causes a PCH Global reset in addition to system-wide
initialization. initialization.
@ -93,6 +134,10 @@ ResetSystem (
ResetCold (); ResetCold ();
break; break;
case EfiResetShutdown:
ResetShutdown ();
break;
case EfiResetPlatformSpecific: case EfiResetPlatformSpecific:
FspResetRequest = (EFI_STATUS)PcdGet32(PcdFspResetStatus); FspResetRequest = (EFI_STATUS)PcdGet32(PcdFspResetStatus);
if (FspResetRequest == FSP_STATUS_RESET_REQUIRED_3) { if (FspResetRequest == FSP_STATUS_RESET_REQUIRED_3) {

View File

@ -27,7 +27,7 @@
MdePkg/MdePkg.dec MdePkg/MdePkg.dec
BootloaderCommonPkg/BootloaderCommonPkg.dec BootloaderCommonPkg/BootloaderCommonPkg.dec
BootloaderCorePkg/BootloaderCorePkg.dec BootloaderCorePkg/BootloaderCorePkg.dec
Silicon/AlderlakePkg/AlderlakePkg.dec Silicon/ElkhartlakePkg/ElkhartlakePkg.dec
IntelFsp2Pkg/IntelFsp2Pkg.dec IntelFsp2Pkg/IntelFsp2Pkg.dec
[LibraryClasses] [LibraryClasses]

View File

@ -64,6 +64,7 @@
#define B_ACPI_IO_PM1_EN_PWRBTN BIT8 #define B_ACPI_IO_PM1_EN_PWRBTN BIT8
#define R_ACPI_IO_PM1_CNT 0x04 #define R_ACPI_IO_PM1_CNT 0x04
#define B_ACPI_IO_PM1_CNT_SLP_EN BIT13
#define B_ACPI_IO_PM1_CNT_SLP_TYP (BIT12 | BIT11 | BIT10) #define B_ACPI_IO_PM1_CNT_SLP_TYP (BIT12 | BIT11 | BIT10)
#define V_ACPI_IO_PM1_CNT_S0 0 #define V_ACPI_IO_PM1_CNT_S0 0
#define V_ACPI_IO_PM1_CNT_S3 (BIT12 | BIT10) #define V_ACPI_IO_PM1_CNT_S3 (BIT12 | BIT10)