Re: [PATCH 01/15] dmaengine: dw-edma: Cache DMA channel IDs in dw_edma_chip

Frank Li <[email protected]> Thu, 12 Mar 2026 16:05:21 -0400
Newsgroups dev.linux.lists.ntb,org.kernel.vger.dmaengine,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pci
Message-ID <abMcgQOHDD55Yv0e@lizhi-Precision-Tower-5810>
On Fri, Mar 13, 2026 at 01:49:51AM +0900, Koichiro Den wrote:
> The exported-DMA path needs to describe each exposed descriptor window
> with the DMAEngine channel ID that owns it. Those IDs are only assigned
> once the channels have been registered.
>
> Cache the dma_chan IDs in dw_edma_chip after registration so controller
> frontends can later publish them as auxiliary-resource metadata without
> reaching back into the live channel objects.
>
> Signed-off-by: Koichiro Den <[email protected]>
> ---
>  drivers/dma/dw-edma/dw-edma-core.c | 18 +++++++++++++++++-
>  include/linux/dma/edma.h           |  4 ++++
>  2 files changed, 21 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c
> index cd34a3ea602d..a13beacce2e7 100644
> --- a/drivers/dma/dw-edma/dw-edma-core.c
> +++ b/drivers/dma/dw-edma/dw-edma-core.c
> @@ -837,6 +837,7 @@ static int dw_edma_channel_setup(struct dw_edma *dw, u32 wr_alloc, u32 rd_alloc)
>  	struct dma_device *dma;
>  	u32 i, ch_cnt;
>  	u32 pos;
> +	int ret;
>
>  	ch_cnt = dw->wr_ch_cnt + dw->rd_ch_cnt;
>  	dma = &dw->dma;
> @@ -932,7 +933,22 @@ static int dw_edma_channel_setup(struct dw_edma *dw, u32 wr_alloc, u32 rd_alloc)
>  	dma_set_max_seg_size(dma->dev, U32_MAX);
>
>  	/* Register DMA device */
> -	return dma_async_device_register(dma);
> +	ret = dma_async_device_register(dma);
> +	if (ret)
> +		return ret;
> +
> +	/* Cache dma_chan.id in dw_edma_chip */
> +	for (i = 0; i < ch_cnt; i++) {
> +		chan = &dw->chan[i];
> +
> +		if (i < dw->wr_ch_cnt)
> +			chip->chan_ids_wr[i] = chan->vc.chan.chan_id;
> +		else
> +			chip->chan_ids_rd[i - dw->wr_ch_cnt] =
> +						chan->vc.chan.chan_id;
> +	}

why need cache in dw_edma_chip? you's cache into chan.

Frank
> +
> +	return 0;
>  }
>
>  static inline void dw_edma_dec_irq_alloc(int *nr_irqs, u32 *alloc, u16 cnt)
> diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h
> index 9da53c75e49b..0b861e8d305e 100644
> --- a/include/linux/dma/edma.h
> +++ b/include/linux/dma/edma.h
> @@ -100,6 +100,10 @@ struct dw_edma_chip {
>  	int			db_irq;
>  	resource_size_t		db_offset;
>
> +	/* dma_chan ids */
> +	int			chan_ids_wr[EDMA_MAX_WR_CH];
> +	int			chan_ids_rd[EDMA_MAX_RD_CH];
> +
>  	enum dw_edma_map_format	mf;
>
>  	struct dw_edma		*dw;
> --
> 2.51.0
>