alder_lake_bios/Intel/AlderLake/AlderLakeChipsetPkg/OemAcpiPlatformDxe/UpdateOemTableID.c

198 lines
6.2 KiB
C

/** @file
;******************************************************************************
;* Copyright (c) 2014 - 2019 , Insyde Software Corporation. All Rights Reserved.
;*
;* You may not reproduce, distribute, publish, display, perform, modify, adapt,
;* transmit, broadcast, present, recite, release, license or otherwise exploit
;* any part of this publication in any form, by any means, without the prior
;* written permission of Insyde Software Corporation.
;*
;******************************************************************************
*/
#include <Protocol/AcpiTable.h>
#include <OemAcpiPlatform.h>
#include <Library/H2OCpLib.h>
#include <Guid/H2OCp.h>
/**
Update OEM Table ID information
@param[in] Pointer to a table.
**/
VOID
UpdateOemTableId (
EFI_ACPI_SDT_HEADER *Table
)
{
CHAR8 *AcpiDefaultOemId;
UINTN Length;
UINT64 AcpiDefaultOemTableId;
if (Table->Signature == EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE_SIGNATURE) {
return;
}
if (Table->Signature == EFI_ACPI_2_0_SECONDARY_SYSTEM_DESCRIPTION_TABLE_SIGNATURE) {
return;
}
//
// Update OemId
//
AcpiDefaultOemId = (CHAR8 *) PcdGetPtr (PcdAcpiDefaultOemId);
if (AcpiDefaultOemId == NULL) {
DEBUG ((DEBUG_INFO, "PcdAcpiDefaultOemId is NULL.\n"));
}
Length = (AcpiDefaultOemId == NULL) ? 0 : AsciiStrLen (AcpiDefaultOemId);
if (AcpiDefaultOemId != NULL) {
if ((Length > sizeof (Table->OemId))) {
Length = sizeof (Table->OemId);
DEBUG ((DEBUG_INFO, "OemId length is invalid.\n"));
}
ZeroMem (Table->OemId, Length);
CopyMem (Table->OemId, AcpiDefaultOemId, Length);
}
//
// Update OemTableId
//
AcpiDefaultOemTableId = PcdGet64 (PcdAcpiDefaultOemTableId);
CopyMem (Table->OemTableId, &AcpiDefaultOemTableId, sizeof (UINT64));
//
// Creator ID & Revision are used for ASL compiler
//
Table->CreatorId = SIGNATURE_32 ('A', 'C', 'P', 'I');
Table->CreatorRevision = 0x00040000;
if (FeaturePcdGet(PcdOverclockEnable)) {
if (Table->Signature == 'TPSA') {
CopyMem (Table->OemTableId, "PerfTune", sizeof (UINT64));
Table->CreatorId = SIGNATURE_32 ('M','S','F','T');
}
}
}
/**
Callback from checkpoint H2O_BDS_CP_UPDATE_ACPI_DESC_HDR_DATA for update OEM Table ID information
@param[in] Event The Event this notify function registered to.
@param[in] Handle The handle associated with a previously registered checkpoint handler.
**/
VOID
EFIAPI
BdsCpUpdateAcpiDescHdrCallback (
IN EFI_EVENT Event,
IN H2O_CP_HANDLE Handle
)
{
EFI_STATUS Status;
H2O_BDS_CP_UPDATE_ACPI_DESC_HDR_DATA *BdsCpUpdateAcpiDescHdrData;
EFI_GUID BdsCpUpdateAcpiDescHdrGuid;
//
// Get checkpoint data by H2OCpLookup() if need use checkpoint data in callback function
//
Status = H2OCpLookup (Handle, (VOID **) &BdsCpUpdateAcpiDescHdrData, &BdsCpUpdateAcpiDescHdrGuid);
if (EFI_ERROR (Status)) {
DEBUG_CP ((DEBUG_ERROR, "Checkpoint Data Not Found: %x (%r)\n", Handle, Status));
DEBUG_CP ((DEBUG_ERROR, " %a\n", __FUNCTION__));
return;
}
BdsCpUpdateAcpiDescHdrData->Status = H2O_CP_TASK_UPDATE;
UpdateOemTableId (BdsCpUpdateAcpiDescHdrData->AcpiTableHeader);
DEBUG_CP ((DEBUG_INFO, "Checkpoint Data Updated: %g\n", &BdsCpUpdateAcpiDescHdrGuid));
DEBUG_CP ((DEBUG_INFO, " %a\n", __FUNCTION__));
}
/**
Callback from checkpoint H2O_DXE_CP_UPDATE_ACPI_DESC_HDR_DATA for update OEM Table ID information
@param[in] Event The Event this notify function registered to.
@param[in] Handle The handle associated with a previously registered checkpoint handler.
**/
VOID
EFIAPI
DxeCpUpdateAcpiDescHdrCallback (
IN EFI_EVENT Event,
IN H2O_CP_HANDLE Handle
)
{
EFI_STATUS Status;
H2O_DXE_CP_UPDATE_ACPI_DESC_HDR_DATA *DxeCpUpdateAcpiDescHdrData;
EFI_GUID DxeCpUpdateAcpiDescHdrGuid;
//
// Get checkpoint data by H2OCpLookup() if need use checkpoint data in callback function
//
Status = H2OCpLookup (Handle, (VOID **) &DxeCpUpdateAcpiDescHdrData, &DxeCpUpdateAcpiDescHdrGuid);
if (EFI_ERROR (Status)) {
DEBUG_CP ((DEBUG_ERROR, "Checkpoint Data Not Found: %x (%r)\n", Handle, Status));
DEBUG_CP ((DEBUG_ERROR, " %a\n", __FUNCTION__));
return;
}
DxeCpUpdateAcpiDescHdrData->Status = H2O_CP_TASK_UPDATE;
UpdateOemTableId (DxeCpUpdateAcpiDescHdrData->AcpiTableHeader);
DEBUG_CP ((DEBUG_INFO, "Checkpoint Data Updated: %g\n", &DxeCpUpdateAcpiDescHdrGuid));
DEBUG_CP ((DEBUG_INFO, " %a\n", __FUNCTION__));
}
/**
Update OEM Table ID information for all ACPI TAbles
@param None
@retval EFI_SUCCESS Update Table ID Success
**/
EFI_STATUS
OemUpdateOemTableID (
VOID
)
{
EFI_STATUS Status;
Status = EFI_SUCCESS;
if (PcdGetBool (PcdH2OBdsCpUpdateAcpiDescHdrSupported)) {
H2O_CP_HANDLE CpHandle;
Status = H2OCpRegisterHandler (
&gH2OBdsCpUpdateAcpiDescHdrGuid,
BdsCpUpdateAcpiDescHdrCallback,
H2O_CP_MEDIUM_HIGH,
&CpHandle
);
if (EFI_ERROR (Status)) {
DEBUG_CP ((DEBUG_ERROR, "Checkpoint Register Fail: %g (%r)\n", &gH2OBdsCpUpdateAcpiDescHdrGuid, Status));
return Status;
}
DEBUG_CP ((DEBUG_INFO, "Checkpoint Registered: %g (%r)\n", &gH2OBdsCpUpdateAcpiDescHdrGuid, Status));
}
if (PcdGetBool (PcdH2ODxeCpUpdateAcpiDescHdrSupported)) {
H2O_CP_HANDLE CpHandle;
Status = H2OCpRegisterHandler (
&gH2ODxeCpUpdateAcpiDescHdrGuid,
DxeCpUpdateAcpiDescHdrCallback,
H2O_CP_MEDIUM_HIGH,
&CpHandle
);
if (EFI_ERROR (Status)) {
DEBUG_CP ((DEBUG_ERROR, "Checkpoint Register Fail: %g (%r)\n", &gH2ODxeCpUpdateAcpiDescHdrGuid, Status));
return Status;
}
DEBUG_CP ((DEBUG_INFO, "Checkpoint Registered: %g (%r)\n", &gH2ODxeCpUpdateAcpiDescHdrGuid, Status));
}
return EFI_SUCCESS;
}