Hi Sami,
Please find my reply inline

On Thu, Jul 21, 2022 at 12:47 PM, Sami Mujawar wrote:

> 
> 
> 
> Hi Nishant,
> 
> 
> 
> Please find my response inline marked [SAMI].
> 
> 
> 
> Regards,
> 
> 
> 
> Sami Mujawar
> 
> On 17/06/2022 07:07 am, Nishant Sharma wrote:
> 
>> Isolated CPUs are those that are not to be used on the platform for
>> various reasons. The isolated CPU list is an array of MPID values of
> 
> [SAMI] Can you explain the use-case/reason, please?

[Nishant]: I will update in the next patchset.

> 
> 
>> the CPUs that have to be isolated. This list is supplied via the
>> NT_FW_CONFIG dtb.
>> 
>> Add support to search for isolated CPUs MPID list and,
>> if present,
>> update the MADT table to disable the corresponding CPUs.
>> 
>> Signed-off-by: Nishant Sharma <nishant.sha...@arm.com> (
>> nishant.sha...@arm.com )
>> ---
>> 
>> Platform/ARM/SgiPkg/AcpiTables/RdN2Cfg1AcpiTables.inf         |   1 -
>> 
>> Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPei.inf |   8 +-
>> 
>> Platform/ARM/SgiPkg/Include/SgiPlatform.h                     |   7 ++
>> 
>> Platform/ARM/SgiPkg/Drivers/PlatformDxe/PlatformDxe.c         | 131
>> +++++++++++++++++++-
>> 
>> Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPeim.c  |  45
>> ++++++-
>>  5 files changed, 186 insertions(+), 6 deletions(-)
>> 
>> diff --git
>> a/Platform/ARM/SgiPkg/AcpiTables/RdN2Cfg1AcpiTables.inf
>> b/Platform/ARM/SgiPkg/AcpiTables/RdN2Cfg1AcpiTables.inf
>> index
>> 4b36c3e5ceb2..e13c2f08ce6e 100644
>> ---
>> a/Platform/ARM/SgiPkg/AcpiTables/RdN2Cfg1AcpiTables.inf
>> +++
>> b/Platform/ARM/SgiPkg/AcpiTables/RdN2Cfg1AcpiTables.inf
>> @@ -18,7 +18,6 @@
>> 
>> Dbg2.aslc
>> 
>>    Fadt.aslc
>> 
>>    Gtdt.aslc
>> 
>> -  Iort.aslc
> 
> [SAMI] Why is IORT table being removed here?

[Nishant]: I think some issue with patch generation. I will remove this change 
in the next patch. Thanks for pointing it out.

