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: [v9,1/2] i2c: buses: add i2c bus driver for NVIDIA GPU From: Ajay Gupta Message-Id: <8c7d7e9e004b400a919db19b808988da@bgmail101.nvidia.com> Date: Fri, 7 Sep 2018 17:15:51 +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: SGkgUGV0ZXIsDQo+ID4gU2lnbmVkLW9mZi1ieTogQWpheSBHdXB0YSA8YWpheWdAbnZpZGlhLmNv bT4NCj4gPiBSZXZpZXdlZC1ieTogQW5keSBTaGV2Y2hlbmtvIDxhbmR5LnNoZXZjaGVua29AZ21h aWwuY29tPg0KPiA+IFJldmlld2VkLWJ5OiBIZWlra2kgS3JvZ2VydXMgPGhlaWtraS5rcm9nZXJ1 c0BsaW51eC5pbnRlbC5jb20+DQo+ID4gLS0tDQo+ID4gQ2hhbmdlcyBmcm9tIHYxIC0+IHYyDQo+ ID4gCU5vbmUNCj4gPiBDaGFuZ2VzIGZyb20gdjIgLT4gdjMNCj4gPiAJRml4ZWQgcmV2aWV3IGNv bW1lbnRzIGZyb20gQW5keSBhbmQgVGhpZXJyeQ0KPiA+IAlSZW5hbWUgaTJjLWdwdS5jIC0+IGky Yy1udmlkaWEtZ3B1LmMNCj4gPiBDaGFuZ2VzIGZyb20gdjMgLT4gdjQNCj4gPiAJRml4ZWQgcmV2 aWV3IGNvbW1lbnRzIGZyb20gQW5keQ0KPiA+IENoYW5nZXMgZnJvbSB2NCAtPiB2NQ0KPiA+IAlG aXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBBbmR5DQo+ID4gQ2hhbmdlcyBmcm9tIHY1IC0+IHY2 DQo+ID4gCU5vbmUNCj4gPiBDaGFuZ2VzIGZyb20gdjYgLT4gdjcgLT4gdjgNCj4gPiAJRml4ZWQg cmV2aWV3IGNvbW1lbnRzIGZyb20gUGV0ZXINCj4gPiAJLSBBZGQgaW1wbGljaXQgU1RPUCBmb3Ig bGFzdCB3cml0ZSBtZXNzYWdlDQo+ID4gCS0gQWRkIGkyY19hZGFwdGVyX3F1aXJrcyB3aXRoIG1h eF9yZWFkX2xlbiBhbmQNCj4gPiAJICBJMkNfQVFfQ09NQiBmbGFncw0KPiA+IENoYW5nZXMgZnJv bSB2OCAtPiB2OQ0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBQZXRlcg0KPiA+IAkt IERyb3AgZG9fc3RhcnQgZmxhZw0KPiA+IAktIFVzZSBpMmNfOGJpdF9hZGRyX2Zyb21fbXNnKCkN Cj4gPg0KPiA+ICBEb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW52aWRpYS1ncHUgfCAgMTgg KysNCj4gPiAgTUFJTlRBSU5FUlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICA3ICsN Cj4gPiAgZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcgICAgICAgICAgICAgIHwgICA5ICsNCj4g PiAgZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlICAgICAgICAgICAgIHwgICAxICsNCj4gPiAg ZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1LmMgICAgIHwgMzk2DQo+ICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrDQo+ID4gIDUgZmlsZXMgY2hhbmdlZCwgNDMxIGluc2Vy dGlvbnMoKykNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IERvY3VtZW50YXRpb24vaTJjL2J1c3Nl cy9pMmMtbnZpZGlhLWdwdQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9pMmMvYnVz c2VzL2kyYy1udmlkaWEtZ3B1LmMNCj4gPg0KPiA+IGRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9u L2kyYy9idXNzZXMvaTJjLW52aWRpYS1ncHUNCj4gPiBiL0RvY3VtZW50YXRpb24vaTJjL2J1c3Nl cy9pMmMtbnZpZGlhLWdwdQ0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAw MDAwMC4uMzE4ODRkMg0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9Eb2N1bWVudGF0aW9u L2kyYy9idXNzZXMvaTJjLW52aWRpYS1ncHUNCj4gPiBAQCAtMCwwICsxLDE4IEBADQo+ID4gK0tl cm5lbCBkcml2ZXIgaTJjLW52aWRpYS1ncHUNCj4gPiArDQo+ID4gK0RhdGFzaGVldDogbm90IHB1 YmxpY2x5IGF2YWlsYWJsZS4NCj4gPiArDQo+ID4gK0F1dGhvcnM6DQo+ID4gKwlBamF5IEd1cHRh IDxhamF5Z0BudmlkaWEuY29tPg0KPiA+ICsNCj4gPiArRGVzY3JpcHRpb24NCj4gPiArLS0tLS0t LS0tLS0NCj4gPiArDQo+ID4gK2kyYy1udmlkaWEtZ3B1IGlzIGEgZHJpdmVyIGZvciBJMkMgY29u dHJvbGxlciBpbmNsdWRlZCBpbiBOVklESUENCj4gPiArVHVyaW5nIGFuZCBsYXRlciBHUFVzIGFu ZCBpdCBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggVHlwZS1DIGNvbnRyb2xsZXINCj4gb24g R1BVcy4NCj4gPiArDQo+ID4gK0lmIHlvdXIgJ2xzcGNpIC12JyBsaXN0aW5nIHNob3dzIHNvbWV0 aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcsDQo+ID4gKw0KPiA+ICswMTowMC4zIFNlcmlhbCBidXMg Y29udHJvbGxlciBbMGM4MF06IE5WSURJQSBDb3Jwb3JhdGlvbiBEZXZpY2UgMWFkOQ0KPiA+ICso cmV2IGExKQ0KPiA+ICsNCj4gPiArdGhlbiB0aGlzIGRyaXZlciBzaG91bGQgc3VwcG9ydCB0aGUg STJDIGNvbnRyb2xsZXIgb2YgeW91ciBHUFUuDQo+ID4gZGlmZiAtLWdpdCBhL01BSU5UQUlORVJT IGIvTUFJTlRBSU5FUlMgaW5kZXggOWFkMDUyYS4uMmQxYzVhMSAxMDA2NDQNCj4gPiAtLS0gYS9N QUlOVEFJTkVSUw0KPiA+ICsrKyBiL01BSU5UQUlORVJTDQo+ID4gQEAgLTY3OTcsNiArNjc5Nywx MyBAQCBMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZw0KPiA+ICBTOglNYWludGFpbmVkDQo+ ID4gIEY6CWRyaXZlcnMvaTJjL2kyYy1jb3JlLWFjcGkuYw0KPiA+DQo+ID4gK0kyQyBDT05UUk9M TEVSIERSSVZFUiBGT1IgTlZJRElBIEdQVQ0KPiA+ICtNOglBamF5IEd1cHRhIDxhamF5Z0Budmlk aWEuY29tPg0KPiA+ICtMOglsaW51eC1pMmNAdmdlci5rZXJuZWwub3JnDQo+ID4gK1M6CU1haW50 YWluZWQNCj4gPiArRjoJRG9jdW1lbnRhdGlvbi9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1DQo+ ID4gK0Y6CWRyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtbnZpZGlhLWdwdS5jDQo+ID4gKw0KPiA+ICBJ MkMgTVVYRVMNCj4gPiAgTToJUGV0ZXIgUm9zaW4gPHBlZGFAYXhlbnRpYS5zZT4NCj4gPiAgTDoJ bGludXgtaTJjQHZnZXIua2VybmVsLm9yZw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9i dXNzZXMvS2NvbmZpZyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnDQo+ID4gaW5kZXggNDUx ZDRhZS4uZWVkODI3YiAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZp Zw0KPiA+ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9LY29uZmlnDQo+ID4gQEAgLTIyNCw2ICsy MjQsMTUgQEAgY29uZmlnIEkyQ19ORk9SQ0UyX1M0OTg1DQo+ID4gIAkgIFRoaXMgZHJpdmVyIGNh biBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUNCj4gPiAgCSAg d2lsbCBiZSBjYWxsZWQgaTJjLW5mb3JjZTItczQ5ODUuDQo+ID4NCj4gPiArY29uZmlnIEkyQ19O VklESUFfR1BVDQo+ID4gKwl0cmlzdGF0ZSAiTlZJRElBIEdQVSBJMkMgY29udHJvbGxlciINCj4g PiArCWRlcGVuZHMgb24gUENJDQo+ID4gKwloZWxwDQo+ID4gKwkgIElmIHlvdSBzYXkgeWVzIHRv IHRoaXMgb3B0aW9uLCBzdXBwb3J0IHdpbGwgYmUgaW5jbHVkZWQgZm9yIHRoZQ0KPiA+ICsJICBO VklESUEgR1BVIEkyQyBjb250cm9sbGVyIHdoaWNoIGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0 aCB0aGUNCj4gR1BVJ3MNCj4gPiArCSAgVHlwZS1DIGNvbnRyb2xsZXIuIFRoaXMgZHJpdmVyIGNh biBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlIGNhbGxlZA0KPiA+ICsJICBpMmMtbnZpZGlhLWdw dS4NCj4gPiArDQo+ID4gIGNvbmZpZyBJMkNfU0lTNTU5NQ0KPiA+ICAJdHJpc3RhdGUgIlNpUyA1 NTk1Ig0KPiA+ICAJZGVwZW5kcyBvbiBQQ0kNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMv YnVzc2VzL01ha2VmaWxlIGIvZHJpdmVycy9pMmMvYnVzc2VzL01ha2VmaWxlDQo+ID4gaW5kZXgg MThiMjZhZi4uZDQ5OTgxMyAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvTWFr ZWZpbGUNCj4gPiArKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUNCj4gPiBAQCAtMTQw LDUgKzE0MCw2IEBAIG9iai0kKENPTkZJR19JMkNfU0lCWVRFKQkrPSBpMmMtc2lieXRlLm8NCj4g PiAgb2JqLSQoQ09ORklHX0kyQ19YR0VORV9TTElNUFJPKSArPSBpMmMteGdlbmUtc2xpbXByby5v DQo+ID4gIG9iai0kKENPTkZJR19TQ3gyMDBfQUNCKQkrPSBzY3gyMDBfYWNiLm8NCj4gPiAgb2Jq LSQoQ09ORklHX0kyQ19GU0kpCQkrPSBpMmMtZnNpLm8NCj4gPiArb2JqLSQoQ09ORklHX0kyQ19O VklESUFfR1BVKQkrPSBpMmMtbnZpZGlhLWdwdS5vDQo+ID4NCj4gPiAgY2NmbGFncy0kKENPTkZJ R19JMkNfREVCVUdfQlVTKSA6PSAtRERFQlVHIGRpZmYgLS1naXQNCj4gPiBhL2RyaXZlcnMvaTJj L2J1c3Nlcy9pMmMtbnZpZGlhLWdwdS5jDQo+ID4gYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW52 aWRpYS1ncHUuYw0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4u NGE2M2E0ZTQNCj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9pMmMvYnVzc2Vz L2kyYy1udmlkaWEtZ3B1LmMNCj4gPiBAQCAtMCwwICsxLDM5NiBAQA0KPiA+ICsvLyBTUERYLUxp Y2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMA0KPiA+ICsvKg0KPiA+ICsgKiBOdmlkaWEgR1BVIEky QyBjb250cm9sbGVyIERyaXZlcg0KPiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTgg TlZJRElBIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KPiA+ICsgKiBBdXRob3I6 IEFqYXkgR3VwdGEgPGFqYXlnQG52aWRpYS5jb20+ICAqLyAjaW5jbHVkZSA8bGludXgvZGVsYXku aD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2kyYy5oPiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0 Lmg+ICNpbmNsdWRlDQo+ID4gKzxsaW51eC9tb2R1bGUuaD4gI2luY2x1ZGUgPGxpbnV4L3BjaS5o PiAjaW5jbHVkZQ0KPiA+ICs8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+ICNpbmNsdWRlIDxsaW51 eC9wbS5oPiAjaW5jbHVkZQ0KPiA+ICs8bGludXgvcG1fcnVudGltZS5oPg0KPiA+ICsNCj4gPiAr I2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4NCj4gPiArDQo+ID4gKy8qIEkyQyBkZWZpbml0aW9u cyAqLw0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTAkJCQkweDAwDQo+ID4gKyNkZWZpbmUgSTJD X01TVF9DTlRMX0dFTl9TVEFSVAkJCUJJVCgwKQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9H RU5fU1RPUAkJCUJJVCgxKQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9DTURfTk9ORQkJCSgw IDw8IDIpDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX0NNRF9SRUFECQkJKDEgPDwgMikNCj4g PiArI2RlZmluZSBJMkNfTVNUX0NOVExfQ01EX1dSSVRFCQkJKDIgPDwgMikNCj4gPiArI2RlZmlu ZSBJMkNfTVNUX0NOVExfR0VOX1JBQgkJCUJJVCg0KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05U TF9CVVJTVF9TSVpFX1NISUZUCQk2DQo+ID4gKyNkZWZpbmUgSTJDX01TVF9DTlRMX0dFTl9OQUNL CQkJQklUKDI4KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFUVVMJCQlHRU5NQVNLKDMw LCAyOSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX09LQVkJCSgwIDw8IDI5KQ0K PiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFUVVNfTk9fQUNLCQkoMSA8PCAyOSkNCj4gPiAr I2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX1RJTUVPVVQJCSgyIDw8IDI5KQ0KPiA+ICsjZGVm aW5lIEkyQ19NU1RfQ05UTF9TVEFUVVNfQlVTX0JVU1kJCSgzIDw8IDI5KQ0KPiA+ICsjZGVmaW5l IEkyQ19NU1RfQ05UTF9DWUNMRV9UUklHR0VSCQlCSVQoMzEpDQo+ID4gKw0KPiA+ICsjZGVmaW5l IEkyQ19NU1RfQUREUgkJCQkweDA0DQo+ID4gKyNkZWZpbmUgSTJDX01TVF9BRERSX0RBQgkJCTAN Cj4gPiArDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9JMkMwX1RJTUlORwkJCQkweDA4DQo+ID4gKyNk ZWZpbmUgSTJDX01TVF9JMkMwX1RJTUlOR19TQ0xfUEVSSU9EXzEwMEtIWgkJMHgxMGUNCj4gPiAr I2RlZmluZSBJMkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0xLX0NOVAkJMTYNCj4gPiArI2Rl ZmluZSBJMkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0xLX0NOVF9NQVgJCTI1NQ0KPiA+ICsj ZGVmaW5lIEkyQ19NU1RfSTJDMF9USU1JTkdfVElNRU9VVF9DSEVDSwkJQklUKDI0KQ0KPiA+ICsN Cj4gPiArI2RlZmluZSBJMkNfTVNUX0RBVEEJCQkJCTB4MGMNCj4gPiArDQo+ID4gKyNkZWZpbmUg STJDX01TVF9IWUJSSURfUEFEQ1RMCQkJCTB4MjANCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJ RF9QQURDVExfTU9ERV9JMkMJCQlCSVQoMCkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0hZQlJJRF9Q QURDVExfSTJDX1NDTF9JTlBVVF9SQ1YNCj4gCUJJVCgxNCkNCj4gPiArI2RlZmluZSBJMkNfTVNU X0hZQlJJRF9QQURDVExfSTJDX1NEQV9JTlBVVF9SQ1YNCj4gCUJJVCgxNSkNCj4gPiArDQo+ID4g K3N0cnVjdCBncHVfaTJjX2RldiB7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlICpkZXY7DQo+ID4gKwl2 b2lkIF9faW9tZW0gKnJlZ3M7DQo+ID4gKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgYWRhcHRlcjsNCj4g PiArCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQ7DQo+ID4gKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7 CS8qIHRvIHN5bmMgcmVhZC93cml0ZSAqLw0KPiANCj4gSG1tLCB3aGF0IGRvIHlvdSBuZWVkIHRv IHN5bmMgcmVhZC93cml0ZSB3aXRoPyANCldoYXQgaWYgdGhlcmUgYXJlIG11bHRpcGxlIGNsaWVu dHMgYW5kIGVhY2ggb2YgdGhlbSB3YW50cyB0byB1c2UgSTJDIGJ1cyBmb3IgcmVhZC93cml0ZT8N CkV2ZW4gaW4gVUNTSSBjbGllbnQsIHVzZXIgbWF5IHdhbnQgdG8gY2hhbmdlIGFsdCBtb2RlIHdo aWNoIHdpbGwgcmVzdWx0IGluIHJlYWQvd3JpdGUNCnJlcXVlc3QgaW4gYSB0aHJlYWQuIFNvIHdl IGhhdmUgdG8gc3luY2hyb25pemUgYmV0d2VlbiBVQ1NJIElTUiBhbmQgdGhlIHVzZXIgdGhyZWFk Lg0KDQo+IFRoZSBvbmx5IHRoaW5nIEkgY2FuIGZpbmQgaXMNCj4gdGhhdCBidXN5LWNoZWNrIGlu IGdwdV9pMmNfaWRsZSwgYnV0IGNhbiBydW50aW1lLXBtIHJlYWxseSB0cnkgdG8gaWRsZSBhbg0K PiBhZGFwdGVyIHRoYXQgaGFzIGFuIHhmZXIgaW4gZmxpZ2h0PyBJZiB0aGF0J3MgdGhlIGNhc2Us IHdoYXQgc3RvcHMgYSBuZXcgeGZlciBmcm9tDQo+IGJlaW5nIGluaXRpYXRlZCBhZnRlciBydW50 aW1lLXBtIGhhcyBjaGVja2VkIGlmDQo+IC0+cnVudGltZV9pZGxlIHJldHVybnMgb2sgYnV0IGJl Zm9yZSB0aGUgZGV2aWNlIGlzIHJlYWxseSBzdXNwZW5kZWQ/DQo+IA0KPiBQTSBpcyBub3QgYW4g YXJlYSBJJ20gZmFtaWxpYXIgd2l0aCwgc28gaXQncyBhbiBob25lc3QgcXVlc3Rpb24uDQo+IA0K PiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgZ3B1X2VuYWJsZV9pMmNfYnVzKHN0cnVj dCBncHVfaTJjX2RldiAqaTJjZCkgew0KPiA+ICsJdTMyIHZhbDsNCj4gPiArDQo+ID4gKwkvKiBl bmFibGUgSTJDICovDQo+ID4gKwl2YWwgPSByZWFkbChpMmNkLT5yZWdzICsgSTJDX01TVF9IWUJS SURfUEFEQ1RMKTsNCj4gPiArCXZhbCB8PSBJMkNfTVNUX0hZQlJJRF9QQURDVExfTU9ERV9JMkMg fA0KPiA+ICsJCUkyQ19NU1RfSFlCUklEX1BBRENUTF9JMkNfU0NMX0lOUFVUX1JDViB8DQo+ID4g KwkJSTJDX01TVF9IWUJSSURfUEFEQ1RMX0kyQ19TREFfSU5QVVRfUkNWOw0KPiA+ICsJd3JpdGVs KHZhbCwgaTJjZC0+cmVncyArIEkyQ19NU1RfSFlCUklEX1BBRENUTCk7DQo+ID4gKw0KPiA+ICsJ LyogZW5hYmxlIDEwMEtIWiBtb2RlICovDQo+ID4gKwl2YWwgPSBJMkNfTVNUX0kyQzBfVElNSU5H X1NDTF9QRVJJT0RfMTAwS0haOw0KPiA+ICsJdmFsIHw9IChJMkNfTVNUX0kyQzBfVElNSU5HX1RJ TUVPVVRfQ0xLX0NOVF9NQVgNCj4gPiArCSAgICA8PCBJMkNfTVNUX0kyQzBfVElNSU5HX1RJTUVP VVRfQ0xLX0NOVCk7DQo+ID4gKwl2YWwgfD0gSTJDX01TVF9JMkMwX1RJTUlOR19USU1FT1VUX0NI RUNLOw0KPiA+ICsJd3JpdGVsKHZhbCwgaTJjZC0+cmVncyArIEkyQ19NU1RfSTJDMF9USU1JTkcp OyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfY2hlY2tfc3RhdHVzKHN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCkgew0KPiA+ICsJdW5zaWduZWQgbG9uZyB0YXJnZXQgPSBqaWZmaWVz ICsgbXNlY3NfdG9famlmZmllcygxMDAwKTsNCj4gPiArCXUzMiB2YWw7DQo+ID4gKw0KPiA+ICsJ ZG8gew0KPiA+ICsJCXZhbCA9IHJlYWRsKGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0NOVEwpOw0KPiA+ ICsJCWlmICghKHZhbCAmIEkyQ19NU1RfQ05UTF9DWUNMRV9UUklHR0VSKSkNCj4gPiArCQkJYnJl YWs7DQo+ID4gKwkJaWYgKCh2YWwgJiBJMkNfTVNUX0NOVExfU1RBVFVTKSAhPQ0KPiA+ICsJCQkJ STJDX01TVF9DTlRMX1NUQVRVU19CVVNfQlVTWSkNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJdXNs ZWVwX3JhbmdlKDEwMDAsIDIwMDApOw0KPiA+ICsJfSB3aGlsZSAodGltZV9pc19hZnRlcl9qaWZm aWVzKHRhcmdldCkpOw0KPiA+ICsJaWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXModGFyZ2V0KSkg ew0KPiA+ICsJCWRldl9lcnIoaTJjZC0+ZGV2LCAiaTJjIHRpbWVvdXQgZXJyb3IgJXhcbiIsIHZh bCk7DQo+ID4gKwkJcmV0dXJuIC1FSU87DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJdmFsID0gcmVh ZGwoaTJjZC0+cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKwlzd2l0Y2ggKHZhbCAmIEkyQ19N U1RfQ05UTF9TVEFUVVMpIHsNCj4gPiArCWNhc2UgSTJDX01TVF9DTlRMX1NUQVRVU19PS0FZOg0K PiA+ICsJCXJldHVybiAwOw0KPiA+ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX05PX0FDSzoN Cj4gPiArCQlyZXR1cm4gLUVJTzsNCj4gPiArCWNhc2UgSTJDX01TVF9DTlRMX1NUQVRVU19USU1F T1VUOg0KPiA+ICsJCXJldHVybiAtRVRJTUU7DQo+ID4gKwljYXNlIEkyQ19NU1RfQ05UTF9TVEFU VVNfQlVTX0JVU1k6DQo+ID4gKwkJcmV0dXJuIC1FQlVTWTsNCj4gPiArCWRlZmF1bHQ6DQo+ID4g KwkJcmV0dXJuIDA7DQo+ID4gKwl9DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgZ3B1 X2kyY19yZWFkKHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCwgdTggKmRhdGEsIHUxNiBsZW4pDQo+ ID4gK3sNCj4gPiArCWludCBzdGF0dXM7DQo+ID4gKwl1MzIgdmFsOw0KPiA+ICsNCj4gPiArCXZh bCA9IEkyQ19NU1RfQ05UTF9HRU5fU1RBUlQgfCBJMkNfTVNUX0NOVExfR0VOX1NUT1AgfA0KPiA+ ICsJCUkyQ19NU1RfQ05UTF9DTURfUkVBRCB8IChsZW4gPDwNCj4gSTJDX01TVF9DTlRMX0JVUlNU X1NJWkVfU0hJRlQpIHwNCj4gPiArCQlJMkNfTVNUX0NOVExfQ1lDTEVfVFJJR0dFUiB8DQo+IEky Q19NU1RfQ05UTF9HRU5fTkFDSzsNCj4gPiArCXZhbCAmPSB+STJDX01TVF9DTlRMX0dFTl9SQUI7 DQo+ID4gKwl3cml0ZWwodmFsLCBpMmNkLT5yZWdzICsgSTJDX01TVF9DTlRMKTsNCj4gPiArDQo+ ID4gKwlzdGF0dXMgPSBncHVfaTJjX2NoZWNrX3N0YXR1cyhpMmNkKTsNCj4gPiArCWlmIChzdGF0 dXMgPCAwKQ0KPiA+ICsJCXJldHVybiBzdGF0dXM7DQo+ID4gKw0KPiA+ICsJdmFsID0gcmVhZGwo aTJjZC0+cmVncyArIEkyQ19NU1RfREFUQSk7DQo+ID4gKwlzd2l0Y2ggKGxlbikgew0KPiA+ICsJ Y2FzZSAxOg0KPiA+ICsJCWRhdGFbMF0gPSB2YWw7DQo+ID4gKwkJYnJlYWs7DQo+ID4gKwljYXNl IDI6DQo+ID4gKwkJcHV0X3VuYWxpZ25lZF9iZTE2KHZhbCwgZGF0YSk7DQo+ID4gKwkJYnJlYWs7 DQo+ID4gKwljYXNlIDM6DQo+ID4gKwkJcHV0X3VuYWxpZ25lZF9iZTE2KHZhbCA+PiA4LCBkYXRh KTsNCj4gPiArCQlkYXRhWzJdID0gdmFsOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJY2FzZSA0Og0K PiA+ICsJCXB1dF91bmFsaWduZWRfYmUzMih2YWwsIGRhdGEpOw0KPiA+ICsJCWJyZWFrOw0KPiA+ ICsJZGVmYXVsdDoNCj4gPiArCQlicmVhazsNCj4gPiArCX0NCj4gPiArCXJldHVybiBzdGF0dXM7 DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19zdGFydChzdHJ1Y3QgZ3B1 X2kyY19kZXYgKmkyY2QsIHUxNiBhZGRyKSB7DQo+ID4gKwl1MzIgdmFsOw0KPiA+ICsNCj4gPiAr CXZhbCA9IGFkZHIgPDwgSTJDX01TVF9BRERSX0RBQjsNCj4gPiArCXdyaXRlbCh2YWwsIGkyY2Qt PnJlZ3MgKyBJMkNfTVNUX0FERFIpOw0KPiA+ICsNCj4gPiArCXZhbCA9IEkyQ19NU1RfQ05UTF9H RU5fU1RBUlQgfCBJMkNfTVNUX0NOVExfQ01EX05PTkUgfA0KPiA+ICsJCUkyQ19NU1RfQ05UTF9H RU5fTkFDSzsNCj4gPiArCXZhbCAmPSB+KEkyQ19NU1RfQ05UTF9HRU5fU1RPUCB8IEkyQ19NU1Rf Q05UTF9HRU5fUkFCKTsNCj4gPiArCXdyaXRlbCh2YWwsIGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0NO VEwpOw0KPiA+ICsNCj4gPiArCXJldHVybiBncHVfaTJjX2NoZWNrX3N0YXR1cyhpMmNkKTsNCj4g PiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX3N0b3Aoc3RydWN0IGdwdV9pMmNf ZGV2ICppMmNkKSB7DQo+ID4gKwl1MzIgdmFsOw0KPiA+ICsNCj4gPiArCXZhbCA9IEkyQ19NU1Rf Q05UTF9HRU5fU1RPUCB8IEkyQ19NU1RfQ05UTF9DTURfTk9ORSB8DQo+ID4gKwkJSTJDX01TVF9D TlRMX0dFTl9OQUNLOw0KPiA+ICsJdmFsICY9IH4oSTJDX01TVF9DTlRMX0dFTl9TVEFSVCB8IEky Q19NU1RfQ05UTF9HRU5fUkFCKTsNCj4gPiArCXdyaXRlbCh2YWwsIGkyY2QtPnJlZ3MgKyBJMkNf TVNUX0NOVEwpOw0KPiA+ICsNCj4gPiArCXJldHVybiBncHVfaTJjX2NoZWNrX3N0YXR1cyhpMmNk KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX3dyaXRlKHN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCwgdTggZGF0YSkgew0KPiA+ICsJdTMyIHZhbDsNCj4gPiArDQo+ID4g Kwl3cml0ZWwoZGF0YSwgaTJjZC0+cmVncyArIEkyQ19NU1RfREFUQSk7DQo+ID4gKw0KPiA+ICsJ dmFsID0gSTJDX01TVF9DTlRMX0NNRF9XUklURSB8ICgxIDw8DQo+IEkyQ19NU1RfQ05UTF9CVVJT VF9TSVpFX1NISUZUKSB8DQo+ID4gKwkJSTJDX01TVF9DTlRMX0dFTl9OQUNLOw0KPiA+ICsJdmFs ICY9IH4oSTJDX01TVF9DTlRMX0dFTl9TVEFSVCB8IEkyQ19NU1RfQ05UTF9HRU5fU1RPUCB8DQo+ ID4gKwkJIEkyQ19NU1RfQ05UTF9HRU5fUkFCKTsNCj4gPiArCXdyaXRlbCh2YWwsIGkyY2QtPnJl Z3MgKyBJMkNfTVNUX0NOVEwpOw0KPiA+ICsNCj4gPiArCXJldHVybiBncHVfaTJjX2NoZWNrX3N0 YXR1cyhpMmNkKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX21hc3Rl cl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwNCj4gPiArCQkJICAgICAgIHN0cnVjdCBp MmNfbXNnICptc2dzLCBpbnQgbnVtKSB7DQo+ID4gKwlzdHJ1Y3QgZ3B1X2kyY19kZXYgKmkyY2Qg PSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOw0KPiA+ICsJaW50IHN0YXR1czsNCj4gPiArCWludCBp LCBqOw0KPiA+ICsNCj4gPiArCW11dGV4X2xvY2soJmkyY2QtPm11dGV4KTsNCj4gPiArCWZvciAo aSA9IDA7IGkgPCBudW07IGkrKykgew0KPiA+ICsJCWlmIChtc2dzW2ldLmZsYWdzICYgSTJDX01f UkQpIHsNCj4gPiArCQkJLyogZ3B1X2kyY19yZWFkIGhhcyBpbXBsaWNpdCBzdGFydCBhbmQgc3Rv cCAqLw0KPiA+ICsJCQlzdGF0dXMgPSBncHVfaTJjX3JlYWQoaTJjZCwgbXNnc1tpXS5idWYsIG1z Z3NbaV0ubGVuKTsNCj4gDQo+IFBlciB5b3VyIGNvbW1lbnRzIG9uIHY4LCB0aGUgYWRkcmVzcyBo YXMgdG8gYmUgcHJvZ3JhbW1lZCBiZWZvcmUgdGhlDQo+IHRyYW5zZmVyLCBidXQgeW91IGZhaWwg dG8gZG8gdGhhdCBpZiB0aGUgZmlyc3QgbWVzc2FnZSBpcyBhIHJlYWQuDQpUaGlzIHdpbGwgbmV2 ZXIgaGFwcGVuLiBIaW50OiBJMkNfQVFfQ09NQl9XUklURV9GSVJTVA0KIA0KPiBJcyB0aGUgSTJD X01TVF9BRERSIHJlZ2lzdGVyIHJlYWxseSBpbiB0aGUgbG9vcCB3aGVuIHlvdSBkbyBhIHdyaXRl Pw0KVGhhdOKAmXMgbm90IG5lZWRlZC4gV2UgbmVlZCB0byB3cml0ZSBJMkNfTVNUX0FERFIgb25j ZSBiZWZvcmUgc3RhcnRpbmcNCm9uZSBvciBtb3JlIHRyYW5zZmVycyB0byBhIGNsaWVudC4NCg0K PiBCZWNhdXNlDQo+IEkgdGhpbmsgaXQgd291bGQgc2ltcGxpZnkgdGhpbmdzIGlmIHlvdSBjb3Vs ZCBtb3ZlIHRoZSB3cml0ZSB0byB0aGUNCj4gSTJDX01TVF9BRERSIHJlZ2lzdGVyIHRvIGJlIGlu IGdwdV9pMmNfcmVhZCBpbnN0ZWFkIG9mIGluIGdwdV9pMmNfc3RhcnQuIE9yLA0KPiBtYXliZSBq dXN0IHdyaXRlIHRvIEkyQ19NU1RfQUREUiBiZWZvcmUgdGhlIGZvci1sb29wIGluIHRoaXMgZnVu Y3Rpb24uDQpTZWUgYWJvdmUuIEhpbnQ6IEkyQ19BUV9DT01CX1dSSVRFX0ZJUlNUDQoNCj4gPiAr CQkJaWYgKHN0YXR1cyA8IDApDQo+ID4gKwkJCQlnb3RvIHVubG9jazsNCj4gPiArCQl9IGVsc2Ug ew0KPiA+ICsJCQkvKiBzdGFydCBvbiBmaXJzdCB3cml0ZSBtZXNzYWdlICovDQo+ID4gKwkJCWlm IChpID09IDApIHsNCj4gDQo+IFlvdSBkbyBub3QgaXNzdWUgYSByZXN0YXJ0IG5vciBkbyB5b3Ug d3JpdGUgdGhlIGFkZHJlc3MgdG8gdGhlIGJ1cyBmb3IgdGhlDQo+IHNlY29uZCBtZXNzYWdlLCBp ZiBpdCdzIGEgd3JpdGUuDQpUaGF04oCZcyBub3QgbmVlZGVkLiBXZSBuZWVkIHRvIHdyaXRlIEky Q19NU1RfQUREUiBvbmNlIGJlZm9yZSBzdGFydGluZw0Kb25lIG9yIG1vcmUgdHJhbnNmZXJzIHRv IGEgY2xpZW50Lg0KDQo+IFRoYXQgbWFrZXMgbWUgd29uZGVyIGlmIHRoaXMgcGF0Y2ggd2FzDQo+ IHRlc3RlZCwgYmVjYXVzZSBBRkFJQ1QgY2NnX3dyaXRlIGluIHBhdGNoIDIvMiB1c2VzIHhmZXJz IGNvbWJpbmluZyB0d28gd3JpdGUNCj4gbWVzc2FnZXMgYW5kIEkgZmFpbCB0byBzZWUgaG93IHRo YXQgY2FuIHdvcms/DQpTZWUgYWJvdmUuDQogDQo+IEFsc28sIGhhdmUgeW91IHZlcmlmaWVkIGlm IGdwdV9pMmNfc3RhcnQgcmVhbGx5IGlzc3VlcyBhIHJlc3RhcnQgaW5zdGVhZCBvZiBhIHN0b3AN Cj4gZm9sbG93ZWQgYnkgYSBzdGFydCBpZiB0aGUgYnVzIGlzIG5vdCBpZGxlIG9uIGZ1bmN0aW9u IGVudHJ5Pw0KWWVzLiBIaW50OiByZWZlciBncHVfaTJfc3RhcnQoKSBhbmQgbG9vayBmb3IgSTJD X01TVF9DTlRMX0dFTl9TVE9QIGJpdC4NCg0KVGhhbmtzDQpBamF5DQotLQ0KbnZwdWJsaWMNCi0t DQo+IE9yIGlzIHRoZQ0KPiBkb2N1bWVudGF0aW9uIGNsZWFyIG9uIHRoaXMgZGV0YWlsPyBNaWdo dCBiZSB3b3J0aCBjaGVja2luZyBhbnl3YXksIGFzDQo+IGRvY3VtZW50YXRpb24gaXMgbm90IGFs d2F5cyBjb21wbGV0ZWx5IGNvcnJlY3QuLi4NCj4gDQo+IENoZWVycywNCj4gUGV0ZXINCj4gDQo+ ID4gKwkJCQl1OCBhZGRyID0gaTJjXzhiaXRfYWRkcl9mcm9tX21zZyhtc2dzICsgaSk7DQo+ID4g KwkJCQlzdGF0dXMgPSBncHVfaTJjX3N0YXJ0KGkyY2QsIG1zZ3NbaV0uYWRkcik7DQo+ID4gKwkJ CQlpZiAoc3RhdHVzIDwgMCkNCj4gPiArCQkJCQlnb3RvIHVubG9jazsNCj4gPiArDQo+ID4gKwkJ CQlzdGF0dXMgPSBncHVfaTJjX3dyaXRlKGkyY2QsIGFkZHIpOw0KPiA+ICsJCQkJaWYgKHN0YXR1 cyA8IDApDQo+ID4gKwkJCQkJZ290byBzdG9wOw0KPiA+ICsJCQl9DQo+ID4gKwkJCWZvciAoaiA9 IDA7IGogPCBtc2dzW2ldLmxlbjsgaisrKSB7DQo+ID4gKwkJCQlzdGF0dXMgPSBncHVfaTJjX3dy aXRlKGkyY2QsIG1zZ3NbaV0uYnVmW2pdKTsNCj4gPiArCQkJCWlmIChzdGF0dXMgPCAwKQ0KPiA+ ICsJCQkJCWdvdG8gc3RvcDsNCj4gPiArCQkJfQ0KPiA+ICsJCQkvKiBzdG9wIGlmIGxhc3Qgd3Jp dGUgbWVzc2FnZSAqLw0KPiA+ICsJCQlpZiAoaSA9PSAobnVtIC0gMSkpIHsNCj4gPiArCQkJCXN0 YXR1cyA9IGdwdV9pMmNfc3RvcChpMmNkKTsNCj4gPiArCQkJCWlmIChzdGF0dXMgPCAwKQ0KPiA+ ICsJCQkJCWdvdG8gdW5sb2NrOw0KPiA+ICsJCQl9DQo+ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsJ c3RhdHVzID0gaTsNCj4gPiArCWdvdG8gdW5sb2NrOw0KPiA+ICtzdG9wOg0KPiA+ICsJc3RhdHVz ID0gZ3B1X2kyY19zdG9wKGkyY2QpOw0KPiA+ICt1bmxvY2s6DQo+ID4gKwltdXRleF91bmxvY2so JmkyY2QtPm11dGV4KTsNCj4gPiArCXJldHVybiBzdGF0dXM7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FkYXB0ZXJfcXVpcmtzIGdwdV9pMmNfcXVpcmtzID0g ew0KPiA+ICsJLmZsYWdzID0gSTJDX0FRX0NPTUIgfCBJMkNfQVFfQ09NQl9XUklURV9GSVJTVCB8 DQo+IEkyQ19BUV9DT01CX1NBTUVfQUREUiwNCj4gPiArCS5tYXhfcmVhZF9sZW4gPSA0LA0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHUzMiBncHVfaTJjX2Z1bmN0aW9uYWxpdHkoc3RydWN0 IGkyY19hZGFwdGVyICphZGFwKSB7DQo+ID4gKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZV TkNfU01CVVNfRU1VTDsgfQ0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfYWxn b3JpdGhtIGdwdV9pMmNfYWxnb3JpdGhtID0gew0KPiA+ICsJLm1hc3Rlcl94ZmVyCT0gZ3B1X2ky Y19tYXN0ZXJfeGZlciwNCj4gPiArCS5mdW5jdGlvbmFsaXR5CT0gZ3B1X2kyY19mdW5jdGlvbmFs aXR5LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogVGhpcyBkcml2ZXIgaXMgZm9y IE52aWRpYSBHUFUgY2FyZHMgd2l0aCBVU0IgVHlwZS1DIGludGVyZmFjZS4NCj4gPiArICogV2Ug d2FudCB0byBpZGVudGlmeSB0aGUgY2FyZHMgdXNpbmcgdmVuZG9yIElEIGFuZCBjbGFzcyBjb2Rl IG9ubHkNCj4gPiArICogdG8gYXZvaWQgZGVwZW5kZW5jeSBvZiBhZGRpbmcgcHJvZHVjdCBpZCBm b3IgYW55IG5ldyBjYXJkIHdoaWNoDQo+ID4gKyAqIHJlcXVpcmVzIHRoaXMgZHJpdmVyLg0KPiA+ ICsgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gY2xhc3MgY29kZSBkZWZpbmVkIGZvciBVQ1NJIGRl dmljZSBvdmVyIFBDSQ0KPiA+ICsgKiBzbyB1c2luZyBVTktOT1dOIGNsYXNzIGZvciBub3cgYW5k IGl0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIFVDU0kNCj4gPiArICogb3ZlciBQQ0kgZ2V0cyBhIGNs YXNzIGNvZGUuDQo+ID4gKyAqIFRoZXJlIGlzIG5vIG90aGVyIE5WSURJQSBjYXJkcyB3aXRoIFVO S05PV04gY2xhc3MgY29kZS4gRXZlbiBpZg0KPiA+ICt0aGUNCj4gPiArICogZHJpdmVyIGdldHMg bG9hZGVkIGZvciBhbiB1bmRlc2lyZWQgY2FyZCB0aGVuIGV2ZW50dWFsbHkNCj4gPiAraTJjX3Jl YWQoKQ0KPiA+ICsgKiAoaW5pdGlhdGVkIGZyb20gVUNTSSBpMmNfY2xpZW50KSB3aWxsIHRpbWVv dXQgb3IgVUNTSSBjb21tYW5kcw0KPiA+ICt3aWxsDQo+ID4gKyAqIHRpbWVvdXQuDQo+ID4gKyAq Lw0KPiA+ICsjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfVU5LTk9XTgkweDBjODANCj4gPiArc3Rh dGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGdwdV9pMmNfaWRzW10gPSB7DQo+ID4gKwl7 IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lE LA0KPiA+ICsJCVBDSV9DTEFTU19TRVJJQUxfVU5LTk9XTiA8PCA4LCAweGZmZmZmZjAwfSwNCj4g PiArCXsgfQ0KPiA+ICt9Ow0KPiA+ICtNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZ3B1X2kyY19p ZHMpOw0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfcG9wdWxhdGVfY2xpZW50KHN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCwgaW50IGlycSkgew0KPiA+ICsJc3RhdGljIHN0cnVjdCBpMmNfYm9h cmRfaW5mbyBncHVfY2NneF91Y3NpID0gew0KPiA+ICsJCUkyQ19CT0FSRF9JTkZPKCJjY2d4LXVj c2kiLCAweDgpLA0KPiA+ICsJfTsNCj4gPiArDQo+ID4gKwlncHVfY2NneF91Y3NpLmlycSA9IGly cTsNCj4gPiArCWkyY2QtPmNsaWVudCA9IGkyY19uZXdfZGV2aWNlKCZpMmNkLT5hZGFwdGVyLCAm Z3B1X2NjZ3hfdWNzaSk7DQo+ID4gKwlpZiAoIWkyY2QtPmNsaWVudCkgew0KPiA+ICsJCWRldl9l cnIoaTJjZC0+ZGV2LCAiaTJjX25ld19kZXZpY2UgZmFpbGVkXG4iKTsNCj4gPiArCQlyZXR1cm4g LUVOT0RFVjsNCj4gPiArCX0NCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtz dGF0aWMgaW50IGdwdV9pMmNfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVj dA0KPiA+ICtwY2lfZGV2aWNlX2lkICppZCkgew0KPiA+ICsJc3RydWN0IGdwdV9pMmNfZGV2ICpp MmNkOw0KPiA+ICsJaW50IHN0YXR1czsNCj4gPiArDQo+ID4gKwlpMmNkID0gZGV2bV9remFsbG9j KCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZ3B1X2kyY19kZXYpLA0KPiBHRlBfS0VSTkVMKTsN Cj4gPiArCWlmICghaTJjZCkNCj4gPiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlp MmNkLT5kZXYgPSAmcGRldi0+ZGV2Ow0KPiA+ICsJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYs IGkyY2QpOw0KPiA+ICsNCj4gPiArCXN0YXR1cyA9IHBjaW1fZW5hYmxlX2RldmljZShwZGV2KTsN Cj4gPiArCWlmIChzdGF0dXMgPCAwKSB7DQo+ID4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNp bV9lbmFibGVfZGV2aWNlIGZhaWxlZCAlZFxuIiwNCj4gc3RhdHVzKTsNCj4gPiArCQlyZXR1cm4g c3RhdHVzOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXBjaV9zZXRfbWFzdGVyKHBkZXYpOw0KPiA+ ICsNCj4gPiArCWkyY2QtPnJlZ3MgPSBwY2ltX2lvbWFwKHBkZXYsIDAsIDApOw0KPiA+ICsJaWYg KCFpMmNkLT5yZWdzKSB7DQo+ID4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicGNpbV9pb21hcCBm YWlsZWRcbiIpOw0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiAr CXN0YXR1cyA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCBQQ0lfSVJRX01TSSk7 DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkgew0KPiA+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgInBj aV9hbGxvY19pcnFfdmVjdG9ycyBlcnIgJWRcbiIsDQo+IHN0YXR1cyk7DQo+ID4gKwkJcmV0dXJu IHN0YXR1czsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwltdXRleF9pbml0KCZpMmNkLT5tdXRleCk7 DQo+ID4gKwlncHVfZW5hYmxlX2kyY19idXMoaTJjZCk7DQo+ID4gKw0KPiA+ICsJaTJjX3NldF9h ZGFwZGF0YSgmaTJjZC0+YWRhcHRlciwgaTJjZCk7DQo+ID4gKwlpMmNkLT5hZGFwdGVyLm93bmVy ID0gVEhJU19NT0RVTEU7DQo+ID4gKwlzdHJsY3B5KGkyY2QtPmFkYXB0ZXIubmFtZSwgIk5WSURJ QSBHUFUgSTJDIGFkYXB0ZXIiLA0KPiA+ICsJCXNpemVvZihpMmNkLT5hZGFwdGVyLm5hbWUpKTsN Cj4gPiArCWkyY2QtPmFkYXB0ZXIuYWxnbyA9ICZncHVfaTJjX2FsZ29yaXRobTsNCj4gPiArCWky Y2QtPmFkYXB0ZXIucXVpcmtzID0gJmdwdV9pMmNfcXVpcmtzOw0KPiA+ICsJaTJjZC0+YWRhcHRl ci5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsNCj4gPiArCXN0YXR1cyA9IGkyY19hZGRfYWRhcHRl cigmaTJjZC0+YWRhcHRlcik7DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkNCj4gPiArCQlnb3RvIGZy ZWVfaXJxX3ZlY3RvcnM7DQo+ID4gKw0KPiA+ICsJc3RhdHVzID0gZ3B1X3BvcHVsYXRlX2NsaWVu dChpMmNkLCBwZGV2LT5pcnEpOw0KPiA+ICsJaWYgKHN0YXR1cyA8IDApIHsNCj4gPiArCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJncHVfcG9wdWxhdGVfY2xpZW50IGZhaWxlZCAlZFxuIiwNCj4gc3Rh dHVzKTsNCj4gPiArCQlnb3RvIGRlbF9hZGFwdGVyOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJl dHVybiAwOw0KPiA+ICsNCj4gPiArZGVsX2FkYXB0ZXI6DQo+ID4gKwlpMmNfZGVsX2FkYXB0ZXIo JmkyY2QtPmFkYXB0ZXIpOw0KPiA+ICtmcmVlX2lycV92ZWN0b3JzOg0KPiA+ICsJcGNpX2ZyZWVf aXJxX3ZlY3RvcnMocGRldik7DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9DQo+ID4gKw0K PiA+ICtzdGF0aWMgdm9pZCBncHVfaTJjX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikgew0K PiA+ICsJc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5k ZXYpOw0KPiA+ICsNCj4gPiArCWkyY19kZWxfYWRhcHRlcigmaTJjZC0+YWRhcHRlcik7DQo+ID4g KwlwY2lfZnJlZV9pcnFfdmVjdG9ycyhwZGV2KTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGlj IGludCBncHVfaTJjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsNCj4gPiArCXN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiA+ICsNCj4gPiArCWdw dV9lbmFibGVfaTJjX2J1cyhpMmNkKTsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0K PiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpIHsNCj4gPiAr CXN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KPiA+ICsN Cj4gPiArCWlmICghbXV0ZXhfdHJ5bG9jaygmaTJjZC0+bXV0ZXgpKSB7DQo+ID4gKwkJZGV2X2lu Zm8oZGV2LCAiLUVCVVNZXG4iKTsNCj4gPiArCQlyZXR1cm4gLUVCVVNZOw0KPiA+ICsJfQ0KPiA+ ICsJbXV0ZXhfdW5sb2NrKCZpMmNkLT5tdXRleCk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ ID4gK30NCj4gPiArDQo+ID4gK1VOSVZFUlNBTF9ERVZfUE1fT1BTKGdwdV9pMmNfZHJpdmVyX3Bt LCBOVUxMLCBncHVfaTJjX3Jlc3VtZSwNCj4gPiArZ3B1X2kyY19pZGxlKTsNCj4gPiArDQo+ID4g K3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBncHVfaTJjX2RyaXZlciA9IHsNCj4gPiArCS5uYW1l CQk9ICJudmlkaWEtZ3B1IiwNCj4gPiArCS5pZF90YWJsZQk9IGdwdV9pMmNfaWRzLA0KPiA+ICsJ LnByb2JlCQk9IGdwdV9pMmNfcHJvYmUsDQo+ID4gKwkucmVtb3ZlCQk9IGdwdV9pMmNfcmVtb3Zl LA0KPiA+ICsJLmRyaXZlcgkJPSB7DQo+ID4gKwkJLnBtCT0gJmdwdV9pMmNfZHJpdmVyX3BtLA0K PiA+ICsJfSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK21vZHVsZV9wY2lfZHJpdmVyKGdwdV9pMmNf ZHJpdmVyKTsNCj4gPiArDQo+ID4gK01PRFVMRV9BVVRIT1IoIkFqYXkgR3VwdGEgPGFqYXlnQG52 aWRpYS5jb20+Iik7DQo+ID4gK01PRFVMRV9ERVNDUklQVElPTigiTnZpZGlhIEdQVSBJMkMgY29u dHJvbGxlciBEcml2ZXIiKTsNCj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOw0KPiA+Cg==