Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dmaengine: fsl-edma: configure tcd attr with separate src and dst settings

Set the edma tcd transfer attribution settings for the src and dst based
on their respective dma_addr values, to remove the previous 32-byte
alignment limitation in the EDMA memcpy function.

Signed-off-by: Han Xu <han.xu@nxp.com>
Reviewed-by: Frank Li <Frank.Li@nxp.com>
Link: https://patch.msgid.link/20251119163255.502070-1-han.xu@nxp.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Han Xu and committed by
Vinod Koul
1ecd8b60 cd3ba117

+33 -12
+33 -12
drivers/dma/fsl-edma-common.c
··· 206 206 mux_configure8(fsl_chan, muxaddr, ch_off, slot, enable); 207 207 } 208 208 209 - static unsigned int fsl_edma_get_tcd_attr(enum dma_slave_buswidth addr_width) 209 + static unsigned int fsl_edma_get_tcd_attr(enum dma_slave_buswidth src_addr_width, 210 + enum dma_slave_buswidth dst_addr_width) 210 211 { 211 - u32 val; 212 + u32 src_val, dst_val; 212 213 213 - if (addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) 214 - addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 214 + if (src_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) 215 + src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 216 + if (dst_addr_width == DMA_SLAVE_BUSWIDTH_UNDEFINED) 217 + dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; 215 218 216 - val = ffs(addr_width) - 1; 217 - return val | (val << 8); 219 + src_val = ffs(src_addr_width) - 1; 220 + dst_val = ffs(dst_addr_width) - 1; 221 + return dst_val | (src_val << 8); 218 222 } 219 223 220 224 void fsl_edma_free_desc(struct virt_dma_desc *vdesc) ··· 616 612 617 613 dma_buf_next = dma_addr; 618 614 if (direction == DMA_MEM_TO_DEV) { 615 + if (!fsl_chan->cfg.src_addr_width) 616 + fsl_chan->cfg.src_addr_width = fsl_chan->cfg.dst_addr_width; 619 617 fsl_chan->attr = 620 - fsl_edma_get_tcd_attr(fsl_chan->cfg.dst_addr_width); 618 + fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width, 619 + fsl_chan->cfg.dst_addr_width); 621 620 nbytes = fsl_chan->cfg.dst_addr_width * 622 621 fsl_chan->cfg.dst_maxburst; 623 622 } else { 623 + if (!fsl_chan->cfg.dst_addr_width) 624 + fsl_chan->cfg.dst_addr_width = fsl_chan->cfg.src_addr_width; 624 625 fsl_chan->attr = 625 - fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width); 626 + fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width, 627 + fsl_chan->cfg.dst_addr_width); 626 628 nbytes = fsl_chan->cfg.src_addr_width * 627 629 fsl_chan->cfg.src_maxburst; 628 630 } ··· 699 689 fsl_desc->dirn = direction; 700 690 701 691 if (direction == DMA_MEM_TO_DEV) { 692 + if (!fsl_chan->cfg.src_addr_width) 693 + fsl_chan->cfg.src_addr_width = fsl_chan->cfg.dst_addr_width; 702 694 fsl_chan->attr = 703 - fsl_edma_get_tcd_attr(fsl_chan->cfg.dst_addr_width); 695 + fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width, 696 + fsl_chan->cfg.dst_addr_width); 704 697 nbytes = fsl_chan->cfg.dst_addr_width * 705 698 fsl_chan->cfg.dst_maxburst; 706 699 } else { 700 + if (!fsl_chan->cfg.dst_addr_width) 701 + fsl_chan->cfg.dst_addr_width = fsl_chan->cfg.src_addr_width; 707 702 fsl_chan->attr = 708 - fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width); 703 + fsl_edma_get_tcd_attr(fsl_chan->cfg.src_addr_width, 704 + fsl_chan->cfg.dst_addr_width); 709 705 nbytes = fsl_chan->cfg.src_addr_width * 710 706 fsl_chan->cfg.src_maxburst; 711 707 } ··· 782 766 { 783 767 struct fsl_edma_chan *fsl_chan = to_fsl_edma_chan(chan); 784 768 struct fsl_edma_desc *fsl_desc; 769 + u32 src_bus_width, dst_bus_width; 770 + 771 + src_bus_width = min_t(u32, DMA_SLAVE_BUSWIDTH_32_BYTES, 1 << (ffs(dma_src) - 1)); 772 + dst_bus_width = min_t(u32, DMA_SLAVE_BUSWIDTH_32_BYTES, 1 << (ffs(dma_dst) - 1)); 785 773 786 774 fsl_desc = fsl_edma_alloc_desc(fsl_chan, 1); 787 775 if (!fsl_desc) ··· 798 778 799 779 /* To match with copy_align and max_seg_size so 1 tcd is enough */ 800 780 fsl_edma_fill_tcd(fsl_chan, fsl_desc->tcd[0].vtcd, dma_src, dma_dst, 801 - fsl_edma_get_tcd_attr(DMA_SLAVE_BUSWIDTH_32_BYTES), 802 - 32, len, 0, 1, 1, 32, 0, true, true, false); 781 + fsl_edma_get_tcd_attr(src_bus_width, dst_bus_width), 782 + src_bus_width, len, 0, 1, 1, dst_bus_width, 0, true, 783 + true, false); 803 784 804 785 return vchan_tx_prep(&fsl_chan->vchan, &fsl_desc->vdesc, flags); 805 786 }