Aaron:
 Is there a Bugzilla for this issue? What problem will be resolved with this
change? 

Thanks
Liming
> -----邮件原件-----
> 发件人: Aaron Li <aaron...@intel.com>
> 发送时间: 2024年3月26日 15:58
> 收件人: devel@edk2.groups.io
> 抄送: Zhiguang Liu <zhiguang....@intel.com>; Dandan Bi
> <dandan...@intel.com>; Liming Gao <gaolim...@byosoft.com.cn>; Liu Yun
> <yun.y....@intel.com>; Jiewen Yao <jiewen....@intel.com>; Ray Ni
> <ray...@intel.com>; Michael D Kinney <michael.d.kin...@intel.com>
> 主题: [PATCH v2 1/1] MdeModulePkg/AcpiTableDxe: PCD switch to avoid
> using ACPI reclaim memory
> 
> UEFI spec defined ACPI Tables at boot time can be contained in memory of
> type EfiACPIReclaimMemory or EfiAcpiMemoryNVS, although InstallAcpiTable
> with AcpiTableProtocol will only allocate memory with type
> EfiACPIReclaimMemory (Except FACS).
> 
> This patch provides an optional method controlled by PCD to avoid using
> EfiACPIReclaimMemory, by setting the PCD PcdNoACPIReclaimMemory to
> TRUE,
> all ACPI allocated memory will use EfiAcpiMemoryNVS instead.
> 
> Cc: Zhiguang Liu <zhiguang....@intel.com>
> Cc: Dandan Bi <dandan...@intel.com>
> Cc: Liming Gao <gaolim...@byosoft.com.cn>
> Cc: Liu Yun <yun.y....@intel.com>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Ray Ni <ray...@intel.com>
> Cc: Michael D Kinney <michael.d.kin...@intel.com>
> Signed-off-by: Aaron Li <aaron...@intel.com>
> ---
>  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 37
> +++++++++++++++-----
>  MdeModulePkg/MdeModulePkg.dec
> |  7 ++++
>  MdeModulePkg/MdeModulePkg.uni
> |  8 +++++
>  MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf    |  1 +
>  4 files changed, 45 insertions(+), 8 deletions(-)
> 
> diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
> b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
> index e09bc9b704f5..080768033cfa 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
>                      );
> diff --git a/MdeModulePkg/MdeModulePkg.dec
> b/MdeModulePkg/MdeModulePkg.dec
> index a82dedc070df..a91058e5b5df 100644
> --- a/MdeModulePkg/MdeModulePkg.dec
> +++ b/MdeModulePkg/MdeModulePkg.dec
> @@ -1533,6 +1533,13 @@ [PcdsFixedAtBuild, PcdsPatchableInModule]
>    # @Prompt Exposed ACPI table versions.
> 
> gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UIN
> T32|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|BOOL
> EAN|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 a17d34d60b21..6079285e3f8b 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_PROM
> PT  #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 86dea43e27e4..be498a56cff0 100644
> --- a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> +++ b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf
> @@ -68,6 +68,7 @@ [Pcd]
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorId        ##
> CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultCreatorRevision  ##
> CONSUMES
>    gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions    ##
> CONSUMES
> +  gEfiMdeModulePkgTokenSpaceGuid.PcdNoACPIReclaimMemory
> ## CONSUMES
> 
>  [Protocols]
>    gEfiAcpiTableProtocolGuid                     ## PRODUCES
> --
> 2.44.0.windows.1





-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#117188): https://edk2.groups.io/g/devel/message/117188
Mute This Topic: https://groups.io/mt/105189564/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to