Commit ee811bc7 authored by Leo Yan's avatar Leo Yan Committed by Suzuki K Poulose
Browse files

coresight: etm4x: Fix timestamp bit field handling



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 c382ee67 ("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: default avatarTamas Zsoldos <tamas.zsoldos@arm.com>
Fixes: c382ee67 ("arm64/sysreg/tools: Move TRFCR definitions to sysreg")
Signed-off-by: default avatarLeo Yan <leo.yan@arm.com>
Reviewed-by: default avatarJames Clark <james.clark@linaro.org>
Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
Link: https://lore.kernel.org/r/20250519174945.2245271-2-leo.yan@arm.com
parent d23bc38e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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);

+2 −2
Original line number Diff line number Diff line
@@ -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;