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

Reply via email to