From: Benjamin Doron <benjamin.do...@9elements.com> To be used with the https://review.coreboot.org/c/coreboot/+/70378 patch-series. Now feature complete, awaiting final upstream feedback whether generating some data inside coreboot is okay.
Cc: Guo Dong <guo.d...@intel.com> Cc: Ray Ni <ray...@intel.com> Cc: Sean Rhodes <sean@starlabs.systems> Cc: James Lu <james...@intel.com> Cc: Gua Guo <gua....@intel.com> Signed-off-by: Benjamin Doron <benjamin.do...@9elements.com> --- UefiPayloadPkg/Include/Coreboot.h | 50 ++++++++ UefiPayloadPkg/Library/CbParseLib/CbParseLib.c | 121 +++++++++++++++++++- UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf | 9 ++ 3 files changed, 179 insertions(+), 1 deletion(-) diff --git a/UefiPayloadPkg/Include/Coreboot.h b/UefiPayloadPkg/Include/Coreboot.h index 6c33dda9ef85..add64d9623d9 100644 --- a/UefiPayloadPkg/Include/Coreboot.h +++ b/UefiPayloadPkg/Include/Coreboot.h @@ -270,6 +270,56 @@ struct fmap { struct fmap_area areas[]; } __attribute__ ((packed)); +#define CB_TAG_PLD_SMM_REGISTER_INFO 0x0050 +struct lb_pld_generic_register { + UINT8 register_id; + UINT8 address_space_id; + UINT8 register_bit_width; + UINT8 register_bit_offset; + UINT32 value; + struct cbuint64 address; +}; + +struct lb_pld_smm_registers { + UINT32 tag; + UINT32 size; + UINT32 revision; + UINT32 count; + struct lb_pld_generic_register registers[]; +}; + +#define CB_TAG_PLD_SMM_SMRAM 0x0051 +struct lb_pld_smram_descriptor { + struct cbuint64 physical_start; + struct cbuint64 physical_size; + struct cbuint64 region_state; +}; + +struct lb_pld_smram_descriptor_block { + UINT32 tag; + UINT32 size; + UINT32 number_of_smm_regions; + struct lb_pld_smram_descriptor descriptor[1]; +}; + +#define CB_TAG_PLD_SPI_FLASH_INFO 0x0052 +struct lb_pld_spi_flash_info { + UINT32 tag; + UINT32 size; + UINT16 revision; + UINT16 flags; + struct lb_pld_generic_register spi_address; +}; + +#define CB_TAG_PLD_S3_COMMUNICATION 0x0054 +struct lb_pld_s3_communication { + UINT32 tag; + UINT32 size; + struct lb_pld_smram_descriptor comm_buffer; + UINT8 pld_acpi_s3_enable; + UINT8 pad[3]; +}; + /* Helpful macros */ #define MEM_RANGE_COUNT(_rec) \ diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c index 8a353f77f635..46b164231fe5 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.c @@ -7,15 +7,22 @@ **/ -#include <Uefi/UefiBaseType.h> +#include <PiPei.h> #include <Library/BaseLib.h> #include <Library/BaseMemoryLib.h> #include <Library/DebugLib.h> #include <Library/PcdLib.h> #include <Library/IoLib.h> +#include <Library/HobLib.h> #include <Library/BlParseLib.h> +#include <Library/FmapParserLib.h> #include <IndustryStandard/Acpi.h> #include <Coreboot.h> +#include <Guid/SmmRegisterInfoGuid.h> +#include <Guid/SmramMemoryReserve.h> +#include <Guid/SpiFlashInfoGuid.h> +#include <Guid/NvVariableInfoGuid.h> +#include <Guid/SmmS3CommunicationInfoGuid.h> /** Convert a packed value from cbuint64 to a UINT64 value. @@ -602,5 +609,117 @@ ParseMiscInfo ( VOID ) { + struct lb_pld_smm_registers *BlSmmRegisters; + PLD_SMM_REGISTERS *PldSmmRegisters; + UINTN Index; + struct lb_pld_smram_descriptor_block *BlSmramInfo; + EFI_SMRAM_HOB_DESCRIPTOR_BLOCK *PldSmramHob; + struct lb_pld_spi_flash_info *BlSpiFlashInfo; + SPI_FLASH_INFO *PldSpiFlashInfo; + EFI_PHYSICAL_ADDRESS SmmStoreFmapRegionAddress; + UINT32 SmmStoreFmapRegionSize; + EFI_STATUS Status; + NV_VARIABLE_INFO *PldNvVariableInfo; + struct lb_pld_s3_communication *BlS3Communication; + PLD_S3_COMMUNICATION *PldS3Communication; + + BlSmmRegisters = FindCbTag (CB_TAG_PLD_SMM_REGISTER_INFO); + if (BlSmmRegisters != NULL) { + PldSmmRegisters = BuildGuidHob ( + &gSmmRegisterInfoGuid, + sizeof (PLD_SMM_REGISTERS) + (BlSmmRegisters->count * sizeof (PLD_GENERIC_REGISTER)) + ); + if (PldSmmRegisters != NULL) { + PldSmmRegisters->Revision = BlSmmRegisters->revision; + + PldSmmRegisters->Count = BlSmmRegisters->count; + for (Index = 0; Index < BlSmmRegisters->count; Index++) { + PldSmmRegisters->Registers[Index].Id = BlSmmRegisters->registers[Index].register_id; + PldSmmRegisters->Registers[Index].Address.AddressSpaceId = BlSmmRegisters->registers[Index].address_space_id; + PldSmmRegisters->Registers[Index].Address.RegisterBitWidth = BlSmmRegisters->registers[Index].register_bit_width; + PldSmmRegisters->Registers[Index].Address.RegisterBitOffset = BlSmmRegisters->registers[Index].register_bit_offset; + PldSmmRegisters->Registers[Index].Value = BlSmmRegisters->registers[Index].value; + PldSmmRegisters->Registers[Index].Address.Address = cb_unpack64 (BlSmmRegisters->registers[Index].address); + + // Required for UefiPayload implementation compatibility + PldSmmRegisters->Registers[Index].Address.AccessSize = EFI_ACPI_3_0_DWORD; + } + + DEBUG ((DEBUG_INFO, "Create SMM register info guid hob\n")); + } + } + + BlSmramInfo = FindCbTag (CB_TAG_PLD_SMM_SMRAM); + if (BlSmramInfo != NULL) { + PldSmramHob = BuildGuidHob ( + &gEfiSmmSmramMemoryGuid, + sizeof (EFI_SMRAM_HOB_DESCRIPTOR_BLOCK) + ((BlSmramInfo->number_of_smm_regions - 1) * sizeof (EFI_SMRAM_DESCRIPTOR)) + ); + if (PldSmramHob != NULL) { + PldSmramHob->NumberOfSmmReservedRegions = BlSmramInfo->number_of_smm_regions; + for (Index = 0; Index < BlSmramInfo->number_of_smm_regions; Index++) { + PldSmramHob->Descriptor[Index].PhysicalStart = cb_unpack64 (BlSmramInfo->descriptor[Index].physical_start); + PldSmramHob->Descriptor[Index].CpuStart = cb_unpack64 (BlSmramInfo->descriptor[Index].physical_start); + PldSmramHob->Descriptor[Index].PhysicalSize = cb_unpack64 (BlSmramInfo->descriptor[Index].physical_size); + PldSmramHob->Descriptor[Index].RegionState = cb_unpack64 (BlSmramInfo->descriptor[Index].region_state); + } + + DEBUG ((DEBUG_INFO, "Create SMRAM memory info guid hob\n")); + } + } + + BlSpiFlashInfo = FindCbTag (CB_TAG_PLD_SPI_FLASH_INFO); + if (BlSpiFlashInfo != NULL) { + PldSpiFlashInfo = BuildGuidHob ( + &gSpiFlashInfoGuid, + sizeof (SPI_FLASH_INFO) + ); + if (PldSpiFlashInfo != NULL) { + PldSpiFlashInfo->Revision = BlSpiFlashInfo->revision; + PldSpiFlashInfo->Flags = BlSpiFlashInfo->flags; + + PldSpiFlashInfo->SpiAddress.AddressSpaceId = BlSpiFlashInfo->spi_address.address_space_id; + PldSpiFlashInfo->SpiAddress.RegisterBitWidth = BlSpiFlashInfo->spi_address.register_bit_width; + PldSpiFlashInfo->SpiAddress.RegisterBitOffset = BlSpiFlashInfo->spi_address.register_bit_offset; + PldSpiFlashInfo->SpiAddress.Address = cb_unpack64 (BlSpiFlashInfo->spi_address.address); + + // Required for UefiPayload implementation compatibility + PldSpiFlashInfo->SpiAddress.AccessSize = EFI_ACPI_3_0_DWORD; + + DEBUG ((DEBUG_INFO, "Create SPI flash info guid hob\n")); + } + } + + Status = FmapLocateArea ("SMMSTORE", &SmmStoreFmapRegionAddress, &SmmStoreFmapRegionSize); + if (!EFI_ERROR (Status)) { + PldNvVariableInfo = BuildGuidHob ( + &gNvVariableInfoGuid, + sizeof (NV_VARIABLE_INFO) + ); + if (PldNvVariableInfo != NULL) { + PldNvVariableInfo->Revision = 0; + PldNvVariableInfo->VariableStoreBase = (UINT32)SmmStoreFmapRegionAddress; + PldNvVariableInfo->VariableStoreSize = SmmStoreFmapRegionSize; + + DEBUG ((DEBUG_INFO, "Create NV variable info guid hob\n")); + } + } + + BlS3Communication = FindCbTag (CB_TAG_PLD_S3_COMMUNICATION); + if (BlS3Communication != NULL) { + PldS3Communication = BuildGuidHob ( + &gS3CommunicationGuid, + sizeof (PLD_S3_COMMUNICATION) + ); + if (PldS3Communication != NULL) { + PldS3Communication->CommBuffer.PhysicalStart = cb_unpack64 (BlS3Communication->comm_buffer.physical_start); + PldS3Communication->CommBuffer.CpuStart = cb_unpack64 (BlS3Communication->comm_buffer.physical_start); + PldS3Communication->CommBuffer.PhysicalSize = cb_unpack64 (BlS3Communication->comm_buffer.physical_size); + PldS3Communication->PldAcpiS3Enable = BlS3Communication->pld_acpi_s3_enable; + + DEBUG ((DEBUG_INFO, "Create S3 communication info guid hob\n")); + } + } + return RETURN_SUCCESS; } diff --git a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf index cf81697703cc..306b7ae38fe8 100644 --- a/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf +++ b/UefiPayloadPkg/Library/CbParseLib/CbParseLib.inf @@ -34,6 +34,15 @@ IoLib DebugLib PcdLib + HobLib + FmapParserLib + +[Guids] + gSmmRegisterInfoGuid + gEfiSmmSmramMemoryGuid + gSpiFlashInfoGuid + gNvVariableInfoGuid + gS3CommunicationGuid [Pcd] gUefiPayloadPkgTokenSpaceGuid.PcdBootloaderParameter -- 2.43.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#112338): https://edk2.groups.io/g/devel/message/112338 Mute This Topic: https://groups.io/mt/103119571/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-