[PATCH v3 1/2] coresight: etm4x: Introduce has_feat_trf() helper
Leo Yan
leo.yan at arm.com
Wed May 21 05:54:05 PDT 2025
Introduce a new helper, has_feat_trf(), to detect whether FEAT_TRF is
implemented.
To avoid a SMP call for checking the system register, the function
directly reads the configured value. If the value is non-zero, it
indicates that the feature is present.
Signed-off-by: Leo Yan <leo.yan at arm.com>
---
drivers/hwtracing/coresight/coresight-etm4x-core.c | 8 ++++----
drivers/hwtracing/coresight/coresight-etm4x-sysfs.c | 2 +-
drivers/hwtracing/coresight/coresight-etm4x.h | 9 +++++++++
3 files changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
index 42e5d37403ad..08deb67fe0ef 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
@@ -252,7 +252,7 @@ static void etm4x_prohibit_trace(struct etmv4_drvdata *drvdata)
u64 trfcr;
/* If the CPU doesn't support FEAT_TRF, nothing to do */
- if (!drvdata->trfcr)
+ if (!has_feat_trf(drvdata))
return;
trfcr = drvdata->trfcr & ~(TRFCR_EL1_ExTRE | TRFCR_EL1_E0TRE);
@@ -288,7 +288,7 @@ static void etm4x_allow_trace(struct etmv4_drvdata *drvdata)
u64 trfcr, guest_trfcr;
/* If the CPU doesn't support FEAT_TRF, nothing to do */
- if (!drvdata->trfcr)
+ if (!has_feat_trf(drvdata))
return;
if (drvdata->config.mode & ETM_MODE_EXCL_HOST)
@@ -1931,7 +1931,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata)
int ret = 0;
/* Save the TRFCR irrespective of whether the ETM is ON */
- if (drvdata->trfcr)
+ if (has_feat_trf(drvdata))
drvdata->save_trfcr = read_trfcr();
/*
* Save and restore the ETM Trace registers only if
@@ -2043,7 +2043,7 @@ static void __etm4_cpu_restore(struct etmv4_drvdata *drvdata)
static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)
{
- if (drvdata->trfcr)
+ if (has_feat_trf(drvdata))
write_trfcr(drvdata->save_trfcr);
if (drvdata->state_needs_restore)
__etm4_cpu_restore(drvdata);
diff --git a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
index ab251865b893..8afcc553bb97 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
+++ b/drivers/hwtracing/coresight/coresight-etm4x-sysfs.c
@@ -2315,7 +2315,7 @@ static ssize_t ts_source_show(struct device *dev,
int val;
struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
- if (!drvdata->trfcr) {
+ if (!has_feat_trf(drvdata)) {
val = -1;
goto out;
}
diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
index ac649515054d..1840e658eda2 100644
--- a/drivers/hwtracing/coresight/coresight-etm4x.h
+++ b/drivers/hwtracing/coresight/coresight-etm4x.h
@@ -1068,5 +1068,14 @@ static inline bool etm4x_is_ete(struct etmv4_drvdata *drvdata)
return drvdata->arch >= ETM_ARCH_ETE;
}
+static inline bool has_feat_trf(struct etmv4_drvdata *drvdata)
+{
+ /*
+ * drvdata->trfcr is initialized to a non-zero value if trace
+ * filtering is supported.
+ */
+ return !!drvdata->trfcr;
+}
+
void etm4_release_trace_id(struct etmv4_drvdata *drvdata);
#endif
--
2.34.1
More information about the linux-arm-kernel
mailing list