diff options
Diffstat (limited to 'PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c')
-rw-r--r-- | PrmPkg/PrmSsdtInstallDxe/PrmSsdtInstallDxe.c | 110 |
1 files changed, 110 insertions, 0 deletions
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;
+}
|