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: [RFC,v5,1/6] dmaengine: Add Synopsys eDMA IP core driver From: Gustavo Pimentel Message-Id: Date: Mon, 18 Feb 2019 15:44:06 +0000 To: Andy Shevchenko , Gustavo Pimentel Cc: "linux-pci@vger.kernel.org" , "dmaengine@vger.kernel.org" , Vinod Koul , Dan Williams , Eugeniy Paltsev , Russell King , Niklas Cassel , Joao Pinto , Jose Abreu , Luis Oliveira , Vitor Soares , Nelson Costa , Pedro Sousa List-ID: SGkgQW5keSwKCk9uIDExLzAyLzIwMTkgMTg6NDksIEFuZHkgU2hldmNoZW5rbyB3cm90ZToKPiBP biBNb24sIEZlYiAxMSwgMjAxOSBhdCAwNjozNDozMFBNICswMTAwLCBHdXN0YXZvIFBpbWVudGVs IHdyb3RlOgo+PiBBZGQgU3lub3BzeXMgUENJZSBFbmRwb2ludCBlRE1BIElQIGNvcmUgZHJpdmVy IHRvIGtlcm5lbC4KPj4KPj4gVGhpcyBJUCBpcyBnZW5lcmFsbHkgZGlzdHJpYnV0ZWQgd2l0aCBT eW5vcHN5cyBQQ0llIEVuZHBvaW50IElQIChkZXBlbmRzCj4+IG9mIHRoZSB1c2UgYW5kIGxpY2Vu c2luZyBhZ3JlZW1lbnQpLgo+Pgo+PiBUaGlzIGNvcmUgZHJpdmVyLCBpbml0aWFsaXplcyBhbmQg Y29uZmlndXJlcyB0aGUgZURNQSBJUCB1c2luZyB2bWEtaGVscGVycwo+PiBmdW5jdGlvbnMgYW5k IGRtYS1lbmdpbmUgc3Vic3lzdGVtLgo+Pgo+PiBUaGlzIGRyaXZlciBjYW4gYmUgY29tcGlsZSBh cyBidWlsdC1pbiBvciBleHRlcm5hbCBtb2R1bGUgaW4ga2VybmVsLgo+Pgo+PiBUbyBlbmFibGUg dGhpcyBkcml2ZXIganVzdCBzZWxlY3QgRFdfRURNQSBvcHRpb24gaW4ga2VybmVsIGNvbmZpZ3Vy YXRpb24sCj4+IGhvd2V2ZXIgaXQgcmVxdWlyZXMgYW5kIHNlbGVjdHMgYXV0b21hdGljYWxseSBE TUFfRU5HSU5FIGFuZAo+PiBETUFfVklSVFVBTF9DSEFOTkVMUyBvcHRpb24gdG9vLgo+IAo+IEZp cnN0IGNvbW1lbnQgaGVyZSBpcyB0aGF0OiB0cnkgdG8gc2hyaW5rIHlvdXIgY29kZSBiYXNlIGJ5 IGxldCdzIHNheSAxNSUuCj4gSSBiZWxpZXZlIHNvbWV0aGluZyBoZXJlIGlzIGRvbmUgaXMgc3Vi b3B0aW1hbCB3YXkgb3IgZG9lc24ndCB0YWtlIGludG8KPiBjb25zaWRlcmF0aW9uIGV4aXN0aW5n IGZhY2lsaXRpZXMgaW4gdGhlIGtlcm5lbC4KCk9rLCBpdCdzIHF1aXRlIHBvc3NpYmxlLiBCYXNl ZCBvbiB0aGlzIGFuZCBvdGhlciBjb2RlIHJldmlzaW9ucyBJJ3ZlIGRpc2NvdmVyCnNvbWUgaGVs cGVycyB0aGF0IEkgZGlkbid0IGtub3cgb3IgaGFzbid0IGF3YXJlL2RpZG4ndCBzZWUgaW4gcHJl dmlvdXMgZHJpdmVyCmltcGxlbWVudGF0aW9ucy4KClRob3NlIGhlbHBlcnMga2VlcCB0aGUgY29k ZSBtdWNoIGNsZWFuZXIgYW5kIHJlYWRhYmxlLCB0aGFua3MgdG8gYWxsIGZvciBzaG93IG1lCnRo ZW0hCgo+IAo+PiArc3RhdGljIHZvaWQgZHdfZWRtYV9mcmVlX2NodW5rKHN0cnVjdCBkd19lZG1h X2Rlc2MgKmRlc2MpCj4+ICt7Cj4+ICsJc3RydWN0IGR3X2VkbWFfY2hhbiAqY2hhbiA9IGRlc2Mt PmNoYW47Cj4+ICsJc3RydWN0IGR3X2VkbWFfY2h1bmsgKmNoaWxkLCAqX25leHQ7Cj4+ICsKPiAK Pj4gKwlpZiAoIWRlc2MtPmNodW5rKQo+PiArCQlyZXR1cm47Cj4gCj4gSXMgaXQgbmVjZXNzYXJ5 IGNoZWNrPyBXaHk/CgpJdCB3YXMganVzdCBhIHBvaW50ZXIgdmFsaWRhdGlvbiBmYWlsIHNhZmUu IEkgY2FuIHJlbW92ZSBpdC4KCj4gCj4+ICsKPj4gKwkvKiBSZW1vdmUgYWxsIHRoZSBsaXN0IGVs ZW1lbnRzICovCj4+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxkLCBfbmV4dCwgJmRl c2MtPmNodW5rLT5saXN0LCBsaXN0KSB7Cj4+ICsJCWR3X2VkbWFfZnJlZV9idXJzdChjaGlsZCk7 Cj4+ICsJCWlmIChjaGlsZC0+YnVyc3RzX2FsbG9jKQo+PiArCQkJZGV2X2RiZyhjaGFuMmRldihj aGFuKSwJIiV1IGJ1cnN0cyBzdGlsbCBhbGxvY2F0ZWRcbiIsCj4+ICsJCQkJY2hpbGQtPmJ1cnN0 c19hbGxvYyk7Cj4+ICsJCWxpc3RfZGVsKCZjaGlsZC0+bGlzdCk7Cj4+ICsJCWtmcmVlKGNoaWxk KTsKPj4gKwkJZGVzYy0+Y2h1bmtzX2FsbG9jLS07Cj4+ICsJfQo+PiArCj4+ICsJLyogUmVtb3Zl IHRoZSBsaXN0IGhlYWQgKi8KPj4gKwlrZnJlZShjaGlsZCk7Cj4+ICsJZGVzYy0+Y2h1bmsgPSBO VUxMOwo+PiArfQo+IAo+PiArc3RhdGljIGludCBkd19lZG1hX2RldmljZV9jb25maWcoc3RydWN0 IGRtYV9jaGFuICpkY2hhbiwKPj4gKwkJCQkgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZp ZykKPj4gK3sKPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0gZGNoYW4yZHdfZWRtYV9j aGFuKGRjaGFuKTsKPj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCWludCBlcnIgPSAwOwo+ PiArCj4+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPnZjLmxvY2ssIGZsYWdzKTsKPj4gKwo+ IAo+PiArCWlmICghY29uZmlnKSB7Cj4+ICsJCWVyciA9IC1FSU5WQUw7Cj4+ICsJCWdvdG8gZXJy X2NvbmZpZzsKPj4gKwl9Cj4gCj4gSXMgaXQgbmVjZXNzYXJ5IGNoZWNrPyBXaHk/CgpJdCB3YXMg anVzdCBhIHBvaW50ZXIgdmFsaWRhdGlvbiBmYWlsIHNhZmUgKG9sZCBoYWJpdCBmcm9tIHVzZXIg c3BhY2UgdG9vbHMsCnRyeWluZyB0byBwcm90ZWN0IHRvIGFsbCBjb3N0cyBhbnkgbWlzdXNlIGZy b20gdGhlIHVzZXIpLiBJIGNhbiByZW1vdmUgaXQsIG5vCnByb2JsZW0uCgo+IAo+IFdoeSB0aGlz IGlzIHVuZGVyIHNwaW4gbG9jaz8KPiAKPj4gKwlkZXZfZGJnKGNoYW4yZGV2KGNoYW4pLCAiYWRk cihwaHlzaWNhbCkgc3JjPSVwYSwgZHN0PSVwYVxuIiwKPj4gKwkJJmNvbmZpZy0+c3JjX2FkZHIs ICZjb25maWctPmRzdF9hZGRyKTsKPiAKPiBBbmQgdGhpcy4KPiAKPiBXaGF0IGRvIHlvdSBwcm90 ZWN0IGJ5IGxvY2tzPyBDaGVjayBhbGwgeW91ciBsb2NraW5nIGNhcmVmdWxseS4KCkluIHRoaXMg Y2FzZSwgSSB3YXMgdHJ5aW5nIHRvIHByb3RlY3QgdGhlIGNvbmZpZyBkYXRhIGFuZCBjb25maWd1 cmUgdmFyaWFibGUsCnNpbmNlIHRoaXMgaW5mb3JtYXRpb24gaXMgbWFuaXB1bGF0ZWQgaGVyZSBh bmQgYnkgZHdfZWRtYV9kZXZpY2VfdHJhbnNmZXIoKSwKd2hpY2ggaXMgY2FsbGVkIGJ5IGR3X2Vk bWFfZGV2aWNlX3ByZXBfc2xhdmVfc2coKSBhbmQvb3IKZHdfZWRtYV9kZXZpY2VfcHJlcF9kbWFf Y3ljbGljKCkKCkJ1dCB5b3UgY29tbWVudCB3YXMgYWJvdXQgdGhlIGRlYnVnIHByaW50IGl0c2Vs ZiBvciBhYm91dCB0aGUgY29uZmlnCmRhdGEvY29uZmlndXJlZCB2YXJpYWJsZT8KCj4gCj4+ICsK Pj4gKwljaGFuLT5zcmNfYWRkciA9IGNvbmZpZy0+c3JjX2FkZHI7Cj4+ICsJY2hhbi0+ZHN0X2Fk ZHIgPSBjb25maWctPmRzdF9hZGRyOwo+PiArCj4+ICsJY2hhbi0+Y29uZmlndXJlZCA9IHRydWU7 Cj4+ICsJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwJImNoYW5uZWwgY29uZmlndXJlZFxuIik7Cj4+ ICsKPj4gK2Vycl9jb25maWc6Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+dmMu bG9jaywgZmxhZ3MpOwo+PiArCXJldHVybiBlcnI7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQg ZHdfZWRtYV9kZXZpY2VfcGF1c2Uoc3RydWN0IGRtYV9jaGFuICpkY2hhbikKPj4gK3sKPj4gKwlz dHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0gZGNoYW4yZHdfZWRtYV9jaGFuKGRjaGFuKTsKPj4g Kwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+PiArCWludCBlcnIgPSAwOwo+PiArCj4+ICsJc3Bpbl9s b2NrX2lycXNhdmUoJmNoYW4tPnZjLmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCWlmICghY2hhbi0+ Y29uZmlndXJlZCkgewo+IAo+PiArCQlkZXZfZXJyKGNoYW4yZGV2KGNoYW4pLCAiKHBhdXNlKSBj aGFubmVsIG5vdCBjb25maWd1cmVkXG4iKTsKPiAKPiBXaHkgdGhpcyBpcyB1bmRlciBzcGlubG9j az8KClRoZSBnb2FsIHdhcyB0byBwcm90ZWN0IHRoZSBjb25maWd1cmVkLCBzdGF0dXMgYW5kIHJl cXVlc3QgdmFyaWFibGVzLiBPbmNlIGFnYWluCnlvdXIgY29tbWVudCB3YXMgYWJvdXQgdGhlIHZh cmlhYmxlcyBpdHNlbGYgb3IgYWJvdXQgdGhlIGRlYnVnIHByaW50cz8KCj4gCj4+ICsJCWVyciA9 IC1FUEVSTTsKPj4gKwkJZ290byBlcnJfcGF1c2U7Cj4+ICsJfQo+PiArCj4+ICsJaWYgKGNoYW4t PnN0YXR1cyAhPSBFRE1BX1NUX0JVU1kpIHsKPj4gKwkJZXJyID0gLUVQRVJNOwo+PiArCQlnb3Rv IGVycl9wYXVzZTsKPj4gKwl9Cj4+ICsKPj4gKwlpZiAoY2hhbi0+cmVxdWVzdCAhPSBFRE1BX1JF UV9OT05FKSB7Cj4+ICsJCWVyciA9IC1FUEVSTTsKPj4gKwkJZ290byBlcnJfcGF1c2U7Cj4+ICsJ fQo+PiArCj4+ICsJY2hhbi0+cmVxdWVzdCA9IEVETUFfUkVRX1BBVVNFOwo+IAo+PiArCWRldl9k YmcoY2hhbjJkZXYoY2hhbiksICJwYXVzZSByZXF1ZXN0ZWRcbiIpOwo+IAo+IERpdHRvLgo+IAo+ IE1vcmVvdmVyLCBjaGVjayB3aGF0IGZ1bmN0aW9uYWwgdHJhY2VyIGNhbiBwcm92aWRlIHlvdSBm b3IgZGVidWdnaW5nLgoKSSBzYXcgaW4gZHctYXhpLWRtYWMgZHJpdmVyIHRoZSB1c2Ugb2YgZGV2 X2RiZygpIGluc3RlYWQgb2YgZGV2X2RiZygpLCB0aGF0IGlzCndoYXQgeW91IHJlY29tbWVuZCAo YmVzaWRlcyBvZiByZW1vdmluZyBzb21lIGRlYnVnIHByaW50cyk/Cgo+IAo+PiArCj4+ICtlcnJf cGF1c2U6Cj4+ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+dmMubG9jaywgZmxhZ3Mp Owo+PiArCXJldHVybiBlcnI7Cj4+ICt9Cj4gCj4+ICt7Cj4+ICsJc3RydWN0IGR3X2VkbWFfY2hh biAqY2hhbiA9IGRjaGFuMmR3X2VkbWFfY2hhbihkY2hhbik7Cj4+ICsJc3RydWN0IGR3X2VkbWFf ZGVzYyAqZGVzYzsKPj4gKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7Cj4+ICsJdW5zaWduZWQg bG9uZyBmbGFnczsKPj4gKwllbnVtIGRtYV9zdGF0dXMgcmV0Owo+PiArCXUzMiByZXNpZHVlID0g MDsKPj4gKwo+PiArCXJldCA9IGRtYV9jb29raWVfc3RhdHVzKGRjaGFuLCBjb29raWUsIHR4c3Rh dGUpOwo+PiArCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFKQo+PiArCQlyZXR1cm4gcmV0Owo+PiAr Cj4gCj4+ICsJaWYgKCF0eHN0YXRlKQo+PiArCQlyZXR1cm4gcmV0Owo+IAo+IFNvLCBpZiB0aGVy ZSBpcyBubyB0eHN0YXRlLCB5b3UgY2FuJ3QgcmV0dXJuIFBBVVNFRCBzdGF0ZT8gV2h5PwoKSSBt aXN1bmRlcnN0b29kIFZpbm9kJ3MgY29tbWVudCAidGhpcyBsb29rcyBiZXR0ZXIsIHBsZWFzZSBk byBrZWVwIGluIG1pbmQKdHhzdGF0ZSBjYW4gYmUgbnVsbCwgc28gcmVzaWR1ZSBjYW4gY2FuIGJl IHNraXBwZWQiCgpUaGUgdHhzdGF0ZSB2YXJpYWJsZSBzaG91bGQgYmUgdmVyaWZpZWQgYWZ0ZXIg Y2hlY2tpbmcgaWYgdGhlIGNoYW5uZWwgaXMgb24KUEFVU0Ugc3RhdGUuCgo+IAo+PiArCj4+ICsJ c3Bpbl9sb2NrX2lycXNhdmUoJmNoYW4tPnZjLmxvY2ssIGZsYWdzKTsKPj4gKwo+PiArCWlmIChy ZXQgPT0gRE1BX0lOX1BST0dSRVNTICYmIGNoYW4tPnN0YXR1cyA9PSBFRE1BX1NUX1BBVVNFKQo+ PiArCQlyZXQgPSBETUFfUEFVU0VEOwoKCWlmICghdHhzdGF0ZSkKCQlnb3RvIHJldF9zdGF0dXM7 CgpTb3VuZHMgZ29vZD8KCj4+ICsKPj4gKwl2ZCA9IHZjaGFuX2ZpbmRfZGVzYygmY2hhbi0+dmMs IGNvb2tpZSk7Cj4+ICsJaWYgKCF2ZCkKPj4gKwkJZ290byByZXRfc3RhdHVzOwo+PiArCj4+ICsJ ZGVzYyA9IHZkMmR3X2VkbWFfZGVzYyh2ZCk7Cj4+ICsJaWYgKGRlc2MpCj4+ICsJCXJlc2lkdWUg PSBkZXNjLT5hbGxvY19zeiAtIGRlc2MtPnhmZXJfc3o7Cj4+ICsKPj4gK3JldF9zdGF0dXM6Cj4+ ICsJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+dmMubG9jaywgZmxhZ3MpOwo+PiArCWRt YV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCByZXNpZHVlKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ ICt9Cj4gCj4+ICsJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7Cj4+ICsJCWlmICgheGZlci0+ Y3ljbGljICYmICFzZykKPj4gKwkJCWJyZWFrOwo+PiArCj4+ICsJCWlmIChjaHVuay0+YnVyc3Rz X2FsbG9jID09IGNoYW4tPmxsX21heCkgewo+PiArCQkJY2h1bmsgPSBkd19lZG1hX2FsbG9jX2No dW5rKGRlc2MpOwo+PiArCQkJaWYgKHVubGlrZWx5KCFjaHVuaykpCj4+ICsJCQkJZ290byBlcnJf YWxsb2M7Cj4+ICsJCX0KPj4gKwo+PiArCQlidXJzdCA9IGR3X2VkbWFfYWxsb2NfYnVyc3QoY2h1 bmspOwo+PiArCj4+ICsJCWlmICh1bmxpa2VseSghYnVyc3QpKQo+PiArCQkJZ290byBlcnJfYWxs b2M7Cj4+ICsKPj4gKwkJaWYgKHhmZXItPmN5Y2xpYykKPj4gKwkJCWJ1cnN0LT5zeiA9IHhmZXIt PnhmZXIuY3ljbGljLmxlbjsKPj4gKwkJZWxzZQo+PiArCQkJYnVyc3QtPnN6ID0gc2dfZG1hX2xl bihzZyk7Cj4+ICsKPj4gKwkJY2h1bmstPmxsX3JlZ2lvbi5zeiArPSBidXJzdC0+c3o7Cj4+ICsJ CWRlc2MtPmFsbG9jX3N6ICs9IGJ1cnN0LT5zejsKPj4gKwo+PiArCQlpZiAoZGlyZWN0aW9uID09 IERNQV9ERVZfVE9fTUVNKSB7Cj4+ICsJCQlidXJzdC0+c2FyID0gc3JjX2FkZHI7Cj4+ICsJCQlp ZiAoeGZlci0+Y3ljbGljKSB7Cj4+ICsJCQkJYnVyc3QtPmRhciA9IHhmZXItPnhmZXIuY3ljbGlj LnBhZGRyOwo+PiArCQkJfSBlbHNlIHsKPj4gKwkJCQlidXJzdC0+ZGFyID0gc2dfZG1hX2FkZHJl c3Moc2cpOwo+PiArCQkJCXNyY19hZGRyICs9IHNnX2RtYV9sZW4oc2cpOwo+PiArCQkJfQo+PiAr CQl9IGVsc2Ugewo+PiArCQkJYnVyc3QtPmRhciA9IGRzdF9hZGRyOwo+PiArCQkJaWYgKHhmZXIt PmN5Y2xpYykgewo+PiArCQkJCWJ1cnN0LT5zYXIgPSB4ZmVyLT54ZmVyLmN5Y2xpYy5wYWRkcjsK Pj4gKwkJCX0gZWxzZSB7Cj4+ICsJCQkJYnVyc3QtPnNhciA9IHNnX2RtYV9hZGRyZXNzKHNnKTsK Pj4gKwkJCQlkc3RfYWRkciArPSBzZ19kbWFfbGVuKHNnKTsKPj4gKwkJCX0KPj4gKwkJfQo+PiAr Cj4+ICsJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJsbGkgJXUvJXUsIHNhcj0weCUuOGxseCwg ZGFyPTB4JS44bGx4LCBzaXplPSV1IGJ5dGVzXG4iLAo+PiArCQkJaSArIDEsIGNudCwgYnVyc3Qt PnNhciwgYnVyc3QtPmRhciwgYnVyc3QtPnN6KTsKPj4gKwo+PiArCQlpZiAoIXhmZXItPmN5Y2xp YykKPj4gKwkJCXNnID0gc2dfbmV4dChzZyk7Cj4gCj4gU2hvdWxkbid0IHlvdSByYXRoZXIgdG8g dXNlIGZvcl9lYWNoX3NnKCk/CgpJIHVzZWQgdGhhdCBoZWxwZXIgb24gdGhlIHByZXBfc2xhdmVf c2coKSwgYnV0IG5vdyB0aGF0IEkgaGF2ZSBhIGNvbW1vbiBmdW5jdGlvbgpmb3IgYm90aCBmdW5j dGlvbnMgcHJlcF9zbGF2ZV9zZygpIGFuZCBwcmVwX2RtYV9jeWNsaWMoKS4gSSB0aGluayBJTUhP IHRoYXQKaGVscGVyIGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlIG5vdywgYnV0IElmIHlvdSBoYXZl IGFuIHN1Z2dlc3Rpb24gSSdsbCBiZSBnbGFkCnRvIGtub3cgaXQuCgo+IAo+PiArCX0KPiAKPiAK Pj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+dmMubG9jaywgZmxhZ3MpOwo+PiArCXZkID0g dmNoYW5fbmV4dF9kZXNjKCZjaGFuLT52Yyk7Cj4+ICsJc3dpdGNoIChjaGFuLT5yZXF1ZXN0KSB7 Cj4+ICsJY2FzZSBFRE1BX1JFUV9OT05FOgo+IAo+PiArCQlpZiAoIXZkKQo+PiArCQkJYnJlYWs7 Cj4gCj4gU2hvdWxkbid0IGJlIG91dHNpZGUgb2Ygc3dpdGNoPwoKWWVzLCBpdCBzaG91bGQuCgo+ IAo+PiArCj4+ICsJCWRlc2MgPSB2ZDJkd19lZG1hX2Rlc2ModmQpOwo+PiArCQlpZiAoZGVzYy0+ Y2h1bmtzX2FsbG9jKSB7Cj4+ICsJCQlkZXZfZGJnKGNoYW4yZGV2KGNoYW4pLCAic3ViLXRyYW5z ZmVyIGNvbXBsZXRlXG4iKTsKPj4gKwkJCWNoYW4tPnN0YXR1cyA9IEVETUFfU1RfQlVTWTsKPj4g KwkJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJ0cmFuc2ZlcnJlZCAldSBieXRlc1xuIiwKPj4g KwkJCQlkZXNjLT54ZmVyX3N6KTsKPj4gKwkJCWR3X2VkbWFfc3RhcnRfdHJhbnNmZXIoY2hhbik7 Cj4+ICsJCX0gZWxzZSB7Cj4+ICsJCQlsaXN0X2RlbCgmdmQtPm5vZGUpOwo+PiArCQkJdmNoYW5f Y29va2llX2NvbXBsZXRlKHZkKTsKPj4gKwkJCWNoYW4tPnN0YXR1cyA9IEVETUFfU1RfSURMRTsK Pj4gKwkJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksICJ0cmFuc2ZlciBjb21wbGV0ZVxuIik7Cj4+ ICsJCX0KPj4gKwkJYnJlYWs7Cj4+ICsJY2FzZSBFRE1BX1JFUV9TVE9QOgo+PiArCQlpZiAoIXZk KQo+PiArCQkJYnJlYWs7Cj4+ICsKPj4gKwkJbGlzdF9kZWwoJnZkLT5ub2RlKTsKPj4gKwkJdmNo YW5fY29va2llX2NvbXBsZXRlKHZkKTsKPj4gKwkJY2hhbi0+cmVxdWVzdCA9IEVETUFfUkVRX05P TkU7Cj4+ICsJCWNoYW4tPnN0YXR1cyA9IEVETUFfU1RfSURMRTsKPj4gKwkJZGV2X2RiZyhjaGFu MmRldihjaGFuKSwgInRyYW5zZmVyIHN0b3BcbiIpOwo+PiArCQlicmVhazsKPj4gKwljYXNlIEVE TUFfUkVRX1BBVVNFOgo+PiArCQljaGFuLT5yZXF1ZXN0ID0gRURNQV9SRVFfTk9ORTsKPj4gKwkJ Y2hhbi0+c3RhdHVzID0gRURNQV9TVF9QQVVTRTsKPj4gKwkJYnJlYWs7Cj4+ICsJZGVmYXVsdDoK Pj4gKwkJZGV2X2VycihjaGFuMmRldihjaGFuKSwgImludmFsaWQgc3RhdHVzIHN0YXRlXG4iKTsK Pj4gKwkJYnJlYWs7Cj4+ICsJfQo+PiArCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoYW4tPnZj LmxvY2ssIGZsYWdzKTsKPj4gK30KPiAKPj4gK3N0YXRpYyBpcnFyZXR1cm5fdCBkd19lZG1hX2lu dGVycnVwdChpbnQgaXJxLCB2b2lkICpkYXRhLCBib29sIHdyaXRlKQo+PiArewo+PiArCXN0cnVj dCBkd19lZG1hX2lycSAqZHdfaXJxID0gZGF0YTsKPj4gKwlzdHJ1Y3QgZHdfZWRtYSAqZHcgPSBk d19pcnEtPmR3Owo+PiArCXVuc2lnbmVkIGxvbmcgdG90YWwsIHBvcywgdmFsOwo+PiArCXVuc2ln bmVkIGxvbmcgb2ZmOwo+PiArCXUzMiBtYXNrOwo+PiArCj4+ICsJaWYgKHdyaXRlKSB7Cj4+ICsJ CXRvdGFsID0gZHctPndyX2NoX2NudDsKPj4gKwkJb2ZmID0gMDsKPj4gKwkJbWFzayA9IGR3X2ly cS0+d3JfbWFzazsKPj4gKwl9IGVsc2Ugewo+PiArCQl0b3RhbCA9IGR3LT5yZF9jaF9jbnQ7Cj4+ ICsJCW9mZiA9IGR3LT53cl9jaF9jbnQ7Cj4+ICsJCW1hc2sgPSBkd19pcnEtPnJkX21hc2s7Cj4+ ICsJfQo+PiArCj4+ICsJcG9zID0gMDsKPj4gKwl2YWwgPSBkd19lZG1hX3YwX2NvcmVfc3RhdHVz X2RvbmVfaW50KGR3LCB3cml0ZSA/Cj4+ICsJCQkJCSAgICAgIEVETUFfRElSX1dSSVRFIDoKPj4g KwkJCQkJICAgICAgRURNQV9ESVJfUkVBRCk7Cj4+ICsJdmFsICY9IG1hc2s7Cj4+ICsJd2hpbGUg KChwb3MgPSBmaW5kX25leHRfYml0KCZ2YWwsIHRvdGFsLCBwb3MpKSAhPSB0b3RhbCkgewo+IAo+ IElzIHRoaXMgZnVubnkgdmVyc2lvbiBvZiBmb3JfZWFjaF9zZXRfYml0KCk/CgpJIHdhc24ndCBh d2FyZSBvZiB0aGF0IGhlbHBlci4gSSdsbCBjaGFuZ2UgdGhlIHdoaWxlIGxvb3AuCgo+IAo+PiAr CQlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0gJmR3LT5jaGFuW3BvcyArIG9mZl07Cj4+ICsK Pj4gKwkJZHdfZWRtYV9kb25lX2ludGVycnVwdChjaGFuKTsKPj4gKwkJcG9zKys7Cj4+ICsJfQo+ PiArCj4+ICsJcG9zID0gMDsKPj4gKwl2YWwgPSBkd19lZG1hX3YwX2NvcmVfc3RhdHVzX2Fib3J0 X2ludChkdywgd3JpdGUgPwo+PiArCQkJCQkgICAgICAgRURNQV9ESVJfV1JJVEUgOgo+PiArCQkJ CQkgICAgICAgRURNQV9ESVJfUkVBRCk7Cj4+ICsJdmFsICY9IG1hc2s7Cj4gCj4+ICsJd2hpbGUg KChwb3MgPSBmaW5kX25leHRfYml0KCZ2YWwsIHRvdGFsLCBwb3MpKSAhPSB0b3RhbCkgewo+IAo+ IERpdHRvLgoKSSB3YXNuJ3QgYXdhcmUgb2YgdGhhdCBoZWxwZXIuIEknbGwgY2hhbmdlIHRoZSB3 aGlsZSBsb29wLgoKPiAKPj4gKwkJc3RydWN0IGR3X2VkbWFfY2hhbiAqY2hhbiA9ICZkdy0+Y2hh bltwb3MgKyBvZmZdOwo+PiArCj4+ICsJCWR3X2VkbWFfYWJvcnRfaW50ZXJydXB0KGNoYW4pOwo+ PiArCQlwb3MrKzsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cj4+ICt9Cj4g Cj4+ICsJZG8gewo+PiArCQlyZXQgPSBkd19lZG1hX2RldmljZV90ZXJtaW5hdGVfYWxsKGRjaGFu KTsKPj4gKwkJaWYgKCFyZXQpCj4+ICsJCQlicmVhazsKPj4gKwo+PiArCQlpZiAodGltZV9hZnRl cl9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewo+PiArCQkJZGV2X2VycihjaGFuMmRldihjaGFuKSwg ImZyZWUgdGltZW91dFxuIik7Cj4+ICsJCQlyZXR1cm47Cj4+ICsJCX0KPj4gKwo+PiArCQljcHVf cmVsYXgoKTsKPiAKPj4gKwl9IHdoaWxlICgxKTsKPiAKPiBTbywgd2hhdCBwcmV2ZW50cyB5b3Ug dG8gZG8gd2hpbGUgKHRpbWVfYmVmb3JlKC4uLikpOyBoZXJlPwoKT25jZSBhZ2FpbiwgSSB3YXNu J3QgYXdhcmUgb2YgdGhhdCBoZWxwZXIuIEknbGwgY2hhbmdlIHRoZSBkbyB3aGlsZSBsb29wLgoK PiAKPj4gKwo+PiArCWRldl9kYmcoZGNoYW4yZGV2KGRjaGFuKSwgImNoYW5uZWwgZnJlZWRcbiIp Owo+PiArCj4+ICsJcG1fcnVudGltZV9wdXQoY2hhbi0+Y2hpcC0+ZGV2KTsKPj4gK30KPiAKPj4g K3N0YXRpYyBpbnQgZHdfZWRtYV9jaGFubmVsX3NldHVwKHN0cnVjdCBkd19lZG1hX2NoaXAgKmNo aXAsIGJvb2wgd3JpdGUsCj4+ICsJCQkJIHUzMiB3cl9hbGxvYywgdTMyIHJkX2FsbG9jKQo+PiAr ewo+PiArCXN0cnVjdCBkd19lZG1hX3JlZ2lvbiAqZHRfcmVnaW9uOwo+PiArCXN0cnVjdCBkZXZp Y2UgKmRldiA9IGNoaXAtPmRldjsKPj4gKwlzdHJ1Y3QgZHdfZWRtYSAqZHcgPSBjaGlwLT5kdzsK Pj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuOwo+PiArCXNpemVfdCBsbF9jaHVuaywgZHRf Y2h1bms7Cj4+ICsJc3RydWN0IGR3X2VkbWFfaXJxICppcnE7Cj4+ICsJc3RydWN0IGRtYV9kZXZp Y2UgKmRtYTsKPj4gKwl1MzIgaSwgaiwgY250LCBjaF9jbnQ7Cj4+ICsJdTMyIGFsbG9jLCBvZmZf YWxsb2M7Cj4+ICsJaW50IGVyciA9IDA7Cj4+ICsJdTMyIHBvczsKPj4gKwo+PiArCWNoX2NudCA9 IGR3LT53cl9jaF9jbnQgKyBkdy0+cmRfY2hfY250Owo+PiArCWxsX2NodW5rID0gZHctPmxsX3Jl Z2lvbi5zejsKPj4gKwlkdF9jaHVuayA9IGR3LT5kdF9yZWdpb24uc3o7Cj4+ICsKPj4gKwkvKiBD YWxjdWxhdGUgbGlua2VkIGxpc3QgY2h1bmsgZm9yIGVhY2ggY2hhbm5lbCAqLwo+PiArCWxsX2No dW5rIC89IHJvdW5kdXBfcG93X29mX3R3byhjaF9jbnQpOwo+PiArCj4+ICsJLyogQ2FsY3VsYXRl IGxpbmtlZCBsaXN0IGNodW5rIGZvciBlYWNoIGNoYW5uZWwgKi8KPj4gKwlkdF9jaHVuayAvPSBy b3VuZHVwX3Bvd19vZl90d28oY2hfY250KTsKPiAKPj4gKwlJTklUX0xJU1RfSEVBRCgmZG1hLT5j aGFubmVscyk7Cj4+ICsKPj4gKwlmb3IgKGogPSAwOyAoYWxsb2MgfHwgZHctPm5yX2lycXMgPT0g MSkgJiYgaiA8IGNudDsgaisrLCBpKyspIHsKPj4gKwkJY2hhbiA9ICZkdy0+Y2hhbltpXTsKPj4g Kwo+PiArCQlkdF9yZWdpb24gPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKmR0X3JlZ2lvbiks IEdGUF9LRVJORUwpOwo+PiArCQlpZiAoIWR0X3JlZ2lvbikKPj4gKwkJCXJldHVybiAtRU5PTUVN Owo+PiArCj4+ICsJCWNoYW4tPnZjLmNoYW4ucHJpdmF0ZSA9IGR0X3JlZ2lvbjsKPj4gKwo+PiAr CQljaGFuLT5jaGlwID0gY2hpcDsKPj4gKwkJY2hhbi0+aWQgPSBqOwo+PiArCQljaGFuLT5kaXIg PSB3cml0ZSA/IEVETUFfRElSX1dSSVRFIDogRURNQV9ESVJfUkVBRDsKPj4gKwkJY2hhbi0+Y29u ZmlndXJlZCA9IGZhbHNlOwo+PiArCQljaGFuLT5yZXF1ZXN0ID0gRURNQV9SRVFfTk9ORTsKPj4g KwkJY2hhbi0+c3RhdHVzID0gRURNQV9TVF9JRExFOwo+PiArCj4+ICsJCWNoYW4tPmxsX29mZiA9 IChsbF9jaHVuayAqIGkpOwo+PiArCQljaGFuLT5sbF9tYXggPSAobGxfY2h1bmsgLyBFRE1BX0xM X1NaKSAtIDE7Cj4+ICsKPj4gKwkJY2hhbi0+ZHRfb2ZmID0gKGR0X2NodW5rICogaSk7Cj4+ICsK Pj4gKwkJZGV2X2RiZyhkZXYsICJMLiBMaXN0Olx0Q2hhbm5lbCAlc1sldV0gb2ZmPTB4JS44bHgs IG1heF9jbnQ9JXVcbiIsCj4+ICsJCQl3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsIGosCj4+ICsJ CQljaGFuLT5sbF9vZmYsIGNoYW4tPmxsX21heCk7Cj4+ICsKPj4gKwkJaWYgKGR3LT5ucl9pcnFz ID09IDEpCj4+ICsJCQlwb3MgPSAwOwo+PiArCQllbHNlCj4+ICsJCQlwb3MgPSBvZmZfYWxsb2Mg KyAoaiAlIGFsbG9jKTsKPj4gKwo+PiArCQlpcnEgPSAmZHctPmlycVtwb3NdOwo+PiArCj4+ICsJ CWlmICh3cml0ZSkKPj4gKwkJCWlycS0+d3JfbWFzayB8PSBCSVQoaik7Cj4+ICsJCWVsc2UKPj4g KwkJCWlycS0+cmRfbWFzayB8PSBCSVQoaik7Cj4+ICsKPj4gKwkJaXJxLT5kdyA9IGR3Owo+PiAr CQltZW1jcHkoJmNoYW4tPm1zaSwgJmlycS0+bXNpLCBzaXplb2YoY2hhbi0+bXNpKSk7Cj4+ICsK Pj4gKwkJZGV2X2RiZyhkZXYsICJNU0k6XHRcdENoYW5uZWwgJXNbJXVdIGFkZHI9MHglLjh4JS44 eCwgZGF0YT0weCUuOHhcbiIsCj4+ICsJCQl3cml0ZSA/ICJ3cml0ZSIgOiAicmVhZCIsIGosCj4+ ICsJCQljaGFuLT5tc2kuYWRkcmVzc19oaSwgY2hhbi0+bXNpLmFkZHJlc3NfbG8sCj4+ICsJCQlj aGFuLT5tc2kuZGF0YSk7Cj4+ICsKPj4gKwkJY2hhbi0+dmMuZGVzY19mcmVlID0gdmNoYW5fZnJl ZV9kZXNjOwo+PiArCQl2Y2hhbl9pbml0KCZjaGFuLT52YywgZG1hKTsKPj4gKwo+PiArCQlkdF9y ZWdpb24tPnBhZGRyID0gZHctPmR0X3JlZ2lvbi5wYWRkciArIGNoYW4tPmR0X29mZjsKPj4gKwkJ ZHRfcmVnaW9uLT52YWRkciA9IGR3LT5kdF9yZWdpb24udmFkZHIgKyBjaGFuLT5kdF9vZmY7Cj4+ ICsJCWR0X3JlZ2lvbi0+c3ogPSBkdF9jaHVuazsKPj4gKwo+PiArCQlkZXZfZGJnKGRldiwgIkRh dGE6XHRDaGFubmVsICVzWyV1XSBvZmY9MHglLjhseFxuIiwKPj4gKwkJCXdyaXRlID8gIndyaXRl IiA6ICJyZWFkIiwgaiwgY2hhbi0+ZHRfb2ZmKTsKPj4gKwo+PiArCQlkd19lZG1hX3YwX2NvcmVf ZGV2aWNlX2NvbmZpZyhjaGFuKTsKPj4gKwl9Cj4+ICsKPj4gKwkvKiBTZXQgRE1BIGNoYW5uZWwg Y2FwYWJpbGl0aWVzICovCj4+ICsJZG1hX2NhcF96ZXJvKGRtYS0+Y2FwX21hc2spOwo+PiArCWRt YV9jYXBfc2V0KERNQV9TTEFWRSwgZG1hLT5jYXBfbWFzayk7Cj4+ICsJZG1hX2NhcF9zZXQoRE1B X0NZQ0xJQywgZG1hLT5jYXBfbWFzayk7Cj4gCj4gRG9lc24ndCBpdCB1c2VkIGZvciBzbGF2ZSB0 cmFuc2ZlcnM/Cj4gRE1BX1BSSVZBVEUgaXMgZ29vZCB0byBiZSBzZXQgZm9yIHRoaXMuCgpZZXAs IG1ha2VzIHNlbnNlLgoKPiAKPj4gKwlyZXR1cm4gZXJyOwo+PiArfQo+PiArCj4+ICtzdGF0aWMg aW5saW5lIHZvaWQgZHdfZWRtYV9kZWNfaXJxX2FsbG9jKGludCAqbnJfaXJxcywgdTMyICphbGxv YywgdTE2IGNudCkKPj4gK3sKPj4gKwlpZiAoKm5yX2lycXMgJiYgKmFsbG9jIDwgY250KSB7Cj4+ ICsJCSgqYWxsb2MpKys7Cj4+ICsJCSgqbnJfaXJxcyktLTsKPj4gKwl9Cj4gCj4gSSBkb24ndCBz ZWUgYW55IGFsbG9jYXRpb24gaGVyZS4KCkJhZCBmdW5jdGlvbiBhbmQgdmFyaWFibGUgbmFtaW5n Li4uIE1heWJlIGl0IHNob3VsZCBiZSBkd19lZG1hX0lSUV9zcHJlYWRlciBvcgpkd19lZG1hX0lS UV9kaXN0cmlidXRvciBvciBzaW1pbGFyLgoKSSB0cmllZCB0byBhZGQgc29tZSBpbnRlbGxpZ2Vu Y2UgdG8gdGhpcyBkcml2ZXIsIGluIG9yZGVyIHRvIGJlIGZsZXhpYmxlIGVub3VnaAp0byBhZGFw dCBpdCB0byBkaWZmZXJlbnQgc2l0dWF0aW9ucyB0aGF0IGNhbiBoYXBwZW4uCgpCZWNhdXNlIHdo byBoYXMgdGhpcyBJUCBjYW4gY29uZmlndXJlIGhhdmUgdGhlIGZyZWVkb20gdG8gY29uZmlndXJl IGluZGVwZW5kZW50bHk6CiAtIHRoZSBudW1iZXIgb2YgREVWX1RPX01FTSBjaGFubmVscwogLSB0 aGUgbnVtYmVyIG9mIE1FTV9UT19ERVYgY2hhbm5lbHMKIC0gdGhlIG51bWJlciBvZiBJUlFzCgp0 aGlzIGNyZWF0ZXMgYSB3b3JsZCBvZiBwb3NzaWJpbGl0aWVzIGluIHRlcm1zIG9mIElSUXMgYXNz aWdubWVudCB0byB0aG9zZSBjaGFubmVscy4KCkluIGEgcGVyZmVjdCB3b3JsZCwgdGhlIGJlc3Qg Y2FzZSB3b3VsZCBiZSB0byBoYXZlIGFuIHVuaXF1ZSBJUlEgYXNzaWduZWQgdG8KZWFjaCBjaGFu bmVsLCBob3dldmVyIHRoYXQgbWF5IG5vdCBiZSBwb3NzaWJsZS4KClRoZXJlZm9yZSwgdGhpcyBh bGdvcml0aG0gdHJpZXMgdG8gc3ByZWFkIGV2ZW5seSB0aGUgSVJRcyBiZXR3ZWVuIHRoZSBERVZf VE9fTUVNCmFuZCBNRU1fVE9fREVWIGNoYW5uZWxzLgoKTGV0IGltYWdpbmUgdGhlIGZvbGxvd2lu ZyBjYXNlOgogLSAzIE1FTV9UT19ERVYgY2hhbm5lbHMKIC0gMiBERVZfVE9fTUVNIGNoYW5uZWxz CiAtIDMgSVJRcwoKTUVNX1RPX0RFViBjaGFubmVscwogLSAjMCA9PiBJUlEgIzAKIC0gIzEgPT4g SVJRICMxIChzaGFyZWQgYmV0d2VlbiBjaGFubmVscyAjMSBhbmQgIzIpCiAtICMyID0+IElSUSAj MSAoc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgIzEgYW5kICMyKQpERVZfVE9fTUVNIGNoYW5uZWxz CiAtICMwID0+IElSUSAjMiAoc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgIzAgYW5kICMxKQogLSAj MSA9PiBJUlEgIzIgKHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzICMwIGFuZCAjMSkKCgpvciB0aGlz IG90aGVyIGNhc2U6CiAtIDUgTUVNX1RPX0RFViBjaGFubmVscwogLSA1IERFVl9UT19NRU0gY2hh bm5lbHMKIC0gNCBJUlFzCgpNRU1fVE9fREVWIGNoYW5uZWxzCiAtICMwID0+IElSUSAjMCAoc2hh cmVkIGJldHdlZW4gY2hhbm5lbHMgIzAsICMxIGFuZCAjMikKIC0gIzEgPT4gSVJRICMwIChzaGFy ZWQgYmV0d2VlbiBjaGFubmVscyAjMCwgIzEgYW5kICMyKQogLSAjMiA9PiBJUlEgIzAgKHNoYXJl ZCBiZXR3ZWVuIGNoYW5uZWxzICMwLCAjMSBhbmQgIzIpCiAtICMzID0+IElSUSAjMSAoc2hhcmVk IGJldHdlZW4gY2hhbm5lbHMgIzMgYW5kICM0KQogLSAjNCA9PiBJUlEgIzEgKHNoYXJlZCBiZXR3 ZWVuIGNoYW5uZWxzICMzIGFuZCAjNCkKREVWX1RPX01FTSBjaGFubmVscwogLSAjMCA9PiBJUlEg IzIgKHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzICMwLCAjMSBhbmQgIzIpCiAtICMxID0+IElSUSAj MiAoc2hhcmVkIGJldHdlZW4gY2hhbm5lbHMgIzAsICMxIGFuZCAjMikKIC0gIzIgPT4gSVJRICMy IChzaGFyZWQgYmV0d2VlbiBjaGFubmVscyAjMCwgIzEgYW5kICMyKQogLSAjMyA9PiBJUlEgIzMg KHNoYXJlZCBiZXR3ZWVuIGNoYW5uZWxzICMzIGFuZCAjNCkKIC0gIzQgPT4gSVJRICMzIChzaGFy ZWQgYmV0d2VlbiBjaGFubmVscyAjMyBhbmQgIzQpCgo+IAo+PiArfQo+PiArCj4+ICtzdGF0aWMg aW5saW5lIHZvaWQgZHdfZWRtYV9hZGRfaXJxX21hc2sodTMyICptYXNrLCB1MzIgYWxsb2MsIHUx NiBjbnQpCj4+ICt7Cj4gCj4+ICsJd2hpbGUgKCptYXNrICogYWxsb2MgPCBjbnQpCj4+ICsJCSgq bWFzaykrKzsKPiAKPiBEbyB5b3UgcmVhbGx5IG5lZWQgYSBsb29wIGhlcmU/CgpUaGF0IGlzIHRo ZSBhbGdvcml0aG0gdGhhdCBJJ3ZlIGRlc2lnbmVkLiBCYXNlZCBvbiB3aGF0IEkgaGF2ZSBleHBs YWluLCBwZXJoYXBzCnRoZXJlIGlzIHNvbWV0aGluZyB0aGF0IHlvdSBrbm93IG9mIHRoYXQgYWxy ZWFkeSBkb2VzIHdoYXQgSSBwcmV0ZW5kIHRvIGRvLgpJJ3ZlIHNlYXJjaGVkIGZvciBhbGdvcml0 aG1zIGFuZCBsaW51eCBrZXJuZWwgZnVuY3Rpb25zIGl0IGJ1dCB0aGUgb25seSB0aGluZwp3aXRo IHNpbWlsYXIgcmVzdWx0cyBpcyBsaW5lYXIgcHJvZ3JhbW1pbmcsIGJ1dCB0aGUgY29kZSBpbXBs ZW1lbnRhdGlvbiBvZiBpdApzZWVtcyB0byBiZSBvdmVya2lsbCBmb3IgdGhpcy4KCj4gCj4+ICt9 Cj4+ICsKPj4gK3N0YXRpYyBpbnQgZHdfZWRtYV9pcnFfcmVxdWVzdChzdHJ1Y3QgZHdfZWRtYV9j aGlwICpjaGlwLAo+PiArCQkJICAgICAgIHUzMiAqd3JfYWxsb2MsIHUzMiAqcmRfYWxsb2MpCj4+ ICt7Cj4+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gY2hpcC0+ZGV2Owo+PiArCXN0cnVjdCBkd19l ZG1hICpkdyA9IGNoaXAtPmR3Owo+PiArCXUzMiB3cl9tYXNrID0gMTsKPj4gKwl1MzIgcmRfbWFz ayA9IDE7Cj4+ICsJaW50IGksIGVyciA9IDA7Cj4+ICsJdTMyIGNoX2NudDsKPj4gKwo+PiArCWNo X2NudCA9IGR3LT53cl9jaF9jbnQgKyBkdy0+cmRfY2hfY250Owo+PiArCj4+ICsJaWYgKGR3LT5u cl9pcnFzIDwgMSkgewo+PiArCQlkZXZfZXJyKGRldiwgImludmFsaWQgbnVtYmVyIG9mIGlycXMg KCV1KVxuIiwgZHctPm5yX2lycXMpOwo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsK Pj4gKwlpZiAoZHctPm5yX2lycXMgPT0gMSkgewo+PiArCQkvKiBDb21tb24gSVJRIHNoYXJlZCBh bW9uZyBhbGwgY2hhbm5lbHMgKi8KPj4gKwkJZXJyID0gcmVxdWVzdF9pcnEocGNpX2lycV92ZWN0 b3IodG9fcGNpX2RldihkZXYpLCAwKSwKPj4gKwkJCQkgIGR3X2VkbWFfaW50ZXJydXB0X2NvbW1v biwKPj4gKwkJCQkgIElSUUZfU0hBUkVELCBkdy0+bmFtZSwgJmR3LT5pcnFbMF0pOwo+PiArCQlp ZiAoZXJyKSB7Cj4+ICsJCQlkdy0+bnJfaXJxcyA9IDA7Cj4+ICsJCQlyZXR1cm4gZXJyOwo+PiAr CQl9Cj4+ICsKPj4gKwkJZ2V0X2NhY2hlZF9tc2lfbXNnKHBjaV9pcnFfdmVjdG9yKHRvX3BjaV9k ZXYoZGV2KSwgMCksCj4+ICsJCQkJICAgJmR3LT5pcnFbMF0ubXNpKTsKPiAKPiBBcmUgeW91IGdv aW5nIHRvIGNhbGwgZWFjaCB0aW1lIHRvIHBjaV9pcnFfdmVjdG9yKCk/IEJ0dywgYW0gSSBtaXNz ZWQgcGNpX2lycV9hbGxvYygpPwoKSW4gdGhpcyBjYXNlIHRoaXMgaXMgY2FsbGVkIG9ubHkgb25j ZSAoZHctPm5yX2lycXMgPT0gMSkuCgo+IAo+PiArCX0gZWxzZSB7Cj4gCj4+ICsJCS8qIERpc3Ry aWJ1dGUgSVJRcyBlcXVhbGx5IGFtb25nIGFsbCBjaGFubmVscyAqLwo+PiArCQlpbnQgdG1wID0g ZHctPm5yX2lycXM7Cj4gCj4gSXMgaXQgYWx3YXlzIGFjaGlldmFibGU/CgpZZXMsIGJhc2Ugb24g d2hhdCBJIGhhdmUgZXhwbGFpbmVkIGJlZm9yZSwgaXQgcG9zc2libGUgdG8gZGlzdHJpYnV0ZSB0 aGUKYXZhaWxhYmxlIElSUSBhbW9uZyB0aGUgY2hhbm5lbHMgd2hpY2ggYWZ0ZXIgdGhhdCB3ZSBo YXZlIHRvIHNoYXJlIHRoZSBhbHJlYWR5CmFzc2lnbmVkIElSUSB0byB0aGUgcmVtYWluaW5nIGNo YW5uZWxzIGluIG9yZGVyIHRvIGdpdmUgdGhlIGVhY2ggY2hhbm5lbCBhIHdheQp0byBnZW5lcmF0 ZSBhbiBpbnRlcnJ1cHQuIE5ldmVyIHRoZSBsZXNzIHRoaXMgaXMgYSBiZXN0IGVmZm9ydCBhbGdv cml0aG0uCgo+IAo+PiArCj4+ICsJCXdoaWxlICh0bXAgJiYgKCp3cl9hbGxvYyArICpyZF9hbGxv YykgPCBjaF9jbnQpIHsKPj4gKwkJCWR3X2VkbWFfZGVjX2lycV9hbGxvYygmdG1wLCB3cl9hbGxv YywgZHctPndyX2NoX2NudCk7Cj4+ICsJCQlkd19lZG1hX2RlY19pcnFfYWxsb2MoJnRtcCwgcmRf YWxsb2MsIGR3LT5yZF9jaF9jbnQpOwo+PiArCQl9Cj4+ICsKPj4gKwkJZHdfZWRtYV9hZGRfaXJx X21hc2soJndyX21hc2ssICp3cl9hbGxvYywgZHctPndyX2NoX2NudCk7Cj4+ICsJCWR3X2VkbWFf YWRkX2lycV9tYXNrKCZyZF9tYXNrLCAqcmRfYWxsb2MsIGR3LT5yZF9jaF9jbnQpOwo+PiArCj4+ ICsJCWZvciAoaSA9IDA7IGkgPCAoKndyX2FsbG9jICsgKnJkX2FsbG9jKTsgaSsrKSB7Cj4+ICsJ CQllcnIgPSByZXF1ZXN0X2lycShwY2lfaXJxX3ZlY3Rvcih0b19wY2lfZGV2KGRldiksIGkpLAo+ PiArCQkJCQkgIGkgPCAqd3JfYWxsb2MgPwo+PiArCQkJCQkJZHdfZWRtYV9pbnRlcnJ1cHRfd3Jp dGUgOgo+PiArCQkJCQkJZHdfZWRtYV9pbnRlcnJ1cHRfcmVhZCwKPj4gKwkJCQkJICBJUlFGX1NI QVJFRCwgZHctPm5hbWUsCj4+ICsJCQkJCSAgJmR3LT5pcnFbaV0pOwo+PiArCQkJaWYgKGVycikg ewo+PiArCQkJCWR3LT5ucl9pcnFzID0gaTsKPj4gKwkJCQlyZXR1cm4gZXJyOwo+PiArCQkJfQo+ PiArCj4+ICsJCQlnZXRfY2FjaGVkX21zaV9tc2cocGNpX2lycV92ZWN0b3IodG9fcGNpX2Rldihk ZXYpLCBpKSwKPj4gKwkJCQkJICAgJmR3LT5pcnFbaV0ubXNpKTsKPj4gKwkJfQo+PiArCj4+ICsJ CWR3LT5ucl9pcnFzID0gaTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gZXJyOwo+PiArfQo+PiAr Cj4+ICtpbnQgZHdfZWRtYV9wcm9iZShzdHJ1Y3QgZHdfZWRtYV9jaGlwICpjaGlwKQo+PiArewo+ PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9IGNoaXAtPmRldjsKPj4gKwlzdHJ1Y3QgZHdfZWRtYSAq ZHcgPSBjaGlwLT5kdzsKPj4gKwl1MzIgd3JfYWxsb2MgPSAwOwo+PiArCXUzMiByZF9hbGxvYyA9 IDA7Cj4+ICsJaW50IGksIGVycjsKPj4gKwo+PiArCXJhd19zcGluX2xvY2tfaW5pdCgmZHctPmxv Y2spOwo+PiArCj4+ICsJLyogRmluZCBvdXQgaG93IG1hbnkgd3JpdGUgY2hhbm5lbHMgYXJlIHN1 cHBvcnRlZCBieSBoYXJkd2FyZSAqLwo+PiArCWR3LT53cl9jaF9jbnQgPSBkd19lZG1hX3YwX2Nv cmVfY2hfY291bnQoZHcsIEVETUFfRElSX1dSSVRFKTsKPj4gKwlpZiAoIWR3LT53cl9jaF9jbnQp IHsKPj4gKwkJZGV2X2VycihkZXYsICJpbnZhbGlkIG51bWJlciBvZiB3cml0ZSBjaGFubmVscygw KVxuIik7Cj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiArCX0KPj4gKwo+PiArCS8qIEZpbmQgb3V0 IGhvdyBtYW55IHJlYWQgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLwo+PiAr CWR3LT5yZF9jaF9jbnQgPSBkd19lZG1hX3YwX2NvcmVfY2hfY291bnQoZHcsIEVETUFfRElSX1JF QUQpOwo+PiArCWlmICghZHctPnJkX2NoX2NudCkgewo+PiArCQlkZXZfZXJyKGRldiwgImludmFs aWQgbnVtYmVyIG9mIHJlYWQgY2hhbm5lbHMoMClcbiIpOwo+PiArCQlyZXR1cm4gLUVJTlZBTDsK Pj4gKwl9Cj4+ICsKPj4gKwlkZXZfZGJnKGRldiwgIkNoYW5uZWxzOlx0d3JpdGU9JWQsIHJlYWQ9 JWRcbiIsCj4+ICsJCWR3LT53cl9jaF9jbnQsIGR3LT5yZF9jaF9jbnQpOwo+PiArCj4+ICsJLyog QWxsb2NhdGUgY2hhbm5lbHMgKi8KPj4gKwlkdy0+Y2hhbiA9IGRldm1fa2NhbGxvYyhkZXYsIGR3 LT53cl9jaF9jbnQgKyBkdy0+cmRfY2hfY250LAo+PiArCQkJCXNpemVvZigqZHctPmNoYW4pLCBH RlBfS0VSTkVMKTsKPj4gKwlpZiAoIWR3LT5jaGFuKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4g Kwo+PiArCXNucHJpbnRmKGR3LT5uYW1lLCBzaXplb2YoZHctPm5hbWUpLCAiZHctZWRtYS1jb3Jl OiVkIiwgY2hpcC0+aWQpOwo+PiArCj4+ICsJLyogRGlzYWJsZSBlRE1BLCBvbmx5IHRvIGVzdGFi bGlzaCB0aGUgaWRlYWwgaW5pdGlhbCBjb25kaXRpb25zICovCj4+ICsJZHdfZWRtYV92MF9jb3Jl X29mZihkdyk7Cj4+ICsKPj4gKwkvKiBSZXF1ZXN0IElSUXMgKi8KPj4gKwllcnIgPSBkd19lZG1h X2lycV9yZXF1ZXN0KGNoaXAsICZ3cl9hbGxvYywgJnJkX2FsbG9jKTsKPj4gKwlpZiAoZXJyKQo+ PiArCQlyZXR1cm4gZXJyOwo+PiArCj4gCj4+ICsJLyogU2V0dXAgd3JpdGUgY2hhbm5lbHMgKi8K Pj4gKwllcnIgPSBkd19lZG1hX2NoYW5uZWxfc2V0dXAoY2hpcCwgdHJ1ZSwgd3JfYWxsb2MsIHJk X2FsbG9jKTsKPj4gKwlpZiAoZXJyKQo+PiArCQlnb3RvIGVycl9pcnFfZnJlZTsKPj4gKwo+PiAr CS8qIFNldHVwIHJlYWQgY2hhbm5lbHMgKi8KPj4gKwllcnIgPSBkd19lZG1hX2NoYW5uZWxfc2V0 dXAoY2hpcCwgZmFsc2UsIHdyX2FsbG9jLCByZF9hbGxvYyk7Cj4+ICsJaWYgKGVycikKPj4gKwkJ Z290byBlcnJfaXJxX2ZyZWU7Cj4gCj4gSSB0aGluayB5b3UgbWF5IGxvb2sgaW50byBlcDkzeHgg ZHJpdmVyIHRvIHNlZSBob3cgZGlmZmVyZW50IHR5cGUgb2YgY2hhbm5lbHMKPiBhcmUgYWxsb2Nh dGVkIGFuZCBiZSBzZXQgdXAuCgpJIHRvb2sgYSBsb29rIGF0IHRoaXMgZHJpdmVyLCBidXQgSSdt IG5vdCBzZWVpbmcgd2hhdCBJIGNhbiBjb3B5IHRvIGltcHJvdmUgbXkKZHJpdmVyLCBpdCBzZWVt cyB0byBiZWhhdmUgZGlmZmVyZW50bHkgZnJvbSBtaW5lLiBGb3Igc3RhcnRlcnMsIHRoZXkgZG8g bm90CmRpc3Rpbmd1aXNoIGRpZmZlcmVudCBjaGFubmVscyBsaWtlIFdSSVRFIC8gUkVBRCwgYXMg SSBoYXZlIHRvIGRvIG9uIG1pbmUsIGJ1dCBJCm1pZ2h0IHNlZW4gaXQgd3JvbmdseS4KCj4gCj4+ ICsKPj4gKwkvKiBQb3dlciBtYW5hZ2VtZW50ICovCj4+ICsJcG1fcnVudGltZV9lbmFibGUoZGV2 KTsKPj4gKwo+PiArCS8qIFR1cm4gZGVidWdmcyBvbiAqLwo+PiArCWVyciA9IGR3X2VkbWFfdjBf Y29yZV9kZWJ1Z2ZzX29uKGNoaXApOwo+PiArCWlmIChlcnIpIHsKPj4gKwkJZGV2X2VycihkZXYs ICJ1bmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgc3RydWN0dXJlXG4iKTsKPj4gKwkJZ290byBlcnJf cG1fZGlzYWJsZTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gKwo+PiArZXJyX3BtX2Rp c2FibGU6Cj4+ICsJcG1fcnVudGltZV9kaXNhYmxlKGRldik7Cj4+ICtlcnJfaXJxX2ZyZWU6Cj4+ ICsJZm9yIChpID0gKGR3LT5ucl9pcnFzIC0gMSk7IGkgPj0gMDsgaS0tKQo+PiArCQlmcmVlX2ly cShwY2lfaXJxX3ZlY3Rvcih0b19wY2lfZGV2KGRldiksIGkpLCAmZHctPmlycVtpXSk7Cj4+ICsK Pj4gKwlkdy0+bnJfaXJxcyA9IDA7Cj4+ICsKPj4gKwlyZXR1cm4gZXJyOwo+PiArfQo+PiArRVhQ T1JUX1NZTUJPTF9HUEwoZHdfZWRtYV9wcm9iZSk7Cj4gCj4+ICsvKioKPj4gKyAqIHN0cnVjdCBk d19lZG1hX2NoaXAgLSByZXByZXNlbnRhdGlvbiBvZiBEZXNpZ25XYXJlIGVETUEgY29udHJvbGxl ciBoYXJkd2FyZQo+PiArICogQGRldjoJCSBzdHJ1Y3QgZGV2aWNlIG9mIHRoZSBlRE1BIGNvbnRy b2xsZXIKPj4gKyAqIEBpZDoJCQkgaW5zdGFuY2UgSUQKPj4gKyAqIEBpcnE6CQkgaXJxIGxpbmUK Pj4gKyAqIEBkdzoJCQkgc3RydWN0IGR3X2VkbWEgdGhhdCBpcyBmaWxlZCBieSBkd19lZG1hX3By b2JlKCkKPj4gKyAqLwo+PiArc3RydWN0IGR3X2VkbWFfY2hpcCB7Cj4+ICsJc3RydWN0IGRldmlj ZQkJKmRldjsKPj4gKwlpbnQJCQlpZDsKPj4gKwlpbnQJCQlpcnE7Cj4+ICsJc3RydWN0IGR3X2Vk bWEJCSpkdzsKPj4gK307Cj4+ICsKPj4gKy8qIEV4cG9ydCB0byB0aGUgcGxhdGZvcm0gZHJpdmVy cyAqLwo+PiArI2lmIElTX0VOQUJMRUQoQ09ORklHX0RXX0VETUEpCj4+ICtpbnQgZHdfZWRtYV9w cm9iZShzdHJ1Y3QgZHdfZWRtYV9jaGlwICpjaGlwKTsKPj4gK2ludCBkd19lZG1hX3JlbW92ZShz dHJ1Y3QgZHdfZWRtYV9jaGlwICpjaGlwKTsKPj4gKyNlbHNlCj4+ICtzdGF0aWMgaW5saW5lIGlu dCBkd19lZG1hX3Byb2JlKHN0cnVjdCBkd19lZG1hX2NoaXAgKmNoaXApCj4+ICt7Cj4+ICsJcmV0 dXJuIC1FTk9ERVY7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbmxpbmUgaW50IGR3X2VkbWFfcmVt b3ZlKHN0cnVjdCBkd19lZG1hX2NoaXAgKmNoaXApCj4+ICt7Cj4+ICsJcmV0dXJuIDA7Cj4+ICt9 Cj4+ICsjZW5kaWYgLyogQ09ORklHX0RXX0VETUEgKi8KPiAKPiBJcyBpdCBnb2luZyB0byBiZSB1 c2VkIGFzIGEgbGlicmFyeT8KCk15IGdvYWwgaXMgdG8gcHJvdmlkZSB0aGlzIGNvZGUgYXMgYSBk cml2ZXIgdG8gYmUgdXNlIGJ5IGFsbCBjdXN0b21lcnMgdGhhdCBoYXZlCnRoaXMgSVAsIGF2b2lk aW5nIGR1cGxpY2F0ZWQgY29kZSBhbmQgcmUtaW52ZW50aW5nIHRoZSB3aGVlbCBvdmVyIGFuZCBv dmVyLiBUaGF0CndheSwgdGhlIGN1c3RvbWVycyBjYW4gZm9jdXMgdGhlaXIgZW5lcmd5IG9uIHdy aXRpbmcgdGhlIG1haW4gZHJpdmVyIGNvZGUgKHdoaWNoCmNhbiBiZSBVU0IgRVAsIEV0aGVybmV0 IEVQLCB3aGF0ZXZlcikgYW5kIGltcGxlbWVudGluZyBvbiB0aGVpciBzaWRlIHRoZSBhY2Nlc3MK dG8gdGhpcyBkcml2ZXIgYnkgbG9va2luZyB0aGUgcmVmZXJlbmNlIFBDSWUgZ2x1ZS1sb2dpYyBk cml2ZXIgdGhhdCBJJ20KcHJvdmlkaW5nLiBJIGRvbid0IGtub3cgaWYgdGhpcyBhcyBjbGFyaWZp ZWQgeW91ciBxdWVzdGlvbiBvciBub3QuCgo+IAoKT25jZSBhZ2FpbiB0aGFua3MgZm9yIHlvdXIg ZmVlZGJhY2sgQW5keSEK