Re: [PATCH] perf/arm-cmn: Fix {wp_dev_sel2, wp_dev_sel} limited to 0/1 when MXP_MULTIPLE_DTM_EN is TRUE
From: Robin Murphy
Date: Wed Sep 09 2026 - 15:09:35 EST
On 19/08/2026 11:54 am, Shouping Wang wrote:
When MXP_MULTIPLE_DTM_EN is TRUE, each DTM will monitor at most
two device ports. In this case, {wp_dev_sel2, wp_dev_sel} will
only use values 2'b00 and 2'b01 per DTM.
Previously the setting allowed values beyond the supported range
per DTM, which could cause each DTM to select invalid ports when
MXP_MULTIPLE_DTM_EN is TRUE.
Fix this by applying `dev %= 2` to clamp the selection value to
the valid range when MXP_MULTIPLE_DTM_EN is TRUE.
Fixes: 60d1504070c2 ("perf/arm-cmn: Support new IP features")
Signed-off-by: Shouping Wang <allen.wang@xxxxxxxxxxxx>
---
drivers/perf/arm-cmn.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/drivers/perf/arm-cmn.c b/drivers/perf/arm-cmn.c
index 40c05c519a1d..13ccbf2a7345 100644
--- a/drivers/perf/arm-cmn.c
+++ b/drivers/perf/arm-cmn.c
@@ -1392,6 +1392,7 @@ static void arm_cmn_claim_wp_idx(struct arm_cmn_dtm *dtm,
static u32 arm_cmn_wp_config(struct perf_event *event, int wp_idx)
{
+ struct arm_cmn *cmn = to_cmn(event->pmu);
Nit: may as well refactor the is_cmn600 condition to reference cmn->part directly too.
u32 config;
u32 dev = CMN_EVENT_WP_DEV_SEL(event);
u32 chn = CMN_EVENT_WP_CHN_SEL(event);
@@ -1404,6 +1405,9 @@ static u32 arm_cmn_wp_config(struct perf_event *event, int wp_idx)
if (is_cmn600)
grp &= 1;
+ if (cmn->multi_dtm)
+ dev %= 2;
+
Let's just make the whole setting of CMN_DTM_WPn_CONFIG_WP_DEV_SEL2 conditional on !multi_dtm, like for exclusive and combine further down (note that the CMN-600 "grp &= 1" is different, since that's more about sanitising invalid input values rather than the register encoding itself.)
Thanks,
Robin.
config = FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_DEV_SEL, dev) |
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_CHN_SEL, chn) |
FIELD_PREP(CMN_DTM_WPn_CONFIG_WP_GRP, grp) |