]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
coresight-etm4x: Conditionally access register TRCEXTINSELR
authorYuanfang Zhang <yuanfang.zhang@oss.qualcomm.com>
Tue, 12 Aug 2025 08:24:45 +0000 (01:24 -0700)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Tue, 23 Sep 2025 13:14:12 +0000 (14:14 +0100)
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: f5bd523690d2 ("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
drivers/hwtracing/coresight/coresight-etm4x-core.c
drivers/hwtracing/coresight/coresight-etm4x.h

index cbea200489c8f3676d08c6bc6334ecd71d2569ca..b4f1834a1af1e7a38a3afdf0b7b87e1fe87bfa22 100644 (file)
@@ -529,7 +529,8 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
                etm4x_relaxed_write32(csa, config->seq_rst, TRCSEQRSTEVR);
                etm4x_relaxed_write32(csa, config->seq_state, TRCSEQSTR);
        }
-       etm4x_relaxed_write32(csa, config->ext_inp, TRCEXTINSELR);
+       if (drvdata->numextinsel)
+               etm4x_relaxed_write32(csa, config->ext_inp, TRCEXTINSELR);
        for (i = 0; i < drvdata->nr_cntr; i++) {
                etm4x_relaxed_write32(csa, config->cntrldvr[i], TRCCNTRLDVRn(i));
                etm4x_relaxed_write32(csa, config->cntr_ctrl[i], TRCCNTCTLRn(i));
@@ -1424,6 +1425,7 @@ static void etm4_init_arch_data(void *info)
        etmidr5 = etm4x_relaxed_read32(csa, TRCIDR5);
        /* NUMEXTIN, bits[8:0] number of external inputs implemented */
        drvdata->nr_ext_inp = FIELD_GET(TRCIDR5_NUMEXTIN_MASK, etmidr5);
+       drvdata->numextinsel = FIELD_GET(TRCIDR5_NUMEXTINSEL_MASK, etmidr5);
        /* TRACEIDSIZE, bits[21:16] indicates the trace ID width */
        drvdata->trcid_size = FIELD_GET(TRCIDR5_TRACEIDSIZE_MASK, etmidr5);
        /* ATBTRIG, bit[22] implementation can support ATB triggers? */
@@ -1853,7 +1855,9 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata)
                state->trcseqrstevr = etm4x_read32(csa, TRCSEQRSTEVR);
                state->trcseqstr = etm4x_read32(csa, TRCSEQSTR);
        }
-       state->trcextinselr = etm4x_read32(csa, TRCEXTINSELR);
+
+       if (drvdata->numextinsel)
+               state->trcextinselr = etm4x_read32(csa, TRCEXTINSELR);
 
        for (i = 0; i < drvdata->nr_cntr; i++) {
                state->trccntrldvr[i] = etm4x_read32(csa, TRCCNTRLDVRn(i));
@@ -1985,7 +1989,8 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)
                etm4x_relaxed_write32(csa, state->trcseqrstevr, TRCSEQRSTEVR);
                etm4x_relaxed_write32(csa, state->trcseqstr, TRCSEQSTR);
        }
-       etm4x_relaxed_write32(csa, state->trcextinselr, TRCEXTINSELR);
+       if (drvdata->numextinsel)
+               etm4x_relaxed_write32(csa, state->trcextinselr, TRCEXTINSELR);
 
        for (i = 0; i < drvdata->nr_cntr; i++) {
                etm4x_relaxed_write32(csa, state->trccntrldvr[i], TRCCNTRLDVRn(i));
index ac649515054d905fa365203bd35f1d839b03292f..823914fefa90a36a328b652b0dc3828b9bddd990 100644 (file)
 #define TRCIDR4_NUMVMIDC_MASK                  GENMASK(31, 28)
 
 #define TRCIDR5_NUMEXTIN_MASK                  GENMASK(8, 0)
+#define TRCIDR5_NUMEXTINSEL_MASK               GENMASK(11, 9)
 #define TRCIDR5_TRACEIDSIZE_MASK               GENMASK(21, 16)
 #define TRCIDR5_ATBTRIG                                BIT(22)
 #define TRCIDR5_LPOVERRIDE                     BIT(23)
@@ -999,6 +1000,7 @@ struct etmv4_drvdata {
        u8                              nr_cntr;
        u8                              nr_ext_inp;
        u8                              numcidc;
+       u8                              numextinsel;
        u8                              numvmidc;
        u8                              nrseqstate;
        u8                              nr_event;