Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 May 2013 14:34:37 -0400
From:      Justin Hibbits <jrh29@alumni.cwru.edu>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-arch@freebsd.org
Subject:   Re: late suspend/early resume
Message-ID:  <CAHSQbTBAaeavgnYeTepiw4G59ApUym=9RJy5xRDPrfmLNoYRUQ@mail.gmail.com>
In-Reply-To: <519369C4.6060402@FreeBSD.org>
References:  <CAHSQbTBNjrx=9DT7vk29D=Y%2BOK0qV=Ld4qN-sxy%2B8_OONazKAA@mail.gmail.com> <AE98E779-E22B-434D-9BEE-BF66241BB2E6@bsdimp.com> <51913B7D.1040801@freebsd.org> <288C9B9E-E943-4C5B-BCFB-15B721CBE94C@bsdimp.com> <CAHSQbTCEOfCH5tLeWgP4gPVbsBwDKLKBboQ2d74npkQomoJJJQ@mail.gmail.com> <519369C4.6060402@FreeBSD.org>

next in thread | previous in thread | raw e-mail | index | archive | help
--089e013c6200674aa504dcda1e10
Content-Type: text/plain; charset=ISO-8859-1

On Wed, May 15, 2013 at 6:56 AM, John Baldwin <jhb@freebsd.org> wrote:

> On 5/14/13 1:14 PM, Justin Hibbits wrote:
> > You are right that the late suspend could lead to silly proliferation,
> and
> > an ordered list is much better, but another API would need to be added to
> > do that as well.
> >
> > My north bridge is first in the top list of the tree, right under the
> > nexus, so to suspend it last I wrote the nexus suspend to traverse its
> > children in reverse. The problem comes that the clock controller is
> under a
> > later PCI bus, not even the immediate following one, and the north bridge
> > children are i2c devices, so suspending them after their clock head away
> is
> > problematic.  We can discuss this more at bsdcan, where it may be easier
> to
> > describe. But essentially I need the north bridge and that pesky clock
> > controller to be the last to suspend and the first to resume. I guess we
> > can take this as the starting discussion for modeling this relationship
> on
> > all platforms, since you mention it is common in embedded platforms.
>
> I think you can do this by having a notion of passes with drivers having
> a suspend pass level and doing passes over the tree suspending devices
> at each pass level and then walking the passes back up in reverse during
> resume.  You could borrow from the multipass stuff used on probe/attach
> for this.
>
> --
> John Baldwin


Here's a (very) rough cut of what I think you're getting at.  It uses the
existing pass identifier to convey the current pass number, and walks the
pass in reverse for suspend, and forwards for resume.  However, I can't
stress enough, that I only compiled it, I have no hardware here at BSDCan
to test, so I have no idea if it will work as expected.

The basic idea is to start at the last pass number, and any device can
suspend and resume if able, or can check and return EAGAIN if it's not
ready to suspend itself (it can still suspend its children if it wants).  I
could also add to bus_generic_resume() a check for the device's driver's
pass wrt bus_current_pass, as in the probe code.

Is this what you're thinking?

- Justin

--089e013c6200674aa504dcda1e10
Content-Type: application/octet-stream; name="suspend.diff"
Content-Disposition: attachment; filename="suspend.diff"
Content-Transfer-Encoding: base64
X-Attachment-Id: f_hgs9y82m0

