This was the simplest approach that I had to solve this issue, but not sure if 
it would be better to do something smarter. A couple other ideas I had where:
- Specify the affinity level that CPUs use and use the levels above that for 
the containers.
- Have a new object that has the container levels and affinity mapping. This 
wouldn't support unbalanced layouts.
- I can't think of a good way to auto detect the cpu level affinity level but 
that would be nice. 

-Jeff


> -----Original Message-----
> From: Jeff Brasen <jbra...@nvidia.com>
> Sent: Monday, November 7, 2022 8:57 AM
> To: devel@edk2.groups.io
> Cc: sami.muja...@arm.com; alexei.fedo...@arm.com;
> pierre.gond...@arm.com; quic_llind...@quicinc.com;
> ardb+tianoc...@kernel.org; Jeff Brasen <jbra...@nvidia.com>
> Subject: [PATCH] DynamicTablesPkg: Allow for specified CPU names
> 
> Allow object to specify the name of processor and processor container
> 
> nodes and the UID of processor containers.
> 
> 
> 
> This allows these to be more accurately referenced from other tables.
> 
> For example for the _PSL method or the UID in the APMT table.
> 
> 
> 
> The UID and Name for processor container may be different as if the
> 
> intention is to set names as the corresponding affinity level the UID
> 
> may need to be different if there are multiple levels of containers.
> 
> 
> 
> Signed-off-by: Jeff Brasen <jbra...@nvidia.com>
> 
> ---
> 
>  .../Include/ArmNameSpaceObjects.h             | 11 +++++
> 
>  .../SsdtCpuTopologyGenerator.c                | 40 ++++++++++++++-----
> 
>  .../ConfigurationManagerObjectParser.c        |  3 ++
> 
>  3 files changed, 43 insertions(+), 11 deletions(-)
> 
> 
> 
> diff --git a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
> b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
> 
> index 6aafd41a2e..19098609de 100644
> 
> --- a/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
> 
> +++ b/DynamicTablesPkg/Include/ArmNameSpaceObjects.h
> 
> @@ -768,6 +768,17 @@ typedef struct CmArmProcHierarchyInfo {
> 
>    /// Token identifying a CM_ARM_OBJ_REF structure, itself referencing
> 
>    /// CM_ARM_LPI_INFO objects.
> 
>    CM_OBJECT_TOKEN    LpiToken;
> 
> +  /// Set to TRUE if UID should override index for name and _UID
> 
> +  /// for processor container nodes and name of processors.
> 
> +  /// This should be consistently set for containers or processors to avoid
> 
> +  /// duplicate values
> 
> +  BOOLEAN            OverrideNameUidEnabled;
> 
> +  /// If OverrideNameUidEnabled is TRUE then this value will be used for
> name of
> 
> +  /// processors and processor containers.
> 
> +  UINT16             OverrideName;
> 
> +  /// If OverrideNameUidEnabled is TRUE then this value will be used for
> 
> +  /// the UID of processor containers.
> 
> +  UINT32             OverrideUid;
> 
>  } CM_ARM_PROC_HIERARCHY_INFO;
> 
> 
> 
>  /** A structure that describes the Cache Type Structure (Type 1) in PPTT
> 
> diff --git
> a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCp
> uTopologyGenerator.c
> b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCp
> uTopologyGenerator.c
> 
> index d06c7615fb..92fa904103 100644
> 
> ---
> a/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCp
> uTopologyGenerator.c
> 
> +++
> b/DynamicTablesPkg/Library/Acpi/Arm/AcpiSsdtCpuTopologyLibArm/SsdtCp
> uTopologyGenerator.c
> 
> @@ -553,7 +553,7 @@ GenerateLpiStates (
> 
>    @param [in]  Generator    The SSDT Cpu Topology generator.
> 
>    @param [in]  ParentNode   Parent node to attach the Cpu node to.
> 
>    @param [in]  GicCInfo     CM_ARM_GICC_INFO object used to create the
> node.
> 
> -  @param [in]  CpuIndex     Index used to generate the node name.
> 
> +  @param [in]  CpuName      Value used to generate the node name.
> 
>    @param [out] CpuNodePtr   If not NULL, return the created Cpu node.
> 
> 
> 
>    @retval EFI_SUCCESS             Success.
> 
> @@ -567,7 +567,7 @@ CreateAmlCpu (
> 
>    IN   ACPI_CPU_TOPOLOGY_GENERATOR  *Generator,
> 
>    IN   AML_NODE_HANDLE              ParentNode,
> 
>    IN   CM_ARM_GICC_INFO             *GicCInfo,
> 
> -  IN   UINT32                       CpuIndex,
> 
> +  IN   UINT32                       CpuName,
> 
>    OUT  AML_OBJECT_NODE_HANDLE       *CpuNodePtr OPTIONAL
> 
>    )
> 
>  {
> 
> @@ -579,7 +579,7 @@ CreateAmlCpu (
> 
>    ASSERT (ParentNode != NULL);
> 
>    ASSERT (GicCInfo != NULL);
> 
> 
> 
> -  Status = WriteAslName ('C', CpuIndex, AslName);
> 
> +  Status = WriteAslName ('C', CpuName, AslName);
> 
>    if (EFI_ERROR (Status)) {
> 
>      ASSERT (0);
> 
>      return Status;
> 
> @@ -628,7 +628,7 @@ CreateAmlCpu (
> 
>    @param [in]  CfgMgrProtocol         Pointer to the Configuration Manager
> 
>                                        Protocol Interface.
> 
>    @param [in]  ParentNode             Parent node to attach the Cpu node to.
> 
> -  @param [in]  CpuIndex               Index used to generate the node name.
> 
> +  @param [in]  CpuName                Value used to generate the node name.
> 
>    @param [in]  ProcHierarchyNodeInfo  CM_ARM_PROC_HIERARCHY_INFO
> describing
> 
>                                        the Cpu.
> 
> 
> 
> @@ -643,7 +643,7 @@ CreateAmlCpuFromProcHierarchy (
> 
>    IN        ACPI_CPU_TOPOLOGY_GENERATOR                   *Generator,
> 
>    IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST
> CfgMgrProtocol,
> 
>    IN        AML_NODE_HANDLE                               ParentNode,
> 
> -  IN        UINT32                                        CpuIndex,
> 
> +  IN        UINT32                                        CpuName,
> 
>    IN        CM_ARM_PROC_HIERARCHY_INFO
> *ProcHierarchyNodeInfo
> 
>    )
> 
>  {
> 
> @@ -668,7 +668,7 @@ CreateAmlCpuFromProcHierarchy (
> 
>      return Status;
> 
>    }
> 
> 
> 
> -  Status = CreateAmlCpu (Generator, ParentNode, GicCInfo, CpuIndex,
> &CpuNode);
> 
> +  Status = CreateAmlCpu (Generator, ParentNode, GicCInfo, CpuName,
> &CpuNode);
> 
>    if (EFI_ERROR (Status)) {
> 
>      ASSERT (0);
> 
>      return Status;
> 
> @@ -735,7 +735,8 @@ CreateAmlProcessorContainer (
> 
>    IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL  *CONST
> CfgMgrProtocol,
> 
>    IN        AML_NODE_HANDLE                               ParentNode,
> 
>    IN        CM_ARM_PROC_HIERARCHY_INFO
> *ProcHierarchyNodeInfo,
> 
> -  IN        UINT32                                        ProcContainerIndex,
> 
> +  IN        UINT16                                        ProcContainerName,
> 
> +  IN        UINT32                                        ProcContainerUid,
> 
>    OUT       AML_OBJECT_NODE_HANDLE                        
> *ProcContainerNodePtr
> 
>    )
> 
>  {
> 
> @@ -749,7 +750,7 @@ CreateAmlProcessorContainer (
> 
>    ASSERT (ProcHierarchyNodeInfo != NULL);
> 
>    ASSERT (ProcContainerNodePtr != NULL);
> 
> 
> 
> -  Status = WriteAslName ('C', ProcContainerIndex, AslNameProcContainer);
> 
> +  Status = WriteAslName ('C', ProcContainerName, AslNameProcContainer);
> 
>    if (EFI_ERROR (Status)) {
> 
>      ASSERT (0);
> 
>      return Status;
> 
> @@ -765,7 +766,7 @@ CreateAmlProcessorContainer (
> 
>    // and EFI_ACPI_6_3_PPTT_PROCESSOR_ID_INVALID is set for non-Cpus.
> 
>    Status = AmlCodeGenNameInteger (
> 
>               "_UID",
> 
> -             ProcContainerIndex,
> 
> +             ProcContainerUid,
> 
>               ProcContainerNode,
> 
>               NULL
> 
>               );
> 
> @@ -838,6 +839,8 @@ CreateAmlCpuTopologyTree (
> 
>    UINT32                  Index;
> 
>    UINT32                  CpuIndex;
> 
>    AML_OBJECT_NODE_HANDLE  ProcContainerNode;
> 
> +  UINT32                  Uid;
> 
> +  UINT16                  Name;
> 
> 
> 
>    ASSERT (Generator != NULL);
> 
>    ASSERT (Generator->ProcNodeList != NULL);
> 
> @@ -868,11 +871,17 @@ CreateAmlCpuTopologyTree (
> 
>            return EFI_INVALID_PARAMETER;
> 
>          }
> 
> 
> 
> +        if (Generator->ProcNodeList[Index].OverrideNameUidEnabled) {
> 
> +          Name = Generator->ProcNodeList[Index].OverrideName;
> 
> +        } else {
> 
> +          Name = CpuIndex;
> 
> +        }
> 
> +
> 
>          Status = CreateAmlCpuFromProcHierarchy (
> 
>                     Generator,
> 
>                     CfgMgrProtocol,
> 
>                     ParentNode,
> 
> -                   CpuIndex,
> 
> +                   Name,
> 
>                     &Generator->ProcNodeList[Index]
> 
>                     );
> 
>          if (EFI_ERROR (Status)) {
> 
> @@ -897,12 +906,21 @@ CreateAmlCpuTopologyTree (
> 
>            return EFI_INVALID_PARAMETER;
> 
>          }
> 
> 
> 
> +        if (Generator->ProcNodeList[Index].OverrideNameUidEnabled) {
> 
> +          Name = Generator->ProcNodeList[Index].OverrideName;
> 
> +          Uid  = Generator->ProcNodeList[Index].OverrideUid;
> 
> +        } else {
> 
> +          Name = *ProcContainerIndex;
> 
> +          Uid  = *ProcContainerIndex;
> 
> +        }
> 
> +
> 
>          Status = CreateAmlProcessorContainer (
> 
>                     Generator,
> 
>                     CfgMgrProtocol,
> 
>                     ParentNode,
> 
>                     &Generator->ProcNodeList[Index],
> 
> -                   *ProcContainerIndex,
> 
> +                   Name,
> 
> +                   Uid,
> 
>                     &ProcContainerNode
> 
>                     );
> 
>          if (EFI_ERROR (Status)) {
> 
> diff --git
> a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManag
> erObjectParser.c
> b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManag
> erObjectParser.c
> 
> index 5a01ed0fb8..5e4b88e8cc 100644
> 
> ---
> a/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManag
> erObjectParser.c
> 
> +++
> b/DynamicTablesPkg/Library/Common/TableHelperLib/ConfigurationManag
> erObjectParser.c
> 
> @@ -305,6 +305,9 @@ STATIC CONST CM_OBJ_PARSER
> CmArmProcHierarchyInfoParser[] = {
> 
>    { "NoOfPrivateResources",       4,                        "0x%x", NULL },
> 
>    { "PrivateResourcesArrayToken", sizeof (CM_OBJECT_TOKEN), "0x%p",
> NULL },
> 
>    { "LpiToken",                   sizeof (CM_OBJECT_TOKEN), "0x%p", NULL },
> 
> +  { "OverrideNameUidEnabled",     1,                        "%d",   NULL },
> 
> +  { "OverrideName",               2,                        "0x%x", NULL },
> 
> +  { "OverrideUid",                4,                        "0x%x", NULL }
> 
>  };
> 
> 
> 
>  /** A parser for EArmObjCacheInfo.
> 
> --
> 
> 2.25.1
> 
> 



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


Reply via email to