diff --git a/UefiPayloadPkg/Include/Guid/SmmStoreInfoGuid.h b/UefiPayloadPkg/Include/Guid/SmmStoreInfoGuid.h new file mode 100644 index 0000000000..d5dcb8218f --- /dev/null +++ b/UefiPayloadPkg/Include/Guid/SmmStoreInfoGuid.h @@ -0,0 +1,27 @@ +/** @file + This file defines the hob structure for coreboot's SmmStore. + + Copyright (c) 2022, 9elements GmbH
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SMMSTORE_GUID_H_ +#define SMMSTORE_GUID_H_ + +/// +/// System Table Information GUID +/// +extern EFI_GUID gEfiSmmStoreInfoHobGuid; + +typedef struct { + UINT64 ComBuffer; + UINT32 ComBufferSize; + UINT32 NumBlocks; + UINT32 BlockSize; + UINT64 MmioAddress; + UINT8 ApmCmd; + UINT8 Reserved0[3]; +} SMMSTORE_INFO; + +#endif // SMMSTORE_GUID_H_ diff --git a/UefiPayloadPkg/Include/Library/SmmStoreParseLib.h b/UefiPayloadPkg/Include/Library/SmmStoreParseLib.h new file mode 100644 index 0000000000..0b5b8f8aba --- /dev/null +++ b/UefiPayloadPkg/Include/Library/SmmStoreParseLib.h @@ -0,0 +1,29 @@ +/** @file + This library will parse the coreboot table in memory and extract those required + information. + + Copyright (c) 2021, Star Labs Systems. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef SMM_STORE_PARSE_LIB_H_ +#define SMM_STORE_PARSE_LIB_H_ + +#include + +/** + Find the SmmStore HOB. + + @param SmmStoreInfo Pointer to the SMMSTORE_INFO structure + + @retval RETURN_SUCCESS Successfully find the Smm store buffer information. + @retval RETURN_NOT_FOUND Failed to find the Smm store buffer information . +**/ +RETURN_STATUS +EFIAPI +ParseSmmStoreInfo ( + OUT SMMSTORE_INFO *SmmStoreInfo + ); + +#endif // SMM_STORE_PARSE_LIB_H_ diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c index 8a353f77f6..5c7efec3ec 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -604,3 +605,45 @@ ParseMiscInfo ( { return RETURN_SUCCESS; } + +/** + Find the SmmStore HOB. + + @param SmmStoreInfo Pointer to the SMMSTORE_INFO structure + + @retval RETURN_SUCCESS Successfully find the Smm store buffer information. + @retval RETURN_NOT_FOUND Failed to find the Smm store buffer information . +**/ +RETURN_STATUS +EFIAPI +ParseSmmStoreInfo ( + OUT SMMSTORE_INFO *SmmStoreInfo + ) +{ + struct cb_smmstorev2 *CbSSRec; + + if (SmmStoreInfo == NULL) { + return RETURN_INVALID_PARAMETER; + } + + CbSSRec = FindCbTag (CB_TAG_SMMSTOREV2); + if (CbSSRec == NULL) { + return RETURN_NOT_FOUND; + } + + DEBUG ((DEBUG_INFO, "Found Smm Store information\n")); + DEBUG ((DEBUG_INFO, "block size: 0x%x\n", CbSSRec->block_size)); + DEBUG ((DEBUG_INFO, "number of blocks: 0x%x\n", CbSSRec->num_blocks)); + DEBUG ((DEBUG_INFO, "communication buffer: 0x%x\n", CbSSRec->com_buffer)); + DEBUG ((DEBUG_INFO, "communication buffer size: 0x%x\n", CbSSRec->com_buffer_size)); + DEBUG ((DEBUG_INFO, "MMIO address of store: 0x%x\n", CbSSRec->mmap_addr)); + + SmmStoreInfo->ComBuffer = CbSSRec->com_buffer; + SmmStoreInfo->ComBufferSize = CbSSRec->com_buffer_size; + SmmStoreInfo->BlockSize = CbSSRec->block_size; + SmmStoreInfo->NumBlocks = CbSSRec->num_blocks; + SmmStoreInfo->MmioAddress = CbSSRec->mmap_addr; + SmmStoreInfo->ApmCmd = CbSSRec->apm_cmd; + + return RETURN_SUCCESS; +} diff --git a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c index d88238bfdc..6875fa9934 100644 --- a/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c +++ b/UefiPayloadPkg/Library/SblParseLib/SblParseLib.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -289,3 +290,20 @@ ParseMiscInfo ( return Status; } + +/** + Find the SmmStore HOB. + + @param SmmStoreInfo Pointer to the SMMSTORE_INFO structure + + @retval RETURN_SUCCESS Successfully find the Smm store buffer information. + @retval RETURN_NOT_FOUND Failed to find the Smm store buffer information . +**/ +RETURN_STATUS +EFIAPI +ParseSmmStoreInfo ( + OUT SMMSTORE_INFO *SmmStoreInfo + ) +{ + return RETURN_NOT_FOUND; +} diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c index 780348eadf..7f37283515 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.c @@ -259,6 +259,8 @@ BuildHobFromBl ( { EFI_STATUS Status; ACPI_BOARD_INFO *AcpiBoardInfo; + SMMSTORE_INFO SmmStoreInfo; + SMMSTORE_INFO *NewSmmStoreInfo; EFI_PEI_GRAPHICS_INFO_HOB GfxInfo; EFI_PEI_GRAPHICS_INFO_HOB *NewGfxInfo; EFI_PEI_GRAPHICS_DEVICE_INFO_HOB GfxDeviceInfo; @@ -305,6 +307,17 @@ BuildHobFromBl ( DEBUG ((DEBUG_INFO, "Created graphics device info hob\n")); } + // + // Create guid hob for SmmStore + // + Status = ParseSmmStoreInfo (&SmmStoreInfo); + if (!EFI_ERROR (Status)) { + NewSmmStoreInfo = BuildGuidHob (&gEfiSmmStoreInfoHobGuid, sizeof (SmmStoreInfo)); + ASSERT (NewSmmStoreInfo != NULL); + CopyMem (NewSmmStoreInfo, &SmmStoreInfo, sizeof (SmmStoreInfo)); + DEBUG ((DEBUG_INFO, "Created SmmStore info hob\n")); + } + // // Creat SmBios table Hob // diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h index d1c7425b28..301dedb427 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #define LEGACY_8259_MASK_REGISTER_MASTER 0x21 #define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1 diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf index 95446dd997..fcc9fd8aff 100644 --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf @@ -66,6 +66,7 @@ gUniversalPayloadSmbiosTableGuid gUniversalPayloadAcpiTableGuid gUniversalPayloadSerialPortInfoGuid + gEfiSmmStoreInfoHobGuid [FeaturePcd.IA32] gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec b/UefiPayloadPkg/UefiPayloadPkg.dec index 1ccfc32548..1c199b378e 100644 --- a/UefiPayloadPkg/UefiPayloadPkg.dec +++ b/UefiPayloadPkg/UefiPayloadPkg.dec @@ -43,6 +43,8 @@ gSmmRegisterInfoGuid = { 0xaa9bd7a7, 0xcafb, 0x4499, { 0xa4, 0xa9, 0xb, 0x34, 0x6b, 0x40, 0xa6, 0x22 } } gS3CommunicationGuid = { 0x88e31ba1, 0x1856, 0x4b8b, { 0xbb, 0xdf, 0xf8, 0x16, 0xdd, 0x94, 0xa, 0xef } } + gEfiSmmStoreInfoHobGuid = { 0xf585ca19, 0x881b, 0x44fb, { 0x3f, 0x3d, 0x81, 0x89, 0x7c, 0x57, 0xbb, 0x01 } } + [Ppis] gEfiPayLoadHobBasePpiGuid = { 0xdbe23aa1, 0xa342, 0x4b97, {0x85, 0xb6, 0xb2, 0x26, 0xf1, 0x61, 0x73, 0x89} }