Thread (39 messages) 39 messages, 2 authors, 2020-02-03

Re: [PATCH v6 11/16] dmaengine: tegra-apb: Keep clock enabled only during of DMA transfer

From: Dmitry Osipenko <digetx@gmail.com>
Date: 2020-02-03 16:24:20
Also in: linux-tegra, lkml

03.02.2020 14:37, Jon Hunter пишет:
On 01/02/2020 15:13, Dmitry Osipenko wrote:
quoted
31.01.2020 17:22, Dmitry Osipenko пишет:
quoted
31.01.2020 12:02, Jon Hunter пишет:
quoted
On 30/01/2020 20:04, Dmitry Osipenko wrote:

...
quoted
quoted
quoted
The tegra_dma_stop() should put RPM anyways, which is missed in yours
sample. Please see handle_continuous_head_request().
Yes and that is deliberate. The cyclic transfers the transfers *should*
not stop until terminate_all is called. The tegra_dma_stop in
handle_continuous_head_request() is an error condition and so I am not
sure it is actually necessary to call pm_runtime_put() here.
But then tegra_dma_stop() shouldn't unset the "busy" mark.
True.
quoted
quoted
quoted
I'm also finding the explicit get/put a bit easier to follow in the
code, don't you think so?
I can see that, but I was thinking that in the case of cyclic transfers,
it should only really be necessary to call the get/put at the beginning
and end. So in my mind there should only be two exit points which are
the ISR handler for SG and terminate_all for SG and cyclic.
Alright, I'll update this patch.
Hmmm ... I am wondering if we should not mess with that and leave how
you have it.
I took another look and seems my current v6 should be more correct because:

1. If "busy" is unset in tegra_dma_stop(), then the RPM should be put
there since tegra_dma_terminate_all() won't put RPM in this case:

	if (!tdc->busy)
		goto skip_dma_stop;

2. We can't move the "busy" unsetting into the terminate because then
tegra_dma_stop() will be invoked twice. Although, one option could be to
remove the tegra_dma_stop() from the error paths of
handle_continuous_head_request(), but I'm not sure that this is correct
to do.
Jon, I realized that my v6 variant is wrong too because
tegra_dma_terminate_all() -> tdc->isr_handler() will put RPM, and thus,
the RPM enable-count will be wrecked in this case.
Did you see my other suggestion to move the pm_runtime_put() outside of
tegra_dma_stop?
Yes, but seems I skimmed too quickly through the lines and failed to
recognize the point you made.
There are only a few call sites for tegra_dma_stop and
so if we call pm_runtime_put() after calling tegra_dma_stop this should
simplify matters.
This is somewhat similar to what I made in the v7. Instead of adding
pm_runtime_put() after each tegra_dma_stop(), I removed the
tegra_dma_stop().

Looking at it once again, perhaps indeed it will be better to leave the
relevant tegra_dma_stop() in place (the irrelevant could be removed).

Please take a look at the v7, I'll drop the "[PATCH v7 13/19] dmaengine:
tegra-apb: Don't stop cyclic DMA in a case of error condition" and make
v8 after yours review of the v7. Thanks in advance!
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help