[PATCH v6 09/11] coresight: etm4x: Add flag to retain single-shot status

Mike Leach mike.leach at linaro.org
Wed Nov 12 01:05:39 PST 2025


On Tue, 11 Nov 2025 at 18:59, Leo Yan <leo.yan at arm.com> wrote:
>
> Add a 'retain_ss_status' flag to the config structure.
>
> By default, the flag is set to zero so that the TRCSSCSRn.STATUS bit
> is cleared to restart the single-shot mode.
>
> If the flag is set, the single-shot status will be retained, thus
> avoiding restart the single-shot. The retain flag is automatically
> cleared to restore the default behavior on the next call.
>
> Signed-off-by: Leo Yan <leo.yan at arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-etm4x-core.c | 15 ++++++++++++---
>  drivers/hwtracing/coresight/coresight-etm4x.h      |  2 ++
>  2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> index 560975b70474c3449aa6799fc1a8e05d5ea93495..8b85a73e29f407a8d5e26a25f4dceaadaeed05ed 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c
> +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c
> @@ -565,9 +565,18 @@ static int etm4_enable_hw(struct etmv4_drvdata *drvdata)
>                 etm4x_relaxed_write32(csa, config->res_ctrl[i], TRCRSCTLRn(i));
>
>         for (i = 0; i < drvdata->nr_ss_cmp; i++) {
> -               /* always clear status bit on restart if using single-shot */
> -               if (config->ss_ctrl[i] || config->ss_pe_cmp[i])
> -                       config->ss_status[i] &= ~TRCSSCSRn_STATUS;
> +               if (!config->retain_ss_status) {
> +                       /* always clear status bit on restart if using single-shot */
> +                       if (config->ss_ctrl[i] || config->ss_pe_cmp[i])
> +                               config->ss_status[i] &= ~TRCSSCSRn_STATUS;
> +               } else {
> +                       /*
> +                        * Leave the single-shot status unchanged; clear the
> +                        * retain flag to restore the default behavior
> +                        * (restart single-shot) for the next call.
> +                        */
> +                       config->retain_ss_status = 0;
> +               }
>                 etm4x_relaxed_write32(csa, config->ss_ctrl[i], TRCSSCCRn(i));
>                 etm4x_relaxed_write32(csa, config->ss_status[i], TRCSSCSRn(i));
>                 if (etm4x_sspcicrn_present(drvdata, i))
> diff --git a/drivers/hwtracing/coresight/coresight-etm4x.h b/drivers/hwtracing/coresight/coresight-etm4x.h
> index 012c52fd19338133129752d35523dc102df24604..d82ec1559b34787dffc7debf4643d948e3850b2a 100644
> --- a/drivers/hwtracing/coresight/coresight-etm4x.h
> +++ b/drivers/hwtracing/coresight/coresight-etm4x.h
> @@ -802,6 +802,7 @@ enum etm_impdef_type {
>   * @ss_ctrl:   Controls the corresponding single-shot comparator resource.
>   * @ss_status: The status of the corresponding single-shot comparator.
>   * @ss_pe_cmp: Selects the PE comparator inputs for Single-shot control.
> + * @retain_ss_status: Retains single-shot status.
>   * @addr_idx:  Address comparator index selector.
>   * @addr_val:  Value for address comparator.
>   * @addr_acc:  Address comparator access type.
> @@ -846,6 +847,7 @@ struct etmv4_config {
>         u32                             ss_ctrl[ETM_MAX_SS_CMP];
>         u32                             ss_status[ETM_MAX_SS_CMP];
>         u32                             ss_pe_cmp[ETM_MAX_SS_CMP];
> +       u8                              retain_ss_status;
>         u8                              addr_idx;
>         u64                             addr_val[ETM_MAX_SINGLE_ADDR_CMP];
>         u64                             addr_acc[ETM_MAX_SINGLE_ADDR_CMP];
>
> --
> 2.34.1
>

Reviewed-by: Mike Leach <mike.leach at linaro.org>

--
Mike Leach
Principal Engineer, ARM Ltd.
Manchester Design Centre. UK



More information about the linux-arm-kernel mailing list