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 ADC9C740048 for ; Thu, 14 Mar 2024 15:18:20 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=dXWdkndBD4zrKVWPOl3VZRfZMEIwYi5xCYD3q7fq4cs=; c=relaxed/simple; d=groups.io; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: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; s=20240206; t=1710429499; v=1; b=HHtnY8WiefP05aiW5wvZ7J4bMmqoq0WTqk9j5GBqp1uchx5XqifFwEJoAwXexjfnQK6Z/VxU kQC3BvIL/kpZxjS74etCN2DHG+gh0JH7Ou7DyRvbglMzyJuRfamKbNQJnfEKg1Pht24RTtz3QfG j4V3vS9y3MPE8PEllL7mPEdIWXrh4Qf3/zUL4843xdpKTzsGBOksfxKjqkoFqetBCV+Njlcrifj tw5vFPDJNexPXKUTW2qv+STrXF3StWCFrZFWMJG/aHDbr9kEf1PG+yWxGgbDt6GLPMTVDj7dkPv jv0R33apfPBCW1UPWoLxSaN0eGU7Iv0Z0azmbXQAiTM1g== X-Received: by 127.0.0.2 with SMTP id 9JaZYY7687511x2aHqwYYqYp; Thu, 14 Mar 2024 08:18:19 -0700 X-Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by mx.groups.io with SMTP id smtpd.web10.15502.1710429498215684018 for ; Thu, 14 Mar 2024 08:18:18 -0700 X-Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 019DFCE1BBE for ; Thu, 14 Mar 2024 15:18:16 +0000 (UTC) X-Received: by smtp.kernel.org (Postfix) with ESMTPSA id 3E5D8C43399 for ; Thu, 14 Mar 2024 15:18:15 +0000 (UTC) X-Received: by mail-lj1-f174.google.com with SMTP id 38308e7fff4ca-2d2991e8c12so12136201fa.0 for ; Thu, 14 Mar 2024 08:18:15 -0700 (PDT) X-Gm-Message-State: 1TOLUHYWiLQ3OErHmWpCUmBux7686176AA= X-Google-Smtp-Source: AGHT+IEr1ql5OlsbASzvLQv+FkR8ixYubkpRE9Acjwkcc1p9bRgh8C9WMp5t8ArLS3GsLY+17FFFacU4HwTcH1++1Wg= X-Received: by 2002:a2e:8844:0:b0:2d4:6d2a:2df7 with SMTP id z4-20020a2e8844000000b002d46d2a2df7mr866151ljj.18.1710429493553; Thu, 14 Mar 2024 08:18:13 -0700 (PDT) MIME-Version: 1.0 References: <20240306-no-dt-for-cpu-v6-0-acd8727a1b59@linaro.org> <20240306-no-dt-for-cpu-v6-6-acd8727a1b59@linaro.org> In-Reply-To: <20240306-no-dt-for-cpu-v6-6-acd8727a1b59@linaro.org> From: "Ard Biesheuvel" Date: Thu, 14 Mar 2024 16:18:02 +0100 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [edk2-devel] [PATCH edk2-platforms v6 6/7] Platform/SbsaQemu: get the information of memory via SMC calls To: Marcin Juszkiewicz Cc: devel@edk2.groups.io, Leif Lindholm , Ard Biesheuvel , Graeme Gregory , Xiong Yining , Chen Baozi 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: Thu, 14 Mar 2024 08:18:18 -0700 Reply-To: devel@edk2.groups.io,ardb@kernel.org List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: Content-Type: text/plain; charset="UTF-8" X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20240206 header.b=HHtnY8Wi; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=kernel.org (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 On Wed, 6 Mar 2024 at 12:42, Marcin Juszkiewicz wrote: > > 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 > --- > .../SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf | 2 +- > .../SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h | 2 + > .../Include/Library/SbsaQemuHardwareInfoLib.h | 28 ++++++++++ > .../SbsaQemuHardwareInfoLib.c | 47 +++++++++++++++++ > .../Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c | 54 +++++--------------- > 5 files changed, 91 insertions(+), 42 deletions(-) > > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf > index c067a80cc715..fb856efe4c27 100644 > --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf > +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuLib.inf > @@ -32,9 +32,9 @@ [LibraryClasses] > ArmLib > BaseMemoryLib > DebugLib > - FdtLib > MemoryAllocationLib > PcdLib > + SbsaQemuHardwareInfoLib > > [Pcd] > gArmTokenSpaceGuid.PcdSystemMemoryBase > diff --git a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h > index d9faee7fa5b2..e7bf54978d4e 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/SbsaQemuHardwareInfoLib.h b/Silicon/Qemu/SbsaQemu/Include/Library/SbsaQemuHardwareInfoLib.h > index ca52c6b27093..0b71a3f7e6eb 100644 > --- a/Silicon/Qemu/SbsaQemu/Include/Library/SbsaQemuHardwareInfoLib.h > +++ b/Silicon/Qemu/SbsaQemu/Include/Library/SbsaQemuHardwareInfoLib.h > @@ -9,6 +9,12 @@ > #ifndef SBSA_QEMU_HARDWARE_INFO_ > #define SBSA_QEMU_HARDWARE_INFO_ > > +typedef struct{ > + UINT32 NodeId; > + UINT64 AddressBase; > + UINT64 AddressSize; > +} MemoryInfo; > + > /** > Get CPU count from information passed by Qemu. > > @@ -42,4 +48,26 @@ SbsaQemuGetCpuNumaNode ( > IN UINTN CpuId > ); > > +/** > + Get the number of memory node from device tree passed by Qemu. > + > + @retval the number of memory nodes. > +**/ > +UINT32 > +SbsaQemuGetMemNodeCount ( > + VOID > + ); > + > +/** > + Get memory infomation(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. > + > + @retval memory infomation for given memory node. > +**/ > +MemoryInfo Let's avoid aggregates as return types. Pass/return by reference instead using an OUT pointer. > +SbsaQemuGetMemInfo ( > + IN UINTN MemoryId > + ); > + > #endif /* SBSA_QEMU_HARDWARE_INFO_ */ > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > index e1f1a9588b19..88b50e46c072 100644 > --- a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > +++ b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c > @@ -201,3 +201,50 @@ SbsaQemuGetCpuNumaNode ( > > return Arg0; > } > + > +UINT32 > +SbsaQemuGetMemNodeCount ( > + 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, "SIP_SVC_GET_MEMORY_NODE_COUNT call failed.\n")); > + } > + > + DEBUG(( DEBUG_INFO, "The number of the memory nodes is %ld\n", Arg0)); > + return (UINT32)Arg0; > +} > + > +MemoryInfo > +SbsaQemuGetMemInfo ( > + IN UINTN MemoryId > + ) > +{ > + UINTN SmcResult; > + UINTN Arg0; > + UINTN Arg1; > + UINTN Arg2; > + MemoryInfo MemInfo; > + > + Arg0 = MemoryId; > + > + SmcResult = ArmCallSmc1 (SIP_SVC_GET_MEMORY_NODE, &Arg0, &Arg1, &Arg2); > + if (SmcResult != SMC_SIP_CALL_SUCCESS) { > + DEBUG ((DEBUG_ERROR, "SIP_SVC_GET_MEMORY_NODE call failed.\n")); > + } else { > + MemInfo.NodeId = Arg0; > + MemInfo.AddressBase = Arg1; > + MemInfo.AddressSize = Arg2; > + } > + > + DEBUG(( DEBUG_INFO, "NUMA node for System RAM:%d = 0x%lx - 0x%lx\n", > + MemInfo.NodeId, > + MemInfo.AddressBase, > + MemInfo.AddressBase + MemInfo.AddressSize -1 )); > + > + return MemInfo; > +} > diff --git a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuLib/SbsaQemuMem.c > index 8c2eb0b6a028..5a418a461174 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 = SbsaQemuGetMemNodeCount(); > + for(Index = 0; Index < NumMemNodes; Index++){ > + MemInfo = SbsaQemuGetMemInfo(Index); > + CurBase = MemInfo.AddressBase; > + CurSize = MemInfo.AddressSize; > + > + if (NewBase > CurBase || NewBase == 0) { > + NewBase = CurBase; > + NewSize = CurSize; > } > } > > > -- > 2.44.0 > -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#116770): https://edk2.groups.io/g/devel/message/116770 Mute This Topic: https://groups.io/mt/104763768/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-