/** @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_, __func__)); | |
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_, __func__)); | |
// | |
// 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; | |
} |