Thread (27 messages) 27 messages, 5 authors, 2018-06-14

RE: [v5 2/6] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs

From: Wen He <hidden>
Date: 2018-06-11 08:14:42
Also in: dmaengine

-----Original Message-----
From: dmaengine-owner@vger.kernel.org
[mailto:dmaengine-owner@vger.kernel.org] On Behalf Of Vinod
Sent: 2018年6月6日 0:29
To: Wen He <redacted>
Cc: dmaengine@vger.kernel.org; robh+dt@kernel.org;
devicetree@vger.kernel.org; Leo Li [off-list ref]; Jiafei Pan
[off-list ref]; Jiaheng Fan [off-list ref]
Subject: Re: [v5 2/6] dmaengine: fsl-qdma: Add qDMA controller driver for
Layerscape SoCs

On 31-05-18, 01:58, Wen He wrote:
quoted
quoted
quoted
quoted
quoted
quoted
quoted
+static void fsl_qdma_issue_pending(struct dma_chan *chan) {
+	struct fsl_qdma_chan *fsl_chan = to_fsl_qdma_chan(chan);
+	struct fsl_qdma_queue *fsl_queue = fsl_chan->queue;
+	unsigned long flags;
+
+	spin_lock_irqsave(&fsl_queue->queue_lock, flags);
+	spin_lock(&fsl_chan->vchan.lock);
+	if (vchan_issue_pending(&fsl_chan->vchan))
+		fsl_qdma_enqueue_desc(fsl_chan);
+	spin_unlock(&fsl_chan->vchan.lock);
+	spin_unlock_irqrestore(&fsl_queue->queue_lock, flags);
why do we need two locks, and since you are doing vchan why
should you add your own lock on top
Yes, we need two locks.
As you know, the QDMA support multiple virtualized blocks for
multi-core
support.
quoted
so we need to make sure that muliti-core access issues.
but why cant you use vchan lock for all?
We can't only use vchan lock for all. otherwise enqueue action
will be
interrupted.

I think it is possible to use only vchan lock
I tried that if I use only vchan lock then qdma will be can't work.
Do you have a other good idea?
can you explain the scenario...
All right. 
When DMA client start transmit, will be call function dma_async_issue_pending(), the dma_async_issue_pending() call the hook pointer
device_issue_pending. The function fsl_qdma_issue_pending() is used to fill the device_issue_pending field.

The function fsl_qdma_issue_pending() call the function fsl_qdma_enqueue_desc().

The function fsl_qdma_enqueue_desc() includes 3 steps.
1. peek at the next descriptor to be processed.
2. if next descriptor exist, then insert to linked list(used to get it when this descriptor transfer complete).
3. if next descriptor exist, then writing to qdma.

In above steps, we will use struct fsl_qdma_chan and struct fsl_qdma_queue, so we need two locks to protected it.

Best Regards,
Wen
--
~Vinod
--
To unsubscribe from this list: send the line "unsubscribe dmaengine" in the
body of a message to majordomo@vger.kernel.org More majordomo info at
https://emea01.safelinks.protection.outlook.com/?url=http%3A%2F%2Fvger.
kernel.org%2Fmajordomo-info.html&data=02%7C01%7Cwen.he_1%40nxp.co
m%7C0f7cc533d6bf4de067d008d5cb01742c%7C686ea1d3bc2b4c6fa92cd99
c5c301635%7C0%7C0%7C636638129466650321&sdata=zrc0Pf%2Bq0pqixqm
LC5jhjLvvV5MiSUM68XtanJxgMbQ%3D&reserved=0
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help