On Fri, 12 Apr 2024 at 13:40, Suzuki K Poulose suzuki.poulose@arm.com wrote:
On 11/04/2024 23:33, Yabin Cui wrote:
On Thu, Apr 11, 2024 at 4:31 AM Suzuki K Poulose suzuki.poulose@arm.com wrote:
ETM4x implements TRCQCLTR only when the Q elements are supported and the Q element filtering is supported (TRCIDR0.QFILT). Access to the register otherwise could be fatal. Fix this by tracking the availability, like the others.
Fixes: f188b5e76aae9 ("coresight: etm4x: Save/restore state across CPU low power states") Reported-by: Yabin Cui yabinc@google.com Signed-off-by: Suzuki K Poulose suzuki.poulose@arm.com
drivers/hwtracing/coresight/coresight-etm4x-core.c | 8 ++++++-- drivers/hwtracing/coresight/coresight-etm4x.h | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c index ff57aabb24c4..e0ebf7d7db91 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c @@ -1240,6 +1240,8 @@ static void etm4_init_arch_data(void *info) drvdata->nr_event = FIELD_GET(TRCIDR0_NUMEVENT_MASK, etmidr0); /* QSUPP, bits[16:15] Q element support field */ drvdata->q_support = FIELD_GET(TRCIDR0_QSUPP_MASK, etmidr0);
if (drvdata->q_support)
QFILT is architecturally defined as RAZ if QSUPP == 0 - so this line is not needed unless for readability
drvdata->q_filt = !!(etmidr0 & TRCIDR0_QFILT); /* TSSIZE, bits[28:24] Global timestamp size field */ drvdata->ts_size = FIELD_GET(TRCIDR0_TSSIZE_MASK, etmidr0);
@@ -1732,7 +1734,8 @@ static int __etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trcccctlr = etm4x_read32(csa, TRCCCCTLR); state->trcbbctlr = etm4x_read32(csa, TRCBBCTLR); state->trctraceidr = etm4x_read32(csa, TRCTRACEIDR);
state->trcqctlr = etm4x_read32(csa, TRCQCTLR);
if (drvdata->q_filt)
state->trcqctlr = etm4x_read32(csa, TRCQCTLR); state->trcvictlr = etm4x_read32(csa, TRCVICTLR); state->trcviiectlr = etm4x_read32(csa, TRCVIIECTLR);
@@ -1862,7 +1865,8 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata) etm4x_relaxed_write32(csa, state->trcccctlr, TRCCCCTLR); etm4x_relaxed_write32(csa, state->trcbbctlr, TRCBBCTLR); etm4x_relaxed_write32(csa, state->trctraceidr, TRCTRACEIDR);
etm4x_relaxed_write32(csa, state->trcqctlr, TRCQCTLR);
if (drvdata->q_filt)
etm4x_relaxed_write32(csa, state->trcqctlr, TRCQCTLR); etm4x_relaxed_write32(csa, state->trcvictlr, TRCVICTLR); etm4x_relaxed_write32(csa, state->trcviiectlr, TRCVIIECTLR);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h index acd2b1db2052..25dc8ffef5c0 100644 --- a/drivers/hwtracing/coresight/coresight-etm4x.h +++ b/drivers/hwtracing/coresight/coresight-etm4x.h @@ -136,6 +136,7 @@
- of _MASK for multi bit fields and BIT() for single bits.
*/ #define TRCIDR0_INSTP0_MASK GENMASK(2, 1) +#define TRCIDR0_QFILT BIT(4)
COMMENT: QFILT is BIT(14)?
Indeed. I will fix this in the next revision.
Thanks Suzuki
#define TRCIDR0_TRCBB BIT(5) #define TRCIDR0_TRCCOND BIT(6) #define TRCIDR0_TRCCCI BIT(7) @@ -979,6 +980,7 @@ struct etmv4_save_state {
- @os_unlock: True if access to management registers is allowed.
- @instrp0: Tracing of load and store instructions
as P0 elements is supported.
- @q_filt: Q element filtering support, if Q elements are supported.
- @trcbb: Indicates if the trace unit supports branch broadcast tracing.
- @trccond: If the trace unit supports conditional
instruction tracing.
@@ -1041,6 +1043,7 @@ struct etmv4_drvdata { bool boot_enable; bool os_unlock; bool instrp0;
bool q_filt; bool trcbb; bool trccond; bool retstack;
-- 2.34.1
with QFILT bitfield value fix...
Reviewed-by: Mike Leach mike.leach@linaro.org