From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v2,2/2] usb: typec: ucsi: add support for Cypress CCGx From: Heikki Krogerus Message-Id: <20180827105919.GC19671@kuha.fi.intel.com> Date: Mon, 27 Aug 2018 13:59:19 +0300 To: Ajay Gupta Cc: linux-usb@vger.kernel.org, linux-i2c@vger.kernel.org, wsa@the-dreams.de List-ID: SGkgQWpheSwKCk9uIEZyaSwgQXVnIDI0LCAyMDE4IGF0IDAyOjMzOjM2UE0gLTA3MDAsIEFqYXkg R3VwdGEgd3JvdGU6Cj4gTGF0ZXN0IE5WSURJQSBHUFUgY2FyZHMgaGF2ZSBhIEN5cHJlc3MgQ0NH eCBUeXBlLUMgY29udHJvbGxlcgo+IG92ZXIgSTJDIGludGVyZmFjZS4KPiAKPiBUaGlzIFVDU0kg STJDIGRyaXZlciB1c2VzIEkyQyBidXMgZHJpdmVyIGludGVyZmFjZSBmb3IgY29tbXVuaWNhdGlu Zwo+IHdpdGggVHlwZS1DIGNvbnRyb2xsZXIuCgpDb29sLiBUaGUgcGF0Y2ggbG9va3MgZmFpcmx5 IGdvb2QgdG8gbWUsIGJ1dCBJIHB1dCBhIGZldyBjb21tZW50cwpiZWxvdy4KCj4gU2lnbmVkLW9m Zi1ieTogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4KPiAtLS0KPiBDaGFuZ2VzIGZyb20g djEgLT4gdjI6Cj4gRml4ZWQgaWRlbnRhdGlvbiBpbiBkcml2ZXJzL3VzYi90eXBlYy91Y3NpL0tj b25maWcKPiAKPiAgZHJpdmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnICAgICAgICB8ICAxMCAr Cj4gIGRyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvTWFrZWZpbGUgICAgICAgfCAgIDIgKwo+ICBkcml2 ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfaTJjX2NjZy5jIHwgNTkxICsrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKCkNDR3ggY29udHJvbGxlcnMgc3VwcG9ydCBhbHNvIFNQSSBhbmQg VUFSVCBBRkFJSy4gVGhvdWdoLCBJJ20gbm90IHN1cmUKaG93IGNvbW1vbmx5IHRoZXkgYXJlIHVz ZWQgKEkgd291bGQgZXhwZWN0IEkyQyB0byBiZSB0aGUgbW9zdCBjb21tb24Kd2l0aCB0aGVzZSBj b250cm9sbGVycyksIHRoZSBkcml2ZXIgc2hvdWxkIHVsdGltYXRlbHkgd29yayB3aXRoIGJvdGgK b2YgdGhvc2UgYnVzc2VzIGFzIHdlbGwuCgpUbyBhdm9pZCBjb25mdXNpb24sIGFuZCBwb3RlbnRp YWwgZHJpdmVyIGR1cGxpY2F0ZXMgaW4gdGhlIGZ1dHVyZSwKanVzdCBuYW1lIHRoZSBkcml2ZXIg dWNzaV9jY2cuYyBmb3Igbm93LCBhbmQgYWxzbyBzL2kyY19jY2cvY2NnLwpldmVyeXRoaW5nIGlu IHRoZSBkcml2ZXIgKGV4Y2VwdCB0aGUgaTJjX2RyaXZlciBzdHJ1Y3R1cmUgb2YgY291cnNlKS4K Cj4gIDMgZmlsZXMgY2hhbmdlZCwgNjAzIGluc2VydGlvbnMoKykKPiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvdWNzaV9pMmNfY2NnLmMKPiAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy91c2IvdHlwZWMvdWNzaS9LY29uZmlnIGIvZHJpdmVycy91c2IvdHlwZWMvdWNz aS9LY29uZmlnCj4gaW5kZXggZTM2ZDZjNy4uMGNlOWQ0OCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJz L3VzYi90eXBlYy91Y3NpL0tjb25maWcKPiArKysgYi9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL0tj b25maWcKPiBAQCAtMjMsNiArMjMsMTYgQEAgY29uZmlnIFRZUEVDX1VDU0kKPiAgCj4gIGlmIFRZ UEVDX1VDU0kKPiAgCj4gK2NvbmZpZyBVQ1NJX0kyQ19DQ0cKPiArCXRyaXN0YXRlICJVQ1NJIEky QyBJbnRlcmZhY2UgRHJpdmVyIGZvciBDeXByZXNzIENDR3giCj4gKwlkZXBlbmRzIG9uIEkyQ19H UFUKCldoeSBkb2VzIGl0IG5lZWQgdG8gZGVwZW5kIG9ubHkgb24geW91ciBJMkMgY29udHJvbGxl cj8KCkkgdGhpbmsgdGhhdCBzaG91bGQgYmUganVzdCAiZGVwZW5kcyBvbiBJMkMiLgoKPiArCWhl bHAKPiArCSAgVGhpcyBkcml2ZXIgZW5hYmxlcyBVQ1NJIHN1cHBvcnQgb24gTlZJRElBIEdQVXMg dGhhdCBleHBvc2UgYQo+ICsJICBDeXByZXNzIENDR3ggVHlwZS1DIGNvbnRyb2xsZXIgb3ZlciBJ MkMgaW50ZXJmYWNlLgo+ICsKPiArCSAgVG8gY29tcGlsZSB0aGUgZHJpdmVyIGFzIGEgbW9kdWxl LCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKPiArCSAgY2FsbGVkIHVjc2lfaTJj X2NjZy5rby4KPiArCj4gIGNvbmZpZyBVQ1NJX0FDUEkKPiAgCXRyaXN0YXRlICJVQ1NJIEFDUEkg SW50ZXJmYWNlIERyaXZlciIKPiAgCWRlcGVuZHMgb24gQUNQSQo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL3VzYi90eXBlYy91Y3NpL01ha2VmaWxlIGIvZHJpdmVycy91c2IvdHlwZWMvdWNzaS9NYWtl ZmlsZQo+IGluZGV4IDdhZmJlYTUuLjQ0Mzk0ODIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy91c2Iv dHlwZWMvdWNzaS9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMvdXNiL3R5cGVjL3Vjc2kvTWFrZWZp bGUKPiBAQCAtOCwzICs4LDUgQEAgdHlwZWNfdWNzaS15CQkJOj0gdWNzaS5vCj4gIHR5cGVjX3Vj c2ktJChDT05GSUdfVFJBQ0lORykJKz0gdHJhY2Uubwo+ICAKPiAgb2JqLSQoQ09ORklHX1VDU0lf QUNQSSkJCSs9IHVjc2lfYWNwaS5vCj4gKwo+ICtvYmotJChDT05GSUdfVUNTSV9JMkNfQ0NHKQkr PSB1Y3NpX2kyY19jY2cubwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vj c2lfaTJjX2NjZy5jIGIvZHJpdmVycy91c2IvdHlwZWMvdWNzaS91Y3NpX2kyY19jY2cuYwo+IG5l dyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMC4uNTg3ZTNmOAo+IC0tLSAvZGV2L251 bGwKPiArKysgYi9kcml2ZXJzL3VzYi90eXBlYy91Y3NpL3Vjc2lfaTJjX2NjZy5jCj4gQEAgLTAs MCArMSw1OTEgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiArLyoK PiArICogVUNTSSBJMkMgZHJpdmVyIGZvciBDeXByZXNzIENDR3ggVHlwZS1DIGNvbnRyb2xsZXIK PiArICoKPiArICogQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggTlZJRElBIENvcnBvcmF0aW9uLiBB bGwgcmlnaHRzIHJlc2VydmVkLgo+ICsgKiBBdXRob3I6IEFqYXkgR3VwdGEgPGFqYXlnQG52aWRp YS5jb20+Cj4gKyAqCj4gKyAqIFNvbWUgY29kZSBib3Jyb3dlZCBmcm9tIGRyaXZlcnMvdXNiL3R5 cGVjL3Vjc2kvdWNzaV9hY3BpLmMKPiArICovCj4gKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9k ZXZpY2UuaD4KPiArI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ICsjaW5jbHVkZSA8bGludXgv ZGVsYXkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2ky Yy5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGNpLmg+Cj4gKyNpbmNsdWRlICJ1Y3NpLmgiCj4gKwo+ ICtzdHJ1Y3QgdWNzaV9pMmNfY2NnIHsKPiArCXN0cnVjdCBkZXZpY2UgKmRldjsKPiArCXN0cnVj dCB1Y3NpICp1Y3NpOwo+ICsJc3RydWN0IHVjc2lfcHBtIHBwbTsKPiArCXN0cnVjdCBpMmNfY2xp ZW50ICpjbGllbnQ7Cj4gKwlpbnQgaXJxOwo+ICsJYm9vbCB3YWtlX2VuYWJsZWQ7Cj4gKwl1bnNp Z25lZCBjaGFyIHZlcjsKPiArfTsKPiArCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX0RFVklDRV9N T0RFCQkJMHgwMDAwVQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9CT09UX01PREVfUkVBU09OCQkJ MHgwMDAxVQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRUFEX1NJTElDT05fSUQJCQkweDAwMDJV Cj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX0lOVFJfUkVHCQkJCTB4MDAwNlUKPiArI2RlZmluZSBD Q0dYX0kyQ19SQUJfUkVTRVQJCQkJMHgwMDA4VQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRUFE X0FMTF9WRVJTSU9OCQkJMHgwMDEwVQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRUFEX0FMTF9W RVJTSU9OX0JPT1RMT0FERVIgXAo+ICsJCQkoQ0NHWF9JMkNfUkFCX1JFQURfQUxMX1ZFUlNJT04g KyAweDAwKQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OX0JPT1RMT0FE RVJfQkFTRSBcCj4gKwkJCShDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTl9CT09UTE9BREVS ICsgMCkKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTl9CT09UTE9BREVS X0ZXIFwKPiArCQkJKENDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OX0JPT1RMT0FERVIgKyA0 KQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OX0FQUCBcCj4gKwkJCShD Q0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTiArIDB4MDgpCj4gKyNkZWZpbmUgQ0NHWF9JMkNf UkFCX1JFQURfQUxMX1ZFUlNJT05fQVBQX0JBU0UgXAo+ICsJCQkoQ0NHWF9JMkNfUkFCX1JFQURf QUxMX1ZFUlNJT05fQVBQICsgMCkKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVS U0lPTl9BUFBfRlcgXAo+ICsJCQkoQ0NHWF9JMkNfUkFCX1JFQURfQUxMX1ZFUlNJT05fQVBQICsg NCkKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04JCQkweDAwMjBVCj4gKyNkZWZp bmUgQ0NHWF9JMkNfUkFCX1BEUE9SVF9FTkFCTEUJCQkweDAwMkNVCj4gKyNkZWZpbmUgQ0NHWF9J MkNfUkFCX1VDU0lfU1RBVFVTCQkJMHgwMDM4VQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9VQ1NJ X0NPTlRST0wJCQkweDAwMzlVCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTF9T VE9QCQkJMHgyVQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9VQ1NJX0NPTlRST0xfU1RBUlQJCQkw eDFVCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX0hQSV9WRVJTSU9OCQkJMHgwMDNDVQo+ICsjZGVm aW5lIENDR1hfSTJDX1JBQl9SRVNQT05TRV9SRUcJCQkweDAwN0VVCj4gKyNkZWZpbmUgQ0NHWF9J MkNfUkFCX0RNX0NPTlRST0xfMQkJCTB4MTAwMFUKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfV1JJ VEVfREFUQV9NRU1PUllfMQkJMHgxODAwVQo+ICsjZGVmaW5lIENDR1hfSTJDX1JBQl9ETV9DT05U Uk9MXzIJCQkweDIwMDBVCj4gKyNkZWZpbmUgQ0NHWF9JMkNfUkFCX1dSSVRFX0RBVEFfTUVNT1JZ XzIJCTB4MjgwMFUKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfVUNTSV9EQVRBX0JMT0NLCQkJMHhm MDAwVQo+ICsKPiArI2RlZmluZSBDQ0dYX0kyQ19SQUJfUkVTUE9OU0VfUkVHX1JFU0VUX0NPTVBM RVRFCTB4ODAKPiArCj4gK3N0YXRpYyBpbnQgY2NnX3JlYWQoc3RydWN0IHVjc2lfaTJjX2NjZyAq dWksIHUxNiByYWIsIHU4ICpkYXRhLCB1MzIgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSB1aS0+ZGV2Owo+ICsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVpLT5jbGllbnQ7 Cj4gKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKPiArCXN0cnVjdCBpMmNfbXNnIG1zZ3NbXSA9IHsK PiArCQl7Cj4gKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAo+ICsJCQkuZmxhZ3MgID0gMHgwLAo+ ICsJCQkubGVuCT0gMHgyLAo+ICsJCQkuYnVmCT0gYnVmLAo+ICsJCX0sCj4gKwkJewo+ICsJCQku YWRkcgk9IGNsaWVudC0+YWRkciwKPiArCQkJLmZsYWdzICA9IEkyQ19NX1JELAo+ICsJCQkuYnVm CT0gZGF0YSwKPiArCQl9LAo+ICsJfTsKPiArCXUzMiBybGVuLCByZW1fbGVuID0gbGVuOwo+ICsJ aW50IGVycjsKPiArCj4gKwl3aGlsZSAocmVtX2xlbiA+IDApIHsKPiArCQltc2dzWzFdLmJ1ZiA9 ICZkYXRhW2xlbiAtIHJlbV9sZW5dOwo+ICsJCXJsZW4gPSBtaW5fdCh1MTYsIHJlbV9sZW4sIDQp Owo+ICsJCW1zZ3NbMV0ubGVuID0gcmxlbjsKPiArCQlidWZbMF0gPSAocmFiID4+IDApICYgMHhm ZjsKPiArCQlidWZbMV0gPSAocmFiID4+IDgpICYgMHhmZjsKPiArCQllcnIgPSBpMmNfdHJhbnNm ZXIoY2xpZW50LT5hZGFwdGVyLCBtc2dzLCBBUlJBWV9TSVpFKG1zZ3MpKTsKPiArCQlpZiAoZXJy ID09IEFSUkFZX1NJWkUobXNncykpIHsKPiArCQkJZXJyID0gMDsKPiArCQl9IGVsc2UgaWYgKGVy ciA+PSAwKSB7Cj4gKwkJCWRldl9lcnIoZGV2LCAiJXMgaTJjX3RyYW5zZmVyIGZhaWxlZCwgZXJy ICVkXG4iLAo+ICsJCQkJX19mdW5jX18sIGVycik7Cj4gKwkJCXJldHVybiAtRUlPOwo+ICsJCX0K PiArCQlyYWIgKz0gcmxlbjsKPiArCQlyZW1fbGVuIC09IHJsZW47Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIGVycjsKPiArfQo+ICsKPiArc3RhdGljIGludCBjY2dfd3JpdGUoc3RydWN0IHVjc2lfaTJj X2NjZyAqdWksIHUxNiByYWIsIHU4ICpkYXRhLCB1MzIgbGVuKQo+ICt7Cj4gKwlzdHJ1Y3QgZGV2 aWNlICpkZXYgPSB1aS0+ZGV2Owo+ICsJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHVpLT5j bGllbnQ7Cj4gKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyXTsKPiArCXN0cnVjdCBpMmNfbXNnIG1zZ3Nb XSA9IHsKPiArCQl7Cj4gKwkJCS5hZGRyCT0gY2xpZW50LT5hZGRyLAo+ICsJCQkuZmxhZ3MgID0g MHgwLAo+ICsJCQkubGVuCT0gMHgyLAo+ICsJCQkuYnVmCT0gYnVmLAo+ICsJCX0sCj4gKwkJewo+ ICsJCQkuYWRkcgk9IGNsaWVudC0+YWRkciwKPiArCQkJLmZsYWdzICA9IDB4MCwKPiArCQkJLmJ1 Zgk9IGRhdGEsCj4gKwkJCS5sZW4JPSBsZW4sCj4gKwkJfSwKPiArCQl7Cj4gKwkJCS5hZGRyCT0g Y2xpZW50LT5hZGRyLAo+ICsJCQkuZmxhZ3MgID0gSTJDX01fU1RPUCwKPiArCQl9LAo+ICsJfTsK PiArCWludCBlcnI7Cj4gKwo+ICsJYnVmWzBdID0gKHJhYiA+PiAwKSAmIDB4ZmY7Cj4gKwlidWZb MV0gPSAocmFiID4+IDgpICYgMHhmZjsKPiArCWVyciA9IGkyY190cmFuc2ZlcihjbGllbnQtPmFk YXB0ZXIsIG1zZ3MsIEFSUkFZX1NJWkUobXNncykpOwo+ICsJaWYgKGVyciA9PSBBUlJBWV9TSVpF KG1zZ3MpKSB7Cj4gKwkJZXJyID0gMDsKPiArCX0gZWxzZSBpZiAoZXJyID49IDApIHsKPiArCQlk ZXZfZXJyKGRldiwgIiVzIGkyY190cmFuc2ZlciBmYWlsZWQsIGVyciAlZFxuIiwKPiArCQkJX19m dW5jX18sIGVycik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJcmV0dXJuIGVycjsK PiArfQoKSWRlYWxseSB3ZSBjb3VsZCB1c2UgcmVnbWFwLiBJcyB0aGVyZSBzb21ldGhpbmcgcHJl dmVudGluZyB5b3UgZnJvbQp1c2luZyBpMmMgcmVnbWFwPwoKPiArc3RhdGljIGludCB1Y3NpX2ky Y19jY2dfaW5pdChzdHJ1Y3QgdWNzaV9pMmNfY2NnICp1aSkKPiArewo+ICsJc3RydWN0IGRldmlj ZSAqZGV2ID0gdWktPmRldjsKPiArCXU4IGRhdGFbNjRdOwo+ICsJaW50IGksIGVycjsKPiArCj4g KwkvKiBzZWxlY3RpdmVseSBpc3N1ZSBkZXZpY2UgcmVzZXQKPiArCSAqIC0gaWYgUkVTUE9OU0Ug cmVnaXN0ZXIgaXMgUkVTRVRfQ09NUExFVEUsIGRvIG5vdCBpc3N1ZSBkZXZpY2UgcmVzZXQKPiAr CSAqICAgKHdpbGwgY2F1c2UgdXNiIGRldmljZSBkaXNjb25uZWN0IC8gcmVjb25uZWN0KQo+ICsJ ICogLSBpZiBSRVNQT05TRSByZWdpc3RlciBpcyBub3QgUkVTRVRfQ09NUExFVEUsIGlzc3VlIGRl dmljZSByZXNldAo+ICsJICogICAoY2F1c2VzIFBQQyB0byByZXN5bmMgZGV2aWNlIGNvbm5lY3Qg c3RhdGUgYnkgcmUtaXNzdWluZwo+ICsJICogICBzZXQgbXV4IGNvbW1hbmQpCj4gKwkgKi8KPiAr CWRhdGFbMF0gPSAweDAwOwo+ICsJZGF0YVsxXSA9IDB4MDA7Cj4gKwo+ICsJZXJyID0gY2NnX3Jl YWQodWksIENDR1hfSTJDX1JBQl9SRVNQT05TRV9SRUcsIGRhdGEsIDB4Mik7Cj4gKwlpZiAoZXJy IDwgMCkgewo+ICsJCWRldl9lcnIoZGV2LCAiJXMgY2NnX3JlYWQgZmFpbGVkLCBlcnIgJWRcbiIs IF9fZnVuY19fLCBlcnIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQo+ICsKPiArCWRldl9pbmZv KGRldiwgIkNDR1hfSTJDX1JBQl9SRVNQT05TRV9SRUcgJTAyeCIsIGRhdGFbMF0pOwo+ICsKPiAr CS8qIHJlYWQgZGV2aWNlIG1vZGUgKi8KPiArCW1lbXNldChkYXRhLCAwLCBzaXplb2YoZGF0YSkp Owo+ICsKPiArCWVyciA9IGNjZ19yZWFkKHVpLCBDQ0dYX0kyQ19SQUJfREVWSUNFX01PREUsIGRh dGEsIHNpemVvZihkYXRhKSk7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJCWRldl9lcnIoZGV2LCAi JXMgY2NnX3JlYWQgZmFpbGVkLCBlcnIgJWRcbiIsIF9fZnVuY19fLCBlcnIpOwo+ICsJCXJldHVy biAtRUlPOwo+ICsJfQo+ICsKPiArCWRldl9pbmZvKGRldiwgIltERVZJQ0VfTU9ERV0gJTAyeCAo SFBJdiVjKSAoRmxhc2ggcm93IHNpemUgJWQpXG4iLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFCX0RF VklDRV9NT0RFXSwKPiArCQkoKGRhdGFbQ0NHWF9JMkNfUkFCX0RFVklDRV9NT0RFXSA+PiA3KSAm IDB4MDEpID8gJzInIDogJzEnLAo+ICsJCSgoZGF0YVtDQ0dYX0kyQ19SQUJfREVWSUNFX01PREVd ID4+IDQpICYgMHgwMykgPyAyNTYgOiAxMjgpOwo+ICsKPiArCWRldl9pbmZvKGRldiwgIihQRCBw b3J0cyAlZCkgKEZpcm13YXJlIG1vZGUgJWQpXG4iLAo+ICsJCSgoZGF0YVtDQ0dYX0kyQ19SQUJf REVWSUNFX01PREVdID4+IDIpICYgMHgwMykgPyAyIDogMSwKPiArCQkoKGRhdGFbQ0NHWF9JMkNf UkFCX0RFVklDRV9NT0RFXSA+PiAwKSAmIDB4MDMpKTsKPiArCj4gKwlkZXZfaW5mbyhkZXYsICJb Qk9PVF9NT0RFX1JFQVNPTl0gJTAyeCAoQm9vdCBtb2RlIHJlcXVlc3RlZCAlZClcbiIsCj4gKwkJ ZGF0YVtDQ0dYX0kyQ19SQUJfQk9PVF9NT0RFX1JFQVNPTl0sCj4gKwkJKChkYXRhW0NDR1hfSTJD X1JBQl9CT09UX01PREVfUkVBU09OXSA+PiAwKSAmIDB4MDEpID8gMSA6IDApOwo+ICsKPiArCWRl dl9pbmZvKGRldiwgIihGVzEgdmFsaWQgJWQpIChGVzIgdmFsaWQgJWQpXG4iLAo+ICsJCSgoZGF0 YVtDQ0dYX0kyQ19SQUJfQk9PVF9NT0RFX1JFQVNPTl0gPj4gMikgJiAweDAxKSA/IDEgOiAwLAo+ ICsJCSgoZGF0YVtDQ0dYX0kyQ19SQUJfQk9PVF9NT0RFX1JFQVNPTl0gPj4gMykgJiAweDAxKSA/ IDEgOiAwKTsKPiArCj4gKwlkZXZfaW5mbyhkZXYsICJbUkVBRF9TSUxJQ09OX0lEXSAlMDJ4ICUw MngiLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFCX1JFQURfU0lMSUNPTl9JRCswXSwKPiArCQlkYXRh W0NDR1hfSTJDX1JBQl9SRUFEX1NJTElDT05fSUQrMV0pOwo+ICsKPiArCWRldl9pbmZvKGRldiwg IltSRUFEX0FMTF9WRVJTSU9OXVtCT09UTE9BREVSXVxuIik7Cj4gKwlkZXZfaW5mbyhkZXYsICIl MDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCj4gKwkJZGF0YVtDQ0dY X0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTiswXSwKPiArCQlkYXRhW0NDR1hfSTJDX1JBQl9SRUFE X0FMTF9WRVJTSU9OKzFdLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFCX1JFQURfQUxMX1ZFUlNJT04r Ml0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTiszXSwKPiArCQlkYXRh W0NDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OKzRdLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFC X1JFQURfQUxMX1ZFUlNJT04rNV0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVS U0lPTis2XSwKPiArCQlkYXRhW0NDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OKzddKTsKPiAr Cj4gKwlkZXZfaW5mbyhkZXYsICJbUkVBRF9BTExfVkVSU0lPTl1bRlcxXVxuIik7Cj4gKwlkZXZf aW5mbyhkZXYsICIlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCj4g KwkJZGF0YVtDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTis4KzBdLAo+ICsJCWRhdGFbQ0NH WF9JMkNfUkFCX1JFQURfQUxMX1ZFUlNJT04rOCsxXSwKPiArCQlkYXRhW0NDR1hfSTJDX1JBQl9S RUFEX0FMTF9WRVJTSU9OKzgrMl0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfUkVBRF9BTExfVkVS U0lPTis4KzNdLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFCX1JFQURfQUxMX1ZFUlNJT04rOCs0XSwK PiArCQlkYXRhW0NDR1hfSTJDX1JBQl9SRUFEX0FMTF9WRVJTSU9OKzgrNV0sCj4gKwkJZGF0YVtD Q0dYX0kyQ19SQUJfUkVBRF9BTExfVkVSU0lPTis4KzZdLAo+ICsJCWRhdGFbQ0NHWF9JMkNfUkFC X1JFQURfQUxMX1ZFUlNJT04rOCs3XSk7Cj4gKwo+ICsJZGV2X2luZm8oZGV2LCAiW0ZXMl9WRVJT SU9OXSAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCj4gKwkJZGF0 YVtDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04rMF0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfRlcy X1ZFUlNJT04rMV0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04rMl0sCj4gKwkJ ZGF0YVtDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04rM10sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJf RlcyX1ZFUlNJT04rNF0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04rNV0sCj4g KwkJZGF0YVtDQ0dYX0kyQ19SQUJfRlcyX1ZFUlNJT04rNl0sCj4gKwkJZGF0YVtDQ0dYX0kyQ19S QUJfRlcyX1ZFUlNJT04rN10pOwoKVGhhdCBpcyBhIGxvdCBvZiBub2lzZS4gSXQncyBub3QgY2xl YXIgdG8gbWUgd2hhdCBhbGwgdGhhdCBtZWFucy4gSXMKYWxsIHRoYXQgaW5mb3JtYXRpb24gdXNl ZnVsLCBldmVuIGZvciBkZWJ1ZyBwdXJwb3Nlcz8KCj4gKwkvKiByZWFkIHJlc3BvbnNlIHJlZ2lz dGVyICovCj4gKwlkYXRhWzBdID0gMHgwOwo+ICsJZGF0YVsxXSA9IDB4MDsKPiArCj4gKwllcnIg PSBjY2dfcmVhZCh1aSwgQ0NHWF9JMkNfUkFCX1JFU1BPTlNFX1JFRywgZGF0YSwgMHgyKTsKPiAr CWlmIChlcnIgPCAwKSB7Cj4gKwkJZGV2X2VycihkZXYsICIlcyBjY2dfcmVhZCBmYWlsZWQsIGVy ciAlZFxuIiwgX19mdW5jX18sIGVycik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJ aWYgKGRhdGFbMF0gIT0gQ0NHWF9JMkNfUkFCX1JFU1BPTlNFX1JFR19SRVNFVF9DT01QTEVURSkg ewo+ICsJCWRldl9pbmZvKGRldiwgInJlc3BvbnNlICglMDJ4ICUwMngpICE9IHJlc2V0X2NvbXBs ZXRlIiwKPiArCQkJZGF0YVswXSwgZGF0YVsxXSk7Cj4gKwl9Cj4gKwo+ICsJLyogc3RvcCBVQ1NJ ICovCj4gKwllcnIgPSBjY2dfd3JpdGUodWksIENDR1hfSTJDX1JBQl9VQ1NJX0NPTlRST0wsIGRh dGEsIDB4MSk7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJCWRldl9lcnIoZGV2LCAiJXMgY2NnX3dy aXRlIGZhaWxlZCwgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJTzsK PiArCX0KPiArCj4gKwltc2xlZXAoNTAwKTsKPiArCj4gKwkvKiBzdGFydCBVQ1NJICovCj4gKwlk YXRhWzBdID0gQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTF9TVEFSVDsKPiArCWVyciA9IGNjZ193 cml0ZSh1aSwgQ0NHWF9JMkNfUkFCX1VDU0lfQ09OVFJPTCwgZGF0YSwgMHgxKTsKPiArCWlmIChl cnIgPCAwKSB7Cj4gKwkJZGV2X2VycihkZXYsICIlcyBjY2dfd3JpdGUgZmFpbGVkLCBlcnIgJWRc biIsIF9fZnVuY19fLCBlcnIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQo+ICsKPiArCW1zbGVl cCg1MDApOwoKU28gaW4gdG90YWwgeW91IGFyZSB3YWl0aW5nIGZvciBvbmUgc2Vjb25kIHRvIHJl c2V0IHRoYXQgIlVDU0kKY29udHJvbCI/IEFyZSB5b3Ugc3VyZSB5b3UgcmVhbGx5IG5lZWQgdG8g d2FpdCB0aGF0IGxvbmc/CgpPbmUgc2Vjb25kIGlzIGEgYml0IHRvbyBsb25nIHRpbWUgdG8gd2Fp dCBmb3IgYSBkcml2ZXIgdG8gcHJvYmUuCgo+ICsJLyogdGVzdCByZWFkLTEgKi8KPiArCWVyciA9 IGNjZ19yZWFkKHVpLCBDQ0dYX0kyQ19SQUJfVUNTSV9EQVRBX0JMT0NLLCBkYXRhLCAweDIpOwo+ ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZfZXJyKGRldiwgIiVzIGNjZ19yZWFkIGZhaWxlZCwg ZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4g KwkvKiB0ZXN0IHJlYWQtMiAqLwo+ICsJZXJyID0gY2NnX3JlYWQodWksIDB4ZjAwNCwgZGF0YSwg MHg0KTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJZGV2X2VycihkZXYsICIlcyBjY2dfcmVhZCBm YWlsZWQsIGVyciAlZFxuIiwgX19mdW5jX18sIGVycik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9 Cj4gKwo+ICsJLyogdGVzdCByZWFkLTMgKi8KPiArCWVyciA9IGNjZ19yZWFkKHVpLCAweGYwMTAs IGRhdGEsIDB4MTApOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZfZXJyKGRldiwgIiVzIGNj Z19yZWFkIGZhaWxlZCwgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJ TzsKPiArCX0KPiArCj4gKwkvKiBmbHVzaCBDQ0d4IFJFU1BPTlNFIHF1ZXVlIGJ5IGFja2luZyBp bnRlcnJ1cHRzCj4gKwkgKiAtIGFib3ZlIHVjc2kgY29udHJvbCByZWdpc3RlciB3cml0ZSB3aWxs IHB1c2ggcmVzcG9uc2UKPiArCSAqIHdoaWNoIG11c3QgYmUgZmx1c2hlZAo+ICsJICogLSBhZmZl Y3RzIGYvdyB1cGRhdGUgd2hpY2ggcmVhZHMgcmVzcG9uc2UgcmVnaXN0ZXIKPiArCSAqLwo+ICsJ ZGF0YVswXSA9IDB4ZmY7Cj4gKwlmb3IgKGkgPSAwOyAoaSA8IDEwKSAmJiAoZGF0YVswXSAhPSAw eDAwKTsgaSsrKSB7Cj4gKwkJZGV2X2RiZyhkZXYsICJmbHVzaGluZyByZXNwb25zZSAlMDJ4XG4i LCBkYXRhWzBdKTsKCkknbSBub3Qgc3VyZSBpZiB0aGF0IGlzIHVzZWZ1bCBpbmZvcm1hdGlvbiB0 byBhbnlib2R5LgoKPiArCQllcnIgPSBjY2dfd3JpdGUodWksIENDR1hfSTJDX1JBQl9JTlRSX1JF RywgZGF0YSwgMHgxKTsKPiArCQlpZiAoZXJyIDwgMCkgewo+ICsJCQlkZXZfZXJyKGRldiwgIiVz IGNjZ193cml0ZSBmYWlsZWQsIGVyciAlZFxuIiwKPiArCQkJX19mdW5jX18sIGVycik7Cj4gKwkJ CXJldHVybiAtRUlPOwo+ICsJCX0KPiArCj4gKwkJdXNsZWVwX3JhbmdlKDEwMDAwLCAxMTAwMCk7 Cj4gKwo+ICsJCWVyciA9IGNjZ19yZWFkKHVpLCBDQ0dYX0kyQ19SQUJfSU5UUl9SRUcsIGRhdGEs IDB4MSk7Cj4gKwkJaWYgKGVyciA8IDApIHsKPiArCQkJZGV2X2VycihkZXYsICIlcyBjY2dfcmVh ZCBmYWlsZWQsIGVyciAlZFxuIiwKPiArCQkJX19mdW5jX18sIGVycik7Cj4gKwkJCXJldHVybiAt RUlPOwo+ICsJCX0KPiArCX0KPiArCj4gKwkvKiBnZXQgaTJjIHNsYXZlIGZpcm13YXJlIHZlcnNp b24KPiArCSAqIC0gWzAuLjFdID0gQXBwbGljYXRpb24gbmFtZSAoQVNDSUkgIm5iIiBmb3Igbm90 ZWJvb2spCj4gKwkgKiAtIFsyXSA9IGV4dGVybmFsIGNpcmN1aWwgc3BlY2lmaWMgdmVyc2lvbgo+ ICsJICogLSBbM10gYml0IDAuLi4zID0gbWlub3IgdmVyc2lvbgo+ICsJICogLSBbM10gYml0IDQu Li43ID0gbWFqb3IgdmVyc2lvbgo+ICsJICovCj4gKwllcnIgPSBjY2dfcmVhZCh1aSwgMHgwLCBk YXRhLCAweDQpOwo+ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZfZXJyKGRldiwgIiVzIGNjZ19y ZWFkIGZhaWxlZCwgZXJyICVkXG4iLCBfX2Z1bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJTzsK PiArCX0KPiArCj4gKwl1aS0+dmVyID0gZGF0YVszXTsKPiArCj4gKwlkZXZfaW5mbyhkZXYsICJ2 ZXJzaW9uICVkLiVkXG4iLCAodWktPnZlciA+PiA0KSAmIDB4MGYsCj4gKwkJKHVpLT52ZXIgPj4g MCkgJiAweDBmKTsKCk1vcmUgbm9pc2UuIFBsZWFzZSBhdm9pZCBwcmludGluZyB0aGF0IGtpbmQg b2Ygc3R1ZmYgdGhhdCBpcyBvbmx5CnVzZWZ1bCBmb3IgZGVidWdnaW5nLCBpZiBldmVuIGZvciB0 aGF0LgoKV2Ugc2hvdWxkIHByb2JhYmxlIHRoaW5rIGFib3V0IHNob3dpbmcgZGV0YWlscyBsaWtl IGZpcm13YXJlCnZlcnNpb24ocykgdG8gdGhlIHVzZXIgZm9yIGV4YW1wbGUgdmlhIHN5c2ZzLCBi dXQgd2UgY2FuIGRvIHRoYXQKbGF0ZXIuCgo+ICsJcmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRp YyBpbnQgdWNzaV9pMmNfY2NnX3NlbmRfZGF0YShzdHJ1Y3QgdWNzaV9pMmNfY2NnICp1aSkKPiAr ewo+ICsJaW50IGVycjsKPiArCXVuc2lnbmVkIGNoYXIgYnVmWzRdID0gewo+ICsJCTB4MjAsIChD Q0dYX0kyQ19SQUJfVUNTSV9EQVRBX0JMT0NLID4+IDgpLAo+ICsJCTB4OCwgKENDR1hfSTJDX1JB Ql9VQ1NJX0RBVEFfQkxPQ0sgPj4gOCksCj4gKwl9Owo+ICsJdW5zaWduZWQgY2hhciBidWYxWzE2 XTsKPiArCXVuc2lnbmVkIGNoYXIgYnVmMls4XTsKPiArCj4gKwltZW1jcHkoJmJ1ZjFbMF0sICgo Y29uc3Qgdm9pZCAqKSB1aS0+cHBtLmRhdGEpICsgMHgyMCwgc2l6ZW9mKGJ1ZjEpKTsKPiArCW1l bWNweSgmYnVmMlswXSwgKChjb25zdCB2b2lkICopIHVpLT5wcG0uZGF0YSkgKyAweDgsIHNpemVv ZihidWYyKSk7Cj4gKwo+ICsJZXJyID0gY2NnX3dyaXRlKHVpLCAqKHUxNiAqKWJ1ZiwgYnVmMSwg c2l6ZW9mKGJ1ZjEpKTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJZGV2X2Vycih1aS0+ZGV2LCAi JXMgY2NnX3dyaXRlIGZhaWxlZCwgZXJyICVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgZXJyKTsKPiAr CQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwllcnIgPSBjY2dfd3JpdGUodWksICoodTE2ICop KGJ1ZisyKSwgYnVmMiwgc2l6ZW9mKGJ1ZjIpKTsKPiArCWlmIChlcnIgPCAwKSB7Cj4gKwkJZGV2 X2Vycih1aS0+ZGV2LCAiJXMgY2NnX3dyaXRlIGZhaWxlZCwgZXJyICVkXG4iLAo+ICsJCQlfX2Z1 bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJTzsKPiArCX0KPiArCj4gKwlyZXR1cm4gZXJyOwo+ ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfaTJjX2NjZ19yZWN2X2RhdGEoc3RydWN0IHVjc2lf aTJjX2NjZyAqdWkpCj4gK3sKPiArCXN0YXRpYyBpbnQgZmlyc3QgPSAxOwo+ICsJaW50IGVycjsK PiArCXVuc2lnbmVkIGNoYXIgYnVmWzZdID0gewo+ICsJCTB4MCwgKENDR1hfSTJDX1JBQl9VQ1NJ X0RBVEFfQkxPQ0sgPj4gOCksCj4gKwkJMHg0LCAoQ0NHWF9JMkNfUkFCX1VDU0lfREFUQV9CTE9D SyA+PiA4KSwKPiArCQkweDEwLCAoQ0NHWF9JMkNfUkFCX1VDU0lfREFUQV9CTE9DSyA+PiA4KSwK PiArCX07Cj4gKwl1OCAqcHBtID0gKHU4ICopdWktPnBwbS5kYXRhOwo+ICsKPiArCWlmIChmaXJz dCkgewo+ICsJCWVyciA9IGNjZ19yZWFkKHVpLCAqKHUxNiAqKWJ1ZiwgcHBtLCAweDIpOwo+ICsJ CWlmIChlcnIgPCAwKSB7Cj4gKwkJCWRldl9lcnIodWktPmRldiwgIiVzIGNjZ19yZWFkIGZhaWxl ZCwgZXJyICVkXG4iLAo+ICsJCQkJX19mdW5jX18sIGVycik7Cj4gKwkJCXJldHVybiAtRUlPOwo+ ICsJCX0KPiArCQlmaXJzdCA9IDE7Cj4gKwl9Cj4gKwo+ICsJZXJyID0gY2NnX3JlYWQodWksICoo dTE2ICopKGJ1ZiArIDIpLCBwcG0gKyAweDQsIDB4NCk7Cj4gKwlpZiAoZXJyIDwgMCkgewo+ICsJ CWRldl9lcnIodWktPmRldiwgIiVzIGNjZ19yZWFkIGZhaWxlZCwgZXJyICVkXG4iLAo+ICsJCQkJ X19mdW5jX18sIGVycik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJZXJyID0gY2Nn X3JlYWQodWksICoodTE2ICopKGJ1ZiArIDQpLCBwcG0gKyAweDEwLCAweDEwKTsKPiArCWlmIChl cnIgPCAwKSB7Cj4gKwkJZGV2X2Vycih1aS0+ZGV2LCAiJXMgY2NnX3JlYWQgZmFpbGVkLCBlcnIg JWRcbiIsCj4gKwkJCQlfX2Z1bmNfXywgZXJyKTsKPiArCQlyZXR1cm4gLUVJTzsKPiArCX0KPiAr Cj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfaTJjX2NjZ19hY2tf aW50ZXJydXB0KHN0cnVjdCB1Y3NpX2kyY19jY2cgKnVpKQo+ICt7Cj4gKwlpbnQgZXJyOwo+ICsJ dW5zaWduZWQgY2hhciBidWZbM10gPSB7KENDR1hfSTJDX1JBQl9JTlRSX1JFRyAmIDB4ZmYpLAo+ ICsJCShDQ0dYX0kyQ19SQUJfSU5UUl9SRUcgPj4gOCksIDB4MH07Cj4gKwo+ICsJZXJyID0gY2Nn X3JlYWQodWksICoodTE2ICopYnVmLCAmYnVmWzJdLCAweDEpOwo+ICsJaWYgKGVyciA8IDApIHsK PiArCQlkZXZfZXJyKHVpLT5kZXYsICIlcyBjY2dfcmVhZCBmYWlsZWQsIGVyciAlZFxuIiwKPiAr CQkJCV9fZnVuY19fLCBlcnIpOwo+ICsJCXJldHVybiAtRUlPOwo+ICsJfQo+ICsKPiArCWVyciA9 IGNjZ193cml0ZSh1aSwgKih1MTYgKilidWYsICZidWZbMl0sIDB4MSk7Cj4gKwlpZiAoZXJyIDwg MCkgewo+ICsJCWRldl9lcnIodWktPmRldiwgIiVzIGNjZ19yZWFkIGZhaWxlZCwgZXJyICVkXG4i LAo+ICsJCQkJX19mdW5jX18sIGVycik7Cj4gKwkJcmV0dXJuIC1FSU87Cj4gKwl9Cj4gKwo+ICsJ cmV0dXJuIGVycjsKPiArfQo+ICsKPiArc3RhdGljIGludCB1Y3NpX2kyY19jY2dfc3luYyhzdHJ1 Y3QgdWNzaV9wcG0gKnBwbSkKPiArewo+ICsJc3RydWN0IHVjc2lfaTJjX2NjZyAqdWkgPSBjb250 YWluZXJfb2YocHBtLAo+ICsJCXN0cnVjdCB1Y3NpX2kyY19jY2csIHBwbSk7Cj4gKwlpbnQgZXJy Owo+ICsKPiArCWVyciA9IHVjc2lfaTJjX2NjZ19yZWN2X2RhdGEodWkpOwo+ICsJaWYgKGVyciA8 IDApIHsKPiArCQlkZXZfZXJyKHVpLT5kZXYsICIlczogdWNzaV9pMmNfY2NnX3JlY3ZfZGF0YSgp IGVyciAlZFxuIiwKPiArCQkJX19mdW5jX18sIGVycik7Cj4gKwkJZ290byBleGl0Owo+ICsJfQo+ ICsKPiArCS8qIGFjayBpbnRlcnJ1cHQgdG8gYWxsb3cgbmV4dCBjb21tYW5kIHRvIHJ1biAqLwo+ ICsJZXJyID0gdWNzaV9pMmNfY2NnX2Fja19pbnRlcnJ1cHQodWkpOwo+ICsJaWYgKGVyciA8IDAp IHsKPiArCQlkZXZfZXJyKHVpLT5kZXYsICIlczogdWNzaV9pMmNfY2NnX2Fja19pbnRlcnJ1cHQo KSBlcnIgJWRcbiIsCj4gKwkJCV9fZnVuY19fLCBlcnIpOwo+ICsJfQo+ICtleGl0Ogo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdWNzaV9pMmNfY2NnX2NtZChzdHJ1Y3QgdWNz aV9wcG0gKnBwbSwgc3RydWN0IHVjc2lfY29udHJvbCAqY3RybCkKPiArewo+ICsJc3RydWN0IHVj c2lfaTJjX2NjZyAqdWkgPSBjb250YWluZXJfb2YocHBtLAo+ICsJCXN0cnVjdCB1Y3NpX2kyY19j Y2csIHBwbSk7Cj4gKwlpbnQgZXJyID0gMDsKPiArCj4gKwlwcG0tPmRhdGEtPmN0cmwucmF3X2Nt ZCA9IGN0cmwtPnJhd19jbWQ7Cj4gKwllcnIgPSB1Y3NpX2kyY19jY2dfc2VuZF9kYXRhKHVpKTsK PiArCj4gKwlyZXR1cm4gZXJyOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaXJxcmV0dXJuX3QgaTJjX2Nj Z19pcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkYXRhKQo+ICt7Cj4gKwlzdHJ1Y3QgdWNzaV9p MmNfY2NnICp1aSA9IGRhdGE7Cj4gKwo+ICsJZGV2X2RiZyh1aS0+ZGV2LCAiJXMgaXJxICVkIGRh dGEgJXAgdWkgJXBcbiIsCj4gKwkJX19mdW5jX18sIGlycSwgZGF0YSwgdWkpOwoKSSdtIG5vdCBz dXJlIHRoYXQncyB1c2VmdWwgaW5mb3JtYXRpb24uCgpZb3Ugc2hvdWxkIHByb2JhYmxlIHRyeSB0 byBhdm9pZCBkZXZfZGJnKCkgaW4gZ2VuZXJhbCwgZXNwZWNpYWxseQpzaW5jZSB0aGUgdWNzaSBk cml2ZXIgYWxyZWFkeSB1c2VzIHRyYWNlIHBvaW50cy4KCj4gKwlpZiAoIXVpKSB7Cj4gKwkJZGV2 X2Vycih1aS0+ZGV2LCAiJXM6ICF1aVxuIiwgX19mdW5jX18pOwo+ICsJCXJldHVybiBJUlFfSEFO RExFRDsKPiArCX0KPiArCj4gKwl1Y3NpX25vdGlmeSh1aS0+dWNzaSk7Cj4gKwo+ICsJcmV0dXJu IElSUV9IQU5ETEVEOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfaTJjX2NjZ19wcm9iZShz dHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAo+ICsJCQljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9p ZCAqaWQpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKPiArCXN0 cnVjdCB1Y3NpX2kyY19jY2cgKnVpOwo+ICsJaW50IHN0YXR1czsKPiArCj4gKwl1aSA9IGRldm1f a3phbGxvYyhkZXYsIHNpemVvZigqdWkpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdWkpCj4gKwkJ cmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJdWktPnBwbS5kYXRhID0gZGV2bV9remFsbG9jKGRldiwg c2l6ZW9mKHN0cnVjdCB1Y3NpX2RhdGEpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghdWktPnBwbS5k YXRhKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsKPiArCXVpLT5wcG0uY21kID0gdWNzaV9pMmNf Y2NnX2NtZDsKPiArCXVpLT5wcG0uc3luYyA9IHVjc2lfaTJjX2NjZ19zeW5jOwo+ICsJdWktPmRl diA9IGRldjsKPiArCXVpLT5jbGllbnQgPSBjbGllbnQ7Cj4gKwo+ICsJLyogcmVzZXQgaTJjIGRl dmljZSBhbmQgaW5pdGlhbGl6ZSB1Y3NpICovCj4gKwlzdGF0dXMgPSB1Y3NpX2kyY19jY2dfaW5p dCh1aSk7Cj4gKwlpZiAoc3RhdHVzIDwgMCkgewo+ICsJCWRldl9lcnIodWktPmRldiwgIiVzOiB1 Y3NpX2kyY19jY2dfaW5pdCBmYWlsZWQgLSAlZFxuIiwKPiArCQkJX19mdW5jX18sIHN0YXR1cyk7 Cj4gKwkJcmV0dXJuIHN0YXR1czsKPiArCX0KPiArCj4gKwl1aS0+aXJxID0gY2xpZW50LT5pcnE7 Cj4gKwo+ICsJc3RhdHVzID0gZGV2bV9yZXF1ZXN0X3RocmVhZGVkX2lycShkZXYsIHVpLT5pcnEs IE5VTEwsCj4gKwkJaTJjX2NjZ19pcnFfaGFuZGxlciwgSVJRRl9PTkVTSE9UIHwgSVJRRl9UUklH R0VSX0hJR0gsCj4gKwkJZGV2X25hbWUoZGV2KSwgdWkpOwoKVGhlcmUgYXJlIGEgbG90IG9mIHRo b3NlIGFsaWdubWVudCBpc3N1ZXMgaW4gdGhpcyBwYXRjaC4gWW91IGNhbiBydW4KIi4vc2NyaXB0 cy9jaGVja3BhdGNoLnBsIC0tc3RyaWN0IiB0byBmaW5kIGFsbCBvZiB0aGVtLgoKPiArCWlmIChz dGF0dXMgPCAwKSB7Cj4gKwkJZGV2X2Vycih1aS0+ZGV2LCAiJXM6IHJlcXVlc3RfaXJxIGZhaWxl ZCAtICVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgc3RhdHVzKTsKPiArCQlyZXR1cm4gc3RhdHVzOwo+ ICsJfQo+ICsKPiArCXVpLT51Y3NpID0gdWNzaV9yZWdpc3Rlcl9wcG0oZGV2LCAmdWktPnBwbSk7 Cj4gKwlpZiAoSVNfRVJSKHVpLT51Y3NpKSkgewo+ICsJCWRldl9lcnIodWktPmRldiwgInVjc2lf cmVnaXN0ZXJfcHBtIGZhaWxlZFxuIik7Cj4gKwkJcmV0dXJuIFBUUl9FUlIodWktPnVjc2kpOwo+ ICsJfQo+ICsKPiArCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIHVpKTsKPiArCXJldHVybiAw Owo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfaTJjX2NjZ19yZW1vdmUoc3RydWN0IGkyY19j bGllbnQgKmNsaWVudCkKPiArewo+ICsJc3RydWN0IHVjc2lfaTJjX2NjZyAqdWkgPSBpMmNfZ2V0 X2NsaWVudGRhdGEoY2xpZW50KTsKPiArCj4gKwl1Y3NpX3VucmVnaXN0ZXJfcHBtKHVpLT51Y3Np KTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCB1Y3NpX2kyY19jY2df c3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gK3sKPiArCXN0cnVjdCBpMmNfY2xpZW50ICpj bGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7Cj4gKwlzdHJ1Y3QgdWNzaV9pMmNfY2NnICp1aSA9 IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwo+ICsJaW50IGVycjsKPiArCj4gKwlpZiAoZGV2 aWNlX21heV93YWtldXAoZGV2KSkgewo+ICsJCWVyciA9IGVuYWJsZV9pcnFfd2FrZSh1aS0+aXJx KTsKPiArCQlpZiAoIWVycikKPiArCQkJdWktPndha2VfZW5hYmxlZCA9IHRydWU7Cj4gKwl9Cj4g KwlyZXRybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHVjc2lfaTJjX2NjZ19yZXN1bWUoc3Ry dWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9f aTJjX2NsaWVudChkZXYpOwo+ICsJc3RydWN0IHVjc2lfaTJjX2NjZyAqdWkgPSBpMmNfZ2V0X2Ns aWVudGRhdGEoY2xpZW50KTsKPiArCXN0cnVjdCB1Y3NpX2NvbnRyb2wgYzsKPiArCWludCByZXQ7 Cj4gKwo+ICsJaWYgKGRldmljZV9tYXlfd2FrZXVwKGRldikgJiYgdWktPndha2VfZW5hYmxlZCkg ewo+ICsJCWRpc2FibGVfaXJxX3dha2UodWktPmlycSk7Cj4gKwkJdWktPndha2VfZW5hYmxlZCA9 IGZhbHNlOwo+ICsJfQo+ICsKPiArCS8qIHJlc3RvcmUgVUNTSSBub3RpZmljYXRpb24gZW5hYmxl IG1hc2sgKi8KPiArCVVDU0lfQ01EX1NFVF9OVEZZX0VOQUJMRShjLCBVQ1NJX0VOQUJMRV9OVEZZ X0FMTCk7Cj4gKwlyZXQgPSB1Y3NpX3J1bl9jb21tYW5kKHVpLT51Y3NpLCAmYywgTlVMTCwgMCk7 Cj4gKwlpZiAocmV0KSB7Cj4gKwkJZGV2X2Vycih1aS0+ZGV2LCAiJXM6IGZhaWxlZCB0byBzZXQg bm90aWZpY2F0aW9uIGVuYWJsZSAtICVkXG4iLAo+ICsJCQlfX2Z1bmNfXywgcmV0KTsKPiArCX0K PiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArVU5JVkVSU0FMX0RFVl9QTV9PUFModWNzaV9p MmNfY2NnX2RyaXZlcl9wbSwgdWNzaV9pMmNfY2NnX3N1c3BlbmQsCj4gKwl1Y3NpX2kyY19jY2df cmVzdW1lLCBOVUxMKTsKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCB1 Y3NpX2kyY19jY2dfZGV2aWNlX2lkW10gPSB7Cj4gKwl7ImkyYy1ncHUtdWNzaSIsIDB9LAoKSSB0 aGluayB0aGUgbmFtZSBzaG91bGQgYmUgImkyYy1jY2d4LXVjc2kiLCBvciBtYXliZSBqdXN0ICJj Y2d4LXVjc2kiLgoKPiArCXt9LAo+ICt9Owo+ICtNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdWNz aV9pMmNfY2NnX2RldmljZV9pZCk7Cj4gKwo+ICtzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgdWNz aV9pMmNfY2NnX2RyaXZlciA9IHsKPiArCS5kcml2ZXIgPSB7Cj4gKwkJLm5hbWUgPSAidWNzaV9p MmNfY2NnIiwKPiArCQkucG0gPSAmdWNzaV9pMmNfY2NnX2RyaXZlcl9wbSwKPiArCX0sCj4gKwku cHJvYmUgPSB1Y3NpX2kyY19jY2dfcHJvYmUsCj4gKwkucmVtb3ZlID0gdWNzaV9pMmNfY2NnX3Jl bW92ZSwKPiArCS5pZF90YWJsZSA9IHVjc2lfaTJjX2NjZ19kZXZpY2VfaWQsCj4gK307Cj4gKwo+ ICttb2R1bGVfaTJjX2RyaXZlcih1Y3NpX2kyY19jY2dfZHJpdmVyKTsKPiArCj4gK01PRFVMRV9B VVRIT1IoIkFqYXkgR3VwdGEgPGFqYXlnQG52aWRpYS5jb20+Iik7Cj4gK01PRFVMRV9ERVNDUklQ VElPTigiVUNTSSBJMkMgZHJpdmVyIGZvciBDeXByZXNzIENDR3ggVHlwZS1DIGNvbnRyb2xsZXIi KTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+IC0tIAo+IDIuNy40CgoKVGhhbmtzLAo=