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

From: Frank Li

Date: Thu Mar 12 2026 - 16:05:43 EST


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 <den@xxxxxxxxxxxxx>
> ---
> 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
>