[PATCH v4 06/11] coresight: etm4x: Add context synchronization before enabling trace

Yeoreum Yun yeoreum.yun at arm.com
Mon Oct 27 01:48:06 PDT 2025


Reviewed-by: Yeoreun Yun <yeoreum.yun at arm.com>
> According to the software usage PKLXF in Arm ARM (ARM DDI 0487 L.a), a
> Context synchronization event is required before enabling the trace
> unit. An ISB is added to meet this requirement.
>
> Improved the barrier comments to provide more accurate information by
> specifying which section of the document the requirement comes from and
> clarifying its intended purpose.
>
> Fixes: 1ab3bb9df5e3 ("coresight: etm4x: Add necessary synchronization for sysreg access")
> Reviewed-by: Mike Leach <mike.leach at linaro.org>
> Tested-by: James Clark <james.clark at linaro.org>
> Signed-off-by: Leo Yan <leo.yan at arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-etm4x-core.c | 37 +++++++++++++++++++---
>  1 file changed, 33 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index 45bf76901650641d45a0d85965651667a8762b8c..7eb30e85bf03d1eda8212faa3c831338b70f86c3 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -446,13 +446,37 @@ static int etm4_enable_trace_unit(struct etmv4_drvdata *drvdata)
>  		etm4x_relaxed_write32(csa, TRCRSR_TA, TRCRSR);
>
>  	etm4x_allow_trace(drvdata);
> +
> +	/*
> +	 * According to software usage PKLXF in Arm ARM (ARM DDI 0487 L.a),
> +	 * execute a Context synchronization event to guarantee the trace unit
> +	 * will observe the new values of the System registers.
> +	 */
> +	if (!csa->io_mem)
> +		isb();
> +
>  	/* Enable the trace unit */
>  	etm4x_relaxed_write32(csa, 1, TRCPRGCTLR);
>
> -	/* Synchronize the register updates for sysreg access */
> +	/*
> +	 * As recommended by section 4.3.7 ("Synchronization when using system
> +	 * instructions to progrom the trace unit") of ARM IHI 0064H.b, the
> +	 * self-hosted trace analyzer must perform a Context synchronization
> +	 * event between writing to the TRCPRGCTLR and reading the TRCSTATR.
> +	 */
>  	if (!csa->io_mem)
>  		isb();
>
> +	/*
> +	 * For the memory-mapped interface, the registers are mapped as Device
> +	 * type (Device-nGnRE). As described in section 4.3.7 ("Synchronization
> +	 * of register updates") of ARM IHI0064H.b, read back the value of any
> +	 * register in the trace unit to ensure writes have completed.
> +	 *
> +	 * Therefore, polling on TRCSTATR ensures that the writing TRCPRGCTLR
> +	 * is complete.
> +	 */
> +
>  	/* wait for TRCSTATR.IDLE to go back down to '0' */
>  	if (etm4x_wait_status(csa, TRCSTATR_IDLE_BIT, 0)) {
>  		dev_err(etm_dev,
> @@ -931,11 +955,16 @@ static void etm4_disable_trace_unit(struct etmv4_drvdata *drvdata)
>  	 */
>  	etm4x_prohibit_trace(drvdata);
>  	/*
> -	 * Make sure everything completes before disabling, as recommended
> -	 * by section 7.3.77 ("TRCVICTLR, ViewInst Main Control Register,
> -	 * SSTATUS") of ARM IHI 0064D
> +	 * Prevent being speculative at the point of disabling the trace unit,
> +	 * as recommended by section 7.3.77 ("TRCVICTLR, ViewInst Main Control
> +	 * Register, SSTATUS") of ARM IHI 0064D
>  	 */
>  	dsb(sy);
> +	/*
> +	 * According to software usage VKHHY in Arm ARM (ARM DDI 0487 L.a),
> +	 * execute a Context synchronization event to guarantee no new
> +	 * program-flow trace is generated.
> +	 */
>  	isb();
>  	/* Trace synchronization barrier, is a nop if not supported */
>  	tsb_csync();
>
> --
> 2.34.1
>

--
Sincerely,
Yeoreum Yun



More information about the linux-arm-kernel mailing list