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: [7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Thierry Reding Message-Id: <20190225121523.GB29444@ulmo> Date: Mon, 25 Feb 2019 13:15:23 +0100 To: Nagarjuna Kristam Cc: balbi@kernel.org, gregkh@linuxfoundation.org, jonathanh@nvidia.com, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org List-ID: T24gVGh1LCBGZWIgMTQsIDIwMTkgYXQgMDg6MjI6MzRQTSArMDUzMCwgTmFnYXJqdW5hIEtyaXN0 YW0gd3JvdGU6Cj4gCj4gCj4gT24gMDQtMDItMjAxOSAxOToyNiwgVGhpZXJyeSBSZWRpbmcgd3Jv dGU6Cj4gPiBPbiBUaHUsIEphbiAwMywgMjAxOSBhdCAwMzozNDo1OFBNICswNTMwLCBOYWdhcmp1 bmEgS3Jpc3RhbSB3cm90ZToKPiA+PiBUaGlzIHBhdGNoIGFkZHMgVURDIGRyaXZlciBmb3IgdGVn cmEgWFVTQiAzLjAgZGV2aWNlIG1vZGUgY29udHJvbGxlci4KPiA+PiBYVVNCIGRldmljZSBtb2Rl IGNvbnRyb2xsZXIgc3VwcG9ydCBTUywgSFMgYW5kIEZTIG1vZGVzCj4gPj4KPiA+PiBCYXNlZCBv biB3b3JrIGJ5Ogo+ID4+ICAgTWFyayBLdW8gPG1rdW9AbnZpZGlhLmNvbT4KPiA+PiAgIEFuZHJl dyBCcmVzdGlja2VyIDxhYnJlc3RpY0BjaHJvbWl1bS5vcmc+Cj4gPj4KPiA+PiBTaWduZWQtb2Zm LWJ5OiBOYWdhcmp1bmEgS3Jpc3RhbSA8bmtyaXN0YW1AbnZpZGlhLmNvbT4KPiA+PiAtLS0KPiA+ PiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgfCAgIDExICsKPiA+PiAgZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZSAgICAgfCAgICAxICsKPiA+PiAgZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMgfCAzODIxICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCj4gPj4gIDMgZmlsZXMgY2hhbmdlZCwgMzgzMyBpbnNlcnRpb25zKCspCj4g Pj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3RlZ3JhX3h1ZGMu Ywo+ID4+Cj4gPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZyBi L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwo+ID4+IGluZGV4IDBhMTZjYmQuLjMxNjY1 ZTcgMTAwNjQ0Cj4gPj4gLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnCj4gPj4g KysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnCj4gPj4gQEAgLTQzOSw2ICs0Mzks MTcgQEAgY29uZmlnIFVTQl9HQURHRVRfWElMSU5YCj4gPj4gIAkgIGR5bmFtaWNhbGx5IGxpbmtl ZCBtb2R1bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCj4gPj4gIAkgIGdhZGdl dCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgo+ID4+ICAKPiA+PiArY29u ZmlnIFVTQl9URUdSQV9YVURDCj4gPj4gKwl0cmlzdGF0ZSAiTlZJRElBIFN1cGVyc3BlZWQgVVNC IDMuMCBEZXZpY2UgQ29udHJvbGxlciIKPiA+PiArCWRlcGVuZHMgb24gQVJDSF9URUdSQQo+ID4+ ICsJZGVmYXVsdCBuCj4gPiAKPiA+ICJkZWZhdWx0IG4iIGlzIHRoZSBkZWZhdWx0LCBzbyB5b3Ug Y2FuIGRyb3AgdGhpcyBsaW5lLgo+ID4gCj4gPj4gKwloZWxwCj4gPj4gKwkgRW5hYmxlcyBURUdS QSBVU0IgMy4wIGRldmljZSBtb2RlIGNvbnRyb2xsZXIgZHJpdmVyLgo+ID4+ICsKPiA+PiArCSBT YXkgInkiIHRvIGxpbmsgdGhlIGRyaXZlciBzdGF0aWNhbGx5LCBvciAibSIgdG8gYnVpbGQgYQo+ ID4+ICsJIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJ0ZWdyYV94dWRjIiBhbmQg Zm9yY2UgYWxsCj4gPiAKPiA+ICJ0ZWdyYS14dWRjIiwgc2VlIGJlbG93Lgo+ID4gCj4gCj4gYWxs IGZpbGVzIGluIHVkYyBmb2xkZXIgdXNlcyBfIGFuZCBoZW5jZSB1c2VkIF8uIElmIHBvbGljeSBm b3IgdGVncmEgb3ZlcnJpZGVzCj4gZm9sZGVyIG5hbWluZyBjb252ZW50aW9uLCB3aWxsIHJlbmFt ZSBhY2NvcmRpbmdseS4gUGxlYXNlIHNoYXJlIHlvdXIgdmlld3MuCgpGZWxpcGUgd291bGQgaGF2 ZSB0byBhbnN3ZXIgd2hldGhlciB0aGVyZSdzIGEgc3RyaWN0IHJ1bGUgaW4gdGhlIGdhZGdldApz dWJzeXN0ZW0uIExldCdzIGFzc3VtZSBmb3Igbm93IHRoYXQgdGhlcmUgaXMgYW5kIGtlZXAgdGhl IHVuZGVyc2NvcmUuCgo+ID4+ICsJIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2Fs bHkgbGlua2VkLgo+ID4+ICsKPiA+PiAgc291cmNlICJkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL0tjb25maWciCj4gPj4gIAo+ID4+ICAjCj4gPj4gK3N0YXRpYyB2b2lkIHRlZ3Jh X3h1ZGNfZGV2aWNlX21vZGVfb24oc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gPj4gK3sKPiA+ PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPj4gKwlpbnQgZXJyOwo+ID4+ICsKPiA+PiArCXNw aW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gPj4gKwlpZiAoeHVkYy0+ZGV2 aWNlX21vZGUpIHsKPiA+PiArCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBm bGFncyk7Cj4gPj4gKwkJcmV0dXJuOwo+ID4+ICsJfQo+ID4+ICsJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4gCj4gPiBJJ20gbm90IHN1cmUgSSB1bmRlcnN0 YW5kIHdoYXQgeW91J3JlIHRyeWluZyB0byBhY2hpdmUgaGVyZS4gVGhpcwo+ID4gbG9ja2luZyBk b2Vzbid0IGJ1eSB5b3UgYW55dGhpbmcgYXQgYWxsLiBGaXJzdCwgeW91J3JlIG5vdCBwcm90ZWN0 aW5nIGEKPiA+IHJhY2UgY29uZGl0aW9uIGhlcmUgc2luY2UgeW91J3JlIG5vdCBtb2RpZnlpbmcg eHVkYy0+ZGV2aWNlX21vZGUgaW4gdGhlCj4gPiBjcml0aWNhbCBzZWN0aW9uLgo+ID4gCj4gPiBP bmNlIHlvdSB1bmxvY2sgaGVyZSwgeHVkYy0+ZGV2aWNlX21vZGUgY291bGQgYmUgbW9kaWZpZWQg d2hpbGUgeW91J3JlCj4gPiBleGVjdXRpbmcgdGhlIHJlc3Qgb2YgdGhlIGNvZGUsIGV4cG9zaW5n IHlvdSB0byBhIHBvdGVudGlhbCByYWNlCj4gPiBjb25kaXRpb24uIFNvIGVpdGhlciB5b3UgYWxy ZWFkeSBoYXZlIHByb3BlciBsb2NraW5nIGluIHBsYWNlIGFuZCBjYW4KPiA+IGRyb3AgdGhlIGxv Y2tpbmcgZnJvbSBoZXJlLCBvciB5b3UgbmVlZCB0byBtYWtlIHN1cmUgdG8ga2VlcCB0aGUgbG9j awo+ID4gdW50aWwgeW91IGFyZSBpbiBkZXZpY2UgbW9kZSBhbmQgc2V0IHh1ZGMtPmRldmljZV9t b2RlIGxhdGVyIG9uLgo+ID4gCj4gCj4gcmVhc29uIGZvciBzcGxpdCBzcGluX2xvY2sgdXNhZ2Ug aXMgdG8gYXZvaWQgY3JlYXRpbmcgZGVhZCBsb2NrLAo+IHdoZXJlIHBtX3J1bnRpbWVfZ2V0X3N5 bmMgYWxzbyB0YWtlcyB0aGUgc2FtZSBsb2NrLgo+IFdpbGwgcmUtY2hlY2sgYW5kIHVwZGF0ZSB0 aGUgbG9naWMgYWNjb3JkaW5nbHksICBtYXliZSB1c2UgbXV0ZXggdG8gc3luY3Jvbml6ZQo+IGRl dmljZV9tb2RlIG9uIGFuZCBvZmYgZnVuY3Rpb25hbGl0eS4KCkFzLWlzLCB0aGUgYWJvdmUgZG9l c24ndCBtYWtlIGFueSBzZW5zZSBiZWNhdXNlIHlvdSBsb2NrLCByZWFkIGEKdmFyaWFibGUgYW5k IGltbWVkaWF0ZWx5IHVubG9jayBhZ2FpbiwgaXJyZXNwZWN0aXZlIG9mIHdoYXQgdGhlIHZhbHVl CndhcyBhbmQgd2l0aG91dCBkb2luZyBhbnl0aGluZyBlbHNlIGluIGJldHdlZW4uIFJlYWRpbmcg dGhlIHZhcmlhYmxlIGlzCmFscmVhZHkgYW4gYXRvbWljIG9wZXJhdGlvbiwgbWVhbmluZyB5b3Un bGwgcmVhZCBlaXRoZXIgdHJ1ZSBvciBmYWxzZS4KVGhlcmUncyBubyBwb3RlbnRpYWwgZm9yIGFu eSByYWNlIGNvbmRpdGlvbnMgaW4gdGhlIGFib3ZlLCBzbyB0aGUKbG9ja2luZyBoZXJlIGlzIG5v dCBuZWVkZWQuCgo+ID4+ICsKPiA+PiArCXBtX3J1bnRpbWVfZ2V0X3N5bmMoeHVkYy0+ZGV2KTsK PiA+PiArCj4gPj4gKwllcnIgPSBwaHlfcG93ZXJfb24oeHVkYy0+dXRtaV9waHkpOwo+ID4+ICsJ aWYgKGVyciA8IDApCj4gPj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJ1dG1pIHBvd2VyIG9uIGZh aWxlZCAlZFxuIiwgZXJyKTsKPiA+PiArCWVyciA9IHBoeV9wb3dlcl9vbih4dWRjLT51c2IzX3Bo eSk7Cj4gPj4gKwlpZiAoZXJyIDwgMCkKPiA+PiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgInVzYjMg cGh5IHBvd2VyIG9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKPiA+PiArCj4gPj4gKwlzcGluX2xvY2tf aXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAi ZGV2aWNlIG1vZGUgb25cbiIpOwo+ID4gCj4gPiBkZXZfZGJnKCk/Cj4gPiAKPiA+PiArCXRlZ3Jh X3h1c2JfcGFkY3RsX3NldF92YnVzX292ZXJyaWRlKHh1ZGMtPnBhZGN0bCk7Cj4gPiAKPiA+IFdo YXQgZXhhY3RseSBkb2VzIHRoYXQgZG8gaGVyZT8gQ291bGQgd2UgYXV0b21hdGljYWxseSBydW4g dGhpcyBhcyBwYXJ0Cj4gPiBvZiBwaHlfcG93ZXJfb24oeHVkYy0+dXRtaV9waHkpPyBQZXJoYXBz IHdlIG5lZWQgdG8gY29tYmluZSB0aGlzIHdpdGggYQo+ID4gcGh5X2NvbmZpZ3VyZSgpIGNhbGwg dGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIFBIWSBpbnRvIGRldmljZQo+ID4gbW9k ZT8gQmFzZWQgb24gdGhlIG1vZGUsIHBoeV9wb3dlcl9vbigpIGNvdWxkIHRoZW4gc2V0IG9yIGNs ZWFyIHRoZSBWQlVTCj4gPiBvdmVycmlkZS4KPiA+IAo+ID4gT3IgSSBzdXBwb3NlIHBoeV9jb25m aWd1cmUoKSBpdHNlbGYgY291bGQgc2V0IG9yIGNsZWFyIHRoZSBWQlVTCj4gPiBvdmVycmlkZSBp ZiB0aGUgc2VxdWVuY2luZyBpcyBpbXBvcnRhbnQuCj4gPiAKPiAKPiBBcyBkaXNjdXNzZWQgb3Zl ciBvdGhlciBwYXRjaCBkaXNjdXNzaW9uLCB3ZSB3aWxsIGtlZXAgdmJ1cyBvdmVycmlkZSBmdW5j dGlvbmFsaXR5Cj4gCj4gPj4gKwo+ID4+ICsJeHVkYy0+ZGV2aWNlX21vZGUgPSB0cnVlOwo+ID4+ ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICsJdGVn cmFfcGh5X3h1c2JfdXRtaV9wYWRfcG93ZXJfb24oeHVkYy0+dXRtaV9waHkpOwo+ID4gCj4gPiBU aGUgd2F5IHRoaXMgaXMgdXNlZCBJJ20gd29uZGVyaW5nIGlmIHRoaXMgc2hvdWxkbid0IGJlIHBh cnQgb2YgdGhlCj4gPiB4dWRjLT51dG1pX3BoeSAtPnBvd2VyX29uKCkgaW1wbGVtZW50YXRpb24u Cj4gPiAKPiAKPiBXaWxsIGhhbmRsZSBhcyBwYXJ0IG9mIHBoeV9wb3dlcl9vbgo+IAo+ID4+ICt9 Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2RldmljZV9tb2RlX29mZihzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYykKPiA+PiArewo+ID4+ICsJYm9vbCBjb25uZWN0ZWQgPSBmYWxz ZTsKPiA+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPj4gKwl1MzIgcGxzLCB2YWw7Cj4gPj4g KwlpbnQgZXJyOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBm bGFncyk7Cj4gPj4gKwlpZiAoIXh1ZGMtPmRldmljZV9tb2RlKSB7Cj4gPj4gKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICsJCXJldHVybjsKPiA+PiAr CX0KPiA+PiArCj4gPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJkZXZpY2UgbW9kZSBvZmZcbiIp Owo+ID4gCj4gPiBkZXZfZGJnKCkKPiA+IAo+IAo+IE1hcmtlZCBpbmZvIHRvIGdldCBydW4gdGlt ZSB1cGRhdGUgb24gbW9kZSBjaGFuZ2VzLgoKQXJlbid0IHRoZXJlIGFueSBvdGhlciBtZWNoYW5p c21zIHRvIGNoZWNrIG1vZGUgY2hhbmdlcz8gSSB3b3VsZCBleHBlY3QKdGhlcmUgdG8gYmUgZmls ZXMgaW4gc3lzZnMgb3IgZGVidWdmcyB0aGF0IHdvdWxkIGFsbG93IG9uZSB0byByZWFkIHRoZQpt b2RlIG91dCBvZi4KCkFzIGEgZ2VuZXJhbCBydWxlLCBvbmx5IG91dHB1dCB0aGluZ3MgdGhhdCBh cmUgb2Ygc2lnbmlmaWNhbmNlIHRvIHRoZQp1c2VyLiBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSwg aXQncyByZWFzb25hYmxlIGZvciB0aGUgdXNlciB0byBleHBlY3QgYQptb2RlIGNoYW5nZSB0byBq dXN0IHdvcmssIGluIHdoaWNoIGNhc2UgdGhlcmUncyBubyB1c2UgaW4gaW5mb3JtaW5nIHRoZQp1 c2VyLiBJZiB5b3Ugd2FudCB0byBsZWF2ZSB0aGlzIGluIGZvciBkZWJ1Z2dpbmcsIHRoYXQncyBm aW5lLCBidXQgdGhlbgpwbGVhc2UgdHVybiB0aGlzIGludG8gZGV2X2RiZygpIHNvIHRoYXQgaXQg aXMgb25seSBzaG93biB3aGVuIG5lZWRlZCwKd2hpY2ggaXMgd2hpbGUgZGVidWdnaW5nLgoKPiA+ PiArCj4gPj4gKwljb25uZWN0ZWQgPSAhISh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JU U0NfQ0NTKTsKPiA+PiArCXJlaW5pdF9jb21wbGV0aW9uKCZ4dWRjLT5kaXNjb25uZWN0X2NvbXBs ZXRlKTsKPiA+PiArCj4gPj4gKwl0ZWdyYV94dXNiX3BhZGN0bF9jbGVhcl92YnVzX292ZXJyaWRl KHh1ZGMtPnBhZGN0bCk7Cj4gPj4gKwo+ID4+ICsJcGxzID0gKHh1ZGNfcmVhZGwoeHVkYywgUE9S VFNDKSA+PiBQT1JUU0NfUExTX1NISUZUKSAmCj4gPj4gKwkJUE9SVFNDX1BMU19NQVNLOwo+ID4+ ICsKPiA+PiArCS8qIERpcmVjdCBsaW5rIHRvIFUwIGlmIGRpc2Nvbm5lY3RlZCBpbiBSRVNVTUUg b3IgVTIuICovCj4gPj4gKwlpZiAoeHVkYy0+c29jLT5wbHNfcXVpcmsgJiYgeHVkYy0+Z2FkZ2V0 LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUiAmJgo+ID4+ICsJICAgIChwbHMgPT0gUE9SVFNDX1BM U19SRVNVTUUgfHwgcGxzID09IFBPUlRTQ19QTFNfVTIpKSB7Cj4gPj4gKwkJdmFsID0geHVkY19y ZWFkbCh4dWRjLCBQT1JUUE0pOwo+ID4+ICsJCXZhbCB8PSBQT1JUUE1fRlJXRTsKPiA+PiArCQl4 dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRQTSk7Cj4gPj4gKwo+ID4+ICsJCXZhbCA9IHh1ZGNf cmVhZGwoeHVkYywgUE9SVFNDKTsKPiA+PiArCQl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01BU0sg fAo+ID4+ICsJCQkgKFBPUlRTQ19QTFNfTUFTSyA8PCBQT1JUU0NfUExTX1NISUZUKSk7Cj4gPj4g KwkJdmFsIHw9IFBPUlRTQ19MV1MgfCAoUE9SVFNDX1BMU19VMCA8PCBQT1JUU0NfUExTX1NISUZU KTsKPiA+PiArCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7Cj4gPj4gKwl9Cj4gPj4g Kwo+ID4+ICsJeHVkYy0+ZGV2aWNlX21vZGUgPSBmYWxzZTsKPiA+PiArCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiA+IAo+ID4gVGhlIGxvY2tpbmcgaXMgYWdh aW4gc29tZXdoYXQgd2VpcmQgaGVyZS4gVGVjaG5pY2FsbHkgc29tZW9uZSBlbHNlIGNvdWxkCj4g PiBqdW1wIHJpZ2h0IGluIGF0IHRoaXMgcG9pbnQgYW5kIHJlY29uZmlndXJlIHRvIGRldmljZSBt b2RlIGFnYWluLiBXb3VsZAo+ID4gdGhhdCBub3QgaW50ZXJmZXJlIHdpdGggdGhlIG9wZXJhdGlv bnMgYmVsb3c/Cj4gPiAKPiAKPiBBcyBtZW50aW9uZWQgYWJvdmUsIHdpbGwgY2hlY2sgcG9zc2li aWxpdHkgdG8gcHJvdGVjdCB0aGlzIHVzaW5nIGEgbXV0ZXggaW5zdGVhZC4KPiAKPiA+PiArCXRl Z3JhX3BoeV94dXNiX3V0bWlfcGFkX3Bvd2VyX2Rvd24oeHVkYy0+dXRtaV9waHkpOwo+ID4gCj4g PiBBZ2FpbiwgaWYgc2VxdWVuY2luZyBpc24ndCBjcnVjaWFsIGhlcmUsIGNvdWxkbid0IHRoaXMg YmUgbW92ZWQgaW50bwo+ID4gcGh5X3Bvd2VyX29mZigpPwo+ID4gCj4gPj4gKwo+ID4+ICsJLyog V2FpdCBmb3IgZGlzY29ubmVjdCBldmVudC4gKi8KPiA+PiArCWlmIChjb25uZWN0ZWQpCj4gPj4g KwkJd2FpdF9mb3JfY29tcGxldGlvbigmeHVkYy0+ZGlzY29ubmVjdF9jb21wbGV0ZSk7Cj4gPj4g Kwo+ID4+ICsJLyogTWFrZSBzdXJlIGludGVycnVwdCBoYW5kbGVyIGhhcyBjb21wbGV0ZWQgYmVm b3JlIHBvd2VyZ2F0aW5nLiAqLwo+ID4+ICsJc3luY2hyb25pemVfaXJxKHh1ZGMtPmlycSk7Cj4g Pj4gKwllcnIgPSBwaHlfcG93ZXJfb2ZmKHh1ZGMtPnV0bWlfcGh5KTsKPiA+PiArCWlmIChlcnIg PCAwKQo+ID4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXRtaV9waHkgcG93ZXIgb2ZmIGZhaWxl ZCAlZFxuIiwgZXJyKTsKPiA+PiArCj4gPj4gKwllcnIgPSBwaHlfcG93ZXJfb2ZmKHh1ZGMtPnVz YjNfcGh5KTsKPiA+PiArCWlmIChlcnIgPCAwKQo+ID4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAi dXNiM19waHkgcG93ZXIgb2ZmIGZhaWxlZCAlZFxuIiwgZXJyKTsKPiA+PiArCj4gPj4gKwlwbV9y dW50aW1lX3B1dCh4dWRjLT5kZXYpOwo+ID4+ICt9Cj4gPiAKPiA+IEFsc28sIHlvdSBzZWVtIHRv IGJlIHVzaW5nIHBoeV9wb3dlcl9vbigpIGFuZCBwaHlfcG93ZXJfb2ZmKCkKPiA+IHN5bW1ldHJp Y2FsbHkgd2l0aCBwbV9ydW50aW1lX2dldCgpIGFuZCBwbV9ydW50aW1lX3B1dCgpLCBzbyBJJ20K PiA+IHdvbmRlcmluZyBpZiBwaHlfcG93ZXJfb24oKSBhbmQgcGh5X3Bvd2VyX29mZigpIGNhbid0 IGJlIG1vdmVkIGludG8gdGhlCj4gPiBydW50aW1lIFBNIGNhbGxiYWNrcy4KPiA+IAo+IAo+IHBo eV9wb3dlciBpcyBjb3VwbGVkIHdpdGggZGV2aWNlX21vZGUgb24vb2ZmIHNlcXVlbmNlIGFuZCBy dW50aW1lX2dldCBhbmQgcHV0Cj4gYXJlIGludGVybWl0dGVudGx5IGNhbGxlZCBhbG9uZyB3aXRo IGdhZGdldCBkcml2ZXIgY2FsbGJhY2tzIGFsc28gYW5kIGhlbmNlIHRoZXkKPiBhcmUgc2VwYXJh dGVkIG91dAoKSXMgdGhlcmUgYW55IHJlYXNvbiB0byBrZWVwIGEgcnVudGltZSBQTSByZWZlcmVu Y2UgaWYgd2UgZGlzYWJsZSBkZXZpY2UKbW9kZT8gSSdtIG5vdCBzdXJlIEkgdW5kZXJzdGFuZCB3 aHkgUEhZIGFuZCBydW50aW1lIFBNIGFyZSBzZXBhcmF0ZWQKaGVyZS4KCklmIFBIWSBwb3dlciBv bi9vZmYgYXJlIGNhbGxlZCBpbiBvdGhlciBwbGFjZXMsIGRvZXMgaXQgcGVyaGFwcyBtYWtlCnNl bnNlIHRvIGNhbGwgcnVudGltZSBQTSBnZXQvcHV0IGluIHRob3NlIHNhbWUgcGxhY2VzIGFzIHdl bGw/IE9yIGFyZQp0aGVyZSBhbnkgcmVhc29ucyB0byBrZWVwIFhVREMgZW5hYmxlZCB3aGlsZSB0 aGUgUEhZIGlzIG9mZj8KCklmIHNvLCBpdCdzIGZpbmUgdG8ga2VlcCB0aGVzZSBzZXBhcmF0ZS4K Cj4gPj4gKwo+ID4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3VwZGF0ZV9kYXRhX3JvbGUoc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCj4gPj4gK3sKPiA+PiArCWlmIChleHRjb25fZ2V0X3N0YXRl KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IpKQo+ID4+ICsJCXRlZ3JhX3h1ZGNf ZGV2aWNlX21vZGVfb24oeHVkYyk7Cj4gPj4gKwllbHNlCj4gPj4gKwkJdGVncmFfeHVkY19kZXZp Y2VfbW9kZV9vZmYoeHVkYyk7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHRlZ3Jh X3h1ZGNfZGF0YV9yb2xlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4+ICt7Cj4g Pj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qg dGVncmFfeHVkYywKPiA+PiArCQkJCQkgICAgICAgZGF0YV9yb2xlX3dvcmspOwo+ID4+ICsKPiA+ PiArCXRlZ3JhX3h1ZGNfdXBkYXRlX2RhdGFfcm9sZSh4dWRjKTsKPiA+PiArfQo+ID4+ICsKPiA+ PiArc3RhdGljIGludCB0ZWdyYV94dWRjX2RhdGFfcm9sZV9ub3RpZmllcihzdHJ1Y3Qgbm90aWZp ZXJfYmxvY2sgKm5iLAo+ID4+ICsJCQkJCSB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICp1bnVz ZWQpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gY29udGFpbmVyX29m KG5iLCBzdHJ1Y3QgdGVncmFfeHVkYywKPiA+PiArCQkJCQkgICAgICAgZGF0YV9yb2xlX25iKTsK PiA+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPj4gKwo+ID4+ICsJc3Bpbl9sb2NrX2lycXNh dmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiA+PiArCWlmICgheHVkYy0+c3VzcGVuZGVkKQo+ID4+ ICsJCXNjaGVkdWxlX3dvcmsoJnh1ZGMtPmRhdGFfcm9sZV93b3JrKTsKPiA+PiArCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiA+PiArCj4gPj4gKwlyZXR1cm4g Tk9USUZZX0RPTkU7Cj4gPj4gK30KPiA+PiArCj4gPj4gK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNf cGxjX3Jlc2V0X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4+ICt7Cj4gPj4gKwlz dHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKPiA+PiAr CXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgdGVn cmFfeHVkYywKPiA+PiArCQkJCQkgICAgICAgcGxjX3Jlc2V0X3dvcmspOwo+ID4+ICsJdW5zaWdu ZWQgbG9uZyBmbGFnczsKPiA+PiArCj4gPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOwo+ID4+ICsJaWYgKHh1ZGMtPndhaXRfY3NjKSB7Cj4gPj4gKwkJdTMyIHBscyA9 ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BMU19TSElGVCkgJgo+ID4+ICsJ CQkgIFBPUlRTQ19QTFNfTUFTSzsKPiA+PiArCQlpZiAocGxzID09IFBPUlRTQ19QTFNfSU5BQ1RJ VkUpIHsKPiA+PiArCQkJZGV2X2luZm8oeHVkYy0+ZGV2LCAiUExTID0gSW5hY3RpdmUuIFRvZ2ds ZSBWQlVTXG4iKTsKPiA+PiArCQkJdGVncmFfeHVzYl9wYWRjdGxfY2xlYXJfdmJ1c19vdmVycmlk ZSh4dWRjLT5wYWRjdGwpOwo+ID4+ICsJCQl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVy cmlkZSh4dWRjLT5wYWRjdGwpOwo+ID4gCj4gPiBJc24ndCB0aGlzIHRoZSBzYW1lIGFzIHRoZSBy ZXNldCBxdWlyaz8KPiA+IAo+IEJvdGggcGxjIHJlc2V0IGFuZCBwb3J0IHJlc2V0IHF1aXJrIGFy ZSB0cmlnZ2VyZWQgb24gZGlmZmVyZW50IHBvcnQgc3RhdHVzLgo+IEV2ZW4gdGhvdWdoIHRoZXkg bmVlZCB0byB0b2dnbGUgdmJ1cywgY29uZGl0aW9ucyBvbiB3aGljaCB0aGV5IGRvIGhhdmUgZGlm ZmVyZW50Cj4gY29uZGl0aW9ucyBhbmQgaGVuY2Ugc2VwYXJhdGVkIG91dAoKT2theS4KCj4gCj4g Pj4gKwkJCXh1ZGMtPndhaXRfY3NjID0gZmFsc2U7Cj4gPj4gKwkJfQo+ID4+ICsJfQo+ID4+ICsJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICt9Cj4gPj4g Kwo+ID4+ICtzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXRfd2FyX3dvcmsoc3RydWN0 IHdvcmtfc3RydWN0ICp3b3JrKQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpk d29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKPiA+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjID0KPiA+PiArCQljb250YWluZXJfb2YoZHdvcmssIHN0cnVjdCB0ZWdyYV94dWRjLCBwb3J0 X3Jlc2V0X3dhcl93b3JrKTsKPiA+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gPj4gKwl1MzIg cGxzOwo+ID4+ICsJaW50IHJldDsKPiA+PiArCj4gPj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJw b3J0X3Jlc2V0X3dhcl93b3JrXG4iKTsKPiA+IAo+ID4gZGV2X2RiZygpLCB0aG91Z2ggeW91IG1h eSBhbHNvIHdhbnQgdG8gcmV3b3JkIHRoaXMgdG8gYmUgbW9yZSB1c2VmdWwuCj4gPiAKPiBXaWxs IHVkcGF0ZQo+ID4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiA+ PiArCWlmICh4dWRjLT5kYXRhX3JvbGVfZXh0Y29uICYmCj4gPj4gKwkJZXh0Y29uX2dldF9zdGF0 ZSh4dWRjLT5kYXRhX3JvbGVfZXh0Y29uLCBFWFRDT05fVVNCKSAmJgo+ID4+ICsJCXh1ZGMtPndh aXRfZm9yX3NlY19wcmMpIHsKPiA+IAo+ID4gVGhpcyBjb3VsZCB1c2UgYSBsb2NhbCB2YXJpYWJs ZSB0byBtYWtlIHRoZSBjb25kaXRpb25hbCBlYXNpZXIgdG8gcmVhZC4KPiA+IAo+IFdpbGwgdWRw YXRlCj4gPj4gKwkJcGxzID0gKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSA+PiBQT1JUU0NfUExT X1NISUZUKSAmCj4gPj4gKwkJCVBPUlRTQ19QTFNfTUFTSzsKPiA+PiArCQlkZXZfaW5mbyh4dWRj LT5kZXYsICJwbHMgPSAleFxuIiwgcGxzKTsKPiA+IAo+ID4gZGV2X2RiZygpCj4gPiAKPiBXaWxs IHVkcGF0ZQo+ID4+ICsKPiA+PiArCQlpZiAocGxzID09IFBPUlRTQ19QTFNfRElTQUJMRUQpIHsK PiA+PiArCQkJZGV2X2luZm8oeHVkYy0+ZGV2LCAidG9nZ2xlIHZidXNcbiIpOwo+ID4gCj4gPiBk ZXZfZGJnKCkKPiA+IAo+IFdpbGwgdWRwYXRlCj4gPj4gKwkJCS8qIFBSQyBkb2Vzbid0IGNvbXBs ZXRlIGluIDEwMG1zLCB0b2dnbGUgdGhlIHZidXMgKi8KPiA+PiArCQkJcmV0ID0KPiA+PiArCQkJ dGVncmFfcGh5X3h1c2JfdXRtaV9wb3J0X3Jlc2V0X3F1aXJrKHh1ZGMtPnV0bWlfcGh5KTsKPiA+ IAo+ID4gV291bGQgcGh5X3Jlc2V0KCkgd29yayBpbiB0aGlzIGNhc2U/IFRoYXQgd291bGQgaGF2 ZSB0aGUgbmljZQo+ID4gc2lkZS1lZmZlY3Qgb2YgbWFraW5nIHRoZSBleHByZXNzaW9uIHNob3J0 IGVub3VnaCBmb3IgaXQgYWxsIHRvIGZpdCBvbgo+ID4gb25lIGxpbmUuCj4gPiAKPiAKPiBBcyBk aXNjdXNzZWQgZWFybGllciwgcGh5X3Jlc2V0IGFuZCBwb3J0IHJlc2V0IG5lZWQgdG8gYmUgc2Vw YXJhdGVkIG91dAoKT2theSB0aGVuLiBQZXJoYXBzIHdlIGNhbiBsZWF2ZSBvdXQgX3F1aXJrIGZy b20gdGhlIGZ1bmN0aW9uIG5hbWUgdG8KbWFrZSB0aGlzIHNvbWV3aGF0IHNob3J0ZXI/IFRoZSB3 YXkgdGhlIGFib3ZlIGlzIHdyYXBwZWQgbWFrZXMgbXkgZXllcwpodXJ0LiA9KQoKWy4uLl0KPiA+ PiArc3RhdGljIGludAo+ID4+ICt0ZWdyYV94dWRjX2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKnVz Yl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLAo+ID4+ICsJCSAgICBnZnBfdCBnZnAp Cj4gPj4gK3sKPiA+PiArCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKPiA+PiArCXN0 cnVjdCB0ZWdyYV94dWRjX2VwICplcDsKPiA+PiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOwo+ ID4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+PiArCWludCByZXQ7Cj4gPj4gKwo+ID4+ICsJ aWYgKCF1c2JfZXAgfHwgIXVzYl9yZXEpCj4gPj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gPj4gKwll cCA9IHRvX3h1ZGNfZXAodXNiX2VwKTsKPiA+PiArCXJlcSA9IHRvX3h1ZGNfcmVxKHVzYl9yZXEp Owo+ID4+ICsJeHVkYyA9IGVwLT54dWRjOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFzYXZl KCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gPj4gKwlpZiAoeHVkYy0+cG93ZXJnYXRlZCB8fCAhZXAt PmRlc2MpIHsKPiA+IAo+ID4gRG9lcyB0aGlzIGV2ZW4gaGFwcGVuPyBTaG91bGRuJ3Qgd2UgbWFr ZSBzdXJlIHRoYXQgdGhpcyBjYW4gbmV2ZXIgYmUKPiA+IGNhbGxlZCB3aGVuIHBvd2VyZ2F0ZWQ/ Cj4gPiAKPiAKPiBEdXJpbmcgZmFzdCBwbHVnIGFuZCB1bnBsdWcsIEluIHRoZSBkaXNjb25uZWN0 IHBhdGgsCj4gdGhlcmUgY2FuIGJlIGEgcmFjZSBiZXR3ZWVuIFhVREMgZW50ZXJpbmcgcnVudGlt ZSBzdXNwZW5kCj4gYW5kIHRoZSBnYWRnZXQgY29yZSByZXNldHRpbmcgKHVuYmluZGluZyBhbmQg cmUtYmluZGluZyksIHJlc3VsdGluZyBpbiB0aGlzIGFjY2Vzcy4KCk9rYXksIHNvdW5kcyBmaW5l IHRoZW4uCgpbLi4uXQo+ID4+ICsJZXBfcmVsb2FkKHh1ZGMsIGVwLT5pbmRleCk7Cj4gPj4gKwll cF91bnBhdXNlKHh1ZGMsIGVwLT5pbmRleCk7Cj4gPj4gKwllcF91bmhhbHQoeHVkYywgZXAtPmlu ZGV4KTsKPiA+PiArCj4gPj4gKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgewo+ ID4+ICsJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKSB7Cj4gPj4g KwkJCWlmICh4dWRjLT5lcFtpXS5kZXNjICYmCj4gPj4gKwkJCSAgICB1c2JfZW5kcG9pbnRfeGZl cl9idWxrKHh1ZGMtPmVwW2ldLmRlc2MpKQo+ID4+ICsJCQkJZXBfdW5wYXVzZSh4dWRjLCBpKTsK PiA+PiArCQl9Cj4gPj4gKwl9Cj4gPj4gKwo+ID4+ICtvdXQ6Cj4gPj4gKwlkZXZfaW5mbyh4dWRj LT5kZXYsICJlcCAldSAodHlwZTogJWQsIGRpcjogJXMpIGVuYWJsZWRcbiIsIGVwLT5pbmRleCwK PiA+PiArCQkgdXNiX2VuZHBvaW50X3R5cGUoZXAtPmRlc2MpLAo+ID4+ICsJCSB1c2JfZW5kcG9p bnRfZGlyX2luKGVwLT5kZXNjKSA/ICJpbiIgOiAib3V0Iik7Cj4gPiAKPiA+IGRldl9kYmcoKQo+ ID4gCj4gCj4gTWFrZWQgaW5mbywgdG8gZ2V0IHJ1biB0aW1lIHVkcGF0ZWQgb24gZW5hYmxlZCBl bmQgcG9pbnRzCgpBZ2FpbiwgY2FuIHRoaXMgaW5mb3JtYXRpb24gbm90IGJlIG9idGFpbmVkIGVs c2V3aGVyZT8gVGhlIGtlcm5lbCBsb2cgaXMKYSBwcmVjaW91cyB0b29sIHRvIHF1aWNrbHkgc2Vl IHdoZW4gdW5leHBlY3RlZCB0aGluZ3MgaGFwcGVuLiBJZiB3ZSBrZWVwCnNwYW1taW5nIHRoZSBs b2cgd2l0aCBpbmZvcm1hdGlvbiB0aGF0J3Mgbm90IHVzZWZ1bCwgd2UgbWFrZSBpdCBtb3JlCmRp ZmZpY3VsdCB0byBzZWUgdGhlIHJlYWxseSBpbXBvcnRhbnQgYml0cy4KClsuLi5dCj4gPj4gK3N0 YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfZW5hYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwKPiA+ PiArCQkJCSBjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCj4gPj4g K3sKPiA+PiArCXJldHVybiAtRUlOVkFMOwo+ID4+ICt9Cj4gPj4gKwo+ID4+ICtzdGF0aWMgaW50 IHRlZ3JhX3h1ZGNfZXAwX2Rpc2FibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwKQo+ID4+ICt7Cj4g Pj4gKwlyZXR1cm4gLUVJTlZBTDsKPiA+PiArfQo+ID4+ICsKPiA+PiArc3RhdGljIHN0cnVjdCB1 c2JfZXBfb3BzIHRlZ3JhX3h1ZGNfZXAwX29wcyA9IHsKPiA+PiArCS5lbmFibGUgPSB0ZWdyYV94 dWRjX2VwMF9lbmFibGUsCj4gPj4gKwkuZGlzYWJsZSA9IHRlZ3JhX3h1ZGNfZXAwX2Rpc2FibGUs Cj4gPj4gKwkuYWxsb2NfcmVxdWVzdCA9IHRlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdCwKPiA+ PiArCS5mcmVlX3JlcXVlc3QgPSB0ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdCwKPiA+PiArCS5x dWV1ZSA9IHRlZ3JhX3h1ZGNfZXBfcXVldWUsCj4gPj4gKwkuZGVxdWV1ZSA9IHRlZ3JhX3h1ZGNf ZXBfZGVxdWV1ZSwKPiA+PiArCS5zZXRfaGFsdCA9IHRlZ3JhX3h1ZGNfZXBfc2V0X2hhbHQsCj4g Pj4gK307Cj4gPiAKPiA+IFdoYXQgbWFrZXMgRVAwIHNwZWNpYWw/Cj4gPiAKPiAKPiBFUDAgaXMg YWx3YXlzIGVuYWJsZWQgYW5kIGhlbmNlIGFueSBjYWxscyB0byBlbmFibGUvZGlzYWJsZSBhcmUg bm90IGhhbmRsZWQKPiBoZW5jZSBzZXBhcmF0ZSBvcHMgZm9yIEVQMCB0byByZWplY3QgcmVxdWVz dCBpZiBhbnkKCi1FSU5WQUwgc291bmRzIHN1Ym9wdGltYWwgYXMgYW4gZXJyb3IgbWVzc2FnZSBp biB0aGlzIGNhc2UuIFBlcmhhcHMKc29tZXRoaW5nIGxpa2UgLUVCVVNZIHdvdWxkIGJlIG1vcmUg YXBwcm9wcmlhdGU/CgpbLi4uXQo+ID4+ICsJCXJldHVybiBlcnI7Cj4gPj4gKwl9Cj4gPj4gKwo+ ID4+ICsJZXJyID0gdGVncmFfeHVkY19jbGtfaW5pdCh4dWRjKTsKPiA+PiArCWlmIChlcnIgPCAw KSB7Cj4gPj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gaW5pdCBjbG9ja3MgJWRc biIsIGVycik7Cj4gPj4gKwkJcmV0dXJuIGVycjsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwl4dWRj LT5zdXBwbGllcyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9zdXBw bGllcywKPiA+PiArCQkJCSAgICAgIHNpemVvZigqeHVkYy0+c3VwcGxpZXMpLCBHRlBfS0VSTkVM KTsKPiA+PiArCWlmICgheHVkYy0+c3VwcGxpZXMpCj4gPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4g Pj4gKwlmb3IgKGkgPSAwOyBpIDwgeHVkYy0+c29jLT5udW1fc3VwcGxpZXM7IGkrKykKPiA+PiAr CQl4dWRjLT5zdXBwbGllc1tpXS5zdXBwbHkgPSB4dWRjLT5zb2MtPnN1cHBseV9uYW1lc1tpXTsK PiA+PiArCWVyciA9IGRldm1fcmVndWxhdG9yX2J1bGtfZ2V0KCZwZGV2LT5kZXYsIHh1ZGMtPnNv Yy0+bnVtX3N1cHBsaWVzLAo+ID4+ICsJCQkJICAgICAgeHVkYy0+c3VwcGxpZXMpOwo+ID4+ICsJ aWYgKGVycikgewo+ID4+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIHJlcXVlc3Qg cmVndWxhdG9ycyAlZFxuIiwgZXJyKTsKPiA+PiArCQlyZXR1cm4gZXJyOwo+ID4+ICsJfQo+ID4+ ICsKPiA+PiArCXh1ZGMtPnBhZGN0bCA9IHRlZ3JhX3h1c2JfcGFkY3RsX2dldCgmcGRldi0+ZGV2 KTsKPiA+PiArCWlmIChJU19FUlIoeHVkYy0+cGFkY3RsKSkKPiA+PiArCQlyZXR1cm4gUFRSX0VS Uih4dWRjLT5wYWRjdGwpOwo+ID4gCj4gPiBJdCBzZWVtcyBsaWtlIHdlIG9ubHkgbmVlZCB0aGlz IGZvciB0aGUgVkJVUyBvdmVycmlkZSBmdW5jdGlvbmFsaXR5LiBJZgo+ID4gd2UgY2FuIGdldCBy aWQgb2YgdGhhdCBieSBpbmNvcnBvcmF0aW5nIGl0IGludG8gcGh5IEFQSSBmdW5jdGlvbnMsIHdl Cj4gPiBjb3VsZCByZW1vdmUgdGhlIG5lZWQgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIGl0IGhlcmUu Cj4gPiAKPiAKPiBBcyBtZW50aW9uZWQgZWFybGllciwgd2UgbmVlZCB0aGlzIGZvciBwb3J0IG9w ZXJhdGlvbnMKCk9rYXksIGxldCdzIGtlZXAgaXQsIHRoZW4uCgpbLi4uXQo+ID4+ICsjaWZkZWYg Q09ORklHX1BNCj4gPj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19ydW50aW1lX3N1c3BlbmQoc3Ry dWN0IGRldmljZSAqZGV2KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9 IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ID4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiA+PiAr Cj4gPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICsJaWYg KFdBUk5fT04oeHVkYy0+ZGV2aWNlX21vZGUpKSB7Cj4gPj4gKwkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ID4+ICsJCXJldHVybiAtRUJVU1k7Cj4gPj4gKwl9 Cj4gPj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gPiAK PiA+IFRoaXMgc2VlbXMgb3Zlcmx5IHJlc3RyaWN0aXZlLiBXaHkgcmVqZWN0IHN1c3BlbmQgbW9k ZSB3aGVuIHdlJ3JlIGluCj4gPiBkZXZpY2UgbW9kZT8KPiA+IAo+ID4gQWxzbywgaXQgc2VlbXMg dG8gbWUgbGlrZSB0aGVyZSByZWFsbHkgYXJlbid0IGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuCj4g PiBzeXN0ZW0gc2xlZXAgYW5kIHJ1bnRpbWUgUE0sIHNvIHdoeSBub3QganVzdCBsZWF2ZSBhd2F5 IHRoZSBzeXN0ZW0gc2xlZXAKPiA+IGZ1bmN0aW9ucyBhbmQganVzdCBsZXQgcnVudGltZSBQTSBk ZWFsIHdpdGggZXZlcnl0aGluZz8KPiA+IAo+IER1cmluZyBzeXN0ZW0gc2xlZXAgd2UgZm9yY2Ug b2ZmIHRoZSBkZXZpY2UgbW9kZSBhbmQgbm90IGluIHJ1bnRpbWUgc3VzcGVuZAo+IGFuZCB2aWNl dmVyc2EgZHVyaW5nIHJlc3VtZSwgaW4gcnVudGltZSwgaXRzIG1vcmUgb2YgcG93ZXJnYXJpbmcK CkNvbWUgdG8gdGhpbmsgb2YgaXQsIHdoeSB3b3VsZCB3ZSBldmVuIGF0dGVtcHQgdG8gcnVudGlt ZSBzdXNwZW5kIGlmCndlJ3JlIGluIGRldmljZSBtb2RlPyBDYW4ndCB3ZSBqdXN0IG1ha2Ugc3Vy ZSB0aGF0IHdlIGNhbGwKcG1fcnVudGltZV9nZXQoKSBhbmQgcG1fcnVudGltZV9wdXQoKSBpbiB0 aGUgcmlnaHQgcGxhY2VzIHNvIHRoYXQgdGhpcwpkb2Vzbid0IGhhcHBlbj8gT3IgaXMgdGhpcyBh Z2FpbiB0aGUgcmFjZSBjb25kaXRpb24gdGhhdCBjYW4gaGFwcGVuIGlmCndlIHF1aWNrbHkgcGx1 Zy91bnBsdWc/CgpUaGllcnJ5Cg==