From 50e1432a40ef82d862c4939bf8cbab361895b114 Mon Sep 17 00:00:00 2001 From: Michael Kubacki Date: Wed, 20 May 2020 10:56:03 -0700 Subject: [PATCH] PrmPkg: Add initial PrmSsdtInstallDxe module 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 Cc: Kang Gao Cc: Michael D Kinney Cc: Michael Kubacki Cc: Leif Lindholm Cc: Benjamin You Cc: Liu Yun Cc: Ankit Sinha Cc: Nate DeSimone Signed-off-by: Michael Kubacki Acked-by: Michael D Kinney Acked-by: Liming Gao Acked-by: Leif Lindholm Reviewed-by: Ankit Sinha --- PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c | 33 ------ PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf | 4 +- PrmPkg/PrmPkg.dsc | 5 + .../Prm.asl | 18 +-- PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 ++++++++++++++++++ .../PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf | 52 +++++++++ 6 files changed, 171 insertions(+), 51 deletions(-) rename PrmPkg/{PrmLoaderDxe => PrmSsdtInstallDxe}/Prm.asl (82%) create mode 100644 PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c create mode 100644 PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf diff --git a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c index 5e14b8e09d..e45f8685e8 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include @@ -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/PrmLoaderDxe/PrmLoaderDxe.inf b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf index 016ced4b37..4d959ccd35 100644 --- a/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf +++ b/PrmPkg/PrmLoaderDxe/PrmLoaderDxe.inf @@ -24,7 +24,6 @@ PrmAcpiTable.h PrmLoader.h PrmLoaderDxe.c - Prm.asl [Packages] MdePkg/MdePkg.dec @@ -39,13 +38,12 @@ 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 1a0ddc6ac1..d3aeffa152 100644 --- a/PrmPkg/PrmPkg.dsc +++ b/PrmPkg/PrmPkg.dsc @@ -84,6 +84,11 @@ # $(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 76b56de732..0457d09e69 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.c b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c new file mode 100644 index 0000000000..bd9ce2c6fa --- /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.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include + +#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/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf b/PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf new file mode 100644 index 0000000000..e68e9460dd --- /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.
+# +# 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