On Fri, 28 Jan 2022 at 16:41, PierreGondois <pierre.gond...@arm.com> wrote:
>
> From: Pierre Gondois <pierre.gond...@arm.com>
>
> Parse the Pmu interrupts if a pmu compatible node is present,
> and populate the MADT GicC structure accordingly.
>
> Signed-off-by: Pierre Gondois <pierre.gond...@arm.com>
> ---
>
> Notes:
>     v3:
>      - New patch. [Pierre]
>
>  .../FdtHwInfoParserLib/Gic/ArmGicCParser.c    | 131 +++++++++++++++++-
>  .../FdtHwInfoParserLib/Gic/ArmGicCParser.h    |   8 +-
>  2 files changed, 135 insertions(+), 4 deletions(-)
>
> diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c 
> b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c
> index b4e6729a4ab2..961607378449 100644
> --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c
> +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c
> @@ -1,13 +1,14 @@
>  /** @file
>    Arm Gic cpu parser.
>
> -  Copyright (c) 2021, ARM Limited. All rights reserved.<BR>
> +  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
>    @par Reference(s):
>    - linux/Documentation/devicetree/bindings/arm/cpus.yaml
>    - linux/Documentation/devicetree/bindings/interrupt-controller/arm,gic.yaml
>    - 
> linux/Documentation/devicetree/bindings/interrupt-controller/arm,gic-v3.yaml
> +  - linux/Documentation/devicetree/bindings/arm/pmu.yaml
>  **/
>
>  #include "FdtHwInfoParser.h"
> @@ -34,6 +35,21 @@ STATIC CONST COMPATIBILITY_INFO  CpuCompatibleInfo = {
>    CpuCompatibleStr
>  };
>
> +/** Pmu compatible strings.
> +
> +  Any other "compatible" value is not supported by this module.
> +*/
> +STATIC CONST COMPATIBILITY_STR  PmuCompatibleStr[] = {
> +  { "arm,armv8-pmuv3" }
> +};
> +
> +/** COMPATIBILITY_INFO structure for the PmuCompatibleStr.
> +*/
> +CONST COMPATIBILITY_INFO  PmuCompatibleInfo = {
> +  ARRAY_SIZE (PmuCompatibleStr),
> +  PmuCompatibleStr
> +};
> +
>  /** Parse a "cpu" node.
>
>    @param [in]  Fdt              Pointer to a Flattened Device Tree (Fdt).
> @@ -639,6 +655,110 @@ GicCv3IntcNodeParser (
>    return EFI_SUCCESS;
>  }
>
> +/** Parse a Pmu compatible node, extracting Pmu information.
> +
> +  This function modifies a CM_OBJ_DESCRIPTOR object.
> +  The following CM_ARM_GICC_INFO fields are patched:
> +    - PerformanceInterruptGsiv;
> +
> +  @param [in]       Fdt              Pointer to a Flattened Device Tree 
> (Fdt).
> +  @param [in]       GicIntcNode      Offset of a Gic compatible
> +                                     interrupt-controller node.
> +  @param [in, out]  GicCCmObjDesc    The CM_ARM_GICC_INFO to patch.
> +
> +  @retval EFI_SUCCESS             The function completed successfully.
> +  @retval EFI_ABORTED             An error occurred.
> +  @retval EFI_INVALID_PARAMETER   Invalid parameter.
> +**/
> +STATIC
> +EFI_STATUS
> +EFIAPI
> +GicCPmuNodeParser (
> +  IN      CONST VOID               *Fdt,
> +  IN            INT32              GicIntcNode,
> +  IN  OUT       CM_OBJ_DESCRIPTOR  *GicCCmObjDesc
> +  )
> +{
> +  EFI_STATUS        Status;
> +  INT32             IntCells;
> +  INT32             PmuNode;
> +  UINT32            PmuNodeCount;
> +  UINT32            PmuIrq;
> +  UINT32            Index;
> +  CM_ARM_GICC_INFO  *GicCInfo;
> +  CONST UINT8       *Data;
> +  INT32             DataSize;
> +
> +  if (GicCCmObjDesc == NULL) {
> +    ASSERT (0);
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  GicCInfo = (CM_ARM_GICC_INFO *)GicCCmObjDesc->Data;
> +  PmuNode  = 0;
> +
> +  // Count the number of pmu nodes.
> +  Status = FdtCountCompatNodeInBranch (
> +             Fdt,
> +             0,
> +             &PmuCompatibleInfo,
> +             &PmuNodeCount
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);

If you use ASSERT_EFI_ERROR() here, you at least get the type of error
as DEBUG output, whereas ASSERT(0) does not give any context
whatsoever.

> +    return Status;
> +  }
> +
> +  if (PmuNodeCount == 0) {
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  Status = FdtGetNextCompatNodeInBranch (
> +             Fdt,
> +             0,
> +             &PmuCompatibleInfo,
> +             &PmuNode
> +             );
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);

Same here

> +    if (Status == EFI_NOT_FOUND) {
> +      // Should have found the node.
> +      Status = EFI_ABORTED;
> +    }
> +  }
> +
> +  // Get the number of cells used to encode an interrupt.
> +  Status = FdtGetInterruptCellsInfo (Fdt, GicIntcNode, &IntCells);
> +  if (EFI_ERROR (Status)) {
> +    ASSERT (0);

and here

> +    return Status;
> +  }
> +
> +  Data = fdt_getprop (Fdt, PmuNode, "interrupts", &DataSize);
> +  if ((Data == NULL) || (DataSize != (IntCells * sizeof (UINT32)))) {
> +    // If error or not 1 interrupt.
> +    ASSERT (0);
> +    return EFI_ABORTED;
> +  }
> +
> +  PmuIrq = FdtGetInterruptId ((CONST UINT32 *)Data);
> +
> +  // Only supports PPI 23 for now.
> +  // According to BSA 1.0 s3.6 PPI assignments, PMU IRQ ID is 23. A non BSA
> +  // compliant system may assign a different IRQ for the PMU, however this
> +  // is not implemented for now.
> +  if (PmuIrq != BSA_PMU_IRQ) {
> +    ASSERT (0);
> +    return EFI_ABORTED;
> +  }
> +
> +  for (Index = 0; Index < GicCCmObjDesc->Count; Index++) {
> +    GicCInfo[Index].PerformanceInterruptGsiv = PmuIrq;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
>  /** CM_ARM_GICC_INFO parser function.
>
>    This parser expects FdtBranch to be the "\cpus" node node.
> @@ -649,7 +769,7 @@ GicCv3IntcNodeParser (
>      UINT32  AcpiProcessorUid;                 // {Populated}
>      UINT32  Flags;                            // {Populated}
>      UINT32  ParkingProtocolVersion;           // {default = 0}
> -    UINT32  PerformanceInterruptGsiv;         // {default = 0}
> +    UINT32  PerformanceInterruptGsiv;         // {Populated}
>      UINT64  ParkedAddress;                    // {default = 0}
>      UINT64  PhysicalBaseAddress;              // {Populated}
>      UINT64  GICV;                             // {Populated}
> @@ -764,6 +884,13 @@ ArmGicCInfoParser (
>      goto exit_handler;
>    }
>
> +  // Parse the Pmu Interrupt.
> +  Status = GicCPmuNodeParser (Fdt, IntcNode, NewCmObjDesc);
> +  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
> +    ASSERT (0);

and here

> +    goto exit_handler;

shouldn't this be CamelCase?

> +  }
> +
>    // Add all the CmObjs to the Configuration Manager.
>    Status = AddMultipleCmObj (FdtParserHandle, NewCmObjDesc, 0, NULL);
>    if (EFI_ERROR (Status)) {
> diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.h 
> b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.h
> index 2a0f966bf0c2..fd980484a28d 100644
> --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.h
> +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Arm Gic cpu parser.
>
> -  Copyright (c) 2021, ARM Limited. All rights reserved.<BR>
> +  Copyright (c) 2021 - 2022, Arm Limited. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
>
>    @par Reference(s):
> @@ -12,6 +12,10 @@
>  #ifndef ARM_GICC_PARSER_H_
>  #define ARM_GICC_PARSER_H_
>
> +/* According to BSA 1.0 s3.6 PPI assignments, PMU IRQ ID is 23.
> +*/
> +#define BSA_PMU_IRQ  23
> +
>  /** CM_ARM_GICC_INFO parser function.
>
>    This parser expects FdtBranch to be the "\cpus" node node.
> @@ -22,7 +26,7 @@
>      UINT32  AcpiProcessorUid;                 // {Populated}
>      UINT32  Flags;                            // {Populated}
>      UINT32  ParkingProtocolVersion;           // {default = 0}
> -    UINT32  PerformanceInterruptGsiv;         // {default = 0}
> +    UINT32  PerformanceInterruptGsiv;         // {Populated}
>      UINT64  ParkedAddress;                    // {default = 0}
>      UINT64  PhysicalBaseAddress;              // {Populated}
>      UINT64  GICV;                             // {Populated}
> --
> 2.25.1
>
>
>
> ------------
> Groups.io Links: You receive all messages sent to this group.
> View/Reply Online (#86169): https://edk2.groups.io/g/devel/message/86169
> Mute This Topic: https://groups.io/mt/88746969/1131722
> Group Owner: devel+ow...@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [a...@kernel.org]
> ------------
>
>


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


Reply via email to