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