diff options
author | Michael Kubacki <michael.kubacki@microsoft.com> | 2020-05-20 10:56:03 -0700 |
---|---|---|
committer | mergify[bot] <37929162+mergify[bot]@users.noreply.github.com> | 2022-04-05 00:42:38 +0000 |
commit | 50e1432a40ef82d862c4939bf8cbab361895b114 (patch) | |
tree | 314e4a1040822b855ef8ff922e7eddd9a83eb3f0 /PrmPkg/PrmSsdtInstallDxe | |
parent | f96517f4d04e9edf7705966b4e7c759998cc1144 (diff) | |
download | edk2-50e1432a40ef82d862c4939bf8cbab361895b114.tar.gz |
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 <afish@apple.com>
Cc: Kang Gao <kang.gao@intel.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Michael Kubacki <michael.kubacki@microsoft.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Benjamin You <benjamin.you@intel.com>
Cc: Liu Yun <yun.y.liu@intel.com>
Cc: Ankit Sinha <ankit.sinha@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
Acked-by: Liming Gao <gaoliming@byosoft.com.cn>
Acked-by: Leif Lindholm <quic_llindhol@quicinc.com>
Reviewed-by: Ankit Sinha <ankit.sinha@intel.com>
Diffstat (limited to 'PrmPkg/PrmSsdtInstallDxe')
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/Prm.asl | 75 | ||||
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 | ||||
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf | 52 |
3 files changed, 237 insertions, 0 deletions
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.<BR>
+ 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.<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/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.<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
|