]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
coresight: etm4x: Fix timestamp bit field handling
authorLeo Yan <leo.yan@arm.com>
Mon, 19 May 2025 17:49:44 +0000 (18:49 +0100)
committerSuzuki K Poulose <suzuki.poulose@arm.com>
Tue, 20 May 2025 15:16:15 +0000 (16:16 +0100)
Timestamps in the trace data appear as all zeros on recent kernels,
although the feature works correctly on old kernels (e.g., v6.12).

Since commit c382ee674c8b ("arm64/sysreg/tools: Move TRFCR definitions
to sysreg"), the TRFCR_ELx_TS_{VIRTUAL|GUEST_PHYSICAL|PHYSICAL} macros
were updated to remove the bit shift. As a result, the driver no longer
shifts bits when operates the timestamp field.

Fix this by using the FIELD_PREP() and FIELD_GET() helpers.

Reported-by: Tamas Zsoldos <tamas.zsoldos@arm.com>
Fixes: c382ee674c8b ("arm64/sysreg/tools: Move TRFCR definitions to sysreg")
Signed-off-by: Leo Yan <leo.yan@arm.com>
Reviewed-by: James Clark <james.clark@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250519174945.2245271-2-leo.yan@arm.com
drivers/hwtracing/coresight/coresight-etm4x-core.c
drivers/hwtracing/coresight/coresight-etm4x-sysfs.c

index 6a5898355a83893973b5aa0b769debae79961673..acb4a58e4bb95df1b12cea9bae8c7085ddc1b2b5 100644 (file)
@@ -1237,7 +1237,7 @@ static void cpu_detect_trace_filtering(struct etmv4_drvdata *drvdata)
         * tracing at the kernel EL and EL0, forcing to use the
         * virtual time as the timestamp.
         */
-       trfcr = (TRFCR_EL1_TS_VIRTUAL |
+       trfcr = (FIELD_PREP(TRFCR_EL1_TS_MASK, TRFCR_EL1_TS_VIRTUAL) |
                 TRFCR_EL1_ExTRE |
                 TRFCR_EL1_E0TRE);
 
index 49d5fb87a74b613176e172e00d5b355a05b0ac5f..ab251865b893d8f24544b1fe302163025d6382b7 100644 (file)
@@ -2320,11 +2320,11 @@ static ssize_t ts_source_show(struct device *dev,
                goto out;
        }
 
-       switch (drvdata->trfcr & TRFCR_EL1_TS_MASK) {
+       val = FIELD_GET(TRFCR_EL1_TS_MASK, drvdata->trfcr);
+       switch (val) {
        case TRFCR_EL1_TS_VIRTUAL:
        case TRFCR_EL1_TS_GUEST_PHYSICAL:
        case TRFCR_EL1_TS_PHYSICAL:
-               val = FIELD_GET(TRFCR_EL1_TS_MASK, drvdata->trfcr);
                break;
        default:
                val = -1;