Message ID | 1432168449-18850-1-git-send-email-k.kozlowski@samsung.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Hi Krzysztof, On 05/20/2015 07:34 PM, Krzysztof Kozlowski wrote: > The pl330 device could hang infinitely on certain boards when DMA > channels are terminated. > > It was caused by lack of runtime resume when executing > pl330_terminate_all() which calls the _stop() function. _stop() accesses > device register and can loop infinitely while checking for device state. > > The hang was confirmed by Dinh Nguyen on Altera SOCFPGA Cyclone V > board during boot. It can be also triggered with: > > $ echo 1 > /sys/module/dmatest/parameters/iterations > $ echo dma1chan0 > /sys/module/dmatest/parameters/channel > $ echo 1 > /sys/module/dmatest/parameters/run > $ sleep 1 > $ cat /sys/module/dmatest/parameters/run > > Reported-by: Dinh Nguyen <dinguyen@opensource.altera.com> > Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> > Fixes: ae43b3289186 ("ARM: 8202/1: dmaengine: pl330: Add runtime Power Management support v12") > Cc: <stable@vger.kernel.org> > Cc: Dinh Nguyen <dinguyen@opensource.altera.com> > --- > drivers/dma/pl330.c | 3 +++ > 1 file changed, 3 insertions(+) > > diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c > index a7d9d3029b14..340f9e607cd8 100644 > --- a/drivers/dma/pl330.c > +++ b/drivers/dma/pl330.c > @@ -2127,6 +2127,7 @@ static int pl330_terminate_all(struct dma_chan *chan) > struct pl330_dmac *pl330 = pch->dmac; > LIST_HEAD(list); > > + pm_runtime_get_sync(pl330->ddma.dev); > spin_lock_irqsave(&pch->lock, flags); > spin_lock(&pl330->lock); > _stop(pch->thread); > @@ -2151,6 +2152,8 @@ static int pl330_terminate_all(struct dma_chan *chan) > list_splice_tail_init(&pch->work_list, &pl330->desc_pool); > list_splice_tail_init(&pch->completed_list, &pl330->desc_pool); > spin_unlock_irqrestore(&pch->lock, flags); > + pm_runtime_mark_last_busy(pl330->ddma.dev); > + pm_runtime_put_autosuspend(pl330->ddma.dev); > > return 0; > } > This patch indeeds fixes the pl330 DMA issue for the SoCFPGA platform. The multi_v7_defconfig now completely boots on the platform with this patch. Feel free to add: Tested-by: Dinh Nguyen <dinguyen@opensource.altera.com> Thanks, Dinh -- 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 http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/dma/pl330.c b/drivers/dma/pl330.c index a7d9d3029b14..340f9e607cd8 100644 --- a/drivers/dma/pl330.c +++ b/drivers/dma/pl330.c @@ -2127,6 +2127,7 @@ static int pl330_terminate_all(struct dma_chan *chan) struct pl330_dmac *pl330 = pch->dmac; LIST_HEAD(list); + pm_runtime_get_sync(pl330->ddma.dev); spin_lock_irqsave(&pch->lock, flags); spin_lock(&pl330->lock); _stop(pch->thread); @@ -2151,6 +2152,8 @@ static int pl330_terminate_all(struct dma_chan *chan) list_splice_tail_init(&pch->work_list, &pl330->desc_pool); list_splice_tail_init(&pch->completed_list, &pl330->desc_pool); spin_unlock_irqrestore(&pch->lock, flags); + pm_runtime_mark_last_busy(pl330->ddma.dev); + pm_runtime_put_autosuspend(pl330->ddma.dev); return 0; }
The pl330 device could hang infinitely on certain boards when DMA channels are terminated. It was caused by lack of runtime resume when executing pl330_terminate_all() which calls the _stop() function. _stop() accesses device register and can loop infinitely while checking for device state. The hang was confirmed by Dinh Nguyen on Altera SOCFPGA Cyclone V board during boot. It can be also triggered with: $ echo 1 > /sys/module/dmatest/parameters/iterations $ echo dma1chan0 > /sys/module/dmatest/parameters/channel $ echo 1 > /sys/module/dmatest/parameters/run $ sleep 1 $ cat /sys/module/dmatest/parameters/run Reported-by: Dinh Nguyen <dinguyen@opensource.altera.com> Signed-off-by: Krzysztof Kozlowski <k.kozlowski@samsung.com> Fixes: ae43b3289186 ("ARM: 8202/1: dmaengine: pl330: Add runtime Power Management support v12") Cc: <stable@vger.kernel.org> Cc: Dinh Nguyen <dinguyen@opensource.altera.com> --- drivers/dma/pl330.c | 3 +++ 1 file changed, 3 insertions(+)