From: "PierreGondois" <pierre.gondois@arm.com>
To: devel@edk2.groups.io
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>,
Sami Mujawar <sami.mujawar@arm.com>,
Rebecca Cran <quic_rcran@quicinc.com>,
Pierre Gondois <pierre.gondois@arm.com>
Subject: [PATCH v5 2/9] DynamicTablesPkg: FdtHwInfoParserLib: Parse Pmu info
Date: Tue, 1 Feb 2022 18:22:45 +0100 [thread overview]
Message-ID: <20220201172252.799725-3-Pierre.Gondois@arm.com> (raw)
In-Reply-To: <20220201172252.799725-1-Pierre.Gondois@arm.com>
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]
v4:
- Add more information in ASSERT () checks. [Ard]
.../FdtHwInfoParserLib/Gic/ArmGicCParser.c | 132 +++++++++++++++++-
.../FdtHwInfoParserLib/Gic/ArmGicCParser.h | 8 +-
2 files changed, 136 insertions(+), 4 deletions(-)
diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Gic/ArmGicCParser.c
index b4e6729a4ab2..fb01aa0d19e2 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,111 @@ 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 (GicCCmObjDesc != NULL);
+ 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_EFI_ERROR (Status);
+ return Status;
+ }
+
+ if (PmuNodeCount == 0) {
+ return EFI_NOT_FOUND;
+ }
+
+ Status = FdtGetNextCompatNodeInBranch (
+ Fdt,
+ 0,
+ &PmuCompatibleInfo,
+ &PmuNode
+ );
+ if (EFI_ERROR (Status)) {
+ ASSERT_EFI_ERROR (Status);
+ 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_EFI_ERROR (Status);
+ return Status;
+ }
+
+ Data = fdt_getprop (Fdt, PmuNode, "interrupts", &DataSize);
+ if ((Data == NULL) || (DataSize != (IntCells * sizeof (UINT32)))) {
+ // If error or not 1 interrupt.
+ ASSERT (Data != NULL);
+ ASSERT (DataSize == (IntCells * sizeof (UINT32)));
+ 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 (PmuIrq == BSA_PMU_IRQ);
+ 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 +770,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 +885,13 @@ ArmGicCInfoParser (
goto exit_handler;
}
+ // Parse the Pmu Interrupt.
+ Status = GicCPmuNodeParser (Fdt, IntcNode, NewCmObjDesc);
+ if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
+ ASSERT_EFI_ERROR (Status);
+ goto exit_handler;
+ }
+
// 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
next prev parent reply other threads:[~2022-02-01 17:22 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-01 17:22 [PATCH v5 0/9] Add ACPI support for Kvmtool PierreGondois
2022-02-01 17:22 ` [PATCH v5 1/9] DynamicTablesPkg: Print specifier macro for CM_OBJECT_ID PierreGondois
2022-02-01 17:22 ` PierreGondois [this message]
2022-02-01 17:22 ` [PATCH v5 3/9] DynamicTablesPkg: AmlLib: AmlAddPrtEntry() to handle GSI PierreGondois
2022-02-01 17:22 ` [PATCH v5 4/9] DynamicTablesPkg: AcpiSsdtPcieLibArm: Remove link device generation PierreGondois
2022-02-01 17:22 ` [PATCH v5 5/9] ArmVirtPkg: Add cspell exceptions PierreGondois
2022-02-01 17:22 ` [PATCH v5 6/9] ArmVirtPkg/Kvmtool: Add DSDT ACPI table PierreGondois
2022-02-01 17:22 ` [PATCH v5 7/9] ArmVirtPkg/Kvmtool: Add Configuration Manager PierreGondois
2022-02-01 17:22 ` [PATCH v5 8/9] ArmVirtPkg/Kvmtool: Enable ACPI support PierreGondois
2022-02-01 17:22 ` [PATCH v5 9/9] ArmVirtPkg/Kvmtool: Enable Acpiview PierreGondois
2022-02-01 18:04 ` [PATCH v5 0/9] Add ACPI support for Kvmtool Ard Biesheuvel
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=20220201172252.799725-3-Pierre.Gondois@arm.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