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: [v12,1/2] i2c: buses: add i2c bus driver for NVIDIA GPU From: Ajay Gupta Message-Id: <5643b42f25044ad7a2944f1ad8bc6680@bgmail101.nvidia.com> Date: Wed, 12 Sep 2018 18:02:26 +0000 To: Peter Rosin , "wsa@the-dreams.de" , "heikki.krogerus@linux.intel.com" Cc: "linux-usb@vger.kernel.org" , "linux-i2c@vger.kernel.org" List-ID: SGkgUGV0ZXIsDQoNCj4gPiBUaGlzIGRyaXZlciBhZGRzIEkyQyBidXMgZHJpdmVyIHRvIGNvbW11 bmljYXRlIHdpdGggVHlwZS1DIGNvbnRyb2xsZXIuDQo+ID4gSTJDIGNsaWVudCBkcml2ZXIgd2ls bCBiZSBwYXJ0IG9mIFVTQiBUeXBlLUMgVUNTSSBkcml2ZXIuDQo+ID4NCj4gPiBTaWduZWQtb2Zm LWJ5OiBBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29tPg0KPiA+IFJldmlld2VkLWJ5OiBBbmR5 IFNoZXZjaGVua28gPGFuZHkuc2hldmNoZW5rb0BnbWFpbC5jb20+DQo+ID4gUmV2aWV3ZWQtYnk6 IEhlaWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxpbnV4LmludGVsLmNvbT4NCj4gPiAt LS0NCj4gPiBDaGFuZ2VzIGZyb20gdjEgLT4gdjINCj4gPiAJTm9uZQ0KPiA+IENoYW5nZXMgZnJv bSB2MiAtPiB2Mw0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBBbmR5IGFuZCBUaGll cnJ5DQo+ID4gCVJlbmFtZSBpMmMtZ3B1LmMgLT4gaTJjLW52aWRpYS1ncHUuYw0KPiA+IENoYW5n ZXMgZnJvbSB2MyAtPiB2NA0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBBbmR5DQo+ ID4gQ2hhbmdlcyBmcm9tIHY0IC0+IHY1DQo+ID4gCUZpeGVkIHJldmlldyBjb21tZW50cyBmcm9t IEFuZHkNCj4gPiBDaGFuZ2VzIGZyb20gdjUgLT4gdjYNCj4gPiAJTm9uZQ0KPiA+IENoYW5nZXMg ZnJvbSB2NiAtPiB2NyAtPiB2OA0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBQZXRl cg0KPiA+IAktIEFkZCBpbXBsaWNpdCBTVE9QIGZvciBsYXN0IHdyaXRlIG1lc3NhZ2UNCj4gPiAJ LSBBZGQgaTJjX2FkYXB0ZXJfcXVpcmtzIHdpdGggbWF4X3JlYWRfbGVuIGFuZA0KPiA+IAkgIEky Q19BUV9DT01CIGZsYWdzDQo+ID4gQ2hhbmdlcyBmcm9tIHY4IC0+IHY5DQo+ID4gCUZpeGVkIHJl dmlldyBjb21tZW50cyBmcm9tIFBldGVyDQo+ID4gCS0gRHJvcCBkb19zdGFydCBmbGFnDQo+ID4g CS0gVXNlIGkyY184Yml0X2FkZHJfZnJvbV9tc2coKQ0KPiA+IENoYW5nZXMgZnJvbSB2OSAtPiB2 MTANCj4gPiAJRml4ZWQgcmV2aWV3IGNvbW1lbnRzIGZyb20gUGV0ZXINCj4gPiAJLSBEcm9wcGVk IEkyQ19GVU5DX1NNQlVTX0VNVUwNCj4gPiAJLSBEcm9wcGVkIGxvY2FsIG11dGV4DQo+ID4gQ2hh bmdlcyBmcm9tIHYxMCAtPiB2MTENCj4gPiAJRml4ZWQgcmV2aWV3IGNvbW1lbnRzIGZyb20gUGV0 ZXINCj4gPiAJLSBNb3ZlZCBzdG9wIGluIG1hc3Rlcl94ZmVyIGF0IGVuZCBvZiBtZXNzYWdlDQo+ ID4gCS0gQ2hhbmdlIGkyY19yZWFkIHdpdGhvdXQgU1RPUA0KPiA+IAktIERyb3BwZWQgSTJDX0FD X0NPTUIqIGZsYWdzDQo+ID4gQ2hhbmdlcyBmcm9tIHYxMSAtPiB2MTINCj4gPiAJRml4ZWQgcmV2 aWV3IGNvbW1lbnRzIGZyb20gUGV0ZXINCj4gPiAJLSBSZW1vdmVkIGNsZWFyaW5nIG9mIGVtcHR5 IGJpdHMNCj4gPiAJLSBGaXggbWFzdGVyX3hmZXIgZm9yIGNvcnJlY3Qgc3RvcCB1c2UNCj4gPg0K PiA+ICBEb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW52aWRpYS1ncHUgfCAgMTggKysNCj4g PiAgTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3ICsNCj4gPiAg ZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgICAgICAgICAgICAgIHwgICA5ICsNCj4gPiAgZHJp dmVycy9pMmMvYnVzc2VzL01ha2VmaWxlICAgICAgICAgICAgIHwgICAxICsNCj4gPiAgZHJpdmVy cy9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1LmMgICAgIHwgMzY4DQo+ICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrDQo+ID4gIDUgZmlsZXMgY2hhbmdlZCwgNDAzIGluc2VydGlvbnMo KykNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMt bnZpZGlhLWdwdQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9pMmMvYnVzc2VzL2ky Yy1udmlkaWEtZ3B1LmMNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2kyYy9i dXNzZXMvaTJjLW52aWRpYS1ncHUNCj4gPiBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMt bnZpZGlhLWdwdQ0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4u MzE4ODRkMg0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL2kyYy9i dXNzZXMvaTJjLW52aWRpYS1ncHUNCj4gPiBAQCAtMCwwICsxLDE4IEBADQo+ID4gK0tlcm5lbCBk cml2ZXIgaTJjLW52aWRpYS1ncHUNCj4gPiArDQo+ID4gK0RhdGFzaGVldDogbm90IHB1YmxpY2x5 IGF2YWlsYWJsZS4NCj4gPiArDQo+ID4gK0F1dGhvcnM6DQo+ID4gKwlBamF5IEd1cHRhIDxhamF5 Z0BudmlkaWEuY29tPg0KPiA+ICsNCj4gPiArRGVzY3JpcHRpb24NCj4gPiArLS0tLS0tLS0tLS0N Cj4gPiArDQo+ID4gK2kyYy1udmlkaWEtZ3B1IGlzIGEgZHJpdmVyIGZvciBJMkMgY29udHJvbGxl ciBpbmNsdWRlZCBpbiBOVklESUENCj4gPiArVHVyaW5nIGFuZCBsYXRlciBHUFVzIGFuZCBpdCBp cyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggVHlwZS1DIGNvbnRyb2xsZXINCj4gb24gR1BVcy4N Cj4gPiArDQo+ID4gK0lmIHlvdXIgJ2xzcGNpIC12JyBsaXN0aW5nIHNob3dzIHNvbWV0aGluZyBs aWtlIHRoZSBmb2xsb3dpbmcsDQo+ID4gKw0KPiA+ICswMTowMC4zIFNlcmlhbCBidXMgY29udHJv bGxlciBbMGM4MF06IE5WSURJQSBDb3Jwb3JhdGlvbiBEZXZpY2UgMWFkOQ0KPiA+ICsocmV2IGEx KQ0KPiA+ICsNCj4gPiArdGhlbiB0aGlzIGRyaXZlciBzaG91bGQgc3VwcG9ydCB0aGUgSTJDIGNv bnRyb2xsZXIgb2YgeW91ciBHUFUuDQo+ID4gZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJ TlRBSU5FUlMgaW5kZXggZDg3MGNiNS4uYjcxYjBiNCAxMDA2NDQNCj4gPiAtLS0gYS9NQUlOVEFJ TkVSUw0KPiA+ICsrKyBiL01BSU5UQUlORVJTDQo+ID4gQEAgLTY3OTgsNiArNjc5OCwxMyBAQCBM OglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZw0KPiA+ICBTOglNYWludGFpbmVkDQo+ID4gIEY6 CWRyaXZlcnMvaTJjL2kyYy1jb3JlLWFjcGkuYw0KPiA+DQo+ID4gK0kyQyBDT05UUk9MTEVSIERS SVZFUiBGT1IgTlZJRElBIEdQVQ0KPiA+ICtNOglBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29t Pg0KPiA+ICtMOglsaW51eC1pMmNAdmdlci5rZXJuZWwub3JnDQo+ID4gK1M6CU1haW50YWluZWQN Cj4gPiArRjoJRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1DQo+ID4gK0Y6 CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbnZpZGlhLWdwdS5jDQo+ID4gKw0KPiA+ICBJMkMgTVVY RVMNCj4gPiAgTToJUGV0ZXIgUm9zaW4gPHBlZGFAYXhlbnRpYS5zZT4NCj4gPiAgTDoJbGludXgt aTJjQHZnZXIua2VybmVsLm9yZw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMv S2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnDQo+ID4gaW5kZXggNDUxZDRhZS4u ZWVkODI3YiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZw0KPiA+ ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnDQo+ID4gQEAgLTIyNCw2ICsyMjQsMTUg QEAgY29uZmlnIEkyQ19ORk9SQ0UyX1M0OTg1DQo+ID4gIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNv IGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUNCj4gPiAgCSAgd2lsbCBi ZSBjYWxsZWQgaTJjLW5mb3JjZTItczQ5ODUuDQo+ID4NCj4gPiArY29uZmlnIEkyQ19OVklESUFf R1BVDQo+ID4gKwl0cmlzdGF0ZSAiTlZJRElBIEdQVSBJMkMgY29udHJvbGxlciINCj4gPiArCWRl cGVuZHMgb24gUENJDQo+ID4gKwloZWxwDQo+ID4gKwkgIElmIHlvdSBzYXkgeWVzIHRvIHRoaXMg b3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQ0KPiA+ICsJICBOVklESUEg R1BVIEkyQyBjb250cm9sbGVyIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUN Cj4gR1BVJ3MNCj4gPiArCSAgVHlwZS1DIGNvbnRyb2xsZXIuIFRoaXMgZHJpdmVyIGNhbiBhbHNv IGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGNhbGxlZA0KPiA+ICsJICBpMmMtbnZpZGlhLWdwdS4NCj4g PiArDQo+ID4gIGNvbmZpZyBJMkNfU0lTNTU5NQ0KPiA+ICAJdHJpc3RhdGUgIlNpUyA1NTk1Ig0K PiA+ICAJZGVwZW5kcyBvbiBQQ0kNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2Vz L01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlDQo+ID4gaW5kZXggMThiMjZh Zi4uZDQ5OTgxMyAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUN Cj4gPiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUNCj4gPiBAQCAtMTQwLDUgKzE0 MCw2IEBAIG9iai0kKENPTkZJR19JMkNfU0lCWVRFKQkrPSBpMmMtc2lieXRlLm8NCj4gPiAgb2Jq LSQoQ09ORklHX0kyQ19YR0VORV9TTElNUFJPKSArPSBpMmMteGdlbmUtc2xpbXByby5vDQo+ID4g IG9iai0kKENPTkZJR19TQ3gyMDBfQUNCKQkrPSBzY3gyMDBfYWNiLm8NCj4gPiAgb2JqLSQoQ09O RklHX0kyQ19GU0kpCQkrPSBpMmMtZnNpLm8NCj4gPiArb2JqLSQoQ09ORklHX0kyQ19OVklESUFf R1BVKQkrPSBpMmMtbnZpZGlhLWdwdS5vDQo+ID4NCj4gPiAgY2NmbGFncy0kKENPTkZJR19JMkNf REVCVUdfQlVTKSA6PSAtRERFQlVHIGRpZmYgLS1naXQNCj4gPiBhL2RyaXZlcnMvaTJjL2J1c3Nl cy9pMmMtbnZpZGlhLWdwdS5jDQo+ID4gYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW52aWRpYS1n cHUuYw0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uMGMxNmIw YQ0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW52 aWRpYS1ncHUuYw0KPiA+IEBAIC0wLDAgKzEsMzY4IEBADQo+ID4gKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wDQo+ID4gKy8qDQo+ID4gKyAqIE52aWRpYSBHUFUgSTJDIGNvbnRy b2xsZXIgRHJpdmVyDQo+ID4gKyAqDQo+ID4gKyAqIENvcHlyaWdodCAoQykgMjAxOCBOVklESUEg Q29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQo+ID4gKyAqIEF1dGhvcjogQWpheSBH dXB0YSA8YWpheWdAbnZpZGlhLmNvbT4gICovICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPg0KPiA+ ICsjaW5jbHVkZSA8bGludXgvaTJjLmg+ICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4gI2lu Y2x1ZGUNCj4gPiArPGxpbnV4L21vZHVsZS5oPiAjaW5jbHVkZSA8bGludXgvcGNpLmg+ICNpbmNs dWRlDQo+ID4gKzxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4gI2luY2x1ZGUgPGxpbnV4L3BtLmg+ ICNpbmNsdWRlDQo+ID4gKzxsaW51eC9wbV9ydW50aW1lLmg+DQo+ID4gKw0KPiA+ICsjaW5jbHVk ZSA8YXNtL3VuYWxpZ25lZC5oPg0KPiA+ICsNCj4gPiArLyogSTJDIGRlZmluaXRpb25zICovDQo+ ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMCQkJCTB4MDANCj4gPiArI2RlZmluZSBJMkNfTVNUX0NO VExfR0VOX1NUQVJUCQkJQklUKDApDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX0dFTl9TVE9Q CQkJQklUKDEpDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX0NNRF9SRUFECQkJKDEgPDwgMikN Cj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfQ01EX1dSSVRFCQkJKDIgPDwgMikNCj4gPiArI2Rl ZmluZSBJMkNfTVNUX0NOVExfQlVSU1RfU0laRV9TSElGVAkJNg0KPiA+ICsjZGVmaW5lIEkyQ19N U1RfQ05UTF9HRU5fTkFDSwkJCUJJVCgyOCkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RB VFVTCQkJR0VOTUFTSygzMCwgMjkpDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX1NUQVRVU19P S0FZCQkoMCA8PCAyOSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX05PX0FDSwkJ KDEgPDwgMjkpDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX1NUQVRVU19USU1FT1VUCQkoMiA8 PCAyOSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX0JVU19CVVNZCQkoMyA8PCAy OSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfQ1lDTEVfVFJJR0dFUgkJQklUKDMxKQ0KPiA+ ICsNCj4gPiArI2RlZmluZSBJMkNfTVNUX0FERFIJCQkJMHgwNA0KPiA+ICsNCj4gPiArI2RlZmlu ZSBJMkNfTVNUX0kyQzBfVElNSU5HCQkJCTB4MDgNCj4gPiArI2RlZmluZSBJMkNfTVNUX0kyQzBf VElNSU5HX1NDTF9QRVJJT0RfMTAwS0haCQkweDEwZQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfSTJD MF9USU1JTkdfVElNRU9VVF9DTEtfQ05UCQkxNg0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfSTJDMF9U SU1JTkdfVElNRU9VVF9DTEtfQ05UX01BWAkJMjU1DQo+ID4gKyNkZWZpbmUgSTJDX01TVF9JMkMw X1RJTUlOR19USU1FT1VUX0NIRUNLCQlCSVQoMjQpDQo+ID4gKw0KPiA+ICsjZGVmaW5lIEkyQ19N U1RfREFUQQkJCQkJMHgwYw0KPiA+ICsNCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJRF9QQURD VEwJCQkJMHgyMA0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfSFlCUklEX1BBRENUTF9NT0RFX0kyQwkJ CUJJVCgwKQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfSFlCUklEX1BBRENUTF9JMkNfU0NMX0lOUFVU X1JDVg0KPiAJQklUKDE0KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfSFlCUklEX1BBRENUTF9JMkNf U0RBX0lOUFVUX1JDVg0KPiAJQklUKDE1KQ0KPiA+ICsNCj4gPiArc3RydWN0IGdwdV9pMmNfZGV2 IHsNCj4gPiArCXN0cnVjdCBkZXZpY2UgKmRldjsNCj4gPiArCXZvaWQgX19pb21lbSAqcmVnczsN Cj4gPiArCXN0cnVjdCBpMmNfYWRhcHRlciBhZGFwdGVyOw0KPiA+ICsJc3RydWN0IGkyY19ib2Fy ZF9pbmZvICpncHVfY2NneF91Y3NpOyB9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgZ3B1X2Vu YWJsZV9pMmNfYnVzKHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCkgew0KPiA+ICsJdTMyIHZhbDsN Cj4gPiArDQo+ID4gKwkvKiBlbmFibGUgSTJDICovDQo+ID4gKwl2YWwgPSByZWFkbChpMmNkLT5y ZWdzICsgSTJDX01TVF9IWUJSSURfUEFEQ1RMKTsNCj4gPiArCXZhbCB8PSBJMkNfTVNUX0hZQlJJ RF9QQURDVExfTU9ERV9JMkMgfA0KPiA+ICsJCUkyQ19NU1RfSFlCUklEX1BBRENUTF9JMkNfU0NM X0lOUFVUX1JDViB8DQo+ID4gKwkJSTJDX01TVF9IWUJSSURfUEFEQ1RMX0kyQ19TREFfSU5QVVRf UkNWOw0KPiA+ICsJd3JpdGVsKHZhbCwgaTJjZC0+cmVncyArIEkyQ19NU1RfSFlCUklEX1BBRENU TCk7DQo+ID4gKw0KPiA+ICsJLyogZW5hYmxlIDEwMEtIWiBtb2RlICovDQo+ID4gKwl2YWwgPSBJ MkNfTVNUX0kyQzBfVElNSU5HX1NDTF9QRVJJT0RfMTAwS0haOw0KPiA+ICsJdmFsIHw9IChJMkNf TVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0xLX0NOVF9NQVgNCj4gPiArCSAgICA8PCBJMkNfTVNU X0kyQzBfVElNSU5HX1RJTUVPVVRfQ0xLX0NOVCk7DQo+ID4gKwl2YWwgfD0gSTJDX01TVF9JMkMw X1RJTUlOR19USU1FT1VUX0NIRUNLOw0KPiA+ICsJd3JpdGVsKHZhbCwgaTJjZC0+cmVncyArIEky Q19NU1RfSTJDMF9USU1JTkcpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfY2hl Y2tfc3RhdHVzKHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCkgew0KPiA+ICsJdW5zaWduZWQgbG9u ZyB0YXJnZXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsNCj4gPiArCXUzMiB2 YWw7DQo+ID4gKw0KPiA+ICsJZG8gew0KPiA+ICsJCXZhbCA9IHJlYWRsKGkyY2QtPnJlZ3MgKyBJ MkNfTVNUX0NOVEwpOw0KPiA+ICsJCWlmICghKHZhbCAmIEkyQ19NU1RfQ05UTF9DWUNMRV9UUklH R0VSKSkNCj4gDQo+IEl0IG9jY3VycmVkIHRvIG1lIHRoYXQgZ2VuZXJhdGluZyBOQUNLIG9ubHkg bWFrZXMgc2Vuc2UgZm9yIHJlYWRzLCBhbmQgdGhhdA0KPiB5b3Ugb25seSB3YW50IHRvIGhhdmUg YSBOQUNLIGFmdGVyIHRoZSBmaW5hbCBieXRlIGluIGEgcmVhZCBtZXNzYWdlcy4gU28sDQo+IGhl cmUncyBhIG5ldyBhdHRlbXB0Lg0KPiANCj4gV2hhdCBpZiB5b3UgcmVwbGFjZSB0aGUgYWJvdmUg dGVzdCB3aXRoDQo+IA0KPiAJCWlmICghKHZhbCAmIEkyQ19NU1RfQ05UTF9SRUFEKSkNCj4gDQo+ IChzaW5jZSBhbGwgY3ljbGUtdHJpZ2dlcnMgYXJlIGFsc28gcmVhZHMsIGF0IGxlYXN0IGN1cnJl bnRseSwgYW5kIHdlIGFsc28gd2FudCB0bw0KPiB3YWl0IGZvciB0aGUgdGFpbCByZWFkcyB0byBj b21wbGV0ZSBiZWZvcmUgd2UgdHJ5IHRvIGdldCB0aGUgcmVjZWl2ZWQgZGF0YSBmcm9tDQo+IHRo ZSByZWdpc3RlcikNCj4gDQo+IGFuZCB0aGVuLi4uDQo+IA0KPiA+ICsJCQlicmVhazsNCj4gPiAr CQlpZiAoKHZhbCAmIEkyQ19NU1RfQ05UTF9TVEFUVVMpICE9DQo+ID4gKwkJCQlJMkNfTVNUX0NO VExfU1RBVFVTX0JVU19CVVNZKQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl1c2xlZXBfcmFuZ2Uo MTAwMCwgMjAwMCk7DQo+ID4gKwl9IHdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXModGFyZ2V0 KSk7DQo+ID4gKw0KPiA+ICsJaWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXModGFyZ2V0KSkgew0K PiA+ICsJCWRldl9lcnIoaTJjZC0+ZGV2LCAiaTJjIHRpbWVvdXQgZXJyb3IgJXhcbiIsIHZhbCk7 DQo+ID4gKwkJcmV0dXJuIC1FVElNRTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwl2YWwgPSByZWFk bChpMmNkLT5yZWdzICsgSTJDX01TVF9DTlRMKTsNCj4gPiArCXN3aXRjaCAodmFsICYgSTJDX01T VF9DTlRMX1NUQVRVUykgew0KPiA+ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX09LQVk6DQo+ ID4gKwkJcmV0dXJuIDA7DQo+ID4gKwljYXNlIEkyQ19NU1RfQ05UTF9TVEFUVVNfTk9fQUNLOg0K PiA+ICsJCXJldHVybiAtRUlPOw0KPiA+ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX1RJTUVP VVQ6DQo+ID4gKwkJcmV0dXJuIC1FVElNRTsNCj4gPiArCWNhc2UgSTJDX01TVF9DTlRMX1NUQVRV U19CVVNfQlVTWToNCj4gPiArCQlyZXR1cm4gLUVCVVNZOw0KPiA+ICsJZGVmYXVsdDoNCj4gPiAr CQlyZXR1cm4gMDsNCj4gPiArCX0NCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVf aTJjX3JlYWQoc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkLCB1OCAqZGF0YSwgdTE2IGxlbikNCj4g PiArew0KPiA+ICsJaW50IHN0YXR1czsNCj4gPiArCXUzMiB2YWw7DQo+ID4gKw0KPiA+ICsJdmFs ID0gSTJDX01TVF9DTlRMX0dFTl9TVEFSVCB8IEkyQ19NU1RfQ05UTF9DTURfUkVBRCB8DQo+ID4g KwkJKGxlbiA8PCBJMkNfTVNUX0NOVExfQlVSU1RfU0laRV9TSElGVCkgfA0KPiA+ICsJCUkyQ19N U1RfQ05UTF9DWUNMRV9UUklHR0VSIHwNCj4gSTJDX01TVF9DTlRMX0dFTl9OQUNLOw0KPiA+ICsJ d3JpdGVsKHZhbCwgaTJjZC0+cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKw0KPiA+ICsJc3Rh dHVzID0gZ3B1X2kyY19jaGVja19zdGF0dXMoaTJjZCk7DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkN Cj4gPiArCQlyZXR1cm4gc3RhdHVzOw0KPiA+ICsNCj4gPiArCXZhbCA9IHJlYWRsKGkyY2QtPnJl Z3MgKyBJMkNfTVNUX0RBVEEpOw0KPiA+ICsJc3dpdGNoIChsZW4pIHsNCj4gPiArCWNhc2UgMToN Cj4gPiArCQlkYXRhWzBdID0gdmFsOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJY2FzZSAyOg0KPiA+ ICsJCXB1dF91bmFsaWduZWRfYmUxNih2YWwsIGRhdGEpOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJ Y2FzZSAzOg0KPiA+ICsJCXB1dF91bmFsaWduZWRfYmUxNih2YWwgPj4gOCwgZGF0YSk7DQo+ID4g KwkJZGF0YVsyXSA9IHZhbDsNCj4gPiArCQlicmVhazsNCj4gPiArCWNhc2UgNDoNCj4gPiArCQlw dXRfdW5hbGlnbmVkX2JlMzIodmFsLCBkYXRhKTsNCj4gPiArCQlicmVhazsNCj4gPiArCWRlZmF1 bHQ6DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwl9DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9 DQo+IA0KPiAuLi5yZXBsYWNlIHlvdXIgZ3B1X2kyY19yZWFkIHdpdGggdGhpczoNCj4gDQo+ICNk ZWZpbmUgR1BVX01BWF9CVVJTVCAxDQo+IHN0YXRpYyBpbnQgZ3B1X2kyY19yZWFkKHN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCwgdTggKmRhdGEsIHUxNiBsZW4pIHsNCj4gCXUxNiBidXJzdCA9IG1p bihsZW4sIEdQVV9NQVhfQlVSU1QpOw0KPiAJaW50IHN0YXR1czsNCj4gCXUzMiB2YWw7DQo+IA0K PiAJdmFsID0gSTJDX01TVF9DTlRMX0dFTl9TVEFSVCB8IEkyQ19NU1RfQ05UTF9DTURfUkVBRCB8 DQo+IAkJKGJ1cnN0IDw8IEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NISUZUKSB8DQo+IAkJSTJD X01TVF9DTlRMX0NZQ0xFX1RSSUdHRVI7DQo+IA0KPiAJZm9yICg7Oykgew0KPiAJCWlmIChsZW4g PD0gR1BVX01BWF9CVVJTVCkNCj4gCQkJdmFsIHw9IEkyQ19NU1RfQ05UTF9HRU5fTkFDSzsNCj4g CQl3cml0ZWwodmFsLCBpMmNkLT5yZWdzICsgSTJDX01TVF9DTlRMKTsNCj4gDQo+IAkJc3RhdHVz ID0gZ3B1X2kyY19jaGVja19zdGF0dXMoaTJjZCk7DQo+IAkJaWYgKHN0YXR1cyA8IDApDQo+IAkJ CXJldHVybiBzdGF0dXM7DQo+IA0KPiAJCXZhbCA9IHJlYWRsKGkyY2QtPnJlZ3MgKyBJMkNfTVNU X0RBVEEpOw0KPiAJCXN3aXRjaCAoYnVyc3QpIHsNCj4gCQljYXNlIDE6DQo+IAkJCWRhdGFbMF0g PSB2YWw7DQo+IAkJCWJyZWFrOw0KPiAJCWNhc2UgMjoNCj4gCQkJcHV0X3VuYWxpZ25lZF9iZTE2 KHZhbCwgZGF0YSk7DQo+IAkJCWJyZWFrOw0KPiAJCWNhc2UgMzoNCj4gCQkJcHV0X3VuYWxpZ25l ZF9iZTE2KHZhbCA+PiA4LCBkYXRhKTsNCj4gCQkJZGF0YVsyXSA9IHZhbDsNCj4gCQkJYnJlYWs7 DQo+IAkJY2FzZSA0Og0KPiAJCQlwdXRfdW5hbGlnbmVkX2JlMzIodmFsLCBkYXRhKTsNCj4gCQkJ YnJlYWs7DQo+IAkJZGVmYXVsdDoNCj4gCQkJYnJlYWs7DQo+IAkJfQ0KPiANCj4gCQlpZiAobGVu IDw9IEdQVV9NQVhfQlVSU1QpDQo+IAkJCWJyZWFrOw0KPiANCj4gCQlkYXRhICs9IEdQVV9NQVhf QlVSU1Q7DQo+IAkJbGVuIC09IEdQVV9NQVhfQlVSU1Q7DQo+IA0KPiAJCWJ1cnN0ID0gbWluKGxl biwgR1BVX01BWF9CVVJTVCk7DQo+IAkJdmFsID0gSTJDX01TVF9DTlRMX0NNRF9SRUFEIHwNCj4g CQkJKGJ1cnN0IDw8IEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NISUZUKTsNCj4gCX0NCj4gDQo+ IAlyZXR1cm4gc3RhdHVzOw0KPiB9DQo+IA0KPiBJZiB0aGF0IHdvcmtzLA0KPiB0aGVuIGNoYW5n ZSBHUFVfTUFYX0JVUlNUIHRvIDQsIGRyb3AgdGhlIHF1aXJrIGFuZCB0aGUNCj4gc3BsaXR0aW5n IG9mIHRoZSByZWFkcyBpbiBwYXRjaCAyLzIgYW5kIGNoZWNrIHRoYXQgdG9vLi4uDQo+IA0KPiAq ZmluZ2VycyBjcm9zc2VkKg0KVW5mb3J0dW5hdGVseSwgdGhhdCBhbHNvIGRpZG4ndCB3b3JrLiBJ IHRyaWVkIHNvbWUgdHdlYWtzIHdpdGggX1RSSUdHRVINCmFuZCBfU1RBUlQgYnV0IHRoYXQgYWxz byBkaWRuJ3QgaGVscC4NCiANCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19zdGFydChz dHJ1Y3QgZ3B1X2kyY19kZXYgKmkyY2QpIHsNCj4gPiArCXdyaXRlbChJMkNfTVNUX0NOVExfR0VO X1NUQVJULCBpMmNkLT5yZWdzICsgSTJDX01TVF9DTlRMKTsNCj4gPiArCXJldHVybiBncHVfaTJj X2NoZWNrX3N0YXR1cyhpMmNkKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVf aTJjX3N0b3Aoc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkKSB7DQo+ID4gKwl3cml0ZWwoSTJDX01T VF9DTlRMX0dFTl9TVE9QLCBpMmNkLT5yZWdzICsgSTJDX01TVF9DTlRMKTsNCj4gPiArCXJldHVy biBncHVfaTJjX2NoZWNrX3N0YXR1cyhpMmNkKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGlj IGludCBncHVfaTJjX3dyaXRlKHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCwgdTggZGF0YSkgew0K PiA+ICsJdTMyIHZhbDsNCj4gPiArDQo+ID4gKwl3cml0ZWwoZGF0YSwgaTJjZC0+cmVncyArIEky Q19NU1RfREFUQSk7DQo+ID4gKw0KPiA+ICsJdmFsID0gSTJDX01TVF9DTlRMX0NNRF9XUklURSB8 ICgxIDw8DQo+IEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NISUZUKSB8DQo+ID4gKwkJSTJDX01T VF9DTlRMX0dFTl9OQUNLOw0KPiANCj4gR2VuZXJhdGluZyBOQUNLIGZvciBhIHdyaXRlIGRvZXMg bm90IG1ha2Ugc2Vuc2UsIHdoaWNoIGlzIHdoYXQgSSB0aGluayB0aGUNCj4gbGFzdCBmbGFnIG1l YW5zPyBJdCdzIHRoZSBjbGllbnQgZGV2aWNlIHRoYXQgaGFzIHRoZSBwb3dlciB0byBBQ0svTkFD SyB3cml0ZXMuDQpPaywgd2lsbCBjaGVjay4NCiANCj4gPiArCXdyaXRlbCh2YWwsIGkyY2QtPnJl Z3MgKyBJMkNfTVNUX0NOVEwpOw0KPiA+ICsNCj4gPiArCXJldHVybiBncHVfaTJjX2NoZWNrX3N0 YXR1cyhpMmNkKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX21hc3Rl cl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwNCj4gPiArCQkJICAgICAgIHN0cnVjdCBp MmNfbXNnICptc2dzLCBpbnQgbnVtKSB7DQo+ID4gKwlzdHJ1Y3QgZ3B1X2kyY19kZXYgKmkyY2Qg PSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOw0KPiA+ICsJaW50IHN0YXR1cywgc3RhdHVzMjsNCj4g PiArCWludCBpLCBqOw0KPiA+ICsNCj4gPiArCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgew0K PiA+ICsJCWlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01fUkQpIHsNCj4gPiArCQkJLyogcHJvZ3Jh bSBjbGllbnQgYWRkcmVzcyBiZWZvcmUgc3RhcnRpbmcgcmVhZCAqLw0KPiA+ICsJCQl3cml0ZWwo bXNnc1tpXS5hZGRyLCBpMmNkLT5yZWdzICsgSTJDX01TVF9BRERSKTsNCj4gPiArCQkJLyogZ3B1 X2kyY19yZWFkIGhhcyBpbXBsaWNpdCBzdGFydCAqLw0KPiA+ICsJCQlzdGF0dXMgPSBncHVfaTJj X3JlYWQoaTJjZCwgbXNnc1tpXS5idWYsIG1zZ3NbaV0ubGVuKTsNCj4gPiArCQkJaWYgKHN0YXR1 cyA8IDApIHsNCj4gPiArCQkJCWlmIChpID09IDApDQo+ID4gKwkJCQkJcmV0dXJuIHN0YXR1czsN Cj4gDQo+IEkgbWlzc2VkIHRoaXMgaW4gbXkgZmlyc3QgcmVwbHkgdG8gdGhpcyBtZXNzYWdlLiBZ b3Ugd2FudCBhbiB1bmNvbmRpdGlvbmFsDQo+ICJnb3RvIHN0b3AiIGhlcmUsIHNvIHBsZWFzZSBk cm9wIHRoZSAiaWYgKGkgPT0gMCkgcmV0dXJuIHN0YXR1czsiIHRoaW5nLg0KPiBNeSByZWFzb25p bmcgaXMgdGhhdCBhIHNwdXJpb3VzIHN0b3AgaXMgLSB3aGlsZSB1bmRlc2lyYWJsZSAtIG11Y2gg YmV0dGVyIHRoYW4NCj4gYSBtaXNzaW5nIHN0b3AuDQpPay4NCiANCj4gPiArCQkJCWdvdG8gc3Rv cDsNCj4gPiArCQkJfQ0KPiA+ICsJCX0gZWxzZSB7DQo+ID4gKwkJCXU4IGFkZHIgPSBpMmNfOGJp dF9hZGRyX2Zyb21fbXNnKG1zZ3MgKyBpKTsNCj4gPiArDQo+ID4gKwkJCXN0YXR1cyA9IGdwdV9p MmNfc3RhcnQoaTJjZCk7DQo+ID4gKwkJCWlmIChzdGF0dXMgPCAwKSB7DQo+ID4gKwkJCQlpZiAo aSA9PSAwKQ0KPiA+ICsJCQkJCXJldHVybiBzdGF0dXM7DQo+ID4gKwkJCQlnb3RvIHN0b3A7DQo+ ID4gKwkJCX0NCj4gPiArDQo+ID4gKwkJCXN0YXR1cyA9IGdwdV9pMmNfd3JpdGUoaTJjZCwgYWRk cik7DQo+ID4gKwkJCWlmIChzdGF0dXMgPCAwKQ0KPiA+ICsJCQkJZ290byBzdG9wOw0KPiA+ICsN Cj4gPiArCQkJZm9yIChqID0gMDsgaiA8IG1zZ3NbaV0ubGVuOyBqKyspIHsNCj4gPiArCQkJCXN0 YXR1cyA9IGdwdV9pMmNfd3JpdGUoaTJjZCwgbXNnc1tpXS5idWZbal0pOw0KPiA+ICsJCQkJaWYg KHN0YXR1cyA8IDApDQo+ID4gKwkJCQkJZ290byBzdG9wOw0KPiA+ICsJCQl9DQo+ID4gKwkJfQ0K PiA+ICsJfQ0KPiA+ICsJc3RhdHVzID0gZ3B1X2kyY19zdG9wKGkyY2QpOw0KPiA+ICsJaWYgKHN0 YXR1cyA8IDApDQo+ID4gKwkJcmV0dXJuIHN0YXR1czsNCj4gPiArCXJldHVybiBpOw0KPiA+ICtz dG9wOg0KPiA+ICsJc3RhdHVzMiA9IGdwdV9pMmNfc3RvcChpMmNkKTsNCj4gPiArCWlmIChzdGF0 dXMyIDwgMCkNCj4gPiArCQlkZXZfZXJyKGkyY2QtPmRldiwgImkyYyBzdG9wIGZhaWxlZCAlZFxu Iiwgc3RhdHVzMik7DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgY29uc3Qgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBncHVfaTJjX3F1aXJrcyA9IHsN Cj4gPiArCS5tYXhfcmVhZF9sZW4gPSA0LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHUz MiBncHVfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKSB7DQo+ID4g KwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsgfQ0KPiA+ICsNCj4g PiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGdwdV9pMmNfYWxnb3JpdGhtID0g ew0KPiA+ICsJLm1hc3Rlcl94ZmVyCT0gZ3B1X2kyY19tYXN0ZXJfeGZlciwNCj4gPiArCS5mdW5j dGlvbmFsaXR5CT0gZ3B1X2kyY19mdW5jdGlvbmFsaXR5LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiAr LyoNCj4gPiArICogVGhpcyBkcml2ZXIgaXMgZm9yIE52aWRpYSBHUFUgY2FyZHMgd2l0aCBVU0Ig VHlwZS1DIGludGVyZmFjZS4NCj4gPiArICogV2Ugd2FudCB0byBpZGVudGlmeSB0aGUgY2FyZHMg dXNpbmcgdmVuZG9yIElEIGFuZCBjbGFzcyBjb2RlIG9ubHkNCj4gPiArICogdG8gYXZvaWQgZGVw ZW5kZW5jeSBvZiBhZGRpbmcgcHJvZHVjdCBpZCBmb3IgYW55IG5ldyBjYXJkIHdoaWNoDQo+ID4g KyAqIHJlcXVpcmVzIHRoaXMgZHJpdmVyLg0KPiA+ICsgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8g Y2xhc3MgY29kZSBkZWZpbmVkIGZvciBVQ1NJIGRldmljZSBvdmVyIFBDSQ0KPiA+ICsgKiBzbyB1 c2luZyBVTktOT1dOIGNsYXNzIGZvciBub3cgYW5kIGl0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIFVD U0kNCj4gPiArICogb3ZlciBQQ0kgZ2V0cyBhIGNsYXNzIGNvZGUuDQo+ID4gKyAqIFRoZXJlIGlz IG5vIG90aGVyIE5WSURJQSBjYXJkcyB3aXRoIFVOS05PV04gY2xhc3MgY29kZS4gRXZlbiBpZg0K PiA+ICt0aGUNCj4gPiArICogZHJpdmVyIGdldHMgbG9hZGVkIGZvciBhbiB1bmRlc2lyZWQgY2Fy ZCB0aGVuIGV2ZW50dWFsbHkNCj4gPiAraTJjX3JlYWQoKQ0KPiA+ICsgKiAoaW5pdGlhdGVkIGZy b20gVUNTSSBpMmNfY2xpZW50KSB3aWxsIHRpbWVvdXQgb3IgVUNTSSBjb21tYW5kcw0KPiA+ICt3 aWxsDQo+ID4gKyAqIHRpbWVvdXQuDQo+ID4gKyAqLw0KPiA+ICsjZGVmaW5lIFBDSV9DTEFTU19T RVJJQUxfVU5LTk9XTgkweDBjODANCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNl X2lkIGdwdV9pMmNfaWRzW10gPSB7DQo+ID4gKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lf QU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELA0KPiA+ICsJCVBDSV9DTEFTU19TRVJJQUxf VU5LTk9XTiA8PCA4LCAweGZmZmZmZjAwfSwNCj4gPiArCXsgfQ0KPiA+ICt9Ow0KPiA+ICtNT0RV TEVfREVWSUNFX1RBQkxFKHBjaSwgZ3B1X2kyY19pZHMpOw0KPiA+ICsNCj4gPiArc3RhdGljIGlu dCBncHVfcG9wdWxhdGVfY2xpZW50KHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCwgaW50IGlycSkg ew0KPiA+ICsJc3RydWN0IGkyY19jbGllbnQgKmNjZ3hfY2xpZW50Ow0KPiA+ICsNCj4gPiArCWky Y2QtPmdwdV9jY2d4X3Vjc2kgPSBkZXZtX2t6YWxsb2MoaTJjZC0+ZGV2LA0KPiA+ICsJCQkJCSAg IHNpemVvZihzdHJ1Y3QgaTJjX2JvYXJkX2luZm8pLA0KPiANCj4gSSBwcmVmZXIgc2l6ZW9mKCpp MmNkLT5ncHVfY2NneF91Y3NpKS4gRXNwZWNpYWxseSB3aGVuIHRoZSB0eXBlIGlzIGZhciBhd2F5 IGFzDQo+IGl0IGlzIGhlcmUuLi4NCkZpcnN0IG9uZSBsb29rcyBtb3JlIHJlYWRhYmxlIGFuZCBj bGVhbmVyIHRvIG1lIGJ1dCB3aWxsIGNoYW5nZS4NCg0Kc2l6ZW9mKHN0cnVjdCBpMmNfYm9hcmRf aW5mbyksDQpzaXplb2YoKmkyY2QtPmdwdV9jY2d4X3Vjc2kpLA0KDQo+ID4gKwkJCQkJICAgR0ZQ X0tFUk5FTCk7DQo+ID4gKwlpZiAoIWkyY2QtPmdwdV9jY2d4X3Vjc2kpDQo+ID4gKwkJcmV0dXJu IC1FTk9NRU07DQo+ID4gKw0KPiA+ICsJc3RybGNweShpMmNkLT5ncHVfY2NneF91Y3NpLT50eXBl LCAiY2NneC11Y3NpIiwNCj4gPiArCQlzaXplb2YoaTJjZC0+Z3B1X2NjZ3hfdWNzaS0+dHlwZSkp Ow0KPiA+ICsJaTJjZC0+Z3B1X2NjZ3hfdWNzaS0+YWRkciA9IDB4ODsNCj4gPiArCWkyY2QtPmdw dV9jY2d4X3Vjc2ktPmlycSA9IGlycTsNCj4gPiArCWNjZ3hfY2xpZW50ID0gaTJjX25ld19kZXZp Y2UoJmkyY2QtPmFkYXB0ZXIsIGkyY2QtPmdwdV9jY2d4X3Vjc2kpOw0KPiA+ICsJaWYgKCFjY2d4 X2NsaWVudCkNCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsNCj4gPiArDQo+ID4gKwlyZXR1cm4gMDsN Cj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX3Byb2JlKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QNCj4gPiArcGNpX2RldmljZV9pZCAqaWQpIHsNCj4gPiAr CXN0cnVjdCBncHVfaTJjX2RldiAqaTJjZDsNCj4gPiArCWludCBzdGF0dXM7DQo+ID4gKw0KPiA+ ICsJaTJjZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGdwdV9pMmNf ZGV2KSwNCj4gPiArR0ZQX0tFUk5FTCk7DQo+IA0KPiBXaGlsZSBhdCBpdCwgeW91IG1pZ2h0IGFz IHdlbGwgY2hhbmdlIHRoaXMgdG8gc2l6ZW9mKCppMmNkKSwgYW5kIA0KT2suDQoNCj4gcGxlYXNl IGNoZWNrIGZvciB0aGUgcGF0dGVybiBpbiBwYXRjaCAyLzIuDQpJIGhvcGUgeW91IHNhdyB0aGUg bGF0ZXN0IHJlc3BvbnNlIGF0IFsxXS4gVGhlIGNoYW5nZSB3b3JrcyBvbiBtdWx0aXBsZQ0Kc3lz dGVtcyBhbmQgbm8gZXJyb3IgaGFzIGJlZW4gcmVwb3J0ZWQgeWV0Lg0KV2hhdCBlbHNlIChhbmQg aG93KSB0byBjaGVjayA/DQoNClsxXSBodHRwczovL21hcmMuaW5mby8/bD1saW51eC11c2ImbT0x NTM2NjcxMjc1MDI5NTkmdz0yIA0KDQpUaGFua3MNCkFqYXkNCg0KLS1udnB1YmxpYw0KPiANCj4g Q2hlZXJzLA0KPiBQZXRlcg0KPiANCj4gPiArCWlmICghaTJjZCkNCj4gPiArCQlyZXR1cm4gLUVO T01FTTsNCj4gPiArDQo+ID4gKwlpMmNkLT5kZXYgPSAmcGRldi0+ZGV2Ow0KPiA+ICsJZGV2X3Nl dF9kcnZkYXRhKCZwZGV2LT5kZXYsIGkyY2QpOw0KPiA+ICsNCj4gPiArCXN0YXR1cyA9IHBjaW1f ZW5hYmxlX2RldmljZShwZGV2KTsNCj4gPiArCWlmIChzdGF0dXMgPCAwKSB7DQo+ID4gKwkJZGV2 X2VycigmcGRldi0+ZGV2LCAicGNpbV9lbmFibGVfZGV2aWNlIGZhaWxlZCAlZFxuIiwNCj4gc3Rh dHVzKTsNCj4gPiArCQlyZXR1cm4gc3RhdHVzOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXBjaV9z ZXRfbWFzdGVyKHBkZXYpOw0KPiA+ICsNCj4gPiArCWkyY2QtPnJlZ3MgPSBwY2ltX2lvbWFwKHBk ZXYsIDAsIDApOw0KPiA+ICsJaWYgKCFpMmNkLT5yZWdzKSB7DQo+ID4gKwkJZGV2X2VycigmcGRl di0+ZGV2LCAicGNpbV9pb21hcCBmYWlsZWRcbiIpOw0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0K PiA+ICsJfQ0KPiA+ICsNCj4gPiArCXN0YXR1cyA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2 LCAxLCAxLCBQQ0lfSVJRX01TSSk7DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkgew0KPiA+ICsJCWRl dl9lcnIoJnBkZXYtPmRldiwgInBjaV9hbGxvY19pcnFfdmVjdG9ycyBlcnIgJWRcbiIsDQo+IHN0 YXR1cyk7DQo+ID4gKwkJcmV0dXJuIHN0YXR1czsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwlncHVf ZW5hYmxlX2kyY19idXMoaTJjZCk7DQo+ID4gKw0KPiA+ICsJaTJjX3NldF9hZGFwZGF0YSgmaTJj ZC0+YWRhcHRlciwgaTJjZCk7DQo+ID4gKwlpMmNkLT5hZGFwdGVyLm93bmVyID0gVEhJU19NT0RV TEU7DQo+ID4gKwlzdHJsY3B5KGkyY2QtPmFkYXB0ZXIubmFtZSwgIk5WSURJQSBHUFUgSTJDIGFk YXB0ZXIiLA0KPiA+ICsJCXNpemVvZihpMmNkLT5hZGFwdGVyLm5hbWUpKTsNCj4gPiArCWkyY2Qt PmFkYXB0ZXIuYWxnbyA9ICZncHVfaTJjX2FsZ29yaXRobTsNCj4gPiArCWkyY2QtPmFkYXB0ZXIu cXVpcmtzID0gJmdwdV9pMmNfcXVpcmtzOw0KPiA+ICsJaTJjZC0+YWRhcHRlci5kZXYucGFyZW50 ID0gJnBkZXYtPmRldjsNCj4gPiArCXN0YXR1cyA9IGkyY19hZGRfYWRhcHRlcigmaTJjZC0+YWRh cHRlcik7DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkNCj4gPiArCQlnb3RvIGZyZWVfaXJxX3ZlY3Rv cnM7DQo+ID4gKw0KPiA+ICsJc3RhdHVzID0gZ3B1X3BvcHVsYXRlX2NsaWVudChpMmNkLCBwZGV2 LT5pcnEpOw0KPiA+ICsJaWYgKHN0YXR1cyA8IDApIHsNCj4gPiArCQlkZXZfZXJyKCZwZGV2LT5k ZXYsICJncHVfcG9wdWxhdGVfY2xpZW50IGZhaWxlZCAlZFxuIiwNCj4gc3RhdHVzKTsNCj4gPiAr CQlnb3RvIGRlbF9hZGFwdGVyOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiAwOw0KPiA+ ICsNCj4gPiArZGVsX2FkYXB0ZXI6DQo+ID4gKwlpMmNfZGVsX2FkYXB0ZXIoJmkyY2QtPmFkYXB0 ZXIpOw0KPiA+ICtmcmVlX2lycV92ZWN0b3JzOg0KPiA+ICsJcGNpX2ZyZWVfaXJxX3ZlY3RvcnMo cGRldik7DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMg dm9pZCBncHVfaTJjX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikgew0KPiA+ICsJc3RydWN0 IGdwdV9pMmNfZGV2ICppMmNkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOw0KPiA+ICsN Cj4gPiArCWkyY19kZWxfYWRhcHRlcigmaTJjZC0+YWRhcHRlcik7DQo+ID4gKwlwY2lfZnJlZV9p cnFfdmVjdG9ycyhwZGV2KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJj X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsNCj4gPiArCXN0cnVjdCBncHVfaTJjX2RldiAq aTJjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiA+ICsNCj4gPiArCWdwdV9lbmFibGVfaTJj X2J1cyhpMmNkKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtVTklWRVJT QUxfREVWX1BNX09QUyhncHVfaTJjX2RyaXZlcl9wbSwgTlVMTCwgZ3B1X2kyY19yZXN1bWUsDQo+ IE5VTEwpOw0KPiA+ICsNCj4gPiArc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGdwdV9pMmNfZHJp dmVyID0gew0KPiA+ICsJLm5hbWUJCT0gIm52aWRpYS1ncHUiLA0KPiA+ICsJLmlkX3RhYmxlCT0g Z3B1X2kyY19pZHMsDQo+ID4gKwkucHJvYmUJCT0gZ3B1X2kyY19wcm9iZSwNCj4gPiArCS5yZW1v dmUJCT0gZ3B1X2kyY19yZW1vdmUsDQo+ID4gKwkuZHJpdmVyCQk9IHsNCj4gPiArCQkucG0JPSAm Z3B1X2kyY19kcml2ZXJfcG0sDQo+ID4gKwl9LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArbW9kdWxl X3BjaV9kcml2ZXIoZ3B1X2kyY19kcml2ZXIpOw0KPiA+ICsNCj4gPiArTU9EVUxFX0FVVEhPUigi QWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNvbT4iKTsNCj4gPiArTU9EVUxFX0RFU0NSSVBUSU9O KCJOdmlkaWEgR1BVIEkyQyBjb250cm9sbGVyIERyaXZlciIpOw0KPiA+ICtNT0RVTEVfTElDRU5T RSgiR1BMIHYyIik7DQo+ID4K