From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCHv7 1/3] drm: add support for DisplayPort CEC-Tunneling-over-AUX Date: Mon, 2 Jul 2018 17:55:01 +0300 Message-ID: <20180702145501.GK5565@intel.com> References: <20180628074253.21088-1-hverkuil@xs4all.nl> <20180628074253.21088-2-hverkuil@xs4all.nl> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id E915D6E46D for ; Mon, 2 Jul 2018 14:55:05 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20180628074253.21088-2-hverkuil@xs4all.nl> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Hans Verkuil Cc: Carlos Santa , Daniel Vetter , dri-devel@lists.freedesktop.org, Hans Verkuil , linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBKdW4gMjgsIDIwMTggYXQgMDk6NDI6NTFBTSArMDIwMCwgSGFucyBWZXJrdWlsIHdy b3RlOgo+IEZyb206IEhhbnMgVmVya3VpbCA8aGFucy52ZXJrdWlsQGNpc2NvLmNvbT4KPiAKPiBU aGlzIGFkZHMgc3VwcG9ydCBmb3IgdGhlIERpc3BsYXlQb3J0IENFQy1UdW5uZWxpbmctb3Zlci1B VVgKPiBmZWF0dXJlIHRoYXQgaXMgcGFydCBvZiB0aGUgRGlzcGxheVBvcnQgMS4zIHN0YW5kYXJk Lgo+IAo+IFVuZm9ydHVuYXRlbHksIG5vdCBhbGwgRGlzcGxheVBvcnQvVVNCLUMgdG8gSERNSSBh ZGFwdGVycyB3aXRoIGEKPiBjaGlwIHRoYXQgaGFzIHRoaXMgY2FwYWJpbGl0eSBhY3R1YWxseSBo b29rIHVwIHRoZSBDRUMgcGluLCBzbwo+IGV2ZW4gdGhvdWdoIGEgQ0VDIGRldmljZSBpcyBjcmVh dGVkLCBpdCBtYXkgbm90IGFjdHVhbGx5IHdvcmsuCj4gCj4gU2lnbmVkLW9mZi1ieTogSGFucyBW ZXJrdWlsIDxoYW5zLnZlcmt1aWxAY2lzY28uY29tPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0v S2NvbmZpZyAgICAgICAgIHwgIDEwICsKPiAgZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlICAgICAg ICB8ICAgMSArCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfY2VjLmMgICAgfCA0MzMgKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgZHJpdmVycy9ncHUvZHJtL2RybV9kcF9oZWxw ZXIuYyB8ICAgMSArCj4gIGluY2x1ZGUvZHJtL2RybV9kcF9oZWxwZXIuaCAgICAgfCAgNTYgKysr KysKPiAgNSBmaWxlcyBjaGFuZ2VkLCA1MDEgaW5zZXJ0aW9ucygrKQo+ICBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9ncHUvZHJtL2RybV9kcF9jZWMuYwo+IAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9LY29uZmlnCj4gaW5kZXggMmE3 MmQyZmViNzZkLi5kNWUyMTdmZDBjMTQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL0tj b25maWcKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZpZwo+IEBAIC0xMjIsNiArMTIyLDE2 IEBAIGNvbmZpZyBEUk1fTE9BRF9FRElEX0ZJUk1XQVJFCj4gIAkgIGRlZmF1bHQgY2FzZSBpcyBO LiBEZXRhaWxzIGFuZCBpbnN0cnVjdGlvbnMgaG93IHRvIGJ1aWxkIHlvdXIgb3duCj4gIAkgIEVE SUQgZGF0YSBhcmUgZ2l2ZW4gaW4gRG9jdW1lbnRhdGlvbi9FRElEL0hPV1RPLnR4dC4KPiAgCj4g K2NvbmZpZyBEUk1fRFBfQ0VDCj4gKwlib29sICJFbmFibGUgRGlzcGxheVBvcnQgQ0VDLVR1bm5l bGluZy1vdmVyLUFVWCBIRE1JIHN1cHBvcnQiCj4gKwlzZWxlY3QgQ0VDX0NPUkUKPiArCWhlbHAK PiArCSAgQ2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IHRvIGVuYWJsZSBIRE1JIENFQyBz dXBwb3J0IGZvcgo+ICsJICBEaXNwbGF5UG9ydC9VU0ItQyB0byBIRE1JIGFkYXB0ZXJzLgo+ICsK PiArCSAgTm90ZTogbm90IGFsbCBhZGFwdGVycyBzdXBwb3J0IHRoaXMgZmVhdHVyZSwgYW5kIGV2 ZW4gZm9yIHRob3NlCj4gKwkgIHRoYXQgZG8gc3VwcG9ydCB0aGlzIHRoZXkgb2Z0ZW4gZG8gbm90 IGhvb2sgdXAgdGhlIENFQyBwaW4uCj4gKwo+ICBjb25maWcgRFJNX1RUTQo+ICAJdHJpc3RhdGUK PiAgCWRlcGVuZHMgb24gRFJNICYmIE1NVQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0v TWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKPiBpbmRleCBlZjlmM2RhYjI4N2Yu LjI3MDI2NmNjNmVjYSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKPiBAQCAtNDEsNiArNDEsNyBAQCBkcm1fa21z X2hlbHBlci0kKENPTkZJR19EUk1fUEFORUxfQlJJREdFKSArPSBicmlkZ2UvcGFuZWwubwo+ICBk cm1fa21zX2hlbHBlci0kKENPTkZJR19EUk1fRkJERVZfRU1VTEFUSU9OKSArPSBkcm1fZmJfaGVs cGVyLm8KPiAgZHJtX2ttc19oZWxwZXItJChDT05GSUdfRFJNX0tNU19DTUFfSEVMUEVSKSArPSBk cm1fZmJfY21hX2hlbHBlci5vCj4gIGRybV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9EUF9BVVhf Q0hBUkRFVikgKz0gZHJtX2RwX2F1eF9kZXYubwo+ICtkcm1fa21zX2hlbHBlci0kKENPTkZJR19E Uk1fRFBfQ0VDKSArPSBkcm1fZHBfY2VjLm8KPiAgCj4gIG9iai0kKENPTkZJR19EUk1fS01TX0hF TFBFUikgKz0gZHJtX2ttc19oZWxwZXIubwo+ICBvYmotJChDT05GSUdfRFJNX0RFQlVHX1NFTEZU RVNUKSArPSBzZWxmdGVzdHMvCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBf Y2VjLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2NlYy5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2 NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLjE1MzBjYTY4NTk1NQo+IC0tLSAvZGV2L251bGwKPiAr KysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2NlYy5jCj4gQEAgLTAsMCArMSw0MzMgQEAKPiAr Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoKPiArICogRGlzcGxheVBv cnQgQ0VDLVR1bm5lbGluZy1vdmVyLUFVWCBzdXBwb3J0Cj4gKyAqCj4gKyAqIENvcHlyaWdodCAy MDE4IENpc2NvIFN5c3RlbXMsIEluYy4gYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRz IHJlc2VydmVkLgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICsjaW5j bHVkZSA8ZHJtL2RybV9kcF9oZWxwZXIuaD4KPiArI2luY2x1ZGUgPG1lZGlhL2NlYy5oPgo+ICsK PiArLyoKPiArICogVW5mb3J0dW5hdGVseSBpdCB0dXJucyBvdXQgdGhhdCB3ZSBoYXZlIGEgY2hp Y2tlbi1hbmQtZWdnIHNpdHVhdGlvbgo+ICsgKiBoZXJlLiBRdWl0ZSBhIGZldyBhY3RpdmUgKG1p bmktKURQLXRvLUhETUkgb3IgVVNCLUMtdG8tSERNSSBhZGFwdGVycwo+ICsgKiBoYXZlIGEgY29u dmVydGVyIGNoaXAgdGhhdCBzdXBwb3J0cyBDRUMtVHVubmVsaW5nLW92ZXItQVVYICh1c3VhbGx5 IHRoZQo+ICsgKiBQYXJhZGUgUFMxNzYpLCBidXQgdGhleSBkbyBub3Qgd2lyZSB1cCB0aGUgQ0VD IHBpbiwgdGh1cyBtYWtpbmcgQ0VDCj4gKyAqIHVzZWxlc3MuCj4gKyAqCj4gKyAqIFNhZGx5IHRo ZXJlIGlzIG5vIHdheSBmb3IgdGhpcyBkcml2ZXIgdG8ga25vdyB0aGlzLiBXaGF0IGhhcHBlbnMg aXMKPiArICogdGhhdCBhIC9kZXYvY2VjWCBkZXZpY2UgaXMgY3JlYXRlZCB0aGF0IGlzIGlzb2xh dGVkIGFuZCB1bmFibGUgdG8gc2VlCj4gKyAqIGFueSBvZiB0aGUgb3RoZXIgQ0VDIGRldmljZXMu IFF1aXRlIGxpdGVyYWxseSB0aGUgQ0VDIHdpcmUgaXMgY3V0Cj4gKyAqIChvciBpbiB0aGlzIGNh c2UsIG5ldmVyIGNvbm5lY3RlZCBpbiB0aGUgZmlyc3QgcGxhY2UpLgo+ICsgKgo+ICsgKiBUaGUg cmVhc29uIHNvIGZldyBhZGFwdGVycyBzdXBwb3J0IHRoaXMgaXMgdGhhdCB0aGlzIHR1bm5lbGlu ZyBwcm90b2NvbAo+ICsgKiB3YXMgbmV2ZXIgc3VwcG9ydGVkIGJ5IGFueSBPUy4gU28gdGhlcmUg d2FzIG5vIGVhc3kgd2F5IG9mIHRlc3RpbmcgaXQsCj4gKyAqIGFuZCBubyBpbmNlbnRpdmUgdG8g Y29ycmVjdGx5IHdpcmUgdXAgdGhlIENFQyBwaW4uCj4gKyAqCj4gKyAqIEhvcGVmdWxseSBieSBj cmVhdGluZyB0aGlzIGRyaXZlciBpdCB3aWxsIGJlIGVhc2llciBmb3IgdmVuZG9ycyB0bwo+ICsg KiBmaW5hbGx5IGZpeCB0aGVpciBhZGFwdGVycyBhbmQgdGVzdCB0aGUgQ0VDIGZ1bmN0aW9uYWxp dHkuCj4gKyAqCj4gKyAqIEkga2VlcCBhIGxpc3Qgb2Yga25vd24gd29ya2luZyBhZGFwdGVycyBo ZXJlOgo+ICsgKgo+ICsgKiBodHRwczovL2h2ZXJrdWlsLmhvbWUueHM0YWxsLm5sL2NlYy1zdGF0 dXMudHh0Cj4gKyAqCj4gKyAqIFBsZWFzZSBtYWlsIG1lIChodmVya3VpbEB4czRhbGwubmwpIGlm IHlvdSBmaW5kIGFuIGFkYXB0ZXIgdGhhdCB3b3Jrcwo+ICsgKiBhbmQgaXMgbm90IHlldCBsaXN0 ZWQgdGhlcmUuCj4gKyAqCj4gKyAqIE5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlv biBkb2VzIG5vdCBzdXBwb3J0IENFQyBvdmVyIGFuIE1TVCBodWIuCj4gKyAqIEFzIGZhciBhcyBJ IGNhbiBzZWUgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIGRlZmluZWQgaW4gdGhlIERpc3BsYXlQb3J0 Cj4gKyAqIHN0YW5kYXJkIHRvIHRyYW5zcG9ydCBDRUMgaW50ZXJydXB0cyBvdmVyIGFuIE1TVCBk ZXZpY2UuIEl0IG1pZ2h0IGJlCj4gKyAqIHBvc3NpYmxlIHRvIGRvIHRoaXMgdGhyb3VnaCBwb2xs aW5nLCBidXQgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gZ2V0IHRoYXQKPiArICogdG8gd29yay4K PiArICovCj4gKwo+ICsvKioKPiArICogRE9DOiBkcCBjZWMgaGVscGVycwo+ICsgKgo+ICsgKiBU aGVzZSBmdW5jdGlvbnMgdGFrZSBjYXJlIG9mIHN1cHBvcnRpbmcgdGhlIENFQy1UdW5uZWxpbmct b3Zlci1BVVgKPiArICogZmVhdHVyZSBvZiBEaXNwbGF5UG9ydC10by1IRE1JIGFkYXB0ZXJzLgo+ ICsgKi8KPiArCj4gKy8qCj4gKyAqIFdoZW4gdGhlIEVESUQgaXMgdW5zZXQgYmVjYXVzZSB0aGUg SFBEIHdlbnQgbG93LCB0aGVuIHRoZSBDRUMgRFBDRCByZWdpc3RlcnMKPiArICogdHlwaWNhbGx5 IGNhbiBubyBsb25nZXIgYmUgcmVhZCAodHJ1ZSBmb3IgYSBEUC10by1IRE1JIGFkYXB0ZXIgc2lu Y2UgaXQgaXMKPiArICogcG93ZXJlZCBieSB0aGUgSFBEKS4gSG93ZXZlciwgc29tZSBkaXNwbGF5 cyB0b2dnbGUgdGhlIEhQRCBvZmYgYW5kIG9uIGZvciBhCj4gKyAqIHNob3J0IHBlcmlvZCBmb3Ig b25lIHJlYXNvbiBvciBhbm90aGVyLCBhbmQgdGhhdCB3b3VsZCBjYXVzZSB0aGUgQ0VDIGFkYXB0 ZXIKPiArICogdG8gYmUgcmVtb3ZlZCBhbmQgYWRkZWQgYWdhaW4sIGV2ZW4gdGhvdWdoIG5vdGhp bmcgZWxzZSBjaGFuZ2VkLgo+ICsgKgo+ICsgKiBUaGlzIG1vZHVsZSBwYXJhbWV0ZXIgc2V0cyBh IGRlbGF5IGluIHNlY29uZHMgYmVmb3JlIHRoZSBDRUMgYWRhcHRlciBpcwo+ICsgKiBhY3R1YWxs eSB1bnJlZ2lzdGVyZWQuIE9ubHkgaWYgdGhlIEhQRCBkb2VzIG5vdCByZXR1cm4gd2l0aGluIHRo YXQgdGltZSB3aWxsCj4gKyAqIHRoZSBDRUMgYWRhcHRlciBiZSB1bnJlZ2lzdGVyZWQuCj4gKyAq Cj4gKyAqIElmIGl0IGlzIHNldCB0byBhIHZhbHVlID49IE5FVkVSX1VOUkVHX0RFTEFZLCB0aGVu IHRoZSBDRUMgYWRhcHRlciB3aWxsIG5ldmVyCj4gKyAqIGJlIHVucmVnaXN0ZXJlZCBmb3IgYXMg bG9uZyBhcyB0aGUgY29ubmVjdG9yIHJlbWFpbnMgcmVnaXN0ZXJlZC4KPiArICoKPiArICogSWYg aXQgaXMgc2V0IHRvIDAsIHRoZW4gdGhlIENFQyBhZGFwdGVyIHdpbGwgYmUgdW5yZWdpc3RlcmVk IGltbWVkaWF0ZWx5IGFzCj4gKyAqIHNvb24gYXMgdGhlIEhQRCBkaXNhcHBlYXJzLgo+ICsgKgo+ ICsgKiBUaGUgZGVmYXVsdCBpcyBvbmUgc2Vjb25kIHRvIHByZXZlbnQgc2hvcnQgSFBEIGdsaXRj aGVzIGZyb20gdW5yZWdpc3RlcmluZwo+ICsgKiB0aGUgQ0VDIGFkYXB0ZXIuCj4gKyAqCj4gKyAq IE5vdGUgdGhhdCBmb3IgaW50ZWdyYXRlZCBIRE1JIGJyYW5jaCBkZXZpY2VzIHRoYXQgc3VwcG9y dCBDRUMgdGhlIERQQ0QKPiArICogcmVnaXN0ZXJzIHJlbWFpbiBhdmFpbGFibGUgZXZlbiBpZiB0 aGUgSFBEIGdvZXMgbG93IHNpbmNlIGl0IGlzIG5vdCBwb3dlcmVkCj4gKyAqIGJ5IHRoZSBIUEQu IEluIHRoYXQgY2FzZSB0aGUgQ0VDIGFkYXB0ZXIgd2lsbCBuZXZlciBiZSB1bnJlZ2lzdGVyZWQg ZHVyaW5nCj4gKyAqIHRoZSBsaWZlIHRpbWUgb2YgdGhlIGNvbm5lY3Rvci4gQXQgbGVhc3QsIHRo aXMgaXMgdGhlIHRoZW9yeSBzaW5jZSBJIGRvIG5vdAo+ICsgKiBoYXZlIGhhcmR3YXJlIHdpdGgg YW4gaW50ZWdyYXRlZCBIRE1JIGJyYW5jaCBkZXZpY2UgdGhhdCBzdXBwb3J0cyBDRUMuCj4gKyAq Lwo+ICsjZGVmaW5lIE5FVkVSX1VOUkVHX0RFTEFZIDEwMDAKPiArc3RhdGljIHVuc2lnbmVkIGlu dCBkcm1fZHBfY2VjX3VucmVnaXN0ZXJfZGVsYXkgPSAxOwo+ICttb2R1bGVfcGFyYW0oZHJtX2Rw X2NlY191bnJlZ2lzdGVyX2RlbGF5LCB1aW50LCAwNjAwKTsKPiArTU9EVUxFX1BBUk1fREVTQyhk cm1fZHBfY2VjX3VucmVnaXN0ZXJfZGVsYXksCj4gKwkJICJDRUMgdW5yZWdpc3RlciBkZWxheSBp biBzZWNvbmRzLCAwOiBubyBkZWxheSwgPj0gMTAwMDogbmV2ZXIgdW5yZWdpc3RlciIpOwo+ICsK PiArc3RhdGljIGludCBkcm1fZHBfY2VjX2FkYXBfZW5hYmxlKHN0cnVjdCBjZWNfYWRhcHRlciAq YWRhcCwgYm9vbCBlbmFibGUpCj4gK3sKPiArCXN0cnVjdCBkcm1fZHBfYXV4ICphdXggPSBjZWNf Z2V0X2RydmRhdGEoYWRhcCk7Cj4gKwl1MzIgdmFsID0gZW5hYmxlID8gRFBfQ0VDX1RVTk5FTElO R19FTkFCTEUgOiAwOwo+ICsJc3NpemVfdCBlcnIgPSAwOwo+ICsKPiArCWVyciA9IGRybV9kcF9k cGNkX3dyaXRlYihhdXgsIERQX0NFQ19UVU5ORUxJTkdfQ09OVFJPTCwgdmFsKTsKPiArCXJldHVy biAoZW5hYmxlICYmIGVyciA8IDApID8gZXJyIDogMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBk cm1fZHBfY2VjX2FkYXBfbG9nX2FkZHIoc3RydWN0IGNlY19hZGFwdGVyICphZGFwLCB1OCBhZGRy KQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4ID0gY2VjX2dldF9kcnZkYXRhKGFkYXAp Owo+ICsJLyogQml0IDE1IChsb2dpY2FsIGFkZHJlc3MgMTUpIHNob3VsZCBhbHdheXMgYmUgc2V0 ICovCj4gKwl1MTYgbGFfbWFzayA9IDEgPDwgQ0VDX0xPR19BRERSX0JST0FEQ0FTVDsKPiArCXU4 IG1hc2tbMl07Cj4gKwlzc2l6ZV90IGVycjsKPiArCj4gKwlpZiAoYWRkciAhPSBDRUNfTE9HX0FE RFJfSU5WQUxJRCkKPiArCQlsYV9tYXNrIHw9IGFkYXAtPmxvZ19hZGRycy5sb2dfYWRkcl9tYXNr IHwgKDEgPDwgYWRkcik7Cj4gKwltYXNrWzBdID0gbGFfbWFzayAmIDB4ZmY7Cj4gKwltYXNrWzFd ID0gbGFfbWFzayA+PiA4Owo+ICsJZXJyID0gZHJtX2RwX2RwY2Rfd3JpdGUoYXV4LCBEUF9DRUNf TE9HSUNBTF9BRERSRVNTX01BU0ssIG1hc2ssIDIpOwo+ICsJcmV0dXJuIChhZGRyICE9IENFQ19M T0dfQUREUl9JTlZBTElEICYmIGVyciA8IDApID8gZXJyIDogMDsKPiArfQo+ICsKPiArc3RhdGlj IGludCBkcm1fZHBfY2VjX2FkYXBfdHJhbnNtaXQoc3RydWN0IGNlY19hZGFwdGVyICphZGFwLCB1 OCBhdHRlbXB0cywKPiArCQkJCSAgICB1MzIgc2lnbmFsX2ZyZWVfdGltZSwgc3RydWN0IGNlY19t c2cgKm1zZykKPiArewo+ICsJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9IGNlY19nZXRfZHJ2ZGF0 YShhZGFwKTsKPiArCXVuc2lnbmVkIGludCByZXRyaWVzID0gbWluKDUsIGF0dGVtcHRzIC0gMSk7 Cj4gKwlzc2l6ZV90IGVycjsKPiArCj4gKwllcnIgPSBkcm1fZHBfZHBjZF93cml0ZShhdXgsIERQ X0NFQ19UWF9NRVNTQUdFX0JVRkZFUiwKPiArCQkJCW1zZy0+bXNnLCBtc2ctPmxlbik7Cj4gKwlp ZiAoZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCWVyciA9IGRybV9kcF9kcGNkX3dy aXRlYihhdXgsIERQX0NFQ19UWF9NRVNTQUdFX0lORk8sCj4gKwkJCQkgKG1zZy0+bGVuIC0gMSkg fCAocmV0cmllcyA8PCA0KSB8Cj4gKwkJCQkgRFBfQ0VDX1RYX01FU1NBR0VfU0VORCk7Cj4gKwly ZXR1cm4gZXJyIDwgMCA/IGVyciA6IDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgZHJtX2RwX2Nl Y19hZGFwX21vbml0b3JfYWxsX2VuYWJsZShzdHJ1Y3QgY2VjX2FkYXB0ZXIgKmFkYXAsCj4gKwkJ CQkJICAgICAgYm9vbCBlbmFibGUpCj4gK3sKPiArCXN0cnVjdCBkcm1fZHBfYXV4ICphdXggPSBj ZWNfZ2V0X2RydmRhdGEoYWRhcCk7Cj4gKwlzc2l6ZV90IGVycjsKPiArCXU4IHZhbDsKPiArCj4g KwlpZiAoIShhZGFwLT5jYXBhYmlsaXRpZXMgJiBDRUNfQ0FQX01PTklUT1JfQUxMKSkKPiArCQly ZXR1cm4gMDsKPiArCj4gKwllcnIgPSBkcm1fZHBfZHBjZF9yZWFkYihhdXgsIERQX0NFQ19UVU5O RUxJTkdfQ09OVFJPTCwgJnZhbCk7Cj4gKwlpZiAoZXJyID49IDApIHsKPiArCQlpZiAoZW5hYmxl KQo+ICsJCQl2YWwgfD0gRFBfQ0VDX1NOT09QSU5HX0VOQUJMRTsKPiArCQllbHNlCj4gKwkJCXZh bCAmPSB+RFBfQ0VDX1NOT09QSU5HX0VOQUJMRTsKPiArCQllcnIgPSBkcm1fZHBfZHBjZF93cml0 ZWIoYXV4LCBEUF9DRUNfVFVOTkVMSU5HX0NPTlRST0wsIHZhbCk7Cj4gKwl9Cj4gKwlyZXR1cm4g KGVuYWJsZSAmJiBlcnIgPCAwKSA/IGVyciA6IDA7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRy bV9kcF9jZWNfYWRhcF9zdGF0dXMoc3RydWN0IGNlY19hZGFwdGVyICphZGFwLAo+ICsJCQkJICAg c3RydWN0IHNlcV9maWxlICpmaWxlKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4ID0g Y2VjX2dldF9kcnZkYXRhKGFkYXApOwo+ICsJc3RydWN0IGRybV9kcF9kZXNjIGRlc2M7Cj4gKwlz dHJ1Y3QgZHJtX2RwX2RwY2RfaWRlbnQgKmlkID0gJmRlc2MuaWRlbnQ7Cj4gKwo+ICsJaWYgKGRy bV9kcF9yZWFkX2Rlc2MoYXV4LCAmZGVzYywgdHJ1ZSkpCj4gKwkJcmV0dXJuOwo+ICsJc2VxX3By aW50ZihmaWxlLCAiT1VJOiAlKnBkSFxuIiwKPiArCQkgICAoaW50KXNpemVvZihpZC0+b3VpKSwg aWQtPm91aSk7Cj4gKwlzZXFfcHJpbnRmKGZpbGUsICJJRDogJSpwRVxuIiwKPiArCQkgICAoaW50 KXN0cm5sZW4oaWQtPmRldmljZV9pZCwgc2l6ZW9mKGlkLT5kZXZpY2VfaWQpKSwKPiArCQkgICBp ZC0+ZGV2aWNlX2lkKTsKPiArCXNlcV9wcmludGYoZmlsZSwgIkhXIFJldjogJWQuJWRcbiIsIGlk LT5od19yZXYgPj4gNCwgaWQtPmh3X3JldiAmIDB4Zik7Cj4gKwkvKgo+ICsJICogU2hvdyB0aGlz IGJvdGggaW4gZGVjaW1hbCBhbmQgaGV4OiBhdCBsZWFzdCBvbmUgdmVuZG9yCj4gKwkgKiBhbHdh eXMgcmVwb3J0cyB0aGlzIGluIGhleC4KPiArCSAqLwo+ICsJc2VxX3ByaW50ZihmaWxlLCAiRlcv U1cgUmV2OiAlZC4lZCAoMHglMDJ4LjB4JTAyeClcbiIsCj4gKwkJICAgaWQtPnN3X21ham9yX3Jl diwgaWQtPnN3X21pbm9yX3JldiwKPiArCQkgICBpZC0+c3dfbWFqb3JfcmV2LCBpZC0+c3dfbWlu b3JfcmV2KTsKPiArfQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBjZWNfYWRhcF9vcHMgZHJt X2RwX2NlY19hZGFwX29wcyA9IHsKPiArCS5hZGFwX2VuYWJsZSA9IGRybV9kcF9jZWNfYWRhcF9l bmFibGUsCj4gKwkuYWRhcF9sb2dfYWRkciA9IGRybV9kcF9jZWNfYWRhcF9sb2dfYWRkciwKPiAr CS5hZGFwX3RyYW5zbWl0ID0gZHJtX2RwX2NlY19hZGFwX3RyYW5zbWl0LAo+ICsJLmFkYXBfbW9u aXRvcl9hbGxfZW5hYmxlID0gZHJtX2RwX2NlY19hZGFwX21vbml0b3JfYWxsX2VuYWJsZSwKPiAr CS5hZGFwX3N0YXR1cyA9IGRybV9kcF9jZWNfYWRhcF9zdGF0dXMsCj4gK307Cj4gKwo+ICtzdGF0 aWMgaW50IGRybV9kcF9jZWNfcmVjZWl2ZWQoc3RydWN0IGRybV9kcF9hdXggKmF1eCkKPiArewo+ ICsJc3RydWN0IGNlY19hZGFwdGVyICphZGFwID0gYXV4LT5jZWMuYWRhcDsKPiArCXN0cnVjdCBj ZWNfbXNnIG1zZzsKPiArCXU4IHJ4X21zZ19pbmZvOwo+ICsJc3NpemVfdCBlcnI7Cj4gKwo+ICsJ ZXJyID0gZHJtX2RwX2RwY2RfcmVhZGIoYXV4LCBEUF9DRUNfUlhfTUVTU0FHRV9JTkZPLCAmcnhf bXNnX2luZm8pOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJuIGVycjsKPiArCj4gKwlpZiAo IShyeF9tc2dfaW5mbyAmIERQX0NFQ19SWF9NRVNTQUdFX0VOREVEKSkKPiArCQlyZXR1cm4gMDsK PiArCj4gKwltc2cubGVuID0gKHJ4X21zZ19pbmZvICYgRFBfQ0VDX1JYX01FU1NBR0VfTEVOX01B U0spICsgMTsKPiArCWVyciA9IGRybV9kcF9kcGNkX3JlYWQoYXV4LCBEUF9DRUNfUlhfTUVTU0FH RV9CVUZGRVIsIG1zZy5tc2csIG1zZy5sZW4pOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0dXJu IGVycjsKPiArCj4gKwljZWNfcmVjZWl2ZWRfbXNnKGFkYXAsICZtc2cpOwo+ICsJcmV0dXJuIDA7 Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGRybV9kcF9jZWNfaGFuZGxlX2lycShzdHJ1Y3QgZHJt X2RwX2F1eCAqYXV4KQo+ICt7Cj4gKwlzdHJ1Y3QgY2VjX2FkYXB0ZXIgKmFkYXAgPSBhdXgtPmNl Yy5hZGFwOwo+ICsJdTggZmxhZ3M7Cj4gKwo+ICsJaWYgKGRybV9kcF9kcGNkX3JlYWRiKGF1eCwg RFBfQ0VDX1RVTk5FTElOR19JUlFfRkxBR1MsICZmbGFncykgPCAwKQo+ICsJCXJldHVybjsKPiAr Cj4gKwlpZiAoZmxhZ3MgJiBEUF9DRUNfUlhfTUVTU0FHRV9JTkZPX1ZBTElEKQo+ICsJCWRybV9k cF9jZWNfcmVjZWl2ZWQoYXV4KTsKPiArCj4gKwlpZiAoZmxhZ3MgJiBEUF9DRUNfVFhfTUVTU0FH RV9TRU5UKQo+ICsJCWNlY190cmFuc21pdF9hdHRlbXB0X2RvbmUoYWRhcCwgQ0VDX1RYX1NUQVRV U19PSyk7Cj4gKwllbHNlIGlmIChmbGFncyAmIERQX0NFQ19UWF9MSU5FX0VSUk9SKQo+ICsJCWNl Y190cmFuc21pdF9hdHRlbXB0X2RvbmUoYWRhcCwgQ0VDX1RYX1NUQVRVU19FUlJPUiB8Cj4gKwkJ CQkJCUNFQ19UWF9TVEFUVVNfTUFYX1JFVFJJRVMpOwo+ICsJZWxzZSBpZiAoZmxhZ3MgJgo+ICsJ CSAoRFBfQ0VDX1RYX0FERFJFU1NfTkFDS19FUlJPUiB8IERQX0NFQ19UWF9EQVRBX05BQ0tfRVJS T1IpKQo+ICsJCWNlY190cmFuc21pdF9hdHRlbXB0X2RvbmUoYWRhcCwgQ0VDX1RYX1NUQVRVU19O QUNLIHwKPiArCQkJCQkJQ0VDX1RYX1NUQVRVU19NQVhfUkVUUklFUyk7Cj4gKwlkcm1fZHBfZHBj ZF93cml0ZWIoYXV4LCBEUF9DRUNfVFVOTkVMSU5HX0lSUV9GTEFHUywgZmxhZ3MpOwo+ICt9Cj4g Kwo+ICsvKioKPiArICogZHJtX2RwX2NlY19pcnEoKSAtIGhhbmRsZSBDRUMgaW50ZXJydXB0LCBp ZiBhbnkKPiArICogQGF1eDogRGlzcGxheVBvcnQgQVVYIGNoYW5uZWwKPiArICoKPiArICogU2hv dWxkIGJlIGNhbGxlZCB3aGVuIGhhbmRsaW5nIGFuIElSUV9IUEQgcmVxdWVzdC4gSWYgQ0VDLXR1 bm5lbGluZy1vdmVyLUFVWAo+ICsgKiBpcyBwcmVzZW50LCB0aGVuIGl0IHdpbGwgY2hlY2sgZm9y IGEgQ0VDX0lSUSBhbmQgaGFuZGxlIGl0IGFjY29yZGluZ2x5Lgo+ICsgKi8KPiArdm9pZCBkcm1f ZHBfY2VjX2lycShzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KQo+ICt7Cj4gKwl1OCBjZWNfaXJxOwo+ ICsJaW50IHJldDsKPiArCj4gKwltdXRleF9sb2NrKCZhdXgtPmNlYy5sb2NrKTsKPiArCWlmICgh YXV4LT5jZWMuYWRhcCkKPiArCQlnb3RvIHVubG9jazsKPiArCj4gKwlyZXQgPSBkcm1fZHBfZHBj ZF9yZWFkYihhdXgsIERQX0RFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1JfRVNJMSwKPiArCQkJCSZj ZWNfaXJxKTsKPiArCWlmIChyZXQgPCAwIHx8ICEoY2VjX2lycSAmIERQX0NFQ19JUlEpKQo+ICsJ CWdvdG8gdW5sb2NrOwo+ICsKPiArCWRybV9kcF9jZWNfaGFuZGxlX2lycShhdXgpOwo+ICsJZHJt X2RwX2RwY2Rfd3JpdGViKGF1eCwgRFBfREVWSUNFX1NFUlZJQ0VfSVJRX1ZFQ1RPUl9FU0kxLCBE UF9DRUNfSVJRKTsKPiArdW5sb2NrOgo+ICsJbXV0ZXhfdW5sb2NrKCZhdXgtPmNlYy5sb2NrKTsK PiArfQo+ICtFWFBPUlRfU1lNQk9MKGRybV9kcF9jZWNfaXJxKTsKPiArCj4gK3N0YXRpYyBib29s IGRybV9kcF9jZWNfY2FwKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHU4ICpjZWNfY2FwKQo+ICt7 Cj4gKwl1OCBjYXAgPSAwOwo+ICsKPiArCWlmIChkcm1fZHBfZHBjZF9yZWFkYihhdXgsIERQX0NF Q19UVU5ORUxJTkdfQ0FQQUJJTElUWSwgJmNhcCkgIT0gMSB8fAo+ICsJICAgICEoY2FwICYgRFBf Q0VDX1RVTk5FTElOR19DQVBBQkxFKSkKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwlpZiAoY2VjX2Nh cCkKPiArCQkqY2VjX2NhcCA9IGNhcDsKPiArCXJldHVybiB0cnVlOwo+ICt9Cj4gKwo+ICsvKgo+ ICsgKiBDYWxsZWQgaWYgdGhlIEhQRCB3YXMgbG93IGZvciBtb3JlIHRoYW4gZHJtX2RwX2NlY191 bnJlZ2lzdGVyX2RlbGF5Cj4gKyAqIHNlY29uZHMuIFRoaXMgdW5yZWdpc3RlcnMgdGhlIENFQyBh ZGFwdGVyLgo+ICsgKi8KPiArc3RhdGljIHZvaWQgZHJtX2RwX2NlY191bnJlZ2lzdGVyX3dvcmso c3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4 ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkcm1fZHBfYXV4LAo+ICsJCQkJCSAgICAgIGNl Yy51bnJlZ2lzdGVyX3dvcmsud29yayk7Cj4gKwo+ICsJaWYgKCFhdXgtPmNlYy5hZGFwKQo+ICsJ CXJldHVybjsKCkkgZ3Vlc3MgdGhpcyBOVUxMIGNoZWNrIGlzbid0IHBhcnRpY3VsYXJseSBjcml0 aWNhbD8KCj4gKwltdXRleF9sb2NrKCZhdXgtPmNlYy5sb2NrKTsKPiArCWNlY191bnJlZ2lzdGVy X2FkYXB0ZXIoYXV4LT5jZWMuYWRhcCk7Cj4gKwlhdXgtPmNlYy5hZGFwID0gTlVMTDsKPiArCW11 dGV4X3VubG9jaygmYXV4LT5jZWMubG9jayk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIEEgbmV3IEVE SUQgaXMgc2V0LiBJZiB0aGVyZSBpcyBubyBDRUMgYWRhcHRlciwgdGhlbiBjcmVhdGUgb25lLiBJ Zgo+ICsgKiB0aGVyZSB3YXMgYSBDRUMgYWRhcHRlciwgdGhlbiBjaGVjayBpZiB0aGUgQ0VDIGFk YXB0ZXIgcHJvcGVydGllcwo+ICsgKiB3ZXJlIHVuY2hhbmdlZCBhbmQganVzdCB1cGRhdGUgdGhl IENFQyBwaHlzaWNhbCBhZGRyZXNzLiBPdGhlcndpc2UKPiArICogdW5yZWdpc3RlciB0aGUgb2xk IENFQyBhZGFwdGVyIGFuZCBjcmVhdGUgYSBuZXcgb25lLgo+ICsgKi8KPiArdm9pZCBkcm1fZHBf Y2VjX3NldF9lZGlkKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIGNvbnN0IHN0cnVjdCBlZGlkICpl ZGlkKQo+ICt7Cj4gKwl1MzIgY2VjX2NhcHMgPSBDRUNfQ0FQX0RFRkFVTFRTIHwgQ0VDX0NBUF9O RUVEU19IUEQ7Cj4gKwl1bnNpZ25lZCBpbnQgbnVtX2xhcyA9IDE7Cj4gKwl1OCBjYXA7Cj4gKwo+ ICsjaWZuZGVmIENPTkZJR19NRURJQV9DRUNfUkMKPiArCS8qCj4gKwkgKiBDRUNfQ0FQX1JDIGlz IHBhcnQgb2YgQ0VDX0NBUF9ERUZBVUxUUywgYnV0IGl0IGlzIHN0cmlwcGVkIGJ5Cj4gKwkgKiBj ZWNfYWxsb2NhdGVfYWRhcHRlcigpIGlmIENPTkZJR19NRURJQV9DRUNfUkMgaXMgdW5kZWZpbmVk Lgo+ICsJICoKPiArCSAqIERvIHRoaXMgaGVyZSBhcyB3ZWxsIHRvIGVuc3VyZSB0aGUgdGVzdHMg YWdhaW5zdCBjZWNfY2FwcyBhcmUKPiArCSAqIGNvcnJlY3QuCj4gKwkgKi8KPiArCWNlY19jYXBz ICY9IH5DRUNfQ0FQX1JDOwo+ICsjZW5kaWYKPiArCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygm YXV4LT5jZWMudW5yZWdpc3Rlcl93b3JrKTsKPiArCj4gKwltdXRleF9sb2NrKCZhdXgtPmNlYy5s b2NrKTsKPiArCWlmICghZHJtX2RwX2NlY19jYXAoYXV4LCAmY2FwKSkgewo+ICsJCS8qIENFQyBp cyBub3Qgc3VwcG9ydGVkLCB1bnJlZ2lzdGVyIGFueSBleGlzdGluZyBhZGFwdGVyICovCj4gKwkJ Y2VjX3VucmVnaXN0ZXJfYWRhcHRlcihhdXgtPmNlYy5hZGFwKTsKCi4uLiBjb25zaWRlcmluZyBo ZXJlIHdlIGRvbid0IGNoZWNrIGZvciBOVUxMLgoKQWxzbyB0aGUgY2hlY2sgaW4gdGhlIHdvcmsg aXMgdW5sb2NrZWQgc28gSSBjb3VsZCBpbWFnaW5lIHNvbWUgc2xpZ2h0CnJhY2UgY29uZGl0aW9u cyBpZiBzZXRfZWRpZCgpL3Vuc2V0X2VkaWQoKSBnZXQgY2FsbGVkIGluIGEgcGFydGljdWxhcmx5 CmZ1bmt5IHdheS4gQnV0IEkgc3VwcG9zZSB3ZSBzaG91bGRuJ3QgcmVhbGx5IGRvIHRoYXQgc28g aXQncyBwcm9iYWJseQpmaW5lLiBBbmQgdGhlIGNlY191bnJlZ2lzdGVyX2FkYXB0ZXIoKSBpcyBk b25lIHdpdGggdGhlIGxvY2sgaGVsZCBhbnl3YXkKc28gYW55IGJvZ3VzIHBvaW50ZXJzIGNhbid0 IHJlYWNoIGl0LgoKPiArCQlhdXgtPmNlYy5hZGFwID0gTlVMTDsKPiArCQlnb3RvIHVubG9jazsK PiArCX0KPiArCj4gKwlpZiAoY2FwICYgRFBfQ0VDX1NOT09QSU5HX0NBUEFCTEUpCj4gKwkJY2Vj X2NhcHMgfD0gQ0VDX0NBUF9NT05JVE9SX0FMTDsKPiArCWlmIChjYXAgJiBEUF9DRUNfTVVMVElQ TEVfTEFfQ0FQQUJMRSkKPiArCQludW1fbGFzID0gQ0VDX01BWF9MT0dfQUREUlM7Cj4gKwo+ICsJ aWYgKGF1eC0+Y2VjLmFkYXApIHsKPiArCQlpZiAoYXV4LT5jZWMuYWRhcC0+Y2FwYWJpbGl0aWVz ID09IGNlY19jYXBzICYmCj4gKwkJICAgIGF1eC0+Y2VjLmFkYXAtPmF2YWlsYWJsZV9sb2dfYWRk cnMgPT0gbnVtX2xhcykgewo+ICsJCQkvKiBVbmNoYW5nZWQsIHNvIGp1c3Qgc2V0IHRoZSBwaHlz IGFkZHIgKi8KPiArCQkJY2VjX3NfcGh5c19hZGRyX2Zyb21fZWRpZChhdXgtPmNlYy5hZGFwLCBl ZGlkKTsKPiArCQkJZ290byB1bmxvY2s7Cj4gKwkJfQo+ICsJCS8qCj4gKwkJICogVGhlIGNhcGFi aWxpdGllcyBjaGFuZ2VkLCBzbyB1bnJlZ2lzdGVyIHRoZSBvbGQKPiArCQkgKiBhZGFwdGVyIGZp cnN0Lgo+ICsJCSAqLwo+ICsJCWNlY191bnJlZ2lzdGVyX2FkYXB0ZXIoYXV4LT5jZWMuYWRhcCk7 Cj4gKwl9Cj4gKwo+ICsJLyogQ3JlYXRlIGEgbmV3IGFkYXB0ZXIgKi8KPiArCWF1eC0+Y2VjLmFk YXAgPSBjZWNfYWxsb2NhdGVfYWRhcHRlcigmZHJtX2RwX2NlY19hZGFwX29wcywKPiArCQkJCQkg ICAgIGF1eCwgYXV4LT5jZWMubmFtZSwgY2VjX2NhcHMsCj4gKwkJCQkJICAgICBudW1fbGFzKTsK PiArCWlmIChJU19FUlIoYXV4LT5jZWMuYWRhcCkpIHsKPiArCQlhdXgtPmNlYy5hZGFwID0gTlVM TDsKPiArCQlnb3RvIHVubG9jazsKPiArCX0KPiArCWlmIChjZWNfcmVnaXN0ZXJfYWRhcHRlcihh dXgtPmNlYy5hZGFwLCBhdXgtPmNlYy5wYXJlbnQpKSB7Cj4gKwkJY2VjX2RlbGV0ZV9hZGFwdGVy KGF1eC0+Y2VjLmFkYXApOwo+ICsJCWF1eC0+Y2VjLmFkYXAgPSBOVUxMOwo+ICsJfSBlbHNlIHsK PiArCQkvKgo+ICsJCSAqIFVwZGF0ZSB0aGUgcGh5cyBhZGRyIGZvciB0aGUgbmV3IENFQyBhZGFw dGVyLiBXaGVuIGNhbGxlZAo+ICsJCSAqIGZyb20gZHJtX2RwX2NlY19yZWdpc3Rlcl9jb25uZWN0 b3IoKSBlZGlkID09IE5VTEwsIHNvIGluCj4gKwkJICogdGhhdCBjYXNlIHRoZSBwaHlzIGFkZHIg aXMganVzdCBpbnZhbGlkYXRlZC4KPiArCQkgKi8KPiArCQljZWNfc19waHlzX2FkZHJfZnJvbV9l ZGlkKGF1eC0+Y2VjLmFkYXAsIGVkaWQpOwo+ICsJfQo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxv Y2soJmF1eC0+Y2VjLmxvY2spOwo+ICt9Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2RwX2NlY19zZXRf ZWRpZCk7Cj4gKwo+ICsvKgo+ICsgKiBUaGUgRURJRCBkaXNhcHBlYXJlZCAobGlrZWx5IGJlY2F1 c2Ugb2YgdGhlIEhQRCBnb2luZyBkb3duKS4KPiArICovCj4gK3ZvaWQgZHJtX2RwX2NlY191bnNl dF9lZGlkKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCj4gK3sKPiArCW11dGV4X2xvY2soJmF1eC0+ Y2VjLmxvY2spOwo+ICsJaWYgKCFhdXgtPmNlYy5hZGFwKQo+ICsJCWdvdG8gdW5sb2NrOwo+ICsJ Y2VjX3BoeXNfYWRkcl9pbnZhbGlkYXRlKGF1eC0+Y2VjLmFkYXApOwo+ICsJLyoKPiArCSAqIFdl J3JlIGRvbmUgaWYgd2Ugd2FudCB0byBrZWVwIHRoZSBDRUMgZGV2aWNlCj4gKwkgKiAoZHJtX2Rw X2NlY191bnJlZ2lzdGVyX2RlbGF5IGlzID49IE5FVkVSX1VOUkVHX0RFTEFZKSBvciBpZiB0aGUK PiArCSAqIERQQ0Qgc3RpbGwgaW5kaWNhdGVzIHRoZSBDRUMgY2FwYWJpbGl0eSAoZXhwZWN0ZWQg Zm9yIGFuIGludGVncmF0ZWQKPiArCSAqIEhETUkgYnJhbmNoIGRldmljZSkuCj4gKwkgKi8KPiAr CWlmIChkcm1fZHBfY2VjX3VucmVnaXN0ZXJfZGVsYXkgPj0gTkVWRVJfVU5SRUdfREVMQVkgfHwK PiArCSAgICBkcm1fZHBfY2VjX2NhcChhdXgsIE5VTEwpKQo+ICsJCWdvdG8gdW5sb2NrOwo+ICsK PiArCW11dGV4X3VubG9jaygmYXV4LT5jZWMubG9jayk7Cj4gKwljYW5jZWxfZGVsYXllZF93b3Jr X3N5bmMoJmF1eC0+Y2VjLnVucmVnaXN0ZXJfd29yayk7Cj4gKwltdXRleF9sb2NrKCZhdXgtPmNl Yy5sb2NrKTsKCkNhbid0IHdlIGp1c3QgZG8gdGhlIGNhbmNlbF93b3JrX3N5bmMoKSBhdCB0aGUg dmVyeSBzdGFydCBvZiB0aGUKZnVuY3Rpb24/CgpFaXRoZXIgd2F5IHRoaXMgc2hvdWxkbid0IGRl YWRsb2NrIGFueW1vcmUuIEZvciB0aGUgc2VyaWVzClJldmlld2VkLWJ5OiBWaWxsZSBTeXJqw6Rs w6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgoKPiArCj4gKwlpZiAoYXV4LT5jZWMu YWRhcCkgewo+ICsJCS8qCj4gKwkJICogVW5yZWdpc3RlciB0aGUgQ0VDIGFkYXB0ZXIgYWZ0ZXIg ZHJtX2RwX2NlY191bnJlZ2lzdGVyX2RlbGF5Cj4gKwkJICogc2Vjb25kcy4gVGhpcyB0byBkZWJv dW5jZSBzaG9ydCBIUEQgb2ZmLWFuZC1vbiBjeWNsZXMgZnJvbQo+ICsJCSAqIGRpc3BsYXlzLgo+ ICsJCSAqLwo+ICsJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmYXV4LT5jZWMudW5yZWdpc3Rlcl93 b3JrLAo+ICsJCQkJICAgICAgZHJtX2RwX2NlY191bnJlZ2lzdGVyX2RlbGF5ICogSFopOwo+ICsJ fQo+ICt1bmxvY2s6Cj4gKwltdXRleF91bmxvY2soJmF1eC0+Y2VjLmxvY2spOwo+ICt9Cj4gK0VY UE9SVF9TWU1CT0woZHJtX2RwX2NlY191bnNldF9lZGlkKTsKPiArCj4gKy8qKgo+ICsgKiBkcm1f ZHBfY2VjX3JlZ2lzdGVyX2Nvbm5lY3RvcigpIC0gcmVnaXN0ZXIgYSBuZXcgY29ubmVjdG9yCj4g KyAqIEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCj4gKyAqIEBuYW1lOiBuYW1lIG9mIHRo ZSBDRUMgZGV2aWNlCj4gKyAqIEBwYXJlbnQ6IHBhcmVudCBkZXZpY2UKPiArICoKPiArICogQSBu ZXcgY29ubmVjdG9yIHdhcyByZWdpc3RlcmVkIHdpdGggYXNzb2NpYXRlZCBDRUMgYWRhcHRlciBu YW1lIGFuZAo+ICsgKiBDRUMgYWRhcHRlciBwYXJlbnQgZGV2aWNlLiBBZnRlciByZWdpc3Rlcmlu ZyB0aGUgbmFtZSBhbmQgcGFyZW50Cj4gKyAqIGRybV9kcF9jZWNfc2V0X2VkaWQoKSBpcyBjYWxs ZWQgdG8gY2hlY2sgaWYgdGhlIGNvbm5lY3RvciBzdXBwb3J0cwo+ICsgKiBDRUMgYW5kIHRvIHJl Z2lzdGVyIGEgQ0VDIGFkYXB0ZXIgaWYgdGhhdCBpcyB0aGUgY2FzZS4KPiArICovCj4gK3ZvaWQg ZHJtX2RwX2NlY19yZWdpc3Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kcF9hdXggKmF1eCwgY29u c3QgY2hhciAqbmFtZSwKPiArCQkJCXN0cnVjdCBkZXZpY2UgKnBhcmVudCkKPiArewo+ICsJV0FS Tl9PTihhdXgtPmNlYy5hZGFwKTsKPiArCWF1eC0+Y2VjLm5hbWUgPSBuYW1lOwo+ICsJYXV4LT5j ZWMucGFyZW50ID0gcGFyZW50Owo+ICsJSU5JVF9ERUxBWUVEX1dPUksoJmF1eC0+Y2VjLnVucmVn aXN0ZXJfd29yaywgZHJtX2RwX2NlY191bnJlZ2lzdGVyX3dvcmspOwo+ICsKPiArCWRybV9kcF9j ZWNfc2V0X2VkaWQoYXV4LCBOVUxMKTsKPiArfQo+ICtFWFBPUlRfU1lNQk9MKGRybV9kcF9jZWNf cmVnaXN0ZXJfY29ubmVjdG9yKTsKPiArCj4gKy8qKgo+ICsgKiBkcm1fZHBfY2VjX3VucmVnaXN0 ZXJfY29ubmVjdG9yKCkgLSB1bnJlZ2lzdGVyIHRoZSBDRUMgYWRhcHRlciwgaWYgYW55Cj4gKyAq IEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCj4gKyAqLwo+ICt2b2lkIGRybV9kcF9jZWNf dW5yZWdpc3Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kcF9hdXggKmF1eCkKPiArewo+ICsJaWYg KCFhdXgtPmNlYy5hZGFwKQo+ICsJCXJldHVybjsKPiArCWNhbmNlbF9kZWxheWVkX3dvcmtfc3lu YygmYXV4LT5jZWMudW5yZWdpc3Rlcl93b3JrKTsKPiArCWNlY191bnJlZ2lzdGVyX2FkYXB0ZXIo YXV4LT5jZWMuYWRhcCk7Cj4gKwlhdXgtPmNlYy5hZGFwID0gTlVMTDsKPiArfQo+ICtFWFBPUlRf U1lNQk9MKGRybV9kcF9jZWNfdW5yZWdpc3Rlcl9jb25uZWN0b3IpOwo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9o ZWxwZXIuYwo+IGluZGV4IGE3YmE2MDJhNDNhOC4uZjRhMDZiNTRhYTdkIDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0v ZHJtX2RwX2hlbHBlci5jCj4gQEAgLTEwODcsNiArMTA4Nyw3IEBAIHN0YXRpYyB2b2lkIGRybV9k cF9hdXhfY3JjX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ICB2b2lkIGRybV9kcF9h dXhfaW5pdChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KQo+ICB7Cj4gIAltdXRleF9pbml0KCZhdXgt Pmh3X211dGV4KTsKPiArCW11dGV4X2luaXQoJmF1eC0+Y2VjLmxvY2spOwo+ICAJSU5JVF9XT1JL KCZhdXgtPmNyY193b3JrLCBkcm1fZHBfYXV4X2NyY193b3JrKTsKPiAgCj4gIAlhdXgtPmRkYy5h bGdvID0gJmRybV9kcF9pMmNfYWxnbzsKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2Rw X2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCj4gaW5kZXggYzAxNTY0OTkx YTlmLi5kMGEyM2RiMjcxZGMgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBl ci5oCj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2RwX2hlbHBlci5oCj4gQEAgLTEwNzgsNiArMTA3 OCwyNSBAQCBzdHJ1Y3QgZHJtX2RwX2F1eF9tc2cgewo+ICAJc2l6ZV90IHNpemU7Cj4gIH07Cj4g IAo+ICtzdHJ1Y3QgY2VjX2FkYXB0ZXI7Cj4gK3N0cnVjdCBlZGlkOwo+ICsKPiArLyoqCj4gKyAq IHN0cnVjdCBkcm1fZHBfYXV4X2NlYyAtIERpc3BsYXlQb3J0IENFQy1UdW5uZWxpbmctb3Zlci1B VVgKPiArICogQGxvY2s6IG11dGV4IHByb3RlY3RpbmcgdGhpcyBzdHJ1Y3QKPiArICogQGFkYXA6 IHRoZSBDRUMgYWRhcHRlciBmb3IgQ0VDLVR1bm5lbGluZy1vdmVyLUFVWCBzdXBwb3J0Lgo+ICsg KiBAbmFtZTogbmFtZSBvZiB0aGUgQ0VDIGFkYXB0ZXIKPiArICogQHBhcmVudDogcGFyZW50IGRl dmljZSBvZiB0aGUgQ0VDIGFkYXB0ZXIKPiArICogQHVucmVnaXN0ZXJfd29yazogdW5yZWdpc3Rl ciB0aGUgQ0VDIGFkYXB0ZXIKPiArICovCj4gK3N0cnVjdCBkcm1fZHBfYXV4X2NlYyB7Cj4gKwlz dHJ1Y3QgbXV0ZXggbG9jazsKPiArCXN0cnVjdCBjZWNfYWRhcHRlciAqYWRhcDsKPiArCWNvbnN0 IGNoYXIgKm5hbWU7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQ7Cj4gKwlzdHJ1Y3QgZGVsYXll ZF93b3JrIHVucmVnaXN0ZXJfd29yazsKPiArfTsKPiArCj4gIC8qKgo+ICAgKiBzdHJ1Y3QgZHJt X2RwX2F1eCAtIERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCj4gICAqIEBuYW1lOiB1c2VyLXZpc2li bGUgbmFtZSBvZiB0aGlzIEFVWCBjaGFubmVsIGFuZCB0aGUgSTJDLW92ZXItQVVYIGFkYXB0ZXIK PiBAQCAtMTEzNiw2ICsxMTU1LDEwIEBAIHN0cnVjdCBkcm1fZHBfYXV4IHsKPiAgCSAqIEBpMmNf ZGVmZXJfY291bnQ6IENvdW50cyBJMkMgREVGRVJzLCB1c2VkIGZvciBEUCB2YWxpZGF0aW9uLgo+ ICAJICovCj4gIAl1bnNpZ25lZCBpMmNfZGVmZXJfY291bnQ7Cj4gKwkvKioKPiArCSAqIEBjZWM6 IHN0cnVjdCBjb250YWluaW5nIGZpZWxkcyB1c2VkIGZvciBDRUMtVHVubmVsaW5nLW92ZXItQVVY Lgo+ICsJICovCj4gKwlzdHJ1Y3QgZHJtX2RwX2F1eF9jZWMgY2VjOwo+ICB9Owo+ICAKPiAgc3Np emVfdCBkcm1fZHBfZHBjZF9yZWFkKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsIHVuc2lnbmVkIGlu dCBvZmZzZXQsCj4gQEAgLTEyNTgsNCArMTI4MSwzNyBAQCBkcm1fZHBfaGFzX3F1aXJrKGNvbnN0 IHN0cnVjdCBkcm1fZHBfZGVzYyAqZGVzYywgZW51bSBkcm1fZHBfcXVpcmsgcXVpcmspCj4gIAly ZXR1cm4gZGVzYy0+cXVpcmtzICYgQklUKHF1aXJrKTsKPiAgfQo+ICAKPiArI2lmZGVmIENPTkZJ R19EUk1fRFBfQ0VDCj4gK3ZvaWQgZHJtX2RwX2NlY19pcnEoc3RydWN0IGRybV9kcF9hdXggKmF1 eCk7Cj4gK3ZvaWQgZHJtX2RwX2NlY19yZWdpc3Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kcF9h dXggKmF1eCwgY29uc3QgY2hhciAqbmFtZSwKPiArCQkJCSBzdHJ1Y3QgZGV2aWNlICpwYXJlbnQp Owo+ICt2b2lkIGRybV9kcF9jZWNfdW5yZWdpc3Rlcl9jb25uZWN0b3Ioc3RydWN0IGRybV9kcF9h dXggKmF1eCk7Cj4gK3ZvaWQgZHJtX2RwX2NlY19zZXRfZWRpZChzdHJ1Y3QgZHJtX2RwX2F1eCAq YXV4LCBjb25zdCBzdHJ1Y3QgZWRpZCAqZWRpZCk7Cj4gK3ZvaWQgZHJtX2RwX2NlY191bnNldF9l ZGlkKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpOwo+ICsjZWxzZQo+ICtzdGF0aWMgaW5saW5lIHZv aWQgZHJtX2RwX2NlY19pcnEoc3RydWN0IGRybV9kcF9hdXggKmF1eCkKPiArewo+ICt9Cj4gKwo+ ICtzdGF0aWMgaW5saW5lIHZvaWQgZHJtX2RwX2NlY19yZWdpc3Rlcl9jb25uZWN0b3Ioc3RydWN0 IGRybV9kcF9hdXggKmF1eCwKPiArCQkJCQkgICAgICBjb25zdCBjaGFyICpuYW1lLAo+ICsJCQkJ CSAgICAgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCkKPiArewo+ICt9Cj4gKwo+ICtzdGF0aWMgaW5s aW5lIHZvaWQgZHJtX2RwX2NlY191bnJlZ2lzdGVyX2Nvbm5lY3RvcihzdHJ1Y3QgZHJtX2RwX2F1 eCAqYXV4KQo+ICt7Cj4gK30KPiArCj4gK3N0YXRpYyBpbmxpbmUgdm9pZCBkcm1fZHBfY2VjX3Nl dF9lZGlkKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgsCj4gKwkJCQkgICAgICAgY29uc3Qgc3RydWN0 IGVkaWQgKmVkaWQpCj4gK3sKPiArfQo+ICsKPiArc3RhdGljIGlubGluZSB2b2lkIGRybV9kcF9j ZWNfdW5zZXRfZWRpZChzdHJ1Y3QgZHJtX2RwX2F1eCAqYXV4KQo+ICt7Cj4gK30KPiArCj4gKyNl bmRpZgo+ICsKPiAgI2VuZGlmIC8qIF9EUk1fRFBfSEVMUEVSX0hfICovCj4gLS0gCj4gMi4xNy4w CgotLSAKVmlsbGUgU3lyasOkbMOkCkludGVsCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3Rz LmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2RyaS1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mga11.intel.com ([192.55.52.93]:58862 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752573AbeGBOzG (ORCPT ); Mon, 2 Jul 2018 10:55:06 -0400 Date: Mon, 2 Jul 2018 17:55:01 +0300 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Hans Verkuil Cc: linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, Sean Paul , Daniel Vetter , Carlos Santa , Hans Verkuil Subject: Re: [PATCHv7 1/3] drm: add support for DisplayPort CEC-Tunneling-over-AUX Message-ID: <20180702145501.GK5565@intel.com> References: <20180628074253.21088-1-hverkuil@xs4all.nl> <20180628074253.21088-2-hverkuil@xs4all.nl> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20180628074253.21088-2-hverkuil@xs4all.nl> Sender: linux-media-owner@vger.kernel.org List-ID: On Thu, Jun 28, 2018 at 09:42:51AM +0200, Hans Verkuil wrote: > From: Hans Verkuil > > This adds support for the DisplayPort CEC-Tunneling-over-AUX > feature that is part of the DisplayPort 1.3 standard. > > Unfortunately, not all DisplayPort/USB-C to HDMI adapters with a > chip that has this capability actually hook up the CEC pin, so > even though a CEC device is created, it may not actually work. > > Signed-off-by: Hans Verkuil > --- > drivers/gpu/drm/Kconfig | 10 + > drivers/gpu/drm/Makefile | 1 + > drivers/gpu/drm/drm_dp_cec.c | 433 ++++++++++++++++++++++++++++++++ > drivers/gpu/drm/drm_dp_helper.c | 1 + > include/drm/drm_dp_helper.h | 56 +++++ > 5 files changed, 501 insertions(+) > create mode 100644 drivers/gpu/drm/drm_dp_cec.c > > diff --git a/drivers/gpu/drm/Kconfig b/drivers/gpu/drm/Kconfig > index 2a72d2feb76d..d5e217fd0c14 100644 > --- a/drivers/gpu/drm/Kconfig > +++ b/drivers/gpu/drm/Kconfig > @@ -122,6 +122,16 @@ config DRM_LOAD_EDID_FIRMWARE > default case is N. Details and instructions how to build your own > EDID data are given in Documentation/EDID/HOWTO.txt. > > +config DRM_DP_CEC > + bool "Enable DisplayPort CEC-Tunneling-over-AUX HDMI support" > + select CEC_CORE > + help > + Choose this option if you want to enable HDMI CEC support for > + DisplayPort/USB-C to HDMI adapters. > + > + Note: not all adapters support this feature, and even for those > + that do support this they often do not hook up the CEC pin. > + > config DRM_TTM > tristate > depends on DRM && MMU > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > index ef9f3dab287f..270266cc6eca 100644 > --- a/drivers/gpu/drm/Makefile > +++ b/drivers/gpu/drm/Makefile > @@ -41,6 +41,7 @@ drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o > drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o > drm_kms_helper-$(CONFIG_DRM_KMS_CMA_HELPER) += drm_fb_cma_helper.o > drm_kms_helper-$(CONFIG_DRM_DP_AUX_CHARDEV) += drm_dp_aux_dev.o > +drm_kms_helper-$(CONFIG_DRM_DP_CEC) += drm_dp_cec.o > > obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o > obj-$(CONFIG_DRM_DEBUG_SELFTEST) += selftests/ > diff --git a/drivers/gpu/drm/drm_dp_cec.c b/drivers/gpu/drm/drm_dp_cec.c > new file mode 100644 > index 000000000000..1530ca685955 > --- /dev/null > +++ b/drivers/gpu/drm/drm_dp_cec.c > @@ -0,0 +1,433 @@ > +// SPDX-License-Identifier: GPL-2.0 > +/* > + * DisplayPort CEC-Tunneling-over-AUX support > + * > + * Copyright 2018 Cisco Systems, Inc. and/or its affiliates. All rights reserved. > + */ > + > +#include > +#include > +#include > +#include > +#include > + > +/* > + * Unfortunately it turns out that we have a chicken-and-egg situation > + * here. Quite a few active (mini-)DP-to-HDMI or USB-C-to-HDMI adapters > + * have a converter chip that supports CEC-Tunneling-over-AUX (usually the > + * Parade PS176), but they do not wire up the CEC pin, thus making CEC > + * useless. > + * > + * Sadly there is no way for this driver to know this. What happens is > + * that a /dev/cecX device is created that is isolated and unable to see > + * any of the other CEC devices. Quite literally the CEC wire is cut > + * (or in this case, never connected in the first place). > + * > + * The reason so few adapters support this is that this tunneling protocol > + * was never supported by any OS. So there was no easy way of testing it, > + * and no incentive to correctly wire up the CEC pin. > + * > + * Hopefully by creating this driver it will be easier for vendors to > + * finally fix their adapters and test the CEC functionality. > + * > + * I keep a list of known working adapters here: > + * > + * https://hverkuil.home.xs4all.nl/cec-status.txt > + * > + * Please mail me (hverkuil@xs4all.nl) if you find an adapter that works > + * and is not yet listed there. > + * > + * Note that the current implementation does not support CEC over an MST hub. > + * As far as I can see there is no mechanism defined in the DisplayPort > + * standard to transport CEC interrupts over an MST device. It might be > + * possible to do this through polling, but I have not been able to get that > + * to work. > + */ > + > +/** > + * DOC: dp cec helpers > + * > + * These functions take care of supporting the CEC-Tunneling-over-AUX > + * feature of DisplayPort-to-HDMI adapters. > + */ > + > +/* > + * When the EDID is unset because the HPD went low, then the CEC DPCD registers > + * typically can no longer be read (true for a DP-to-HDMI adapter since it is > + * powered by the HPD). However, some displays toggle the HPD off and on for a > + * short period for one reason or another, and that would cause the CEC adapter > + * to be removed and added again, even though nothing else changed. > + * > + * This module parameter sets a delay in seconds before the CEC adapter is > + * actually unregistered. Only if the HPD does not return within that time will > + * the CEC adapter be unregistered. > + * > + * If it is set to a value >= NEVER_UNREG_DELAY, then the CEC adapter will never > + * be unregistered for as long as the connector remains registered. > + * > + * If it is set to 0, then the CEC adapter will be unregistered immediately as > + * soon as the HPD disappears. > + * > + * The default is one second to prevent short HPD glitches from unregistering > + * the CEC adapter. > + * > + * Note that for integrated HDMI branch devices that support CEC the DPCD > + * registers remain available even if the HPD goes low since it is not powered > + * by the HPD. In that case the CEC adapter will never be unregistered during > + * the life time of the connector. At least, this is the theory since I do not > + * have hardware with an integrated HDMI branch device that supports CEC. > + */ > +#define NEVER_UNREG_DELAY 1000 > +static unsigned int drm_dp_cec_unregister_delay = 1; > +module_param(drm_dp_cec_unregister_delay, uint, 0600); > +MODULE_PARM_DESC(drm_dp_cec_unregister_delay, > + "CEC unregister delay in seconds, 0: no delay, >= 1000: never unregister"); > + > +static int drm_dp_cec_adap_enable(struct cec_adapter *adap, bool enable) > +{ > + struct drm_dp_aux *aux = cec_get_drvdata(adap); > + u32 val = enable ? DP_CEC_TUNNELING_ENABLE : 0; > + ssize_t err = 0; > + > + err = drm_dp_dpcd_writeb(aux, DP_CEC_TUNNELING_CONTROL, val); > + return (enable && err < 0) ? err : 0; > +} > + > +static int drm_dp_cec_adap_log_addr(struct cec_adapter *adap, u8 addr) > +{ > + struct drm_dp_aux *aux = cec_get_drvdata(adap); > + /* Bit 15 (logical address 15) should always be set */ > + u16 la_mask = 1 << CEC_LOG_ADDR_BROADCAST; > + u8 mask[2]; > + ssize_t err; > + > + if (addr != CEC_LOG_ADDR_INVALID) > + la_mask |= adap->log_addrs.log_addr_mask | (1 << addr); > + mask[0] = la_mask & 0xff; > + mask[1] = la_mask >> 8; > + err = drm_dp_dpcd_write(aux, DP_CEC_LOGICAL_ADDRESS_MASK, mask, 2); > + return (addr != CEC_LOG_ADDR_INVALID && err < 0) ? err : 0; > +} > + > +static int drm_dp_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, > + u32 signal_free_time, struct cec_msg *msg) > +{ > + struct drm_dp_aux *aux = cec_get_drvdata(adap); > + unsigned int retries = min(5, attempts - 1); > + ssize_t err; > + > + err = drm_dp_dpcd_write(aux, DP_CEC_TX_MESSAGE_BUFFER, > + msg->msg, msg->len); > + if (err < 0) > + return err; > + > + err = drm_dp_dpcd_writeb(aux, DP_CEC_TX_MESSAGE_INFO, > + (msg->len - 1) | (retries << 4) | > + DP_CEC_TX_MESSAGE_SEND); > + return err < 0 ? err : 0; > +} > + > +static int drm_dp_cec_adap_monitor_all_enable(struct cec_adapter *adap, > + bool enable) > +{ > + struct drm_dp_aux *aux = cec_get_drvdata(adap); > + ssize_t err; > + u8 val; > + > + if (!(adap->capabilities & CEC_CAP_MONITOR_ALL)) > + return 0; > + > + err = drm_dp_dpcd_readb(aux, DP_CEC_TUNNELING_CONTROL, &val); > + if (err >= 0) { > + if (enable) > + val |= DP_CEC_SNOOPING_ENABLE; > + else > + val &= ~DP_CEC_SNOOPING_ENABLE; > + err = drm_dp_dpcd_writeb(aux, DP_CEC_TUNNELING_CONTROL, val); > + } > + return (enable && err < 0) ? err : 0; > +} > + > +static void drm_dp_cec_adap_status(struct cec_adapter *adap, > + struct seq_file *file) > +{ > + struct drm_dp_aux *aux = cec_get_drvdata(adap); > + struct drm_dp_desc desc; > + struct drm_dp_dpcd_ident *id = &desc.ident; > + > + if (drm_dp_read_desc(aux, &desc, true)) > + return; > + seq_printf(file, "OUI: %*pdH\n", > + (int)sizeof(id->oui), id->oui); > + seq_printf(file, "ID: %*pE\n", > + (int)strnlen(id->device_id, sizeof(id->device_id)), > + id->device_id); > + seq_printf(file, "HW Rev: %d.%d\n", id->hw_rev >> 4, id->hw_rev & 0xf); > + /* > + * Show this both in decimal and hex: at least one vendor > + * always reports this in hex. > + */ > + seq_printf(file, "FW/SW Rev: %d.%d (0x%02x.0x%02x)\n", > + id->sw_major_rev, id->sw_minor_rev, > + id->sw_major_rev, id->sw_minor_rev); > +} > + > +static const struct cec_adap_ops drm_dp_cec_adap_ops = { > + .adap_enable = drm_dp_cec_adap_enable, > + .adap_log_addr = drm_dp_cec_adap_log_addr, > + .adap_transmit = drm_dp_cec_adap_transmit, > + .adap_monitor_all_enable = drm_dp_cec_adap_monitor_all_enable, > + .adap_status = drm_dp_cec_adap_status, > +}; > + > +static int drm_dp_cec_received(struct drm_dp_aux *aux) > +{ > + struct cec_adapter *adap = aux->cec.adap; > + struct cec_msg msg; > + u8 rx_msg_info; > + ssize_t err; > + > + err = drm_dp_dpcd_readb(aux, DP_CEC_RX_MESSAGE_INFO, &rx_msg_info); > + if (err < 0) > + return err; > + > + if (!(rx_msg_info & DP_CEC_RX_MESSAGE_ENDED)) > + return 0; > + > + msg.len = (rx_msg_info & DP_CEC_RX_MESSAGE_LEN_MASK) + 1; > + err = drm_dp_dpcd_read(aux, DP_CEC_RX_MESSAGE_BUFFER, msg.msg, msg.len); > + if (err < 0) > + return err; > + > + cec_received_msg(adap, &msg); > + return 0; > +} > + > +static void drm_dp_cec_handle_irq(struct drm_dp_aux *aux) > +{ > + struct cec_adapter *adap = aux->cec.adap; > + u8 flags; > + > + if (drm_dp_dpcd_readb(aux, DP_CEC_TUNNELING_IRQ_FLAGS, &flags) < 0) > + return; > + > + if (flags & DP_CEC_RX_MESSAGE_INFO_VALID) > + drm_dp_cec_received(aux); > + > + if (flags & DP_CEC_TX_MESSAGE_SENT) > + cec_transmit_attempt_done(adap, CEC_TX_STATUS_OK); > + else if (flags & DP_CEC_TX_LINE_ERROR) > + cec_transmit_attempt_done(adap, CEC_TX_STATUS_ERROR | > + CEC_TX_STATUS_MAX_RETRIES); > + else if (flags & > + (DP_CEC_TX_ADDRESS_NACK_ERROR | DP_CEC_TX_DATA_NACK_ERROR)) > + cec_transmit_attempt_done(adap, CEC_TX_STATUS_NACK | > + CEC_TX_STATUS_MAX_RETRIES); > + drm_dp_dpcd_writeb(aux, DP_CEC_TUNNELING_IRQ_FLAGS, flags); > +} > + > +/** > + * drm_dp_cec_irq() - handle CEC interrupt, if any > + * @aux: DisplayPort AUX channel > + * > + * Should be called when handling an IRQ_HPD request. If CEC-tunneling-over-AUX > + * is present, then it will check for a CEC_IRQ and handle it accordingly. > + */ > +void drm_dp_cec_irq(struct drm_dp_aux *aux) > +{ > + u8 cec_irq; > + int ret; > + > + mutex_lock(&aux->cec.lock); > + if (!aux->cec.adap) > + goto unlock; > + > + ret = drm_dp_dpcd_readb(aux, DP_DEVICE_SERVICE_IRQ_VECTOR_ESI1, > + &cec_irq); > + if (ret < 0 || !(cec_irq & DP_CEC_IRQ)) > + goto unlock; > + > + drm_dp_cec_handle_irq(aux); > + drm_dp_dpcd_writeb(aux, DP_DEVICE_SERVICE_IRQ_VECTOR_ESI1, DP_CEC_IRQ); > +unlock: > + mutex_unlock(&aux->cec.lock); > +} > +EXPORT_SYMBOL(drm_dp_cec_irq); > + > +static bool drm_dp_cec_cap(struct drm_dp_aux *aux, u8 *cec_cap) > +{ > + u8 cap = 0; > + > + if (drm_dp_dpcd_readb(aux, DP_CEC_TUNNELING_CAPABILITY, &cap) != 1 || > + !(cap & DP_CEC_TUNNELING_CAPABLE)) > + return false; > + if (cec_cap) > + *cec_cap = cap; > + return true; > +} > + > +/* > + * Called if the HPD was low for more than drm_dp_cec_unregister_delay > + * seconds. This unregisters the CEC adapter. > + */ > +static void drm_dp_cec_unregister_work(struct work_struct *work) > +{ > + struct drm_dp_aux *aux = container_of(work, struct drm_dp_aux, > + cec.unregister_work.work); > + > + if (!aux->cec.adap) > + return; I guess this NULL check isn't particularly critical? > + mutex_lock(&aux->cec.lock); > + cec_unregister_adapter(aux->cec.adap); > + aux->cec.adap = NULL; > + mutex_unlock(&aux->cec.lock); > +} > + > +/* > + * A new EDID is set. If there is no CEC adapter, then create one. If > + * there was a CEC adapter, then check if the CEC adapter properties > + * were unchanged and just update the CEC physical address. Otherwise > + * unregister the old CEC adapter and create a new one. > + */ > +void drm_dp_cec_set_edid(struct drm_dp_aux *aux, const struct edid *edid) > +{ > + u32 cec_caps = CEC_CAP_DEFAULTS | CEC_CAP_NEEDS_HPD; > + unsigned int num_las = 1; > + u8 cap; > + > +#ifndef CONFIG_MEDIA_CEC_RC > + /* > + * CEC_CAP_RC is part of CEC_CAP_DEFAULTS, but it is stripped by > + * cec_allocate_adapter() if CONFIG_MEDIA_CEC_RC is undefined. > + * > + * Do this here as well to ensure the tests against cec_caps are > + * correct. > + */ > + cec_caps &= ~CEC_CAP_RC; > +#endif > + cancel_delayed_work_sync(&aux->cec.unregister_work); > + > + mutex_lock(&aux->cec.lock); > + if (!drm_dp_cec_cap(aux, &cap)) { > + /* CEC is not supported, unregister any existing adapter */ > + cec_unregister_adapter(aux->cec.adap); ... considering here we don't check for NULL. Also the check in the work is unlocked so I could imagine some slight race conditions if set_edid()/unset_edid() get called in a particularly funky way. But I suppose we shouldn't really do that so it's probably fine. And the cec_unregister_adapter() is done with the lock held anyway so any bogus pointers can't reach it. > + aux->cec.adap = NULL; > + goto unlock; > + } > + > + if (cap & DP_CEC_SNOOPING_CAPABLE) > + cec_caps |= CEC_CAP_MONITOR_ALL; > + if (cap & DP_CEC_MULTIPLE_LA_CAPABLE) > + num_las = CEC_MAX_LOG_ADDRS; > + > + if (aux->cec.adap) { > + if (aux->cec.adap->capabilities == cec_caps && > + aux->cec.adap->available_log_addrs == num_las) { > + /* Unchanged, so just set the phys addr */ > + cec_s_phys_addr_from_edid(aux->cec.adap, edid); > + goto unlock; > + } > + /* > + * The capabilities changed, so unregister the old > + * adapter first. > + */ > + cec_unregister_adapter(aux->cec.adap); > + } > + > + /* Create a new adapter */ > + aux->cec.adap = cec_allocate_adapter(&drm_dp_cec_adap_ops, > + aux, aux->cec.name, cec_caps, > + num_las); > + if (IS_ERR(aux->cec.adap)) { > + aux->cec.adap = NULL; > + goto unlock; > + } > + if (cec_register_adapter(aux->cec.adap, aux->cec.parent)) { > + cec_delete_adapter(aux->cec.adap); > + aux->cec.adap = NULL; > + } else { > + /* > + * Update the phys addr for the new CEC adapter. When called > + * from drm_dp_cec_register_connector() edid == NULL, so in > + * that case the phys addr is just invalidated. > + */ > + cec_s_phys_addr_from_edid(aux->cec.adap, edid); > + } > +unlock: > + mutex_unlock(&aux->cec.lock); > +} > +EXPORT_SYMBOL(drm_dp_cec_set_edid); > + > +/* > + * The EDID disappeared (likely because of the HPD going down). > + */ > +void drm_dp_cec_unset_edid(struct drm_dp_aux *aux) > +{ > + mutex_lock(&aux->cec.lock); > + if (!aux->cec.adap) > + goto unlock; > + cec_phys_addr_invalidate(aux->cec.adap); > + /* > + * We're done if we want to keep the CEC device > + * (drm_dp_cec_unregister_delay is >= NEVER_UNREG_DELAY) or if the > + * DPCD still indicates the CEC capability (expected for an integrated > + * HDMI branch device). > + */ > + if (drm_dp_cec_unregister_delay >= NEVER_UNREG_DELAY || > + drm_dp_cec_cap(aux, NULL)) > + goto unlock; > + > + mutex_unlock(&aux->cec.lock); > + cancel_delayed_work_sync(&aux->cec.unregister_work); > + mutex_lock(&aux->cec.lock); Can't we just do the cancel_work_sync() at the very start of the function? Either way this shouldn't deadlock anymore. For the series Reviewed-by: Ville Syrjälä > + > + if (aux->cec.adap) { > + /* > + * Unregister the CEC adapter after drm_dp_cec_unregister_delay > + * seconds. This to debounce short HPD off-and-on cycles from > + * displays. > + */ > + schedule_delayed_work(&aux->cec.unregister_work, > + drm_dp_cec_unregister_delay * HZ); > + } > +unlock: > + mutex_unlock(&aux->cec.lock); > +} > +EXPORT_SYMBOL(drm_dp_cec_unset_edid); > + > +/** > + * drm_dp_cec_register_connector() - register a new connector > + * @aux: DisplayPort AUX channel > + * @name: name of the CEC device > + * @parent: parent device > + * > + * A new connector was registered with associated CEC adapter name and > + * CEC adapter parent device. After registering the name and parent > + * drm_dp_cec_set_edid() is called to check if the connector supports > + * CEC and to register a CEC adapter if that is the case. > + */ > +void drm_dp_cec_register_connector(struct drm_dp_aux *aux, const char *name, > + struct device *parent) > +{ > + WARN_ON(aux->cec.adap); > + aux->cec.name = name; > + aux->cec.parent = parent; > + INIT_DELAYED_WORK(&aux->cec.unregister_work, drm_dp_cec_unregister_work); > + > + drm_dp_cec_set_edid(aux, NULL); > +} > +EXPORT_SYMBOL(drm_dp_cec_register_connector); > + > +/** > + * drm_dp_cec_unregister_connector() - unregister the CEC adapter, if any > + * @aux: DisplayPort AUX channel > + */ > +void drm_dp_cec_unregister_connector(struct drm_dp_aux *aux) > +{ > + if (!aux->cec.adap) > + return; > + cancel_delayed_work_sync(&aux->cec.unregister_work); > + cec_unregister_adapter(aux->cec.adap); > + aux->cec.adap = NULL; > +} > +EXPORT_SYMBOL(drm_dp_cec_unregister_connector); > diff --git a/drivers/gpu/drm/drm_dp_helper.c b/drivers/gpu/drm/drm_dp_helper.c > index a7ba602a43a8..f4a06b54aa7d 100644 > --- a/drivers/gpu/drm/drm_dp_helper.c > +++ b/drivers/gpu/drm/drm_dp_helper.c > @@ -1087,6 +1087,7 @@ static void drm_dp_aux_crc_work(struct work_struct *work) > void drm_dp_aux_init(struct drm_dp_aux *aux) > { > mutex_init(&aux->hw_mutex); > + mutex_init(&aux->cec.lock); > INIT_WORK(&aux->crc_work, drm_dp_aux_crc_work); > > aux->ddc.algo = &drm_dp_i2c_algo; > diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h > index c01564991a9f..d0a23db271dc 100644 > --- a/include/drm/drm_dp_helper.h > +++ b/include/drm/drm_dp_helper.h > @@ -1078,6 +1078,25 @@ struct drm_dp_aux_msg { > size_t size; > }; > > +struct cec_adapter; > +struct edid; > + > +/** > + * struct drm_dp_aux_cec - DisplayPort CEC-Tunneling-over-AUX > + * @lock: mutex protecting this struct > + * @adap: the CEC adapter for CEC-Tunneling-over-AUX support. > + * @name: name of the CEC adapter > + * @parent: parent device of the CEC adapter > + * @unregister_work: unregister the CEC adapter > + */ > +struct drm_dp_aux_cec { > + struct mutex lock; > + struct cec_adapter *adap; > + const char *name; > + struct device *parent; > + struct delayed_work unregister_work; > +}; > + > /** > * struct drm_dp_aux - DisplayPort AUX channel > * @name: user-visible name of this AUX channel and the I2C-over-AUX adapter > @@ -1136,6 +1155,10 @@ struct drm_dp_aux { > * @i2c_defer_count: Counts I2C DEFERs, used for DP validation. > */ > unsigned i2c_defer_count; > + /** > + * @cec: struct containing fields used for CEC-Tunneling-over-AUX. > + */ > + struct drm_dp_aux_cec cec; > }; > > ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, > @@ -1258,4 +1281,37 @@ drm_dp_has_quirk(const struct drm_dp_desc *desc, enum drm_dp_quirk quirk) > return desc->quirks & BIT(quirk); > } > > +#ifdef CONFIG_DRM_DP_CEC > +void drm_dp_cec_irq(struct drm_dp_aux *aux); > +void drm_dp_cec_register_connector(struct drm_dp_aux *aux, const char *name, > + struct device *parent); > +void drm_dp_cec_unregister_connector(struct drm_dp_aux *aux); > +void drm_dp_cec_set_edid(struct drm_dp_aux *aux, const struct edid *edid); > +void drm_dp_cec_unset_edid(struct drm_dp_aux *aux); > +#else > +static inline void drm_dp_cec_irq(struct drm_dp_aux *aux) > +{ > +} > + > +static inline void drm_dp_cec_register_connector(struct drm_dp_aux *aux, > + const char *name, > + struct device *parent) > +{ > +} > + > +static inline void drm_dp_cec_unregister_connector(struct drm_dp_aux *aux) > +{ > +} > + > +static inline void drm_dp_cec_set_edid(struct drm_dp_aux *aux, > + const struct edid *edid) > +{ > +} > + > +static inline void drm_dp_cec_unset_edid(struct drm_dp_aux *aux) > +{ > +} > + > +#endif > + > #endif /* _DRM_DP_HELPER_H_ */ > -- > 2.17.0 -- Ville Syrjälä Intel