From: Michael Kubacki Date: Wed, 20 May 2020 17:56:03 +0000 (-0700) Subject: PrmPkg: Add initial PrmSsdtInstallDxe module X-Git-Tag: edk2-stable202205~153 X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=50e1432a40ef82d862c4939bf8cbab361895b114;hp=f96517f4d04e9edf7705966b4e7c759998cc1144;p=mirror_edk2.git 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 --- diff --git a/PrmPkg/PrmLoaderDxe/Prm.asl b/PrmPkg/PrmLoaderDxe/Prm.asl deleted file mode 100644 index 76b56de732..0000000000 --- a/PrmPkg/PrmLoaderDxe/Prm.asl +++ /dev/null @@ -1,87 +0,0 @@ -/** @file - The definition block in ACPI table for PRM Operation Region - - Copyright (c) 2020, Intel Corporation. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent -**/ - -DefinitionBlock ( - "Prm.aml", - "SSDT", - 0x01, - "OEMID", - "PRMOPREG", - 0x3000 - ) -{ - Scope (\_SB) - { - // - // PRM Bridge Device - // - - Device (PRMB) - { - Name (_HID, "80860222") - Name (_CID, "80860222") - Name (_DDN, "PRM Bridge Device") - Name (_STA, 0xF) - OperationRegion (OPR1, 0x80, 0, 16) - Field (OPR1, DWordAcc, NoLock, Preserve) //Make it ByteAcc for parameter validation - { - Var0, 128 - } - Method (SETV, 1, Serialized) - { - CopyObject (Arg0, \_SB.PRMB.Var0) - } - } - - // - // PRM Test Device - // - - Device (PRMT) - { - Name (_HID, "80860223") - Name (_CID, "80860223") - Name (_DDN, "PRM Test Device") - Name (_STA, 0xF) - Name (BUF1, Buffer(16) - { - 0x5F, 0xAD, 0xF2, 0xD5, 0x47, 0xA3, 0x3E, 0x4D, //Guid_0 - 0x87, 0xBC, 0xC2, 0xCE, 0x63, 0x02, 0x9C, 0xC8, //Guid_1 - }) - Name (BUF2, Buffer(16) - { - 0xC3, 0xAD, 0xE7, 0xA9, 0xD0, 0x8C, 0x9A, 0x42, //Guid_0 - 0x89, 0x15, 0x10, 0x94, 0x6E, 0xBD, 0xE3, 0x18, //Guid_1 - }) - Name (BUF3, Buffer(16) - { - 0x14, 0xC2, 0x88, 0xB6, 0x81, 0x40, 0xEB, 0x4E, //Guid_0 - 0x8D, 0x26, 0x1E, 0xB5, 0xA3, 0xBC, 0xF1, 0x1A, //Guid_1 - }) - Method (NTST) - { - \_SB.PRMB.SETV (BUF1) - } - Method (TST1) - { - \_SB.PRMB.SETV (BUF1) - } - Method (TST2) - { - \_SB.PRMB.SETV (BUF2) - } - Method (TST3) - { - \_SB.PRMB.SETV (BUF3) - } - } - } - -} // End of Definition Block - - - 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/PrmSsdtInstallDxe/Prm.asl b/PrmPkg/PrmSsdtInstallDxe/Prm.asl new file mode 100644 index 0000000000..0457d09e69 --- /dev/null +++ b/PrmPkg/PrmSsdtInstallDxe/Prm.asl @@ -0,0 +1,75 @@ +/** @file + The definition block in ACPI table for PRM Operation Region + + Copyright (c) 2020, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +DefinitionBlock ( + "Prm.aml", + "SSDT", + 2, + "OEMID ", + "PRMOPREG", + 0x1000 + ) +{ + Scope (\_SB) + { + // + // PRM Bridge Device + // + + Device (PRMB) + { + Name (_HID, "80860222") + Name (_CID, "80860222") + Name (_DDN, "PRM Bridge Device") + Name (_STA, 0xF) + OperationRegion (OPR1, 0x80, 0, 16) + Field (OPR1, DWordAcc, NoLock, Preserve) //Make it ByteAcc for parameter validation + { + Var0, 128 + } + Method (SETV, 1, Serialized) + { + CopyObject (Arg0, \_SB.PRMB.Var0) + } + } + + // + // PRM Test Device + // + + Device (PRMT) + { + Name (_HID, "80860223") + Name (_CID, "80860223") + Name (_DDN, "PRM Test Device") + Name (_STA, 0xF) + Name (BUF1, Buffer(16) + { + 0x5F, 0xAD, 0xF2, 0xD5, 0x47, 0xA3, 0x3E, 0x4D, //Guid_0 + 0x87, 0xBC, 0xC2, 0xCE, 0x63, 0x02, 0x9C, 0xC8, //Guid_1 + }) + Name (BUF2, Buffer(16) + { + 0xC3, 0xAD, 0xE7, 0xA9, 0xD0, 0x8C, 0x9A, 0x42, //Guid_0 + 0x89, 0x15, 0x10, 0x94, 0x6E, 0xBD, 0xE3, 0x18, //Guid_1 + }) + Name (BUF3, Buffer(16) + { + 0x14, 0xC2, 0x88, 0xB6, 0x81, 0x40, 0xEB, 0x4E, //Guid_0 + 0x8D, 0x26, 0x1E, 0xB5, 0xA3, 0xBC, 0xF1, 0x1A, //Guid_1 + }) + Method (NTST) + { + \_SB.PRMB.SETV (BUF1) + } + } + } + +} // End of Definition Block + + + 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