Message ID | 8d3ab7e2ba96563fe3495b32f60077fffb85307d.1597327623.git.gustavo.pimentel@synopsys.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | dmaengine: dw-edma: Fix scatter-gather address calculation | expand |
On 13-08-20, 16:14, Gustavo Pimentel wrote: > Fix the source and destination physical address calculation of a > peripheral device on scatter-gather implementation. > > This issue manifested during tests using a 64 bits architecture system. > The abnormal behavior wasn't visible before due to all previous tests > were done using 32 bits architecture system, that masked his effect. Applied, thanks > > Fixes: e63d79d1ffcd ("dmaengine: Add Synopsys eDMA IP core driver") > Dont leave empty line here > Cc: Joao Pinto <jpinto@synopsys.com> > Cc: stable@vger.kernel.org > Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com> > --- > drivers/dma/dw-edma/dw-edma-core.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c > index ed430ad..b971505 100644 > --- a/drivers/dma/dw-edma/dw-edma-core.c > +++ b/drivers/dma/dw-edma/dw-edma-core.c > @@ -405,7 +405,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > if (xfer->cyclic) { > burst->dar = xfer->xfer.cyclic.paddr; > } else { > - burst->dar = sg_dma_address(sg); > + burst->dar = dst_addr; > /* Unlike the typical assumption by other > * drivers/IPs the peripheral memory isn't > * a FIFO memory, in this case, it's a > @@ -413,14 +413,13 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > * and destination addresses are increased > * by the same portion (data length) > */ > - src_addr += sg_dma_len(sg); > } > } else { > burst->dar = dst_addr; > if (xfer->cyclic) { > burst->sar = xfer->xfer.cyclic.paddr; > } else { > - burst->sar = sg_dma_address(sg); > + burst->sar = src_addr; > /* Unlike the typical assumption by other > * drivers/IPs the peripheral memory isn't > * a FIFO memory, in this case, it's a > @@ -428,12 +427,14 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) > * and destination addresses are increased > * by the same portion (data length) > */ > - dst_addr += sg_dma_len(sg); > } > } > > - if (!xfer->cyclic) > + if (!xfer->cyclic) { > + src_addr += sg_dma_len(sg); > + dst_addr += sg_dma_len(sg); > sg = sg_next(sg); > + } > } > > return vchan_tx_prep(&chan->vc, &desc->vd, xfer->flags); > -- > 2.7.4
diff --git a/drivers/dma/dw-edma/dw-edma-core.c b/drivers/dma/dw-edma/dw-edma-core.c index ed430ad..b971505 100644 --- a/drivers/dma/dw-edma/dw-edma-core.c +++ b/drivers/dma/dw-edma/dw-edma-core.c @@ -405,7 +405,7 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) if (xfer->cyclic) { burst->dar = xfer->xfer.cyclic.paddr; } else { - burst->dar = sg_dma_address(sg); + burst->dar = dst_addr; /* Unlike the typical assumption by other * drivers/IPs the peripheral memory isn't * a FIFO memory, in this case, it's a @@ -413,14 +413,13 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) * and destination addresses are increased * by the same portion (data length) */ - src_addr += sg_dma_len(sg); } } else { burst->dar = dst_addr; if (xfer->cyclic) { burst->sar = xfer->xfer.cyclic.paddr; } else { - burst->sar = sg_dma_address(sg); + burst->sar = src_addr; /* Unlike the typical assumption by other * drivers/IPs the peripheral memory isn't * a FIFO memory, in this case, it's a @@ -428,12 +427,14 @@ dw_edma_device_transfer(struct dw_edma_transfer *xfer) * and destination addresses are increased * by the same portion (data length) */ - dst_addr += sg_dma_len(sg); } } - if (!xfer->cyclic) + if (!xfer->cyclic) { + src_addr += sg_dma_len(sg); + dst_addr += sg_dma_len(sg); sg = sg_next(sg); + } } return vchan_tx_prep(&chan->vc, &desc->vd, xfer->flags);
Fix the source and destination physical address calculation of a peripheral device on scatter-gather implementation. This issue manifested during tests using a 64 bits architecture system. The abnormal behavior wasn't visible before due to all previous tests were done using 32 bits architecture system, that masked his effect. Fixes: e63d79d1ffcd ("dmaengine: Add Synopsys eDMA IP core driver") Cc: Joao Pinto <jpinto@synopsys.com> Cc: stable@vger.kernel.org Signed-off-by: Gustavo Pimentel <gustavo.pimentel@synopsys.com> --- drivers/dma/dw-edma/dw-edma-core.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)