> 
> 
>>    Mcfg.aslc
>> 
>>    RdN2Cfg1/Dsdt.asl
>> 
>>    RdN2Cfg1/Madt.aslc
>> 
>> diff --git
>> a/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPei.inf
>> b/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPei.inf
>> index
>> 407160c07563..fbf061ad3bdb 100644
>> ---
>> a/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPei.inf
>> +++
>> b/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPei.inf
>> @@ -1,5
>> +1,5 @@
>>  #
>> 
>> -#  Copyright (c) 2018, ARM Limited. All rights reserved.
>> 
>> +# 
>> Copyright (c) 2018-2022, ARM Limited. All rights reserved.
>> 
>>  #
>> 
>>  # 
>> SPDX-License-Identifier: BSD-2-Clause-Patent
>> 
>>  #
>> 
>> @@ -13,6 +13,7 @@
>>   
>> ENTRY_POINT                    = SgiPlatformPeim
>> 
>>  
>> 
>>  [Packages]
>> 
>> + 
>> ArmPlatformPkg/ArmPlatformPkg.dec
>> 
>>    EmbeddedPkg/EmbeddedPkg.dec
>> 
>>   
>> MdePkg/MdePkg.dec
>> 
>>    Platform/ARM/SgiPkg/SgiPlatform.dec
>> 
>> @@ -21,6 +22,11
>> @@
>>    FdtLib
>> 
>>    PeimEntryPoint
>> 
>>  
>> 
>> +[FixedPcd]
>> 
>> + 
>> gArmSgiTokenSpaceGuid.PcdChipCount
>> 
>> + 
>> gArmPlatformTokenSpaceGuid.PcdCoreCount
>> 
>> + 
>> gArmPlatformTokenSpaceGuid.PcdClusterCount
>> 
>> +
>> 
>>  [Sources]
>> 
>>   
>> SgiPlatformPeim.c
>> 
>>  
>> 
>> diff --git
>> a/Platform/ARM/SgiPkg/Include/SgiPlatform.h
>> b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
>> index
>> dddb58832d73..311286ce5337 100644
>> ---
>> a/Platform/ARM/SgiPkg/Include/SgiPlatform.h
>> +++
>> b/Platform/ARM/SgiPkg/Include/SgiPlatform.h
>> @@ -65,11 +65,18 @@
>>  #define
>> DRAM_BLOCK2_BASE_REMOTE(ChipId) \
>> 
>>            (SGI_REMOTE_CHIP_MEM_OFFSET
>> (ChipId) + FixedPcdGet64 (PcdDramBlock2Base))
>> 
>>  
>> 
>> +// List of isolated
>> CPUs MPID
>> 
>> +typedef struct {
>> 
>> +  UINT64  Count;                // Number
>> of elements present in the list
>> 
>> +  UINT64  Mpid[];               // List
>> containing isolated CPU MPIDs
>> 
>> +} SGI_ISOLATED_CPU_LIST;
>> 
>> +
>> 
>>  // ARM
>> platform description data.
>> 
>>  typedef struct {
>> 
>>    UINTN  PlatformId;
>> 
>>   
>> UINTN  ConfigId;
>> 
>>    UINTN  MultiChipMode;
>> 
>> +  SGI_ISOLATED_CPU_LIST 
>> IsolatedCpuList;
>> 
>>  } SGI_PLATFORM_DESCRIPTOR;
>> 
>>  
>> 
>>  // Arm SGI/RD Product
>> IDs
>> 
>> diff --git a/Platform/ARM/SgiPkg/Drivers/PlatformDxe/PlatformDxe.c
>> b/Platform/ARM/SgiPkg/Drivers/PlatformDxe/PlatformDxe.c
>> index
>> 2f72e7152ff3..80190120ff32 100644
>> ---
>> a/Platform/ARM/SgiPkg/Drivers/PlatformDxe/PlatformDxe.c
>> +++
>> b/Platform/ARM/SgiPkg/Drivers/PlatformDxe/PlatformDxe.c
>> @@ -1,14 +1,17 @@
>> 
>> /** @file
>> 
>>  *
>> 
>> -*  Copyright (c) 2018, ARM Limited. All rights reserved.
>> 
>> +*  Copyright (c) 2018 - 2022, ARM Limited. All rights reserved.
>> 
>>  *
>> 
>>  * 
>> SPDX-License-Identifier: BSD-2-Clause-Patent
>> 
>>  *
>> 
>>  **/
>> 
>>  
>> 
>> +#include
>> <IndustryStandard/Acpi.h>
>> 
>> +
>> 
>>  #include <Library/AcpiLib.h>
>> 
>>  #include
>> <Library/DebugLib.h>
>> 
>>  #include <Library/HobLib.h>
>> 
>> +#include
>> <Library/UefiBootServicesTableLib.h>
>> 
>>  #include <SgiPlatform.h>
>> 
>>  
>> 
>>  VOID
>> 
>> @@ -16,6 +19,127 @@ InitVirtioDevices (
>>    VOID
>> 
>>    );
>> 
>>  
>> 
>> +/**
>> 
>> +  Search
>> for a MPID in a list
>> 
>> +
>> 
>> +  Performs a linear search for a specified MPID
>> on the given linear
>> 
>> +  list of MPIDs.
>> 
>> +
>> 
>> +  @param[in]  MpidList 
>> Pointer to list.
>> 
>> +  @param[in]  Count     Number of the elements in the
>> list.
>> 
>> +  @param[in]  Mpid      Target MPID.
>> 
>> +
>> 
>> +  @retval TRUE   MPID is
>> present.
>> 
>> +  @retval FALSE  MPID is not present.
>> 
>> +**/
>> 
>> +STATIC
>> 
>> +BOOLEAN
>> 
>> +CheckIfMpidIsPresent (
>> 
>> +  IN UINT64  *MpidList,
>> 
>> +  IN UINT64  Count,
>> 
>> +
>> IN UINT64  Mpid
>> 
>> +  )
>> 
>> +{
>> 
>> +  UINT64 Idx;
>> 
>> +
>> 
>> +  for (Idx = 0; Idx <
>> Count; Idx++) {
>> 
>> +    if (MpidList[Idx] == Mpid) {
>> 
>> +      return TRUE;
>> 
>> +
>> }
>> 
>> +  }
>> 
>> +
>> 
>> +  return FALSE;
>> 
>> +}
>> 
>> +
>> 
>> +/**
>> 
>> +  Disables isolated CPUs in
>> the MADT table
>> 
>> +
>> 
>> +  Parse the IsolatedCpuInfo from the Hob list and
>> updates the MADT table to
> 
> [SAMI] Nit.  updates -> update

[Nishant] Will update in next patch version.

> 
> 
>> +  disable cpu's which are not available on the platfrom.
>> 
>> +
>> 
>> + 
>> @param[in] AcpiHeader  Points to the Madt table.
>> 
>> +  @param[in] HobData   
>> Points to the unusable cpuinfo in hoblist.
>> 
>> +**/
>> 
>> +STATIC
>> 
>> +VOID
>> 
>> +UpdateMadtTable (
>> 
>> +  IN EFI_ACPI_DESCRIPTION_HEADER  *AcpiHeader,
>> 
>> +  IN
>> SGI_PLATFORM_DESCRIPTOR      *HobData
>> 
>> +  )
>> 
>> +{
>> 
>> +  UINT8
>> *StructureListHead;
>> 
>> +  UINT8 *StructureListTail;
>> 
>> + 
>> EFI_ACPI_6_4_GIC_STRUCTURE *GicStructure;
>> 
>> +  BOOLEAN MpidPresent;
>> 
>> +
>> 
>> + 
>> if (HobData->IsolatedCpuList.Count == 0) {
>> 
>> +    return;
>> 
>> +  }
>> 
>> +
>> 
>> + 
>> StructureListHead =
>> 
>> +    ((UINT8 *)AcpiHeader) +
>> 
>> +   
>> sizeof(EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER);
>> 
>> + 
>> StructureListTail = (UINT8 *)AcpiHeader + AcpiHeader->Length;
>> 
>> +
>> 
>> +  //
>> Locate ACPI GICC structure in the MADT table.
>> 
>> +  while (StructureListHead
>> < StructureListTail) {
>> 
>> +    if (StructureListHead[0] == EFI_ACPI_6_4_GIC)
>> {
> 
> 
> 
> [SAMI] This is definitely not the way to parse an ACPI table. Please dont
> do this.
> 
> 
> 
> Also, why are you not using DynamicTables framework? It is designed to
> handle such cases.
> 
> 
> 
> [/SAMI]
> 
> 

[Nishant]
Could you please add more details on what is wrong with this approach?
Please point me to the documentation or code that has a standardised way of 
updating the ACPI table.

Regarding the use of the Dynamic Table Framework, there are no short-term plans 
to migrate to it.
For the use of dynamic table
[/Nishant]

> 
> 
>> +      GicStructure = (EFI_ACPI_6_4_GIC_STRUCTURE *)StructureListHead;
>> 
>> + 
>> // Disable the CPU if its MPID is present in the list.
>> 
>> +      MpidPresent
>> = CheckIfMpidIsPresent(
>> 
>> +        HobData->IsolatedCpuList.Mpid,
>> 
>> +       
>> HobData->IsolatedCpuList.Count,
>> 
>> +        GicStructure->MPIDR
>> 
>> +        );
>> +      if (MpidPresent == TRUE) {
>> 
>> +        DEBUG ((
>> 
>> +         
>> DEBUG_INFO,
>> 
>> +          "Disabling Core: %lu, MPID: 0x%llx in MADT\n",
>> 
>> + 
>> GicStructure->AcpiProcessorUid,
>> 
>> +          GicStructure->MPIDR
>> 
>> +        
>> ));
>> 
>> +        GicStructure->Flags = 0;
>> 
>> +      }
>> 
>> +    }
>> 
>> +
>> 
>> +    //
>> Second element in the structure component header is length
>> 
>> +   
>> StructureListHead += StructureListHead[1];
>> 
>> +  }
>> 
>> +}
>> 
>> +
>> 
>> +/**
>> 
>> +  Callback
>> to validate and/or update ACPI table.
>> 
>> +
>> 
>> +  On finding a MADT table,
>> disable the isolated CPUs in the MADT table. The
>> 
>> +  list of isolated CPUs
>> are obtained from the HOB data.
>> 
>> +
>> 
>> +  @param[in] AcpiHeader  Target ACPI
>> table.
>> 
>> +
>> 
>> +  @retval  TURE   Table validated/updated successfully.
>> 
>> + 
>> @retval  FALSE  Error in Table validation/updation.
>> 
>> +**/
>> 
>> +STATIC
>> 
>> +BOOLEAN
>> 
>> +CheckAndUpdateAcpiTable (
>> 
>> +  IN EFI_ACPI_DESCRIPTION_HEADER 
>> *AcpiHeader
>> 
>> +  )
>> 
>> +{
>> 
>> +  VOID *SystemIdHob;
>> 
>> +  SGI_PLATFORM_DESCRIPTOR
>> *HobData;
>> 
>> +
>> 
>> +  // This check updates the MADT table to disable isolated
>> CPUs present on the
>> 
>> +  // platform.
>> 
>> +  if (AcpiHeader->Signature ==
>> EFI_ACPI_1_0_APIC_SIGNATURE) {
> 
> [SAMI] Why EFI_ACPI_6_4_MULTIPLE_APIC_DESCRIPTION_TABLE_SIGNATURE is not
> used here?
> 

[Nishant] I will update in the next version.

> 
> 
>> +    SystemIdHob = GetFirstGuidHob (&gArmSgiPlatformIdDescriptorGuid);
>> 
>> + 
>> if (SystemIdHob != NULL) {
>> 
>> +      HobData = (SGI_PLATFORM_DESCRIPTOR
>> *)GET_GUID_HOB_DATA (SystemIdHob);
>> 
>> +      UpdateMadtTable (AcpiHeader,
>> HobData);
>> 
>> +    }
>> 
>> +  }
>> 
>> +
>> 
>> +  return TRUE;
>> 
>> +}
>> 
>> +
>> 
>>  EFI_STATUS
>> 
>>  EFIAPI
>> 
>> 
>> ArmSgiPkgEntryPoint (
>> 
>> @@ -25,7 +149,10 @@ ArmSgiPkgEntryPoint (
>>  {
>> 
>>   
>> EFI_STATUS              Status;
>> 
>>  
>> 
>> -  Status = LocateAndInstallAcpiFromFv
>> (&gArmSgiAcpiTablesGuid);
>> 
>> +  Status =
>> LocateAndInstallAcpiFromFvConditional (
>> 
>> +            
>> &gArmSgiAcpiTablesGuid,
>> 
>> +             &CheckAndUpdateAcpiTable
>> 
>> +        
>> );
>> 
>>    if (EFI_ERROR (Status)) {
>> 
>>      DEBUG ((DEBUG_ERROR, "%a: Failed to
>> install ACPI tables\n", __FUNCTION__));
>> 
>>      return Status;
>> 
>> diff --git
>> a/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPeim.c
>> b/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPeim.c
>> index
>> 7df52cc4fd7c..f778dc8ac7c1 100644
>> ---
>> a/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPeim.c
>> +++
>> b/Platform/ARM/SgiPkg/Library/SgiPlatformPei/SgiPlatformPeim.c
>> @@ -1,6
>> +1,6 @@
>>  /** @file
>> 
>>  *
>> 
>> -*  Copyright (c) 2018, ARM Limited. All rights
>> reserved.
>> 
>> +*  Copyright (c) 2018-2022, ARM Limited. All rights reserved.
>> 
>> *
>> 
>>  *  SPDX-License-Identifier: BSD-2-Clause-Patent
>> 
>>  *
>> 
>> @@ -38,6 +38,8 @@
>> GetSgiSystemId (
>>    CONST VOID                    *NtFwCfgDtBlob;
>> 
>>   
>> SGI_NT_FW_CONFIG_INFO_PPI     *NtFwConfigInfoPpi;
>> 
>>    EFI_STATUS          
>> Status;
>> 
>> +  UINT64                        IsolatedCpuCount;
>> 
>> +  UINT64    
>> CoreCount;
>> 
>>  
>> 
>>    Status = PeiServicesLocatePpi
>> (&gNtFwConfigDtInfoPpiGuid, 0, NULL,
>> 
>>              
>> (VOID**)&NtFwConfigInfoPpi);
>> 
>> @@ -83,6 +85,32 @@ GetSgiSystemId (
>>     
>> HobData->MultiChipMode = fdt32_to_cpu (*Property);
>> 
>>    }
>> 
>>  
>> 
>> +  Property =
>> fdt_getprop (NtFwCfgDtBlob, Offset, "isolated-cpu-list", NULL);
>> 
>> +  if
>> (Property == NULL) {
>> 
>> +    DEBUG ((DEBUG_INFO, "%s property not found\n",
>> "isolated-cpu-list"));
>> 
>> +    HobData->IsolatedCpuList.Count = 0;
>> 
>> +  }
>> else {
>> 
>> +    CopyMem (&IsolatedCpuCount, Property, sizeof
>> (IsolatedCpuCount));
>> 
>> +    CoreCount =
>> 
>> +      FixedPcdGet32
>> (PcdChipCount) *
>> 
>> +      FixedPcdGet32 (PcdClusterCount) *
>> 
>> +     
>> FixedPcdGet32 (PcdCoreCount);
>> 
>> +    if (IsolatedCpuCount > CoreCount) {
>> 
>> +
>> DEBUG ((
>> 
>> +            DEBUG_ERROR,
>> 
>> +            "IsolatedCpuCount(%u) is
>> higher than CoreCount(%u)\n",
>> 
>> +            IsolatedCpuCount,
>> 
>> +          
>> CoreCount
>> 
>> +            ));
>> 
>> +      return EFI_SUCCESS;
> 
> [SAMI] Is the status code returned here correct? Should this be
> EFI_INVALID_PARAMETER? Also the function name GetSgiSystemId() seems to no
> longer reflect what the function does. Hace you considered renaming it.

[Nishant]
This is done intentionally, we want to keep booting even if the config provided 
is corrupted.

I will update the function name in the next version.
[/Nishant]

> 
> 
>> +    }
>> 
>> +    CopyMem (
>> 
>> +      &HobData->IsolatedCpuList,
>> 
>> +     
>> Property,
>> 
>> +      sizeof(HobData->IsolatedCpuList) + (CoreCount *
>> sizeof(UINT64))
> 
> [SAMI] Coding convention is not followed here and at other places. Can you
> fix, please?

[Nishant] Will update in the next patch version.

> 
> 
>> +      );
>> 
>> +  }
>> 
>> +
>> 
>>    return EFI_SUCCESS;
>> 
>>  }
>> 
>>  
>> 
>> @@ -104,11 +132,24 @@
>> SgiPlatformPeim (
>>  {
>> 
>>    SGI_PLATFORM_DESCRIPTOR       *HobData;
>> 
>>   
>> EFI_STATUS                    Status;
>> 
>> +  UINT64                       
>> CoreCount;
>> 
>> +  UINTN                         HobSize;
>> 
>>  
>> 
>> +  CoreCount =
>> 
>> +    FixedPcdGet32 (PcdChipCount) *
>> 
>> +    FixedPcdGet32 (PcdClusterCount)
>> *
>> 
>> +    FixedPcdGet32 (PcdCoreCount);
>> 
>> +
>> 
>> +  // Additional size for
>> SGI_ISOLATED_CPU_LIST.
>> 
>> +  // Size = (MPID register size in bytes *
>> CoreCount) +
>> 
>> +  //        sizeof(SGI_PLATFORM_DESCRIPTOR)
>> 
>> +  HobSize =
>> 
>> +    sizeof (SGI_PLATFORM_DESCRIPTOR) +
>> 
>> +    (CoreCount *
>> sizeof(UINT64));
>> 
>>    // Create platform descriptor HOB
>> 
>>    HobData =
>> (SGI_PLATFORM_DESCRIPTOR *)BuildGuidHob (
>> 
>>                                
>> &gArmSgiPlatformIdDescriptorGuid,
>> 
>> -                                      
>> sizeof (SGI_PLATFORM_DESCRIPTOR));
>> 
>> +                                     
>> HobSize);
>> 
>>  
>> 
>>    // Get the system id from the platform specific
>> nt_fw_config device tree
>> 
>>    if (HobData == NULL) {
>> 
>> 
> 
> IMPORTANT NOTICE: The contents of this email and any attachments are
> confidential and may also be privileged. If you are not the intended
> recipient, please notify the sender immediately and do not disclose the
> contents to any other person, use it for any purpose, or store or copy the
> information in any medium. Thank you.


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


Reply via email to