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,1/2] i2c: buses: add i2c bus driver for NVIDIA GPU From: Ajay Gupta Message-Id: Date: Wed, 29 Aug 2018 23:01:32 +0000 To: Thierry Reding Cc: "linux-usb@vger.kernel.org" , "linux-i2c@vger.kernel.org" , "wsa@the-dreams.de" , "heikki.krogerus@linux.intel.com" List-ID: SGkgVGhpZXJyeSwKCj4gPiBMYXRlc3QgTlZJRElBIEdQVSBjYXJkIGhhcyBVU0IgVHlwZS1DIGlu dGVyZmFjZS4gVGhlcmUgaXMgYSBUeXBlLUMKPiA+IGNvbnRyb2xsZXIgd2hpY2ggY2FuIGJlIGFj Y2Vzc2VkIG92ZXIgSTJDLgo+ID4KPiA+IFRoaXMgZHJpdmVyIGFkZCBJMkMgYnVzIGRyaXZlciB0 byBjb21tdW5pY2F0ZSB3aXRoIFR5cGUtQyBjb250cm9sbGVyLgo+ID4gSTJDIGNsaWVudCBkcml2 ZXIgd2lsbCBiZSBwYXJ0IG9mIFVTQiBUeXBlLUMgVUNTSSBkcml2ZXIuCj4gPgo+ID4gU2lnbmVk LW9mZi1ieTogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4KPiA+IC0tLQo+ID4gQ2hhbmdl cyBmcm9tIHYxIC0+IHYyOiBOb25lCj4gPgo+ID4gIERvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9p MmMtZ3B1IHwgIDE4ICsrCj4gPiAgTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgfCAg IDcgKwo+ID4gIGRyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnICAgICAgIHwgICA5ICsKPiA+ICBk cml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgICAgICB8ICAgMSArCj4gPiAgZHJpdmVycy9pMmMv YnVzc2VzL2kyYy1ncHUuYyAgICAgfCA0OTMKPiArKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPiA+ICA1IGZpbGVzIGNoYW5nZWQsIDUyOCBpbnNlcnRpb25zKCspCj4gPiAg Y3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtZ3B1ICBjcmVh dGUgbW9kZQo+ID4gMTAwNjQ0IGRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZ3B1LmMKPiAKPiBIaSBB amF5LAo+IAo+IEkgdGhpbmsgdGhpcyBsb29rcyBwcmV0dHkgZ29vZC4gQSBjb3VwbGUgb2YgbWlu b3IsIG1vc3RseSBuaXQtcGlja3ksIGNvbW1lbnRzCj4gYmVsb3cuCj4gCj4gPgo+ID4gZGlmZiAt LWdpdCBhL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtZ3B1Cj4gPiBiL0RvY3VtZW50YXRp b24vaTJjL2J1c3Nlcy9pMmMtZ3B1Cj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+ID4gaW5kZXgg MDAwMDAwMC4uODczYmEzNAo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvRG9jdW1lbnRhdGlv bi9pMmMvYnVzc2VzL2kyYy1ncHUKPiAKPiBJIHRoaW5rIHRoaXMgaXMgdG9vIGdlbmVyaWMuIE1h eWJlIHVzZSBzb21ldGhpbmcgbGlrZSBpMmMtbnZpZGlhLWdwdSBoZXJlIGFuZAo+IGV2ZXJ5d2hl cmUgZWxzZSwgdG8gbWFrZSBpdCBleHBsaWNpdCB0aGF0IHRoaXMgaXMgZm9yIE5WSURJQSBHUFVz IHJhdGhlciB0aGFuCj4gR1BVcyBpbiBnZW5lcmFsLgpvawoKPiA+IEBAIC0wLDAgKzEsMTggQEAK PiA+ICtLZXJuZWwgZHJpdmVyIGkyYy1ncHUKPiA+ICsKPiA+ICtEYXRhc2hlZXQ6IG5vdCBwdWJs aWNseSBhdmFpbGFibGUuCj4gPiArCj4gPiArQXV0aG9yczoKPiA+ICsJQWpheSBHdXB0YSA8YWph eWdAbnZpZGlhLmNvbT4KPiA+ICsKPiA+ICtEZXNjcmlwdGlvbgo+ID4gKy0tLS0tLS0tLS0tCj4g PiArCj4gPiAraTJjLWdwdSBpcyBhIGRyaXZlciBmb3IgSTJDIGNvbnRyb2xsZXIgaW5jbHVkZWQg aW4gTlZJRElBIFR1cmluZyBhbmQKPiA+ICtsYXRlciBHUFVzIGFuZCBpdCBpcyB1c2VkIHRvIGNv bW11bmljYXRlIHdpdGggVHlwZS1DIGNvbnRyb2xsZXIgb24gR1BVcy4KPiA+ICsKPiA+ICtJZiB5 b3VyICdsc3BjaSAtdicgbGlzdGluZyBzaG93cyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5n LAo+ID4gKwo+ID4gKzAxOjAwLjMgU2VyaWFsIGJ1cyBjb250cm9sbGVyIFswYzgwXTogTlZJRElB IENvcnBvcmF0aW9uIERldmljZSAxYWQ5Cj4gPiArKHJldiBhMSkKPiA+ICsKPiA+ICt0aGVuIHRo aXMgZHJpdmVyIHNob3VsZCBzdXBwb3J0IHRoZSBJMkMgY29udHJvbGxlciBvZiB5b3VyIEdQVS4K PiA+IGRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTIGluZGV4IGIyZmNkMWMu LmU5OWY4YTIgMTAwNjQ0Cj4gPiAtLS0gYS9NQUlOVEFJTkVSUwo+ID4gKysrIGIvTUFJTlRBSU5F UlMKPiA+IEBAIC02Nzk2LDYgKzY3OTYsMTMgQEAgTDoJbGludXgtYWNwaUB2Z2VyLmtlcm5lbC5v cmcKPiA+ICBTOglNYWludGFpbmVkCj4gPiAgRjoJZHJpdmVycy9pMmMvaTJjLWNvcmUtYWNwaS5j Cj4gPgo+ID4gK0kyQyBDT05UUk9MTEVSIERSSVZFUiBGT1IgTlZJRElBIEdQVQo+ID4gK006CUFq YXkgR3VwdGEgPGFqYXlnQG52aWRpYS5jb20+Cj4gPiArTDoJbGludXgtaTJjQHZnZXIua2VybmVs Lm9yZwo+ID4gK1M6CU1haW50YWluZWQKPiA+ICtGOglEb2N1bWVudGF0aW9uL2kyYy9idXNzZXMv aTJjLWdwdQo+ID4gK0Y6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZ3B1LmMKPiA+ICsKPiA+ICBJ MkMgTVVYRVMKPiA+ICBNOglQZXRlciBSb3NpbiA8cGVkYUBheGVudGlhLnNlPgo+ID4gIEw6CWxp bnV4LWkyY0B2Z2VyLmtlcm5lbC5vcmcKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNz ZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCj4gPiBpbmRleCA0NTFkNGFl Li5mZjhiMmQ0IDEwMDY0NAo+ID4gLS0tIGEvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcKPiA+ ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnCj4gPiBAQCAtMjI0LDYgKzIyNCwxNSBA QCBjb25maWcgSTJDX05GT1JDRTJfUzQ5ODUKPiA+ICAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBi ZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCj4gPiAgCSAgd2lsbCBiZSBj YWxsZWQgaTJjLW5mb3JjZTItczQ5ODUuCj4gPgo+ID4gK2NvbmZpZyBJMkNfR1BVCj4gPiArCXRy aXN0YXRlICJOVklESUEgR1BVIEkyQyBjb250cm9sbGVyIgo+ID4gKwlkZXBlbmRzIG9uIFBDSQo+ ID4gKwloZWxwCj4gPiArCSAgSWYgeW91IHNheSB5ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQg d2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlCj4gPiArCSAgTlZJRElBIEdQVSBJMkMgY29udHJvbGxl ciB3aGljaCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlCj4gR1BVJ3MKPiA+ICsJICBU eXBlLUMgY29udHJvbGxlci4gVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1 bGUgY2FsbGVkCj4gPiArCSAgaTJjLWdwdS5rby4KPiA+ICsKPiA+ICBjb25maWcgSTJDX1NJUzU1 OTUKPiA+ICAJdHJpc3RhdGUgIlNpUyA1NTk1Igo+ID4gIAlkZXBlbmRzIG9uIFBDSQo+ID4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZSBiL2RyaXZlcnMvaTJjL2J1c3Nl cy9NYWtlZmlsZQo+ID4gaW5kZXggMThiMjZhZi4uMTVkMjg5NCAxMDA2NDQKPiA+IC0tLSBhL2Ry aXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQo+ID4gKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL01h a2VmaWxlCj4gPiBAQCAtMTQwLDUgKzE0MCw2IEBAIG9iai0kKENPTkZJR19JMkNfU0lCWVRFKQkr PSBpMmMtc2lieXRlLm8KPiA+ICBvYmotJChDT05GSUdfSTJDX1hHRU5FX1NMSU1QUk8pICs9IGky Yy14Z2VuZS1zbGltcHJvLm8KPiA+ICBvYmotJChDT05GSUdfU0N4MjAwX0FDQikJKz0gc2N4MjAw X2FjYi5vCj4gPiAgb2JqLSQoQ09ORklHX0kyQ19GU0kpCQkrPSBpMmMtZnNpLm8KPiA+ICtvYmot JChDT05GSUdfSTJDX0dQVSkgICAgICAgICAgKz0gaTJjLWdwdS5vCj4gPgo+ID4gIGNjZmxhZ3Mt JChDT05GSUdfSTJDX0RFQlVHX0JVUykgOj0gLURERUJVRyBkaWZmIC0tZ2l0Cj4gPiBhL2RyaXZl cnMvaTJjL2J1c3Nlcy9pMmMtZ3B1LmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWdwdS5jIG5l dyBmaWxlCj4gPiBtb2RlIDEwMDY0NCBpbmRleCAwMDAwMDAwLi4wZmQyOTQ0Cj4gPiAtLS0gL2Rl di9udWxsCj4gPiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWdwdS5jCj4gPiBAQCAtMCww ICsxLDQ5MyBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCj4gPiAr LyoKPiA+ICsgKiBOdmlkaWEgR1BVIEkyQyBjb250cm9sbGVyIERyaXZlcgo+ID4gKyAqCj4gPiAr ICogQ29weXJpZ2h0IChDKSAyMDE4IE5WSURJQSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNl cnZlZC4KPiA+ICsgKiBBdXRob3I6IEFqYXkgR3VwdGEgPGFqYXlnQG52aWRpYS5jb20+Cj4gPiAr ICoKPiA+ICsgKi8KPiA+ICsjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KPiA+ICsjaW5jbHVkZSA8 bGludXgvaTJjLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+ID4gKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvcGNpLmg+Cj4gPiArI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbS5o Pgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Cj4gPiArCj4gPiArLyogU1RBVFVT IGRlZmluaXRpb25zICAqLwo+ID4gKyNkZWZpbmUgU1RBVFVTX1NVQ0NFU1MJCQkwCj4gPiArI2Rl ZmluZSBTVEFUVVNfVU5TVUNDRVNTRlVMCQkweDgwMDAwMDAwVUwKPiA+ICsjZGVmaW5lIFNUQVRV U19USU1FT1VUCQkJMHg4MDAwMDAwMVVMCj4gPiArI2RlZmluZSBTVEFUVVNfSU9fREVWSUNFX0VS Uk9SCQkweDgwMDAwMDAyVUwKPiA+ICsjZGVmaW5lIFNUQVRVU19JT19USU1FT1VUCQkweDgwMDAw MDA0VUwKPiA+ICsjZGVmaW5lIFNUQVRVU19JT19QUkVFTVBURUQJCTB4ODAwMDAwMDhVTAo+IAo+ IFRoaXMgc2VlbXMgYSBsaXR0bGUgb2RkLiBDYW4gdGhlc2Ugbm90IGJlIGNvbnZlcnRlZCB0byBz dGFuZGFyZCBlcnJubyBjb2Rlcz8KPiBJdCdzIG1vcmUgaWRpb21hdGljIHRvIHJldHVybiAwIG9u IHN1Y2Nlc3MgKGxpa2UgeW91IGRlZmluZSBpbiB0aGUgYWJvdmUpIGFuZCBhCj4gbmVnYXRpdmUg ZXJyb3IgY29kZSBvbiBmYWlsdXJlLiBJZiB5b3UgdXNlIHRoYXQgc2NoZW1lLCB0aGVyZSdzIG5v IG5lZWQgdG8gaGF2ZQo+IGEgc3ltYm9saWMgbmFtZSBmb3Igc3VjY2VzcyBiZWNhdXNlIGl0IGlz IHVzZWQgcHJldHR5IG11Y2ggZXZlcnl3aGVyZS4KPiAKPiBTZWUgaW5jbHVkZS91YXBpL2FzbS1n ZW5lcmljL2Vycm5veywtYmFzZX0uaCBmb3IgYSBsaXN0IG9mIHN0YW5kYXJkIGVycm9yCj4gY29k ZXMuIEkgdGhpbmsgeW91IHNob3VsZCBiZSBhYmxlIHRvIGZpbmQgYSBtYXRjaCBmb3IgZWFjaCBv ZiB0aGUgYWJvdmUuCldpbGwgZml4LgogCj4gPiArLyogQ3lwcmVzcyBUeXBlLUMgY29udHJvbGxl cnMgKENDR3gpIGRldmljZSAqLwo+ID4gKyNkZWZpbmUgQ0NHWF9JMkNfREVWX0FERFJFU1MJCTB4 MDgKPiAKPiBJIGRvbid0IHRoaW5rIHRoZXJlJ3MgYSBuZWVkIGZvciB0aGUgZGVmaW5lIGhlcmUu IFlvdSBvbmx5IHVzZSB0aGUgYWRkcmVzcyBvbmNlLAo+IGFuZCB0aGF0J3Mgd2hlcmUgdGhlIGNs aWVudCBpcyBkZWZpbmVkLCBzbyB5b3UgY2FuIGp1c3QgdXNlIDB4MDggbGl0ZXJhbGx5IGluIHRo YXQKPiBvbmUgbG9jYXRpb24uCm9rCgo+ID4gKy8qIEkyQyBkZWZpbml0aW9ucyAqLwo+ID4gKyNk ZWZpbmUgSTJDX01TVF9DTlRMCQkJCTB4MDAKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9HRU5f U1RBUlQJCQkoMSA8PCAwKQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX0dFTl9TVE9QCQkJKDEg PDwgMSkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9DTURfTk9ORQkJCSgwIDw8IDIpCj4gPiAr I2RlZmluZSBJMkNfTVNUX0NOVExfQ01EX1JFQUQJCQkoMSA8PCAyKQo+ID4gKyNkZWZpbmUgSTJD X01TVF9DTlRMX0NNRF9XUklURQkJCSgyIDw8IDIpCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExf Q01EX1JFU0VUCQkJKDMgPDwgMikKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9HRU5fUkFCCQkJ KDEgPDwgNCkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NISUZUCQkoNikK PiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9HRU5fTkFDSwkJCSgxIDw8IDI4KQo+ID4gKyNkZWZp bmUgSTJDX01TVF9DTlRMX1NUQVRVUwkJCSgzIDw8IDI5KQo+ID4gKyNkZWZpbmUgSTJDX01TVF9D TlRMX1NUQVRVU19PS0FZCQkoMCA8PCAyOSkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFU VVNfTk9fQUNLCQkoMSA8PCAyOSkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFUVVNfVElN RU9VVAkJKDIgPDwgMjkpCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX0JVU19CVVNZ CQkoMyA8PCAyOSkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9DWUNMRV9UUklHR0VSCQkoMSA8 PCAzMSkKPiA+ICsKPiA+ICsjZGVmaW5lIEkyQ19NU1RfQUREUgkJCQkweDA0Cj4gPiArI2RlZmlu ZSBJMkNfTVNUX0FERFJfREFCCQkJMAo+ID4gKwo+ID4gKyNkZWZpbmUgSTJDX01TVF9JMkMwX1RJ TUlORwkJCQkweDA4Cj4gPiArI2RlZmluZSBJMkNfTVNUX0kyQzBfVElNSU5HX1NDTF9QRVJJT0Rf MTAwS0haCj4gCSgweDEwZSA8PCAwKQo+ID4gKyNkZWZpbmUgSTJDX01TVF9JMkMwX1RJTUlOR19T Q0xfUEVSSU9EXzIwMEtIWgo+IAkoMHgwODcgPDwgMCkKPiA+ICsjZGVmaW5lIEkyQ19NU1RfSTJD MF9USU1JTkdfVElNRU9VVF9DTEtfQ05UCQkxNgo+ID4gKyNkZWZpbmUgSTJDX01TVF9JMkMwX1RJ TUlOR19USU1FT1VUX0NMS19DTlRfTUFYCQkyNTUKPiA+ICsjZGVmaW5lIEkyQ19NU1RfSTJDMF9U SU1JTkdfVElNRU9VVF9DSEVDSwkJKDEgPDwgMjQpCj4gPiArCj4gPiArI2RlZmluZSBJMkNfTVNU X0RBVEEJCQkJCTB4MGMKPiA+ICsKPiA+ICsjZGVmaW5lIEkyQ19NU1RfSFlCUklEX1BBRENUTAkJ CQkweDIwCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJRF9QQURDVExfTU9ERV9JMkMJCQkoMSA8 PAo+IDApCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJRF9QQURDVExfSTJDX1NDTF9JTlBVVF9S Q1YJCSgxIDw8Cj4gMTQpCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJRF9QQURDVExfSTJDX1NE QV9JTlBVVF9SQ1YJCSgxIDw8Cj4gMTUpCj4gPiArCj4gPiArLyogUENJIGRyaXZlciBkYXRhICov Cj4gPiArc3RydWN0IGdwdV9pMmNfZGV2IHsKPiA+ICsJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXY7 Cj4gPiArCXZvaWQgX19pb21lbSAqcmVnczsKPiA+ICsJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0 ZXI7Cj4gPiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7Cj4gPiArCXN0cnVjdCBtdXRleCBt dXRleDsKPiA+ICsJYm9vbCBkb19zdGFydDsKPiA+ICt9Owo+ID4gKwo+ID4gK3N0YXRpYyB2b2lk IGVuYWJsZV9pMmNfYnVzKHN0cnVjdCBncHVfaTJjX2RldiAqZ2Rldikgewo+ID4gKwlzdHJ1Y3Qg ZGV2aWNlICpkZXYgPSAmZ2Rldi0+cGNpX2Rldi0+ZGV2Owo+ID4gKwl1MzIgdmFsOwo+ID4gKwo+ ID4gKwkvKiBlbmFibGUgSTJDICovCj4gPiArCXZhbCA9IHJlYWRsKGdkZXYtPnJlZ3MgKyBJMkNf TVNUX0hZQlJJRF9QQURDVEwpOwo+ID4gKwl2YWwgfD0gSTJDX01TVF9IWUJSSURfUEFEQ1RMX01P REVfSTJDIHwKPiA+ICsJCUkyQ19NU1RfSFlCUklEX1BBRENUTF9JMkNfU0NMX0lOUFVUX1JDViB8 Cj4gPiArCQlJMkNfTVNUX0hZQlJJRF9QQURDVExfSTJDX1NEQV9JTlBVVF9SQ1Y7Cj4gPiArCj4g PiArCWRldl9kYmcoZGV2LCAiJXM6ICVwIChJMkNfTVNUX0hZQlJJRF9QQURDVEwpIDwtICUwOHgi LAo+IF9fZnVuY19fLAo+ID4gKwkJKGdkZXYtPnJlZ3MgKyBJMkNfTVNUX0hZQlJJRF9QQURDVEwp LCB2YWwpOwo+IAo+IERvIHdlIHJlYWxseSBuZWVkIHRoZXNlIGRlYnVnIG1lc3NhZ2VzPyBOb25l IG9mIHRoZSBjb25maWd1cmF0aW9uIGFib3ZlIGlzCj4gaW4gYW55IHdheSBwYXJhbWV0ZXJpemVk LCBzbyB0aGUgdmFsdWVzIHRoYXQgYXJlIHdyaXR0ZW4gYXJlIHByZXR0eQo+IGRldGVybWluaXN0 aWMgKHVubGVzcyBtYXliZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgcmVnaXN0ZXIgZGlmZmVy cykuCj4gCj4gSWYgeW91IHJlYWxseSB3YW50IHRvIGtlZXAgdGhlIGRlYnVnIG1lc3NhZ2VzLCBJ IHRoaW5rIHlvdSBzaG91bGQgcmVtb3ZlIGF0Cj4gbGVhc3QgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mg KHlvdSBhbHJlYWR5IHByaW50IHRoZSBuYW1lLCB3aGljaCBpcyBtdWNoIG1vcmUKPiB1c2VmdWwp LiBBbHRlcm5hdGl2ZWx5LCBoYXZlIHlvdSBjb25zaWRlcmVkIHVzaW5nIGZ0cmFjZSB0byBhbGxv dyB0aGVzZSB0cmFjZXMKPiB0byBiZSBkeW5hbWljYWxseSBlbmFibGVkPwpPaywgd2lsbCBmaXgu Cj4gCj4gPiArCj4gPiArCXdyaXRlbCh2YWwsIGdkZXYtPnJlZ3MgKyBJMkNfTVNUX0hZQlJJRF9Q QURDVEwpOwo+ID4gKwo+ID4gKwkvKiBlbmFibGUgMTAwS0haIG1vZGUgKi8KPiA+ICsJdmFsID0g MDsKPiA+ICsJdmFsIHw9IEkyQ19NU1RfSTJDMF9USU1JTkdfU0NMX1BFUklPRF8xMDBLSFo7Cj4g PiArCXZhbCB8PSAoSTJDX01TVF9JMkMwX1RJTUlOR19USU1FT1VUX0NMS19DTlRfTUFYCj4gPiAr CSAgICA8PCBJMkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0xLX0NOVCk7Cj4gPiArCXZhbCB8 PSBJMkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0hFQ0s7Cj4gPiArCj4gPiArCWRldl9kYmco ZGV2LCAiJXM6ICVwIChJMkNfTVNUX0kyQzBfVElNSU5HKSA8LSAlMDh4IiwgX19mdW5jX18sCj4g PiArCQlnZGV2LT5yZWdzICsgSTJDX01TVF9JMkMwX1RJTUlORywgdmFsKTsKPiA+ICsJd3JpdGVs KHZhbCwgZ2Rldi0+cmVncyArIEkyQ19NU1RfSTJDMF9USU1JTkcpOyB9Cj4gPiArCj4gPiArc3Rh dGljIHUzMiBpMmNfY2hlY2tfc3RhdHVzKHN0cnVjdCBncHVfaTJjX2RldiAqZ2Rldikgewo+ID4g KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZ2Rldi0+cGNpX2Rldi0+ZGV2Owo+ID4gKwl1bnNpZ25l ZCBsb25nIHRhcmdldCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOwo+ID4gKwl1 MzIgc3RhdHVzID0gU1RBVFVTX1VOU1VDQ0VTU0ZVTDsKPiA+ICsJdTMyIHZhbDsKPiA+ICsKPiA+ ICsJd2hpbGUgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyh0YXJnZXQpKSB7Cj4gPiArCQl2YWwgPSBy ZWFkbChnZGV2LT5yZWdzICsgSTJDX01TVF9DTlRMKTsKPiA+ICsJCWlmICgodmFsICYgSTJDX01T VF9DTlRMX0NZQ0xFX1RSSUdHRVIpICE9Cj4gPiArCQkJCUkyQ19NU1RfQ05UTF9DWUNMRV9UUklH R0VSKQo+ID4gKwkJCWJyZWFrOwo+ID4gKwkJaWYgKCh2YWwgJiBJMkNfTVNUX0NOVExfU1RBVFVT KSAhPQo+ID4gKwkJCQlJMkNfTVNUX0NOVExfU1RBVFVTX0JVU19CVVNZKQo+ID4gKwkJCWJyZWFr Owo+ID4gKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOwo+ID4gKwl9Cj4gPiArCj4gPiArCWlm ICh0aW1lX2lzX2JlZm9yZV9qaWZmaWVzKHRhcmdldCkpIHsKPiA+ICsJCWRldl9lcnIoZGV2LCAi JXNpMmMgdGltZW91dCIsIF9fZnVuY19fKTsKPiA+ICsJCXJldHVybiBzdGF0dXM7Cj4gCj4gVGhl IGVycm9yIG1lc3NhZ2UgbG9va3Mgc3VzcGljaW91cyBoZXJlLiBUaGVyZSBzaG91bGQgYmUgc29t ZSBzb3J0IG9mCj4gc2VwYXJhdG9yIGJldHdlZW4gdGhlIGZ1bmN0aW9uIG5hbWUgYW5kIHRoZSBy ZXN0IG9mIHRoZSBtZXNzYWdlLiBBbHNvLCBkbwo+IHdlIHJlYWxseSBuZWVkIHRvIHByaW50IHRo ZSBmdW5jdGlvbiBuYW1lPyBUaGF0J3Mgbm90IHZlcnkgdXNlZnVsIHRvIHVzZXJzIChpdAo+IG1p Z2h0IGFjdHVhbGx5IGJlIGNvbmZ1c2luZyBiZWNhdXNlIHRoZSBmdW5jdGlvbiBuYW1lIGlzIHBy ZXR0eSBnZW5lcmljLCBzbwo+IGNvdWxkIGJlIG1pc3Rha2VuIGZvciBhIGNvcmUgZnVuY3Rpb24p IGFuZCB0aGlzIGlzIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHlvdQo+IGNoZWNrIGZvciB0aW1lb3V0 cyBhbnl3YXksIHNvIG5vIG5lZWQgdG8gcmVzb2x2ZSBhbnkgYW1iaWd1aXRpZXMgYnkgYWRkaW5n Cj4gdGhlIGZ1bmN0aW9uIG5hbWUuCk9rLCB3aWxsIGZpeC4KPiAKPiA+ICsJfQo+ID4gKwo+ID4g Kwl2YWwgPSByZWFkbChnZGV2LT5yZWdzICsgSTJDX01TVF9DTlRMKTsKPiA+ICsJc3dpdGNoICh2 YWwgJiBJMkNfTVNUX0NOVExfU1RBVFVTKSB7Cj4gPiArCWNhc2UgSTJDX01TVF9DTlRMX1NUQVRV U19PS0FZOgo+ID4gKwkJc3RhdHVzID0gU1RBVFVTX1NVQ0NFU1M7Cj4gPiArCQlicmVhazsKPiA+ ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX05PX0FDSzoKPiA+ICsJCXN0YXR1cyA9IFNUQVRV U19JT19ERVZJQ0VfRVJST1I7Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSBJMkNfTVNUX0NOVExf U1RBVFVTX1RJTUVPVVQ6Cj4gPiArCQlzdGF0dXMgPSBTVEFUVVNfSU9fVElNRU9VVDsKPiA+ICsJ CWJyZWFrOwo+ID4gKwljYXNlIEkyQ19NU1RfQ05UTF9TVEFUVVNfQlVTX0JVU1k6Cj4gPiArCQlz dGF0dXMgPSBTVEFUVVNfSU9fUFJFRU1QVEVEOwo+ID4gKwkJYnJlYWs7Cj4gPiArCWRlZmF1bHQ6 Cj4gPiArCQlicmVhazsKPiA+ICsJfQo+ID4gKwlyZXR1cm4gc3RhdHVzOwo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgdTMyIGkyY19yZWFkKHN0cnVjdCBncHVfaTJjX2RldiAqZ2RldiwgdTggKmRh dGEsIHUxNiBsZW4pIHsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmdkZXYtPnBjaV9kZXYt PmRldjsKPiA+ICsJdTMyIHN0YXR1czsKPiA+ICsJdTMyIHZhbCA9IDA7Cj4gPiArCj4gPiArCXZh bCB8PSBJMkNfTVNUX0NOVExfR0VOX1NUQVJUIHwgSTJDX01TVF9DTlRMX0dFTl9TVE9QIHwKPiA+ ICsJCUkyQ19NU1RfQ05UTF9DTURfUkVBRCB8IChsZW4gPDwKPiBJMkNfTVNUX0NOVExfQlVSU1Rf U0laRV9TSElGVCkgfAo+ID4gKwkJSTJDX01TVF9DTlRMX0NZQ0xFX1RSSUdHRVIgfAo+IEkyQ19N U1RfQ05UTF9HRU5fTkFDSzsKPiA+ICsJdmFsICY9IH5JMkNfTVNUX0NOVExfR0VOX1JBQjsKPiA+ ICsJd3JpdGVsKHZhbCwgZ2Rldi0+cmVncyArIEkyQ19NU1RfQ05UTCk7Cj4gPiArCj4gPiArCXN0 YXR1cyA9IGkyY19jaGVja19zdGF0dXMoZ2Rldik7Cj4gPiArCWlmIChzdGF0dXMgPT0gU1RBVFVT X1VOU1VDQ0VTU0ZVTCkgewo+ID4gKwkJZGV2X2VycihkZXYsICIlcyBmYWlsZWRcbiIsIF9fZnVu Y19fKTsKPiA+ICsJCXJldHVybiBzdGF0dXM7Cj4gPiArCX0KPiAKPiBUaGVyZSdzIG5vIG5lZWQg Zm9yIHRoaXMgZXJyb3IgbWVzc2FnZSwgc2luY2UgdGhlIGNhbGxlciBhbHJlYWR5IHByb3ZpZGVz IG9uZS4KU3VyZS4KPiAKPiA+ICsKPiA+ICsJdmFsID0gcmVhZGwoZ2Rldi0+cmVncyArIEkyQ19N U1RfREFUQSk7Cj4gPiArCXN3aXRjaCAobGVuKSB7Cj4gPiArCWNhc2UgMToKPiA+ICsJCWRhdGFb MF0gPSAodmFsID4+IDApICYgMHhmZjsKPiA+ICsJCWJyZWFrOwo+ID4gKwljYXNlIDI6Cj4gPiAr CQlkYXRhWzBdID0gKHZhbCA+PiA4KSAmIDB4ZmY7Cj4gPiArCQlkYXRhWzFdID0gKHZhbCA+PiAw KSAmIDB4ZmY7Cj4gPiArCQlicmVhazsKPiA+ICsJY2FzZSAzOgo+ID4gKwkJZGF0YVswXSA9ICh2 YWwgPj4gMTYpICYgMHhmZjsKPiA+ICsJCWRhdGFbMV0gPSAodmFsID4+IDgpICYgMHhmZjsKPiA+ ICsJCWRhdGFbMl0gPSAodmFsID4+IDApICYgMHhmZjsKPiA+ICsJCWJyZWFrOwo+ID4gKwljYXNl IDQ6Cj4gPiArCQlkYXRhWzBdID0gKHZhbCA+PiAyNCkgJiAweGZmOwo+ID4gKwkJZGF0YVsxXSA9 ICh2YWwgPj4gMTYpICYgMHhmZjsKPiA+ICsJCWRhdGFbMl0gPSAodmFsID4+IDgpICYgMHhmZjsK PiA+ICsJCWRhdGFbM10gPSAodmFsID4+IDApICYgMHhmZjsKPiA+ICsJCWJyZWFrOwo+ID4gKwlk ZWZhdWx0Ogo+ID4gKwkJYnJlYWs7Cj4gPiArCX0KPiA+ICsJcmV0dXJuIHN0YXR1czsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHUzMiBpMmNfbWFudWFsX3N0YXJ0KHN0cnVjdCBncHVfaTJjX2Rl diAqZ2RldiwgdTE2IGFkZHIpIHsKPiA+ICsJdTMyIHZhbCA9IDA7Cj4gPiArCj4gPiArCXZhbCA9 IGFkZHIgPDwgSTJDX01TVF9BRERSX0RBQjsKPiA+ICsJd3JpdGVsKHZhbCwgZ2Rldi0+cmVncyAr IEkyQ19NU1RfQUREUik7Cj4gPiArCj4gPiArCXZhbCA9IDA7Cj4gPiArCXZhbCB8PSBJMkNfTVNU X0NOVExfR0VOX1NUQVJUIHwgSTJDX01TVF9DTlRMX0NNRF9OT05FIHwKPiA+ICsJCUkyQ19NU1Rf Q05UTF9HRU5fTkFDSzsKPiA+ICsJdmFsICY9IH4oSTJDX01TVF9DTlRMX0dFTl9TVE9QIHwgSTJD X01TVF9DTlRMX0dFTl9SQUIpOwo+ID4gKwl3cml0ZWwodmFsLCBnZGV2LT5yZWdzICsgSTJDX01T VF9DTlRMKTsKPiA+ICsKPiA+ICsJcmV0dXJuIGkyY19jaGVja19zdGF0dXMoZ2Rldik7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyB1MzIgaTJjX21hbnVhbF9zdG9wKHN0cnVjdCBncHVfaTJjX2Rl diAqZ2Rldikgewo+ID4gKwl1MzIgdmFsID0gMDsKPiA+ICsKPiA+ICsJdmFsIHw9IEkyQ19NU1Rf Q05UTF9HRU5fU1RPUCB8IEkyQ19NU1RfQ05UTF9DTURfTk9ORSB8Cj4gPiArCQlJMkNfTVNUX0NO VExfR0VOX05BQ0s7Cj4gPiArCXZhbCAmPSB+KEkyQ19NU1RfQ05UTF9HRU5fU1RBUlQgfCBJMkNf TVNUX0NOVExfR0VOX1JBQik7Cj4gPiArCXdyaXRlbCh2YWwsIGdkZXYtPnJlZ3MgKyBJMkNfTVNU X0NOVEwpOwo+ID4gKwo+ID4gKwlyZXR1cm4gaTJjX2NoZWNrX3N0YXR1cyhnZGV2KTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHUzMiBpMmNfbWFudWFsX3dyaXRlKHN0cnVjdCBncHVfaTJjX2Rl diAqZ2RldiwgdTggZGF0YSkgewo+ID4gKwl1MzIgdmFsID0gMDsKPiA+ICsKPiA+ICsJd3JpdGVs KGRhdGEsIGdkZXYtPnJlZ3MgKyBJMkNfTVNUX0RBVEEpOwo+ID4gKwo+ID4gKwl2YWwgfD0gSTJD X01TVF9DTlRMX0NNRF9XUklURSB8ICgxIDw8Cj4gSTJDX01TVF9DTlRMX0JVUlNUX1NJWkVfU0hJ RlQpIHwKPiA+ICsJCUkyQ19NU1RfQ05UTF9HRU5fTkFDSzsKPiA+ICsJdmFsICY9IH4oSTJDX01T VF9DTlRMX0dFTl9TVEFSVCB8IEkyQ19NU1RfQ05UTF9HRU5fU1RPUAo+ID4gKwkJfCBJMkNfTVNU X0NOVExfR0VOX1JBQik7Cj4gPiArCXdyaXRlbCh2YWwsIGdkZXYtPnJlZ3MgKyBJMkNfTVNUX0NO VEwpOwo+ID4gKwo+ID4gKwlyZXR1cm4gaTJjX2NoZWNrX3N0YXR1cyhnZGV2KTsKPiA+ICt9Cj4g PiArCj4gPiArLyogZ2RldiBpMmMgYWRhcHRlciAqLwo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19t YXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsCj4gPiArCXN0cnVjdCBpMmNfbXNn ICptc2dzLCBpbnQgbnVtKQo+ID4gK3sKPiA+ICsJc3RydWN0IGdwdV9pMmNfZGV2ICpnZGV2ID0g aTJjX2dldF9hZGFwZGF0YShhZGFwKTsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJmdkZXYt PnBjaV9kZXYtPmRldjsKPiA+ICsJaW50IHJldHJ5MWIgPSAxMDsKPiA+ICsJdTMyIHN0YXR1czsK PiA+ICsJaW50IGksIGo7Cj4gPiArCj4gPiArCWRldl9kYmcoZGV2LCAiJXM6IGFkYXAgJXAgbXNn cyAlcCBudW0gJWRcbiIsIF9fZnVuY19fLCBhZGFwLAo+IG1zZ3MsCj4gPiArbnVtKTsKPiAKPiBU aGVyZSdzIGFscmVhZHkgY29kZSBpbiBkcml2ZXJzL2kyYy9pMmMtY29yZS1iYXNlLmMgdGhhdCB3 aWxsIHByaW50IG1vc3RseSB0aGUKPiBzYW1lIGluZm9ybWF0aW9uIHdoZW4gREVCVUcgaXMgZW5h YmxlZC4KT2ssIHdpbGwgZml4Lgo+IAo+ID4gKwltdXRleF9sb2NrKCZnZGV2LT5tdXRleCk7Cj4g PiArCj4gPiArCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgewo+ID4gKwkJaWYgKG1zZ3NbaV0u ZmxhZ3MgJiBJMkNfTV9SRCkgewo+ID4gK3JldHJ5MjoKPiA+ICsJCQlzdGF0dXMgPSBpMmNfcmVh ZChnZGV2LCBtc2dzW2ldLmJ1ZiwgbXNnc1tpXS5sZW4pOwo+ID4gKwkJCWlmIChzdGF0dXMgIT0g U1RBVFVTX1NVQ0NFU1MpIHsKPiA+ICsJCQkJZGV2X2VycihkZXYsCj4gPiArCQkJCSIlczolZCBp MmNfcmVhZCBmYWlsZWQgJTA4bHgiLCBfX2Z1bmNfXywKPiA+ICsJCQkJX19MSU5FX18sICh1bnNp Z25lZCBsb25nKXN0YXR1cyk7Cj4gCj4gQWdhaW4sIEknbSBub3Qgc3VyZSBmaWxlbmFtZSBhbmQg bGluZSBudW1iZXIgd2lsbCBwcm92aWRlIHVzZWZ1bCBpbmZvcm1hdGlvbi4KPiBJJ2Qgc2ltcGx5 IHJlZmVyIHRvIHRoZSBvcGVyYXRpb24gdGhhdCBmYWlsZWQsIGFsb25nIHRoZSBsaW5lcyBvZjoK PiAKPiAJZXJyID0gaTJjX3JlYWQoLi4uKTsKPiAJaWYgKGVyciA8IDApIHsKPiAJCWRldl9lcnIo ZGV2LCAiSTJDIHJlYWQgZmFpbGVkOiAlZFxuIiwgZXJyKTsKPiAJCS4uLgo+IAl9Cm9rCj4gCj4g PiArCj4gPiArCQkJCWlmICgtLXJldHJ5MWIgPiAwKSB7Cj4gPiArCQkJCQl1c2xlZXBfcmFuZ2Uo MTAwMDAsIDExMDAwKTsKPiA+ICsJCQkJCWdvdG8gcmV0cnkyOwo+ID4gKwkJCQl9Cj4gPiArCQkJ CWJyZWFrOwo+ID4gKwkJCX0KPiAKPiBBbHNvLCBwZXJoYXBzIHlvdSB3YW50IHRvIG9ubHkgb3V0 cHV0IHRoZSBlcnJvciByaWdodCBiZWZvcmUgdGhlIGJyZWFrIHNvIHRoYXQKPiB5b3UgZG9uJ3Qg cG90ZW50aWFsbHkgZ2V0IDEwIGlkZW50aWNhbCBlcnJvciBtZXNzYWdlcz8KPiAKPiA+ICsJCQln ZGV2LT5kb19zdGFydCA9IHRydWU7Cj4gPiArCQl9IGVsc2UgaWYgKG1zZ3NbaV0uZmxhZ3MgJiBJ MkNfTV9TVE9QKSB7Cj4gPiArCQkJc3RhdHVzID0gaTJjX21hbnVhbF9zdG9wKGdkZXYpOwo+ID4g KwkJCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NFU1MpIHsKPiA+ICsJCQkJZGV2X2VycihkZXYs Cj4gPiArCQkJCSIlczolZCBpMmNfbWFudWFsX3N0b3AgZmFpbGVkICUwOGx4IiwKPiBfX2Z1bmNf XywKPiA+ICsJCQkJX19MSU5FX18sICh1bnNpZ25lZCBsb25nKXN0YXR1cyk7Cj4gPiArCQkJCWdv dG8gZXhpdDsKPiA+ICsJCQl9Cj4gPiArCQkJZ2Rldi0+ZG9fc3RhcnQgPSB0cnVlOwo+ID4gKwkJ fSBlbHNlIHsKPiA+ICsJCQlkZXZfZGJnKGRldiwgIiFJMkNfTV9SRCBzdGFydCAlZCBsZW4gJWRc biIsCj4gPiArCQkJCWdkZXYtPmRvX3N0YXJ0LCBtc2dzW2ldLmxlbik7Cj4gPiArCQkJaWYgKGdk ZXYtPmRvX3N0YXJ0KSB7Cj4gPiArCQkJCXN0YXR1cyA9IGkyY19tYW51YWxfc3RhcnQoZ2Rldiwg bXNnc1tpXS5hZGRyKTsKPiA+ICsJCQkJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewo+ ID4gKwkJCQkJZGV2X2VycihkZXYsCj4gPiArCQkJCQkiJXM6JWQgaTJjX21hbnVhbF9zdGFydCBm YWlsZWQKPiAlMDhseCIsCj4gPiArCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAo+ID4gKwkJCQkJ CSh1bnNpZ25lZCBsb25nKXN0YXR1cyk7Cj4gPiArCQkJCQlnb3RvIGV4aXQ7Cj4gPiArCQkJCX0K PiA+ICsJCQkJc3RhdHVzID0gaTJjX21hbnVhbF93cml0ZShnZGV2LAo+ID4gKwkJCQkJCW1zZ3Nb aV0uYWRkciA8PCAxKTsKPiA+ICsJCQkJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewo+ ID4gKwkJCQkJZGV2X2VycihkZXYsCj4gPiArCQkJCQkiJXM6JWQgaTJjX21hbnVhbF93cml0ZSBm YWlsZWQKPiAlMDhseCIsCj4gPiArCQkJCQkJX19mdW5jX18sIF9fTElORV9fLAo+ID4gKwkJCQkJ CSh1bnNpZ25lZCBsb25nKXN0YXR1cyk7Cj4gPiArCQkJCQlnb3RvIGV4aXRfc3RvcDsKPiA+ICsJ CQkJfQo+ID4gKwkJCQlnZGV2LT5kb19zdGFydCA9IGZhbHNlOwo+ID4gKwkJCX0KPiA+ICsJCQlm b3IgKGogPSAwOyBqIDwgbXNnc1tpXS5sZW47IGorKykgewo+ID4gKwkJCQlzdGF0dXMgPSBpMmNf bWFudWFsX3dyaXRlKGdkZXYsCj4gPiArCQkJCQkJKihtc2dzW2ldLmJ1ZiArIGopKTsKPiA+ICsJ CQkJaWYgKHN0YXR1cyAhPSBTVEFUVVNfU1VDQ0VTUykgewo+ID4gKwkJCQkJZGV2X2VycihkZXYs Cj4gPiArCQkJCQkiJXM6JWQgaTJjX21hbnVhbF93cml0ZSBmYWlsZWQKPiAlMDhseCIsCj4gPiAr CQkJCQkJX19mdW5jX18sIF9fTElORV9fLAo+ID4gKwkJCQkJCSh1bnNpZ25lZCBsb25nKXN0YXR1 cyk7Cj4gPiArCQkJCQlnb3RvIGV4aXRfc3RvcDsKPiA+ICsJCQkJfQo+ID4gKwkJCX0KPiA+ICsJ CX0KPiA+ICsJfQo+ID4gKwlnb3RvIGV4aXQ7Cj4gPiArZXhpdF9zdG9wOgo+ID4gKwlzdGF0dXMg PSBpMmNfbWFudWFsX3N0b3AoZ2Rldik7Cj4gPiArCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NVQ0NF U1MpCj4gPiArCQlkZXZfZXJyKGRldiwgImkyY19tYW51YWxfc3RvcCBmYWlsZWQgJXgiLCBzdGF0 dXMpOwo+ID4gK2V4aXQ6Cj4gPiArCW11dGV4X3VubG9jaygmZ2Rldi0+bXV0ZXgpOwo+ID4gKwly ZXR1cm4gaTsKPiA+ICt9Cj4gCj4gWW91IG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgdXNpbmcgbW9y ZSBkZXNjcmlwdGl2ZSBuYW1lcyBmb3IgdGhlIGxhYmVscyB0bwo+IG1ha2UgdGhlIGNvZGUgbW9y ZSByZWFkYWJsZS4gU29tZXRoaW5nIGxpa2U6Cj4gCj4gCQkuLi4KPiAJCWdvdG8gc3RvcDsKPiAJ fQo+IAo+IAlnb3RvIHVubG9jazsKPiAKPiAJc3RvcDoKPiAJCS4uLgo+IAl1bmxvY2s6Cj4gCQku Li4KPiAKPiBJcyBtb3JlIHJlYWRhYmxlIEkgdGhpbmsuIEFsc28sIEkgdGhpbmsgdGhlIGhpZ2gg bGV2ZWwgb2YgaW5kZW50YXRpb24gbWFrZXMgdGhpcwo+IGZ1bmN0aW9uIGhhcmQgdG8gcmVhZC4g WW91IG1heSB3YW50IHRvIHNwbGl0IGl0IHVwIGludG8gc21hbGxlciBjaHVua3MuCm9rCj4gCj4g PiArCj4gPiArc3RhdGljIHUzMiBncHVfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFw dGVyICphZGFwKSB7Cj4gPiArCXJldHVybiBJMkNfRlVOQ19JMkMgfCBJMkNfRlVOQ19TTUJVU19F TVVMOyB9Cj4gPiArCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGdwdV9p MmNfYWxnb3JpdGhtID0gewo+ID4gKwkubWFzdGVyX3hmZXIJPSBncHVfaTJjX21hc3Rlcl94ZmVy LAo+ID4gKwkuZnVuY3Rpb25hbGl0eQk9IGdwdV9pMmNfZnVuY3Rpb25hbGl0eSwKPiA+ICt9Owo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19kZXZfaW5pdChzdHJ1Y3QgZ3B1X2kyY19kZXYg KmdkZXYpIHsKPiA+ICsJZ2Rldi0+ZG9fc3RhcnQgPSB0cnVlOwo+ID4gKwo+ID4gKwkvKiBpbml0 aWFsaXplIG11dGV4ICovCj4gPiArCW11dGV4X2luaXQoJmdkZXYtPm11dGV4KTsKPiA+ICsKPiA+ ICsJLyogaW5pdGlhbGl6ZSBpMmMgKi8KPiA+ICsJZW5hYmxlX2kyY19idXMoZ2Rldik7Cj4gPiAr Cj4gPiArCXJldHVybiAwOwo+ID4gK30KPiAKPiBZb3UgbWlnaHQgd2FudCB0byBjb25zaWRlciBt b3ZpbmcgdGhpcyBkaXJlY3RseSBpbnRvIHRoZSAtPnByb2JlKCkKPiBpbXBsZW1lbnRhdGlvbi4g WW91IG5ldmVyIHJldXNlIHRoaXMgZWxzZXdoZXJlIGFuZCBpdCdzIG5vdCBiaWcgZW5vdWdoIHRv Cj4gd2FycmFudCB0aGUgc2VwYXJhdGUgZnVuY3Rpb24uIElubGluaW5nIGl0IGludG8gLT5wcm9i ZSgpIHdpbGwgbWFrZSB0aGUgY29kZQo+IGVhc2llciB0byBmb2xsb3csIGluIG15IG9waW5pb24u Cm9rCj4gCj4gPiArCj4gPiArc3RydWN0IGkyY19ib2FyZF9pbmZvIGdwdV9pMmNfdWNzaV9ib2Fy ZF9pbmZvID0gewo+ID4gKwlJMkNfQk9BUkRfSU5GTygiaTJjLWdwdS11Y3NpIiwgQ0NHWF9JMkNf REVWX0FERFJFU1MpLCB9Owo+ID4gKwo+ID4gKyNkZWZpbmUgUENJX0NMQVNTX1NFUklBTF9VTktO T1dOCTB4MGM4MAo+ID4gKy8qIHBjaSBkcml2ZXIgKi8KPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IHBjaV9kZXZpY2VfaWQgZ3B1X2kyY19pZHNbXSA9IHsKPiAKPiBUaGUgY29tbWVudCB0aGVyZSBs b29rcyBvdXQgb2YgcGxhY2UuCj4gCj4gPiArCXsgUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9B TllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCj4gPiArCQlQQ0lfQ0xBU1NfU0VSSUFMX1VO S05PV04gPDwgOCwgMHhmZmZmZmYwMH0sCj4gPiArCXsgfSwKPiA+ICt9Owo+ID4gK01PRFVMRV9E RVZJQ0VfVEFCTEUocGNpLCBncHVfaTJjX2lkcyk7Cj4gPiArCj4gPiArc3RhdGljIGludCBncHVf aTJjX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdAo+ID4gK3BjaV9kZXZp Y2VfaWQgKmlkKSB7Cj4gPiArCXN0cnVjdCBncHVfaTJjX2RldiAqZ2RldjsKPiA+ICsJaW50IHN0 YXR1czsKPiA+ICsKPiA+ICsJZGV2X2luZm8oJmRldi0+ZGV2LAo+ID4gKwkJImRldiAlcCBpZCAl MDh4ICUwOHggc3ViICUwOHggJTA4eCBjbGFzcyAlMDh4ICUwOHhcbiIsCj4gPiArCQlkZXYsIGlk LT52ZW5kb3IsIGlkLT5kZXZpY2UsIGlkLT5zdWJ2ZW5kb3IsIGlkLT5zdWJkZXZpY2UsCj4gPiAr CQlpZC0+Y2xhc3MsIGlkLT5jbGFzc19tYXNrKTsKPiAKPiBJZiBhdCBhbGwsIHRoaXMgc2hvdWxk IGJlIGRldl9kYmcoKS4gR2VuZXJhbGx5IEkgZG9uJ3QgdGhpbmsgdGhlcmUncyBhbnkgcmVhc29u IHRvCj4gbWVudGlvbiB0aGlzIGF0IGFsbC4gLT5wcm9iZSgpIHNob3VsZCBhc3N1bWUgdGhhdCBp dCB3aWxsIHN1Y2NlZWQsIHdoaWNoIGlzIHRoZQo+IGV4cGVjdGVkIGNhc2UsIGFuZCB0aGF0IHNo b3VsZCBub3QgcHJvZHVjZSBhbnkgbWVzc2FnZXMuIEluc3RlYWQgaXQncyBiZXR0ZXIKPiB0byBs ZXQgdGhlIHVzZXIga25vdyBpZiBzb21ldGhpbmcgZmFpbGVkIHVzaW5nIGFuIGVycm9yIG1lc3Nh Z2UuCnN1cmUKPiAKPiA+ICsKPiA+ICsJZ2RldiA9IGRldm1fa3phbGxvYygmZGV2LT5kZXYsIHNp emVvZihzdHJ1Y3QgZ3B1X2kyY19kZXYpLAo+IEdGUF9LRVJORUwpOwo+ID4gKwlpZiAoIWdkZXYp Cj4gPiArCQlyZXR1cm4gLUVOT01FTTsKPiA+ICsKPiA+ICsJZ2Rldi0+cGNpX2RldiA9IGRldjsK PiA+ICsJcGNpX3NldF9kcnZkYXRhKGRldiwgZ2Rldik7Cj4gPiArCj4gPiArCXN0YXR1cyA9IHBj aV9lbmFibGVfZGV2aWNlKGRldik7Cj4gPiArCWlmIChzdGF0dXMgPCAwKSB7Cj4gPiArCQlkZXZf ZXJyKCZkZXYtPmRldiwgInBjaV9lbmFibGVfZGV2aWNlIGZhaWxlZCAtICVkXG4iLAo+IHN0YXR1 cyk7Cj4gPiArCQlyZXR1cm4gc3RhdHVzOwo+ID4gKwl9Cj4gPiArCj4gPiArCXBjaV9zZXRfbWFz dGVyKGRldik7Cj4gPiArCj4gPiArCWdkZXYtPnJlZ3MgPSBwY2lfaW9tYXAoZGV2LCAwLCAwKTsK PiA+ICsJaWYgKCFnZGV2LT5yZWdzKSB7Cj4gPiArCQlkZXZfZXJyKCZkZXYtPmRldiwgInBjaV9p b21hcCBmYWlsZWRcbiIpOwo+ID4gKwkJc3RhdHVzID0gLUVOT01FTTsKPiA+ICsJCWdvdG8gaW9t YXBfZXJyOwo+ID4gKwl9Cj4gPiArCj4gPiArCXN0YXR1cyA9IHBjaV9lbmFibGVfbXNpKGRldik7 Cj4gPiArCWlmIChzdGF0dXMgPCAwKSB7Cj4gPiArCQlkZXZfZXJyKCZkZXYtPmRldiwgInBjaV9l bmFibGVfbXNpIGZhaWxlZCAtICVkXG4iLCBzdGF0dXMpOwo+ID4gKwkJZ290byBlbmFibGVfbXNp X2VycjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlzdGF0dXMgPSBncHVfaTJjX2Rldl9pbml0KGdkZXYp Owo+ID4gKwlpZiAoc3RhdHVzIDwgMCkgewo+ID4gKwkJZGV2X2VycigmZGV2LT5kZXYsICJncHVf aTJjX2Rldl9pbml0IGZhaWxlZCAtICVkXG4iLCBzdGF0dXMpOwo+ID4gKwkJZ290byBpMmNfaW5p dF9lcnI7Cj4gPiArCX0KPiA+ICsKPiA+ICsJaTJjX3NldF9hZGFwZGF0YSgmZ2Rldi0+YWRhcHRl ciwgZ2Rldik7Cj4gPiArCWdkZXYtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsKPiA+ICsJ c3RybGNweShnZGV2LT5hZGFwdGVyLm5hbWUsICJOVklESUEgR1BVIEkyQyBhZGFwdGVyIiwKPiA+ ICsJCXNpemVvZihnZGV2LT5hZGFwdGVyLm5hbWUpKTsKPiA+ICsJZ2Rldi0+YWRhcHRlci5hbGdv ID0gJmdwdV9pMmNfYWxnb3JpdGhtOwo+ID4gKwlnZGV2LT5hZGFwdGVyLmRldi5wYXJlbnQgPSAm ZGV2LT5kZXY7Cj4gPiArCXN0YXR1cyA9IGkyY19hZGRfYWRhcHRlcigmZ2Rldi0+YWRhcHRlcik7 Cj4gPiArCWlmIChzdGF0dXMgPCAwKSB7Cj4gPiArCQlkZXZfZXJyKCZkZXYtPmRldiwgImkyY19h ZGRfYWRhcHRlciBmYWlsZWQgLSAlZFxuIiwgc3RhdHVzKTsKPiA+ICsJCWdvdG8gYWRkX2FkYXB0 ZXJfZXJyOwo+ID4gKwl9Cj4gPiArCj4gPiArCWdwdV9pMmNfdWNzaV9ib2FyZF9pbmZvLmlycSA9 IGRldi0+aXJxOwo+ID4gKwlnZGV2LT5jbGllbnQgPSBpMmNfbmV3X2RldmljZSgmZ2Rldi0+YWRh cHRlciwKPiA+ICsJCQkmZ3B1X2kyY191Y3NpX2JvYXJkX2luZm8pOwo+IAo+IEkgdGhpbmsgaXQn cyB0ZWNobmljYWxseSBwb3NzaWJsZSB0aGF0IHRoZSBhYm92ZSB3b3VsZCByYWNlIGJldHdlZW4g bXVsdGlwbGUKPiBpbnN0YW5jZXMgb2YgdGhpcyBJMkMgY29udHJvbGxlci4gVGhlIHNhZmVyIHdh eSB3b3VsZCBiZSB0byBtYWtlCj4gZ3B1X2kyY191Y3NpX2JvYXJkX2luZm8gdmFyaWFibGUgbG9j YWwgdG8gdGhpcyBmdW5jdGlvbi4Kc3VyZQo+IAo+ID4gKwo+ID4gKwlpZiAoIWdkZXYtPmNsaWVu dCkgewo+ID4gKwkJZGV2X2VycigmZGV2LT5kZXYsICJpMmNfbmV3X2RldmljZSBmYWlsZWQgLSAl ZFxuIiwgc3RhdHVzKTsKPiA+ICsJCXN0YXR1cyA9IC1FTk9ERVY7Cj4gPiArCQlnb3RvIGFkZF9h ZGFwdGVyX2VycjsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkZXZfc2V0X2RydmRhdGEoJmRldi0+ZGV2 LCBnZGV2KTsKPiAKPiBJIGRvbid0IHRoaW5rIHlvdSBuZWVkIHRoaXMgaGVyZSBzaW5jZSB5b3Un dmUgYWxyZWFkeSBjYWxsZWQKPiBwY2lfc2V0X2RydmRhdGEoKSBhYm92ZS4Kb2sKPiAKPiA+ICsJ cG1fcnVudGltZV9wdXRfbm9pZGxlKCZkZXYtPmRldik7Cj4gPiArCXBtX3J1bnRpbWVfYWxsb3co JmRldi0+ZGV2KTsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArCj4gPiArYWRkX2FkYXB0ZXJf ZXJyOgo+ID4gKwlpMmNfZGVsX2FkYXB0ZXIoJmdkZXYtPmFkYXB0ZXIpOwo+ID4gK2kyY19pbml0 X2VycjoKPiA+ICsJcGNpX2Rpc2FibGVfbXNpKGRldik7Cj4gPiArZW5hYmxlX21zaV9lcnI6Cj4g PiArCXBjaV9pb3VubWFwKGRldiwgZ2Rldi0+cmVncyk7Cj4gPiAraW9tYXBfZXJyOgo+ID4gKwlw Y2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsKPiA+ICsJcmV0dXJuIHN0YXR1czsKPiA+ICt9Cj4gCj4g SXQncyBnZW5lcmFsbHkgcHJlZmVycmVkIHRvIGhhdmUgbmFtZXMgdGhhdCBkZXNjcmliZSB0aGUg YWN0aW9ucyBvZiB0aGUgbGFiZWwsCj4gaW5zdGVhZCBvZiBkZXNjcmliaW5nIHdoZXJlIHRoZXkg ZmFpbGVkLiBJIHRoaW5rIHRoYXQgbWFrZXMgY29kZSBlYXNpZXIgdG8gcmVhZCwKPiBhbmQgaXQg YWxzbyBoYXMgdGhlIGJlbmVmaXQgb2Ygbm90IGJlaW5nIGNvbmZ1c2luZyB3aGVuIHlvdSBqdW1w IHRvIGEgbGFiZWwsCj4gc2F5IGFkZF9hZGFwdGVyX2VyciwgZnJvbSBhIGxvY2F0aW9uIHRoYXQg ZG9lc24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIHdpdGgKPiBhZGRpbmcgYW4gYWRhcHRlci4KPiAK PiBTb21ldGhpbmcgbGlrZSB0aGlzIHdvdWxkIGJlIGJldHRlciBpbiBteSBvcGluaW9uOgo+IAo+ IAlkZWxfYWRhcHRlcjoKPiAJCS4uLgo+IAlkaXNhYmxlX21zaToKPiAJCS4uLgo+IAl1bm1hcDoK PiAJCS4uLgo+IAlkaXNhYmxlOgo+IAkJLi4uCj4gCm9rCj4gPiArCj4gPiArc3RhdGljIHZvaWQg Z3B1X2kyY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikgewo+ID4gKwlzdHJ1Y3QgZ3B1X2ky Y19kZXYgKmdkZXYgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ICsKPiA+ICsJaTJjX2RlbF9h ZGFwdGVyKCZnZGV2LT5hZGFwdGVyKTsKPiA+ICsJcGNpX2Rpc2FibGVfbXNpKGRldik7Cj4gPiAr CXBjaV9pb3VubWFwKGRldiwgZ2Rldi0+cmVncyk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyBp bnQgZ3B1X2kyY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikgewo+ID4gKwlkZXZfZGJnKGRl diwgIiVzXG4iLCBfX2Z1bmNfXyk7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiAKPiBE byB3ZSBuZWVkIHRoaXMgaWYgaXQgZG9lc24ndCBkbyBhbnl0aGluZz8KV2lsbCByZW1vdmUuCj4g Cj4gPiArCj4gPiArc3RhdGljIGludCBncHVfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYp IHsKPiA+ICsJc3RydWN0IGdwdV9pMmNfZGV2ICpnZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7 Cj4gPiArCj4gPiArCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKPiA+ICsKPiA+ICsJ ZW5hYmxlX2kyY19idXMoZ2Rldik7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gK30KPiA+ICsK PiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsKPiA+ICsJ c3RydWN0IGdwdV9pMmNfZGV2ICpnZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gPiArCj4g PiArCWlmICghbXV0ZXhfdHJ5bG9jaygmZ2Rldi0+bXV0ZXgpKSB7Cj4gPiArCQlkZXZfaW5mbyhk ZXYsICIlczogLUVCVVNZXG4iLCBfX2Z1bmNfXyk7Cj4gPiArCQlyZXR1cm4gLUVCVVNZOwo+ID4g Kwl9Cj4gPiArCW11dGV4X3VubG9jaygmZ2Rldi0+bXV0ZXgpOwo+ID4gKwo+ID4gKwlyZXR1cm4g MDsKPiA+ICt9Cj4gPiArCj4gPiArVU5JVkVSU0FMX0RFVl9QTV9PUFMoZ3B1X2kyY19kcml2ZXJf cG0sIGdwdV9pMmNfc3VzcGVuZCwKPiBncHVfaTJjX3Jlc3VtZSwKPiA+ICsJZ3B1X2kyY19pZGxl KTsKPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZ3B1X2kyY19kcml2ZXIgPSB7 Cj4gPiArCS5uYW1lCQk9ICJncHVfaTJjX2RyaXZlciIsCj4gCj4gVGhpcyBuYW1lIGxvb2tzIHVu dXN1YWwgZm9yIGEgZHJpdmVyLiBQZXJoYXBzICJpMmMtbnZpZGlhLWdwdSIgdG8gbWF0Y2ggdGhl Cj4gbW9kdWxlIG5hbWU/Ck9rCgpUaGFua3MKQWpheQotLS0KbnZwdWJsaWMKLS0KPiAKPiA+ICsJ LmlkX3RhYmxlCT0gZ3B1X2kyY19pZHMsCj4gPiArCS5wcm9iZQkJPSBncHVfaTJjX3Byb2JlLAo+ ID4gKwkucmVtb3ZlCQk9IGdwdV9pMmNfcmVtb3ZlLAo+ID4gKwkuZHJpdmVyCQk9IHsKPiA+ICsJ CS5wbQk9ICZncHVfaTJjX2RyaXZlcl9wbSwKPiA+ICsJfSwKPiA+ICt9Owo+ID4gKwo+ID4gK21v ZHVsZV9wY2lfZHJpdmVyKGdwdV9pMmNfZHJpdmVyKTsKPiA+ICsKPiA+ICtNT0RVTEVfQVVUSE9S KCJBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29tPiIpOwo+ID4gK01PRFVMRV9ERVNDUklQVElP TigiTnZpZGlhIEdQVSBJMkMgY29udHJvbGxlciBEcml2ZXIiKTsKPiA+ICtNT0RVTEVfTElDRU5T RSgiR1BMIHYyIik7Cg==