Re: [PATCH v2 2/4] dma: xilinx: dpdma: Add the Xilinx DisplayPort DMA engine driver

Vinod Koul
2019-11-09T17:59:15Z

Hi Laurent,

it is dmaengine: xxx not dma: xxx :-)

On 07-11-19, 04:13, Laurent Pinchart wrote:

> +/*
> + * DPDMA descriptor placement
> + * --------------------------
> + * DPDMA descritpor life time is described with following placements:
> + *
> + * allocated_desc -> submitted_desc -> pending_desc -> active_desc -> done_list
> + *
> + * Transition is triggered as following:
> + *
> + * -> allocated_desc : a descriptor allocation
> + * allocated_desc -> submitted_desc: a descriptor submission
> + * submitted_desc -> pending_desc: request to issue pending a descriptor
> + * pending_desc -> active_desc: VSYNC intr when a desc is scheduled to DPDMA
> + * active_desc -> done_list: VSYNC intr when DPDMA switches to a new desc

Well this tells me driver is not using vchan infrastructure, the
drivers/dma/virt-dma.c is common infra which does pretty decent list
management and drivers do not need to open code this.

Please convert the driver to use virt-dma

> +static struct dma_async_tx_descriptor *
> +xilinx_dpdma_chan_prep_slave_sg(struct xilinx_dpdma_chan *chan,
> + struct scatterlist *sgl)
> +{
> + struct xilinx_dpdma_tx_desc *tx_desc;
> + struct xilinx_dpdma_sw_desc *sw_desc, *last = NULL;
> +
> + if (chan->allocated_desc)
> + return &chan->allocated_desc->async_tx;

This seems wrong, you are supposed to prepare a new descriptor based on
sg list provided, returning allocated without preparing seems wrong to
me!

> +static dma_cookie_t xilinx_dpdma_tx_submit(struct dma_async_tx_descriptor *tx)
> +{
> + struct xilinx_dpdma_chan *chan = to_xilinx_chan(tx->chan);
> + struct xilinx_dpdma_tx_desc *tx_desc = to_dpdma_tx_desc(tx);
> + struct xilinx_dpdma_sw_desc *sw_desc;
> + dma_cookie_t cookie;
> + unsigned long flags;
> +
> + spin_lock_irqsave(&chan->lock, flags);
> +
> + if (chan->submitted_desc) {
> + cookie = chan->submitted_desc->async_tx.cookie;

submit should give a new cookie not for already submitted descriptor!

> + goto out_unlock;
> + }
> +
> + cookie = dma_cookie_assign(&tx_desc->async_tx);

yes this is correct :-)

> +
> + /*
> + * Assign the cookie to descriptors in this transaction. Only 16 bit
> + * will be used, but it should be enough.
> + */
> + list_for_each_entry(sw_desc, &tx_desc->descriptors, node)
> + sw_desc->hw.desc_id = cookie;
> +
> + if (tx_desc != chan->allocated_desc)
> + dev_err(chan->xdev->dev, "desc != allocated_desc\n");
> + else
> + chan->allocated_desc = NULL;
> + chan->submitted_desc = tx_desc;

submitted should be a list, we can submit multiple...

> +static void xilinx_dpdma_issue_pending(struct dma_chan *dchan)
> +{
> + struct xilinx_dpdma_chan *chan = to_xilinx_chan(dchan);
> +
> + xilinx_dpdma_chan_start(chan);

what if channel is already started?
--
~Vinod