From: Vinod Koul <vkoul@kernel.org>
To: Gustavo Pimentel <Gustavo.Pimentel@synopsys.com>
Cc: "linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"dmaengine@vger.kernel.org" <dmaengine@vger.kernel.org>,
Dan Williams <dan.j.williams@intel.com>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>,
Russell King <rmk+kernel@armlinux.org.uk>,
Joao Pinto <Joao.Pinto@synopsys.com>
Subject: Re: [RFC v6 1/6] dmaengine: Add Synopsys eDMA IP core driver
Date: Tue, 7 May 2019 15:26:54 +0530 [thread overview]
Message-ID: <20190507095654.GH16052@vkoul-mobl> (raw)
In-Reply-To: <305100E33629484CBB767107E4246BBB0A238D2C@de02wembxa.internal.synopsys.com>
On 07-05-19, 09:08, Gustavo Pimentel wrote:
> On Tue, May 7, 2019 at 6:3:10, Vinod Koul <vkoul@kernel.org> wrote:
> > On 06-05-19, 16:42, Gustavo Pimentel wrote:
> > > > > +static struct dma_async_tx_descriptor *
> > > > > +dw_edma_device_transfer(struct dw_edma_transfer *xfer)
> > > > > +{
> > > > > + struct dw_edma_chan *chan = dchan2dw_edma_chan(xfer->dchan);
> > > > > + enum dma_transfer_direction direction = xfer->direction;
> > > > > + phys_addr_t src_addr, dst_addr;
> > > > > + struct scatterlist *sg = NULL;
> > > > > + struct dw_edma_chunk *chunk;
> > > > > + struct dw_edma_burst *burst;
> > > > > + struct dw_edma_desc *desc;
> > > > > + u32 cnt;
> > > > > + int i;
> > > > > +
> > > > > + if ((direction == DMA_MEM_TO_DEV && chan->dir == EDMA_DIR_WRITE) ||
> > > > > + (direction == DMA_DEV_TO_MEM && chan->dir == EDMA_DIR_READ))
> > > > > + return NULL;
> > > > > +
> > > > > + if (xfer->cyclic) {
> > > > > + if (!xfer->xfer.cyclic.len || !xfer->xfer.cyclic.cnt)
> > > > > + return NULL;
> > > > > + } else {
> > > > > + if (xfer->xfer.sg.len < 1)
> > > > > + return NULL;
> > > > > + }
> > > > > +
> > > > > + if (!chan->configured)
> > > > > + return NULL;
> > > > > +
> > > > > + desc = dw_edma_alloc_desc(chan);
> > > > > + if (unlikely(!desc))
> > > > > + goto err_alloc;
> > > > > +
> > > > > + chunk = dw_edma_alloc_chunk(desc);
> > > > > + if (unlikely(!chunk))
> > > > > + goto err_alloc;
> > > > > +
> > > > > + src_addr = chan->config.src_addr;
> > > > > + dst_addr = chan->config.dst_addr;
> > > > > +
> > > > > + if (xfer->cyclic) {
> > > > > + cnt = xfer->xfer.cyclic.cnt;
> > > > > + } else {
> > > > > + cnt = xfer->xfer.sg.len;
> > > > > + sg = xfer->xfer.sg.sgl;
> > > > > + }
> > > > > +
> > > > > + for (i = 0; i < cnt; i++) {
> > > > > + if (!xfer->cyclic && !sg)
> > > > > + break;
> > > > > +
> > > > > + if (chunk->bursts_alloc == chan->ll_max) {
> > > > > + chunk = dw_edma_alloc_chunk(desc);
> > > > > + if (unlikely(!chunk))
> > > > > + goto err_alloc;
> > > > > + }
> > > > > +
> > > > > + burst = dw_edma_alloc_burst(chunk);
> > > > > + if (unlikely(!burst))
> > > > > + goto err_alloc;
> > > > > +
> > > > > + if (xfer->cyclic)
> > > > > + burst->sz = xfer->xfer.cyclic.len;
> > > > > + else
> > > > > + burst->sz = sg_dma_len(sg);
> > > > > +
> > > > > + chunk->ll_region.sz += burst->sz;
> > > > > + desc->alloc_sz += burst->sz;
> > > > > +
> > > > > + if (direction == DMA_DEV_TO_MEM) {
> > > > > + burst->sar = src_addr;
> > > >
> > > > We are device to mem, so src is peripheral.. okay
> > > >
> > > > > + if (xfer->cyclic) {
> > > > > + burst->dar = xfer->xfer.cyclic.paddr;
> > > > > + } else {
> > > > > + burst->dar = sg_dma_address(sg);
> > > > > + src_addr += sg_dma_len(sg);
> > > >
> > > > and we increment the src, doesn't make sense to me!
> > > >
> > > > > + }
> > > > > + } else {
> > > > > + burst->dar = dst_addr;
> > > > > + if (xfer->cyclic) {
> > > > > + burst->sar = xfer->xfer.cyclic.paddr;
> > > > > + } else {
> > > > > + burst->sar = sg_dma_address(sg);
> > > > > + dst_addr += sg_dma_len(sg);
> > > >
> > > > same here as well
> > >
> > > This is hard to explain in words...
> > > Well, in my perspective I want to transfer a piece of memory from the
> > > peripheral into local RAM
> >
> > Right and most of the case RAM address (sg) needs to increment whereas
> > peripheral is a constant one
> >
> > > Through the DMA client API I'll break this piece of memory in several
> > > small parts and add all into a list (scatter-gather), right?
> > > Each element of the scatter-gather has the sg_dma_address (in the
> > > DMA_DEV_TO_MEM case will be the destination address) and the
> > > corresponding size.
> >
> > Correct
> >
> > > However, I still need the other address (in the DMA_DEV_TO_MEM case will
> > > be the source address) for that small part of memory.
> > > Since I get that address from the config, I still need to increment the
> > > source address in the same proportion of the destination address, in
> > > other words, the increment will be the part size.
> >
> > I don't think so. Typically the device address is a FIFO, which does not
> > increment and you keep pushing data at same address. It is not a memory
>
> In my use case, it's a memory, perhaps that is what is causing this
> confusing.
> I'm copying "plain and flat" data from point A to B, with the
> particularity that the peripheral memory is always continuous and the CPU
> memory can be constituted by scatter-gather chunks of contiguous memory
Then why should it be slave transfer, it should be treated as memcpy
with src and dst sg lists..
--
~Vinod
next prev parent reply other threads:[~2019-05-07 9:57 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-23 18:30 [RFC v6 0/6] dmaengine: Add Synopsys eDMA IP driver (version 0) Gustavo Pimentel
2019-04-23 18:30 ` [RFC,v6,1/6] dmaengine: Add Synopsys eDMA IP core driver Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 1/6] " Gustavo Pimentel
2019-05-06 11:20 ` Vinod Koul
2019-05-06 16:42 ` Gustavo Pimentel
2019-05-07 5:03 ` Vinod Koul
2019-05-07 9:08 ` Gustavo Pimentel
2019-05-07 9:56 ` Vinod Koul [this message]
2019-04-23 18:30 ` [RFC,v6,2/6] dmaengine: Add Synopsys eDMA IP version 0 support Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 2/6] " Gustavo Pimentel
2019-05-06 11:56 ` Vinod Koul
2019-04-23 18:30 ` [RFC,v6,3/6] dmaengine: Add Synopsys eDMA IP version 0 debugfs support Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 3/6] " Gustavo Pimentel
2019-05-06 12:07 ` Vinod Koul
2019-05-06 17:09 ` Gustavo Pimentel
2019-05-07 5:11 ` Vinod Koul
2019-05-07 9:48 ` Gustavo Pimentel
2019-04-23 18:30 ` [RFC,v6,4/6] PCI: Add Synopsys endpoint EDDA Device ID Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 4/6] " Gustavo Pimentel
2019-04-23 18:30 ` [RFC,v6,5/6] dmaengine: Add Synopsys eDMA IP PCIe glue-logic Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 5/6] " Gustavo Pimentel
2019-04-23 18:30 ` [RFC,v6,6/6] MAINTAINERS: Add Synopsys eDMA IP driver maintainer Gustavo Pimentel
2019-04-23 18:30 ` [RFC v6 6/6] " Gustavo Pimentel
2019-05-06 8:12 ` [RFC v6 0/6] dmaengine: Add Synopsys eDMA IP driver (version 0) Gustavo Pimentel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190507095654.GH16052@vkoul-mobl \
--to=vkoul@kernel.org \
--cc=Gustavo.Pimentel@synopsys.com \
--cc=Joao.Pinto@synopsys.com \
--cc=andriy.shevchenko@linux.intel.com \
--cc=dan.j.williams@intel.com \
--cc=dmaengine@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=rmk+kernel@armlinux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox