* [edk2-devel] [PATCH v2 0/1] Support multi memory nodes
@ 2023-12-28 1:59 Xiong Yining
2023-12-28 1:59 ` [edk2-devel] [PATCH v2 1/1] SbsaQemu: add memory space for the high " Xiong Yining
0 siblings, 1 reply; 2+ messages in thread
From: Xiong Yining @ 2023-12-28 1:59 UTC (permalink / raw)
To: devel; +Cc: Xiong Yining
When SaSbQemu platform is configured with multi memory nodes, like
numa architecture, os will ignore any memory node in the device tree
except the first one.The kernel reads UEFI memory map for memory
information when booting via UEFI.However UEFI only allocates the
first memory node memory space for SbsaQemu platform, in this
scenario we can use the GCD services to add memory spaces
for high memory node.
Changes in v2:
- get the information of memory via SMC rather than FdtClientDxe.
- add a new driver rather than use HighMemDxe.
Xiong Yining (1):
SbsaQemu: add memory space for the high memory nodes
Platform/Qemu/SbsaQemu/SbsaQemu.dsc | 3 +-
Platform/Qemu/SbsaQemu/SbsaQemu.fdf | 1 +
.../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf | 43 ++++++
.../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c | 133 ++++++++++++++++++
4 files changed, 179 insertions(+), 1 deletion(-)
create mode 100644 Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
create mode 100644 Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c
--
2.34.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#113049): https://edk2.groups.io/g/devel/message/113049
Mute This Topic: https://groups.io/mt/103494170/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply [flat|nested] 2+ messages in thread
* [edk2-devel] [PATCH v2 1/1] SbsaQemu: add memory space for the high memory nodes
2023-12-28 1:59 [edk2-devel] [PATCH v2 0/1] Support multi memory nodes Xiong Yining
@ 2023-12-28 1:59 ` Xiong Yining
0 siblings, 0 replies; 2+ messages in thread
From: Xiong Yining @ 2023-12-28 1:59 UTC (permalink / raw)
To: devel; +Cc: Xiong Yining, Chen Baozi
To support more memory nodes, we refer to the implement of
"OvmfPkg/Fdt/HighMemDxe" to add memory space for the high memory nodes
except the first one.
Signed-off-by: Xiong Yining <xiongyining1480@phytium.com.cn>
Signed-off-by: Chen Baozi <chenbaozi@phytium.com.cn>
---
Platform/Qemu/SbsaQemu/SbsaQemu.dsc | 3 +-
Platform/Qemu/SbsaQemu/SbsaQemu.fdf | 1 +
.../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf | 43 ++++++
.../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c | 133 ++++++++++++++++++
4 files changed, 179 insertions(+), 1 deletion(-)
create mode 100644 Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
create mode 100644 Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c
diff --git a/Platform/Qemu/SbsaQemu/SbsaQemu.dsc b/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
index 378600050df9..21acc188b75e 100644
--- a/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
+++ b/Platform/Qemu/SbsaQemu/SbsaQemu.dsc
@@ -78,7 +78,7 @@ DEFINE NETWORK_HTTP_BOOT_ENABLE = FALSE
SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
- ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf
+ ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf
FdtLib|EmbeddedPkg/Library/FdtLib/FdtLib.inf
UefiRuntimeLib|MdePkg/Library/UefiRuntimeLib/UefiRuntimeLib.inf
@@ -675,6 +675,7 @@ DEFINE NETWORK_HTTP_BOOT_ENABLE = FALSE
ArmPkg/Drivers/TimerDxe/TimerDxe.inf
OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
+ Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
#
# FAT filesystem + GPT/MBR partitioning
diff --git a/Platform/Qemu/SbsaQemu/SbsaQemu.fdf b/Platform/Qemu/SbsaQemu/SbsaQemu.fdf
index 6fcfd25faaeb..b35f42e11aa4 100644
--- a/Platform/Qemu/SbsaQemu/SbsaQemu.fdf
+++ b/Platform/Qemu/SbsaQemu/SbsaQemu.fdf
@@ -161,6 +161,7 @@ READ_LOCK_STATUS = TRUE
INF MdeModulePkg/Core/Dxe/DxeMain.inf
INF MdeModulePkg/Universal/PCD/Dxe/Pcd.inf
+ INF Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
#
# PI DXE Drivers producing Architectural Protocols (EFI Services)
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
new file mode 100644
index 000000000000..27a7ef649685
--- /dev/null
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf
@@ -0,0 +1,43 @@
+## @file
+# High memory node enumeration DXE driver for SbsaQemu
+#
+# Copyright (c) 2023, Linaro Ltd. All rights reserved.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SbsaQemuHighMemDxe
+ FILE_GUID = 9E749C5E-C282-32F8-7CC3-E5A3DDE15329
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+
+ ENTRY_POINT = InitializeHighMemDxe
+
+[Sources]
+ SbsaQemuHighMemDxe.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+ Silicon/Qemu/SbsaQemu/SbsaQemu.dec
+
+[LibraryClasses]
+ BaseLib
+ DebugLib
+ DxeServicesTableLib
+ PcdLib
+ UefiBootServicesTableLib
+ UefiDriverEntryPoint
+ SbsaQemuSmc
+
+[Protocols]
+ gEfiCpuArchProtocolGuid ## CONSUMES
+
+[Pcd]
+ gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy
+
+[Depex]
+ gEfiCpuArchProtocolGuid
diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c
new file mode 100644
index 000000000000..01b74a1247cd
--- /dev/null
+++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c
@@ -0,0 +1,133 @@
+/** @file
+* High memory node enumeration DXE driver for SbsaQemu
+* Virtual Machines
+*
+* Copyright (c) 2023, Linaro Ltd. All rights reserved.
+*
+* SPDX-License-Identifier: BSD-2-Clause-Patent
+*
+**/
+
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/DxeServicesTableLib.h>
+#include <Library/PcdLib.h>
+#include <Library/QemuSbsaSmc.h>
+#include <Library/UefiBootServicesTableLib.h>
+
+#include <Protocol/Cpu.h>
+
+EFI_STATUS
+EFIAPI
+InitializeHighMemDxe (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+
+
+ UINT64 CurBase;
+ UINT64 CurSize;
+ UINT64 Attributes;
+ UINT32 NumMemNodes;
+ UINT32 index;
+ MemoryNode MemNode;
+ EFI_STATUS Status;
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor;
+ EFI_CPU_ARCH_PROTOCOL *Cpu;
+
+ Status = gBS->LocateProtocol (
+ &gEfiCpuArchProtocolGuid,
+ NULL,
+ (VOID **)&Cpu
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Check for memory node and add the memory spaces except the lowest one
+ //
+ NumMemNodes = SbsaQemuGetMemNodeCount();
+ for (index = 0; index < NumMemNodes; index++){
+ MemNode = SbsaQemuGetMemInfo(index);
+ CurBase = MemNode.AddressBase;
+ CurSize = MemNode.AddressSize;
+
+ Status = gDS->GetMemorySpaceDescriptor (CurBase, &GcdDescriptor);
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_WARN,
+ "%a: Region 0x%lx - 0x%lx not found in the GCD memory space map\n",
+ __func__,
+ CurBase,
+ CurBase + CurSize - 1
+ ));
+ continue;
+ }
+
+ if (GcdDescriptor.GcdMemoryType == EfiGcdMemoryTypeNonExistent) {
+ Status = gDS->AddMemorySpace (
+ EfiGcdMemoryTypeSystemMemory,
+ CurBase,
+ CurSize,
+ EFI_MEMORY_WB | EFI_MEMORY_XP
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Failed to add System RAM @ 0x%lx - 0x%lx (%r)\n",
+ __func__,
+ CurBase,
+ CurBase + CurSize - 1,
+ Status
+ ));
+ continue;
+ }
+
+ Status = gDS->SetMemorySpaceAttributes (
+ CurBase,
+ CurSize,
+ EFI_MEMORY_WB | EFI_MEMORY_XP
+ );
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_WARN,
+ "%a: gDS->SetMemorySpaceAttributes() failed on region 0x%lx - 0x%lx (%r)\n",
+ __func__,
+ CurBase,
+ CurBase + CurSize - 1,
+ Status
+ ));
+ }
+
+ Attributes = EFI_MEMORY_WB;
+ if ((PcdGet64 (PcdDxeNxMemoryProtectionPolicy) &
+ (1U << (UINT32)EfiConventionalMemory)) != 0)
+ {
+ Attributes |= EFI_MEMORY_XP;
+ }
+
+ Status = gDS->SetMemorySpaceAttributes (CurBase, CurSize, Attributes);
+
+ if (EFI_ERROR (Status)) {
+ DEBUG ((
+ DEBUG_ERROR,
+ "%a: Failed to set System RAM @ 0x%lx - 0x%lx attribute (%r)\n",
+ __func__,
+ CurBase,
+ CurBase + CurSize - 1,
+ Status
+ ));
+ } else {
+ DEBUG ((
+ DEBUG_INFO,
+ "%a: Add System RAM @ 0x%lx - 0x%lx\n",
+ __func__,
+ CurBase,
+ CurBase + CurSize - 1
+ ));
+ }
+
+ }
+ }
+ return EFI_SUCCESS;
+}
--
2.34.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#113048): https://edk2.groups.io/g/devel/message/113048
Mute This Topic: https://groups.io/mt/103494168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-01-03 0:59 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-12-28 1:59 [edk2-devel] [PATCH v2 0/1] Support multi memory nodes Xiong Yining
2023-12-28 1:59 ` [edk2-devel] [PATCH v2 1/1] SbsaQemu: add memory space for the high " Xiong Yining
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox