Some ARM systems do not have available memory below 4GB, and still
support ACPI. This patch allows the tables to get loaded above 4GB
if the allocation below 4GB fails.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Samer El-Haj-Mahmoud <el...@hpe.com>
---
 .../AcpiSupportAcpiSupportProtocol.c               | 69 ++++++++++++++++++++--
 1 file changed, 65 insertions(+), 4 deletions(-)

diff --git 
a/IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
 
b/IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
index 6443c3a..72a7fe1 100644
--- 
a/IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
+++ 
b/IntelFrameworkModulePkg/Universal/Acpi/AcpiSupportDxe/AcpiSupportAcpiSupportProtocol.c
@@ -2,6 +2,7 @@
   ACPI Support Protocol implementation
 
 Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+(C) Copyright 2015 Hewlett Packard Enterprise Development LP<BR>
 
 This program and the accompanying materials
 are licensed and made available under the terms and conditions
@@ -533,6 +534,14 @@ ReallocateAcpiTableBuffer (
                   );
 
   if (EFI_ERROR (Status)) {
+    Status = gBS->AllocatePages (
+                    AllocateAnyPages,
+                    EfiACPIReclaimMemory,
+                    EFI_SIZE_TO_PAGES (TotalSize),
+                    &PageAddress
+                    );
+  }
+  if (EFI_ERROR (Status)) {
     return EFI_OUT_OF_RESOURCES;
   }
 
@@ -548,8 +557,13 @@ ReallocateAcpiTableBuffer (
   //
   // Update RSDP to point to the new Rsdt and Xsdt address.
   //
-  AcpiSupportInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt1;
-  AcpiSupportInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt3;
+  if ((UINTN) AcpiSupportInstance->Rsdt3 < BASE_4GB) {
+    AcpiSupportInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt1;
+    AcpiSupportInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt3;
+  } else {
+    AcpiSupportInstance->Rsdp1->RsdtAddress = 0;
+    AcpiSupportInstance->Rsdp3->RsdtAddress = 0;
+  }
   CurrentData = (UINT64) (UINTN) AcpiSupportInstance->Xsdt;
   CopyMem (&AcpiSupportInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof 
(UINT64));
 
@@ -669,6 +683,15 @@ AddTableToList (
                     CurrentTableList->NumberOfPages,
                     &CurrentTableList->PageAddress
                     );
+
+    if (EFI_ERROR (Status)) {
+      Status = gBS->AllocatePages (
+                      AllocateAnyPages,
+                      EfiACPIMemoryNVS,
+                      CurrentTableList->NumberOfPages,
+                      &CurrentTableList->PageAddress
+                      );
+    }
   } else {
     //
     // All other tables are ACPI reclaim memory, no alignment requirements.
@@ -679,6 +702,15 @@ AddTableToList (
                     CurrentTableList->NumberOfPages,
                     &CurrentTableList->PageAddress
                     );
+
+    if (EFI_ERROR (Status)) {
+      Status = gBS->AllocatePages (
+                      AllocateAnyPages,
+                      EfiACPIReclaimMemory,
+                      CurrentTableList->NumberOfPages,
+                      &CurrentTableList->PageAddress
+                      );
+    }
   }
   //
   // Check return value from memory alloc.
@@ -1785,6 +1817,15 @@ AcpiSupportAcpiSupportConstructor (
                   );
 
   if (EFI_ERROR (Status)) {
+    Status = gBS->AllocatePages (
+                    AllocateAnyPages,
+                    EfiACPIReclaimMemory,
+                    EFI_SIZE_TO_PAGES (RsdpTableSize),
+                    &PageAddress
+                    );
+  }
+
+  if (EFI_ERROR (Status)) {
     return EFI_OUT_OF_RESOURCES;
   }
 
@@ -1823,6 +1864,15 @@ AcpiSupportAcpiSupportConstructor (
                   );
 
   if (EFI_ERROR (Status)) {
+    Status = gBS->AllocatePages (
+                    AllocateAnyPages,
+                    EfiACPIReclaimMemory,
+                    EFI_SIZE_TO_PAGES (TotalSize),
+                    &PageAddress
+                    );
+  }
+
+  if (EFI_ERROR (Status)) {
     gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)AcpiSupportInstance->Rsdp1, 
EFI_SIZE_TO_PAGES (RsdpTableSize));
     return EFI_OUT_OF_RESOURCES;
   }
@@ -1843,13 +1893,24 @@ AcpiSupportAcpiSupportConstructor (
   CopyMem (&AcpiSupportInstance->Rsdp1->Signature, &CurrentData, sizeof 
(UINT64));
   CopyMem (AcpiSupportInstance->Rsdp1->OemId, PcdGetPtr (PcdAcpiDefaultOemId), 
sizeof (AcpiSupportInstance->Rsdp1->OemId));
   AcpiSupportInstance->Rsdp1->Reserved    = EFI_ACPI_RESERVED_BYTE;
-  AcpiSupportInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt1;
+  
+  if ((UINTN) AcpiSupportInstance->Rsdt1 < BASE_4GB) {
+    AcpiSupportInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt1;
+  } else {
+    AcpiSupportInstance->Rsdp3->RsdtAddress = 0;
+  }
 
   CurrentData = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE;
   CopyMem (&AcpiSupportInstance->Rsdp3->Signature, &CurrentData, sizeof 
(UINT64));
   CopyMem (AcpiSupportInstance->Rsdp3->OemId, PcdGetPtr (PcdAcpiDefaultOemId), 
sizeof (AcpiSupportInstance->Rsdp3->OemId));
   AcpiSupportInstance->Rsdp3->Revision    = 
EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION;
-  AcpiSupportInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt3;
+  
+  if ((UINTN) AcpiSupportInstance->Rsdt3 < BASE_4GB) {
+    AcpiSupportInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) 
AcpiSupportInstance->Rsdt3;
+  } else {
+    AcpiSupportInstance->Rsdp3->RsdtAddress = 0;
+  }
+  
   AcpiSupportInstance->Rsdp3->Length      = sizeof 
(EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER);
   CurrentData = (UINT64) (UINTN) AcpiSupportInstance->Xsdt;
   CopyMem (&AcpiSupportInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof 
(UINT64));
-- 
2.6.3.windows.1

_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to