All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Vinod Koul <vkoul@kernel.org>
Cc: dmaengine@vger.kernel.org, Michal Simek <michal.simek@xilinx.com>,
	Hyun Kwon <hyun.kwon@xilinx.com>,
	Tejas Upadhyay <tejasu@xilinx.com>,
	Satish Kumar Nagireddy <SATISHNA@xilinx.com>,
	Peter Ujfalusi <peter.ujfalusi@ti.com>
Subject: Re: [PATCH v6 4/6] dmaengine: xilinx: dpdma: Add the Xilinx DisplayPort DMA engine driver
Date: Thu, 16 Jul 2020 16:46:25 +0300	[thread overview]
Message-ID: <20200716134625.GC5960@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20200716052107.GC55478@vkoul-mobl>

Hi Vinod,

On Thu, Jul 16, 2020 at 10:51:07AM +0530, Vinod Koul wrote:
> On 16-07-20, 03:41, Laurent Pinchart wrote:
> > On Wed, Jul 15, 2020 at 04:29:06PM +0530, Vinod Koul wrote:
> > > On 08-07-20, 23:19, Laurent Pinchart wrote:
> > > 
> > > > +static struct dma_async_tx_descriptor *
> > > > +xilinx_dpdma_prep_interleaved_dma(struct dma_chan *dchan,
> > > > +				  struct dma_interleaved_template *xt,
> > > > +				  unsigned long flags)
> > > > +{
> > > > +	struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan);
> > > > +	struct xilinx_dpdma_tx_desc *desc;
> > > > +
> > > > +	if (xt->dir != DMA_MEM_TO_DEV)
> > > > +		return NULL;
> > > > +
> > > > +	if (!xt->numf || !xt->sgl[0].size)
> > > > +		return NULL;
> > > > +
> > > > +	if (!(flags & DMA_PREP_REPEAT))
> > > > +		return NULL;
> > > 
> > > is the hw be not capable of supporting single interleave txn?
> > 
> > I haven't checked if that would be possible to implement, as there's
> > zero use case for that. This DMA engine is tied to one particular
> > display engine, and there's no use for non-repeated transfers for
> > display. Even if I were to implement this (assuming the hardware would
> > support it), I would have no way to test it.
> 
> Okay
> 
> > > Also as replied the comment to Peter, we should check chan->running here
> > > and see that DMA_PREP_LOAD_EOT is set. There can still be a case where
> > > descriptor is submitted but not issued causing you to miss, but i guess
> > > that might be overkill for your scenarios
> > 
> > I can instead check for DMA_PREP_LOAD_EOT unconditionally, as that's all
> > that is supported. Doing anything more complex would be overkill. Please
> > confirm this is fine with you.
> 
> Agreed
> 
> > > > +static int xilinx_dpdma_config(struct dma_chan *dchan,
> > > > +			       struct dma_slave_config *config)
> > > > +{
> > > > +	struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan);
> > > > +	unsigned long flags;
> > > > +
> > > > +	/*
> > > > +	 * The destination address doesn't need to be specified as the DPDMA is
> > > > +	 * hardwired to the destination (the DP controller). The transfer
> > > > +	 * width, burst size and port window size are thus meaningless, they're
> > > > +	 * fixed both on the DPDMA side and on the DP controller side.
> > > > +	 */
> > > 
> > > But we are not doing peripheral transfers, this is memory to memory
> > > (interleave) here right?
> > 
> > No, it's memory to peripheral.
> 
> Ok, the DMA_SLAVE makes sense
> 
> > > > +
> > > > +	spin_lock_irqsave(&chan->lock, flags);
> > > > +
> > > > +	/*
> > > > +	 * Abuse the slave_id to indicate that the channel is part of a video
> > > > +	 * group.
> > > > +	 */
> > > > +	if (chan->id >= ZYNQMP_DPDMA_VIDEO0 && chan->id <= ZYNQMP_DPDMA_VIDEO2)
> > > > +		chan->video_group = config->slave_id != 0;
> > > 
> > > Okay looking closely here, the video_group is used to tie different
> > > channels together to ensure sync operation is that right?
> > 
> > Correct.
> 
> So can you help me understand what is the usage here? I am trying to see
> if we can come with a better way to handle this.

When transfering a video frame stored in NV12, two DMA channels are
needed, one for the Y plane and one for the C plane. The two planes are
stored in two separate memory locations. The two channels need to
operate in sync, so the driver starts them at the hardware level when
they're all started at the software level. The video_group is used to
tell the DMA engine driver if the channels are used in that mode.

