From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lyude Paul Subject: [PATCH v4 3/8] drm/fb_helper: Introduce suspend/resume_hotplug() Date: Wed, 1 Aug 2018 17:14:53 -0400 Message-ID: <20180801211459.7731-4-lyude@redhat.com> References: <20180801211459.7731-1-lyude@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180801211459.7731-1-lyude@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: nouveau@lists.freedesktop.org Cc: David Airlie , Karol Herbst , stable@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org List-Id: nouveau.vger.kernel.org SSdtIHN1cmUgSSBkb24ndCBuZWVkIHRvIHRlbGwgeW91IHRoYXQgZmJfaGVscGVyJ3MgbG9ja2lu ZyBpcyBhIG1lc3MuClRoYXQgYmVpbmcgc2FpZDsgZmJfaGVscGVyJ3MgbG9ja2luZyBtZXNzIGNh biBzZXJpb3VzbHkgY29tcGxpY2F0ZSB0aGUKcnVudGltZSBzdXNwZW5kL3Jlc3VtZSBvcGVyYXRp b25zIG9mIGRyaXZlcnMgYmVjYXVzZSBpdCBjYW4gaW52b2tlCmF0b21pYyBjb21taXRzIGFuZCBj b25uZWN0b3IgcHJvYmluZyBmcm9tIGFueXdoZXJlIHRoYXQgY2FsbHMKZHJtX2ZiX2hlbHBlcl9o b3RwbHVnX2V2ZW50KCkuIFNpbmNlIG1vc3QgZHJpdmVycyB1c2UKZHJtX2ZiX2hlbHBlcl9vdXRw dXRfcG9sbF9jaGFuZ2VkKCkgYXMgdGhlaXIgb3V0cHV0X3BvbGxfY2hhbmdlZApoYW5kbGVyLCB0 aGlzIGNhbiBoYXBwZW4gaW4gZXZlcnkgc2luZ2xlIGNvbnRleHQgdGhhdCBjYW4gZmlyZSBvZmYg YQpob3RwbHVnIGV2ZW50LiBBbiBleGFtcGxlOgoKWyAgMjQ2LjY2OTYyNV0gSU5GTzogdGFzayBr d29ya2VyLzQ6MDozNyBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIwIHNlY29uZHMuClsgIDI0Ni42 NzMzOThdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1yYzVMeXVkZS1UZXN0KyAjMgpbICAyNDYu Njc1MjcxXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5nX3Rhc2tfdGltZW91dF9zZWNz IiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuClsgIDI0Ni42NzY1MjddIGt3b3JrZXIvNDowICAgICBE ICAgIDAgICAgMzcgICAgICAyIDB4ODAwMDAwMDAKWyAgMjQ2LjY3NzU4MF0gV29ya3F1ZXVlOiBl dmVudHMgb3V0cHV0X3BvbGxfZXhlY3V0ZSBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42Nzg3MDRd IENhbGwgVHJhY2U6ClsgIDI0Ni42Nzk3NTNdICBfX3NjaGVkdWxlKzB4MzIyLzB4YWYwClsgIDI0 Ni42ODA5MTZdICBzY2hlZHVsZSsweDMzLzB4OTAKWyAgMjQ2LjY4MTkyNF0gIHNjaGVkdWxlX3By ZWVtcHRfZGlzYWJsZWQrMHgxNS8weDIwClsgIDI0Ni42ODMwMjNdICBfX211dGV4X2xvY2srMHg1 NjkvMHg5YTAKWyAgMjQ2LjY4NDAzNV0gID8ga29iamVjdF91ZXZlbnRfZW52KzB4MTE3LzB4N2Iw ClsgIDI0Ni42ODUxMzJdICA/IGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4 MjAvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42ODYxNzldICBtdXRleF9sb2NrX25lc3Rl ZCsweDFiLzB4MjAKWyAgMjQ2LjY4NzI3OF0gID8gbXV0ZXhfbG9ja19uZXN0ZWQrMHgxYi8weDIw ClsgIDI0Ni42ODgzMDddICBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQucGFydC4yOCsweDIw LzB4YjAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYuNjg5NDIwXSAgZHJtX2ZiX2hlbHBlcl9vdXRw dXRfcG9sbF9jaGFuZ2VkKzB4MjMvMHgzMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni42OTA0NjJd ICBkcm1fa21zX2hlbHBlcl9ob3RwbHVnX2V2ZW50KzB4MmEvMHgzMCBbZHJtX2ttc19oZWxwZXJd ClsgIDI0Ni42OTE1NzBdICBvdXRwdXRfcG9sbF9leGVjdXRlKzB4MTk4LzB4MWMwIFtkcm1fa21z X2hlbHBlcl0KWyAgMjQ2LjY5MjYxMV0gIHByb2Nlc3Nfb25lX3dvcmsrMHgyMzEvMHg2MjAKWyAg MjQ2LjY5MzcyNV0gIHdvcmtlcl90aHJlYWQrMHgyMTQvMHgzYTAKWyAgMjQ2LjY5NDc1Nl0gIGt0 aHJlYWQrMHgxMmIvMHgxNTAKWyAgMjQ2LjY5NTg1Nl0gID8gd3FfcG9vbF9pZHNfc2hvdysweDE0 MC8weDE0MApbICAyNDYuNjk2ODg4XSAgPyBrdGhyZWFkX2NyZWF0ZV93b3JrZXJfb25fY3B1KzB4 NzAvMHg3MApbICAyNDYuNjk3OTk4XSAgcmV0X2Zyb21fZm9yaysweDNhLzB4NTAKWyAgMjQ2LjY5 OTAzNF0gSU5GTzogdGFzayBrd29ya2VyLzA6MTo2MCBibG9ja2VkIGZvciBtb3JlIHRoYW4gMTIw IHNlY29uZHMuClsgIDI0Ni43MDAxNTNdICAgICAgIE5vdCB0YWludGVkIDQuMTguMC1yYzVMeXVk ZS1UZXN0KyAjMgpbICAyNDYuNzAxMTgyXSAiZWNobyAwID4gL3Byb2Mvc3lzL2tlcm5lbC9odW5n X3Rhc2tfdGltZW91dF9zZWNzIiBkaXNhYmxlcyB0aGlzIG1lc3NhZ2UuClsgIDI0Ni43MDIyNzhd IGt3b3JrZXIvMDoxICAgICBEICAgIDAgICAgNjAgICAgICAyIDB4ODAwMDAwMDAKWyAgMjQ2Ljcw MzI5M10gV29ya3F1ZXVlOiBwbSBwbV9ydW50aW1lX3dvcmsKWyAgMjQ2LjcwNDM5M10gQ2FsbCBU cmFjZToKWyAgMjQ2LjcwNTQwM10gIF9fc2NoZWR1bGUrMHgzMjIvMHhhZjAKWyAgMjQ2LjcwNjQz OV0gID8gd2FpdF9mb3JfY29tcGxldGlvbisweDEwNC8weDE5MApbICAyNDYuNzA3MzkzXSAgc2No ZWR1bGUrMHgzMy8weDkwClsgIDI0Ni43MDgzNzVdICBzY2hlZHVsZV90aW1lb3V0KzB4M2E1LzB4 NTkwClsgIDI0Ni43MDkyODldICA/IG1hcmtfaGVsZF9sb2NrcysweDU4LzB4ODAKWyAgMjQ2Ljcx MDIwOF0gID8gX3Jhd19zcGluX3VubG9ja19pcnErMHgyYy8weDQwClsgIDI0Ni43MTEyMjJdICA/ IHdhaXRfZm9yX2NvbXBsZXRpb24rMHgxMDQvMHgxOTAKWyAgMjQ2LjcxMjEzNF0gID8gdHJhY2Vf aGFyZGlycXNfb25fY2FsbGVyKzB4ZjQvMHgxOTAKWyAgMjQ2LjcxMzA5NF0gID8gd2FpdF9mb3Jf Y29tcGxldGlvbisweDEwNC8weDE5MApbICAyNDYuNzEzOTY0XSAgd2FpdF9mb3JfY29tcGxldGlv bisweDEyYy8weDE5MApbICAyNDYuNzE0ODk1XSAgPyB3YWtlX3VwX3ErMHg4MC8weDgwClsgIDI0 Ni43MTU3MjddICA/IGdldF93b3JrX3Bvb2wrMHg5MC8weDkwClsgIDI0Ni43MTY2NDldICBmbHVz aF93b3JrKzB4MWM5LzB4MjgwClsgIDI0Ni43MTc0ODNdICA/IGZsdXNoX3dvcmtxdWV1ZV9wcmVw X3B3cXMrMHgxYjAvMHgxYjAKWyAgMjQ2LjcxODQ0Ml0gIF9fY2FuY2VsX3dvcmtfdGltZXIrMHgx NDYvMHgxZDAKWyAgMjQ2LjcxOTI0N10gIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYysweDEzLzB4 MjAKWyAgMjQ2LjcyMDA0M10gIGRybV9rbXNfaGVscGVyX3BvbGxfZGlzYWJsZSsweDFmLzB4MzAg W2RybV9rbXNfaGVscGVyXQpbICAyNDYuNzIxMTIzXSAgbm91dmVhdV9wbW9wc19ydW50aW1lX3N1 c3BlbmQrMHgzZC8weGIwIFtub3V2ZWF1XQpbICAyNDYuNzIxODk3XSAgcGNpX3BtX3J1bnRpbWVf c3VzcGVuZCsweDZiLzB4MTkwClsgIDI0Ni43MjI4MjVdICA/IHBjaV9oYXNfbGVnYWN5X3BtX3N1 cHBvcnQrMHg3MC8weDcwClsgIDI0Ni43MjM3MzddICBfX3JwbV9jYWxsYmFjaysweDdhLzB4MWQw ClsgIDI0Ni43MjQ3MjFdICA/IHBjaV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQrMHg3MC8weDcwClsg IDI0Ni43MjU2MDddICBycG1fY2FsbGJhY2srMHgyNC8weDgwClsgIDI0Ni43MjY1NTNdICA/IHBj aV9oYXNfbGVnYWN5X3BtX3N1cHBvcnQrMHg3MC8weDcwClsgIDI0Ni43MjczNzZdICBycG1fc3Vz cGVuZCsweDE0Mi8weDZiMApbICAyNDYuNzI4MTg1XSAgcG1fcnVudGltZV93b3JrKzB4OTcvMHhj MApbICAyNDYuNzI4OTM4XSAgcHJvY2Vzc19vbmVfd29yaysweDIzMS8weDYyMApbICAyNDYuNzI5 Nzk2XSAgd29ya2VyX3RocmVhZCsweDQ0LzB4M2EwClsgIDI0Ni43MzA2MTRdICBrdGhyZWFkKzB4 MTJiLzB4MTUwClsgIDI0Ni43MzEzOTVdICA/IHdxX3Bvb2xfaWRzX3Nob3crMHgxNDAvMHgxNDAK WyAgMjQ2LjczMjIwMl0gID8ga3RocmVhZF9jcmVhdGVfd29ya2VyX29uX2NwdSsweDcwLzB4NzAK WyAgMjQ2LjczMjg3OF0gIHJldF9mcm9tX2ZvcmsrMHgzYS8weDUwClsgIDI0Ni43MzM3NjhdIElO Rk86IHRhc2sga3dvcmtlci80OjI6NDIyIGJsb2NrZWQgZm9yIG1vcmUgdGhhbiAxMjAgc2Vjb25k cy4KWyAgMjQ2LjczNDU4N10gICAgICAgTm90IHRhaW50ZWQgNC4xOC4wLXJjNUx5dWRlLVRlc3Qr ICMyClsgIDI0Ni43MzUzOTNdICJlY2hvIDAgPiAvcHJvYy9zeXMva2VybmVsL2h1bmdfdGFza190 aW1lb3V0X3NlY3MiIGRpc2FibGVzIHRoaXMgbWVzc2FnZS4KWyAgMjQ2LjczNjExM10ga3dvcmtl ci80OjIgICAgIEQgICAgMCAgIDQyMiAgICAgIDIgMHg4MDAwMDA4MApbICAyNDYuNzM2Nzg5XSBX b3JrcXVldWU6IGV2ZW50c19sb25nIGRybV9kcF9tc3RfbGlua19wcm9iZV93b3JrIFtkcm1fa21z X2hlbHBlcl0KWyAgMjQ2LjczNzY2NV0gQ2FsbCBUcmFjZToKWyAgMjQ2LjczODQ5MF0gIF9fc2No ZWR1bGUrMHgzMjIvMHhhZjAKWyAgMjQ2LjczOTI1MF0gIHNjaGVkdWxlKzB4MzMvMHg5MApbICAy NDYuNzM5OTA4XSAgcnBtX3Jlc3VtZSsweDE5Yy8weDg1MApbICAyNDYuNzQwNzUwXSAgPyBmaW5p c2hfd2FpdCsweDkwLzB4OTAKWyAgMjQ2Ljc0MTU0MV0gIF9fcG1fcnVudGltZV9yZXN1bWUrMHg0 ZS8weDkwClsgIDI0Ni43NDIzNzBdICBudjUwX2Rpc3BfYXRvbWljX2NvbW1pdCsweDMxLzB4MjEw IFtub3V2ZWF1XQpbICAyNDYuNzQzMTI0XSAgZHJtX2F0b21pY19jb21taXQrMHg0YS8weDUwIFtk cm1dClsgIDI0Ni43NDM3NzVdICByZXN0b3JlX2ZiZGV2X21vZGVfYXRvbWljKzB4MWM4LzB4MjQw IFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0NDYwM10gIHJlc3RvcmVfZmJkZXZfbW9kZSsweDMx LzB4MTQwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0NTM3M10gIGRybV9mYl9oZWxwZXJfcmVz dG9yZV9mYmRldl9tb2RlX3VubG9ja2VkKzB4NTQvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0 Ni43NDYyMjBdICBkcm1fZmJfaGVscGVyX3NldF9wYXIrMHgyZC8weDUwIFtkcm1fa21zX2hlbHBl cl0KWyAgMjQ2Ljc0Njg4NF0gIGRybV9mYl9oZWxwZXJfaG90cGx1Z19ldmVudC5wYXJ0LjI4KzB4 OTYvMHhiMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni43NDc2NzVdICBkcm1fZmJfaGVscGVyX291 dHB1dF9wb2xsX2NoYW5nZWQrMHgyMy8weDMwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc0ODU0 NF0gIGRybV9rbXNfaGVscGVyX2hvdHBsdWdfZXZlbnQrMHgyYS8weDMwIFtkcm1fa21zX2hlbHBl cl0KWyAgMjQ2Ljc0OTQzOV0gIG52NTBfbXN0bV9ob3RwbHVnKzB4MTUvMHgyMCBbbm91dmVhdV0K WyAgMjQ2Ljc1MDExMV0gIGRybV9kcF9zZW5kX2xpbmtfYWRkcmVzcysweDE3Ny8weDFjMCBbZHJt X2ttc19oZWxwZXJdClsgIDI0Ni43NTA3NjRdICBkcm1fZHBfY2hlY2tfYW5kX3NlbmRfbGlua19h ZGRyZXNzKzB4YTgvMHhkMCBbZHJtX2ttc19oZWxwZXJdClsgIDI0Ni43NTE2MDJdICBkcm1fZHBf bXN0X2xpbmtfcHJvYmVfd29yaysweDUxLzB4OTAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYuNzUy MzE0XSAgcHJvY2Vzc19vbmVfd29yaysweDIzMS8weDYyMApbICAyNDYuNzUyOTc5XSAgd29ya2Vy X3RocmVhZCsweDQ0LzB4M2EwClsgIDI0Ni43NTM4MzhdICBrdGhyZWFkKzB4MTJiLzB4MTUwClsg IDI0Ni43NTQ2MTldICA/IHdxX3Bvb2xfaWRzX3Nob3crMHgxNDAvMHgxNDAKWyAgMjQ2Ljc1NTM4 Nl0gID8ga3RocmVhZF9jcmVhdGVfd29ya2VyX29uX2NwdSsweDcwLzB4NzAKWyAgMjQ2Ljc1NjE2 Ml0gIHJldF9mcm9tX2ZvcmsrMHgzYS8weDUwClsgIDI0Ni43NTY4NDddCgkgICBTaG93aW5nIGFs bCBsb2NrcyBoZWxkIGluIHRoZSBzeXN0ZW06ClsgIDI0Ni43NTgyNjFdIDMgbG9ja3MgaGVsZCBi eSBrd29ya2VyLzQ6MC8zNzoKWyAgMjQ2Ljc1OTAxNl0gICMwOiAwMDAwMDAwMGY4ZGY0ZDJkICgo d3FfY29tcGxldGlvbikiZXZlbnRzIil7Ky4rLn0sIGF0OiBwcm9jZXNzX29uZV93b3JrKzB4MWIz LzB4NjIwClsgIDI0Ni43NTk4NTZdICAjMTogMDAwMDAwMDBlNjA2NTQ2MSAoKHdvcmtfY29tcGxl dGlvbikoJigmZGV2LT5tb2RlX2NvbmZpZy5vdXRwdXRfcG9sbF93b3JrKS0+d29yaykpeysuKy59 LCBhdDogcHJvY2Vzc19vbmVfd29yaysweDFiMy8weDYyMApbICAyNDYuNzYwNjcwXSAgIzI6IDAw MDAwMDAwY2I2NjczNWYgKCZoZWxwZXItPmxvY2speysuKy59LCBhdDogZHJtX2ZiX2hlbHBlcl9o b3RwbHVnX2V2ZW50LnBhcnQuMjgrMHgyMC8weGIwIFtkcm1fa21zX2hlbHBlcl0KWyAgMjQ2Ljc2 MTUxNl0gMiBsb2NrcyBoZWxkIGJ5IGt3b3JrZXIvMDoxLzYwOgpbICAyNDYuNzYyMjc0XSAgIzA6 IDAwMDAwMDAwZmZmNmJlMGYgKCh3cV9jb21wbGV0aW9uKSJwbSIpeysuKy59LCBhdDogcHJvY2Vz c19vbmVfd29yaysweDFiMy8weDYyMApbICAyNDYuNzYyOTgyXSAgIzE6IDAwMDAwMDAwNWFiNDRm YjQgKCh3b3JrX2NvbXBsZXRpb24pKCZkZXYtPnBvd2VyLndvcmspKXsrLisufSwgYXQ6IHByb2Nl c3Nfb25lX3dvcmsrMHgxYjMvMHg2MjAKWyAgMjQ2Ljc2Mzg5MF0gMSBsb2NrIGhlbGQgYnkga2h1 bmd0YXNrZC82NDoKWyAgMjQ2Ljc2NDY2NF0gICMwOiAwMDAwMDAwMDhjYjhiNWMzIChyY3VfcmVh ZF9sb2NrKXsuLi4ufSwgYXQ6IGRlYnVnX3Nob3dfYWxsX2xvY2tzKzB4MjMvMHgxODUKWyAgMjQ2 Ljc2NTU4OF0gNSBsb2NrcyBoZWxkIGJ5IGt3b3JrZXIvNDoyLzQyMjoKWyAgMjQ2Ljc2NjQ0MF0g ICMwOiAwMDAwMDAwMDIzMmYwOTU5ICgod3FfY29tcGxldGlvbikiZXZlbnRzX2xvbmciKXsrLisu fSwgYXQ6IHByb2Nlc3Nfb25lX3dvcmsrMHgxYjMvMHg2MjAKWyAgMjQ2Ljc2NzM5MF0gICMxOiAw MDAwMDAwMGJiNTliMTM0ICgod29ya19jb21wbGV0aW9uKSgmbWdyLT53b3JrKSl7Ky4rLn0sIGF0 OiBwcm9jZXNzX29uZV93b3JrKzB4MWIzLzB4NjIwClsgIDI0Ni43NjgxNTRdICAjMjogMDAwMDAw MDBjYjY2NzM1ZiAoJmhlbHBlci0+bG9jayl7Ky4rLn0sIGF0OiBkcm1fZmJfaGVscGVyX3Jlc3Rv cmVfZmJkZXZfbW9kZV91bmxvY2tlZCsweDRjLzB4YjAgW2RybV9rbXNfaGVscGVyXQpbICAyNDYu NzY4OTY2XSAgIzM6IDAwMDAwMDAwNGM4ZjBiNmIgKGNydGNfd3dfY2xhc3NfYWNxdWlyZSl7Ky4r Ln0sIGF0OiByZXN0b3JlX2ZiZGV2X21vZGVfYXRvbWljKzB4NGIvMHgyNDAgW2RybV9rbXNfaGVs cGVyXQpbICAyNDYuNzY5OTIxXSAgIzQ6IDAwMDAwMDAwNGMzNGEyOTYgKGNydGNfd3dfY2xhc3Nf bXV0ZXgpeysuKy59LCBhdDogZHJtX21vZGVzZXRfYmFja29mZisweDhhLzB4MWIwIFtkcm1dClsg IDI0Ni43NzA4MzldIDEgbG9jayBoZWxkIGJ5IGRtZXNnLzEwMzg6ClsgIDI0Ni43NzE3MzldIDIg bG9ja3MgaGVsZCBieSB6c2gvMTE3MjoKWyAgMjQ2Ljc3MjY1MF0gICMwOiAwMDAwMDAwMDgzNmQw NDM4ICgmdHR5LT5sZGlzY19zZW0peysrKyt9LCBhdDogbGRzZW1fZG93bl9yZWFkKzB4MzcvMHg0 MApbICAyNDYuNzczNjgwXSAgIzE6IDAwMDAwMDAwMWY0ZjRkNDggKCZsZGF0YS0+YXRvbWljX3Jl YWRfbG9jayl7Ky4rLn0sIGF0OiBuX3R0eV9yZWFkKzB4YzEvMHg4NzAKClsgIDI0Ni43NzU1MjJd ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKQmVjYXVzZSBv ZiB0aGlzLCB0aGVyZSdzIGFuIHVucmVhc29uYWJsZSBudW1iZXIgb2YgcGxhY2VzIHRoYXQgZHJt CmRyaXZlcnMgd291bGQgbmVlZCB0byBpbnNlcnQgc3BlY2lhbCBoYW5kbGluZyB0byBwcmV2ZW50 IHRyeWluZyB0bwpyZXN1bWUgdGhlIGRldmljZSBmcm9tIGFsbCBvZiB0aGVzZSBjb250ZXh0cyB0 aGF0IGNhbiBkZWFkbG9jay4gSXQncwpkaWZmaWN1bHQgZXZlbiB0byB0cnkgc3luY2hyb25pemlu ZyB3aXRoIGZiX2hlbHBlciBpbiB0aGVzZSBjb250ZXh0cyBhcwp3ZWxsLCBzaW5jZSBhbnkgb2Yg dGhlbSBjb3VsZCBpbnRyb2R1Y2UgYSBkZWFkbG9jayBieSB3YWl0aW5nIHRvIGFjcXVpcmUKdGhl IHRvcC1sZXZlbCBmYl9oZWxwZXIgbXV0ZXgsIHdoaWxlIGl0J3MgYmVpbmcgaGVsZCBieSBhbm90 aGVyIHRocmVhZAp0aGF0IG1pZ2h0IHBvdGVudGlhbGx5IGNhbGwgZG93biB0byBwbV9ydW50aW1l X2dldF9zeW5jKCkuCgpMdWNraWx5LXRoZXJlJ3Mgbm8gYWN0dWFsIHJlYXNvbiB3ZSBuZWVkIHRv IGFsbG93IGZiX2hlbHBlciB0byBoYW5kbGUKaG90cGx1Z2dpbmcgYXQgYWxsIHdoZW4gcnVudGlt ZSBzdXNwZW5kaW5nIGEgZGV2aWNlLiBJZiBhIGhvdHBsdWcKaGFwcGVucyBkdXJpbmcgYSBydW50 aW1lIHN1c3BlbmQgb3BlcmF0aW9uLCB0aGVyZSdzIG5vIHJlYXNvbiB0aGUgZHJpdmVyCmNhbid0 IGp1c3QgcmUtZW5hYmxlIGZiY29uJ3MgaG90cGx1ZyBoYW5kbGluZyBhbmQgYnJpbmcgaXQgdXAg dG8gc3BlZWQKd2l0aCBob3RwbHVnZ2luZyBldmVudHMgaXQgbWF5IGhhdmUgbWlzc2VkIGJ5IGNh bGxpbmcKZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50KCkuCgpTbywgbGV0J3MgbWFrZSB0aGlz IGVhc3kgYW5kIGp1c3QgYWRkIGhlbHBlcnMgdG8gaGFuZGxlIGRpc2FibGluZyBhbmQKZW5hYmxp bmcgZmJfaGVscGVyIGNvbm5lY3RvciBwcm9iaW5nKCkgd2l0aG91dCBoYXZpbmcgdG8gcG90ZW50 aWFsbHkKd2FpdCBvbiBmYl9oZWxwZXIgdG8gZmluaXNoIGl0J3Mgd29yay4gVGhpcyB3aWxsIGxl dCB1cyBmaXggdGhlIHJ1bnRpbWUKc3VzcGVuZC9yZXN1bWUgZGVhZGxvY2tzIHRoYXQgd2UndmUg YmVlbiBleHBlcmllbmNpbmcgd2l0aCBub3V2ZWF1LAphbG9uZyB3aXRoIGJlaW5nIGFibGUgdG8g Zml4IHNvbWUgb2YgdGhlIGluY29ycmVjdCBydW50aW1lIFBNIGNvcmUKaW50ZXJhY3Rpb24gdGhh dCBvdGhlciBEUk0gZHJpdmVycyBjdXJyZW50bHkgcGVyZm9ybSB0byB3b3JrIGFyb3VuZAp0aGVz ZSBpc3N1ZXMuCgpDaGFuZ2VzIHNpbmNlIHYzOgotIEFjdHVhbGx5IGNoZWNrIGlmIGZiX2hlbHBl ciBpcyBOVUxMIGluIGJvdGggbmV3IGhlbHBlcnMKLSBBY3R1YWxseSBjaGVjayBkcm1fZmJkZXZf ZW11bGF0aW9uIGluIGJvdGggbmV3IGhlbHBlcnMKLSBEb24ndCBmaXJlIG9mZiBhIGZiX2hlbHBl ciBob3RwbHVnIHVuY29uZGl0aW9uYWxseTsgb25seSBkbyBpdCBpZgogIHRoZSBmb2xsb3dpbmcg Y29uZGl0aW9ucyBhcmUgdHJ1ZSAoYXMgb3RoZXJ3aXNlLCBjYWxsaW5nIHRoaXMgaW4gdGhlCiAg d3Jvbmcgc3BvdCB3aWxsIGNhdXNlIEJhZCBUaGluZ3MgdG8gaGFwcGVuKToKICAtIGZiX2hlbHBl ciBob3RwbHVnIGhhbmRsaW5nIHdhcyBhY3R1YWxseSBpbmhpYml0ZWQgcHJldmlvdXNseQogIC0g ZmJfaGVscGVyIGFjdHVhbGx5IGhhcyBhIGRlbGF5ZWQgaG90cGx1ZyBwZW5kaW5nCiAgLSBmYl9o ZWxwZXIgaXMgYWN0dWFsbHkgYm91bmQKICAtIGZiX2hlbHBlciBpcyBhY3R1YWxseSBpbml0aWFs aXplZAotIEFkZCBfX211c3RfY2hlY2sgdG8gZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWco KS4gVGhlcmUncyBubwogIHNpdHVhdGlvbiB3aGVyZSBhIGRyaXZlciB3b3VsZCBhY3R1YWxseSB3 YW50IHRvIHVzZSB0aGlzIHdpdGhvdXQKICBjaGVja2luZyB0aGUgcmV0dXJuIHZhbHVlLCBzbyBl bmZvcmNlIHRoYXQKLSBSZXdyaXRlIGFuZCBjbGFyaWZ5IHRoZSBkb2N1bWVudGF0aW9uIGZvciBi b3RoIGhlbHBlcnMuCi0gTWFrZSBzdXJlIHRvIHJldHVybiB0cnVlIGluIHRoZSBkcm1fZmJfaGVs cGVyX3N1c3BlbmRfaG90cGx1ZygpIHN0dWIKICB0aGF0J3MgcHJvdmlkZWQgaW4gZHJtX2ZiX2hl bHBlci5oIHdoZW4gQ09ORklHX0RSTV9GQkRFVl9FTVVMQVRJT04KICBpc24ndCBlbmFibGVkCi0g QWN0dWFsbHkgZ3JhYiB0aGUgdG9wbGV2ZWwgZmJfaGVscGVyIGxvY2sgaW4KICBkcm1fZmJfaGVs cGVyX3Jlc3VtZV9ob3RwbHVnKCksIHNpbmNlIGl0J3MgcG9zc2libGUgb3RoZXIgYWN0aXZpdHkK ICAoc3VjaCBhcyBhIGhvdHBsdWcpIGNvdWxkIGJlIGdvaW5nIG9uIGF0IHRoZSBzYW1lIHRpbWUg dGhlIGRyaXZlcgogIGNhbGxzIGRybV9mYl9oZWxwZXJfcmVzdW1lX2hvdHBsdWcoKS4gV2UgbmVl ZCB0aGlzIHRvIGNoZWNrIHdoZXRoZXIgb3IKICBub3QgZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2 ZW50KCkgbmVlZHMgdG8gYmUgY2FsbGVkIGFueXdheQoKU2lnbmVkLW9mZi1ieTogTHl1ZGUgUGF1 bCA8bHl1ZGVAcmVkaGF0LmNvbT4KQ2M6IHN0YWJsZUB2Z2VyLmtlcm5lbC5vcmcKQ2M6IEx1a2Fz IFd1bm5lciA8bHVrYXNAd3VubmVyLmRlPgpDYzogS2Fyb2wgSGVyYnN0IDxrYXJvbGhlcmJzdEBn bWFpbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYyB8IDEyMyArKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrLQogaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5o ICAgICB8ICAyMiArKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTQ0IGluc2VydGlvbnMoKyksIDEg ZGVsZXRpb24oLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5j IGIvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwppbmRleCAyZWUxZWFhNjYxODguLmI1 ZjFkZWUwYzNhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9mYl9oZWxwZXIuYwor KysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ZiX2hlbHBlci5jCkBAIC04NCw2ICs4NCwxMSBAQCBz dGF0aWMgREVGSU5FX01VVEVYKGtlcm5lbF9mYl9oZWxwZXJfbG9jayk7CiAgKiBGb3Igc3VzcGVu ZC9yZXN1bWUgY29uc2lkZXIgdXNpbmcgZHJtX21vZGVfY29uZmlnX2hlbHBlcl9zdXNwZW5kKCkg YW5kCiAgKiBkcm1fbW9kZV9jb25maWdfaGVscGVyX3Jlc3VtZSgpIHdoaWNoIHRha2VzIGNhcmUg b2YgZmJkZXYgYXMgd2VsbC4KICAqCisgKiBGb3IgcnVudGltZSBzdXNwZW5kIGFuZCBydW50aW1l IHJlc3VtZSwgZHJpdmVycyB3aGljaCBuZWVkIHRvIGRpc2FibGUKKyAqIG5vcm1hbCBob3RwbHVn IGhhbmRsaW5nIHNob3VsZCBjb25zaWRlciB1c2luZworICogZHJtX2ZiX2hlbHBlcl9zdXNwZW5k X2hvdHBsdWcoKSBhbmQgZHJtX2ZiX2hlbHBlcl9yZXN1bWVfaG90cGx1ZygpIHRvCisgKiBhdm9p ZCBkZWFkbG9ja2luZyB3aXRoIGZiX2hlbHBlcidzIGhvdHBsdWcgaGFuZGxpbmcuCisgKgogICog QWxsIG90aGVyIGZ1bmN0aW9ucyBleHBvcnRlZCBieSB0aGUgZmIgaGVscGVyIGxpYnJhcnkgY2Fu IGJlIHVzZWQgdG8KICAqIGltcGxlbWVudCB0aGUgZmJkZXYgZHJpdmVyIGludGVyZmFjZSBieSB0 aGUgZHJpdmVyLgogICoKQEAgLTI3MzMsNiArMjczOCwxMTggQEAgaW50IGRybV9mYl9oZWxwZXJf aW5pdGlhbF9jb25maWcoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlciwgaW50IGJwcF9z ZWwpCiB9CiBFWFBPUlRfU1lNQk9MKGRybV9mYl9oZWxwZXJfaW5pdGlhbF9jb25maWcpOwogCisv KioKKyAqIGRybV9mYl9oZWxwZXJfcmVzdW1lX2hvdHBsdWcgLSBVbmluaGliaXQgZmJfaGVscGVy IGhvdHBsdWcgaGFuZGxpbmcKKyAqIEBmYl9oZWxwZXI6IGRyaXZlci1hbGxvY2F0ZWQgZmJkZXYg aGVscGVyLCBjYW4gYmUgTlVMTAorICoKKyAqIFVuaW5oaWJpdCBmYl9oZWxwZXIncyBob3RwbHVn IGhhbmRsaW5nIGFmdGVyIGl0IHdhcyBwcmV2aW91c2x5IGluaGliaXRlZCBieQorICogYSBjYWxs IHRvIGRybV9mYl9oZWxwZXJfc3VzcGVuZF9ob3RwbHVnKCkuIFVubGlrZQorICogZHJtX2ZiX2hl bHBlcl9zdXNwZW5kX2hvdHBsdWcoKSwgdGhpcyBmdW5jdGlvbiB3aWxsIHdhaXQgb24KKyAqIGZi X2hlbHBlci0+bG9jay4KKyAqCisgKiBUaGlzIGhlbHBlciB3aWxsIHRha2UgY2FyZSBvZiBoYW5k bGluZyBhbnkgaG90cGx1ZyBldmVudHMgdGhhdCBoYXBwZW5lZAorICogd2hpbGUgZmJfaGVscGVy J3MgaG90cGx1ZyBoYW5kbGluZyB3YXMgc3VzcGVuZGVkLiBTaW5jZSB0aGlzIHBvc3NpYmx5Cisg KiBpbXBsaWVzIGEgY2FsbCB0byBkcm1fZmJfaGVscGVyX2hvdHBsdWdfZXZlbnQoKSwgY2FyZSBt dXN0IGJlIHRha2VuIHdoZW4KKyAqIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBhcyBpdCBtYXkgaW5p dGlhdGUgYSBtb2Rlc2V0LgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBp cyBkaWZmZXJlbnQgZnJvbQorICogZHJtX2ZiX2hlbHBlcl9zZXRfc3VzcGVuZCgpLiBJdCBkb2Vz IG5vdCByZXN1bWUgZmJfaGVscGVyLCBpdCBvbmx5IGFsbG93cworICogZmJfaGVscGVyIHRvIHBy b2JlIGNvbm5lY3RvcnMgaW4gcmVzcG9uc2UgdG8gY2hhbmdlcyB0byB0aGUgZGV2aWNlJ3MKKyAq IGNvbm5lY3RvciBjb25maWd1cmF0aW9uIGlmIHRoaXMgZnVuY3Rpb25hbGl0eSB3YXMgcHJldmlv dXNseSBkaXNhYmxlZCBieQorICogZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWcoKS4gR2Vu ZXJhbGx5LCBhIGRyaXZlciB3aWxsIG9ubHkgd2FudCB0byBjYWxsCisgKiB0aGlzIGluIGl0J3Mg cnVudGltZSByZXN1bWUgY2FsbGJhY2tzLgorICoKKyAqIERyaXZlcnMgY2FsbGluZyBkcm1fZmJf aGVscGVyX3N1c3BlbmRfaG90cGx1ZygpIG11c3QgbWFrZSBzdXJlIHRvIGNhbGwgdGhpcworICog c29tZXdoZXJlIGluIHRoZWlyIHJ1bnRpbWUgcmVzdW1lIGNhbGxiYWNrcy4KKyAqCisgKiBTZWUg YWxzbzogZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWcoKQorICovCit2b2lkCitkcm1fZmJf aGVscGVyX3Jlc3VtZV9ob3RwbHVnKHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCit7 CisJYm9vbCBjaGFuZ2VkOworCisJaWYgKCFkcm1fZmJkZXZfZW11bGF0aW9uIHx8ICFmYl9oZWxw ZXIpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJmZiX2hlbHBlci0+bG9jayk7CisKKwljaGFu Z2VkID0gIWZiX2hlbHBlci0+ZGVmZXJyZWRfc2V0dXAgJiYKKwkJICBmYl9oZWxwZXItPmZiICYm CisJCSAgZHJtX2ZiX2hlbHBlcl9pc19ib3VuZChmYl9oZWxwZXIpICYmCisJCSAgZmJfaGVscGVy LT5ob3RwbHVnX3N1c3BlbmRlZCAmJgorCQkgIGZiX2hlbHBlci0+ZGVsYXllZF9ob3RwbHVnOwor CWlmIChjaGFuZ2VkKQorCQlmYl9oZWxwZXItPmRlbGF5ZWRfaG90cGx1ZyA9IGZhbHNlOworCisJ ZmJfaGVscGVyLT5ob3RwbHVnX3N1c3BlbmRlZCA9IGZhbHNlOworCisJbXV0ZXhfdW5sb2NrKCZm Yl9oZWxwZXItPmxvY2spOworCisJaWYgKGNoYW5nZWQpCisJCWRybV9mYl9oZWxwZXJfaG90cGx1 Z19ldmVudChmYl9oZWxwZXIpOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVyX3Jlc3Vt ZV9ob3RwbHVnKTsKKworLyoqCisgKiBkcm1fZmJfaGVscGVyX3N1c3BlbmRfaG90cGx1ZyAtIEF0 dGVtcHQgdG8gdGVtcG9yYXJpbHkgc3VzcGVuZCBmYl9oZWxwZXIncworICogICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBob3RwbHVnIGhhbmRsaW5nCisgKiBAZmJfaGVscGVyOiBkcml2 ZXItYWxsb2NhdGVkIGZiZGV2IGhlbHBlciwgY2FuIGJlIE5VTEwKKyAqCisgKiBUZW1wb3Jhcmls eSBpbmhpYml0IGZiX2hlbHBlciBmcm9tIHJlc3BvbmRpbmcgdG8gY29ubmVjdG9yIGNoYW5nZXMg d2l0aG91dAorICogYmxvY2tpbmcgb24gZmJfaGVscGVyLT5sb2NrLCBpZiBwb3NzaWJsZS4gVGhp cyBjYW4gYmUgY2FsbGVkIGJ5IGEgRFJNCisgKiBkcml2ZXIgZWFybHkgb24gaW4gaXQncyBydW50 aW1lIHN1c3BlbmQgY2FsbGJhY2sgdG8gYm90aCBjaGVjayB3aGV0aGVyIG9yCisgKiBub3QgZmJf aGVscGVyIGlzIHN0aWxsIGJ1c3ksIGFuZCBwcmV2ZW50IGhvdHBsdWdzIHRoYXQgbWlnaHQgb2Nj dXIgcGFydC13YXkKKyAqIHRocm91Z2ggdGhlIHJ1bnRpbWUgc3VzcGVuZCBwcm9jZXNzIGZyb20g YmVpbmcgaGFuZGxlZCBieSBmYl9oZWxwZXIgdW50aWwKKyAqIGRybV9mYl9oZWxwZXJfcmVzdW1l X2hvdHBsdWcoKSBpcyBjYWxsZWQuIFRoaXMgZHJhbWF0aWNhbGx5IHNpbXBsaWZpZXMgdGhlCisg KiBydW50aW1lIHN1c3BlbmQgcHJvY2VzcywgYXMgaXQgZWxpbWluYXRlcyB0aGUgcG9zc2liaWxp dHkgdGhhdCBmYl9oZWxwZXIKKyAqIG1pZ2h0IHRyeSB0byBwZXJmb3JtIGEgbW9kZXNldCBoYWxm IHdheSB0aHJvdWdoIHRoZSBydW50aW1lIHN1c3BlbmQgcHJvY2VzcworICogaW4gcmVzcG9uc2Ug dG8gYSBjb25uZWN0b3IgaG90cGx1Zywgc29tZXRoaW5nIHdoaWNoIHdpbGwgYWxtb3N0IGNlcnRh aW5seQorICogbGVhZCB0byBkZWFkbG9ja2luZyBmb3IgZHJpdmVycyB0aGF0IG5lZWQgdG8gZGlz YWJsZSBub3JtYWwgaG90cGx1ZworICogaGFuZGxpbmcgaW4gdGhlaXIgcnVudGltZSBzdXNwZW5k IGhhbmRsZXJzLgorICoKKyAqIENhbGxzIHRvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHB1dCBh dCB0aGUgdmVyeSBzdGFydCBvZiBhIGRyaXZlcidzCisgKiBydW50aW1lIHN1c3BlbmQgb3BlcmF0 aW9uIGlmIGRlc2lyZWQuIFRoZSBkcml2ZXIgaXMgdGhlbiByZXNwb25zaWJsZSBmb3IKKyAqIHJl LWVuYWJsaW5nIGZiX2hlbHBlciBob3RwbHVnIGhhbmRsaW5nIHdoZW4gbm9ybWFsIGhvdHBsdWcg ZGV0ZWN0aW9uCisgKiBiZWNvbWVzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIGFnYWluIGJ5IGNh bGxpbmcKKyAqIGRybV9mYl9oZWxwZXJfcmVzdW1lX2hvdHBsdWcoKS4gVXN1YWxseSwgYSBkcml2 ZXIgd2lsbCB3YW50IHRvIHJlLWVuYWJsZQorICogZmJfaGVscGVyIGhvdHBsdWcgaGFuZGxpbmcg b25jZSB0aGUgaG90cGx1ZyBkZXRlY3Rpb24gY2FwYWJpbGl0aWVzIG9mIGl0cworICogZGV2aWNl cyBoYXZlIHJldHVybmVkIHRvIG5vcm1hbCAoZS5nLiB3aGVuIHRoZSBkZXZpY2UgaXMgcnVudGlt ZSByZXN1bWVkLAorICogb3IgYWZ0ZXIgdGhlIHJ1bnRpbWUgc3VzcGVuZCBwcm9jZXNzIHdhcyBh Ym9ydGVkIGZvciBzb21lIHJlYXNvbikuCisgKgorICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIGZ1 bmN0aW9uIGlzIGRpZmZlcmVudCBmcm9tCisgKiBkcm1fZmJfaGVscGVyX3NldF9zdXNwZW5kKCks IGluIHRoYXQgaXQgZG9lcyBub3QgYWN0dWFsbHkgc3VzcGVuZAorICogZmJfaGVscGVyLiBJdCBv bmx5IHByZXZlbnRzIGZiX2hlbHBlciBmcm9tIHJlc3BvbmRpbmcgdG8gY29ubmVjdG9yIGhvdHBs dWdzCisgKiBvbiBpdCdzIG93bi4gR2VuZXJhbGx5LCBhIGRyaXZlciB3aWxsIG9ubHkgd2FudCB0 byBjYWxsIHRoaXMgaW4gaXRzCisgKiBydW50aW1lIHN1c3BlbmQgY2FsbGJhY2suCisgKgorICog U2VlIGFsc286IGRybV9mYl9oZWxwZXJfcmVzdW1lX2hvdHBsdWcoKQorICoKKyAqIFJFVFVSTlM6 CisgKiBUcnVlIGlmIGhvdHBsdWcgaGFuZGxpbmcgd2FzIGRpc2FibGVkIHN1Y2Nlc3NmdWxseSwg b3IgZmJfaGVscGVyIHdhc24ndAorICogYWN0dWFsbHkgaW5pdGlhbGl6ZWQvZW5hYmxlZCB5ZXQu IEZhbHNlIGlmIGdyYWJiaW5nICZmYl9oZWxwZXItPmxvY2sgd291bGQKKyAqIGhhdmUgbWVhbnQg YmxvY2tpbmcgb24gZmJfaGVscGVyLiBXaGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSwg dGhpcworICogdXN1YWxseSBpbXBsaWVzIG1lYW5zIHRoYXQgZmJfaGVscGVyIGlzIHN0aWxsIGJ1 c3kgZG9pbmcgc29tZXRoaW5nIHN1Y2ggYXMKKyAqIHByb2JpbmcgY29ubmVjdG9ycyBvciBwZXJm b3JtaW5nIGEgbW9kZXNldC4gRHJpdmVycyBzaG91bGQgdHJlYXQgdGhpcyB0aGUKKyAqIHNhbWUg d2F5IHRoZXkgd291bGQgYW55IG90aGVyIGFjdGl2aXR5IG9uIHRoZSBkZXZpY2UsIGFuZCBhYm9y dCB0aGUgcnVudGltZQorICogc3VzcGVuZCBwcm9jZXNzIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGlu IHJlc3BvbnNlLgorICovCitib29sIF9fbXVzdF9jaGVjaworZHJtX2ZiX2hlbHBlcl9zdXNwZW5k X2hvdHBsdWcoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcikKK3sKKwlpZiAoIWRybV9m YmRldl9lbXVsYXRpb24gfHwgIWZiX2hlbHBlcikKKwkJcmV0dXJuIHRydWU7CisKKwlpZiAoIW11 dGV4X3RyeWxvY2soJmZiX2hlbHBlci0+bG9jaykpCisJCXJldHVybiBmYWxzZTsKKworCWZiX2hl bHBlci0+aG90cGx1Z19zdXNwZW5kZWQgPSB0cnVlOworCW11dGV4X3VubG9jaygmZmJfaGVscGVy LT5sb2NrKTsKKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChkcm1fZmJfaGVscGVy X3N1c3BlbmRfaG90cGx1Zyk7CisKIC8qKgogICogZHJtX2ZiX2hlbHBlcl9ob3RwbHVnX2V2ZW50 IC0gcmVzcG9uZCB0byBhIGhvdHBsdWcgbm90aWZpY2F0aW9uIGJ5CiAgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwcm9iaW5nIGFsbCB0aGUgb3V0cHV0cyBhdHRhY2hlZCB0byB0aGUg ZmIKQEAgLTI3NTEsNiArMjg2OCw5IEBAIEVYUE9SVF9TWU1CT0woZHJtX2ZiX2hlbHBlcl9pbml0 aWFsX2NvbmZpZyk7CiAgKiBmb3IgYSByYWNlLWZyZWUgZmJjb24gc2V0dXAgYW5kIHdpbGwgbWFr ZSBzdXJlIHRoYXQgdGhlIGZiZGV2IGVtdWxhdGlvbiB3aWxsCiAgKiBub3QgbWlzcyBhbnkgaG90 cGx1ZyBldmVudHMuCiAgKgorICogU2VlIGFsc286IGRybV9mYl9oZWxwZXJfc3VzcGVuZF9ob3Rw bHVnKCkKKyAqIFNlZSBhbHNvOiBkcm1fZmJfaGVscGVyX3Jlc3VtZV9ob3RwbHVnKCkKKyAqCiAg KiBSRVRVUk5TOgogICogMCBvbiBzdWNjZXNzIGFuZCBhIG5vbi16ZXJvIGVycm9yIGNvZGUgb3Ro ZXJ3aXNlLgogICovCkBAIC0yNzY4LDcgKzI4ODgsOCBAQCBpbnQgZHJtX2ZiX2hlbHBlcl9ob3Rw bHVnX2V2ZW50KHN0cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCiAJCXJldHVybiBlcnI7 CiAJfQogCi0JaWYgKCFmYl9oZWxwZXItPmZiIHx8ICFkcm1fZmJfaGVscGVyX2lzX2JvdW5kKGZi X2hlbHBlcikpIHsKKwlpZiAoIWZiX2hlbHBlci0+ZmIgfHwgIWRybV9mYl9oZWxwZXJfaXNfYm91 bmQoZmJfaGVscGVyKSB8fAorCSAgICBmYl9oZWxwZXItPmhvdHBsdWdfc3VzcGVuZGVkKSB7CiAJ CWZiX2hlbHBlci0+ZGVsYXllZF9ob3RwbHVnID0gdHJ1ZTsKIAkJbXV0ZXhfdW5sb2NrKCZmYl9o ZWxwZXItPmxvY2spOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2ZiX2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCmluZGV4IGIwNjk0MzNl N2ZjMS4uOWM2ZTRjZWZmM2FmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVy LmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2ZiX2hlbHBlci5oCkBAIC0yMzIsNiArMjMyLDE0IEBA IHN0cnVjdCBkcm1fZmJfaGVscGVyIHsKIAkgKiBTZWUgYWxzbzogQGRlZmVycmVkX3NldHVwCiAJ ICovCiAJaW50IHByZWZlcnJlZF9icHA7CisKKwkvKioKKwkgKiBAaG90cGx1Z19zdXNwZW5kZWQ6 CisJICoKKwkgKiBXaGV0aGVyIG9yIG5vdCB3ZSBjYW4gY3VycmVudGx5IGhhbmRsZSBob3RwbHVn IGV2ZW50cywgb3IgaWYgd2UKKwkgKiBuZWVkIHRvIHdhaXQgZm9yIHRoZSBEUk0gZGV2aWNlIHRv IHVuaW5oaWJpdCB1cy4KKwkgKi8KKwlib29sIGhvdHBsdWdfc3VzcGVuZGVkOwogfTsKIAogLyoq CkBAIC0zMzAsNiArMzM4LDExIEBAIHZvaWQgZHJtX2ZiX2hlbHBlcl9mYmRldl90ZWFyZG93bihz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIAogdm9pZCBkcm1fZmJfaGVscGVyX2xhc3RjbG9zZShz dHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHZvaWQgZHJtX2ZiX2hlbHBlcl9vdXRwdXRfcG9sbF9j aGFuZ2VkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOworCit2b2lkIGRybV9mYl9oZWxwZXJfcmVz dW1lX2hvdHBsdWcoc3RydWN0IGRybV9mYl9oZWxwZXIgKmZiX2hlbHBlcik7Citib29sIF9fbXVz dF9jaGVjaworZHJtX2ZiX2hlbHBlcl9zdXNwZW5kX2hvdHBsdWcoc3RydWN0IGRybV9mYl9oZWxw ZXIgKmZiX2hlbHBlcik7CisKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJtX2ZiX2hlbHBl cl9wcmVwYXJlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBkcm1fZmJfaGVs cGVyICpoZWxwZXIsCkBAIC01NjQsNiArNTc3LDE1IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBkcm1f ZmJfaGVscGVyX291dHB1dF9wb2xsX2NoYW5nZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKIHsK IH0KIAorc3RhdGljIGlubGluZSB2b2lkCitkcm1fZmJfaGVscGVyX3Jlc3VtZV9ob3RwbHVnKHN0 cnVjdCBkcm1fZmJfaGVscGVyICpmYl9oZWxwZXIpCit7Cit9CitzdGF0aWMgaW5saW5lIGJvb2wg X19tdXN0X2NoZWNrCitkcm1fZmJfaGVscGVyX3N1c3BlbmRfaG90cGx1ZyhzdHJ1Y3QgZHJtX2Zi X2hlbHBlciAqZmJfaGVscGVyKQoreworCXJldHVybiB0cnVlOworfQogI2VuZGlmCiAKIHN0YXRp YyBpbmxpbmUgaW50Ci0tIAoyLjE3LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo= 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=-1.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_PASS,URIBL_BLOCKED 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 7246BC28CF6 for ; Wed, 1 Aug 2018 21:15:55 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0AF50208A3 for ; Wed, 1 Aug 2018 21:15:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 0AF50208A3 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com 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 S1732509AbeHAXDe (ORCPT ); Wed, 1 Aug 2018 19:03:34 -0400 Received: from mx3-rdu2.redhat.com ([66.187.233.73]:55510 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1731622AbeHAXC7 (ORCPT ); Wed, 1 Aug 2018 19:02:59 -0400 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2F9C3819702B; Wed, 1 Aug 2018 21:15:17 +0000 (UTC) Received: from malachite.bss.redhat.com (dhcp-10-20-1-11.bss.redhat.com [10.20.1.11]) by smtp.corp.redhat.com (Postfix) with ESMTP id BEF1A2026D68; Wed, 1 Aug 2018 21:15:16 +0000 (UTC) From: Lyude Paul To: nouveau@lists.freedesktop.org Cc: stable@vger.kernel.org, Lukas Wunner , Karol Herbst , Gustavo Padovan , Maarten Lankhorst , Sean Paul , David Airlie , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org Subject: [PATCH v4 3/8] drm/fb_helper: Introduce suspend/resume_hotplug() Date: Wed, 1 Aug 2018 17:14:53 -0400 Message-Id: <20180801211459.7731-4-lyude@redhat.com> In-Reply-To: <20180801211459.7731-1-lyude@redhat.com> References: <20180801211459.7731-1-lyude@redhat.com> X-Scanned-By: MIMEDefang 2.78 on 10.11.54.4 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 01 Aug 2018 21:15:17 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.11.55.8]); Wed, 01 Aug 2018 21:15:17 +0000 (UTC) for IP:'10.11.54.4' DOMAIN:'int-mx04.intmail.prod.int.rdu2.redhat.com' HELO:'smtp.corp.redhat.com' FROM:'lyude@redhat.com' RCPT:'' Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org I'm sure I don't need to tell you that fb_helper's locking is a mess. That being said; fb_helper's locking mess can seriously complicate the runtime suspend/resume operations of drivers because it can invoke atomic commits and connector probing from anywhere that calls drm_fb_helper_hotplug_event(). Since most drivers use drm_fb_helper_output_poll_changed() as their output_poll_changed handler, this can happen in every single context that can fire off a hotplug event. An example: [ 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] ============================================= Because of this, there's an unreasonable number of places that drm drivers would need to insert special handling to prevent trying to resume the device from all of these contexts that can deadlock. It's difficult even to try synchronizing with fb_helper in these contexts as well, since any of them could introduce a deadlock by waiting to acquire the top-level fb_helper mutex, while it's being held by another thread that might potentially call down to pm_runtime_get_sync(). Luckily-there's no actual reason we need to allow fb_helper to handle hotplugging at all when runtime suspending a device. If a hotplug happens during a runtime suspend operation, there's no reason the driver can't just re-enable fbcon's hotplug handling and bring it up to speed with hotplugging events it may have missed by calling drm_fb_helper_hotplug_event(). So, let's make this easy and just add helpers to handle disabling and enabling fb_helper connector probing() without having to potentially wait on fb_helper to finish it's work. This will let us fix the runtime suspend/resume deadlocks that we've been experiencing with nouveau, along with being able to fix some of the incorrect runtime PM core interaction that other DRM drivers currently perform to work around these issues. Changes since v3: - Actually check if fb_helper is NULL in both new helpers - Actually check drm_fbdev_emulation in both new helpers - Don't fire off a fb_helper hotplug unconditionally; only do it if the following conditions are true (as otherwise, calling this in the wrong spot will cause Bad Things to happen): - fb_helper hotplug handling was actually inhibited previously - fb_helper actually has a delayed hotplug pending - fb_helper is actually bound - fb_helper is actually initialized - Add __must_check to drm_fb_helper_suspend_hotplug(). There's no situation where a driver would actually want to use this without checking the return value, so enforce that - Rewrite and clarify the documentation for both helpers. - Make sure to return true in the drm_fb_helper_suspend_hotplug() stub that's provided in drm_fb_helper.h when CONFIG_DRM_FBDEV_EMULATION isn't enabled - Actually grab the toplevel fb_helper lock in drm_fb_helper_resume_hotplug(), since it's possible other activity (such as a hotplug) could be going on at the same time the driver calls drm_fb_helper_resume_hotplug(). We need this to check whether or not drm_fb_helper_hotplug_event() needs to be called anyway Signed-off-by: Lyude Paul Cc: stable@vger.kernel.org Cc: Lukas Wunner Cc: Karol Herbst --- drivers/gpu/drm/drm_fb_helper.c | 123 +++++++++++++++++++++++++++++++- include/drm/drm_fb_helper.h | 22 ++++++ 2 files changed, 144 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 2ee1eaa66188..b5f1dee0c3a0 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -84,6 +84,11 @@ static DEFINE_MUTEX(kernel_fb_helper_lock); * For suspend/resume consider using drm_mode_config_helper_suspend() and * drm_mode_config_helper_resume() which takes care of fbdev as well. * + * For runtime suspend and runtime resume, drivers which need to disable + * normal hotplug handling should consider using + * drm_fb_helper_suspend_hotplug() and drm_fb_helper_resume_hotplug() to + * avoid deadlocking with fb_helper's hotplug handling. + * * All other functions exported by the fb helper library can be used to * implement the fbdev driver interface by the driver. * @@ -2733,6 +2738,118 @@ int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel) } EXPORT_SYMBOL(drm_fb_helper_initial_config); +/** + * drm_fb_helper_resume_hotplug - Uninhibit fb_helper hotplug handling + * @fb_helper: driver-allocated fbdev helper, can be NULL + * + * Uninhibit fb_helper's hotplug handling after it was previously inhibited by + * a call to drm_fb_helper_suspend_hotplug(). Unlike + * drm_fb_helper_suspend_hotplug(), this function will wait on + * fb_helper->lock. + * + * This helper will take care of handling any hotplug events that happened + * while fb_helper's hotplug handling was suspended. Since this possibly + * implies a call to drm_fb_helper_hotplug_event(), care must be taken when + * calling this function as it may initiate a modeset. + * + * Please note that this function is different from + * drm_fb_helper_set_suspend(). It does not resume fb_helper, it only allows + * fb_helper to probe connectors in response to changes to the device's + * connector configuration if this functionality was previously disabled by + * drm_fb_helper_suspend_hotplug(). Generally, a driver will only want to call + * this in it's runtime resume callbacks. + * + * Drivers calling drm_fb_helper_suspend_hotplug() must make sure to call this + * somewhere in their runtime resume callbacks. + * + * See also: drm_fb_helper_suspend_hotplug() + */ +void +drm_fb_helper_resume_hotplug(struct drm_fb_helper *fb_helper) +{ + bool changed; + + if (!drm_fbdev_emulation || !fb_helper) + return; + + mutex_lock(&fb_helper->lock); + + changed = !fb_helper->deferred_setup && + fb_helper->fb && + drm_fb_helper_is_bound(fb_helper) && + fb_helper->hotplug_suspended && + fb_helper->delayed_hotplug; + if (changed) + fb_helper->delayed_hotplug = false; + + fb_helper->hotplug_suspended = false; + + mutex_unlock(&fb_helper->lock); + + if (changed) + drm_fb_helper_hotplug_event(fb_helper); +} +EXPORT_SYMBOL(drm_fb_helper_resume_hotplug); + +/** + * drm_fb_helper_suspend_hotplug - Attempt to temporarily suspend fb_helper's + * hotplug handling + * @fb_helper: driver-allocated fbdev helper, can be NULL + * + * Temporarily inhibit fb_helper from responding to connector changes without + * blocking on fb_helper->lock, if possible. This can be called by a DRM + * driver early on in it's runtime suspend callback to both check whether or + * not fb_helper is still busy, and prevent hotplugs that might occur part-way + * through the runtime suspend process from being handled by fb_helper until + * drm_fb_helper_resume_hotplug() is called. This dramatically simplifies the + * runtime suspend process, as it eliminates the possibility that fb_helper + * might try to perform a modeset half way through the runtime suspend process + * in response to a connector hotplug, something which will almost certainly + * lead to deadlocking for drivers that need to disable normal hotplug + * handling in their runtime suspend handlers. + * + * Calls to this function should be put at the very start of a driver's + * runtime suspend operation if desired. The driver is then responsible for + * re-enabling fb_helper hotplug handling when normal hotplug detection + * becomes available on the device again by calling + * drm_fb_helper_resume_hotplug(). Usually, a driver will want to re-enable + * fb_helper hotplug handling once the hotplug detection capabilities of its + * devices have returned to normal (e.g. when the device is runtime resumed, + * or after the runtime suspend process was aborted for some reason). + * + * Please note that this function is different from + * drm_fb_helper_set_suspend(), in that it does not actually suspend + * fb_helper. It only prevents fb_helper from responding to connector hotplugs + * on it's own. Generally, a driver will only want to call this in its + * runtime suspend callback. + * + * See also: drm_fb_helper_resume_hotplug() + * + * RETURNS: + * True if hotplug handling was disabled successfully, or fb_helper wasn't + * actually initialized/enabled yet. False if grabbing &fb_helper->lock would + * have meant blocking on fb_helper. When this function returns false, this + * usually implies means that fb_helper is still busy doing something such as + * probing connectors or performing a modeset. Drivers should treat this the + * same way they would any other activity on the device, and abort the runtime + * suspend process as early as possible in response. + */ +bool __must_check +drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper) +{ + if (!drm_fbdev_emulation || !fb_helper) + return true; + + if (!mutex_trylock(&fb_helper->lock)) + return false; + + fb_helper->hotplug_suspended = true; + mutex_unlock(&fb_helper->lock); + + return true; +} +EXPORT_SYMBOL(drm_fb_helper_suspend_hotplug); + /** * drm_fb_helper_hotplug_event - respond to a hotplug notification by * probing all the outputs attached to the fb @@ -2751,6 +2868,9 @@ EXPORT_SYMBOL(drm_fb_helper_initial_config); * for a race-free fbcon setup and will make sure that the fbdev emulation will * not miss any hotplug events. * + * See also: drm_fb_helper_suspend_hotplug() + * See also: drm_fb_helper_resume_hotplug() + * * RETURNS: * 0 on success and a non-zero error code otherwise. */ @@ -2768,7 +2888,8 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper) return err; } - if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper)) { + if (!fb_helper->fb || !drm_fb_helper_is_bound(fb_helper) || + fb_helper->hotplug_suspended) { fb_helper->delayed_hotplug = true; mutex_unlock(&fb_helper->lock); return err; diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index b069433e7fc1..9c6e4ceff3af 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -232,6 +232,14 @@ struct drm_fb_helper { * See also: @deferred_setup */ int preferred_bpp; + + /** + * @hotplug_suspended: + * + * Whether or not we can currently handle hotplug events, or if we + * need to wait for the DRM device to uninhibit us. + */ + bool hotplug_suspended; }; /** @@ -330,6 +338,11 @@ 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_resume_hotplug(struct drm_fb_helper *fb_helper); +bool __must_check +drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper); + #else static inline void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper, @@ -564,6 +577,15 @@ static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev) { } +static inline void +drm_fb_helper_resume_hotplug(struct drm_fb_helper *fb_helper) +{ +} +static inline bool __must_check +drm_fb_helper_suspend_hotplug(struct drm_fb_helper *fb_helper) +{ + return true; +} #endif static inline int -- 2.17.1