Thread (74 messages) 74 messages, 5 authors, 2016-02-05

Re: PM regression with commit 5de85b9d57ab PM runtime re-init in v4.5-rc1

From: Ulf Hansson <hidden>
Date: 2016-02-03 16:24:55
Also in: linux-arm-kernel, linux-omap

On 3 February 2016 at 17:09, Tony Lindgren [off-list ref] wrote:
* Alan Stern [off-list ref] [160203 07:46]:
quoted
On Wed, 3 Feb 2016, Ulf Hansson wrote:
quoted
quoted
Let me summarize my understanding of this thread so far.

It looks like the omap3 code initializes hardware in ->probe() and
then it may return -EPROBE_DEFER due to some unmet dependencies.  In
that case the hardware is not reset to the previous state and the
runtime PM framework is left in the state that corresponds to the
current hardware state.  Before we had pm_runtime_reinit(), everything
worked as expected on the second ->probe() call, because things were
in sync then.
Correct!
Well not quite correct. After failed probe PM runtime is set to reset
state while hardware is still enabled.
Yes, but that's *after* pm_runtime_reinit() was added.

I think Rafael was thinking about how it worked *before*.
quoted
quoted
Before pm_runtime_reinit(), the failing probe case (-EPROBE_DEFER)
worked fine because the HW state and the runtime PM status was in
sync. The device was powered and the runtime PM status was RPM_ACTIVE.
quoted
The introduction of pm_runtime_reinit() changed the situation and now
effectively the hardware is required to be reset to the initial state
if -EPROBE_DEFER is to be returned too.
Not correct. The hardware doesn't need a reset as it stays powered
after a failed probe.
It is really best to disable the hardware after a failed probe
like we do with pm_runtime_put_sync_(suspend)() and pm_runtime_disable().

This is because there may never be another probe attempt and we want
to have unclaimed devices shut off (or idled) for PM.
I totally agree!
quoted
quoted
Instead, only the runtime PM status needs to be synchronized with the
HW state the next probe attempt.
In other words, the probe routine assumes the actual state is the same
as the PM status.  This may have been true before pm_runtime_reinit()
came along, but it's not true now.
quoted
In other words, when the PM domain's ->runtime_resume() callbacks gets
called due to a pm_runtime_get_sync() in the second probe attempt, it
may find that the HW is already powered and can return zero instead of
resetting it.
Certainly that should at least produce a warning in the hardware
specific implementation. It's a state mismatch between PM runtime
and the hardware specific implementation.

And as discussed, the problem does not exist as long as we understand
that we need to use pm_runtime_put_sync_suspend() if the driver has
set pm_runtime_use_autoidle(). Or else use the combination of
pm_runtime_dont_use_autoidle() and pm_runtime_put_sync().
Okay, so I understand that you decided to not pick up the omap hwmod
patch I posted.

If you want some further help in fixing the omap drivers, please just
tell me I am at your service. :-)

Also, we must not forget to also update their runtime PM calls in
their ->remove() callbacks, as those seems to suffer from the same
problem as in the -EPROBE_DEFER case.
quoted
What's wrong with going ahead and resetting the hardware anyway?
Nothing, unless a state needs to be maintained for things like GPIO
pins power memory :)

Regards,

Tony
Kind regards
Uffe
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help