SW5kZXg6IHN5cy9rZXJuL3N1YnJfYnVzLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc3lzL2tlcm4vc3Vicl9i
dXMuYwkocmV2aXNpb24gMjQ4MjU1KQorKysgc3lzL2tlcm4vc3Vicl9idXMuYwkod29ya2luZyBj
b3B5KQpAQCAtMTMwLDYgKzEzMCw3IEBACiAjZGVmaW5lCURGX0RPTkVOT01BVENICTB4MjAJCS8q
IGRvbid0IGV4ZWN1dGUgREVWSUNFX05PTUFUQ0ggYWdhaW4gKi8KICNkZWZpbmUJREZfRVhURVJO
QUxTT0ZUQyAweDQwCQkvKiBzb2Z0YyBub3QgYWxsb2NhdGVkIGJ5IHVzICovCiAjZGVmaW5lCURG
X1JFQklECTB4ODAJCS8qIENhbiByZWJpZCBhZnRlciBhdHRhY2ggKi8KKyNkZWZpbmUgREZfU1VT
UEVOREVECTB4MTAwCQkvKiBEZXZpY2UgaXMgc3VzcGVuZGVkLiAqLwogCXVfaW50CW9yZGVyOwkJ
CS8qKjwgb3JkZXIgZnJvbSBkZXZpY2VfYWRkX2NoaWxkX29yZGVyZWQoKSAqLwogCXZvaWQJKml2
YXJzOwkJCS8qKjwgaW5zdGFuY2UgdmFyaWFibGVzICAqLwogCXZvaWQJKnNvZnRjOwkJCS8qKjwg
Y3VycmVudCBkcml2ZXIncyB2YXJpYWJsZXMgICovCkBAIC0zNTMyLDE5ICszNTMzLDI5IEBACiBi
dXNfZ2VuZXJpY19zdXNwZW5kKGRldmljZV90IGRldikKIHsKIAlpbnQJCWVycm9yOworCWludAkJ
YWdhaW4gPSAwOwogCWRldmljZV90CWNoaWxkLCBjaGlsZDI7CiAKIAlUQUlMUV9GT1JFQUNIKGNo
aWxkLCAmZGV2LT5jaGlsZHJlbiwgbGluaykgewotCQllcnJvciA9IERFVklDRV9TVVNQRU5EKGNo
aWxkKTsKLQkJaWYgKGVycm9yKSB7Ci0JCQlmb3IgKGNoaWxkMiA9IFRBSUxRX0ZJUlNUKCZkZXYt
PmNoaWxkcmVuKTsKLQkJCSAgICAgY2hpbGQyICYmIGNoaWxkMiAhPSBjaGlsZDsKLQkJCSAgICAg
Y2hpbGQyID0gVEFJTFFfTkVYVChjaGlsZDIsIGxpbmspKQotCQkJCURFVklDRV9SRVNVTUUoY2hp
bGQyKTsKLQkJCXJldHVybiAoZXJyb3IpOworCQlpZiAoIShjaGlsZC0+ZmxhZ3MgJiBERl9TVVNQ
RU5ERUQpKSB7CisJCQllcnJvciA9IERFVklDRV9TVVNQRU5EKGNoaWxkKTsKKwkJCWlmIChlcnJv
ciAmJiBlcnJvciAhPSBFQUdBSU4pIHsKKwkJCQlmb3IgKGNoaWxkMiA9IFRBSUxRX0ZJUlNUKCZk
ZXYtPmNoaWxkcmVuKTsKKwkJCQkgICAgIGNoaWxkMiAmJiBjaGlsZDIgIT0gY2hpbGQ7CisJCQkJ
ICAgICBjaGlsZDIgPSBUQUlMUV9ORVhUKGNoaWxkMiwgbGluaykpIHsKKwkJCQkJREVWSUNFX1JF
U1VNRShjaGlsZDIpOworCQkJCQljaGlsZDItPmZsYWdzICY9IH5ERl9TVVNQRU5ERUQ7CisJCQkJ
fQorCQkJCXJldHVybiAoZXJyb3IpOworCQkJfQorCQkJaWYgKGVycm9yID09IEVBR0FJTikgewor
CQkJCWFnYWluID0gRUFHQUlOOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY2hpbGQtPmZsYWdz
IHw9IERGX1NVU1BFTkRFRDsKIAkJfQogCX0KLQlyZXR1cm4gKDApOworCXJldHVybiAoYWdhaW4p
OwogfQogCiAvKioKQEAgLTM1NTcsMTIgKzM1NjgsMTkgQEAKIGJ1c19nZW5lcmljX3Jlc3VtZShk
ZXZpY2VfdCBkZXYpCiB7CiAJZGV2aWNlX3QJY2hpbGQ7CisJaW50CQllcnJvciA9IDA7CiAKIAlU
QUlMUV9GT1JFQUNIKGNoaWxkLCAmZGV2LT5jaGlsZHJlbiwgbGluaykgewotCQlERVZJQ0VfUkVT
VU1FKGNoaWxkKTsKLQkJLyogaWYgcmVzdW1lIGZhaWxzLCB0aGVyZSdzIG5vdGhpbmcgd2UgY2Fu
IHVzZWZ1bGx5IGRvLi4uICovCisJCWlmIChjaGlsZC0+ZmxhZ3MgJiBERl9TVVNQRU5ERUQpIHsK
KwkJCWlmIChERVZJQ0VfUkVTVU1FKGNoaWxkKSA9PSBFQUdBSU4pIHsKKwkJCQllcnJvciA9IEVB
R0FJTjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIGlmIHJlc3VtZSBmYWlscywgdGhlcmUn
cyBub3RoaW5nIHdlIGNhbiB1c2VmdWxseSBkby4uLiAqLworCQkJY2hpbGQtPmZsYWdzICY9IH5E
Rl9TVVNQRU5ERUQ7CisJCX0KIAl9Ci0JcmV0dXJuICgwKTsKKwlyZXR1cm4gKGVycm9yKTsKIH0K
IAogLyoqCkBAIC00MzY3LDE1ICs0Mzg1LDM5IEBACiBzdGF0aWMgaW50CiByb290X3Jlc3VtZShk
ZXZpY2VfdCBkZXYpCiB7Ci0JaW50IGVycm9yOworCXN0cnVjdCBkcml2ZXJsaW5rICpkbDsKKwlp
bnQgZXJyb3IgPSAwOwogCi0JZXJyb3IgPSBidXNfZ2VuZXJpY19yZXN1bWUoZGV2KTsKKwlUQUlM
UV9GT1JFQUNIKGRsLCAmcGFzc2VzLCBwYXNzbGluaykgeworCQlidXNfY3VycmVudF9wYXNzID0g
ZGwtPnBhc3M7CisJCWVycm9yID0gYnVzX2dlbmVyaWNfcmVzdW1lKGRldik7CisKKwkJaWYgKGVy
cm9yICE9IEVBR0FJTikKKwkJCWJyZWFrOworCX0KKwogCWlmIChlcnJvciA9PSAwKQogCQlkZXZj
dGxfbm90aWZ5KCJrZXJuIiwgInBvd2VyIiwgInJlc3VtZSIsIE5VTEwpOwogCXJldHVybiAoZXJy
b3IpOwogfQogCiBzdGF0aWMgaW50Cityb290X3N1c3BlbmQoZGV2aWNlX3QgZGV2KQoreworCXN0
cnVjdCBkcml2ZXJsaW5rICpkbDsKKwlpbnQgZXJyb3IgPSAwOworCisJVEFJTFFfRk9SRUFDSF9S
RVZFUlNFKGRsLCAmcGFzc2VzLCBkcml2ZXJfbGlzdCwgcGFzc2xpbmspIHsKKwkJYnVzX2N1cnJl
bnRfcGFzcyA9IGRsLT5wYXNzOworCQllcnJvciA9IGJ1c19nZW5lcmljX3Jlc3VtZShkZXYpOwor
CQlpZiAoZXJyb3IgIT0gRUFHQUlOKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChlcnJvcik7
Cit9CisKK3N0YXRpYyBpbnQKIHJvb3RfcHJpbnRfY2hpbGQoZGV2aWNlX3QgZGV2LCBkZXZpY2Vf
dCBjaGlsZCkKIHsKIAlpbnQJcmV0dmFsID0gMDsKQEAgLTQ0MTIsNyArNDQ1NCw3IEBACiBzdGF0
aWMga29ial9tZXRob2RfdCByb290X21ldGhvZHNbXSA9IHsKIAkvKiBEZXZpY2UgaW50ZXJmYWNl
ICovCiAJS09CSk1FVEhPRChkZXZpY2Vfc2h1dGRvd24sCWJ1c19nZW5lcmljX3NodXRkb3duKSwK
LQlLT0JKTUVUSE9EKGRldmljZV9zdXNwZW5kLAlidXNfZ2VuZXJpY19zdXNwZW5kKSwKKwlLT0JK
TUVUSE9EKGRldmljZV9zdXNwZW5kLAlyb290X3N1c3BlbmQpLAogCUtPQkpNRVRIT0QoZGV2aWNl
X3Jlc3VtZSwJcm9vdF9yZXN1bWUpLAogCiAJLyogQnVzIGludGVyZmFjZSAqLwo=
--089e013c6200674aa504dcda1e10--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CAHSQbTBAaeavgnYeTepiw4G59ApUym=9RJy5xRDPrfmLNoYRUQ>