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 0D402AC17A1 for ; Wed, 27 Mar 2024 15:06:12 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=iR4KaJjwGxNKwYougzfcc9YunR3Cq43iausu0bJwyP8=; c=relaxed/simple; d=groups.io; h=Date:From:To:CC:Subject:Message-ID:References:MIME-Version:In-Reply-To:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Resent-Date:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Type:Content-Disposition; s=20240206; t=1711551971; v=1; b=oXlYm1+5/LwdRaSX5IsK7aSNo+lT+wHqHrIZfIFm0DvkfuwH+MQYutypwOCBF3U5VA6IG/qh dX6kMfemjMBlUHVL4teABVtdSLie/n8MABy2EiujRwJal63UxINlmkic0TbupyYP/ieHT0Hy79Q vxlE2sbwjXhs763yJcCTyaOsR0cGbPZEPeqXG7fhhDFgelrZW5ddHJR2Dot7h0cazQpXUxUaLuA YJm/FmszD8GzcDfPrqG4APr+DumJGVIQ+b6ezfNY98wfwxkP64i7bE+kYbfuhOdE4cSUASa4Jju WL7AxkYyzOG9Ld0miL1QOQGJIcI3m2iBfXTMa6sBE2kkQ== X-Received: by 127.0.0.2 with SMTP id RzuxYY7687511xAwpOVTN80Q; Wed, 27 Mar 2024 08:06:11 -0700 X-Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by mx.groups.io with SMTP id smtpd.web10.40243.1711551971171989809 for ; Wed, 27 Mar 2024 08:06:11 -0700 X-Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.24/8.17.1.24) with ESMTP id 42RARDet005281; Wed, 27 Mar 2024 15:06:11 GMT X-Received: from nasanppmta05.qualcomm.com (i-global254.qualcomm.com [199.106.103.254]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3x4g0w91mu-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 27 Mar 2024 15:06:10 +0000 (GMT) X-Received: from nasanex01c.na.qualcomm.com (nasanex01c.na.qualcomm.com [10.45.79.139]) by NASANPPMTA05.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 42RF690O024045 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 27 Mar 2024 15:06:09 GMT X-Received: from qc-i7.hemma.eciton.net (10.80.80.8) by nasanex01c.na.qualcomm.com (10.45.79.139) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1544.4; Wed, 27 Mar 2024 08:06:08 -0700 Date: Wed, 27 Mar 2024 15:06:04 +0000 From: "Leif Lindholm" To: Xiong Yining CC: , , , , , Ard Biesheuvel Subject: Re: [edk2-devel] [PATCH v10 4/4] Platform/SbsaQemu: get the information of memory via SMC calls Message-ID: References: <20240327140305.3802896-1-xiongyining1480@phytium.com.cn> <20240327140305.3802896-5-xiongyining1480@phytium.com.cn> MIME-Version: 1.0 In-Reply-To: <20240327140305.3802896-5-xiongyining1480@phytium.com.cn> X-Originating-IP: [10.80.80.8] X-ClientProxiedBy: nasanex01b.na.qualcomm.com (10.46.141.250) To nasanex01c.na.qualcomm.com (10.45.79.139) X-QCInternal: smtphost X-Proofpoint-GUID: uoKUKxjhMzMiX_0DS9CPMh0Kf97BqfyU X-Proofpoint-ORIG-GUID: uoKUKxjhMzMiX_0DS9CPMh0Kf97BqfyU 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: Wed, 27 Mar 2024 08:06:11 -0700 Reply-To: devel@edk2.groups.io,quic_llindhol@quicinc.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: ZBGBRQSbWInaFK4DqAU5uNCox7686176AA= Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=oXlYm1+5; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=quicinc.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io I think the patch ordering relative to 3/4 breaks bisect? / Leif On Wed, Mar 27, 2024 at 14:03:05 +0000, Xiong Yining wrote: > 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 > Reviewed-by: Ard Biesheuvel > --- > .../Library/SbsaQemuLib/SbsaQemuLib.inf | 3 +- > .../Include/IndustryStandard/SbsaQemuSmc.h | 2 + > .../Include/Library/HardwareInfoLib.h | 31 +++++++++++ > .../SbsaQemuHardwareInfoLib.c | 49 +++++++++++++++++ > .../Library/SbsaQemuLib/SbsaQemuMem.c | 54 +++++-------------- > 5 files changed, 96 insertions(+), 43 deletions(-) > > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf b/Silicon/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 @@ > ArmLib > BaseMemoryLib > DebugLib > + HardwareInfoLib > MemoryAllocationLib > PcdLib > - SbsaQemuHardwareInfoLib > > [Pcd] > gArmTokenSpaceGuid.PcdSystemMemoryBase > gArmTokenSpaceGuid.PcdSystemMemorySize > - gArmVirtSbsaQemuPlatformTokenSpaceGuid.PcdDeviceTreeBaseAddress > > [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) > > /* > * SMCC does not define return codes for SiP functions. > diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h > index 8b1b5e5e1b93..5db0eacc9d2d 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 > > +typedef struct{ > + UINT32 NodeId; > + UINT64 AddressBase; > + UINT64 AddressSize; > +} MemoryInfo; > + > /** > Get CPU count from information passed by Qemu. > > @@ -42,4 +48,29 @@ GetCpuNumaNode ( > IN UINTN CpuId > ); > > +/** > + Get the number of memory node from device tree passed by Qemu. > + > + @retval the number of memory nodes. > +**/ > +UINT32 > +GetMemNodeCount ( > + VOID > + ); > + > +/** > + Get memory information(node-id, addressbase, addresssize) for a given memory node from device tree passed by Qemu. > + > + @param [in] MemoryId Index of memory to retrieve memory information. > + @param [out] MemInfo A pointer to the memory information of given memory-id. > + > + > + @retval memory infomation for given memory node. > +**/ > +VOID > +GetMemInfo ( > + IN UINTN MemoryId, > + OUT MemoryInfo *MemInfo > + ); > + > #endif /* HARDWARE_INFO_LIB */ > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > index e96328978a55..b178cf6c6c43 100644 > --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > @@ -94,3 +94,52 @@ GetCpuNumaNode ( > > return Arg0; > } > + > +UINT32 > +GetMemNodeCount ( > + VOID > + ) > +{ > + UINTN SmcResult; > + UINTN Arg0; > + > + SmcResult = ArmCallSmc0 (SIP_SVC_GET_MEMORY_NODE_COUNT, &Arg0, NULL, NULL); > + if (SmcResult != SMC_SIP_CALL_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "%a: SIP_SVC_GET_MEMORY_NODE_COUNT call failed. We have no memory information.\n", __FUNCTION__)); > + ResetShutdown (); > + } > + > + DEBUG (( DEBUG_INFO, "%a: The number of the memory nodes is %ld\n", __FUNCTION__, Arg0)); > + return (UINT32)Arg0; > +} > + > +VOID > +GetMemInfo ( > + IN UINTN MemoryId, > + OUT MemoryInfo *MemInfo > + ) > +{ > + UINTN SmcResult; > + UINTN Arg0; > + UINTN Arg1; > + UINTN Arg2; > + > + Arg0 = MemoryId; > + > + SmcResult = ArmCallSmc1 (SIP_SVC_GET_MEMORY_NODE, &Arg0, &Arg1, &Arg2); > + if (SmcResult != 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 = Arg0; > + MemInfo->AddressBase = Arg1; > + MemInfo->AddressSize = Arg2; > + } > + > + DEBUG(( DEBUG_INFO, "%a: NUMA node for System RAM:%d = 0x%lx - 0x%lx\n", > + __FUNCTION__, > + MemInfo->NodeId, > + MemInfo->AddressBase, > + MemInfo->AddressBase + MemInfo->AddressSize -1 )); > + > +} > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c > index 8c2eb0b6a028..f838fdcf274d 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 > > // 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; > > NewBase = 0; > NewSize = 0; > > - DeviceTreeBase = (VOID *)(UINTN)PcdGet64 (PcdDeviceTreeBaseAddress); > - ASSERT (DeviceTreeBase != NULL); > - > - // Make sure we have a valid device tree blob > - ASSERT (fdt_check_header (DeviceTreeBase) == 0); > - > - // Look for the lowest memory node > - for (Prev = 0;; Prev = Node) { > - Node = fdt_next_node (DeviceTreeBase, Prev, NULL); > - if (Node < 0) { > - break; > - } > - > - // Check for memory node > - 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 (ReadUnaligned64 (RegProp)); > - CurSize = 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 == 0) { > - NewBase = CurBase; > - NewSize = CurSize; > - } > - } else { > - DEBUG ((DEBUG_ERROR, "%a: Failed to parse FDT memory node\n", > - __FUNCTION__)); > - } > + NumMemNodes = GetMemNodeCount(); > + for(Index = 0; Index < NumMemNodes; Index++){ > + GetMemInfo(Index, &MemInfo); > + CurBase = MemInfo.AddressBase; > + CurSize = MemInfo.AddressSize; > + > + if (NewBase > CurBase || NewBase == 0) { > + NewBase = CurBase; > + NewSize = CurSize; > } > } > > -- > 2.34.1 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#117177): https://edk2.groups.io/g/devel/message/117177 Mute This Topic: https://groups.io/mt/105177615/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-