On Fri, Apr 22, 2022 at 09:36:36AM -0500, Frank Li wrote: > "struct dw_edma_chip" contains an internal structure "struct dw_edma" that > is used by the eDMA core internally. This structure should not be touched > by the eDMA controller drivers themselves. But currently, the eDMA > controller drivers like "dw-edma-pci" allocates and populates this > internal structure then passes it on to eDMA core. The eDMA core further > populates the structure and uses it. This is wrong! > > Hence, move all the "struct dw_edma" specifics from controller drivers > to the eDMA core. > > Signed-off-by: Frank Li <Frank.Li@xxxxxxx> There is a comment below, but other that that: Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@xxxxxxxxxx> > --- > Change from v8 to v9 > - remove chip->ops check at dw_edma_irq_request() > Change from v7 to v8 > - Check chip->ops at probe() > - use struct edma_dw at dw_edma_v0_debugfs_on/off() > > Change from v6 to v7 > - Move nr_irqs and chip->ops check into dw_edma_irq_request() > - Move dw->irq devm_kcalloc() into dw_edma_irq_request() > - Change dw->nr_irqs after request success > - Fix wrong use chip->nr_irqs when remove > > Change from v5 to v6 > - Don't touch chip->nr_irqs > - Don't set chip->dw utill everything is okay > - dw_edma_channel_setup() and dw_edma_v0_core_debugfs_on/off() methods take > dw_edma structure pointer as a parameter > > Change from v4 to v5 > - Move chip->nr_irqs before allocate dw_edma > Change from v3 to v4 > - Accept most suggestions of Serge Semin > Change from v2 to v3 > - none > Change from v1 to v2 > - rework commit message > - remove duplicate field in struct dw_edma > > > drivers/dma/dw-edma/dw-edma-core.c | 90 +++++++++++++----------- > drivers/dma/dw-edma/dw-edma-core.h | 31 +------- > drivers/dma/dw-edma/dw-edma-pcie.c | 82 +++++++++------------ > drivers/dma/dw-edma/dw-edma-v0-core.c | 32 ++++----- > drivers/dma/dw-edma/dw-edma-v0-core.h | 4 +- > drivers/dma/dw-edma/dw-edma-v0-debugfs.c | 18 ++--- > drivers/dma/dw-edma/dw-edma-v0-debugfs.h | 8 +-- > include/linux/dma/edma.h | 44 ++++++++++++ > 8 files changed, 161 insertions(+), 148 deletions(-) > [...] > diff --git a/include/linux/dma/edma.h b/include/linux/dma/edma.h > index d4333e721588d..6fd374cc72c8e 100644 > --- a/include/linux/dma/edma.h > +++ b/include/linux/dma/edma.h > @@ -12,17 +12,61 @@ > #include <linux/device.h> > #include <linux/dmaengine.h> > > +#define EDMA_MAX_WR_CH 8 > +#define EDMA_MAX_RD_CH 8 > + > struct dw_edma; > > +struct dw_edma_region { > + phys_addr_t paddr; > + void __iomem *vaddr; > + size_t sz; > +}; > + > +struct dw_edma_core_ops { > + int (*irq_vector)(struct device *dev, unsigned int nr); > +}; > + > +enum dw_edma_map_format { > + EDMA_MF_EDMA_LEGACY = 0x0, > + EDMA_MF_EDMA_UNROLL = 0x1, > + EDMA_MF_HDMA_COMPAT = 0x5 > +}; > + > /** > * struct dw_edma_chip - representation of DesignWare eDMA controller hardware > * @dev: struct device of the eDMA controller > * @id: instance ID > + * @nr_irqs: total dma irq number > + * @ops DMA channel to IRQ number mapping > + * @wr_ch_cnt DMA write channel number > + * @rd_ch_cnt DMA read channel number > + * @rg_region DMA register region > + * @ll_region_wr DMA descriptor link list memory for write channel > + * @ll_region_rd DMA descriptor link list memory for read channel > + * @mf DMA register map format Not all members added below are documented in kdoc. Please fix. Thanks, Mani > * @dw: struct dw_edma that is filed by dw_edma_probe() > */ > struct dw_edma_chip { > struct device *dev; > int id; > + int nr_irqs; > + const struct dw_edma_core_ops *ops; > + > + struct dw_edma_region rg_region; > + > + u16 wr_ch_cnt; > + u16 rd_ch_cnt; > + /* link list address */ > + struct dw_edma_region ll_region_wr[EDMA_MAX_WR_CH]; > + struct dw_edma_region ll_region_rd[EDMA_MAX_RD_CH]; > + > + /* data region */ > + struct dw_edma_region dt_region_wr[EDMA_MAX_WR_CH]; > + struct dw_edma_region dt_region_rd[EDMA_MAX_RD_CH]; > + > + enum dw_edma_map_format mf; > + > struct dw_edma *dw; > }; > > -- > 2.35.1 >