Re: [PATCH v2 1/2] hwtracing: hisi_ptt: Propagate DMA reset timeout in trace_start()

From: Yicong Yang

Date: Thu Apr 16 2026 - 13:31:33 EST


+cc Suzuki and Sizhe..

On 2026/4/15 01:25, Pradhan, Sanman wrote:
> From: Sanman Pradhan <psanman@xxxxxxxxxxx>
>
> hisi_ptt_wait_dma_reset_done() discards the return value of
> readl_poll_timeout_atomic(). If the DMA engine does not complete its
> reset within the timeout, hisi_ptt_trace_start() proceeds to start
> tracing regardless.
>
> Return a bool from hisi_ptt_wait_dma_reset_done(), consistent with the
> other wait helpers in this driver. On timeout, log an error, de-assert
> the reset bit, and return -ETIMEDOUT. Move ctrl->started to the
> successful path so a failed start does not leave the trace marked as
> active.
>
> Fixes: ff0de066b463 ("hwtracing: hisi_ptt: Add trace function support for HiSilicon PCIe Tune and Trace device")
> Cc: stable@xxxxxxxxxxxxxxx
> Signed-off-by: Sanman Pradhan <psanman@xxxxxxxxxxx>

looks good to me.

Reviewed-by: Yicong Yang <yangyccccc@xxxxxxxxx>

I see the Suzuki has sent out the PR for 7.1, so this may wait after the merge window...

thanks.

> ---
> v2:
> - Return bool for consistency with other wait helpers
> - Add pci_err() on timeout
> - De-assert RST before returning on timeout
> - Move ctrl->started to the successful path
>
> drivers/hwtracing/ptt/hisi_ptt.c | 20 +++++++++++++-------
> 1 file changed, 13 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/hwtracing/ptt/hisi_ptt.c b/drivers/hwtracing/ptt/hisi_ptt.c
> index 94c371c491357..b5d851281fbf0 100644
> --- a/drivers/hwtracing/ptt/hisi_ptt.c
> +++ b/drivers/hwtracing/ptt/hisi_ptt.c
> @@ -171,13 +171,13 @@ static bool hisi_ptt_wait_trace_hw_idle(struct hisi_ptt *hisi_ptt)
> HISI_PTT_WAIT_TRACE_TIMEOUT_US);
> }
>
> -static void hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt)
> +static bool hisi_ptt_wait_dma_reset_done(struct hisi_ptt *hisi_ptt)
> {
> u32 val;
>
> - readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS,
> - val, !val, HISI_PTT_RESET_POLL_INTERVAL_US,
> - HISI_PTT_RESET_TIMEOUT_US);
> + return !readl_poll_timeout_atomic(hisi_ptt->iobase + HISI_PTT_TRACE_WR_STS,
> + val, !val, HISI_PTT_RESET_POLL_INTERVAL_US,
> + HISI_PTT_RESET_TIMEOUT_US);
> }
>
> static void hisi_ptt_trace_end(struct hisi_ptt *hisi_ptt)
> @@ -202,14 +202,18 @@ static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt)
> return -EBUSY;
> }
>
> - ctrl->started = true;
> -
> /* Reset the DMA before start tracing */
> val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
> val |= HISI_PTT_TRACE_CTRL_RST;
> writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
>
> - hisi_ptt_wait_dma_reset_done(hisi_ptt);
> + if (!hisi_ptt_wait_dma_reset_done(hisi_ptt)) {
> + pci_err(hisi_ptt->pdev, "timed out waiting for DMA reset\n");
> + val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
> + val &= ~HISI_PTT_TRACE_CTRL_RST;
> + writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
> + return -ETIMEDOUT;
> + }
>
> val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);
> val &= ~HISI_PTT_TRACE_CTRL_RST;
> @@ -234,6 +238,8 @@ static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt)
> if (!hisi_ptt->trace_ctrl.is_port)
> val |= HISI_PTT_TRACE_CTRL_FILTER_MODE;
>
> + ctrl->started = true;
> +
> /* Start the Trace */
> val |= HISI_PTT_TRACE_CTRL_EN;
> writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL);