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: Tue Sep 08 2026 - 12:56:29 EST
On 08/09/2026 9:15 am, allen.wang wrote:
Hi,
Gentle ping on this patch.
Could someone please review it when time permits?
Thanks!
Allen
On 8/19/2026 6:54 PM, 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.
Hmm, I read the "each DTM will only use..." wording[1] as implying that the hardware itself would ignore wp_dev_sel2 (especially since that would seem to be the obvious thing to do) - are you saying that that isn't the case? (I've never had access to any actual multi-DTM hardware...)
Thanks,
Robin.
[1] https://support.arm.com/documentation/102308/0307/Debug-trace-and-PMU/Debug-Trace-system-overview/DTM-watchpoint?lang=en
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);
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;
+
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) |