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: <2df3c303d56342c5bc58d3f8b614af19@bgmail101.nvidia.com> Date: Tue, 11 Sep 2018 22:48:42 +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: SGkgUGV0ZXIsDQoNCj4gPiBMYXRlc3QgTlZJRElBIEdQVSBjYXJkIGhhcyBVU0IgVHlwZS1DIGlu dGVyZmFjZS4gVGhlcmUgaXMgYSBUeXBlLUMNCj4gPiBjb250cm9sbGVyIHdoaWNoIGNhbiBiZSBh Y2Nlc3NlZCBvdmVyIEkyQy4NCj4gPg0KPiA+IFRoaXMgZHJpdmVyIGFkZHMgSTJDIGJ1cyBkcml2 ZXIgdG8gY29tbXVuaWNhdGUgd2l0aCBUeXBlLUMgY29udHJvbGxlci4NCj4gPiBJMkMgY2xpZW50 IGRyaXZlciB3aWxsIGJlIHBhcnQgb2YgVVNCIFR5cGUtQyBVQ1NJIGRyaXZlci4NCj4gPg0KPiA+ IFNpZ25lZC1vZmYtYnk6IEFqYXkgR3VwdGEgPGFqYXlnQG52aWRpYS5jb20+DQo+ID4gUmV2aWV3 ZWQtYnk6IEFuZHkgU2hldmNoZW5rbyA8YW5keS5zaGV2Y2hlbmtvQGdtYWlsLmNvbT4NCj4gPiBS ZXZpZXdlZC1ieTogSGVpa2tpIEtyb2dlcnVzIDxoZWlra2kua3JvZ2VydXNAbGludXguaW50ZWwu Y29tPg0KPiA+IC0tLQ0KPiA+IENoYW5nZXMgZnJvbSB2MSAtPiB2Mg0KPiA+IAlOb25lDQo+ID4g Q2hhbmdlcyBmcm9tIHYyIC0+IHYzDQo+ID4gCUZpeGVkIHJldmlldyBjb21tZW50cyBmcm9tIEFu ZHkgYW5kIFRoaWVycnkNCj4gPiAJUmVuYW1lIGkyYy1ncHUuYyAtPiBpMmMtbnZpZGlhLWdwdS5j DQo+ID4gQ2hhbmdlcyBmcm9tIHYzIC0+IHY0DQo+ID4gCUZpeGVkIHJldmlldyBjb21tZW50cyBm cm9tIEFuZHkNCj4gPiBDaGFuZ2VzIGZyb20gdjQgLT4gdjUNCj4gPiAJRml4ZWQgcmV2aWV3IGNv bW1lbnRzIGZyb20gQW5keQ0KPiA+IENoYW5nZXMgZnJvbSB2NSAtPiB2Ng0KPiA+IAlOb25lDQo+ ID4gQ2hhbmdlcyBmcm9tIHY2IC0+IHY3IC0+IHY4DQo+ID4gCUZpeGVkIHJldmlldyBjb21tZW50 cyBmcm9tIFBldGVyDQo+ID4gCS0gQWRkIGltcGxpY2l0IFNUT1AgZm9yIGxhc3Qgd3JpdGUgbWVz c2FnZQ0KPiA+IAktIEFkZCBpMmNfYWRhcHRlcl9xdWlya3Mgd2l0aCBtYXhfcmVhZF9sZW4gYW5k DQo+ID4gCSAgSTJDX0FRX0NPTUIgZmxhZ3MNCj4gPiBDaGFuZ2VzIGZyb20gdjggLT4gdjkNCj4g PiAJRml4ZWQgcmV2aWV3IGNvbW1lbnRzIGZyb20gUGV0ZXINCj4gPiAJLSBEcm9wIGRvX3N0YXJ0 IGZsYWcNCj4gPiAJLSBVc2UgaTJjXzhiaXRfYWRkcl9mcm9tX21zZygpDQo+ID4gQ2hhbmdlcyBm cm9tIHY5IC0+IHYxMA0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBQZXRlcg0KPiA+ IAktIERyb3BwZWQgSTJDX0ZVTkNfU01CVVNfRU1VTA0KPiA+IAktIERyb3BwZWQgbG9jYWwgbXV0 ZXgNCj4gPiBDaGFuZ2VzIGZyb20gdjEwIC0+IHYxMQ0KPiA+IAlGaXhlZCByZXZpZXcgY29tbWVu dHMgZnJvbSBQZXRlcg0KPiA+IAktIE1vdmVkIHN0b3AgaW4gbWFzdGVyX3hmZXIgYXQgZW5kIG9m IG1lc3NhZ2UNCj4gPiAJLSBDaGFuZ2UgaTJjX3JlYWQgd2l0aG91dCBTVE9QDQo+ID4gCS0gRHJv cHBlZCBJMkNfQUNfQ09NQiogZmxhZ3MNCj4gPiBDaGFuZ2VzIGZyb20gdjExIC0+IHYxMg0KPiA+ IAlGaXhlZCByZXZpZXcgY29tbWVudHMgZnJvbSBQZXRlcg0KPiA+IAktIFJlbW92ZWQgY2xlYXJp bmcgb2YgZW1wdHkgYml0cw0KPiA+IAktIEZpeCBtYXN0ZXJfeGZlciBmb3IgY29ycmVjdCBzdG9w IHVzZQ0KPiA+DQo+ID4gIERvY3VtZW50YXRpb24vaTJjL2J1c3Nlcy9pMmMtbnZpZGlhLWdwdSB8 ICAxOCArKw0KPiA+ICBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAg IDcgKw0KPiA+ICBkcml2ZXJzL2kyYy9idXNzZXMvS2NvbmZpZyAgICAgICAgICAgICAgfCAgIDkg Kw0KPiA+ICBkcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKw0K PiA+ICBkcml2ZXJzL2kyYy9idXNzZXMvaTJjLW52aWRpYS1ncHUuYyAgICAgfCAzNjgNCj4gKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysNCj4gPiAgNSBmaWxlcyBjaGFuZ2VkLCA0MDMg aW5zZXJ0aW9ucygrKQ0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgRG9jdW1lbnRhdGlvbi9pMmMv YnVzc2VzL2kyYy1udmlkaWEtZ3B1DQo+ID4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2ky Yy9idXNzZXMvaTJjLW52aWRpYS1ncHUuYw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL0RvY3VtZW50 YXRpb24vaTJjL2J1c3Nlcy9pMmMtbnZpZGlhLWdwdQ0KPiA+IGIvRG9jdW1lbnRhdGlvbi9pMmMv YnVzc2VzL2kyYy1udmlkaWEtZ3B1DQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRl eCAwMDAwMDAwLi4zMTg4NGQyDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL0RvY3VtZW50 YXRpb24vaTJjL2J1c3Nlcy9pMmMtbnZpZGlhLWdwdQ0KPiA+IEBAIC0wLDAgKzEsMTggQEANCj4g PiArS2VybmVsIGRyaXZlciBpMmMtbnZpZGlhLWdwdQ0KPiA+ICsNCj4gPiArRGF0YXNoZWV0OiBu b3QgcHVibGljbHkgYXZhaWxhYmxlLg0KPiA+ICsNCj4gPiArQXV0aG9yczoNCj4gPiArCUFqYXkg R3VwdGEgPGFqYXlnQG52aWRpYS5jb20+DQo+ID4gKw0KPiA+ICtEZXNjcmlwdGlvbg0KPiA+ICst LS0tLS0tLS0tLQ0KPiA+ICsNCj4gPiAraTJjLW52aWRpYS1ncHUgaXMgYSBkcml2ZXIgZm9yIEky QyBjb250cm9sbGVyIGluY2x1ZGVkIGluIE5WSURJQQ0KPiA+ICtUdXJpbmcgYW5kIGxhdGVyIEdQ VXMgYW5kIGl0IGlzIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCBUeXBlLUMgY29udHJvbGxlcg0K PiBvbiBHUFVzLg0KPiA+ICsNCj4gPiArSWYgeW91ciAnbHNwY2kgLXYnIGxpc3Rpbmcgc2hvd3Mg c29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZywNCj4gPiArDQo+ID4gKzAxOjAwLjMgU2VyaWFs IGJ1cyBjb250cm9sbGVyIFswYzgwXTogTlZJRElBIENvcnBvcmF0aW9uIERldmljZSAxYWQ5DQo+ ID4gKyhyZXYgYTEpDQo+ID4gKw0KPiA+ICt0aGVuIHRoaXMgZHJpdmVyIHNob3VsZCBzdXBwb3J0 IHRoZSBJMkMgY29udHJvbGxlciBvZiB5b3VyIEdQVS4NCj4gPiBkaWZmIC0tZ2l0IGEvTUFJTlRB SU5FUlMgYi9NQUlOVEFJTkVSUyBpbmRleCBkODcwY2I1Li5iNzFiMGI0IDEwMDY0NA0KPiA+IC0t LSBhL01BSU5UQUlORVJTDQo+ID4gKysrIGIvTUFJTlRBSU5FUlMNCj4gPiBAQCAtNjc5OCw2ICs2 Nzk4LDEzIEBAIEw6CWxpbnV4LWFjcGlAdmdlci5rZXJuZWwub3JnDQo+ID4gIFM6CU1haW50YWlu ZWQNCj4gPiAgRjoJZHJpdmVycy9pMmMvaTJjLWNvcmUtYWNwaS5jDQo+ID4NCj4gPiArSTJDIENP TlRST0xMRVIgRFJJVkVSIEZPUiBOVklESUEgR1BVDQo+ID4gK006CUFqYXkgR3VwdGEgPGFqYXln QG52aWRpYS5jb20+DQo+ID4gK0w6CWxpbnV4LWkyY0B2Z2VyLmtlcm5lbC5vcmcNCj4gPiArUzoJ TWFpbnRhaW5lZA0KPiA+ICtGOglEb2N1bWVudGF0aW9uL2kyYy9idXNzZXMvaTJjLW52aWRpYS1n cHUNCj4gPiArRjoJZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1LmMNCj4gPiArDQo+ ID4gIEkyQyBNVVhFUw0KPiA+ICBNOglQZXRlciBSb3NpbiA8cGVkYUBheGVudGlhLnNlPg0KPiA+ ICBMOglsaW51eC1pMmNAdmdlci5rZXJuZWwub3JnDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv aTJjL2J1c3Nlcy9LY29uZmlnIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcNCj4gPiBpbmRl eCA0NTFkNGFlLi5lZWQ4MjdiIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9L Y29uZmlnDQo+ID4gKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL0tjb25maWcNCj4gPiBAQCAtMjI0 LDYgKzIyNCwxNSBAQCBjb25maWcgSTJDX05GT1JDRTJfUzQ5ODUNCj4gPiAgCSAgVGhpcyBkcml2 ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQ0KPiA+ ICAJICB3aWxsIGJlIGNhbGxlZCBpMmMtbmZvcmNlMi1zNDk4NS4NCj4gPg0KPiA+ICtjb25maWcg STJDX05WSURJQV9HUFUNCj4gPiArCXRyaXN0YXRlICJOVklESUEgR1BVIEkyQyBjb250cm9sbGVy Ig0KPiA+ICsJZGVwZW5kcyBvbiBQQ0kNCj4gPiArCWhlbHANCj4gPiArCSAgSWYgeW91IHNheSB5 ZXMgdG8gdGhpcyBvcHRpb24sIHN1cHBvcnQgd2lsbCBiZSBpbmNsdWRlZCBmb3IgdGhlDQo+ID4g KwkgIE5WSURJQSBHUFUgSTJDIGNvbnRyb2xsZXIgd2hpY2ggaXMgdXNlZCB0byBjb21tdW5pY2F0 ZSB3aXRoIHRoZQ0KPiBHUFUncw0KPiA+ICsJICBUeXBlLUMgY29udHJvbGxlci4gVGhpcyBkcml2 ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUgY2FsbGVkDQo+ID4gKwkgIGkyYy1udmlk aWEtZ3B1Lg0KPiA+ICsNCj4gPiAgY29uZmlnIEkyQ19TSVM1NTk1DQo+ID4gIAl0cmlzdGF0ZSAi U2lTIDU1OTUiDQo+ID4gIAlkZXBlbmRzIG9uIFBDSQ0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2kyYy9idXNzZXMvTWFrZWZpbGUgYi9kcml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUNCj4gPiBp bmRleCAxOGIyNmFmLi5kNDk5ODEzIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nl cy9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9NYWtlZmlsZQ0KPiA+IEBA IC0xNDAsNSArMTQwLDYgQEAgb2JqLSQoQ09ORklHX0kyQ19TSUJZVEUpCSs9IGkyYy1zaWJ5dGUu bw0KPiA+ICBvYmotJChDT05GSUdfSTJDX1hHRU5FX1NMSU1QUk8pICs9IGkyYy14Z2VuZS1zbGlt cHJvLm8NCj4gPiAgb2JqLSQoQ09ORklHX1NDeDIwMF9BQ0IpCSs9IHNjeDIwMF9hY2Iubw0KPiA+ ICBvYmotJChDT05GSUdfSTJDX0ZTSSkJCSs9IGkyYy1mc2kubw0KPiA+ICtvYmotJChDT05GSUdf STJDX05WSURJQV9HUFUpCSs9IGkyYy1udmlkaWEtZ3B1Lm8NCj4gPg0KPiA+ICBjY2ZsYWdzLSQo Q09ORklHX0kyQ19ERUJVR19CVVMpIDo9IC1EREVCVUcgZGlmZiAtLWdpdA0KPiA+IGEvZHJpdmVy cy9pMmMvYnVzc2VzL2kyYy1udmlkaWEtZ3B1LmMNCj4gPiBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9p MmMtbnZpZGlhLWdwdS5jDQo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAw MDAwLi4wYzE2YjBhDQo+ID4gLS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvaTJjL2J1 c3Nlcy9pMmMtbnZpZGlhLWdwdS5jDQo+ID4gQEAgLTAsMCArMSwzNjggQEANCj4gPiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjANCj4gPiArLyoNCj4gPiArICogTnZpZGlhIEdQ VSBJMkMgY29udHJvbGxlciBEcml2ZXINCj4gPiArICoNCj4gPiArICogQ29weXJpZ2h0IChDKSAy MDE4IE5WSURJQSBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCj4gPiArICogQXV0 aG9yOiBBamF5IEd1cHRhIDxhamF5Z0BudmlkaWEuY29tPiAgKi8gI2luY2x1ZGUgPGxpbnV4L2Rl bGF5Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4gI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPiAjaW5jbHVkZQ0KPiA+ICs8bGludXgvbW9kdWxlLmg+ICNpbmNsdWRlIDxsaW51eC9w Y2kuaD4gI2luY2x1ZGUNCj4gPiArPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPiAjaW5jbHVkZSA8 bGludXgvcG0uaD4gI2luY2x1ZGUNCj4gPiArPGxpbnV4L3BtX3J1bnRpbWUuaD4NCj4gPiArDQo+ ID4gKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+DQo+ID4gKw0KPiA+ICsvKiBJMkMgZGVmaW5p dGlvbnMgKi8NCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVEwJCQkJMHgwMA0KPiA+ICsjZGVmaW5l IEkyQ19NU1RfQ05UTF9HRU5fU1RBUlQJCQlCSVQoMCkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NO VExfR0VOX1NUT1AJCQlCSVQoMSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfQ01EX1JFQUQJ CQkoMSA8PCAyKQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9DTURfV1JJVEUJCQkoMiA8PCAy KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NISUZUCQk2DQo+ID4gKyNk ZWZpbmUgSTJDX01TVF9DTlRMX0dFTl9OQUNLCQkJQklUKDI4KQ0KPiA+ICsjZGVmaW5lIEkyQ19N U1RfQ05UTF9TVEFUVVMJCQlHRU5NQVNLKDMwLCAyOSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NO VExfU1RBVFVTX09LQVkJCSgwIDw8IDI5KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFU VVNfTk9fQUNLCQkoMSA8PCAyOSkNCj4gPiArI2RlZmluZSBJMkNfTVNUX0NOVExfU1RBVFVTX1RJ TUVPVVQJCSgyIDw8IDI5KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9TVEFUVVNfQlVTX0JV U1kJCSgzIDw8IDI5KQ0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQ05UTF9DWUNMRV9UUklHR0VSCQlC SVQoMzEpDQo+ID4gKw0KPiA+ICsjZGVmaW5lIEkyQ19NU1RfQUREUgkJCQkweDA0DQo+ID4gKw0K PiA+ICsjZGVmaW5lIEkyQ19NU1RfSTJDMF9USU1JTkcJCQkJMHgwOA0KPiA+ICsjZGVmaW5lIEky Q19NU1RfSTJDMF9USU1JTkdfU0NMX1BFUklPRF8xMDBLSFoJCTB4MTBlDQo+ID4gKyNkZWZpbmUg STJDX01TVF9JMkMwX1RJTUlOR19USU1FT1VUX0NMS19DTlQJCTE2DQo+ID4gKyNkZWZpbmUgSTJD X01TVF9JMkMwX1RJTUlOR19USU1FT1VUX0NMS19DTlRfTUFYCQkyNTUNCj4gPiArI2RlZmluZSBJ MkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0hFQ0sJCUJJVCgyNCkNCj4gPiArDQo+ID4gKyNk ZWZpbmUgSTJDX01TVF9EQVRBCQkJCQkweDBjDQo+ID4gKw0KPiA+ICsjZGVmaW5lIEkyQ19NU1Rf SFlCUklEX1BBRENUTAkJCQkweDIwDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9IWUJSSURfUEFEQ1RM X01PREVfSTJDCQkJQklUKDApDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9IWUJSSURfUEFEQ1RMX0ky Q19TQ0xfSU5QVVRfUkNWDQo+IAlCSVQoMTQpDQo+ID4gKyNkZWZpbmUgSTJDX01TVF9IWUJSSURf UEFEQ1RMX0kyQ19TREFfSU5QVVRfUkNWDQo+IAlCSVQoMTUpDQo+ID4gKw0KPiA+ICtzdHJ1Y3Qg Z3B1X2kyY19kZXYgew0KPiA+ICsJc3RydWN0IGRldmljZSAqZGV2Ow0KPiA+ICsJdm9pZCBfX2lv bWVtICpyZWdzOw0KPiA+ICsJc3RydWN0IGkyY19hZGFwdGVyIGFkYXB0ZXI7DQo+ID4gKwlzdHJ1 Y3QgaTJjX2JvYXJkX2luZm8gKmdwdV9jY2d4X3Vjc2k7IH07DQo+ID4gKw0KPiA+ICtzdGF0aWMg dm9pZCBncHVfZW5hYmxlX2kyY19idXMoc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkKSB7DQo+ID4g Kwl1MzIgdmFsOw0KPiA+ICsNCj4gPiArCS8qIGVuYWJsZSBJMkMgKi8NCj4gPiArCXZhbCA9IHJl YWRsKGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0hZQlJJRF9QQURDVEwpOw0KPiA+ICsJdmFsIHw9IEky Q19NU1RfSFlCUklEX1BBRENUTF9NT0RFX0kyQyB8DQo+ID4gKwkJSTJDX01TVF9IWUJSSURfUEFE Q1RMX0kyQ19TQ0xfSU5QVVRfUkNWIHwNCj4gPiArCQlJMkNfTVNUX0hZQlJJRF9QQURDVExfSTJD X1NEQV9JTlBVVF9SQ1Y7DQo+ID4gKwl3cml0ZWwodmFsLCBpMmNkLT5yZWdzICsgSTJDX01TVF9I WUJSSURfUEFEQ1RMKTsNCj4gPiArDQo+ID4gKwkvKiBlbmFibGUgMTAwS0haIG1vZGUgKi8NCj4g PiArCXZhbCA9IEkyQ19NU1RfSTJDMF9USU1JTkdfU0NMX1BFUklPRF8xMDBLSFo7DQo+ID4gKwl2 YWwgfD0gKEkyQ19NU1RfSTJDMF9USU1JTkdfVElNRU9VVF9DTEtfQ05UX01BWA0KPiA+ICsJICAg IDw8IEkyQ19NU1RfSTJDMF9USU1JTkdfVElNRU9VVF9DTEtfQ05UKTsNCj4gPiArCXZhbCB8PSBJ MkNfTVNUX0kyQzBfVElNSU5HX1RJTUVPVVRfQ0hFQ0s7DQo+ID4gKwl3cml0ZWwodmFsLCBpMmNk LT5yZWdzICsgSTJDX01TVF9JMkMwX1RJTUlORyk7IH0NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQg Z3B1X2kyY19jaGVja19zdGF0dXMoc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkKSB7DQo+ID4gKwl1 bnNpZ25lZCBsb25nIHRhcmdldCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOw0K PiA+ICsJdTMyIHZhbDsNCj4gPiArDQo+ID4gKwlkbyB7DQo+ID4gKwkJdmFsID0gcmVhZGwoaTJj ZC0+cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKwkJaWYgKCEodmFsICYgSTJDX01TVF9DTlRM X0NZQ0xFX1RSSUdHRVIpKQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQlpZiAoKHZhbCAmIEkyQ19N U1RfQ05UTF9TVEFUVVMpICE9DQo+ID4gKwkJCQlJMkNfTVNUX0NOVExfU1RBVFVTX0JVU19CVVNZ KQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7DQo+ID4g Kwl9IHdoaWxlICh0aW1lX2lzX2FmdGVyX2ppZmZpZXModGFyZ2V0KSk7DQo+ID4gKw0KPiA+ICsJ aWYgKHRpbWVfaXNfYmVmb3JlX2ppZmZpZXModGFyZ2V0KSkgew0KPiA+ICsJCWRldl9lcnIoaTJj ZC0+ZGV2LCAiaTJjIHRpbWVvdXQgZXJyb3IgJXhcbiIsIHZhbCk7DQo+ID4gKwkJcmV0dXJuIC1F VElNRTsNCj4gPiArCX0NCj4gPiArDQo+ID4gKwl2YWwgPSByZWFkbChpMmNkLT5yZWdzICsgSTJD X01TVF9DTlRMKTsNCj4gPiArCXN3aXRjaCAodmFsICYgSTJDX01TVF9DTlRMX1NUQVRVUykgew0K PiA+ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX09LQVk6DQo+ID4gKwkJcmV0dXJuIDA7DQo+ ID4gKwljYXNlIEkyQ19NU1RfQ05UTF9TVEFUVVNfTk9fQUNLOg0KPiA+ICsJCXJldHVybiAtRUlP Ow0KPiA+ICsJY2FzZSBJMkNfTVNUX0NOVExfU1RBVFVTX1RJTUVPVVQ6DQo+ID4gKwkJcmV0dXJu IC1FVElNRTsNCj4gPiArCWNhc2UgSTJDX01TVF9DTlRMX1NUQVRVU19CVVNfQlVTWToNCj4gPiAr CQlyZXR1cm4gLUVCVVNZOw0KPiA+ICsJZGVmYXVsdDoNCj4gPiArCQlyZXR1cm4gMDsNCj4gPiAr CX0NCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfaTJjX3JlYWQoc3RydWN0IGdw dV9pMmNfZGV2ICppMmNkLCB1OCAqZGF0YSwgdTE2IGxlbikNCj4gPiArew0KPiA+ICsJaW50IHN0 YXR1czsNCj4gPiArCXUzMiB2YWw7DQo+ID4gKw0KPiA+ICsJdmFsID0gSTJDX01TVF9DTlRMX0dF Tl9TVEFSVCB8IEkyQ19NU1RfQ05UTF9DTURfUkVBRCB8DQo+ID4gKwkJKGxlbiA8PCBJMkNfTVNU X0NOVExfQlVSU1RfU0laRV9TSElGVCkgfA0KPiA+ICsJCUkyQ19NU1RfQ05UTF9DWUNMRV9UUklH R0VSIHwNCj4gSTJDX01TVF9DTlRMX0dFTl9OQUNLOw0KPiA+ICsJd3JpdGVsKHZhbCwgaTJjZC0+ cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKw0KPiA+ICsJc3RhdHVzID0gZ3B1X2kyY19jaGVj a19zdGF0dXMoaTJjZCk7DQo+ID4gKwlpZiAoc3RhdHVzIDwgMCkNCj4gPiArCQlyZXR1cm4gc3Rh dHVzOw0KPiA+ICsNCj4gPiArCXZhbCA9IHJlYWRsKGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0RBVEEp Ow0KPiA+ICsJc3dpdGNoIChsZW4pIHsNCj4gPiArCWNhc2UgMToNCj4gPiArCQlkYXRhWzBdID0g dmFsOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJY2FzZSAyOg0KPiA+ICsJCXB1dF91bmFsaWduZWRf YmUxNih2YWwsIGRhdGEpOw0KPiA+ICsJCWJyZWFrOw0KPiA+ICsJY2FzZSAzOg0KPiA+ICsJCXB1 dF91bmFsaWduZWRfYmUxNih2YWwgPj4gOCwgZGF0YSk7DQo+ID4gKwkJZGF0YVsyXSA9IHZhbDsN Cj4gPiArCQlicmVhazsNCj4gPiArCWNhc2UgNDoNCj4gPiArCQlwdXRfdW5hbGlnbmVkX2JlMzIo dmFsLCBkYXRhKTsNCj4gPiArCQlicmVhazsNCj4gPiArCWRlZmF1bHQ6DQo+ID4gKwkJYnJlYWs7 DQo+ID4gKwl9DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9DQo+ID4gKw0KPiANCj4gSSdt IG91dCBvbiBhIGxpbWIgaGVyZSBhbmQgb2J2aW91c2x5IGRvbid0IGhhdmUgZG9jdW1lbnRhdGlv biwgYnV0IGNvdWxkIHlvdQ0KPiB0cnkgdG8gYWRkIGEgZnVuY3Rpb24gbGlrZSB0aGlzDQo+IA0K PiBzdGF0aWMgaW50IGdwdV9pMmNfcmVhZF9ieXRlKHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCwg dTggKmRhdGEpIHsNCj4gCWludCBzdGF0dXM7DQo+IAl1MzIgdmFsOw0KPiANCj4gCXZhbCA9IEky Q19NU1RfQ05UTF9DTURfUkVBRCB8ICgxIDw8DQo+IEkyQ19NU1RfQ05UTF9CVVJTVF9TSVpFX1NI SUZUKSB8DQo+IAkJSTJDX01TVF9DTlRMX0dFTl9OQUNLOw0KPiAJd3JpdGVsKHZhbCwgaTJjZC0+ cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+IA0KPiAJc3RhdHVzID0gZ3B1X2kyY19jaGVja19zdGF0 dXMoaTJjZCk7DQo+IAlpZiAoc3RhdHVzIDwgMCkNCj4gCQlyZXR1cm4gc3RhdHVzOw0KPiANCj4g CSpkYXRhID0gcmVhZGwoaTJjZC0+cmVncyArIEkyQ19NU1RfREFUQSk7DQo+IA0KPiAJcmV0dXJu IHN0YXR1czsNCj4gfQ0KPiANCj4gKGkuZS4gSSdtIGF0dGVtcHRpbmcgdG8ganVzdCByZWFkIGJ5 dGVzIHcvbyBkb2luZyBhbnkgc3RhcnRzLCBhZGRyZXNzZXMgZXRjLCBqdXN0DQo+IGxpa2UgdGhl IGdwdV9pMmNfd3JpdGUgZnVuY3Rpb24gZG9lcyBmb3Igd3JpdGVzKQ0KPiANCj4gYW5kIHRoZW4g Li4uDQo+IA0KPiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfc3RhcnQoc3RydWN0IGdwdV9pMmNfZGV2 ICppMmNkKSB7DQo+ID4gKwl3cml0ZWwoSTJDX01TVF9DTlRMX0dFTl9TVEFSVCwgaTJjZC0+cmVn cyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKwlyZXR1cm4gZ3B1X2kyY19jaGVja19zdGF0dXMoaTJj ZCk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19zdG9wKHN0cnVjdCBn cHVfaTJjX2RldiAqaTJjZCkgew0KPiA+ICsJd3JpdGVsKEkyQ19NU1RfQ05UTF9HRU5fU1RPUCwg aTJjZC0+cmVncyArIEkyQ19NU1RfQ05UTCk7DQo+ID4gKwlyZXR1cm4gZ3B1X2kyY19jaGVja19z dGF0dXMoaTJjZCk7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY193cml0 ZShzdHJ1Y3QgZ3B1X2kyY19kZXYgKmkyY2QsIHU4IGRhdGEpIHsNCj4gPiArCXUzMiB2YWw7DQo+ ID4gKw0KPiA+ICsJd3JpdGVsKGRhdGEsIGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0RBVEEpOw0KPiA+ ICsNCj4gPiArCXZhbCA9IEkyQ19NU1RfQ05UTF9DTURfV1JJVEUgfCAoMSA8PA0KPiBJMkNfTVNU X0NOVExfQlVSU1RfU0laRV9TSElGVCkgfA0KPiA+ICsJCUkyQ19NU1RfQ05UTF9HRU5fTkFDSzsN Cj4gPiArCXdyaXRlbCh2YWwsIGkyY2QtPnJlZ3MgKyBJMkNfTVNUX0NOVEwpOw0KPiA+ICsNCj4g PiArCXJldHVybiBncHVfaTJjX2NoZWNrX3N0YXR1cyhpMmNkKTsNCj4gPiArfQ0KPiA+ICsNCj4g PiArc3RhdGljIGludCBncHVfaTJjX21hc3Rlcl94ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRh cCwNCj4gPiArCQkJICAgICAgIHN0cnVjdCBpMmNfbXNnICptc2dzLCBpbnQgbnVtKSB7DQo+ID4g KwlzdHJ1Y3QgZ3B1X2kyY19kZXYgKmkyY2QgPSBpMmNfZ2V0X2FkYXBkYXRhKGFkYXApOw0KPiA+ ICsJaW50IHN0YXR1cywgc3RhdHVzMjsNCj4gPiArCWludCBpLCBqOw0KPiA+ICsNCj4gPiArCWZv ciAoaSA9IDA7IGkgPCBudW07IGkrKykgew0KPiA+ICsJCWlmIChtc2dzW2ldLmZsYWdzICYgSTJD X01fUkQpIHsNCj4gPiArCQkJLyogcHJvZ3JhbSBjbGllbnQgYWRkcmVzcyBiZWZvcmUgc3RhcnRp bmcgcmVhZCAqLw0KPiA+ICsJCQl3cml0ZWwobXNnc1tpXS5hZGRyLCBpMmNkLT5yZWdzICsgSTJD X01TVF9BRERSKTsNCj4gPiArCQkJLyogZ3B1X2kyY19yZWFkIGhhcyBpbXBsaWNpdCBzdGFydCAq Lw0KPiA+ICsJCQlzdGF0dXMgPSBncHVfaTJjX3JlYWQoaTJjZCwgbXNnc1tpXS5idWYsIG1zZ3Nb aV0ubGVuKTsNCj4gDQo+IC4uLiByZXBsYWNlIHRoZSB0aGlyZCBhcmcgd2l0aCBhIGhhcmQtY29k ZWQgMSwgbGlrZSB0aGlzDQo+IA0KPiAJCQlzdGF0dXMgPSBncHVfaTJjX3JlYWQoaTJjZCwgbXNn c1tpXS5idWYsIDEpOw0KPiANCj4gYW5kIC4uLg0KPiANCj4gPiArCQkJaWYgKHN0YXR1cyA8IDAp IHsNCj4gPiArCQkJCWlmIChpID09IDApDQo+ID4gKwkJCQkJcmV0dXJuIHN0YXR1czsNCj4gPiAr CQkJCWdvdG8gc3RvcDsNCj4gPiArCQkJfQ0KPiANCj4gLi4uIGFkZCBhIGxvb3AgaGVyZSwgbGlr ZSBzbw0KPiANCj4gCQkJZm9yIChqID0gMTsgaiA8IG1zZ3NbaV0ubGVuOyBqKyspIHsNCj4gCQkJ CXN0YXR1cyA9IGdwdV9pMmNfcmVhZF9ieXRlKGkyY2QsDQo+IAkJCQkJCQkgICAmbXNnc1tpXS5i dWZbal0pOw0KPiAJCQkJaWYgKHN0YXR1cyA8IDApDQo+IAkJCQkJZ290byBzdG9wOw0KPiAJCQl9 DQo+IA0KPiB0aGVuIEkgd29uZGVyIGlmIGl0IHN0aWxsIHdvcmtzPyANCkl0IGRpZG4ndCB3b3Jr Lg0KDQo+IElmIGl0IGRvZXMsIHlvdSBtYXkgcmVtb3ZlIHRoZSBiZWxvdw0KPiBtYXhfcmVhZF9s ZW4gcXVpcmssIGFuZCB0aGUgbWVzc2FnZSBzcGxpdHRpbmcgaW4gdGhlIHBhdGNoIDIvMiBjYW4g YWxzbyBiZQ0KPiB6YXBwZWQuDQo+IA0KPiBGdXJ0aGVyLCBpZiBpdCB3b3JrcywgaXQgc2hvdWxk IGJlIHBvc3NpYmxlIHRvIG9wdGltaXplIHRoaXMgYW5kIHJlYWQgaW4gY2h1bmtzIG9mDQo+IGZv dXIgaW5zdGVhZCBvZiBieXRlLWJ5LWJ5dGUuIFRoZSByZWFzb24gSSBoYXJkLWNvZGUgdGhlIGxl bmd0aCB0byAxIGluIHRoZQ0KPiBncHVfaTJjX3JlYWQgY2FsbCBpcyB0byBmb3JjZSB0aGUgbG9v cCB0byBiZSB1c2VkIGZvciB0ZXN0aW5nIHdpdGggdGhlIGV4aXN0aW5nDQo+IGNsaWVudCB3aGlj aCBsaW1pdHMgcmVhZHMgdG8gZm91ciBieXRlcy4NCj4gU28sIGlmIHRoZSByZWFkIGxvb3Agd29y a3MsIHRoZW4gaXQncyB0aW1lIHRvIGluc3RlYWQgY2FsbCBncHVfaTJjX3JlYWQgd2l0aCBhDQo+ IGxlbmd0aCB0aGF0IGlzIHRoZSBtaW5pbXVtIG9mIG1zZ3NbaV0ubGVuIGFuZCA0LCBhbmQgdG8g c3RhcnQgdGhlIHJlYWQgbG9vcA0KPiB3aXRoIGogPSA0IGluc3RlYWQgb2YgaiA9IDEuDQo+IA0K PiBJZiBpdCBkb2Vzbid0IHdvcmssIG1heWJlIHlvdSBjYW4gdHdlYWsgc29tZXRoaW5nIGluIGdw dV9pMmNfcmVhZF9ieXRlIHRvDQo+IG1ha2UgaXQgd29yaz8NCkkgdHJpZWQgYSBmZXcgdHdlYWtz IGJ1dCBpdCBkaWRuJ3Qgd29yayB0aGF0IHdheS4gSSB0aGluayBpdCBtYXkgdGFrZSB0aW1lIHRv IGdldCANCnRoaXMgcGFydCB3b3JraW5nLg0KDQpDYW4gd2UgdXBkYXRlIHRoaXMgcGFydCBsYXRl ciB3aGVuIHdlIGhhdmUgaXQgd29ya2luZyBhbmQgbGV0IHRoaXMgcGF0Y2ggbWVyZ2VkPw0KDQpU aGFua3MNCkFqYXkNCi0tbnZwdWJsaWMNCj4gSG1tLCBtYXliZSB0aGUgcmVhZCBsb29wIHNob3Vs ZCBiZSBtb3ZlZCBpbnRvIGdwdV9pMmNfcmVhZCBzbyB0aGF0IHRoaXMNCj4gZnVuY3Rpb24gaXMg a2VwdCBhcy1pcz8gQnV0IHRoYXQncyBmb3IgbGF0ZXIuIA0KPiBJZiB5b3UgZG8gYSB0ZXN0IGFz IEkgc3VnZ2VzdCBhYm92ZSwNCj4gd2Ugd2lsbCBrbm93IGlmIGl0J3MgcG9zc2libGUgdG8gZG8g YSByZWFkIGxvb3AgYXQgYWxsLg0KPiBIb3cgdGhhdCByZWFkIGxvb3AgY29kZSBzaG91bGQgZXZl bnR1YWxseSBsb29rIGlzIGFub3RoZXIgbWF0dGVyLi4uDQo+IA0KPiBDaGVlcnMsDQo+IFBldGVy DQo+IA0KPiA+ICsJCX0gZWxzZSB7DQo+ID4gKwkJCXU4IGFkZHIgPSBpMmNfOGJpdF9hZGRyX2Zy b21fbXNnKG1zZ3MgKyBpKTsNCj4gPiArDQo+ID4gKwkJCXN0YXR1cyA9IGdwdV9pMmNfc3RhcnQo aTJjZCk7DQo+ID4gKwkJCWlmIChzdGF0dXMgPCAwKSB7DQo+ID4gKwkJCQlpZiAoaSA9PSAwKQ0K PiA+ICsJCQkJCXJldHVybiBzdGF0dXM7DQo+ID4gKwkJCQlnb3RvIHN0b3A7DQo+ID4gKwkJCX0N Cj4gPiArDQo+ID4gKwkJCXN0YXR1cyA9IGdwdV9pMmNfd3JpdGUoaTJjZCwgYWRkcik7DQo+ID4g KwkJCWlmIChzdGF0dXMgPCAwKQ0KPiA+ICsJCQkJZ290byBzdG9wOw0KPiA+ICsNCj4gPiArCQkJ Zm9yIChqID0gMDsgaiA8IG1zZ3NbaV0ubGVuOyBqKyspIHsNCj4gPiArCQkJCXN0YXR1cyA9IGdw dV9pMmNfd3JpdGUoaTJjZCwgbXNnc1tpXS5idWZbal0pOw0KPiA+ICsJCQkJaWYgKHN0YXR1cyA8 IDApDQo+ID4gKwkJCQkJZ290byBzdG9wOw0KPiA+ICsJCQl9DQo+ID4gKwkJfQ0KPiA+ICsJfQ0K PiA+ICsJc3RhdHVzID0gZ3B1X2kyY19zdG9wKGkyY2QpOw0KPiA+ICsJaWYgKHN0YXR1cyA8IDAp DQo+ID4gKwkJcmV0dXJuIHN0YXR1czsNCj4gPiArCXJldHVybiBpOw0KPiA+ICtzdG9wOg0KPiA+ ICsJc3RhdHVzMiA9IGdwdV9pMmNfc3RvcChpMmNkKTsNCj4gPiArCWlmIChzdGF0dXMyIDwgMCkN Cj4gPiArCQlkZXZfZXJyKGkyY2QtPmRldiwgImkyYyBzdG9wIGZhaWxlZCAlZFxuIiwgc3RhdHVz Mik7DQo+ID4gKwlyZXR1cm4gc3RhdHVzOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgY29u c3Qgc3RydWN0IGkyY19hZGFwdGVyX3F1aXJrcyBncHVfaTJjX3F1aXJrcyA9IHsNCj4gPiArCS5t YXhfcmVhZF9sZW4gPSA0LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIHUzMiBncHVfaTJj X2Z1bmN0aW9uYWxpdHkoc3RydWN0IGkyY19hZGFwdGVyICphZGFwKSB7DQo+ID4gKwlyZXR1cm4g STJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTDsgfQ0KPiA+ICsNCj4gPiArc3RhdGlj IGNvbnN0IHN0cnVjdCBpMmNfYWxnb3JpdGhtIGdwdV9pMmNfYWxnb3JpdGhtID0gew0KPiA+ICsJ Lm1hc3Rlcl94ZmVyCT0gZ3B1X2kyY19tYXN0ZXJfeGZlciwNCj4gPiArCS5mdW5jdGlvbmFsaXR5 CT0gZ3B1X2kyY19mdW5jdGlvbmFsaXR5LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoNCj4gPiAr ICogVGhpcyBkcml2ZXIgaXMgZm9yIE52aWRpYSBHUFUgY2FyZHMgd2l0aCBVU0IgVHlwZS1DIGlu dGVyZmFjZS4NCj4gPiArICogV2Ugd2FudCB0byBpZGVudGlmeSB0aGUgY2FyZHMgdXNpbmcgdmVu ZG9yIElEIGFuZCBjbGFzcyBjb2RlIG9ubHkNCj4gPiArICogdG8gYXZvaWQgZGVwZW5kZW5jeSBv ZiBhZGRpbmcgcHJvZHVjdCBpZCBmb3IgYW55IG5ldyBjYXJkIHdoaWNoDQo+ID4gKyAqIHJlcXVp cmVzIHRoaXMgZHJpdmVyLg0KPiA+ICsgKiBDdXJyZW50bHkgdGhlcmUgaXMgbm8gY2xhc3MgY29k ZSBkZWZpbmVkIGZvciBVQ1NJIGRldmljZSBvdmVyIFBDSQ0KPiA+ICsgKiBzbyB1c2luZyBVTktO T1dOIGNsYXNzIGZvciBub3cgYW5kIGl0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIFVDU0kNCj4gPiAr ICogb3ZlciBQQ0kgZ2V0cyBhIGNsYXNzIGNvZGUuDQo+ID4gKyAqIFRoZXJlIGlzIG5vIG90aGVy IE5WSURJQSBjYXJkcyB3aXRoIFVOS05PV04gY2xhc3MgY29kZS4gRXZlbiBpZg0KPiA+ICt0aGUN Cj4gPiArICogZHJpdmVyIGdldHMgbG9hZGVkIGZvciBhbiB1bmRlc2lyZWQgY2FyZCB0aGVuIGV2 ZW50dWFsbHkNCj4gPiAraTJjX3JlYWQoKQ0KPiA+ICsgKiAoaW5pdGlhdGVkIGZyb20gVUNTSSBp MmNfY2xpZW50KSB3aWxsIHRpbWVvdXQgb3IgVUNTSSBjb21tYW5kcw0KPiA+ICt3aWxsDQo+ID4g KyAqIHRpbWVvdXQuDQo+ID4gKyAqLw0KPiA+ICsjZGVmaW5lIFBDSV9DTEFTU19TRVJJQUxfVU5L Tk9XTgkweDBjODANCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGdwdV9p MmNfaWRzW10gPSB7DQo+ID4gKwl7IFBDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfQU5ZX0lELCBQ Q0lfQU5ZX0lELCBQQ0lfQU5ZX0lELA0KPiA+ICsJCVBDSV9DTEFTU19TRVJJQUxfVU5LTk9XTiA8 PCA4LCAweGZmZmZmZjAwfSwNCj4gPiArCXsgfQ0KPiA+ICt9Ow0KPiA+ICtNT0RVTEVfREVWSUNF X1RBQkxFKHBjaSwgZ3B1X2kyY19pZHMpOw0KPiA+ICsNCj4gPiArc3RhdGljIGludCBncHVfcG9w dWxhdGVfY2xpZW50KHN0cnVjdCBncHVfaTJjX2RldiAqaTJjZCwgaW50IGlycSkgew0KPiA+ICsJ c3RydWN0IGkyY19jbGllbnQgKmNjZ3hfY2xpZW50Ow0KPiA+ICsNCj4gPiArCWkyY2QtPmdwdV9j Y2d4X3Vjc2kgPSBkZXZtX2t6YWxsb2MoaTJjZC0+ZGV2LA0KPiA+ICsJCQkJCSAgIHNpemVvZihz dHJ1Y3QgaTJjX2JvYXJkX2luZm8pLA0KPiA+ICsJCQkJCSAgIEdGUF9LRVJORUwpOw0KPiA+ICsJ aWYgKCFpMmNkLT5ncHVfY2NneF91Y3NpKQ0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+ICsN Cj4gPiArCXN0cmxjcHkoaTJjZC0+Z3B1X2NjZ3hfdWNzaS0+dHlwZSwgImNjZ3gtdWNzaSIsDQo+ ID4gKwkJc2l6ZW9mKGkyY2QtPmdwdV9jY2d4X3Vjc2ktPnR5cGUpKTsNCj4gPiArCWkyY2QtPmdw dV9jY2d4X3Vjc2ktPmFkZHIgPSAweDg7DQo+ID4gKwlpMmNkLT5ncHVfY2NneF91Y3NpLT5pcnEg PSBpcnE7DQo+ID4gKwljY2d4X2NsaWVudCA9IGkyY19uZXdfZGV2aWNlKCZpMmNkLT5hZGFwdGVy LCBpMmNkLT5ncHVfY2NneF91Y3NpKTsNCj4gPiArCWlmICghY2NneF9jbGllbnQpDQo+ID4gKwkJ cmV0dXJuIC1FTk9ERVY7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ ID4gK3N0YXRpYyBpbnQgZ3B1X2kyY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qg c3RydWN0DQo+ID4gK3BjaV9kZXZpY2VfaWQgKmlkKSB7DQo+ID4gKwlzdHJ1Y3QgZ3B1X2kyY19k ZXYgKmkyY2Q7DQo+ID4gKwlpbnQgc3RhdHVzOw0KPiA+ICsNCj4gPiArCWkyY2QgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBncHVfaTJjX2RldiksDQo+IEdGUF9LRVJO RUwpOw0KPiA+ICsJaWYgKCFpMmNkKQ0KPiA+ICsJCXJldHVybiAtRU5PTUVNOw0KPiA+ICsNCj4g PiArCWkyY2QtPmRldiA9ICZwZGV2LT5kZXY7DQo+ID4gKwlkZXZfc2V0X2RydmRhdGEoJnBkZXYt PmRldiwgaTJjZCk7DQo+ID4gKw0KPiA+ICsJc3RhdHVzID0gcGNpbV9lbmFibGVfZGV2aWNlKHBk ZXYpOw0KPiA+ICsJaWYgKHN0YXR1cyA8IDApIHsNCj4gPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYs ICJwY2ltX2VuYWJsZV9kZXZpY2UgZmFpbGVkICVkXG4iLA0KPiBzdGF0dXMpOw0KPiA+ICsJCXJl dHVybiBzdGF0dXM7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcGNpX3NldF9tYXN0ZXIocGRldik7 DQo+ID4gKw0KPiA+ICsJaTJjZC0+cmVncyA9IHBjaW1faW9tYXAocGRldiwgMCwgMCk7DQo+ID4g KwlpZiAoIWkyY2QtPnJlZ3MpIHsNCj4gPiArCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwY2ltX2lv bWFwIGZhaWxlZFxuIik7DQo+ID4gKwkJcmV0dXJuIC1FTk9NRU07DQo+ID4gKwl9DQo+ID4gKw0K PiA+ICsJc3RhdHVzID0gcGNpX2FsbG9jX2lycV92ZWN0b3JzKHBkZXYsIDEsIDEsIFBDSV9JUlFf TVNJKTsNCj4gPiArCWlmIChzdGF0dXMgPCAwKSB7DQo+ID4gKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAicGNpX2FsbG9jX2lycV92ZWN0b3JzIGVyciAlZFxuIiwNCj4gc3RhdHVzKTsNCj4gPiArCQly ZXR1cm4gc3RhdHVzOw0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCWdwdV9lbmFibGVfaTJjX2J1cyhp MmNkKTsNCj4gPiArDQo+ID4gKwlpMmNfc2V0X2FkYXBkYXRhKCZpMmNkLT5hZGFwdGVyLCBpMmNk KTsNCj4gPiArCWkyY2QtPmFkYXB0ZXIub3duZXIgPSBUSElTX01PRFVMRTsNCj4gPiArCXN0cmxj cHkoaTJjZC0+YWRhcHRlci5uYW1lLCAiTlZJRElBIEdQVSBJMkMgYWRhcHRlciIsDQo+ID4gKwkJ c2l6ZW9mKGkyY2QtPmFkYXB0ZXIubmFtZSkpOw0KPiA+ICsJaTJjZC0+YWRhcHRlci5hbGdvID0g JmdwdV9pMmNfYWxnb3JpdGhtOw0KPiA+ICsJaTJjZC0+YWRhcHRlci5xdWlya3MgPSAmZ3B1X2ky Y19xdWlya3M7DQo+ID4gKwlpMmNkLT5hZGFwdGVyLmRldi5wYXJlbnQgPSAmcGRldi0+ZGV2Ow0K PiA+ICsJc3RhdHVzID0gaTJjX2FkZF9hZGFwdGVyKCZpMmNkLT5hZGFwdGVyKTsNCj4gPiArCWlm IChzdGF0dXMgPCAwKQ0KPiA+ICsJCWdvdG8gZnJlZV9pcnFfdmVjdG9yczsNCj4gPiArDQo+ID4g KwlzdGF0dXMgPSBncHVfcG9wdWxhdGVfY2xpZW50KGkyY2QsIHBkZXYtPmlycSk7DQo+ID4gKwlp ZiAoc3RhdHVzIDwgMCkgew0KPiA+ICsJCWRldl9lcnIoJnBkZXYtPmRldiwgImdwdV9wb3B1bGF0 ZV9jbGllbnQgZmFpbGVkICVkXG4iLA0KPiBzdGF0dXMpOw0KPiA+ICsJCWdvdG8gZGVsX2FkYXB0 ZXI7DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICtkZWxfYWRh cHRlcjoNCj4gPiArCWkyY19kZWxfYWRhcHRlcigmaTJjZC0+YWRhcHRlcik7DQo+ID4gK2ZyZWVf aXJxX3ZlY3RvcnM6DQo+ID4gKwlwY2lfZnJlZV9pcnFfdmVjdG9ycyhwZGV2KTsNCj4gPiArCXJl dHVybiBzdGF0dXM7DQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyB2b2lkIGdwdV9pMmNfcmVt b3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KSB7DQo+ID4gKwlzdHJ1Y3QgZ3B1X2kyY19kZXYgKmky Y2QgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7DQo+ID4gKw0KPiA+ICsJaTJjX2RlbF9h ZGFwdGVyKCZpMmNkLT5hZGFwdGVyKTsNCj4gPiArCXBjaV9mcmVlX2lycV92ZWN0b3JzKHBkZXYp Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IGdwdV9pMmNfcmVzdW1lKHN0cnVjdCBk ZXZpY2UgKmRldikgew0KPiA+ICsJc3RydWN0IGdwdV9pMmNfZGV2ICppMmNkID0gZGV2X2dldF9k cnZkYXRhKGRldik7DQo+ID4gKw0KPiA+ICsJZ3B1X2VuYWJsZV9pMmNfYnVzKGkyY2QpOw0KPiA+ ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gK1VOSVZFUlNBTF9ERVZfUE1fT1BTKGdw dV9pMmNfZHJpdmVyX3BtLCBOVUxMLCBncHVfaTJjX3Jlc3VtZSwNCj4gTlVMTCk7DQo+ID4gKw0K PiA+ICtzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZ3B1X2kyY19kcml2ZXIgPSB7DQo+ID4gKwku bmFtZQkJPSAibnZpZGlhLWdwdSIsDQo+ID4gKwkuaWRfdGFibGUJPSBncHVfaTJjX2lkcywNCj4g PiArCS5wcm9iZQkJPSBncHVfaTJjX3Byb2JlLA0KPiA+ICsJLnJlbW92ZQkJPSBncHVfaTJjX3Jl bW92ZSwNCj4gPiArCS5kcml2ZXIJCT0gew0KPiA+ICsJCS5wbQk9ICZncHVfaTJjX2RyaXZlcl9w bSwNCj4gPiArCX0sDQo+ID4gK307DQo+ID4gKw0KPiA+ICttb2R1bGVfcGNpX2RyaXZlcihncHVf aTJjX2RyaXZlcik7DQo+ID4gKw0KPiA+ICtNT0RVTEVfQVVUSE9SKCJBamF5IEd1cHRhIDxhamF5 Z0BudmlkaWEuY29tPiIpOw0KPiA+ICtNT0RVTEVfREVTQ1JJUFRJT04oIk52aWRpYSBHUFUgSTJD IGNvbnRyb2xsZXIgRHJpdmVyIik7DQo+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsNCj4g Pgo=