summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--MdeModulePkg/MdeModulePkg.dec7
-rw-r--r--MdeModulePkg/MdeModulePkg.uni8
-rw-r--r--MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf1
-rw-r--r--MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c37
4 files changed, 45 insertions, 8 deletions
diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index a82dedc070..a91058e5b5 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -1533,6 +1533,13 @@
# @Prompt Exposed ACPI table versions.
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UINT32|0x0001004c
+ ## Indicates whether ACPI Reclaim memory is not available
+ # Default is FALSE that means ACPI Reclaim memory is available
+ # If it is set to TRUE that means ACPI Reclaim memory is not available
+ # For example ACPI Table protocol will use ACPI NVS memory instead of ACPI Reclaim memory
+ # @Prompt ACPI Reclaim memory is not available.
+ gEfiMdeModulePkgTokenSpaceGuid.PcdNoACPIReclaimMemory|FALSE|BOOLEAN|0x0001008b
+
## This PCD defines the MAX repair count.
# The default value is 0 that means infinite.
# @Prompt MAX repair count
diff --git a/MdeModulePkg/MdeModulePkg.uni b/MdeModulePkg/MdeModulePkg.uni
index a17d34d60b..6079285e3f 100644
--- a/MdeModulePkg/MdeModulePkg.uni
+++ b/MdeModulePkg/MdeModulePkg.uni
@@ -955,6 +955,14 @@
"BIT 4 - EFI_ACPI_TABLE_VERSION_4_0.<BR>\n"
"BIT 5 - EFI_ACPI_TABLE_VERSION_5_0.<BR>"
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNoACPIReclaimMemory_PROMPT #language en-US "ACPI Reclaim memory is not available."
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdNoACPIReclaimMemory_HELP #language en-US "Indicates whether ACPI Reclaim memory is not available\n"
+ "Default is FALSE that means ACPI Reclaim memory is available\n"
+ "If it is set to TRUE that means ACPI Reclaim memory is not available\n"
+ "For example ACPI Table protocol will use ACPI NVS memory instead of ACPI Reclaim memory"
+
+
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdHiiOsRuntimeSupport_PROMPT #language en-US "Enable export HII data and configuration to be used in OS runtime."
#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdHiiOsRuntimeSupport_HELP #language en-US "Indicates if HII data and configuration has been exported.<BR><BR>\n"
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
index 86dea43e27..be498a56cf 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
@@ -68,6 +68,7 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions ## CONSUMES
+ gEfiMdeModulePkgTokenSpaceGuid.PcdNoACPIReclaimMemory ## CONSUMES
[Protocols]
gEfiAcpiTableProtocolGuid ## PRODUCES
diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
index e09bc9b704..080768033c 100644
--- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
+++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
@@ -340,6 +340,7 @@ ReallocateAcpiTableBuffer (
EFI_ACPI_TABLE_INSTANCE TempPrivateData;
EFI_STATUS Status;
UINT64 CurrentData;
+ EFI_MEMORY_TYPE AcpiAllocateMemoryType;
CopyMem (&TempPrivateData, AcpiTableInstance, sizeof (EFI_ACPI_TABLE_INSTANCE));
//
@@ -359,6 +360,12 @@ ReallocateAcpiTableBuffer (
NewMaxTableNumber * sizeof (UINT32);
}
+ if (PcdGetBool (PcdNoACPIReclaimMemory)) {
+ AcpiAllocateMemoryType = EfiACPIMemoryNVS;
+ } else {
+ AcpiAllocateMemoryType = EfiACPIReclaimMemory;
+ }
+
if (mAcpiTableAllocType != AllocateAnyPages) {
//
// Allocate memory in the lower 32 bit of address range for
@@ -372,13 +379,13 @@ ReallocateAcpiTableBuffer (
PageAddress = 0xFFFFFFFF;
Status = gBS->AllocatePages (
mAcpiTableAllocType,
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
EFI_SIZE_TO_PAGES (TotalSize),
&PageAddress
);
} else {
Status = gBS->AllocatePool (
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
TotalSize,
(VOID **)&Pointer
);
@@ -512,6 +519,7 @@ AddTableToList (
EFI_PHYSICAL_ADDRESS AllocPhysAddress;
UINT64 Buffer64;
BOOLEAN AddToRsdt;
+ EFI_MEMORY_TYPE AcpiAllocateMemoryType;
//
// Check for invalid input parameters
@@ -550,6 +558,12 @@ AddTableToList (
CurrentTableList->TableSize = CurrentTableSize;
CurrentTableList->PoolAllocation = FALSE;
+ if (PcdGetBool (PcdNoACPIReclaimMemory)) {
+ AcpiAllocateMemoryType = EfiACPIMemoryNVS;
+ } else {
+ AcpiAllocateMemoryType = EfiACPIReclaimMemory;
+ }
+
//
// Allocation memory type depends on the type of the table
//
@@ -585,7 +599,7 @@ AddTableToList (
// such as AArch64 that allocate multiples of 64 KB
//
Status = gBS->AllocatePool (
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
CurrentTableList->TableSize,
(VOID **)&CurrentTableList->Table
);
@@ -596,7 +610,7 @@ AddTableToList (
//
Status = gBS->AllocatePages (
mAcpiTableAllocType,
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
EFI_SIZE_TO_PAGES (CurrentTableList->TableSize),
&AllocPhysAddress
);
@@ -1944,6 +1958,7 @@ AcpiTableAcpiTableConstructor (
UINTN RsdpTableSize;
UINT8 *Pointer;
EFI_PHYSICAL_ADDRESS PageAddress;
+ EFI_MEMORY_TYPE AcpiAllocateMemoryType;
//
// Check for invalid input parameters
@@ -1978,17 +1993,23 @@ AcpiTableAcpiTableConstructor (
RsdpTableSize += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
}
+ if (PcdGetBool (PcdNoACPIReclaimMemory)) {
+ AcpiAllocateMemoryType = EfiACPIMemoryNVS;
+ } else {
+ AcpiAllocateMemoryType = EfiACPIReclaimMemory;
+ }
+
if (mAcpiTableAllocType != AllocateAnyPages) {
PageAddress = 0xFFFFFFFF;
Status = gBS->AllocatePages (
mAcpiTableAllocType,
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
EFI_SIZE_TO_PAGES (RsdpTableSize),
&PageAddress
);
} else {
Status = gBS->AllocatePool (
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
RsdpTableSize,
(VOID **)&Pointer
);
@@ -2037,13 +2058,13 @@ AcpiTableAcpiTableConstructor (
PageAddress = 0xFFFFFFFF;
Status = gBS->AllocatePages (
mAcpiTableAllocType,
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
EFI_SIZE_TO_PAGES (TotalSize),
&PageAddress
);
} else {
Status = gBS->AllocatePool (
- EfiACPIReclaimMemory,
+ AcpiAllocateMemoryType,
TotalSize,
(VOID **)&Pointer
);