On 30 November 2015 at 10:22, Shannon Zhao <zhaoshengl...@huawei.com> wrote: > > > On 2015/11/30 16:53, Laszlo Ersek wrote: >> On 11/29/15 07:31, Shannon Zhao wrote: >>> From: Shannon Zhao <shannon.z...@linaro.org> >>> >>> Here we add the memory space for the memory nodes except the lowest one >>> in FDT. So these spaces will show up in the UEFI memory map. >>> >>> Contributed-under: TianoCore Contribution Agreement 1.0 >>> Signed-off-by: Shannon Zhao <shannon.z...@linaro.org> >>> --- >>> ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c | 34 >>> ++++++++++++++++++++++++++++++++++ >>> ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.inf | 4 ++++ >>> 2 files changed, 38 insertions(+) >>> >>> diff --git a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c >>> b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c >>> index 74f80d1..2c8d785 100644 >>> --- a/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c >>> +++ b/ArmVirtPkg/VirtFdtDxe/VirtFdtDxe.c >>> @@ -27,6 +27,7 @@ >>> #include <Library/HobLib.h> >>> #include <libfdt.h> >>> #include <Library/XenIoMmioLib.h> >>> +#include <Library/DxeServicesTableLib.h> >>> >>> #include <Guid/Fdt.h> >>> #include <Guid/VirtioMmioTransport.h> >>> @@ -304,6 +305,8 @@ InitializeVirtFdtDxe ( >>> UINT64 FwCfgDataSize; >>> UINT64 FwCfgDmaAddress; >>> UINT64 FwCfgDmaSize; >>> + UINT64 CurBase; >>> + UINT64 CurSize; >>> >>> Hob = GetFirstGuidHob(&gFdtHobGuid); >>> if (Hob == NULL || GET_GUID_HOB_DATA_SIZE (Hob) != sizeof (UINT64)) { >>> @@ -332,6 +335,37 @@ InitializeVirtFdtDxe ( >>> break; >>> } >>> >>> + // >>> + // Check for memory node and add the memory spaces expect the lowest >>> one >>> + // >> >> (1) Based on the DTB node, which looks like: >> >> memory { >> reg = <0x0 0x40000000 0x0 0x8000000>; >> device_type = "memory"; >> }; >> >> I agree that checking it here, before we look at "compatible", is a good >> thing. >> >> However, can you please factor this out into a separate function? (Just >> within this file, as a STATIC function.) >> >> I propose that the function return a BOOLEAN: >> - TRUE if the node was a match (either successfully or unsuccessfully); >> in which case you can "continue;" with the next iteration directly >> - FALSE, if there is no match (i.e., the current iteration must >> proceed, in order to look for different device types) >> > > Sure. > >>> + Type = fdt_getprop (DeviceTreeBase, Node, "device_type", &Len); >>> + if (Type && AsciiStrnCmp (Type, "memory", Len) == 0) { >>> + // >>> + // Get the 'reg' property of this node. For now, we will assume >>> + // two 8 byte quantities for base and size, respectively. >>> + // >>> + RegProp = fdt_getprop (DeviceTreeBase, Node, "reg", &Len); >>> + if (RegProp != 0 && Len == (2 * sizeof (UINT64))) { >>> + >>> + CurBase = fdt64_to_cpu (((UINT64 *)RegProp)[0]); >>> + CurSize = fdt64_to_cpu (((UINT64 *)RegProp)[1]); >>> + >>> + if (FixedPcdGet64 (PcdSystemMemoryBase) != CurBase) { >>> + Status = gDS->AddMemorySpace(EfiGcdMemoryTypeSystemMemory, >>> + CurBase, CurSize, >>> + EFI_MEMORY_WB | EFI_MEMORY_RUNTIME); >> >> (1) The edk2 coding style requires a space between the function name (or >> function pointer) and the opening paren. >> >> (2) Regarding the indentation of function arguments, they are aligned >> with the first or (more usually:) second character of the function or >> *member* name. In this case, they should be aligned with the second "d" >> in "AddMemorySpace". >> > Thanks for explain the edk2 coding style. Sorry, I'm not familiar with this. > >> (3) The last argument is a bitmask of capabilities. As far as I >> remember, all system memory regions I've seen dumped by Linux from the >> UEFI memmap at startup had all of: UC | WC | WT | WB. >> >> I agree that RUNTIME and WB should be listed here, but do you have any >> particular reason for not allowing UC|WC|WT? >> >> (4) Related question -- when you boot the guest kernel with this patch >> in the firmware, and pass "efi=debug" to Linux, do the memory attributes >> of the additional NUMA nodes look identically to the "base" memory? (I'm >> asking this to see if we need additional gDS->SetMemorySpaceAttributes() >> calls.) >> >> Can you paste a sample output from "efi=debug"? >> > > Processing EFI memory map: > 0x000004000000-0x000007ffffff [Memory Mapped I/O |RUN| |XP| | | | > | | | |UC] > 0x000009010000-0x000009010fff [Memory Mapped I/O |RUN| |XP| | | | > | | | |UC] > 0x000040000000-0x00004000ffff [Loader Data | | | | | | | > |WB|WT|WC|UC] > 0x000040010000-0x00004007ffff [Conventional Memory| | | | | | | > |WB|WT|WC|UC] > > [cut some information here] > > 0x000060000000-0x0000bfffffff [Conventional Memory|RUN| | | | | | > |WB| | | ] > > Looks like the region is showed with the attributes we set. While > comparing with other Conventional Memory, it doesn't have RUNTIME. So > drop it? >
You should not set the runtime bit, but you should set the UC, WC and WT bits, as Laszlo mentioned. >>> + if (EFI_ERROR(Status)) { >>> + ASSERT_EFI_ERROR(Status); >>> + } >> >> (5) "ASSERT_EFI_ERROR (Status)" would suffice. >> >> However, I think I'd prefer if we just logged an error here (with >> EFI_D_ERROR level), and continued (i.e., returned TRUE). >> >>> + DEBUG ((EFI_D_INFO, "%a: Add System RAM @ 0x%lx - 0x%lx\n", >>> + __FUNCTION__, CurBase, CurBase + CurSize - 1)); >>> + } >> >> (6) This isn't indented correctly (not just the arguments). >> >>> + } else { >>> + DEBUG ((EFI_D_ERROR, "%a: Failed to parse FDT memory node\n", >>> + __FUNCTION__)); >>> + } >> >> (7) I think this error log branch is not necessary here. The same will >> have been logged in the code that is modified by patch #1. >> > > Will fix these and re-send a new version. > > Thanks, > -- > Shannon > _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel