From: "Ard Biesheuvel" <ardb@kernel.org>
To: edk2-devel-groups-io <devel@edk2.groups.io>,
Pierre <pierre.gondois@arm.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
Sami Mujawar <sami.mujawar@arm.com>
Subject: Re: [edk2-devel] [PATCH v3 2/8] DynamicTablesPkg: FdtHwInfoParserLib: Parse Pmu info
Date: Sat, 29 Jan 2022 16:33:35 +0100 [thread overview]
Message-ID: <CAMj1kXH-aFtQ3ti2zx3g8CYJ8CizW6EDz=D6GAoOQVUFya95TQ@mail.gmail.com> (raw)
In-Reply-To: <20220128154103.20752-3-Pierre.Gondois@arm.com>
On Fri, 28 Jan 2022 at 16:41, PierreGondois <pierre.gondois@arm.com> wrote:
>
> From: Pierre Gondois <Pierre.Gondois@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.Gondois@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+owner@edk2.groups.io
> Unsubscribe: https://edk2.groups.io/g/devel/unsub [ardb@kernel.org]
> ------------
>
>
next prev parent reply other threads:[~2022-01-29 15:33 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-28 15:40 [PATCH v3 0/8] Add ACPI support for Kvmtool PierreGondois
2022-01-28 15:40 ` [PATCH v3 1/8] DynamicTablesPkg: Print specifier macro for CM_OBJECT_ID PierreGondois
2022-01-28 15:40 ` [PATCH v3 2/8] DynamicTablesPkg: FdtHwInfoParserLib: Parse Pmu info PierreGondois
2022-01-29 15:33 ` Ard Biesheuvel [this message]
2022-01-28 15:40 ` [PATCH v3 3/8] DynamicTablesPkg: AcpiSsdtPcieLibArm: Fix _PRT description PierreGondois
2022-01-29 15:52 ` Ard Biesheuvel
2022-01-29 18:20 ` Marc Zyngier
2022-01-31 12:59 ` PierreGondois
2022-01-31 13:52 ` Marc Zyngier
2022-01-31 14:54 ` Ard Biesheuvel
2022-01-28 15:40 ` [PATCH v3 4/8] ArmVirtPkg: Add cspell exceptions PierreGondois
2022-01-28 15:41 ` [PATCH v3 5/8] ArmVirtPkg/Kvmtool: Add DSDT ACPI table PierreGondois
2022-01-31 15:17 ` [edk2-devel] " Rebecca Cran
2022-01-31 15:21 ` Sami Mujawar
2022-02-01 16:55 ` PierreGondois
2022-02-01 16:56 ` Ard Biesheuvel
2022-02-01 16:56 ` Ard Biesheuvel
2022-02-01 16:56 ` Ard Biesheuvel
2022-02-01 17:02 ` PierreGondois
2022-02-01 17:04 ` Ard Biesheuvel
2022-02-01 17:07 ` PierreGondois
2022-01-28 15:41 ` [PATCH v3 6/8] ArmVirtPkg/Kvmtool: Add Configuration Manager PierreGondois
2022-01-28 15:41 ` [PATCH v3 7/8] ArmVirtPkg/Kvmtool: Enable ACPI support PierreGondois
2022-01-28 15:41 ` [PATCH v3 8/8] ArmVirtPkg/Kvmtool: Enable Acpiview PierreGondois
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAMj1kXH-aFtQ3ti2zx3g8CYJ8CizW6EDz=D6GAoOQVUFya95TQ@mail.gmail.com' \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox