EmbeddedPkg/AcpiLib: Introduced LocateAndInstallAcpiFromFvConditional()

This new helper function allows to install ACPI Table on condition.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Olivier Martin <Olivier.Martin@arm.com>
Reviewed-by: Ronald Cron <Ronald.Cron@arm.com>



git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17540 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
Olivier Martin 2015-05-29 14:39:41 +00:00 committed by oliviermartin
parent 9d8ee7815c
commit da7dd714aa
2 changed files with 73 additions and 15 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
Helper Library for ACPI Helper Library for ACPI
Copyright (c) 2014, ARM Ltd. All rights reserved. Copyright (c) 2014-2015, ARM Ltd. All rights reserved.
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
@ -18,6 +18,8 @@
#include <Uefi.h> #include <Uefi.h>
#include <IndustryStandard/Acpi10.h>
// //
// Macros for the Generic Address Space // Macros for the Generic Address Space
// //
@ -69,6 +71,30 @@
WatchdogTimerGSIV, WatchdogTimerFlags \ WatchdogTimerGSIV, WatchdogTimerFlags \
} }
typedef
BOOLEAN
(EFIAPI *EFI_LOCATE_ACPI_CHECK) (
IN EFI_ACPI_DESCRIPTION_HEADER *AcpiHeader
);
/**
Locate and Install the ACPI tables from the Firmware Volume if it verifies
the function condition.
@param AcpiFile Guid of the ACPI file into the Firmware Volume
@param CheckAcpiTableFunction Function that checks if the ACPI table should be installed
@return EFI_SUCCESS The function completed successfully.
@return EFI_NOT_FOUND The protocol could not be located.
@return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.
**/
EFI_STATUS
LocateAndInstallAcpiFromFvConditional (
IN CONST EFI_GUID* AcpiFile,
IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction
);
/** /**
Locate and Install the ACPI tables from the Firmware Volume Locate and Install the ACPI tables from the Firmware Volume

View File

@ -1,6 +1,6 @@
/** @file /** @file
* *
* Copyright (c) 2014, ARM Limited. All rights reserved. * Copyright (c) 2014-2015, ARM Limited. All rights reserved.
* *
* This program and the accompanying materials * This program and the accompanying materials
* are licensed and made available under the terms and conditions of the BSD License * are licensed and made available under the terms and conditions of the BSD License
@ -24,9 +24,11 @@
#include <IndustryStandard/Acpi.h> #include <IndustryStandard/Acpi.h>
/** /**
Locate and Install the ACPI tables from the Firmware Volume Locate and Install the ACPI tables from the Firmware Volume if it verifies
the function condition.
@param AcpiFile Guid of the ACPI file into the Firmware Volume @param AcpiFile Guid of the ACPI file into the Firmware Volume
@param CheckAcpiTableFunction Function that checks if the ACPI table should be installed
@return EFI_SUCCESS The function completed successfully. @return EFI_SUCCESS The function completed successfully.
@return EFI_NOT_FOUND The protocol could not be located. @return EFI_NOT_FOUND The protocol could not be located.
@ -34,8 +36,9 @@
**/ **/
EFI_STATUS EFI_STATUS
LocateAndInstallAcpiFromFv ( LocateAndInstallAcpiFromFvConditional (
IN CONST EFI_GUID* AcpiFile IN CONST EFI_GUID* AcpiFile,
IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -50,6 +53,7 @@ LocateAndInstallAcpiFromFv (
EFI_ACPI_COMMON_HEADER *AcpiTable; EFI_ACPI_COMMON_HEADER *AcpiTable;
UINTN AcpiTableSize; UINTN AcpiTableSize;
UINTN AcpiTableKey; UINTN AcpiTableKey;
BOOLEAN Valid;
// Ensure the ACPI Table is present // Ensure the ACPI Table is present
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
@ -116,13 +120,23 @@ LocateAndInstallAcpiFromFv (
((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 16) & 0xFF), ((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 16) & 0xFF),
((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 24) & 0xFF))); ((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 24) & 0xFF)));
// Is the ACPI table valid?
if (CheckAcpiTableFunction) {
Valid = CheckAcpiTableFunction ((EFI_ACPI_DESCRIPTION_HEADER *)AcpiTable);
} else {
Valid = TRUE;
}
// Install the ACPI Table // Install the ACPI Table
if (Valid) {
Status = AcpiProtocol->InstallAcpiTable ( Status = AcpiProtocol->InstallAcpiTable (
AcpiProtocol, AcpiProtocol,
AcpiTable, AcpiTable,
AcpiTableSize, AcpiTableSize,
&AcpiTableKey &AcpiTableKey
); );
}
// Free memory allocated by ReadSection // Free memory allocated by ReadSection
gBS->FreePool (AcpiTable); gBS->FreePool (AcpiTable);
@ -144,3 +158,21 @@ FREE_HANDLE_BUFFER:
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/**
Locate and Install the ACPI tables from the Firmware Volume
@param AcpiFile Guid of the ACPI file into the Firmware Volume
@return EFI_SUCCESS The function completed successfully.
@return EFI_NOT_FOUND The protocol could not be located.
@return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.
**/
EFI_STATUS
LocateAndInstallAcpiFromFv (
IN CONST EFI_GUID* AcpiFile
)
{
return LocateAndInstallAcpiFromFvConditional (AcpiFile, NULL);
}