From da7dd714aa63beb807f08a73e7daf4cc4985b4fe Mon Sep 17 00:00:00 2001 From: Olivier Martin Date: Fri, 29 May 2015 14:39:41 +0000 Subject: [PATCH] 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 Reviewed-by: Ronald Cron git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17540 6f19259b-4bc3-4df7-8a09-765794883524 --- EmbeddedPkg/Include/Library/AcpiLib.h | 28 ++++++++++++- EmbeddedPkg/Library/AcpiLib/AcpiLib.c | 60 ++++++++++++++++++++------- 2 files changed, 73 insertions(+), 15 deletions(-) diff --git a/EmbeddedPkg/Include/Library/AcpiLib.h b/EmbeddedPkg/Include/Library/AcpiLib.h index b0cde9aed4..42710fd1fd 100644 --- a/EmbeddedPkg/Include/Library/AcpiLib.h +++ b/EmbeddedPkg/Include/Library/AcpiLib.h @@ -1,7 +1,7 @@ /** @file 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 are licensed and made available under the terms and conditions of the BSD License @@ -18,6 +18,8 @@ #include +#include + // // Macros for the Generic Address Space // @@ -69,6 +71,30 @@ 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 diff --git a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c index 4090055928..0e27276c22 100644 --- a/EmbeddedPkg/Library/AcpiLib/AcpiLib.c +++ b/EmbeddedPkg/Library/AcpiLib/AcpiLib.c @@ -1,6 +1,6 @@ /** @file * -* Copyright (c) 2014, ARM Limited. All rights reserved. +* Copyright (c) 2014-2015, ARM Limited. All rights reserved. * * This program and the accompanying materials * are licensed and made available under the terms and conditions of the BSD License @@ -24,18 +24,21 @@ #include /** - 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_NOT_FOUND The protocol could not be located. - @return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol. + @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 +LocateAndInstallAcpiFromFvConditional ( + IN CONST EFI_GUID* AcpiFile, + IN EFI_LOCATE_ACPI_CHECK CheckAcpiTableFunction ) { EFI_STATUS Status; @@ -50,6 +53,7 @@ LocateAndInstallAcpiFromFv ( EFI_ACPI_COMMON_HEADER *AcpiTable; UINTN AcpiTableSize; UINTN AcpiTableKey; + BOOLEAN Valid; // Ensure the ACPI Table is present Status = gBS->LocateProtocol ( @@ -116,13 +120,23 @@ LocateAndInstallAcpiFromFv ( ((((EFI_ACPI_DESCRIPTION_HEADER *) AcpiTable)->Signature >> 16) & 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 - Status = AcpiProtocol->InstallAcpiTable ( - AcpiProtocol, - AcpiTable, - AcpiTableSize, - &AcpiTableKey - ); + if (Valid) { + Status = AcpiProtocol->InstallAcpiTable ( + AcpiProtocol, + AcpiTable, + AcpiTableSize, + &AcpiTableKey + ); + } + // Free memory allocated by ReadSection gBS->FreePool (AcpiTable); @@ -144,3 +158,21 @@ FREE_HANDLE_BUFFER: 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); +}