Skip to content

Commit dcdc42f

Browse files
Yuanfang ZhangSuzuki K Poulose
authored andcommitted
coresight-etm4x: Conditionally access register TRCEXTINSELR
The TRCEXTINSELR is only implemented if TRCIDR5.NUMEXTINSEL > 0. To avoid invalid accesses, introduce a check on numextinsel (derived from TRCIDR5[11:9]) before reading or writing to this register. Fixes: f5bd523 ("coresight: etm4x: Convert all register accesses") Signed-off-by: Yuanfang Zhang <yuanfang.zhang@oss.qualcomm.com> Reviewed-by: James Clark <james.clark@linaro.org> Reviewed-by: Mike Leach <mike.leach@linaro.org> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com> Link: https://lore.kernel.org/r/20250812-trcextinselr_issue-v2-1-e6eb121dfcf4@oss.qualcomm.com
1 parent 21dd3f8 commit dcdc42f

2 files changed

Lines changed: 10 additions & 3 deletions

File tree

drivers/hwtracing/coresight/coresight-etm4x-core.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,8 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
529529
etm4x_relaxed_write32(csa, config->seq_rst, TRCSEQRSTEVR);
530530
etm4x_relaxed_write32(csa, config->seq_state, TRCSEQSTR);
531531
}
532-
etm4x_relaxed_write32(csa, config->ext_inp, TRCEXTINSELR);
532+
if (drvdata->numextinsel)
533+
etm4x_relaxed_write32(csa, config->ext_inp, TRCEXTINSELR);
533534
for (i = 0; i < drvdata->nr_cntr; i++) {
534535
etm4x_relaxed_write32(csa, config->cntrldvr[i], TRCCNTRLDVRn(i));
535536
etm4x_relaxed_write32(csa, config->cntr_ctrl[i], TRCCNTCTLRn(i));
@@ -1424,6 +1425,7 @@ static void etm4_init_arch_data(void *info)
14241425
etmidr5 = etm4x_relaxed_read32(csa, TRCIDR5);
14251426
/* NUMEXTIN, bits[8:0] number of external inputs implemented */
14261427
drvdata->nr_ext_inp = FIELD_GET(TRCIDR5_NUMEXTIN_MASK, etmidr5);
1428+
drvdata->numextinsel = FIELD_GET(TRCIDR5_NUMEXTINSEL_MASK, etmidr5);
14271429
/* TRACEIDSIZE, bits[21:16] indicates the trace ID width */
14281430
drvdata->trcid_size = FIELD_GET(TRCIDR5_TRACEIDSIZE_MASK, etmidr5);
14291431
/* ATBTRIG, bit[22] implementation can support ATB triggers? */
@@ -1853,7 +1855,9 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
18531855
state->trcseqrstevr = etm4x_read32(csa, TRCSEQRSTEVR);
18541856
state->trcseqstr = etm4x_read32(csa, TRCSEQSTR);
18551857
}
1856-
state->trcextinselr = etm4x_read32(csa, TRCEXTINSELR);
1858+
1859+
if (drvdata->numextinsel)
1860+
state->trcextinselr = etm4x_read32(csa, TRCEXTINSELR);
18571861

18581862
for (i = 0; i < drvdata->nr_cntr; i++) {
18591863
state->trccntrldvr[i] = etm4x_read32(csa, TRCCNTRLDVRn(i));
@@ -1985,7 +1989,8 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)
19851989
etm4x_relaxed_write32(csa, state->trcseqrstevr, TRCSEQRSTEVR);
19861990
etm4x_relaxed_write32(csa, state->trcseqstr, TRCSEQSTR);
19871991
}
1988-
etm4x_relaxed_write32(csa, state->trcextinselr, TRCEXTINSELR);
1992+
if (drvdata->numextinsel)
1993+
etm4x_relaxed_write32(csa, state->trcextinselr, TRCEXTINSELR);
19891994

19901995
for (i = 0; i < drvdata->nr_cntr; i++) {
19911996
etm4x_relaxed_write32(csa, state->trccntrldvr[i], TRCCNTRLDVRn(i));

drivers/hwtracing/coresight/coresight-etm4x.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,7 @@
162162
#define TRCIDR4_NUMVMIDC_MASK GENMASK(31, 28)
163163

164164
#define TRCIDR5_NUMEXTIN_MASK GENMASK(8, 0)
165+
#define TRCIDR5_NUMEXTINSEL_MASK GENMASK(11, 9)
165166
#define TRCIDR5_TRACEIDSIZE_MASK GENMASK(21, 16)
166167
#define TRCIDR5_ATBTRIG BIT(22)
167168
#define TRCIDR5_LPOVERRIDE BIT(23)
@@ -999,6 +1000,7 @@ struct etmv4_drvdata {
9991000
u8 nr_cntr;
10001001
u8 nr_ext_inp;
10011002
u8 numcidc;
1003+
u8 numextinsel;
10021004
u8 numvmidc;
10031005
u8 nrseqstate;
10041006
u8 nr_event;

0 commit comments

Comments
 (0)