svn commit: r250956 - projects/pmac_pmu/sys/kern

Justin Hibbits jhibbits at freebsd.org
Fri May 24 15:04:36 UTC 2013


On Fri, May 24, 2013 at 5:49 AM, John Baldwin <jhb at freebsd.org> wrote:

> On Thursday, May 23, 2013 11:58:31 pm Justin Hibbits wrote:
> > Author: jhibbits
> > Date: Fri May 24 03:58:31 2013
> > New Revision: 250956
> > URL: http://svnweb.freebsd.org/changeset/base/250956
> >
> > Log:
> >   Add multipass for suspend/resume.  This allows some devices to be
> resumed before
> >   others, even their peers, as required by PowerPC Mac hardware.
>
> I think this is a good start.  One question I have is why not reuse the
> pass number
> from the driver instead of stuffing it in the devclass?  (It is
> conceivable that
> different drivers with different passes might share a devclass even,
> though unlikely).
>
> That is, can't you use child->driver->dl_pass directly?  (If a child
> doesn't have a
> driver it can't suspend or resume anyway).
>

I was going to do this, but I don't see a dl_pass in the driver_t
structure, the pass number currently goes into the driverlink list, so this
was the quickest way to add and test this, as well as the most
nonintrusive.  I can change the driver_t definition to add a pass, though,
it's not difficult, but would change the module ABI, since the driver
definition is public.


> Also, can you explain the EAGAIN logic?  It's not obvious.  Is this how
> you are
> enforcing that already resumed drivers keep traversing their tree in
> subsequent
> passes (if not you need to deal with that in some fashion).
>

Yes, I use EAGAIN to mean "Make another pass at this".  I discussed it with
Warner at BSDCan and that seemed a simple solution.  Drivers that are
pass-aware can check bus_current_pass for the pass they want to resume
themselves on, and just call bus_generic_resume() if it's not their pass.
Drivers that are not pass aware would behave as they do now.


> I think we might want to be more explicit about forcing suspend and resume
> to
> traverse the tree for each pass.  The boot-time probe has a BUS_NEW_PASS
> callback
> it uses for this, and bus_generic_new_pass() is what it uses for that.  I
> think
> you might want to create BUS_SUSPEND_PASS and BUS_RESUME_PASS with generic
> versions similar to bus_generic_new_pass.  You would check the DF_SUSPENDED
> flag there to decide whether or not you wanted to call
> BUS_SUSPEND/RESUME_PASS
> or DEVICE_SUSPEND().
>

I did consider this as well.  However, I'm not certain what that would add
over this way.  I found this to be relatively nonintrusive and mostly
straight forward.

The other thing that makes this more complicated is that unlike
> probe/attach,
> we might need to actually ask the bus to suspend and resume the device so
> that
> the bus can do power management.  Right now this works because the bus
> devices
> suspend everything in one pass so they can order things correctly (e.g.
> pci_suspend()).  If we want to shut down some devices early we might
> consider
> having a new bus_if method which takes a child and handles suspending that
> specific child (it would call DEVICE_SUSPEND).  For PCI you might get
> something
> like this:
>
> int
> pci_suspend_child(device_t bus, device_t child)
> {
>         struct pci_devinfo *dinfo;
>         int error;
>
>         dinfo = device_get_ivars(child);
>         pci_cfg_save(child, dinfo, 0);
>         error = DEVICE_SUSPEND(child);
>         if (error)
>                 return (error);
>         if (pci_do_power_suspend)
>                 /* set power state for just this child to D3 */
>         return (error);
> }
>
> I need to think a bit more, but I think this is more of a correct model to
> handle
> passes, and will also be cleaner for suspend/resume in general.


I agree that adding the ability to suspend children independently is a good
idea.  I'm interested in any more thoughts you have on this, so we could
get it working for everything.

I do want to get this correct before merging into HEAD.  There are still
other bugs I need to fix, such as suspend/resume of the video (might need
to wait until the DRM2 branch is merged for the video reset, so this will
add some time, too).

- Justin


More information about the svn-src-projects mailing list