From: Michael Kubacki <michael.kuba...@microsoft.com> Adds a new module that installs a PRM SSDT.
Note: A library class would allow a high degree of flexibility for platforms that choose: 1. To not install a PRM SSDT at all (using a NULL library instance) 2. To install a specific PRM SSDT implementation However, it is implemented as a driver since build tools are not linking ACPI tables to drivers from linked library classes. Cc: Andrew Fish <af...@apple.com> Cc: Kang Gao <kang....@intel.com> Cc: Michael D Kinney <michael.d.kin...@intel.com> Cc: Michael Kubacki <michael.kuba...@microsoft.com> Cc: Leif Lindholm <l...@nuviainc.com> Cc: Benjamin You <benjamin....@intel.com> Cc: Liu Yun <yun.y....@intel.com> Cc: Ankit Sinha <ankit.si...@intel.com> Cc: Nate DeSimone <nathaniel.l.desim...@intel.com> Signed-off-by: Michael Kubacki <michael.kuba...@microsoft.com> --- PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c | 33 ------ PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 ++++++++++++++++++++ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf | 4 +- PrmPkg/PrmPkg.dsc | 5 + PrmPkg/{PrmLoaderDxe => PrmSsdtInstallDxe}/Prm.asl | 18 +--- PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf | 52 +++++++++ 6 files changed, 171 insertions(+), 51 deletions(-) diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c index 5e14b8e09dd0..e45f8685e81f 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -20,7 +20,6 @@ #include <Library/PrmContextBufferLib.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/UefiLib.h> -#include <Library/DxeServicesLib.h> #include <Protocol/AcpiTable.h> #include <Protocol/LoadedImage.h> #include <Protocol/PrmConfig.h> @@ -811,8 +810,6 @@ PublishPrmAcpiTable ( EFI_STATUS Status; EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; UINTN TableKey; - EFI_ACPI_DESCRIPTION_HEADER *Ssdt; - UINTN SsdtSize; if (PrmAcpiDescriptionTable == NULL || PrmAcpiDescriptionTable->Header.Signature != PRM_TABLE_SIGNATURE) { return EFI_INVALID_PARAMETER; @@ -836,36 +833,6 @@ PublishPrmAcpiTable ( } ASSERT_EFI_ERROR (Status); - // - // Load SSDT - // - Status = GetSectionFromFv ( - &gEfiCallerIdGuid, - EFI_SECTION_RAW, - 0, - (VOID **) &Ssdt, - &SsdtSize - ); - ASSERT_EFI_ERROR (Status); - DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded ...\n", _DBGMSGID_, __FUNCTION__)); - - // - // Update OEM ID - // - CopyMem (&Ssdt->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Ssdt->OemId)); - - // - // Publish the SSDT. Table is re-checksumed. - // - TableKey = 0; - Status = AcpiTableProtocol->InstallAcpiTable ( - AcpiTableProtocol, - Ssdt, - SsdtSize, - &TableKey - ); - ASSERT_EFI_ERROR (Status); - return Status; } diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c new file mode 100644 index 000000000000..bd9ce2c6fa02 --- /dev/null +++ b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c @@ -0,0 +1,110 @@ +/** @file + + This file contains a sample implementation of the Platform Runtime Mechanism (PRM) + SSDT Install library. + + Copyright (c) Microsoft Corporation + Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include <IndustryStandard/Acpi.h> +#include <Library/BaseLib.h> +#include <Library/BaseMemoryLib.h> +#include <Library/DebugLib.h> +#include <Library/DxeServicesLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Protocol/AcpiTable.h> + +#define _DBGMSGID_ "[PRMSSDTINSTALL]" + +/** + Installs the PRM SSDT. + + @param[in] OemId OEM ID to be used in the SSDT installation. + + @retval EFI_SUCCESS The PRM SSDT was installed successfully. + @retval EFI_INVALID_PARAMETER The OemId pointer argument is NULL. + @retval EFI_NOT_FOUND An instance of gEfiAcpiTableProtocolGuid was not found installed or + the SSDT (AML RAW section) could not be found in the current FV. + @retval EFI_OUT_OF_RESOURCES Insufficient memory resources to install the PRM SSDT. + +**/ +EFI_STATUS +InstallPrmSsdt ( + IN CONST UINT8 *OemId + ) +{ + EFI_STATUS Status; + UINTN SsdtSize; + UINTN TableKey; + EFI_ACPI_TABLE_PROTOCOL *AcpiTableProtocol; + EFI_ACPI_DESCRIPTION_HEADER *Ssdt; + + DEBUG ((DEBUG_INFO, "%a %a - Entry.\n", _DBGMSGID_, __FUNCTION__)); + + if (OemId == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTableProtocol); + if (!EFI_ERROR (Status)) { + // + // Discover the SSDT + // + Status = GetSectionFromFv ( + &gEfiCallerIdGuid, + EFI_SECTION_RAW, + 0, + (VOID **) &Ssdt, + &SsdtSize + ); + ASSERT_EFI_ERROR (Status); + DEBUG ((DEBUG_INFO, "%a %a: SSDT loaded...\n", _DBGMSGID_, __FUNCTION__)); + + // + // Update OEM ID in the SSDT + // + CopyMem (&Ssdt->OemId, OemId, sizeof (Ssdt->OemId)); + + // + // Publish the SSDT. Table is re-checksummed. + // + TableKey = 0; + Status = AcpiTableProtocol->InstallAcpiTable ( + AcpiTableProtocol, + Ssdt, + SsdtSize, + &TableKey + ); + ASSERT_EFI_ERROR (Status); + } + + return Status; +} + +/** + The entry point for this module. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point is executed successfully. + @retval Others An error occurred when executing this entry point. + +**/ +EFI_STATUS +EFIAPI +PrmSsdtInstallEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + EFI_STATUS Status; + + Status = InstallPrmSsdt ((UINT8 *) PcdGetPtr (PcdAcpiDefaultOemId)); + ASSERT_EFI_ERROR (Status); + + return Status; +} diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf index 016ced4b3732..4d959ccd35a3 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf @@ -24,7 +24,6 @@ [Sources] PrmAcpiTable.h PrmLoader.h PrmLoaderDxe.c - Prm.asl [Packages] MdePkg/MdePkg.dec @@ -39,13 +38,12 @@ [LibraryClasses] BaseMemoryLib DebugLib MemoryAllocationLib + PcdLib PeCoffLib PrmContextBufferLib UefiBootServicesTableLib UefiDriverEntryPoint UefiLib - DxeServicesLib - PcdLib [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSUMES diff --git a/PrmPkg/PrmPkg.dsc b/PrmPkg/PrmPkg.dsc index 1a0ddc6ac181..d3aeffa152e0 100644 --- a/PrmPkg/PrmPkg.dsc +++ b/PrmPkg/PrmPkg.dsc @@ -84,6 +84,11 @@ [Components] # $(PLATFORM_PACKAGE)/PrmLoaderDxe/PrmLoaderDxe.inf + # + # PRM SSDT Installation Driver + # + $(PLATFORM_PACKAGE)/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf + # # PRM Sample Modules # diff --git a/PrmPkg/PrmLoaderDxe/Prm.asl b/PrmPkg/PrmSsdtInstallDxe/Prm.asl similarity index 82% rename from PrmPkg/PrmLoaderDxe/Prm.asl rename to PrmPkg/PrmSsdtInstallDxe/Prm.asl index 76b56de732da..0457d09e6954 100644 --- a/PrmPkg/PrmLoaderDxe/Prm.asl +++ b/PrmPkg/PrmSsdtInstallDxe/Prm.asl @@ -8,10 +8,10 @@ DefinitionBlock ( "Prm.aml", "SSDT", - 0x01, - "OEMID", + 2, + "OEMID ", "PRMOPREG", - 0x3000 + 0x1000 ) { Scope (\_SB) @@ -66,18 +66,6 @@ DefinitionBlock ( { \_SB.PRMB.SETV (BUF1) } - Method (TST1) - { - \_SB.PRMB.SETV (BUF1) - } - Method (TST2) - { - \_SB.PRMB.SETV (BUF2) - } - Method (TST3) - { - \_SB.PRMB.SETV (BUF3) - } } } diff --git a/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf new file mode 100644 index 000000000000..e68e9460ddc5 --- /dev/null +++ b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf @@ -0,0 +1,52 @@ +## @file +# PRM SSDT Installation Driver +# +# This driver installs the PRM SSDT. +# * Not all PRM implementations may need this support and if it is not needed, the driver +# can simply be removed from the platform build. +# * The platform may also choose to use this driver but modify the ASL file. +# +# Copyright (c) Microsoft Corporation +# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = PrmSsdtInstallDxe + FILE_GUID = B0423E2F-3B2C-4A36-BF98-3EB3B4B7CB0E + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = PrmSsdtInstallEntryPoint + +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + PrmSsdtInstallDxe.c + Prm.asl + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + PrmPkg/PrmPkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + DxeServicesLib + UefiBootServicesTableLib + UefiDriverEntryPoint + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId ## CONSUMES + +[Protocols] + gEfiAcpiTableProtocolGuid + +[Depex] + gEfiAcpiTableProtocolGuid -- 2.28.0.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#87857): https://edk2.groups.io/g/devel/message/87857 Mute This Topic: https://groups.io/mt/89955990/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-