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@arm.com --- 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;