Re: [RFC] Linux Power Management

David Brownell
2005-05-08T18:35:56Z

[-- Attachment #1: Type: text/plain, Size: 4737 bytes --]

On Wednesday 04 May 2005 9:39 pm, Adam Belay wrote:
> On Tue, May 03, 2005 at 11:52:45AM -0400, Alan Stern wrote:
> > On Tue, 3 May 2005, Adam Belay wrote:
> >
> > You said explicitly that power devices may or may not coincide with struct
> > devices in the driver model. Why do you want to do this? Why not insist
> > that power devices _are_ struct devices? It would make many things a lot
> > easier and allow much more code sharing plus reduction of memory usage.
> > (Kobjects aren't cheap, especially for embedded systems.)
>
> I think you make a good point. My original intention here was to support
> strange power relationships that do not match the device tree.

In fact, that's why "struct dev_pm_info" has a "pm_parent". Today.
And device_pm_set_parent() ... which I don't necessarily think would
work, if anyone were to use it. That information is invisible through
sysfs, note!

Hmm, I think I'll post a patch I've had sitting around for a while,
to at least report violation of the relevant integrity constraints.
It doesn't solve the problem that a pm_parent won't automatically
know about its children though, for example. That's something I
liked about Adam's direction: formalizing that relationship.

> However, I
> don't think this will be common, and not every layer in between the tree
> has to participate. So, psuedo-logical device layers like we're seeing in the
> PCI express bus driver could just be skipped past. I'll change my plans to
> reflect this.

When you "don't think this will be common" you're basically assuming
Linux won't be used on embedded hardware. Unhealthy assumption!!

It's **really easy** and in fact natural for hardware designers to
provide power management relationships that don't directly match
the logical bus structure that software likes to use. Chips to
switch power are in widespread use, and the GPIO lines used to drive
them don't always come from a CPU (where they'd probably be always
available unless the CPU itself suspends).

The way those systems manage to work at all on 2.6 relies on several
things, in the systems I've seen.

* System initialization order changes like subsys_initcall for
I2C not device_initcall, also for the power switching device.
That way, power can be turned on by board-specific logic in
drivers for either (a) the power switching devices, or even
better (b) the device whose power is switched knows how
to ask the power-switch driver to give it power. (Since
they can rely on the switching device to be "live" by then.)

* Despite the fact that sysfs exposes power/state, nobody is
actually using that for anything except very selective
testing ... so the deep brokenneses that _could_ happen is
quite unlikely; we don't expect userspace to selectively
suspend a parent without having suspended its child.
(The device drivers use selective suspend all the time,
but they know not to do such stuff.)

You'll observe that this entirely bypasses the driver model
PM structure, using init sequencing instead. So until someone
tries to use sysfs for selective suspend, it can't matter
that some I2C device is actually controlling power for every
device in the system (CPU included!) yet isn't the driver
model parent of any one of them...

The fact that these systems can even boot under Linux relies on
board-specific logic to handle the things that the pmcore model
was allegedly "designed to handle". Arguably it's better to have
code in driver X that just says "driver Y, please set GPIO 3 high"
since anything less direct is just wasted code ... but if so, then
what's the relevance of pmcore here? What _should_ pmcore do for
normal board configurations like that?

> > Anything else? This list in itself doesn't require much in the way of
> > policy management.
>
> Wake devices would also require userspace configuration of policy.

I'll definitely repost my patch adding that policy support; I've got
it updated, after all! And the PCI-E changes to access PCI config
space "early" seem to have laid to rest concerns about whether that's
safe to do, so that simplifies the PCI stuff too.

> I appreciate your comments. To sumarize, I'd like to introduce power
> resources into our current PM model and add a concept of device power states.

That is, distinct from dev_pm_info.power_state? That notion is rather
bogus, and AFAICT is there _only_ to support sysfs selective suspend.

And the sysfs support for selective suspend is pretty bogus -- it doesn't
do recursion, dev_pm_info.power_state updates are iffy, and it obviously
can't preserve the pm parent/child relationships -- that whole area does
need much work/replacement.

- Dave