[PATCH v2 03/11] coresight: trbe: Track trigger count support per CPU
From: Leo Yan
Date: Fri Oct 16 2026 - 17:12:13 EST
Some TRBE errata are not compatible with using trigger count mode. In
particular, CPUs affected by the overwrite-in-fill-mode or out-of-range
workarounds must continue to use the existing fill-mode handling.
Record whether trigger count mode is supported in each CPU's probe.
This prepares the enable path to avoid programming TRBTRG_EL1 on
affected CPUs.
Signed-off-by: Leo Yan <leo.yan@xxxxxxx>
---
drivers/hwtracing/coresight/coresight-trbe.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/drivers/hwtracing/coresight/coresight-trbe.c b/drivers/hwtracing/coresight/coresight-trbe.c
index 09ed9bcf4a70479169094697dcc3d445629cfaae..92cd9c28cb4f6d9da7d41aa9eeedf4295a810006 100644
--- a/drivers/hwtracing/coresight/coresight-trbe.c
+++ b/drivers/hwtracing/coresight/coresight-trbe.c
@@ -140,6 +140,7 @@ struct trbe_save_state {
* @trbe_align - Software alignment used for the TRBPTR_EL1.
* @cpu - CPU this TRBE belongs to.
* @mode - Mode of current operation. (perf/disabled)
+ * @trig_is_supported - Trigger count support flag.
* @buf - Buffer configuration retained for the enabled session.
* @handle - Perf output handle from successful enable until disable.
* @drvdata - TRBE specific drvdata
@@ -151,6 +152,7 @@ struct trbe_cpudata {
u64 trbe_align;
int cpu;
enum cs_mode mode;
+ bool trig_is_supported;
struct trbe_buf *buf;
struct perf_output_handle *handle;
struct trbe_drvdata *drvdata;
@@ -222,6 +224,15 @@ static bool trbe_is_broken(struct trbe_cpudata *cpudata)
return trbe_has_erratum(cpudata, TRBE_IS_BROKEN);
}
+static bool trbe_trigger_count_supported(struct trbe_cpudata *cpudata)
+{
+ if (trbe_may_overwrite_in_fill_mode(cpudata) ||
+ trbe_may_write_out_of_range(cpudata))
+ return false;
+
+ return true;
+}
+
static int trbe_alloc_node(struct perf_event *event)
{
if (event->cpu == -1)
@@ -1609,6 +1620,7 @@ static void arm_trbe_probe_cpu(void *info)
else
cpudata->trbe_align = cpudata->trbe_hw_align;
+ cpudata->trig_is_supported = trbe_trigger_count_supported(cpudata);
cpudata->trbe_flag = get_trbe_flag_update(trbidr);
cpudata->cpu = cpu;
cpudata->drvdata = drvdata;
--
2.34.1