> > > And this seems to be only reason for DMA_SLAVE capabilities, i don't
> > > think I saw slave ops
> > 
> > Which ops are you talking about ? device_prep_slave_sg ? That's not
> > applicable for this device as the hardware doesn't support scatterlists.
> > Could you please explain any issue you see here in more details ?
> 
> I was assuming that interleave is memcpy operation and dma_slave_config
> is used for video_group only so DMA_SLAVE might not have been correct.
> 
> But looks like it is a peripheral. We typically pass dma configuration
> which seems unused here, which seems fine as things are tied to
> peripheral and not configurable.

Yes, everything is hardcoded at the hardware level on both the DMA
engine and the display controller side, so there's nothing to configure.

> > > > +static int xilinx_dpdma_terminate_all(struct dma_chan *dchan)
> > > > +{
> > > > +	struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan);
> > > > +	struct xilinx_dpdma_device *xdev = chan->xdev;
> > > > +	LIST_HEAD(descriptors);
> > > > +	unsigned long flags;
> > > > +	unsigned int i;
> > > > +
> > > > +	/* Pause the channel (including the whole video group if applicable). */
> > > > +	if (chan->video_group) {
> > > > +		for (i = ZYNQMP_DPDMA_VIDEO0; i <= ZYNQMP_DPDMA_VIDEO2; i++) {
> > > > +			if (xdev->chan[i]->video_group &&
> > > > +			    xdev->chan[i]->running) {
> > > > +				xilinx_dpdma_chan_pause(xdev->chan[i]);
> > > 
> > > so there is no terminate here, only pause?
> > 
> > Pausing the channel is the first step of termination, the second and
> > third steps (waiting for oustanding transfers to complete and disabling
> > the hardware) are synchronous and handled in xilinx_dpdma_chan_stop(),
> > called from the .device_synchronize() handler
> > (xilinx_dpdma_synchronize()).
> > 
> > Could you please confirm that the only change required in this patch is
> > to check DMA_PREP_LOAD_EOT in xilinx_dpdma_prep_interleaved_dma() and
> > that there's no other issue ? I've sent too many versions of this series
> > already and I'd like to minimize the number of new cycles.
> 
> Yes that is only thing atm. Also I think we should rethink how we are
> tying the channels and can we do a better way to handle that

Thanks. I'll make the necessary changes and submit a new version. If you
think a new API is needed to tie channels together, can it be developed
on top ?

-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2020-07-16 13:46 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-08 20:19 [PATCH v6 0/6] dma: Add Xilinx ZynqMP DPDMA driver Laurent Pinchart
2020-07-08 20:19 ` [PATCH v6 1/6] dt: bindings: dma: xilinx: dpdma: DT bindings for Xilinx DPDMA Laurent Pinchart
2020-07-08 20:19 ` [PATCH v6 2/6] dmaengine: virt-dma: Use lockdep to check locking requirements Laurent Pinchart
2020-07-09 13:07   ` Peter Ujfalusi
2020-07-11 19:53     ` Laurent Pinchart
2020-07-08 20:19 ` [PATCH v6 3/6] dmaengine: Add support for repeating transactions Laurent Pinchart
2020-07-09 13:25   ` Peter Ujfalusi
2020-07-08 20:19 ` [PATCH v6 4/6] dmaengine: xilinx: dpdma: Add the Xilinx DisplayPort DMA engine driver Laurent Pinchart
2020-07-09 13:21   ` Peter Ujfalusi
2020-07-11 22:16     ` Laurent Pinchart
2020-07-15  6:54       ` Vinod Koul
2020-07-15 10:59   ` Vinod Koul
2020-07-16  0:41     ` Laurent Pinchart
2020-07-16  5:21       ` Vinod Koul
2020-07-16 13:46         ` Laurent Pinchart [this message]
2020-07-17  5:59           ` Vinod Koul
2020-07-08 20:19 ` [PATCH v6 5/6] dmaengine: xilinx: dpdma: Add debugfs support Laurent Pinchart
2020-07-15 11:01   ` Vinod Koul
2020-07-16  0:42     ` Laurent Pinchart
2020-07-08 20:19 ` [PATCH v6 6/6] arm64: dts: zynqmp: Add DPDMA node Laurent Pinchart

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=20200716134625.GC5960@pendragon.ideasonboard.com \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=SATISHNA@xilinx.com \
    --cc=dmaengine@vger.kernel.org \
    --cc=hyun.kwon@xilinx.com \
    --cc=michal.simek@xilinx.com \
    --cc=peter.ujfalusi@ti.com \
    --cc=tejasu@xilinx.com \
    --cc=vkoul@kernel.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.