On 23 February 2016 at 04:03, Zeng, Star <star.z...@intel.com> wrote: > Ard, > > On 2016/2/19 21:15, Ard Biesheuvel wrote: >> >> AARCH64 systems never require compatibility with legacy ACPI OSes, and >> may not have any 32-bit addressable system RAM. To support ACPI on these >> systems, we need to be able to relax the 4 GB allocation restriction. >> >> So add a PCD PcdAcpiExposedTableVersions containing a bitmask describing >> which ACPI versions are targeted, and wire it up it up to the memory > > > Remove the duplicated "it up"? > >> allocation calls in AcpiTableDxe/AcpiTableProtocol.c. I.e., if ACPI v1.0b >> is not among the supported versions, the memory allocations are not >> limited >> to 4 GB, and only table types that carry 64-bit addresses are emitted. >> >> Note that this will inhibit the publishing of any tables that carry only >> 32-bit addresses, i.e., RSDPv1, RSDTv1 and RSDTv3. >> >> Contributed-under: TianoCore Contribution Agreement 1.0 >> Signed-off-by: Ard Biesheuvel <ard.biesheu...@linaro.org> >> Reviewed-by: "Yao, Jiewen" <jiewen....@intel.com> >> --- >> MdeModulePkg/MdeModulePkg.dec | 11 + >> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiSdt.c | 3 +- >> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf | 2 + >> MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 448 >> ++++++++++++-------- >> 4 files changed, 277 insertions(+), 187 deletions(-) >> > > [trimmed] > > >> diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf >> b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf >> index e9cd728dbfb6..0fb2c9cfb52e 100644 >> --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf >> +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf >> @@ -2,6 +2,7 @@ >> # ACPI Table Protocol Driver >> # >> # Copyright (c) 2006 - 2014, Intel Corporation. All rights >> reserved.<BR> >> +# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> >> # This program and the accompanying materials are >> # licensed and made available under the terms and conditions of the BSD >> License >> # which accompanies this distribution. The full text of the license >> may be found at >> @@ -67,6 +68,7 @@ [Pcd] >> gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision ## >> CONSUMES >> gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId ## >> CONSUMES >> gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision ## >> CONSUMES >> + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions ## >> CONSUMES >> >> [Protocols] >> gEfiAcpiTableProtocolGuid ## PRODUCES >> diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c >> b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c >> index c6abf1bf0c52..c8fdc0e1c383 100644 >> --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c >> +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c >> @@ -2,6 +2,7 @@ >> ACPI Table Protocol Implementation >> >> Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> >> + Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR> >> This program and the accompanying materials >> are licensed and made available under the terms and conditions of the >> BSD License >> which accompanies this distribution. The full text of the license may >> be found at >> @@ -21,6 +22,12 @@ >> // >> UINTN mEfiAcpiMaxNumTables = EFI_ACPI_MAX_NUM_TABLES; >> >> +// >> +// Allocation strategy to use for AllocatePages (). >> +// Runtime value depends on PcdExposedAcpiTableVersions. >> +// >> +STATIC EFI_ALLOCATE_TYPE mAcpiTableAllocType; >> + >> /** >> This function adds an ACPI table to the table list. It will detect >> FACS and >> allocate the correct type of memory and properly align the table. >> @@ -135,8 +142,10 @@ PublishTables ( >> *CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt1; >> } >> if ((Version & ACPI_TABLE_VERSION_GTE_2_0) != 0) { >> - CurrentRsdtEntry = (UINT32 *) ((UINT8 *) AcpiTableInstance->Rsdt3 + >> sizeof (EFI_ACPI_DESCRIPTION_HEADER)); >> - *CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt3; >> + if (PcdGet32 (PcdAcpiExposedTableVersions)) { > > > It should be if ((PcdGet32 (PcdAcpiExposedTableVersions) & > EFI_ACPI_TABLE_VERSION_1_0B) != 0) { ? > >
Actually, that test can be removed completely, and the assignment of RSDTv3 moved into the previous block. >> + CurrentRsdtEntry = (UINT32 *) ((UINT8 *) AcpiTableInstance->Rsdt3 >> + sizeof (EFI_ACPI_DESCRIPTION_HEADER)); >> + *CurrentRsdtEntry = (UINT32) (UINTN) AcpiTableInstance->Fadt3; >> + } >> CurrentXsdtEntry = (VOID *) ((UINT8 *) AcpiTableInstance->Xsdt + >> sizeof (EFI_ACPI_DESCRIPTION_HEADER)); >> // >> // Add entry to XSDT, XSDT expects 64 bit pointers, but >> @@ -209,6 +218,7 @@ InstallAcpiTable ( >> EFI_ACPI_TABLE_INSTANCE *AcpiTableInstance; >> EFI_STATUS Status; >> VOID *AcpiTableBufferConst; >> + EFI_ACPI_TABLE_VERSION Version; >> >> // >> // Check for invalid input parameters >> @@ -218,6 +228,8 @@ InstallAcpiTable ( >> return EFI_INVALID_PARAMETER; >> } >> >> + Version = PcdGet32 (PcdAcpiExposedTableVersions); >> + >> // >> // Get the instance of the ACPI table protocol >> // >> @@ -232,13 +244,13 @@ InstallAcpiTable ( >> AcpiTableInstance, >> AcpiTableBufferConst, >> TRUE, >> - EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0, >> + Version, >> TableKey >> ); >> if (!EFI_ERROR (Status)) { >> Status = PublishTables ( >> AcpiTableInstance, >> - EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0 >> + Version >> ); >> } >> FreePool (AcpiTableBufferConst); >> @@ -250,7 +262,7 @@ InstallAcpiTable ( >> if (!EFI_ERROR (Status)) { >> SdtNotifyAcpiList ( >> AcpiTableInstance, >> - EFI_ACPI_TABLE_VERSION_1_0B | ACPI_TABLE_VERSION_GTE_2_0, >> + Version, >> *TableKey >> ); >> } >> @@ -337,16 +349,19 @@ ReallocateAcpiTableBuffer ( >> // >> // Create RSDT, XSDT structures and allocate buffers. >> // >> - TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 1.0 RSDT >> - NewMaxTableNumber * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 RSDT >> - NewMaxTableNumber * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> + TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> NewMaxTableNumber * sizeof (UINT64); >> >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 1.0 RSDT >> + NewMaxTableNumber * sizeof (UINT32) + >> + sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 RSDT >> + NewMaxTableNumber * sizeof (UINT32); >> + } >> + >> // >> // Allocate memory in the lower 32 bit of address range for >> - // compatibility with ACPI 1.0 OS. >> + // compatibility with ACPI 1.0 OS if PcdAcpiAllocateTablesBelow4GB == >> TRUE > > > Where does PcdAcpiAllocateTablesBelow4GB from? > That is a stale comment, I will fix it > >> // >> // This is done because ACPI 1.0 pointers are 32 bit values. >> // ACPI 2.0 OS and all 64 bit OS must use the 64 bit ACPI table >> addresses. >> @@ -355,7 +370,7 @@ ReallocateAcpiTableBuffer ( >> // >> PageAddress = 0xFFFFFFFF; >> Status = gBS->AllocatePages ( >> - AllocateMaxAddress, >> + mAcpiTableAllocType, >> EfiACPIReclaimMemory, >> EFI_SIZE_TO_PAGES (TotalSize), >> &PageAddress >> @@ -369,35 +384,45 @@ ReallocateAcpiTableBuffer ( >> ZeroMem (Pointer, TotalSize); >> >> AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> - Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * >> sizeof (UINT32)); >> - AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> - Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber * >> sizeof (UINT32)); >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber >> * sizeof (UINT32)); >> + AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> + Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + NewMaxTableNumber >> * sizeof (UINT32)); >> + } >> AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> >> // >> // Update RSDP to point to the new Rsdt and Xsdt address. >> // >> - AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt1; >> - AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt3; >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt1; >> + AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt3; >> + } >> CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt; >> CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof >> (UINT64)); >> >> // >> // copy the original Rsdt1, Rsdt3 and Xsdt structure to new buffer >> // >> - CopyMem (AcpiTableInstance->Rsdt1, TempPrivateData.Rsdt1, (sizeof >> (EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32))); >> - CopyMem (AcpiTableInstance->Rsdt3, TempPrivateData.Rsdt3, (sizeof >> (EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32))); >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + CopyMem (AcpiTableInstance->Rsdt1, TempPrivateData.Rsdt1, (sizeof >> (EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32))); >> + CopyMem (AcpiTableInstance->Rsdt3, TempPrivateData.Rsdt3, (sizeof >> (EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT32))); >> + } >> CopyMem (AcpiTableInstance->Xsdt, TempPrivateData.Xsdt, (sizeof >> (EFI_ACPI_DESCRIPTION_HEADER) + mEfiAcpiMaxNumTables * sizeof (UINT64))); >> >> // >> // Calculate orignal ACPI table buffer size >> // >> - TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 1.0 RSDT >> - mEfiAcpiMaxNumTables * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 RSDT >> - mEfiAcpiMaxNumTables * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> + TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> mEfiAcpiMaxNumTables * sizeof (UINT64); >> + >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for >> ACPI 1.0 RSDT >> + mEfiAcpiMaxNumTables * sizeof (UINT32) + >> + sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for >> ACPI 2.0/3.0 RSDT >> + mEfiAcpiMaxNumTables * sizeof (UINT32); >> + } >> + >> gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)TempPrivateData.Rsdt1, >> EFI_SIZE_TO_PAGES (TotalSize)); >> >> // >> @@ -494,7 +519,7 @@ AddTableToList ( >> // >> ASSERT ((EFI_PAGE_SIZE % 64) == 0); >> Status = gBS->AllocatePages ( >> - AllocateMaxAddress, >> + mAcpiTableAllocType, >> EfiACPIMemoryNVS, >> CurrentTableList->NumberOfPages, >> &CurrentTableList->PageAddress > > > I believe the allocation for FACS should be also handled same with BdsDxe, > BootGraphicsResourceTableDxe, BootScriptExecutorDxe, > FirmwarePerformanceDataTableDxe, PiDxeS3BootScriptLib, CapsuleRuntimeDxe as > Jiewen said in [PATCH v3 2/4], because FACS will be got by AcpiS3Save to > ACPI_S3_CONTEXT.AcpiFacsTable in S3Ready() and ACPI_S3_CONTEXT.AcpiFacsTable > will be consumed by PEIM S3Resume2Pei in S3ResumeBootOs(). > OK, I will use the DXE IPL long mode PCD instead. >> @@ -504,7 +529,7 @@ AddTableToList ( >> // All other tables are ACPI reclaim memory, no alignment >> requirements. >> // >> Status = gBS->AllocatePages ( >> - AllocateMaxAddress, >> + mAcpiTableAllocType, >> EfiACPIReclaimMemory, >> CurrentTableList->NumberOfPages, >> &CurrentTableList->PageAddress > > > [trimmed] > > >> @@ -1625,22 +1688,27 @@ AcpiTableAcpiTableConstructor ( >> ZeroMem (Pointer, RsdpTableSize); >> >> AcpiTableInstance->Rsdp1 = >> (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer; >> - Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER); >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + Pointer += sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER); >> + } >> AcpiTableInstance->Rsdp3 = >> (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER *) Pointer; >> >> // >> // Create RSDT, XSDT structures >> // >> - TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 1.0 RSDT >> - mEfiAcpiMaxNumTables * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 RSDT >> - mEfiAcpiMaxNumTables * sizeof (UINT32) + >> - sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> + TotalSize = sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 XSDT >> mEfiAcpiMaxNumTables * sizeof (UINT64); >> >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + TotalSize += sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 1.0 RSDT >> + mEfiAcpiMaxNumTables * sizeof (UINT32) + >> + sizeof (EFI_ACPI_DESCRIPTION_HEADER) + // for ACPI >> 2.0/3.0 RSDT >> + mEfiAcpiMaxNumTables * sizeof (UINT32); >> + } >> + >> // >> // Allocate memory in the lower 32 bit of address range for >> - // compatibility with ACPI 1.0 OS. >> + // compatibility with ACPI 1.0 OS if PcdAcpiAllocateTablesBelow4GB == >> TRUE > > > Where does PcdAcpiAllocateTablesBelow4GB from? > > Same as above. Will fix it >> // >> // This is done because ACPI 1.0 pointers are 32 bit values. >> // ACPI 2.0 OS and all 64 bit OS must use the 64 bit ACPI table >> addresses. >> @@ -1649,7 +1717,7 @@ AcpiTableAcpiTableConstructor ( >> // >> PageAddress = 0xFFFFFFFF; >> Status = gBS->AllocatePages ( >> - AllocateMaxAddress, >> + mAcpiTableAllocType, >> EfiACPIReclaimMemory, >> EFI_SIZE_TO_PAGES (TotalSize), >> &PageAddress >> @@ -1664,66 +1732,74 @@ AcpiTableAcpiTableConstructor ( >> ZeroMem (Pointer, TotalSize); >> >> AcpiTableInstance->Rsdt1 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> - Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + >> EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32)); >> - AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> - Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + >> EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32)); >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + >> EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32)); >> + AcpiTableInstance->Rsdt3 = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> + Pointer += (sizeof (EFI_ACPI_DESCRIPTION_HEADER) + >> EFI_ACPI_MAX_NUM_TABLES * sizeof (UINT32)); >> + } >> AcpiTableInstance->Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) Pointer; >> >> // >> // Initialize RSDP >> // >> - CurrentData = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE; >> - CopyMem (&AcpiTableInstance->Rsdp1->Signature, &CurrentData, sizeof >> (UINT64)); >> - CopyMem (AcpiTableInstance->Rsdp1->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdp1->OemId)); >> - AcpiTableInstance->Rsdp1->Reserved = EFI_ACPI_RESERVED_BYTE; >> - AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt1; >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + CurrentData = EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE; >> + CopyMem (&AcpiTableInstance->Rsdp1->Signature, &CurrentData, sizeof >> (UINT64)); >> + CopyMem (AcpiTableInstance->Rsdp1->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdp1->OemId)); >> + AcpiTableInstance->Rsdp1->Reserved = EFI_ACPI_RESERVED_BYTE; >> + AcpiTableInstance->Rsdp1->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt1; >> + } >> >> CurrentData = EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_SIGNATURE; >> CopyMem (&AcpiTableInstance->Rsdp3->Signature, &CurrentData, sizeof >> (UINT64)); >> CopyMem (AcpiTableInstance->Rsdp3->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdp3->OemId)); >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt3; >> + } > > > [MARK1] > >> AcpiTableInstance->Rsdp3->Revision = >> EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION; >> - AcpiTableInstance->Rsdp3->RsdtAddress = (UINT32) (UINTN) >> AcpiTableInstance->Rsdt3; > > > Why not to add the code [MARK1] at here that would still follow the layout > of Rsdp3 as the initialization sequence? > OK > >> AcpiTableInstance->Rsdp3->Length = sizeof >> (EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_POINTER); >> CurrentData = (UINT64) (UINTN) AcpiTableInstance->Xsdt; >> CopyMem (&AcpiTableInstance->Rsdp3->XsdtAddress, &CurrentData, sizeof >> (UINT64)); >> SetMem (AcpiTableInstance->Rsdp3->Reserved, 3, >> EFI_ACPI_RESERVED_BYTE); >> >> - // >> - // Initialize Rsdt >> - // >> - // Note that we "reserve" one entry for the FADT so it can always be >> - // at the beginning of the list of tables. Some OS don't seem >> - // to find it correctly if it is too far down the list. >> - // >> - AcpiTableInstance->Rsdt1->Signature = >> EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE; >> - AcpiTableInstance->Rsdt1->Length = sizeof >> (EFI_ACPI_DESCRIPTION_HEADER); >> - AcpiTableInstance->Rsdt1->Revision = >> EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION; >> - CopyMem (AcpiTableInstance->Rsdt1->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdt1->OemId)); >> - CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId); >> - CopyMem (&AcpiTableInstance->Rsdt1->OemTableId, &CurrentData, sizeof >> (UINT64)); >> - AcpiTableInstance->Rsdt1->OemRevision = PcdGet32 >> (PcdAcpiDefaultOemRevision); >> - AcpiTableInstance->Rsdt1->CreatorId = PcdGet32 >> (PcdAcpiDefaultCreatorId); >> - AcpiTableInstance->Rsdt1->CreatorRevision = PcdGet32 >> (PcdAcpiDefaultCreatorRevision); >> - // >> - // We always reserve first one for FADT >> - // >> - AcpiTableInstance->NumberOfTableEntries1 = 1; >> - AcpiTableInstance->Rsdt1->Length = >> AcpiTableInstance->Rsdt1->Length + sizeof(UINT32); >> - >> - AcpiTableInstance->Rsdt3->Signature = >> EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE; >> - AcpiTableInstance->Rsdt3->Length = sizeof >> (EFI_ACPI_DESCRIPTION_HEADER); >> - AcpiTableInstance->Rsdt3->Revision = >> EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION; >> - CopyMem (AcpiTableInstance->Rsdt3->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdt3->OemId)); >> - CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId); >> - CopyMem (&AcpiTableInstance->Rsdt3->OemTableId, &CurrentData, sizeof >> (UINT64)); >> - AcpiTableInstance->Rsdt3->OemRevision = PcdGet32 >> (PcdAcpiDefaultOemRevision); >> - AcpiTableInstance->Rsdt3->CreatorId = PcdGet32 >> (PcdAcpiDefaultCreatorId); >> - AcpiTableInstance->Rsdt3->CreatorRevision = PcdGet32 >> (PcdAcpiDefaultCreatorRevision); >> - // >> - // We always reserve first one for FADT >> - // >> + if ((PcdGet32 (PcdAcpiExposedTableVersions) & >> EFI_ACPI_TABLE_VERSION_1_0B) != 0) { >> + // >> + // Initialize Rsdt >> + // >> + // Note that we "reserve" one entry for the FADT so it can always be >> + // at the beginning of the list of tables. Some OS don't seem >> + // to find it correctly if it is too far down the list. >> + // >> + AcpiTableInstance->Rsdt1->Signature = >> EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE; >> + AcpiTableInstance->Rsdt1->Length = sizeof >> (EFI_ACPI_DESCRIPTION_HEADER); >> + AcpiTableInstance->Rsdt1->Revision = >> EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION; >> + CopyMem (AcpiTableInstance->Rsdt1->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdt1->OemId)); >> + CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId); >> + CopyMem (&AcpiTableInstance->Rsdt1->OemTableId, &CurrentData, sizeof >> (UINT64)); >> + AcpiTableInstance->Rsdt1->OemRevision = PcdGet32 >> (PcdAcpiDefaultOemRevision); >> + AcpiTableInstance->Rsdt1->CreatorId = PcdGet32 >> (PcdAcpiDefaultCreatorId); >> + AcpiTableInstance->Rsdt1->CreatorRevision = PcdGet32 >> (PcdAcpiDefaultCreatorRevision); >> + // >> + // We always reserve first one for FADT >> + // >> + AcpiTableInstance->NumberOfTableEntries1 = 1; >> + AcpiTableInstance->Rsdt1->Length = >> AcpiTableInstance->Rsdt1->Length + sizeof(UINT32); >> + >> + AcpiTableInstance->Rsdt3->Signature = >> EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_SIGNATURE; >> + AcpiTableInstance->Rsdt3->Length = sizeof >> (EFI_ACPI_DESCRIPTION_HEADER); >> + AcpiTableInstance->Rsdt3->Revision = >> EFI_ACPI_3_0_ROOT_SYSTEM_DESCRIPTION_TABLE_REVISION; >> + CopyMem (AcpiTableInstance->Rsdt3->OemId, PcdGetPtr >> (PcdAcpiDefaultOemId), sizeof (AcpiTableInstance->Rsdt3->OemId)); >> + CurrentData = PcdGet64 (PcdAcpiDefaultOemTableId); >> + CopyMem (&AcpiTableInstance->Rsdt3->OemTableId, &CurrentData, sizeof >> (UINT64)); >> + AcpiTableInstance->Rsdt3->OemRevision = PcdGet32 >> (PcdAcpiDefaultOemRevision); >> + AcpiTableInstance->Rsdt3->CreatorId = PcdGet32 >> (PcdAcpiDefaultCreatorId); >> + AcpiTableInstance->Rsdt3->CreatorRevision = PcdGet32 >> (PcdAcpiDefaultCreatorRevision); >> + // >> + // We always reserve first one for FADT >> + // >> + AcpiTableInstance->Rsdt3->Length = >> AcpiTableInstance->Rsdt3->Length + sizeof(UINT32); >> + } >> AcpiTableInstance->NumberOfTableEntries3 = 1; >> - AcpiTableInstance->Rsdt3->Length = >> AcpiTableInstance->Rsdt3->Length + sizeof(UINT32); >> >> // >> // Initialize Xsdt >> > > Thanks, > Star Thank you! v4 series coming up ... _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel