From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lukas Wunner Subject: Re: [PATCH 1/2] drm/fb_helper: Add drm_fb_helper_output_poll_changed_with_rpm() Date: Thu, 19 Jul 2018 09:49:26 +0200 Message-ID: <20180719074926.GA14303@wunner.de> References: <20180718205645.25924-1-lyude@redhat.com> <20180718205645.25924-2-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20180718205645.25924-2-lyude-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Lyude Paul Cc: David Airlie , nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Maarten Lankhorst , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Sean Paul , Ben Skeggs , Gustavo Padovan , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= List-Id: nouveau.vger.kernel.org T24gV2VkLCBKdWwgMTgsIDIwMTggYXQgMDQ6NTY6MzlQTSAtMDQwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiBXaGVuIERQIE1TVCBodWJzIGdldCBjb25mdXNlZCwgdGhleSBjYW4gb2NjYXNpb25hbGx5 IHN0b3AgcmVzcG9uZGluZyBmb3IKPiBhIGdvb2QgYml0IG9mIHRpbWUgdXAgdW50aWwgdGhlIHBv aW50IHdoZXJlIHRoZSBEUk0gZHJpdmVyIG1hbmFnZXMgdG8KPiBkbyB0aGUgcmlnaHQgRFBDRCBh Y2Nlc3NlcyB0byBnZXQgaXQgdG8gc3RhcnQgcmVzcG9uZGluZyBhZ2Fpbi4gSW4gYQo+IHdvcnN0 IGNhc2Ugc2NlbmFyaW8gaG93ZXZlciwgdGhpcyBwcm9jZXNzIGNhbiB0YWtlIHVwd2FyZHMgb2Yg MTArCj4gc2Vjb25kcy4KPiAKPiBDdXJyZW50bHkgd2UgdXNlIHRoZSBkZWZhdWx0IG91dHB1dF9w b2xsX2NoYW5nZWQgaGFuZGxlcgo+IGRybV9mYl9oZWxwZXJfb3V0cHV0X3BvbGxfY2hhbmdlZCgp IHRvIGhhbmRsZSBvdXRwdXQgcG9sbGluZywgd2hpY2gKPiBkb2Vzbid0IGhhcHBlbiB0byBncmFi IGFueSBwb3dlciByZWZlcmVuY2VzIG9uIHRoZSBkZXZpY2Ugd2hlbiBwb2xsaW5nLgo+IElmIHdl J3JlIHVubHVja3kgZW5vdWdoIHRvIGhhdmUgYSBodWIgKHN1Y2ggYXMgTGVub3ZvJ3MgaW5mYW1v dXMgbGFwdG9wCj4gZG9ja3MgZm9yIHRoZSBQNXgvUDd4IHNlcmllcykgdGhhdCdzIGVhc2lseSBz dGFydGxlZCBhbmQgY29uZnVzZWQsIHRoaXMKPiBjYW4gbGVhZCB0byBhIHByZXR0eSBuYXN0eSBk ZWFkbG9jayBzaXR1YXRpb24gdGhhdCBsb29rcyBsaWtlIHRoaXM6Cj4gCj4gLSBIb3RwbHVnIGV2 ZW50IGZyb20gaHViIGhhcHBlbnMsIHdlIGVudGVyCj4gICBkcm1fZmJfaGVscGVyX291dHB1dF9w b2xsX2NoYW5nZWQoKSBhbmQgc3RhcnQgY29tbXVuaWNhdGluZyB3aXRoIHRoZQo+ICAgaHViCj4g LSBXaGlsZSB3ZSdyZSBpbiBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQoKSBhbmQg YXR0ZW1wdGluZyB0bwo+ICAgY29tbXVuaWNhdGUgd2l0aCB0aGUgaHViLCB3ZSBlbmQgdXAgY29u ZnVzaW5nIGl0IGFuZCBjYXVzZSBpdCB0byBzdG9wCj4gICByZXNwb25kaW5nIGZvciBhdCBsZWFz dCAxMCBzZWNvbmRzCj4gLSBBZnRlciA1IHNlY29uZHMgb2YgYmVpbmcgaW4gZHJtX2ZiX2hlbHBl cl9vdXRwdXRfcG9sbF9jaGFuZ2VkKCksIHRoZQo+ICAgcG0gY29yZSBhdHRlbXB0cyB0byBwdXQg dGhlIEdQVSBpbnRvIGF1dG9zdXNwZW5kLCB3aGljaCBlbmRzIHVwCj4gICBjYWxsaW5nIGRybV9r bXNfaGVscGVyX3BvbGxfZGlzYWJsZSgpCj4gLSBXaGlsZSB0aGUgcnVudGltZSBQTSBjb3JlIGlz IHdhaXRpbmcgaW4gZHJtX2ttc19oZWxwZXJfcG9sbF9kaXNhYmxlKCkKPiAgIGZvciB0aGUgb3V0 cHV0IHBvbGwgdG8gZmluaXNoLCB3ZSBlbmQgdXAgZmluYWxseSBkZXRlY3RpbmcgYW4gTVNUCj4g ICBkaXNwbGF5Cj4gLSBXZSBub3RpY2UgdGhlIG5ldyBkaXNwbGF5IGFuZCB0cmllcyB0byBlbmFi bGUgaXQsIHdoaWNoIHRyaWdnZXJzCj4gICBhbiBhdG9taWMgY29tbWl0IHdoaWNoIHRyaWdnZXJz IGEgY2FsbCB0byBwbV9ydW50aW1lX2dldF9zeW5jKCkKPiAtIHRoZSBvdXRwdXQgcG9sbCB0aHJl YWQgZGVhZGxvY2tzIHRoZSBwbSBjb3JlIHdhaXRpbmcgZm9yIHRoZSBwbSBjb3JlCj4gICB0byBm aW5pc2ggdGhlIGF1dG9zdXNwZW5kIHJlcXVlc3Qgd2hpbGUgdGhlIHBtIGNvcmUgd2FpdHMgZm9y IHRoZQo+ICAgb3V0cHV0IHBvbGwgdGhyZWFkIHRvIGZpbmlzaAoKVGhpcyB3aWxsIHN0aWxsIGRl YWRsb2NrIGlmIC0+cnVudGltZV9zdXNwZW5kIGNvbW1lbmNlcyBiZWZvcmUgdGhlCmhvdHBsdWcg ZXZlbnQgYW5kIHRoZSBob3RwbHVnIGV2ZW50IG9jY3VycyBiZWZvcmUgcG9sbGluZyBoYXMgYmVl bgpkaXNhYmxlZCBieSAtPnJ1bnRpbWVfc3VzcGVuZC4KClRoZSBjb3JyZWN0IGZpeCBpcyB0byBj YWxsIHBtX3J1bnRpbWVfZ2V0X3N5bmMoKSAqY29uZGl0aW9uYWxseSogaW4KdGhlIGF0b21pYyBj b21taXQgd2hpY2ggZW5hYmxlcyB0aGUgZGlzcGxheSwgdXNpbmcgdGhlIHNhbWUgY29uZGl0aW9u YWwKYXMgZDYxYTVjMTA2MzUxLCBpLmUuIGlmICghZHJtX2ttc19oZWxwZXJfaXNfcG9sbF93b3Jr ZXIoKSkuCgpOb3cgSSByZWFsaXplIEkgc2VudCB5b3UgZG93biB0aGUgd3JvbmcgcGF0aCB3aGVu IEkgc3VnZ2VzdGVkIHRvCmludHJvZHVjZSBhIERSTSBoZWxwZXIgaGVyZS4gIE15IGFwb2xvZ2ll cywgSSBkaWRuJ3QgZnVsbHkgYXBwcmVjaWF0ZQp3aGF0IGlzIGdvaW5nIGF3cnkgaGVyZSEKCkFu eXRoaW5nIHRoYXQgaGFwcGVucyBpbiBub3V2ZWF1J3MgcG9sbCB3b3JrZXIgbmV2ZXIgbmVlZHMg dG8gYWNxdWlyZQphIHJ1bnRpbWUgUE0gcmVmIGJlY2F1c2UgcG9sbGluZyBpcyBvbmx5IGVuYWJs ZWQgd2hpbGUgcnVudGltZSBhY3RpdmUsCmFuZCAtPnJ1bnRpbWVfc3VzcGVuZCB3YWl0cyBmb3Ig YW4gb25nb2luZyBwb2xsIHRvIGZpbmlzaC4KClRoaW5raW5nIGEgYml0IG1vcmUgYWJvdXQgdGhp cywgb3VyIG1pc3Rha2UgaXMgdG8gYWNxdWlyZSBydW50aW1lIFBNCnJlZnMgdG9vIGZhciBkb3du IGluIHRoZSBjYWxsIHN0YWNrLiAgQXMgYSBmaXggdGhhdCBjYW4gYmUgYmFja3BvcnRlZAp0byBz dGFibGUsIGFkZGluZyBpZiAoIWRybV9rbXNfaGVscGVyX2lzX3BvbGxfd29ya2VyKCkpIGNvbmRp dGlvbmFscwpzZWVtcyBmaW5lIHRvIG1lLCBidXQgdGhlIGxvbmcgdGVybSBmaXggaXMgdG8gcHVz aCBhY3F1aXNpdGlvbiBvZiByZWZzCmZ1cnRoZXIgdXAgaW4gdGhlIGNhbGwgc3RhY2suCgpFLmcu LCBpZiB0aGUgdXNlciBmb3JjZXMgY29ubmVjdG9yIHByb2JpbmcgdmlhIHN5c2ZzLCBhIHJ1bnRp bWUgUE0gcmVmCnNob3VsZCBiZSBhY3F1aXJlZCBpbiBzdGF0dXNfc3RvcmUoKSBpbiBkcm1fc3lz ZnMuYyBiZWZvcmUgaW52b2tpbmcKY29ubmVjdG9yLT5mdW5jcy0+ZmlsbF9tb2RlcygpLiAgVGhh dCB3YXksIGlmIHRoZSB1c2VyIGZvcmNlcyBjb25uZWN0b3IKcHJvYmluZyB3aGlsZSB0aGUgR1BV IGlzIHBvd2VyaW5nIGRvd24sIHJwbV9yZXN1bWUoKSB3aWxsIGNvcnJlY3RseSB3YWl0CmZvciBy cG1fc3VzcGVuZCgpIHRvIGZpbmlzaCBiZWZvcmUgcmVzdW1pbmcgdGhlIGNhcmQuICBTbyBpZiB3 ZSBhcmNoaXRlY3QKaXQgbGlrZSB0aGlzLCB3ZSdyZSBhY3R1YWxseSB1c2luZyB0aGUgZnVuY3Rp b25hbGl0eSBwcm92aWRlZCBieSB0aGUKUE0gY29yZSBpbiB0aGUgd2F5IHRoYXQgaXQncyBzdXBw b3NlZCB0byBiZSB1c2VkLgoKVGhlIHByb2JsZW0gaXMgdGhhdCBhZGRpbmcgcG1fcnVudGltZV9n ZXRfc3luYygpIHRvIHN0YXR1c19zdG9yZSgpCmNvbmZsaWN0cyB3aXRoIHRoZSBkZXNpcmUgdG8g aGF2ZSBhIGxpYnJhcnkgb2YgZ2VuZXJpYyBEUk0gZnVuY3Rpb25zOgpTb21lIEdQVXMgbWF5IGJl IGFibGUgdG8gcHJvYmUgY29ubmVjdG9ycyB3aXRob3V0IHJlc3VtaW5nIHRvIHJ1bnRpbWUKYWN0 aXZlIHN0YXRlLCBvdGhlcnMgZG9uJ3QgdXNlIHJ1bnRpbWUgUE0gYXQgYWxsLiAgT25lIHNvbHV0 aW9uIHRoYXQKY29tZXMgdG8gbWluZCBpcyBhIGRyaXZlcl9mZWF0dXJlcyBmbGFnIHdoaWNoIHRl bGxzIHRoZSBEUk0gY29yZSB3aGV0aGVyCnRvIGFjcXVpcmUgYSBydW50aW1lIFBNIHJlZiBpbiB2 YXJpb3VzIHBsYWNlcy4KCkluIHlvdXIgb3JpZ2luYWwgcGF0Y2hlcyA0IGFuZCA1LCB3aGF0IGV4 YWN0bHkgd2FzIHRoZSBjYWxsIHN0YWNrIHdoaWNoCmxlZCB0byBpMmMgYmVpbmcgYWNjZXNzZWQg d2hpbGUgcnVudGltZSBzdXNwZW5kZWQ/ICBXYXMgaXQgc3lzZnMgYWNjZXNzCnZpYSAvc3lzL2Ns YXNzL2kyYy1hZGFwdGVyLyogPyAgSWYgc28sIGFjcXVpc2l0aW9uIG9mIHRoZSBydW50aW1lIFBN IHJlZgpuZWVkcyB0byBsaWtld2lzZSBoYXBwZW4gaW4gdGhhdCBzeXNmcyBlbnRyeSBwb2ludCwg cmF0aGVyIHRoYW4gZGVlcCBkb3duCmluIHRoZSBjYWxsIHN0YWNrIHVwb24gYWNjZXNzaW5nIHRo ZSBpMmMgYnVzLgoKVGhhbmtzLAoKTHVrYXMKCj4gCj4gU2FtcGxlOgo+IFsgIDI0Ni42Njk2MjVd IElORk86IHRhc2sga3dvcmtlci80OjA6MzcgYmxvY2tlZCBmb3IgbW9yZSB0aGFuIDEyMCBzZWNv bmRzLgo+IFsgIDI0Ni42NzMzOThdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1yYzVMeXVkZS1U ZXN0KyAjMgo+IFsgIDI0Ni42NzUyNzFdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdf dGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KPiBbICAyNDYuNjc2NTI3 XSBrd29ya2VyLzQ6MCAgICAgRCAgICAwICAgIDM3ICAgICAgMiAweDgwMDAwMDAwCj4gWyAgMjQ2 LjY3NzU4MF0gV29ya3F1ZXVlOiBldmVudHMgb3V0cHV0X3BvbGxfZXhlY3V0ZSBbZHJtX2ttc19o ZWxwZXJdCj4gWyAgMjQ2LjY3ODcwNF0gQ2FsbCBUcmFjZToKPiBbICAyNDYuNjc5NzUzXSAgX19z Y2hlZHVsZSsweDMyMi8weGFmMAo+IFsgIDI0Ni42ODA5MTZdICBzY2hlZHVsZSsweDMzLzB4OTAK PiBbICAyNDYuNjgxOTI0XSAgc2NoZWR1bGVfcHJlZW1wdF9kaXNhYmxlZCsweDE1LzB4MjAKPiBb ICAyNDYuNjgzMDIzXSAgX19tdXRleF9sb2NrKzB4NTY5LzB4OWEwCj4gWyAgMjQ2LjY4NDAzNV0g ID8ga29iamVjdF91ZXZlbnRfZW52KzB4MTE3LzB4N2IwCj4gWyAgMjQ2LjY4NTEzMl0gID8gZHJt X2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50LnBhcnQuMjgrMHgyMC8weGIwIFtkcm1fa21zX2hlbHBl cl0KPiBbICAyNDYuNjg2MTc5XSAgbXV0ZXhfbG9ja19uZXN0ZWQrMHgxYi8weDIwCj4gWyAgMjQ2 LjY4NzI3OF0gID8gbXV0ZXhfbG9ja19uZXN0ZWQrMHgxYi8weDIwCj4gWyAgMjQ2LjY4ODMwN10g IGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4MjAvMHhiMCBbZHJtX2ttc19o ZWxwZXJdCj4gWyAgMjQ2LjY4OTQyMF0gIGRybV9mYl9oZWxwZXJfb3V0cHV0X3BvbGxfY2hhbmdl ZCsweDIzLzB4MzAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDI0Ni42OTA0NjJdICBkcm1fa21zX2hl bHBlcl9ob3RwbHVnX2V2ZW50KzB4MmEvMHgzMCBbZHJtX2ttc19oZWxwZXJdCj4gWyAgMjQ2LjY5 MTU3MF0gIG91dHB1dF9wb2xsX2V4ZWN1dGUrMHgxOTgvMHgxYzAgW2RybV9rbXNfaGVscGVyXQo+ IFsgIDI0Ni42OTI2MTFdICBwcm9jZXNzX29uZV93b3JrKzB4MjMxLzB4NjIwCj4gWyAgMjQ2LjY5 MzcyNV0gIHdvcmtlcl90aHJlYWQrMHgyMTQvMHgzYTAKPiBbICAyNDYuNjk0NzU2XSAga3RocmVh ZCsweDEyYi8weDE1MAo+IFsgIDI0Ni42OTU4NTZdICA/IHdxX3Bvb2xfaWRzX3Nob3crMHgxNDAv MHgxNDAKPiBbICAyNDYuNjk2ODg4XSAgPyBrdGhyZWFkX2NyZWF0ZV93b3JrZXJfb25fY3B1KzB4 NzAvMHg3MAo+IFsgIDI0Ni42OTc5OThdICByZXRfZnJvbV9mb3JrKzB4M2EvMHg1MAo+IFsgIDI0 Ni42OTkwMzRdIElORk86IHRhc2sga3dvcmtlci8wOjE6NjAgYmxvY2tlZCBmb3IgbW9yZSB0aGFu IDEyMCBzZWNvbmRzLgo+IFsgIDI0Ni43MDAxNTNdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1y YzVMeXVkZS1UZXN0KyAjMgo+IFsgIDI0Ni43MDExODJdICJlY2hvIDAgPiAvcHJvYy9zeXMva2Vy bmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KPiBbICAy NDYuNzAyMjc4XSBrd29ya2VyLzA6MSAgICAgRCAgICAwICAgIDYwICAgICAgMiAweDgwMDAwMDAw Cj4gWyAgMjQ2LjcwMzI5M10gV29ya3F1ZXVlOiBwbSBwbV9ydW50aW1lX3dvcmsKPiBbICAyNDYu NzA0MzkzXSBDYWxsIFRyYWNlOgo+IFsgIDI0Ni43MDU0MDNdICBfX3NjaGVkdWxlKzB4MzIyLzB4 YWYwCj4gWyAgMjQ2LjcwNjQzOV0gID8gd2FpdF9mb3JfY29tcGxldGlvbisweDEwNC8weDE5MAo+ IFsgIDI0Ni43MDczOTNdICBzY2hlZHVsZSsweDMzLzB4OTAKPiBbICAyNDYuNzA4Mzc1XSAgc2No ZWR1bGVfdGltZW91dCsweDNhNS8weDU5MAo+IFsgIDI0Ni43MDkyODldICA/IG1hcmtfaGVsZF9s b2NrcysweDU4LzB4ODAKPiBbICAyNDYuNzEwMjA4XSAgPyBfcmF3X3NwaW5fdW5sb2NrX2lycSsw eDJjLzB4NDAKPiBbICAyNDYuNzExMjIyXSAgPyB3YWl0X2Zvcl9jb21wbGV0aW9uKzB4MTA0LzB4 MTkwCj4gWyAgMjQ2LjcxMjEzNF0gID8gdHJhY2VfaGFyZGlycXNfb25fY2FsbGVyKzB4ZjQvMHgx OTAKPiBbICAyNDYuNzEzMDk0XSAgPyB3YWl0X2Zvcl9jb21wbGV0aW9uKzB4MTA0LzB4MTkwCj4g WyAgMjQ2LjcxMzk2NF0gIHdhaXRfZm9yX2NvbXBsZXRpb24rMHgxMmMvMHgxOTAKPiBbICAyNDYu NzE0ODk1XSAgPyB3YWtlX3VwX3ErMHg4MC8weDgwCj4gWyAgMjQ2LjcxNTcyN10gID8gZ2V0X3dv cmtfcG9vbCsweDkwLzB4OTAKPiBbICAyNDYuNzE2NjQ5XSAgZmx1c2hfd29yaysweDFjOS8weDI4 MAo+IFsgIDI0Ni43MTc0ODNdICA/IGZsdXNoX3dvcmtxdWV1ZV9wcmVwX3B3cXMrMHgxYjAvMHgx YjAKPiBbICAyNDYuNzE4NDQyXSAgX19jYW5jZWxfd29ya190aW1lcisweDE0Ni8weDFkMAo+IFsg IDI0Ni43MTkyNDddICBjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMrMHgxMy8weDIwCj4gWyAgMjQ2 LjcyMDA0M10gIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZSsweDFmLzB4MzAgW2RybV9rbXNf aGVscGVyXQo+IFsgIDI0Ni43MjExMjNdICBub3V2ZWF1X3Btb3BzX3J1bnRpbWVfc3VzcGVuZCsw eDNkLzB4YjAgW25vdXZlYXVdCj4gWyAgMjQ2LjcyMTg5N10gIHBjaV9wbV9ydW50aW1lX3N1c3Bl bmQrMHg2Yi8weDE5MAo+IFsgIDI0Ni43MjI4MjVdICA/IHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBv cnQrMHg3MC8weDcwCj4gWyAgMjQ2LjcyMzczN10gIF9fcnBtX2NhbGxiYWNrKzB4N2EvMHgxZDAK PiBbICAyNDYuNzI0NzIxXSAgPyBwY2lfaGFzX2xlZ2FjeV9wbV9zdXBwb3J0KzB4NzAvMHg3MAo+ IFsgIDI0Ni43MjU2MDddICBycG1fY2FsbGJhY2srMHgyNC8weDgwCj4gWyAgMjQ2LjcyNjU1M10g ID8gcGNpX2hhc19sZWdhY3lfcG1fc3VwcG9ydCsweDcwLzB4NzAKPiBbICAyNDYuNzI3Mzc2XSAg cnBtX3N1c3BlbmQrMHgxNDIvMHg2YjAKPiBbICAyNDYuNzI4MTg1XSAgcG1fcnVudGltZV93b3Jr KzB4OTcvMHhjMAo+IFsgIDI0Ni43Mjg5MzhdICBwcm9jZXNzX29uZV93b3JrKzB4MjMxLzB4NjIw Cj4gWyAgMjQ2LjcyOTc5Nl0gIHdvcmtlcl90aHJlYWQrMHg0NC8weDNhMAo+IFsgIDI0Ni43MzA2 MTRdICBrdGhyZWFkKzB4MTJiLzB4MTUwCj4gWyAgMjQ2LjczMTM5NV0gID8gd3FfcG9vbF9pZHNf c2hvdysweDE0MC8weDE0MAo+IFsgIDI0Ni43MzIyMDJdICA/IGt0aHJlYWRfY3JlYXRlX3dvcmtl cl9vbl9jcHUrMHg3MC8weDcwCj4gWyAgMjQ2LjczMjg3OF0gIHJldF9mcm9tX2ZvcmsrMHgzYS8w eDUwCj4gWyAgMjQ2LjczMzc2OF0gSU5GTzogdGFzayBrd29ya2VyLzQ6Mjo0MjIgYmxvY2tlZCBm b3IgbW9yZSB0aGFuIDEyMCBzZWNvbmRzLgo+IFsgIDI0Ni43MzQ1ODddICAgICAgIE5vdCB0YWlu dGVkIDQuMTguMC1yYzVMeXVkZS1UZXN0KyAjMgo+IFsgIDI0Ni43MzUzOTNdICJlY2hvIDAgPiAv cHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVz c2FnZS4KPiBbICAyNDYuNzM2MTEzXSBrd29ya2VyLzQ6MiAgICAgRCAgICAwICAgNDIyICAgICAg MiAweDgwMDAwMDgwCj4gWyAgMjQ2LjczNjc4OV0gV29ya3F1ZXVlOiBldmVudHNfbG9uZyBkcm1f ZHBfbXN0X2xpbmtfcHJvYmVfd29yayBbZHJtX2ttc19oZWxwZXJdCj4gWyAgMjQ2LjczNzY2NV0g Q2FsbCBUcmFjZToKPiBbICAyNDYuNzM4NDkwXSAgX19zY2hlZHVsZSsweDMyMi8weGFmMAo+IFsg IDI0Ni43MzkyNTBdICBzY2hlZHVsZSsweDMzLzB4OTAKPiBbICAyNDYuNzM5OTA4XSAgcnBtX3Jl c3VtZSsweDE5Yy8weDg1MAo+IFsgIDI0Ni43NDA3NTBdICA/IGZpbmlzaF93YWl0KzB4OTAvMHg5 MAo+IFsgIDI0Ni43NDE1NDFdICBfX3BtX3J1bnRpbWVfcmVzdW1lKzB4NGUvMHg5MAo+IFsgIDI0 Ni43NDIzNzBdICBudjUwX2Rpc3BfYXRvbWljX2NvbW1pdCsweDMxLzB4MjEwIFtub3V2ZWF1XQo+ IFsgIDI0Ni43NDMxMjRdICBkcm1fYXRvbWljX2NvbW1pdCsweDRhLzB4NTAgW2RybV0KPiBbICAy NDYuNzQzNzc1XSAgcmVzdG9yZV9mYmRldl9tb2RlX2F0b21pYysweDFjOC8weDI0MCBbZHJtX2tt c19oZWxwZXJdCj4gWyAgMjQ2Ljc0NDYwM10gIHJlc3RvcmVfZmJkZXZfbW9kZSsweDMxLzB4MTQw IFtkcm1fa21zX2hlbHBlcl0KPiBbICAyNDYuNzQ1MzczXSAgZHJtX2ZiX2hlbHBlcl9yZXN0b3Jl X2ZiZGV2X21vZGVfdW5sb2NrZWQrMHg1NC8weGIwIFtkcm1fa21zX2hlbHBlcl0KPiBbICAyNDYu NzQ2MjIwXSAgZHJtX2ZiX2hlbHBlcl9zZXRfcGFyKzB4MmQvMHg1MCBbZHJtX2ttc19oZWxwZXJd Cj4gWyAgMjQ2Ljc0Njg4NF0gIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4 OTYvMHhiMCBbZHJtX2ttc19oZWxwZXJdCj4gWyAgMjQ2Ljc0NzY3NV0gIGRybV9mYl9oZWxwZXJf b3V0cHV0X3BvbGxfY2hhbmdlZCsweDIzLzB4MzAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDI0Ni43 NDg1NDRdICBkcm1fa21zX2hlbHBlcl9ob3RwbHVnX2V2ZW50KzB4MmEvMHgzMCBbZHJtX2ttc19o ZWxwZXJdCj4gWyAgMjQ2Ljc0OTQzOV0gIG52NTBfbXN0bV9ob3RwbHVnKzB4MTUvMHgyMCBbbm91 dmVhdV0KPiBbICAyNDYuNzUwMTExXSAgZHJtX2RwX3NlbmRfbGlua19hZGRyZXNzKzB4MTc3LzB4 MWMwIFtkcm1fa21zX2hlbHBlcl0KPiBbICAyNDYuNzUwNzY0XSAgZHJtX2RwX2NoZWNrX2FuZF9z ZW5kX2xpbmtfYWRkcmVzcysweGE4LzB4ZDAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDI0Ni43NTE2 MDJdICBkcm1fZHBfbXN0X2xpbmtfcHJvYmVfd29yaysweDUxLzB4OTAgW2RybV9rbXNfaGVscGVy XQo+IFsgIDI0Ni43NTIzMTRdICBwcm9jZXNzX29uZV93b3JrKzB4MjMxLzB4NjIwCj4gWyAgMjQ2 Ljc1Mjk3OV0gIHdvcmtlcl90aHJlYWQrMHg0NC8weDNhMAo+IFsgIDI0Ni43NTM4MzhdICBrdGhy ZWFkKzB4MTJiLzB4MTUwCj4gWyAgMjQ2Ljc1NDYxOV0gID8gd3FfcG9vbF9pZHNfc2hvdysweDE0 MC8weDE0MAo+IFsgIDI0Ni43NTUzODZdICA/IGt0aHJlYWRfY3JlYXRlX3dvcmtlcl9vbl9jcHUr MHg3MC8weDcwCj4gWyAgMjQ2Ljc1NjE2Ml0gIHJldF9mcm9tX2ZvcmsrMHgzYS8weDUwCj4gWyAg MjQ2Ljc1Njg0N10KPiAgICAgICAgICAgICAgICBTaG93aW5nIGFsbCBsb2NrcyBoZWxkIGluIHRo ZSBzeXN0ZW06Cj4gWyAgMjQ2Ljc1ODI2MV0gMyBsb2NrcyBoZWxkIGJ5IGt3b3JrZXIvNDowLzM3 Ogo+IFsgIDI0Ni43NTkwMTZdICAjMDogMDAwMDAwMDBmOGRmNGQyZCAoKHdxX2NvbXBsZXRpb24p ImV2ZW50cyIpeysuKy59LCBhdDogcHJvY2Vzc19vbmVfd29yaysweDFiMy8weDYyMAo+IFsgIDI0 Ni43NTk4NTZdICAjMTogMDAwMDAwMDBlNjA2NTQ2MSAoKHdvcmtfY29tcGxldGlvbikoJigmZGV2 LT5tb2RlX2NvbmZpZy5vdXRwdXRfcG9sbF93b3JrKS0+d29yaykpeysuKy59LCBhdDogcHJvY2Vz c19vbmVfd29yaysweDFiMy8weDYyMAo+IFsgIDI0Ni43NjA2NzBdICAjMjogMDAwMDAwMDBjYjY2 NzM1ZiAoJmhlbHBlci0+bG9jayl7Ky4rLn0sIGF0OiBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZl bnQucGFydC4yOCsweDIwLzB4YjAgW2RybV9rbXNfaGVscGVyXQo+IFsgIDI0Ni43NjE1MTZdIDIg bG9ja3MgaGVsZCBieSBrd29ya2VyLzA6MS82MDoKPiBbICAyNDYuNzYyMjc0XSAgIzA6IDAwMDAw MDAwZmZmNmJlMGYgKCh3cV9jb21wbGV0aW9uKSJwbSIpeysuKy59LCBhdDogcHJvY2Vzc19vbmVf d29yaysweDFiMy8weDYyMAo+IFsgIDI0Ni43NjI5ODJdICAjMTogMDAwMDAwMDA1YWI0NGZiNCAo KHdvcmtfY29tcGxldGlvbikoJmRldi0+cG93ZXIud29yaykpeysuKy59LCBhdDogcHJvY2Vzc19v bmVfd29yaysweDFiMy8weDYyMAo+IFsgIDI0Ni43NjM4OTBdIDEgbG9jayBoZWxkIGJ5IGtodW5n dGFza2QvNjQ6Cj4gWyAgMjQ2Ljc2NDY2NF0gICMwOiAwMDAwMDAwMDhjYjhiNWMzIChyY3VfcmVh ZF9sb2NrKXsuLi4ufSwgYXQ6IGRlYnVnX3Nob3dfYWxsX2xvY2tzKzB4MjMvMHgxODUKPiBbICAy NDYuNzY1NTg4XSA1IGxvY2tzIGhlbGQgYnkga3dvcmtlci80OjIvNDIyOgo+IFsgIDI0Ni43NjY0 NDBdICAjMDogMDAwMDAwMDAyMzJmMDk1OSAoKHdxX2NvbXBsZXRpb24pImV2ZW50c19sb25nIil7 Ky4rLn0sIGF0OiBwcm9jZXNzX29uZV93b3JrKzB4MWIzLzB4NjIwCj4gWyAgMjQ2Ljc2NzM5MF0g ICMxOiAwMDAwMDAwMGJiNTliMTM0ICgod29ya19jb21wbGV0aW9uKSgmbWdyLT53b3JrKSl7Ky4r Ln0sIGF0OiBwcm9jZXNzX29uZV93b3JrKzB4MWIzLzB4NjIwCj4gWyAgMjQ2Ljc2ODE1NF0gICMy OiAwMDAwMDAwMGNiNjY3MzVmICgmaGVscGVyLT5sb2NrKXsrLisufSwgYXQ6IGRybV9mYl9oZWxw ZXJfcmVzdG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKzB4NGMvMHhiMCBbZHJtX2ttc19oZWxwZXJd Cj4gWyAgMjQ2Ljc2ODk2Nl0gICMzOiAwMDAwMDAwMDRjOGYwYjZiIChjcnRjX3d3X2NsYXNzX2Fj cXVpcmUpeysuKy59LCBhdDogcmVzdG9yZV9mYmRldl9tb2RlX2F0b21pYysweDRiLzB4MjQwIFtk cm1fa21zX2hlbHBlcl0KPiBbICAyNDYuNzY5OTIxXSAgIzQ6IDAwMDAwMDAwNGMzNGEyOTYgKGNy dGNfd3dfY2xhc3NfbXV0ZXgpeysuKy59LCBhdDogZHJtX21vZGVzZXRfYmFja29mZisweDhhLzB4 MWIwIFtkcm1dCj4gWyAgMjQ2Ljc3MDgzOV0gMSBsb2NrIGhlbGQgYnkgZG1lc2cvMTAzODoKPiBb ICAyNDYuNzcxNzM5XSAyIGxvY2tzIGhlbGQgYnkgenNoLzExNzI6Cj4gWyAgMjQ2Ljc3MjY1MF0g ICMwOiAwMDAwMDAwMDgzNmQwNDM4ICgmdHR5LT5sZGlzY19zZW0peysrKyt9LCBhdDogbGRzZW1f ZG93bl9yZWFkKzB4MzcvMHg0MAo+IFsgIDI0Ni43NzM2ODBdICAjMTogMDAwMDAwMDAxZjRmNGQ0 OCAoJmxkYXRhLT5hdG9taWNfcmVhZF9sb2NrKXsrLisufSwgYXQ6IG5fdHR5X3JlYWQrMHhjMS8w eDg3MAo+IAo+IFsgIDI0Ni43NzU1MjJdID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQo+IAo+IFNvLCB0byBmaXggdGhpcyAoYW5kIGFueSBvdGhlciBwb3NzaWJs ZSBkZWFkbG9jayBpc3N1ZXMgbGlrZSB0aGlzIHRoYXQKPiBjb3VsZCBvY2N1ciBpbiB0aGUgb3V0 cHV0X3BvbGxfY2hhbmdlZCBwYXRjaCkgd2UgbWFrZSBzdXJlIHRoYXQKPiBub3V2ZWF1J3Mgb3V0 cHV0X3BvbGxfY2hhbmdlZCBmdW5jdGlvbnMgZ3JhYiBhIHJ1bnRpbWUgcG93ZXIgcmVmIGJlZm9y ZQo+IHNlbmRpbmcgYW55IGhvdHBsdWcgZXZlbnRzLCBhbmQgaG9sZCBpdCB1bnRpbCB3ZSdyZSBm aW5pc2hlZC4gV2UKPiBpbnRyb2R1Y2UgdGhpcyB0aHJvdWdoIGFkZGluZyBhIGdlbmVyaWMgRFJN IGhlbHBlciB3aGljaCBvdGhlciBkcml2ZXJzCj4gbWF5IHJldXNlLgo+IAo+IFRoaXMgZml4ZXMg ZGVhZGxvY2sgaXNzdWVzIHdoZW4gaW4gZmJjb24gd2l0aCBub3V2ZWF1IG9uIG15IFA1MCwgYW5k Cj4gc2hvdWxkIGZpeCBpdCBmb3IgZXZlcnlvbmUgZWxzZSdzIGFzIHdlbGwhCj4gCj4gU2lnbmVk LW9mZi1ieTogTHl1ZGUgUGF1bCA8bHl1ZGVAcmVkaGF0LmNvbT4KPiBSZXZpZXdlZC1ieTogS2Fy b2wgSGVyYnN0IDxrYXJvbGhlcmJzdEBnbWFpbC5jb20+Cj4gQ2M6IEx1a2FzIFd1bm5lciA8bHVr YXNAd3VubmVyLmRlPgo+IENjOiBzdGFibGVAdmdlci5rZXJuZWwub3JnCj4gLS0tCj4gQ2hhbmdl cyBzaW5jZSB2MToKPiAgLSBBZGQgYSBnZW5lcmljIGhlbHBlciBmb3IgRFJNIHRvIGhhbmRsZSB0 aGlzCj4gCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVyLmMgICAgICAgICB8IDIzICsr KysrKysrKysrKysrKysrKysrKysrCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L2Rpc3BudjUw L2Rpc3AuYyB8ICAyICstCj4gIGluY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaCAgICAgICAgICAg ICB8ICA1ICsrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMjkgaW5zZXJ0aW9ucygrKSwgMSBkZWxl dGlvbigtKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5j IGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwo+IGluZGV4IDJlZTFlYWE2NjE4OC4u MWFiMmYzNjQ2NTI2IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZmJfaGVscGVy LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCj4gQEAgLTM0LDYgKzM0 LDcgQEAKPiAgI2luY2x1ZGUgPGxpbnV4L3N5c3JxLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9zbGFi Lmg+Cj4gICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BtX3J1 bnRpbWUuaD4KPiAgI2luY2x1ZGUgPGRybS9kcm1QLmg+Cj4gICNpbmNsdWRlIDxkcm0vZHJtX2Ny dGMuaD4KPiAgI2luY2x1ZGUgPGRybS9kcm1fZmJfaGVscGVyLmg+Cj4gQEAgLTI5MjgsNiArMjky OSwyOCBAQCB2b2lkIGRybV9mYl9oZWxwZXJfb3V0cHV0X3BvbGxfY2hhbmdlZChzdHJ1Y3QgZHJt X2RldmljZSAqZGV2KQo+ICB9Cj4gIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9vdXRwdXRf cG9sbF9jaGFuZ2VkKTsKPiAgCj4gKy8qKgo+ICsgKiBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xs X2NoYW5nZWRfd2l0aF9ycG0gLSBEUk0gbW9kZQo+ICsgKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgXC5vdXRwdXRfcG9sbF9jaGFuZ2VkCj4gKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlciBmb3Ig ZmJkZXYgZW11bGF0aW9uCj4gKyAqIEBkZXY6IERSTSBkZXZpY2UKPiArICoKPiArICogU2FtZSBh cyBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQsIGV4Y2VwdCB0aGF0IGl0IG1ha2Vz IHN1cmUgdGhhdAo+ICsgKiB0aGUgZGV2aWNlIGlzIGFjdGl2ZSBieSBzeW5jaHJvbm91c2x5IGdy YWJiaW5nIGEgcnVudGltZSBwb3dlciByZWZlcmVuY2UKPiArICogd2hpbGUgcHJvYmluZy4KPiAr ICovCj4gK3ZvaWQgZHJtX2ZiX2hlbHBlcl9vdXRwdXRfcG9sbF9jaGFuZ2VkX3dpdGhfcnBtKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gcG1f cnVudGltZV9nZXRfc3luYyhkZXYtPmRldik7Cj4gKwlpZiAoV0FSTl9PTihyZXQgPCAwICYmIHJl dCAhPSAtRUFDQ0VTKSkKPiArCQlyZXR1cm47Cj4gKwlkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZl bnQoZGV2LT5mYl9oZWxwZXIpOwo+ICsJcG1fcnVudGltZV9wdXQoZGV2LT5kZXYpOwo+ICt9Cj4g K0VYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9vdXRwdXRfcG9sbF9jaGFuZ2VkX3dpdGhfcnBt KTsKPiArCj4gIC8qIFRoZSBLY29uZmlnIERSTV9LTVNfSEVMUEVSIHNlbGVjdHMgRlJBTUVCVUZG RVJfQ09OU09MRSAoaWYgIUVYUEVSVCkKPiAgICogYnV0IHRoZSBtb2R1bGUgZG9lc24ndCBkZXBl bmQgb24gYW55IGZiIGNvbnNvbGUgc3ltYm9scy4gIEF0IGxlYXN0Cj4gICAqIGF0dGVtcHQgdG8g bG9hZCBmYmNvbiB0byBhdm9pZCBsZWF2aW5nIHRoZSBzeXN0ZW0gd2l0aG91dCBhIHVzYWJsZSBj b25zb2xlLgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnY1MC9k aXNwLmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9kaXNwbnY1MC9kaXNwLmMKPiBpbmRleCBl YjNlNDFhNzg4MDYuLmZhM2FiNjE4YTBmOSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v bm91dmVhdS9kaXNwbnY1MC9kaXNwLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9k aXNwbnY1MC9kaXNwLmMKPiBAQCAtMjAxNSw3ICsyMDE1LDcgQEAgbnY1MF9kaXNwX2F0b21pY19z dGF0ZV9hbGxvYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ICBzdGF0aWMgY29uc3Qgc3RydWN0 IGRybV9tb2RlX2NvbmZpZ19mdW5jcwo+ICBudjUwX2Rpc3BfZnVuYyA9IHsKPiAgCS5mYl9jcmVh dGUgPSBub3V2ZWF1X3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlLAo+IC0JLm91dHB1dF9wb2xsX2No YW5nZWQgPSBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQsCj4gKwkub3V0cHV0X3Bv bGxfY2hhbmdlZCA9IGRybV9mYl9oZWxwZXJfb3V0cHV0X3BvbGxfY2hhbmdlZF93aXRoX3JwbSwK PiAgCS5hdG9taWNfY2hlY2sgPSBudjUwX2Rpc3BfYXRvbWljX2NoZWNrLAo+ICAJLmF0b21pY19j b21taXQgPSBudjUwX2Rpc3BfYXRvbWljX2NvbW1pdCwKPiAgCS5hdG9taWNfc3RhdGVfYWxsb2Mg PSBudjUwX2Rpc3BfYXRvbWljX3N0YXRlX2FsbG9jLAo+IGRpZmYgLS1naXQgYS9pbmNsdWRlL2Ry bS9kcm1fZmJfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKPiBpbmRleCBi MDY5NDMzZTdmYzEuLmNhODA5YmZiYWViYiAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2RybS9kcm1f ZmJfaGVscGVyLmgKPiArKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKPiBAQCAtMzMw LDYgKzMzMCw3IEBAIHZvaWQgZHJtX2ZiX2hlbHBlcl9mYmRldl90ZWFyZG93bihzdHJ1Y3QgZHJt X2RldmljZSAqZGV2KTsKPiAgCj4gIHZvaWQgZHJtX2ZiX2hlbHBlcl9sYXN0Y2xvc2Uoc3RydWN0 IGRybV9kZXZpY2UgKmRldik7Cj4gIHZvaWQgZHJtX2ZiX2hlbHBlcl9vdXRwdXRfcG9sbF9jaGFu Z2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwo+ICt2b2lkIGRybV9mYl9oZWxwZXJfb3V0cHV0 X3BvbGxfY2hhbmdlZF93aXRoX3JwbShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKPiAgI2Vsc2UK PiAgc3RhdGljIGlubGluZSB2b2lkIGRybV9mYl9oZWxwZXJfcHJlcGFyZShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAo+ICAJCQkJCXN0cnVjdCBkcm1fZmJfaGVscGVyICpoZWxwZXIsCj4gQEAgLTU2 NCw2ICs1NjUsMTAgQEAgc3RhdGljIGlubGluZSB2b2lkIGRybV9mYl9oZWxwZXJfb3V0cHV0X3Bv bGxfY2hhbmdlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQo+ICB7Cj4gIH0KPiAgCj4gK3N0YXRp YyBpbmxpbmUgdm9pZCBkcm1fZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWRfd2l0aF9ycG0o c3RydWN0IGRybV9kZXZpY2UgKmRldikKPiArewo+ICt9Cj4gKwo+ICAjZW5kaWYKPiAgCj4gIHN0 YXRpYyBpbmxpbmUgaW50Cj4gLS0gCj4gMi4xNy4xCj4gCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCk5vdXZlYXUgbWFpbGluZyBsaXN0Ck5vdXZlYXVAbGlz dHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4v bGlzdGluZm8vbm91dmVhdQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED,USER_AGENT_MUTT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B770EECDE5F for ; Thu, 19 Jul 2018 07:49:33 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5EFA020671 for ; Thu, 19 Jul 2018 07:49:33 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5EFA020671 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=wunner.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731455AbeGSIbW (ORCPT ); Thu, 19 Jul 2018 04:31:22 -0400 Received: from bmailout3.hostsharing.net ([176.9.242.62]:37619 "EHLO bmailout3.hostsharing.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727700AbeGSIbW (ORCPT ); Thu, 19 Jul 2018 04:31:22 -0400 Received: from h08.hostsharing.net (h08.hostsharing.net [83.223.95.28]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "*.hostsharing.net", Issuer "COMODO RSA Domain Validation Secure Server CA" (not verified)) by bmailout3.hostsharing.net (Postfix) with ESMTPS id 22C1A10195219; Thu, 19 Jul 2018 09:49:27 +0200 (CEST) Received: by h08.hostsharing.net (Postfix, from userid 100393) id B5B56CC67F; Thu, 19 Jul 2018 09:49:26 +0200 (CEST) Date: Thu, 19 Jul 2018 09:49:26 +0200 From: Lukas Wunner To: Lyude Paul Cc: nouveau@lists.freedesktop.org, Gustavo Padovan , Maarten Lankhorst , Sean Paul , David Airlie , Ben Skeggs , Daniel Vetter , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH 1/2] drm/fb_helper: Add drm_fb_helper_output_poll_changed_with_rpm() Message-ID: <20180719074926.GA14303@wunner.de> References: <20180718205645.25924-1-lyude@redhat.com> <20180718205645.25924-2-lyude@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180718205645.25924-2-lyude@redhat.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 18, 2018 at 04:56:39PM -0400, Lyude Paul wrote: > When DP MST hubs get confused, they can occasionally stop responding for > a good bit of time up until the point where the DRM driver manages to > do the right DPCD accesses to get it to start responding again. In a > worst case scenario however, this process can take upwards of 10+ > seconds. > > Currently we use the default output_poll_changed handler > drm_fb_helper_output_poll_changed() to handle output polling, which > doesn't happen to grab any power references on the device when polling. > If we're unlucky enough to have a hub (such as Lenovo's infamous laptop > docks for the P5x/P7x series) that's easily startled and confused, this > can lead to a pretty nasty deadlock situation that looks like this: > > - Hotplug event from hub happens, we enter > drm_fb_helper_output_poll_changed() and start communicating with the > hub > - While we're in drm_fb_helper_output_poll_changed() and attempting to > communicate with the hub, we end up confusing it and cause it to stop > responding for at least 10 seconds > - After 5 seconds of being in drm_fb_helper_output_poll_changed(), the > pm core attempts to put the GPU into autosuspend, which ends up > calling drm_kms_helper_poll_disable() > - While the runtime PM core is waiting in drm_kms_helper_poll_disable() > for the output poll to finish, we end up finally detecting an MST > display > - We notice the new display and tries to enable it, which triggers > an atomic commit which triggers a call to pm_runtime_get_sync() > - the output poll thread deadlocks the pm core waiting for the pm core > to finish the autosuspend request while the pm core waits for the > output poll thread to finish This will still deadlock if ->runtime_suspend commences before the hotplug event and the hotplug event occurs before polling has been disabled by ->runtime_suspend. The correct fix is to call pm_runtime_get_sync() *conditionally* in the atomic commit which enables the display, using the same conditional as d61a5c106351, i.e. if (!drm_kms_helper_is_poll_worker()). Now I realize I sent you down the wrong path when I suggested to introduce a DRM helper here. My apologies, I didn't fully appreciate what is going awry here! Anything that happens in nouveau's poll worker never needs to acquire a runtime PM ref because polling is only enabled while runtime active, and ->runtime_suspend waits for an ongoing poll to finish. Thinking a bit more about this, our mistake is to acquire runtime PM refs too far down in the call stack. As a fix that can be backported to stable, adding if (!drm_kms_helper_is_poll_worker()) conditionals seems fine to me, but the long term fix is to push acquisition of refs further up in the call stack. E.g., if the user forces connector probing via sysfs, a runtime PM ref should be acquired in status_store() in drm_sysfs.c before invoking connector->funcs->fill_modes(). That way, if the user forces connector probing while the GPU is powering down, rpm_resume() will correctly wait for rpm_suspend() to finish before resuming the card. So if we architect it like this, we're actually using the functionality provided by the PM core in the way that it's supposed to be used. The problem is that adding pm_runtime_get_sync() to status_store() conflicts with the desire to have a library of generic DRM functions: Some GPUs may be able to probe connectors without resuming to runtime active state, others don't use runtime PM at all. One solution that comes to mind is a driver_features flag which tells the DRM core whether to acquire a runtime PM ref in various places. In your original patches 4 and 5, what exactly was the call stack which led to i2c being accessed while runtime suspended? Was it sysfs access via /sys/class/i2c-adapter/* ? If so, acquisition of the runtime PM ref needs to likewise happen in that sysfs entry point, rather than deep down in the call stack upon accessing the i2c bus. Thanks, Lukas > > Sample: > [ 246.669625] INFO: task kworker/4:0:37 blocked for more than 120 seconds. > [ 246.673398] Not tainted 4.18.0-rc5Lyude-Test+ #2 > [ 246.675271] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 246.676527] kworker/4:0 D 0 37 2 0x80000000 > [ 246.677580] Workqueue: events output_poll_execute [drm_kms_helper] > [ 246.678704] Call Trace: > [ 246.679753] __schedule+0x322/0xaf0 > [ 246.680916] schedule+0x33/0x90 > [ 246.681924] schedule_preempt_disabled+0x15/0x20 > [ 246.683023] __mutex_lock+0x569/0x9a0 > [ 246.684035] ? kobject_uevent_env+0x117/0x7b0 > [ 246.685132] ? drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] > [ 246.686179] mutex_lock_nested+0x1b/0x20 > [ 246.687278] ? mutex_lock_nested+0x1b/0x20 > [ 246.688307] drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] > [ 246.689420] drm_fb_helper_output_poll_changed+0x23/0x30 [drm_kms_helper] > [ 246.690462] drm_kms_helper_hotplug_event+0x2a/0x30 [drm_kms_helper] > [ 246.691570] output_poll_execute+0x198/0x1c0 [drm_kms_helper] > [ 246.692611] process_one_work+0x231/0x620 > [ 246.693725] worker_thread+0x214/0x3a0 > [ 246.694756] kthread+0x12b/0x150 > [ 246.695856] ? wq_pool_ids_show+0x140/0x140 > [ 246.696888] ? kthread_create_worker_on_cpu+0x70/0x70 > [ 246.697998] ret_from_fork+0x3a/0x50 > [ 246.699034] INFO: task kworker/0:1:60 blocked for more than 120 seconds. > [ 246.700153] Not tainted 4.18.0-rc5Lyude-Test+ #2 > [ 246.701182] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 246.702278] kworker/0:1 D 0 60 2 0x80000000 > [ 246.703293] Workqueue: pm pm_runtime_work > [ 246.704393] Call Trace: > [ 246.705403] __schedule+0x322/0xaf0 > [ 246.706439] ? wait_for_completion+0x104/0x190 > [ 246.707393] schedule+0x33/0x90 > [ 246.708375] schedule_timeout+0x3a5/0x590 > [ 246.709289] ? mark_held_locks+0x58/0x80 > [ 246.710208] ? _raw_spin_unlock_irq+0x2c/0x40 > [ 246.711222] ? wait_for_completion+0x104/0x190 > [ 246.712134] ? trace_hardirqs_on_caller+0xf4/0x190 > [ 246.713094] ? wait_for_completion+0x104/0x190 > [ 246.713964] wait_for_completion+0x12c/0x190 > [ 246.714895] ? wake_up_q+0x80/0x80 > [ 246.715727] ? get_work_pool+0x90/0x90 > [ 246.716649] flush_work+0x1c9/0x280 > [ 246.717483] ? flush_workqueue_prep_pwqs+0x1b0/0x1b0 > [ 246.718442] __cancel_work_timer+0x146/0x1d0 > [ 246.719247] cancel_delayed_work_sync+0x13/0x20 > [ 246.720043] drm_kms_helper_poll_disable+0x1f/0x30 [drm_kms_helper] > [ 246.721123] nouveau_pmops_runtime_suspend+0x3d/0xb0 [nouveau] > [ 246.721897] pci_pm_runtime_suspend+0x6b/0x190 > [ 246.722825] ? pci_has_legacy_pm_support+0x70/0x70 > [ 246.723737] __rpm_callback+0x7a/0x1d0 > [ 246.724721] ? pci_has_legacy_pm_support+0x70/0x70 > [ 246.725607] rpm_callback+0x24/0x80 > [ 246.726553] ? pci_has_legacy_pm_support+0x70/0x70 > [ 246.727376] rpm_suspend+0x142/0x6b0 > [ 246.728185] pm_runtime_work+0x97/0xc0 > [ 246.728938] process_one_work+0x231/0x620 > [ 246.729796] worker_thread+0x44/0x3a0 > [ 246.730614] kthread+0x12b/0x150 > [ 246.731395] ? wq_pool_ids_show+0x140/0x140 > [ 246.732202] ? kthread_create_worker_on_cpu+0x70/0x70 > [ 246.732878] ret_from_fork+0x3a/0x50 > [ 246.733768] INFO: task kworker/4:2:422 blocked for more than 120 seconds. > [ 246.734587] Not tainted 4.18.0-rc5Lyude-Test+ #2 > [ 246.735393] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. > [ 246.736113] kworker/4:2 D 0 422 2 0x80000080 > [ 246.736789] Workqueue: events_long drm_dp_mst_link_probe_work [drm_kms_helper] > [ 246.737665] Call Trace: > [ 246.738490] __schedule+0x322/0xaf0 > [ 246.739250] schedule+0x33/0x90 > [ 246.739908] rpm_resume+0x19c/0x850 > [ 246.740750] ? finish_wait+0x90/0x90 > [ 246.741541] __pm_runtime_resume+0x4e/0x90 > [ 246.742370] nv50_disp_atomic_commit+0x31/0x210 [nouveau] > [ 246.743124] drm_atomic_commit+0x4a/0x50 [drm] > [ 246.743775] restore_fbdev_mode_atomic+0x1c8/0x240 [drm_kms_helper] > [ 246.744603] restore_fbdev_mode+0x31/0x140 [drm_kms_helper] > [ 246.745373] drm_fb_helper_restore_fbdev_mode_unlocked+0x54/0xb0 [drm_kms_helper] > [ 246.746220] drm_fb_helper_set_par+0x2d/0x50 [drm_kms_helper] > [ 246.746884] drm_fb_helper_hotplug_event.part.28+0x96/0xb0 [drm_kms_helper] > [ 246.747675] drm_fb_helper_output_poll_changed+0x23/0x30 [drm_kms_helper] > [ 246.748544] drm_kms_helper_hotplug_event+0x2a/0x30 [drm_kms_helper] > [ 246.749439] nv50_mstm_hotplug+0x15/0x20 [nouveau] > [ 246.750111] drm_dp_send_link_address+0x177/0x1c0 [drm_kms_helper] > [ 246.750764] drm_dp_check_and_send_link_address+0xa8/0xd0 [drm_kms_helper] > [ 246.751602] drm_dp_mst_link_probe_work+0x51/0x90 [drm_kms_helper] > [ 246.752314] process_one_work+0x231/0x620 > [ 246.752979] worker_thread+0x44/0x3a0 > [ 246.753838] kthread+0x12b/0x150 > [ 246.754619] ? wq_pool_ids_show+0x140/0x140 > [ 246.755386] ? kthread_create_worker_on_cpu+0x70/0x70 > [ 246.756162] ret_from_fork+0x3a/0x50 > [ 246.756847] > Showing all locks held in the system: > [ 246.758261] 3 locks held by kworker/4:0/37: > [ 246.759016] #0: 00000000f8df4d2d ((wq_completion)"events"){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.759856] #1: 00000000e6065461 ((work_completion)(&(&dev->mode_config.output_poll_work)->work)){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.760670] #2: 00000000cb66735f (&helper->lock){+.+.}, at: drm_fb_helper_hotplug_event.part.28+0x20/0xb0 [drm_kms_helper] > [ 246.761516] 2 locks held by kworker/0:1/60: > [ 246.762274] #0: 00000000fff6be0f ((wq_completion)"pm"){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.762982] #1: 000000005ab44fb4 ((work_completion)(&dev->power.work)){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.763890] 1 lock held by khungtaskd/64: > [ 246.764664] #0: 000000008cb8b5c3 (rcu_read_lock){....}, at: debug_show_all_locks+0x23/0x185 > [ 246.765588] 5 locks held by kworker/4:2/422: > [ 246.766440] #0: 00000000232f0959 ((wq_completion)"events_long"){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.767390] #1: 00000000bb59b134 ((work_completion)(&mgr->work)){+.+.}, at: process_one_work+0x1b3/0x620 > [ 246.768154] #2: 00000000cb66735f (&helper->lock){+.+.}, at: drm_fb_helper_restore_fbdev_mode_unlocked+0x4c/0xb0 [drm_kms_helper] > [ 246.768966] #3: 000000004c8f0b6b (crtc_ww_class_acquire){+.+.}, at: restore_fbdev_mode_atomic+0x4b/0x240 [drm_kms_helper] > [ 246.769921] #4: 000000004c34a296 (crtc_ww_class_mutex){+.+.}, at: drm_modeset_backoff+0x8a/0x1b0 [drm] > [ 246.770839] 1 lock held by dmesg/1038: > [ 246.771739] 2 locks held by zsh/1172: > [ 246.772650] #0: 00000000836d0438 (&tty->ldisc_sem){++++}, at: ldsem_down_read+0x37/0x40 > [ 246.773680] #1: 000000001f4f4d48 (&ldata->atomic_read_lock){+.+.}, at: n_tty_read+0xc1/0x870 > > [ 246.775522] ============================================= > > So, to fix this (and any other possible deadlock issues like this that > could occur in the output_poll_changed patch) we make sure that > nouveau's output_poll_changed functions grab a runtime power ref before > sending any hotplug events, and hold it until we're finished. We > introduce this through adding a generic DRM helper which other drivers > may reuse. > > This fixes deadlock issues when in fbcon with nouveau on my P50, and > should fix it for everyone else's as well! > > Signed-off-by: Lyude Paul > Reviewed-by: Karol Herbst > Cc: Lukas Wunner > Cc: stable@vger.kernel.org > --- > Changes since v1: > - Add a generic helper for DRM to handle this > > drivers/gpu/drm/drm_fb_helper.c | 23 +++++++++++++++++++++++ > drivers/gpu/drm/nouveau/dispnv50/disp.c | 2 +- > include/drm/drm_fb_helper.h | 5 +++++ > 3 files changed, 29 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c > index 2ee1eaa66188..1ab2f3646526 100644 > --- a/drivers/gpu/drm/drm_fb_helper.c > +++ b/drivers/gpu/drm/drm_fb_helper.c > @@ -34,6 +34,7 @@ > #include > #include > #include > +#include > #include > #include > #include > @@ -2928,6 +2929,28 @@ void drm_fb_helper_output_poll_changed(struct drm_device *dev) > } > EXPORT_SYMBOL(drm_fb_helper_output_poll_changed); > > +/** > + * drm_fb_helper_output_poll_changed_with_rpm - DRM mode > + * config \.output_poll_changed > + * helper for fbdev emulation > + * @dev: DRM device > + * > + * Same as drm_fb_helper_output_poll_changed, except that it makes sure that > + * the device is active by synchronously grabbing a runtime power reference > + * while probing. > + */ > +void drm_fb_helper_output_poll_changed_with_rpm(struct drm_device *dev) > +{ > + int ret; > + > + ret = pm_runtime_get_sync(dev->dev); > + if (WARN_ON(ret < 0 && ret != -EACCES)) > + return; > + drm_fb_helper_hotplug_event(dev->fb_helper); > + pm_runtime_put(dev->dev); > +} > +EXPORT_SYMBOL(drm_fb_helper_output_poll_changed_with_rpm); > + > /* The Kconfig DRM_KMS_HELPER selects FRAMEBUFFER_CONSOLE (if !EXPERT) > * but the module doesn't depend on any fb console symbols. At least > * attempt to load fbcon to avoid leaving the system without a usable console. > diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c > index eb3e41a78806..fa3ab618a0f9 100644 > --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c > +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c > @@ -2015,7 +2015,7 @@ nv50_disp_atomic_state_alloc(struct drm_device *dev) > static const struct drm_mode_config_funcs > nv50_disp_func = { > .fb_create = nouveau_user_framebuffer_create, > - .output_poll_changed = drm_fb_helper_output_poll_changed, > + .output_poll_changed = drm_fb_helper_output_poll_changed_with_rpm, > .atomic_check = nv50_disp_atomic_check, > .atomic_commit = nv50_disp_atomic_commit, > .atomic_state_alloc = nv50_disp_atomic_state_alloc, > diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h > index b069433e7fc1..ca809bfbaebb 100644 > --- a/include/drm/drm_fb_helper.h > +++ b/include/drm/drm_fb_helper.h > @@ -330,6 +330,7 @@ void drm_fb_helper_fbdev_teardown(struct drm_device *dev); > > void drm_fb_helper_lastclose(struct drm_device *dev); > void drm_fb_helper_output_poll_changed(struct drm_device *dev); > +void drm_fb_helper_output_poll_changed_with_rpm(struct drm_device *dev); > #else > static inline void drm_fb_helper_prepare(struct drm_device *dev, > struct drm_fb_helper *helper, > @@ -564,6 +565,10 @@ static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev) > { > } > > +static inline void drm_fb_helper_output_poll_changed_with_rpm(struct drm_device *dev) > +{ > +} > + > #endif > > static inline int > -- > 2.17.1 >