From 7136d5491e225c57f1d73e4a1b7ac27ed656ff72 Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Sun, 25 Sep 2022 16:53:27 +0200 Subject: [PATCH] ArmVirtPkg/QemuVirtMemInfoLib: use HOB not PCD to record the memory size Due to the way we inherited the formerly fixed PCDs to describe the system memory base and size from ArmPlatformPkg, we ended up with a MemoryInit PEIM that relies on dynamic PCDs to communicate the size of system memory between the constructor of one of its library dependencies and the core module. This is unnecessary, and forces us to incorporate the PCD PEIM as well, for no good reason. So instead, let's use a HOB. Signed-off-by: Ard Biesheuvel --- ArmVirtPkg/ArmVirtPkg.dec | 1 + ArmVirtPkg/ArmVirtQemu.dsc | 6 ++-- .../ArmVirtMemoryInitPeiLib.c | 14 ++++++-- .../ArmVirtMemoryInitPeiLib.inf | 1 + .../QemuVirtMemInfoLib/QemuVirtMemInfoLib.c | 35 +++++++++++++++++-- .../QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf | 5 ++- .../QemuVirtMemInfoPeiLib.inf | 8 ++--- .../QemuVirtMemInfoPeiLibConstructor.c | 30 +++++++++------- 8 files changed, 75 insertions(+), 25 deletions(-) diff --git a/ArmVirtPkg/ArmVirtPkg.dec b/ArmVirtPkg/ArmVirtPkg.dec index 4e165f6cd8..89d21ec3a3 100644 --- a/ArmVirtPkg/ArmVirtPkg.dec +++ b/ArmVirtPkg/ArmVirtPkg.dec @@ -32,6 +32,7 @@ gArmVirtTokenSpaceGuid = { 0x0B6F5CA7, 0x4F53, 0x445A, { 0xB7, 0x6E, 0x2E, 0x36, 0x5B, 0x80, 0x63, 0x66 } } gEarlyPL011BaseAddressGuid = { 0xB199DEA9, 0xFD5C, 0x4A84, { 0x80, 0x82, 0x2F, 0x41, 0x70, 0x78, 0x03, 0x05 } } gEarly16550UartBaseAddressGuid = { 0xea67ca3e, 0x1f54, 0x436b, { 0x97, 0x88, 0xd4, 0xeb, 0x29, 0xc3, 0x42, 0x67 } } + gArmVirtSystemMemorySizeGuid = { 0x504eccb9, 0x1bf0, 0x4420, { 0x86, 0x5d, 0xdc, 0x66, 0x06, 0xd4, 0x13, 0xbf } } gArmVirtVariableGuid = { 0x50bea1e5, 0xa2c5, 0x46e9, { 0x9b, 0x3a, 0x59, 0x59, 0x65, 0x16, 0xb0, 0x0a } } diff --git a/ArmVirtPkg/ArmVirtQemu.dsc b/ArmVirtPkg/ArmVirtQemu.dsc index d9c43e294c..e3686c7ee3 100644 --- a/ArmVirtPkg/ArmVirtQemu.dsc +++ b/ArmVirtPkg/ArmVirtQemu.dsc @@ -221,6 +221,9 @@ # Shadowing PEI modules is absolutely pointless when the NOR flash is emulated gEfiMdeModulePkgTokenSpaceGuid.PcdShadowPeimOnBoot|FALSE + # System Memory Size -- 128 MB initially, actual size will be fetched from DT + gArmTokenSpaceGuid.PcdSystemMemorySize|0x8000000 + [PcdsFixedAtBuild.AARCH64] # Clearing BIT0 in this PCD prevents installing a 32-bit SMBIOS entry point, # if the entry point version is >= 3.0. AARCH64 OSes cannot assume the @@ -237,9 +240,6 @@ # enumeration to complete before installing ACPI tables. gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration|TRUE - # System Memory Size -- 1 MB initially, actual size will be fetched from DT - gArmTokenSpaceGuid.PcdSystemMemorySize|0x00100000 - gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerIntrNum|0x0 gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum|0x0 diff --git a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c index 98d90ad420..72e5c65af7 100644 --- a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c +++ b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c @@ -52,10 +52,19 @@ MemoryPeim ( { EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttributes; UINT64 SystemMemoryTop; + UINT64 SystemMemorySize; + VOID *Hob; // Ensure PcdSystemMemorySize has been set ASSERT (PcdGet64 (PcdSystemMemorySize) != 0); + SystemMemorySize = PcdGet64 (PcdSystemMemorySize); + + Hob = GetFirstGuidHob (&gArmVirtSystemMemorySizeGuid); + if (Hob != NULL) { + SystemMemorySize = *(UINT64 *)GET_GUID_HOB_DATA (Hob); + } + // // Now, the permanent memory has been installed, we can call AllocatePages() // @@ -66,8 +75,7 @@ MemoryPeim ( EFI_RESOURCE_ATTRIBUTE_TESTED ); - SystemMemoryTop = PcdGet64 (PcdSystemMemoryBase) + - PcdGet64 (PcdSystemMemorySize); + SystemMemoryTop = PcdGet64 (PcdSystemMemoryBase) + SystemMemorySize; if (SystemMemoryTop - 1 > MAX_ALLOC_ADDRESS) { BuildResourceDescriptorHob ( @@ -87,7 +95,7 @@ MemoryPeim ( EFI_RESOURCE_SYSTEM_MEMORY, ResourceAttributes, PcdGet64 (PcdSystemMemoryBase), - PcdGet64 (PcdSystemMemorySize) + SystemMemorySize ); } diff --git a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf index 21327f79f4..48d9c66b22 100644 --- a/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf +++ b/ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.inf @@ -34,6 +34,7 @@ CacheMaintenanceLib [Guids] + gArmVirtSystemMemorySizeGuid gEfiMemoryTypeInformationGuid [FeaturePcd] diff --git a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c index cf569bed99..9cf43f06c0 100644 --- a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c +++ b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.c @@ -6,10 +6,12 @@ **/ -#include +#include +#include #include #include #include +#include #include // Number of Virtual Memory Map Descriptors @@ -24,6 +26,28 @@ #define MACH_VIRT_PERIPH_BASE 0x08000000 #define MACH_VIRT_PERIPH_SIZE SIZE_128MB +/** + Default library constructur that obtains the memory size from a PCD. + + @return Always returns RETURN_SUCCESS + +**/ +RETURN_STATUS +EFIAPI +QemuVirtMemInfoLibConstructor ( + VOID + ) +{ + UINT64 Size; + VOID *Hob; + + Size = PcdGet64 (PcdSystemMemorySize); + Hob = BuildGuidDataHob (&gArmVirtSystemMemorySizeGuid, &Size, sizeof Size); + ASSERT (Hob != NULL); + + return RETURN_SUCCESS; +} + /** Return the Virtual Memory Map of your platform @@ -43,9 +67,16 @@ ArmVirtGetMemoryMap ( ) { ARM_MEMORY_REGION_DESCRIPTOR *VirtualMemoryTable; + VOID *MemorySizeHob; ASSERT (VirtualMemoryMap != NULL); + MemorySizeHob = GetFirstGuidHob (&gArmVirtSystemMemorySizeGuid); + ASSERT (MemorySizeHob != NULL); + if (MemorySizeHob == NULL) { + return; + } + VirtualMemoryTable = AllocatePool ( sizeof (ARM_MEMORY_REGION_DESCRIPTOR) * MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS @@ -59,7 +90,7 @@ ArmVirtGetMemoryMap ( // System DRAM VirtualMemoryTable[0].PhysicalBase = PcdGet64 (PcdSystemMemoryBase); VirtualMemoryTable[0].VirtualBase = VirtualMemoryTable[0].PhysicalBase; - VirtualMemoryTable[0].Length = PcdGet64 (PcdSystemMemorySize); + VirtualMemoryTable[0].Length = *(UINT64 *)GET_GUID_HOB_DATA (MemorySizeHob); VirtualMemoryTable[0].Attributes = ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK; DEBUG (( diff --git a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf index 7150de6c10..6acad8bbd7 100644 --- a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf +++ b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoLib.inf @@ -14,6 +14,7 @@ MODULE_TYPE = BASE VERSION_STRING = 1.0 LIBRARY_CLASS = ArmVirtMemInfoLib + CONSTRUCTOR = QemuVirtMemInfoLibConstructor [Sources] QemuVirtMemInfoLib.c @@ -30,7 +31,9 @@ BaseMemoryLib DebugLib MemoryAllocationLib - PcdLib + +[Guids] + gArmVirtSystemMemorySizeGuid [Pcd] gArmTokenSpaceGuid.PcdFvBaseAddress diff --git a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf index 7ecf6dfbb7..f045e39a41 100644 --- a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf +++ b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLib.inf @@ -32,16 +32,16 @@ BaseMemoryLib DebugLib FdtLib - PcdLib MemoryAllocationLib -[Pcd] +[Guids] + gArmVirtSystemMemorySizeGuid + +[FixedPcd] gArmTokenSpaceGuid.PcdFdBaseAddress gArmTokenSpaceGuid.PcdFvBaseAddress gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize - -[FixedPcd] gArmTokenSpaceGuid.PcdFdSize gArmTokenSpaceGuid.PcdFvSize gArmVirtTokenSpaceGuid.PcdDeviceTreeInitialBaseAddress diff --git a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c index 33d3597d57..c47ab82966 100644 --- a/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c +++ b/ArmVirtPkg/Library/QemuVirtMemInfoLib/QemuVirtMemInfoPeiLibConstructor.c @@ -6,9 +6,10 @@ **/ -#include +#include +#include #include -#include +#include #include RETURN_STATUS @@ -17,14 +18,14 @@ QemuVirtMemInfoPeiLibConstructor ( VOID ) { - VOID *DeviceTreeBase; - INT32 Node, Prev; - UINT64 NewBase, CurBase; - UINT64 NewSize, CurSize; - CONST CHAR8 *Type; - INT32 Len; - CONST UINT64 *RegProp; - RETURN_STATUS PcdStatus; + VOID *DeviceTreeBase; + INT32 Node, Prev; + UINT64 NewBase, CurBase; + UINT64 NewSize, CurSize; + CONST CHAR8 *Type; + INT32 Len; + CONST UINT64 *RegProp; + VOID *Hob; NewBase = 0; NewSize = 0; @@ -86,8 +87,13 @@ QemuVirtMemInfoPeiLibConstructor ( // Make sure the start of DRAM matches our expectation // ASSERT (FixedPcdGet64 (PcdSystemMemoryBase) == NewBase); - PcdStatus = PcdSet64S (PcdSystemMemorySize, NewSize); - ASSERT_RETURN_ERROR (PcdStatus); + + Hob = BuildGuidDataHob ( + &gArmVirtSystemMemorySizeGuid, + &NewSize, + sizeof NewSize + ); + ASSERT (Hob != NULL); // // We need to make sure that the machine we are running on has at least