Re: [PATCH 11/12] dmaengine: dw-edma-pcie: Handle optional data blocks
From: Frank Li
Date: Thu May 21 2026 - 12:42:37 EST
On Thu, May 21, 2026 at 03:31:14PM +0900, Koichiro Den wrote:
> Skip data block BAR mapping and debug output when a channel has no data
> block size. This lets future providers describe channels that only need
> descriptor memory exposed.
>
> No functional change intended for existing EDDA and MDB devices. Their
> static channel descriptions still provide data block sizes where data
> block windows are used. A zero-sized data block now means "not present"
> for future metadata providers.
>
> Signed-off-by: Koichiro Den <den@xxxxxxxxxxxxx>
> ---
Actually when ll_block->sz is 0, it is similar with no_ll mode. We can
config consolidate it later.
Reviewed-by: Frank Li <Frank.Li@xxxxxxx>
> drivers/dma/dw-edma/dw-edma-pcie.c | 24 ++++++++++++++++++++----
> 1 file changed, 20 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/dma/dw-edma/dw-edma-pcie.c b/drivers/dma/dw-edma/dw-edma-pcie.c
> index 2a95fb9d5fc3..df02b244e748 100644
> --- a/drivers/dma/dw-edma/dw-edma-pcie.c
> +++ b/drivers/dma/dw-edma/dw-edma-pcie.c
> @@ -414,11 +414,13 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
> mask = BIT(dma_data->rg.bar);
> for (i = 0; i < dma_data->wr_ch_cnt; i++) {
> mask |= BIT(dma_data->ll_wr[i].bar);
> - mask |= BIT(dma_data->dt_wr[i].bar);
> + if (dma_data->dt_wr[i].sz)
> + mask |= BIT(dma_data->dt_wr[i].bar);
> }
> for (i = 0; i < dma_data->rd_ch_cnt; i++) {
> mask |= BIT(dma_data->ll_rd[i].bar);
> - mask |= BIT(dma_data->dt_rd[i].bar);
> + if (dma_data->dt_rd[i].sz)
> + mask |= BIT(dma_data->dt_rd[i].bar);
> }
> err = pcim_iomap_regions(pdev, mask, pci_name(pdev));
> if (err) {
> @@ -483,6 +485,9 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
> ll_block);
> ll_region->sz = ll_block->sz;
>
> + if (!dt_block->sz)
> + continue;
> +
> dt_region->vaddr.io = pcim_iomap_table(pdev)[dt_block->bar];
> if (!dt_region->vaddr.io)
> return -ENOMEM;
> @@ -508,6 +513,9 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
> ll_block);
> ll_region->sz = ll_block->sz;
>
> + if (!dt_block->sz)
> + continue;
> +
> dt_region->vaddr.io = pcim_iomap_table(pdev)[dt_block->bar];
> if (!dt_region->vaddr.io)
> return -ENOMEM;
> @@ -541,10 +549,14 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
> dma_data->ll_wr[i].off, chip->ll_region_wr[i].sz,
> chip->ll_region_wr[i].vaddr.io, &chip->ll_region_wr[i].paddr);
>
> + if (!dma_data->dt_wr[i].sz)
> + continue;
> +
> pci_dbg(pdev, "Data:\tWRITE CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
> i, dma_data->dt_wr[i].bar,
> dma_data->dt_wr[i].off, chip->dt_region_wr[i].sz,
> - chip->dt_region_wr[i].vaddr.io, &chip->dt_region_wr[i].paddr);
> + chip->dt_region_wr[i].vaddr.io,
> + &chip->dt_region_wr[i].paddr);
> }
>
> for (i = 0; i < chip->ll_rd_cnt; i++) {
> @@ -553,10 +565,14 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
> dma_data->ll_rd[i].off, chip->ll_region_rd[i].sz,
> chip->ll_region_rd[i].vaddr.io, &chip->ll_region_rd[i].paddr);
>
> + if (!dma_data->dt_rd[i].sz)
> + continue;
> +
> pci_dbg(pdev, "Data:\tREAD CH%.2u, BAR=%u, off=0x%.8lx, sz=0x%zx bytes, addr(v=%p, p=%pa)\n",
> i, dma_data->dt_rd[i].bar,
> dma_data->dt_rd[i].off, chip->dt_region_rd[i].sz,
> - chip->dt_region_rd[i].vaddr.io, &chip->dt_region_rd[i].paddr);
> + chip->dt_region_rd[i].vaddr.io,
> + &chip->dt_region_rd[i].paddr);
> }
>
> pci_dbg(pdev, "Nr. IRQs:\t%u\n", chip->nr_irqs);
> --
> 2.51.0
>