On Tue, Jul 09, 2024 at 12:47:06 +0200, Marcin Juszkiewicz wrote:
> Provide functions to check for CPU topology information:
>  - the number of sockets on sbsa-ref platform.
>  - the number of clusters in one socket.
>  - the number of cores in one cluster.
>  - the number of threads in one core.
> 
> As SMC calls can return up to 4 return values, the number of sockets,
> clusters and cores are read from TF-A using platform specific SMC call.
> Number of threads is caluculated using the cpu count and the number of
> sockets, clusters and cores.
> 
> Signed-off-by: Xiong Yining <xiongyining1...@phytium.com.cn>
> Signed-off-by: Marcin Juszkiewicz <marcin.juszkiew...@linaro.org>
> ---
>  .../SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h  |  1 +
>  .../Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h  | 26 ++++++++++++++
>  .../SbsaQemuHardwareInfoLib.c                        | 36 
> ++++++++++++++++++++
>  3 files changed, 63 insertions(+)
> 
> diff --git a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h 
> b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h
> index af6b120561ad..b57573735ace 100644
> --- a/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h
> +++ b/Silicon/Qemu/SbsaQemu/Include/IndustryStandard/SbsaQemuSmc.h
> @@ -16,6 +16,7 @@
>  #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_CPU_TOPOLOGY       SMC_SIP_FUNCTION_ID(202)
>  #define SIP_SVC_GET_MEMORY_NODE_COUNT  SMC_SIP_FUNCTION_ID(300)
>  #define SIP_SVC_GET_MEMORY_NODE        SMC_SIP_FUNCTION_ID(301)
>  
> diff --git a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h 
> b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> index e5076274fa0a..cef6f6f58194 100644
> --- a/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> +++ b/Silicon/Qemu/SbsaQemu/Include/Library/HardwareInfoLib.h
> @@ -15,6 +15,19 @@ typedef struct {
>    UINT64    AddressSize;
>  } MemoryInfo;
>  
> +/**
> +  Sockets: the number of sockets on sbsa-ref platform.
> +  Clusters: the number of clusters in one socket.
> +  Cores: the number of cores in one cluster.
> +  Threads: the number of threads in one core.
> +**/
> +typedef struct {
> +  UINT32    Sockets;
> +  UINT32    Clusters;
> +  UINT32    Cores;
> +  UINT32    Threads;
> +} CpuTopology;
> +
>  /**
>    Get CPU count from information passed by Qemu.
>  
> @@ -83,4 +96,17 @@ GetNumaNodeCount (
>    VOID
>    );
>  
> +/**
> +  Get cpu topology(sockets, clusters, cores, threads) from device tree 
> passed by Qemu.

We don't need to talk about qemu internals that will change in the
future. "Get cpu topology ... from Qemu.)

Other than that:
Reviewed-by: Leif Lindholm <quic_llind...@quicinc.com>

/
    Leif

> +
> +  @param [out]  CpuTopo     A pointer to the cpu topology.
> +
> +
> +  @retval                   the information of cpu topology.
> +**/
> +VOID
> +GetCpuTopology (
> +  OUT CpuTopology  *CpuTopo
> +  );
> +
>  #endif /* HARDWARE_INFO_LIB */
> diff --git 
> a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
>  
> b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> index 596a3453c70f..b17a2ae99b4e 100644
> --- 
> a/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> +++ 
> b/Silicon/Qemu/SbsaQemu/Library/SbsaQemuHardwareInfoLib/SbsaQemuHardwareInfoLib.c
> @@ -181,3 +181,39 @@ GetNumaNodeCount (
>  
>    return NumberNumaNodes;
>  }
> +
> +/**
> +  Get CPU topology.
> +**/
> +VOID
> +GetCpuTopology (
> +  OUT CpuTopology  *CpuTopo
> +  )
> +{
> +  UINTN   SmcResult;
> +  UINTN   Arg0;
> +  UINTN   Arg1;
> +  UINTN   Arg2;
> +  UINT32  NumCores = GetCpuCount ();
> +
> +  SmcResult = ArmCallSmc0 (SIP_SVC_GET_CPU_TOPOLOGY, &Arg0, &Arg1, &Arg2);
> +  if (SmcResult != SMC_SIP_CALL_SUCCESS) {
> +    DEBUG ((DEBUG_ERROR, "%a: SIP_SVC_GET_CPU_TOPOLOGY call failed. We have 
> no cpu topology information.\n", __FUNCTION__));
> +    ResetShutdown ();
> +  } else {
> +    CpuTopo->Sockets  = Arg0;
> +    CpuTopo->Clusters = Arg1;
> +    CpuTopo->Cores    = Arg2;
> +    CpuTopo->Threads  = NumCores / (CpuTopo->Sockets * CpuTopo->Clusters * 
> CpuTopo->Cores);
> +  }
> +
> +  DEBUG ((
> +    DEBUG_INFO,
> +    "%a: CPU Topology: sockets are %d, clusters are %d, cores are %d, 
> threads are %d\n",
> +    __FUNCTION__,
> +    CpuTopo->Sockets,
> +    CpuTopo->Clusters,
> +    CpuTopo->Cores,
> +    CpuTopo->Threads
> +    ));
> +}
> 
> -- 
> 2.45.2
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119836): https://edk2.groups.io/g/devel/message/119836
Mute This Topic: https://groups.io/mt/107120143/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to