From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id AF468D80CA0 for ; Fri, 22 Mar 2024 16:09:08 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=Rr16UTP5XE4oXSE/EEcRPkBqga2T/DXY2EnPsx79oZ0=; c=relaxed/simple; d=groups.io; h=From:Date:Subject:MIME-Version:Message-Id:References:In-Reply-To:To:Cc:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Transfer-Encoding; s=20240206; t=1711123747; v=1; b=2wPlEzmtTCQCvNwJlUHIFy+Mzg3P47uH7JV4I8v9DA7DAJDrTmAaUANnySNkmXqRuVU3z0xg cMVsVIySmDppv+SI2Gsiq4pAZXsiFbx+XuO1XOpHa/Dd2UuGJPZyt+m/qQcNOrPapB1EKG6d6Hf hgUvPSfnFrXr2sXMxC+xYFGKN1FjtSkWv8I/mX+Ui5ybzX4A6DMZhKlqR4kZdUlYVLecqMTaTa+ TWcDzH6d1Xxk/y7zhwNSBJYO8IcBzMLlNxWgsFP4cHcVXIcmAwTOEpnZQ5XVwUw485Q8kc4LYRZ lxxgl8be7G6kWuU+do6ca+oPD+Nh3isnQyZBs9cy+md3A== X-Received: by 127.0.0.2 with SMTP id MvqCYY7687511x7Ic1zb4OK5; Fri, 22 Mar 2024 09:09:07 -0700 X-Received: from muminek.juszkiewicz.com.pl (muminek.juszkiewicz.com.pl [213.251.184.221]) by mx.groups.io with SMTP id smtpd.web10.76.1711123746392348259 for ; Fri, 22 Mar 2024 09:09:06 -0700 X-Received: from localhost (localhost [127.0.0.1]) by muminek.juszkiewicz.com.pl (Postfix) with ESMTP id 4A4E526108F; Fri, 22 Mar 2024 17:09:04 +0100 (CET) X-Virus-Scanned: Debian amavis at juszkiewicz.com.pl X-Received: from muminek.juszkiewicz.com.pl ([127.0.0.1]) by localhost (muminek.juszkiewicz.com.pl [127.0.0.1]) (amavis, port 10024) with ESMTP id ObPLolWHr1_4; Fri, 22 Mar 2024 17:09:02 +0100 (CET) X-Received: from [172.17.0.1] (83.11.22.169.ipv4.supernova.orange.pl [83.11.22.169]) by muminek.juszkiewicz.com.pl (Postfix) with ESMTPSA id BC3BD260BCF; Fri, 22 Mar 2024 17:08:59 +0100 (CET) From: "Marcin Juszkiewicz" Date: Fri, 22 Mar 2024 17:08:50 +0100 Subject: [edk2-devel] [PATCH edk2-platforms v9 4/4] Platform/SbsaQemu: get the information of memory via SMC calls MIME-Version: 1.0 Message-Id: <20240322-no-dt-for-cpu-v9-4-92e947e0fbdf@linaro.org> References: <20240322-no-dt-for-cpu-v9-0-92e947e0fbdf@linaro.org> In-Reply-To: <20240322-no-dt-for-cpu-v9-0-92e947e0fbdf@linaro.org> To: devel@edk2.groups.io Cc: Leif Lindholm , Ard Biesheuvel , Graeme Gregory , Xiong Yining , Chen Baozi , Marcin Juszkiewicz Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Resent-Date: Fri, 22 Mar 2024 09:09:06 -0700 Reply-To: devel@edk2.groups.io,marcin.juszkiewicz@linaro.org List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: FEcVh1CTewdE7XNDpqClOjNux7686176AA= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=2wPlEzmt; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=linaro.org (policy=none) From: Xiong Yining Provide functions to check for memory information: - amount of memory nodes - memory address - NUMA node id for memory Values are read from TF-A using platform specific SMC calls. Signed-off-by: Xiong Yining Signed-off-by: Chen Baozi Signed-off-by: Marcin Juszkiewicz --- .../SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf | 3 +- .../SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h | 2 + .../Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h | 28 ++++++++++ .../SbsaQemuHardwareInfoLib.c | 50 ++++++++++++++++= ++ .../Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c | 54 +++++-----------= ---- 5 files changed, 94 insertions(+), 43 deletions(-) diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf b/Si= licon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf index 07e6bc4e9b11..384cbb349200 100644 --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf @@ -32,14 +32,13 @@ [LibraryClasses] ArmLib BaseMemoryLib DebugLib + HardwareInfoLib MemoryAllocationLib PcdLib - SbsaQemuHardwareInfoLib =20 [Pcd] gArmTokenSpaceGuid.PcdSystemMemoryBase gArmTokenSpaceGuid.PcdSystemMemorySize - gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdDeviceTreeBaseAddress =20 [FixedPcd] gArmTokenSpaceGuid.PcdFdBaseAddress diff --git a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h b= /Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h index 2317c1f0ae69..e3092007d27d 100644 --- a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h +++ b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h @@ -16,6 +16,8 @@ #define SIP_SVC_GET_GIC_ITS SMC_SIP_FUNCTION_ID(101) #define SIP_SVC_GET_CPU_COUNT SMC_SIP_FUNCTION_ID(200) #define SIP_SVC_GET_CPU_NODE SMC_SIP_FUNCTION_ID(201) +#define SIP_SVC_GET_MEMORY_NODE_COUNT SMC_SIP_FUNCTION_ID(300) +#define SIP_SVC_GET_MEMORY_NODE SMC_SIP_FUNCTION_ID(301) =20 /* * SMCC does not define return codes for SiP functions. diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h b/Sili= con/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h index 9c7281f123d2..c7d397c590a8 100644 --- a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h +++ b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h @@ -9,6 +9,12 @@ #ifndef HARDWARE_INFO_LIB #define HARDWARE_INFO_LIB =20 +typedef struct{ + UINT32 NodeId; + UINT64 AddressBase; + UINT64 AddressSize; +} MemoryInfo; + /** Get CPU count from information passed by Qemu. =20 @@ -42,4 +48,26 @@ GetCpuNumaNode ( IN UINTN CpuId ); =20 +/** + Get the number of memory node from device tree passed by Qemu. + + @retval the number of memory nodes. +**/ +UINT32 +GetMemNodeCount ( + VOID + ); + +/** + Get memory infomation(node-id, addressbase, addresssize) for a given mem= ory node from device tree passed by Qemu. + + @param [in] MemoryId Index of memory to retrieve memory information= . + + @retval memory infomation for given memory node. +**/ +MemoryInfo +GetMemInfo ( + IN UINTN MemoryId + ); + #endif /* HARDWARE_INFO_LIB */ diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemu= HardwareInfoLib.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/S= bsaQemuHardwareInfoLib.c index e96328978a55..4f49ae7e1862 100644 --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwar= eInfoLib.c +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwar= eInfoLib.c @@ -94,3 +94,53 @@ GetCpuNumaNode ( =20 return Arg0; } + +UINT32 +GetMemNodeCount ( + VOID + ) +{ + UINTN SmcResult; + UINTN Arg0; + + SmcResult =3D ArmCallSmc0 (SIP_SVC_GET_MEMORY_NODE_COUNT, &Arg0, NULL, N= ULL); + if (SmcResult !=3D SMC_SIP_CALL_SUCCESS) { + DEBUG ((DEBUG_ERROR, "%a: SIP_SVC_GET_MEMORY_NODE_COUNT call failed. W= e have no memory information.\n", __FUNCTION__)); + ResetShutdown (); + } + + DEBUG (( DEBUG_INFO, "%a: The number of the memory nodes is %ld\n", __FU= NCTION__, Arg0)); + return (UINT32)Arg0; +} + +MemoryInfo +GetMemInfo ( + IN UINTN MemoryId + ) +{ + UINTN SmcResult; + UINTN Arg0; + UINTN Arg1; + UINTN Arg2; + MemoryInfo MemInfo; + + Arg0 =3D MemoryId; + + SmcResult =3D ArmCallSmc1 (SIP_SVC_GET_MEMORY_NODE, &Arg0, &Arg1, &Arg2)= ; + if (SmcResult !=3D SMC_SIP_CALL_SUCCESS) { + DEBUG ((DEBUG_ERROR, "%a: SIP_SVC_GET_MEMORY_NODE call failed. We have= no memory information.\n", __FUNCTION__)); + ResetShutdown (); + } else { + MemInfo.NodeId =3D Arg0; + MemInfo.AddressBase =3D Arg1; + MemInfo.AddressSize =3D Arg2; + } + + DEBUG(( DEBUG_INFO, "%a: NUMA node for System RAM:%d =3D 0x%lx - 0x%lx\n= ", + __FUNCTION__, + MemInfo.NodeId, + MemInfo.AddressBase, + MemInfo.AddressBase + MemInfo.AddressSize -1 )); + + return MemInfo; +} diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c b/Sili= con/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c index 8c2eb0b6a028..264ca9acb203 100644 --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c @@ -12,7 +12,7 @@ #include #include #include -#include +#include =20 // Number of Virtual Memory Map Descriptors #define MAX_VIRTUAL_MEMORY_MAP_DESCRIPTORS 4 @@ -23,53 +23,25 @@ SbsaQemuLibConstructor ( VOID ) { - VOID *DeviceTreeBase; - INT32 Node, Prev; UINT64 NewBase, CurBase; UINT64 NewSize, CurSize; - CONST CHAR8 *Type; - INT32 Len; - CONST UINT64 *RegProp; + UINT32 NumMemNodes; + UINT32 Index; + MemoryInfo MemInfo; RETURN_STATUS PcdStatus; =20 NewBase =3D 0; NewSize =3D 0; =20 - DeviceTreeBase =3D (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress); - ASSERT (DeviceTreeBase !=3D NULL); - - // Make sure we have a valid device tree blob - ASSERT (fdt_check_header (DeviceTreeBase) =3D=3D 0); - - // Look for the lowest memory node - for (Prev =3D 0;; Prev =3D Node) { - Node =3D fdt_next_node (DeviceTreeBase, Prev, NULL); - if (Node < 0) { - break; - } - - // Check for memory node - Type =3D fdt_getprop (DeviceTreeBase, Node, "device_type", &Len); - if (Type && AsciiStrnCmp (Type, "memory", Len) =3D=3D 0) { - // Get the 'reg' property of this node. For now, we will assume - // two 8 byte quantities for base and size, respectively. - RegProp =3D fdt_getprop (DeviceTreeBase, Node, "reg", &Len); - if (RegProp !=3D 0 && Len =3D=3D (2 * sizeof (UINT64))) { - - CurBase =3D fdt64_to_cpu (ReadUnaligned64 (RegProp)); - CurSize =3D fdt64_to_cpu (ReadUnaligned64 (RegProp + 1)); - - DEBUG ((DEBUG_INFO, "%a: System RAM @ 0x%lx - 0x%lx\n", - __FUNCTION__, CurBase, CurBase + CurSize - 1)); - - if (NewBase > CurBase || NewBase =3D=3D 0) { - NewBase =3D CurBase; - NewSize =3D CurSize; - } - } else { - DEBUG ((DEBUG_ERROR, "%a: Failed to parse FDT memory node\n", - __FUNCTION__)); - } + NumMemNodes =3D GetMemNodeCount(); + for(Index =3D 0; Index < NumMemNodes; Index++){ + MemInfo =3D GetMemInfo(Index); + CurBase =3D MemInfo.AddressBase; + CurSize =3D MemInfo.AddressSize; + + if (NewBase > CurBase || NewBase =3D=3D 0) { + NewBase =3D CurBase; + NewSize =3D CurSize; } } =20 --=20 2.44.0 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117060): https://edk2.groups.io/g/devel/message/117060 Mute This Topic: https://groups.io/mt/105088444/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-