From 45e2900164332cb97384e765b6c17529816002fe Mon Sep 17 00:00:00 2001 From: Raghava Gudla Date: Fri, 8 May 2020 16:26:06 -0700 Subject: [PATCH] Reprogram SMRR base and mask on S3 path for CFL This patch will generate a SW smi on S3 resume path when using UEFI payload. Handler for this Sw smi in UEFI payload will program SMRR base and mask for BSP and all AP's. Signed-off-by: Raghava Gudla --- .../Include/Library/S3SaveRestoreLib.h | 20 ++++++++++++++ .../Library/S3SaveRestoreLib/S3SaveRestore.c | 18 +++++++++++++ .../S3SaveRestoreLib/S3SaveRestoreLib.inf | 2 -- .../Stage2BoardInitLib/Stage2BoardInitLib.c | 27 +++++++++++++------ 4 files changed, 57 insertions(+), 10 deletions(-) diff --git a/BootloaderCorePkg/Include/Library/S3SaveRestoreLib.h b/BootloaderCorePkg/Include/Library/S3SaveRestoreLib.h index 90b715ca..6b9e85c4 100644 --- a/BootloaderCorePkg/Include/Library/S3SaveRestoreLib.h +++ b/BootloaderCorePkg/Include/Library/S3SaveRestoreLib.h @@ -13,6 +13,7 @@ #define SMMBASE_INFO_COMM_ID 1 #define S3_SAVE_REG_COMM_ID 2 +#define BL_SW_SMI_COMM_ID 3 // // Format to share info between bootloader and payload. @@ -89,8 +90,27 @@ typedef struct { CPU_SMMBASE SmmBase[]; } SMMBASE_INFO; +typedef struct { + BL_PLD_COMM_HDR BlSwSmiHdr; + UINT8 BlSwSmiHandlerInput; +} BL_SW_SMI_INFO; + #pragma pack() +/** + Trigger Payload software SMI + + This function triggers software SMI. SMI number will be obtained + from SMM communication area. + + @param[in] SwSmiNumber Software smi number to be triggered. + +**/ +VOID +TriggerPayloadSwSmi ( + IN UINT8 SwSmiNumber +); + /** This function appends information in TSEG area designated for S3 save/restore purpose. diff --git a/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestore.c b/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestore.c index 5b4162af..b9519178 100644 --- a/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestore.c +++ b/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestore.c @@ -21,6 +21,7 @@ typedef VOID (*REG_WRITE) (UINTN, UINT32); #define NUM_TYPE 2 #define NUM_WIDTH 3 +#define REG_APM_CNT 0xB2 const REG_WRITE mRegWrite[NUM_TYPE][NUM_WIDTH] = { { (REG_WRITE) MmioWrite8, (REG_WRITE) MmioWrite16, (REG_WRITE) MmioWrite32 }, @@ -38,6 +39,23 @@ const UINT8 mWidthToIdx[NUM_WIDTH][2] = { { 2, WIDE32 } }; +/** + Trigger payload software SMI + + This function triggers software SMI. SMI number will be obtained + from SMM communication area. + + @param[in] SwSmiNumber Software smi number to be triggered. + +**/ +VOID +TriggerPayloadSwSmi ( + IN UINT8 SwSmiNumber +) +{ + IoWrite8(REG_APM_CNT, SwSmiNumber); +} + /** This function appends information in TSEG area designated for S3 save/restore purpose. diff --git a/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestoreLib.inf b/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestoreLib.inf index 60e5add9..eee09270 100644 --- a/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestoreLib.inf +++ b/BootloaderCorePkg/Library/S3SaveRestoreLib/S3SaveRestoreLib.inf @@ -35,5 +35,3 @@ [Guids] gSmmInformationGuid - -[Pcd] diff --git a/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c b/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c index 8d80b559..e80b76a6 100644 --- a/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c +++ b/Platform/CoffeelakeBoardPkg/Library/Stage2BoardInitLib/Stage2BoardInitLib.c @@ -965,6 +965,7 @@ BoardInit ( UINT32 AddressPort; UINTN SpiBar0; UINT32 Length; + BL_SW_SMI_INFO *BlSwSmiInfo; VTD_INFO *VtdInfo; EFI_PEI_GRAPHICS_INFO_HOB *FspGfxHob; LOADER_GLOBAL_DATA *LdrGlobal; @@ -1041,6 +1042,24 @@ BoardInit ( case PrePciEnumeration: break; case PostPciEnumeration: + if (GetBootMode() == BOOT_ON_S3_RESUME) { + // + // Clear Smi + // + ClearSmi (); + RestoreS3RegInfo (FindS3Info (S3_SAVE_REG_COMM_ID)); + BlSwSmiInfo = NULL; + + // + // If UEFI payload registered a software SMI handler + // for bootloader to restore SMRR base and mask in + // S3 resume path, trigger sw smi + // + BlSwSmiInfo = FindS3Info (BL_SW_SMI_COMM_ID); + if (BlSwSmiInfo != NULL) { + TriggerPayloadSwSmi (BlSwSmiInfo->BlSwSmiHandlerInput); + } + } break; case PrePayloadLoading: Status = IgdOpRegionInit (); @@ -1073,14 +1092,6 @@ BoardInit ( } break; case ReadyToBoot: - // - // Clear Smi and restore S3 regs on S3 resume - // - ClearSmi (); - if ((GetBootMode() == BOOT_ON_S3_RESUME) && (GetPayloadId () == UEFI_PAYLOAD_ID_SIGNATURE)) { - RestoreS3RegInfo (FindS3Info (S3_SAVE_REG_COMM_ID)); - } - // // Do necessary locks, and clean up before jumping tp OS //