summaryrefslogtreecommitdiff
path: root/PrmPkg/PrmSsdtInstallDxe
diff options
context:
space:
mode:
authorMichael Kubacki <michael.kubacki@microsoft.com>2020-05-20 10:56:03 -0700
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2022-04-05 00:42:38 +0000
commit50e1432a40ef82d862c4939bf8cbab361895b114 (patch)
tree314e4a1040822b855ef8ff922e7eddd9a83eb3f0 /PrmPkg/PrmSsdtInstallDxe
parentf96517f4d04e9edf7705966b4e7c759998cc1144 (diff)
downloadedk2-50e1432a40ef82d862c4939bf8cbab361895b114.zip
edk2-50e1432a40ef82d862c4939bf8cbab361895b114.tar.gz
edk2-50e1432a40ef82d862c4939bf8cbab361895b114.tar.bz2
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.asl75
-rw-r--r--PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c110
-rw-r--r--PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.inf52
3 files changed, 237 insertions, 0 deletions
diff --git a/PrmPkg/PrmSsdtInstallDxe/Prm.asl b/PrmPkg/PrmSsdtInstallDxe/Prm.asl
new file mode 100644
index 0000000..0457d09
--- /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 0000000..bd9ce2c
--- /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 0000000..e68e946
--- /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