]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
perf/arm-cmn: Fix CCLA register offset
authorRobin Murphy <robin.murphy@arm.com>
Mon, 2 Sep 2024 17:51:58 +0000 (18:51 +0100)
committerWill Deacon <will@kernel.org>
Wed, 4 Sep 2024 15:04:07 +0000 (16:04 +0100)
Apparently pmu_event_sel is offset by 8 for all CCLA nodes, not just
the CCLA_RNI combination type.

Fixes: 23760a014417 ("perf/arm-cmn: Add CMN-700 support")
Acked-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Ilkka Koskinen <ilkka@os.amperecomputing.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/6e7bb06fef6046f83e7647aad0e5be544139763f.1725296395.git.robin.murphy@arm.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/perf/arm-cmn.c

index b59ae8513dceeb55b968b9b0c76aa8fd477c7560..4e2338afe66944d869f2b9bbd5b3fc5a612da7e1 100644 (file)
@@ -70,7 +70,8 @@
 /* Technically this is 4 bits wide on DNs, but we only use 2 there anyway */
 #define CMN__PMU_OCCUP1_ID             GENMASK_ULL(34, 32)
 
-/* HN-Ps are weird... */
+/* Some types are designed to coexist with another device in the same node */
+#define CMN_CCLA_PMU_EVENT_SEL         0x008
 #define CMN_HNP_PMU_EVENT_SEL          0x008
 
 /* DTMs live in the PMU space of XP registers */
@@ -2393,10 +2394,13 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
                        case CMN_TYPE_CXHA:
                        case CMN_TYPE_CCRA:
                        case CMN_TYPE_CCHA:
-                       case CMN_TYPE_CCLA:
                        case CMN_TYPE_HNS:
                                dn++;
                                break;
+                       case CMN_TYPE_CCLA:
+                               dn->pmu_base += CMN_CCLA_PMU_EVENT_SEL;
+                               dn++;
+                               break;
                        /* Nothing to see here */
                        case CMN_TYPE_MPAM_S:
                        case CMN_TYPE_MPAM_NS:
@@ -2414,7 +2418,7 @@ static int arm_cmn_discover(struct arm_cmn *cmn, unsigned int rgn_offset)
                        case CMN_TYPE_HNP:
                        case CMN_TYPE_CCLA_RNI:
                                dn[1] = dn[0];
-                               dn[0].pmu_base += CMN_HNP_PMU_EVENT_SEL;
+                               dn[0].pmu_base += CMN_CCLA_PMU_EVENT_SEL;
                                dn[1].type = arm_cmn_subtype(dn->type);
                                dn += 2;
                                break;