public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Aaron Li" <aaron.li@intel.com>
To: devel@edk2.groups.io
Cc: Zhiguang Liu <zhiguang.liu@intel.com>,
	Dandan Bi <dandan.bi@intel.com>,
	Liming Gao <gaoliming@byosoft.com.cn>,
	Liu Yun <yun.y.liu@intel.com>
Subject: [edk2-devel] [PATCH v1 1/1] MdeModulePkg/AcpiTableDxe: Select ACPI memory type by PCD
Date: Fri,  1 Mar 2024 14:03:30 +0800	[thread overview]
Message-ID: <20240301060330.996-1-aaron.li@intel.com> (raw)

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 switch all
ACPI allocated memory from EfiACPIReclaimMemory to EfiAcpiMemoryNVS.
If the PcdAcpiMemoryUseNvs is set to TRUE, all ACPI allocated memory
will using EfiAcpiMemoryNVS.

Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Cc: Dandan Bi <dandan.bi@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Liu Yun <yun.y.liu@intel.com>
Signed-off-by: Aaron Li <aaron.li@intel.com>
---
 MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c | 37 +++++++++++++++-----
 MdeModulePkg/MdeModulePkg.dec                                |  6 ++++
 MdeModulePkg/MdeModulePkg.uni                                |  7 ++++
 MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableDxe.inf    |  1 +
 4 files changed, 43 insertions(+), 8 deletions(-)

diff --git a/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c b/MdeModulePkg/Universal/Acpi/AcpiTableDxe/AcpiTableProtocol.c
index e09bc9b704f5..6c3dbad90345 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 (PcdAcpiMemoryUseNvs)) {
+    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 (PcdAcpiMemoryUseNvs)) {
+    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 (PcdAcpiMemoryUseNvs)) {
+    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 a2cd83345f5b..324fb5e69ae6 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -1523,6 +1523,12 @@ [PcdsFixedAtBuild, PcdsPatchableInModule]
   # @Prompt Exposed ACPI table versions.
   gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiExposedTableVersions|0x3E|UINT32|0x0001004c
 
+  ## Indicates whether ACPI memory is using NVS
+  # Default is FALSE that means ACPI memory is using EfiACPIReclaimMemory type
+  # If it is set to TRUE that means ACPI memory is using EfiACPIMemoryNVS type
+  # @Prompt ACPI memory is using NVS.
+  gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiMemoryUseNvs|FALSE|BOOLEAN|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..a2c10774bb54 100644
--- a/MdeModulePkg/MdeModulePkg.uni
+++ b/MdeModulePkg/MdeModulePkg.uni
@@ -955,6 +955,13 @@
                                                                                              "BIT 4 - EFI_ACPI_TABLE_VERSION_4_0.<BR>\n"
                                                                                              "BIT 5 - EFI_ACPI_TABLE_VERSION_5_0.<BR>"
 
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdAcpiMemoryUseNvs_PROMPT  #language en-US "ACPI memory is using NVS."
+
+#string STR_gEfiMdeModulePkgTokenSpaceGuid_PcdAcpiMemoryUseNvs_HELP  #language en-US "Indicates whether ACPI memory is using NVS\n"
+                                                                                     "Default is FALSE that means ACPI memory is using EfiACPIReclaimMemory type\n"
+                                                                                     "If it is set to TRUE that means ACPI memory is using EfiACPIMemoryNVS type"
+
+
 #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..38d64913a28c 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.PcdAcpiMemoryUseNvs            ## CONSUMES
 
 [Protocols]
   gEfiAcpiTableProtocolGuid                     ## PRODUCES
-- 
2.29.2.windows.2



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#116210): https://edk2.groups.io/g/devel/message/116210
Mute This Topic: https://groups.io/mt/104659443/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



             reply	other threads:[~2024-03-01  6:04 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-01  6:03 Aaron Li [this message]
2024-03-01  6:37 ` [edk2-devel] [PATCH v1 1/1] MdeModulePkg/AcpiTableDxe: Select ACPI memory type by PCD Ni, Ray

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240301060330.996-1-aaron.li@intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox