summaryrefslogtreecommitdiffstats
path: root/EmbeddedPkg
diff options
context:
space:
mode:
authorOlivier Martin <Olivier.Martin@arm.com>2015-05-29 14:39:41 +0000
committeroliviermartin <oliviermartin@Edk2>2015-05-29 14:39:41 +0000
commitda7dd714aa63beb807f08a73e7daf4cc4985b4fe (patch)
treedd5f084ce3d50b42e9fb6e78551bf2dacea07fa1 /EmbeddedPkg
parent9d8ee7815ca7ce02555e17b60b2672674a059ce4 (diff)
downloadedk2-da7dd714aa63beb807f08a73e7daf4cc4985b4fe.tar.gz
edk2-da7dd714aa63beb807f08a73e7daf4cc4985b4fe.tar.bz2
edk2-da7dd714aa63beb807f08a73e7daf4cc4985b4fe.zip
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
Diffstat (limited to 'EmbeddedPkg')
-rw-r--r--EmbeddedPkg/Include/Library/AcpiLib.h28
-rw-r--r--EmbeddedPkg/Library/AcpiLib/AcpiLib.c60
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 <Uefi.h>
+#include <IndustryStandard/Acpi10.h>
+
//
// 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 <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_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);
+}