On Wed, Mar 27, 2024 at 14:01:43 +0000, Xiong Yining wrote: > 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.
"HighMem" doesn't really make sense outside x86. But I also don't want to delay merging this any furtner because of arguing about names. There are a few stule things below that I will fix up before pushing though: > Signed-off-by: Xiong Yining <xiongyining1...@phytium.com.cn> > Signed-off-by: Chen Baozi <chenba...@phytium.com.cn> Drop additional Signed-off-by, as discussed on other set. > Tested-by: Marcin Juszkiewicz <marcin.juszkiew...@linaro.org> > --- > Platform/Qemu/SbsaQemu/SbsaQemu.dsc | 1 + > Platform/Qemu/SbsaQemu/SbsaQemu.fdf | 1 + > .../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf | 45 ++++++ > .../SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c | 134 ++++++++++++++++++ > 4 files changed, 181 insertions(+) > 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 3b936f6e6386..22017792bad2 100644 > --- a/Platform/Qemu/SbsaQemu/SbsaQemu.dsc > +++ b/Platform/Qemu/SbsaQemu/SbsaQemu.dsc > @@ -671,6 +671,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..304f47392298 > --- /dev/null > +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.inf > @@ -0,0 +1,45 @@ > +## @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 > + ArmPkg/ArmPkg.dec > + Silicon/Qemu/SbsaQemu/SbsaQemu.dec Sort these alphabetically. > + > +[LibraryClasses] > + BaseLib > + DebugLib > + DxeServicesTableLib > + PcdLib > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + HardwareInfoLib Sort these alphabetically. > + > +[Protocols] > + gEfiCpuArchProtocolGuid ## CONSUMES > + > +[Pcd] > + gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy > + gArmTokenSpaceGuid.PcdSystemMemoryBase Sort these alphabetically. > + > +[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..004a8c0cf654 > --- /dev/null > +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuHighMemDxe/SbsaQemuHighMemDxe.c > @@ -0,0 +1,134 @@ > +/** @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/UefiBootServicesTableLib.h> > +#include <Library/HardwareInfoLib.h> > + > +#include <Protocol/Cpu.h> > + > +EFI_STATUS > +EFIAPI > +InitializeHighMemDxe ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_CPU_ARCH_PROTOCOL *Cpu; > + EFI_STATUS Status; > + UINT32 NumMemNodes; > + UINT32 index; Renamed "index" to "Index" to follow coding style. With that: Reviewed-by: Leif Lindholm <quic_llind...@quicinc.com> Pushed as 6105ecb0aa06. Thanks! / Leif > + UINT64 CurBase; > + UINT64 CurSize; > + UINT64 Attributes; > + MemoryInfo MemInfo; > + EFI_GCD_MEMORY_SPACE_DESCRIPTOR GcdDescriptor; > + > + 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 = GetMemNodeCount(); > + for (index = 0; index < NumMemNodes; index++){ > + GetMemInfo(index, &MemInfo); > + CurBase = MemInfo.AddressBase; > + CurSize = MemInfo.AddressSize; > + > + if (CurBase > PcdGet64 (PcdSystemMemoryBase)) { > + 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 > + ); > + > + 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 > + ); > + 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 = Cpu->SetMemoryAttributes (Cpu, 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 (#117210): https://edk2.groups.io/g/devel/message/117210 Mute This Topic: https://groups.io/mt/105177586/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-