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,1/6] dma: Add Synopsys eDMA IP core driver From: Gustavo Pimentel Message-Id: <0768a44c-60d2-0983-b2e3-b8f711a24504@synopsys.com> Date: Mon, 17 Dec 2018 15:56:30 +0000 To: Vinod Koul , Gustavo Pimentel Cc: "linux-pci@vger.kernel.org" , "dmaengine@vger.kernel.org" , Eugeniy Paltsev , Andy Shevchenko , Joao Pinto List-ID: SGkgVmlub2QsCgpPbiAxNy8xMi8yMDE4IDA2OjUxLCBWaW5vZCBLb3VsIHdyb3RlOgo+IE9uIDEy LTEyLTE4LCAxMjoxMywgR3VzdGF2byBQaW1lbnRlbCB3cm90ZToKPj4gQWRkIFN5bm9wc3lzIGVE TUEgSVAgY29yZSBkcml2ZXIgdG8ga2VybmVsLgo+Pgo+PiBUaGlzIGNvcmUgZHJpdmVyLCBpbml0 aWFsaXplcyBhbmQgY29uZmlndXJlcyB0aGUgZURNQSBJUCB1c2luZyB2bWEtaGVscGVycwo+PiBm dW5jdGlvbnMgYW5kIGRtYS1lbmdpbmUgc3Vic3lzdGVtLgo+Pgo+PiBBbHNvIGNyZWF0ZXMgYW4g YWJzdHJhdGlvbiBsYXllciB0aHJvdWdoIGNhbGxiYWNrcyBhbGxvd2luZyBkaWZmZXJlbnQKPj4g cmVnaXN0ZXJzIG1hcHBpbmdzIGluIHRoZSBmdXR1cmUsIG9yZ2FuaXplZCBpbiB0byB2ZXJzaW9u cy4KPj4KPj4gVGhpcyBkcml2ZXIgY2FuIGJlIGNvbXBpbGUgYXMgYnVpbHQtaW4gb3IgZXh0ZXJu YWwgbW9kdWxlIGluIGtlcm5lbC4KPj4KPj4gVG8gZW5hYmxlIHRoaXMgZHJpdmVyIGp1c3Qgc2Vs ZWN0IERXX0VETUEgb3B0aW9uIGluIGtlcm5lbCBjb25maWd1cmF0aW9uLAo+PiBob3dldmVyIGl0 IHJlcXVpcmVzIGFuZCBzZWxlY3RzIGF1dG9tYXRpY2FsbHkgRE1BX0VOR0lORSBhbmQKPj4gRE1B X1ZJUlRVQUxfQ0hBTk5FTFMgb3B0aW9uIHRvby4KPiAKPiBUaGUgc3Vic3lzdGVtIG5hbWUgaXMg ZG1hZW5naW5lOiBzbyBwbGVhc2UgdXNlIHRoYXQgdGFnLiBJZiB5b3UgYXJlIG5vdAo+IGF3YXJl IHRoZW4gZ2l0IGxvZyBmb3IgdGhhdCBzdWJzeXN0ZW0gaGVscHMgeW91IHdpdGggdGhlIHBhdHRl cm5zCj4gZXhwZWN0ZWQKCk9rLCBJJ2xsIGNoYW5nZSBhbGwgcGF0Y2ggZGVzY3JpcHRpb24gdGFn cy4gRm9yIHNvbWUgcmVhc29uIEkgZ290IHRoZSBpZGVhIHRoYXQKdGhpcyB3b3VsZCBiZSB0aGUg Y29ycmVjdCB0YWcuCgo+IAo+IEkgZGlkIGEgcXVpY2sgbG9vayBhdCB0aGUgcGF0Y2gsIEkgaGF2 ZSBoaWdobGlnaHRlZCBmZXcgY29uY2VybnMgYW5kCj4gdGhleSByZXBlYXQgaW4gc2ltaWxhciBj b2RlIHBhdHRlcm5zIGluIHRoaXMgcGF0Y2gKCk9rLCBncmVhdCEgVGhhbmtzIFZpbm9kLgoKPiAK Pj4gKyNpbmNsdWRlICJkdy1lZG1hLWNvcmUuaCIKPj4gKyNpbmNsdWRlICIuLi9kbWFlbmdpbmUu aCIKPj4gKyNpbmNsdWRlICIuLi92aXJ0LWRtYS5oIgo+PiArCj4+ICsjZGVmaW5lIERSVl9DT1JF X05BTUUJCQkJImR3LWVkbWEtY29yZSIKPiAKPiBXaHkgaXMgdGhpcyByZXF1aXJlZD8KCkl0J3Mg dXNlIG9uIGRldm1fcmVxdWVzdF9pcnEoKSwgcmVxdWlyZXMgYSBuYW1lIHByb2JhYmx5IGZvciBk ZWJ1Z2dpbmcgcHJvcG9zZXMKb3IgdG8gc2hvdyBzb21lIG91dHB1dCB0byB0aGUgdXNlci4KCj4g Cj4+ICsKPj4gKyNkZWZpbmUgU0VUKHJlZywgbmFtZSwgdmFsKQkJCVwKPj4gKwlyZWcubmFtZSA9 IHZhbAo+PiArCj4+ICsjZGVmaW5lIFNFVF9CT1RIX0NIKG5hbWUsIHZhbHVlKQkJXAo+PiArCWRv IHsJCQkJCVwKPj4gKwkJU0VUKGR3LT53cl9lZG1hLCBuYW1lLCB2YWx1ZSk7CVwKPj4gKwkJU0VU KGR3LT5yZF9lZG1hLCBuYW1lLCB2YWx1ZSk7CVwKPj4gKwl9IHdoaWxlICgwKQo+IAo+IEkgYW0g bm90IHN1cmUgaG93IHRoaXMgaGVscHMsIG1ha2VzIHRoaW5ncyBub3QgZXhwbGljaXQuLgoKU2lu Y2UgdGhpcyBkcml2ZXIgaGFzIDIgY2hhbm5lbHMgKHdyaXRlIGFuZCByZWFkKSBJJ2QgbGlrZSB0 byBzaW1wbGlmeSBhbGwgdGhlCmNvbmZpZ3VyYXRpb25zIHRoYXQgSSd2ZSB0byBtYWtlIG9uIGJv dGggY2hhbm5lbHMgKGF2b2lkaW5nIGFueSBvbWlzc2lvbiksIHRoYXQKd2h5IEkgY3JlYXRlZCB0 aGlzIG1hY3JvLgoKU2hvdWxkIEkgYWRkIHNvbWUgY29tbWVudCBvbiB0b3Agb2YgdGhpcyBtYWNy byBvciBkbyB5b3UgdGhpbmsgdGhhdCBpcyBiZXR0ZXIgdG8KcmVwbGljYXRlIHRoZSBjb2RlIGZv ciBlYWNoIGNoYW5uZWw/Cgo+IAo+PiArc3RhdGljIHN0cnVjdCBkd19lZG1hX2J1cnN0ICpkd19l ZG1hX2FsbG9jX2J1cnN0KHN0cnVjdCBkd19lZG1hX2NodW5rICpjaHVuaykKPj4gK3sKPj4gKwlz dHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0gY2h1bmstPmNoYW47Cj4+ICsJc3RydWN0IGR3X2Vk bWFfYnVyc3QgKmJ1cnN0Owo+PiArCj4+ICsJYnVyc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qg ZHdfZWRtYV9idXJzdCksIEdGUF9OT1dBSVQpOwo+PiArCWlmICh1bmxpa2VseSghYnVyc3QpKSB7 Cj4+ICsJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiksICI6IGZhaWwgdG8gYWxsb2MgbmV3IGJ1cnN0 XG4iKTsKPiAKPiBubyBuZWVkIHRvIGxvZyBtZW0gYWxsb2MgZmFpbHVyZXMKCk9rLgoKPiAKPj4g KwkJcmV0dXJuIE5VTEw7Cj4+ICsJfQo+PiArCj4+ICsJSU5JVF9MSVNUX0hFQUQoJmJ1cnN0LT5s aXN0KTsKPj4gKwlidXJzdC0+c2FyID0gMDsKPj4gKwlidXJzdC0+ZGFyID0gMDsKPj4gKwlidXJz dC0+c3ogPSAwOwo+IAo+IHlvdSBkaWQga3phbGxvYyByaWdodD8KCk5pY2UgY2F0Y2ghIEkgZG9u J3QgbmVlZCB0aG9zZSB6ZXJvIGluaXRpYWxpemF0aW9uLCBzaW5jZSBJIHVzZSBremFsbG9jLiBJ J2xsCnJlbW92ZSB0aGVtLgoKPiAKPj4gKwo+PiArCWlmIChjaHVuay0+YnVyc3QpIHsKPj4gKwkJ YXRvbWljX2luYygmY2h1bmstPmJ1cnN0c19hbGxvYyk7Cj4gCj4gd2h5IGRvZXMgdGhpcyBuZWVk IGF0b21pYyB2YXJpYWJsZXM/CgpTaW5jZSB0aGUgdmFyaWFibGUgYnVyc3RzX2FsbG9jIGNhbiBi ZSBtYW5pcHVsYXRlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcKZnVuY3Rpb25zOiBkd19lZG1hX2Zy ZWVfZGVzYygpLCBkd19lZG1hX2RvbmVfaW50ZXJydXB0KCksCmR3X2VkbWFfZGV2aWNlX3Jlc3Vt ZSgpLCBkd19lZG1hX2RldmljZV9pc3N1ZV9wZW5kaW5nKCkgYW5kCmR3X2VkbWFfZGV2aWNlX3By ZXBfc2xhdmVfc2coKSAod2hpY2ggY2FuIGJlIGNhbGxlZCBpbiBkaWZmZXJlbnQgY29udGV4dHMp LCBJCnRob3VnaHQgaXQgd291bGQgYmUgc2FmZXIgdG8gZGVmaW5lIHRoaXMgdmFyaWFibGUgYXMg YXRvbWljLgoKSG93ZXZlciBsb29raW5nIG5vdywgSSBub3RpY2UgdGhhdCBJIGRvbid0IG5lZWQg aXQgc2luY2UKZHdfZWRtYV9kb25lX2ludGVycnVwdCgpLCBkd19lZG1hX2RldmljZV9yZXN1bWUo KSBhbmQKZHdfZWRtYV9kZXZpY2VfaXNzdWVfcGVuZGluZygpIGFyZSBwcm90ZWN0ZWQgYnkgYSBz cGluIGxvY2ssIGhvd2V2ZXIgSSBhbHNvCm5vdGljZWQgdGhhdCBkd19lZG1hX2ZyZWVfZGVzYygp IGFuZCBkd19lZG1hX2RldmljZV9wcmVwX3NsYXZlX3NnKCkgYXJlbid0CnByb3RlY3RlZCBhdCBh bGwuIEknbGwgYWRkIHRoZSBzcGluIGxvY2sgdG8gdGhvc2UgZnVuY3Rpb25zIGFuZCByZXBsYWNl IHRoZQphdG9taWMgdmFyaWFibGUgYnUgYSB1MzIgdHlwZS4KCj4gCj4+ICtzdGF0aWMgdm9pZCBk d19lZG1hX2ZyZWVfYnVyc3Qoc3RydWN0IGR3X2VkbWFfY2h1bmsgKmNodW5rKQo+PiArewo+PiAr CXN0cnVjdCBkd19lZG1hX2J1cnN0ICpjaGlsZCwgKl9uZXh0Owo+PiArCj4+ICsJaWYgKCFjaHVu ay0+YnVyc3QpCj4+ICsJCXJldHVybjsKPj4gKwo+PiArCS8vIFJlbW92ZSBhbGwgdGhlIGxpc3Qg ZWxlbWVudHMKPiAKPiBXZSBkb250IHVzZSBDOTkgc3R5bGUgY29tbWVudHMsIHBsZWFzZSB1c2Ug Cj4gICAgICAgICAvKiBzaW5nbGUgbGluZSAqLwo+IGFuZAo+ICAgICAgICAgLyoKPiAgICAgICAg ICAqIG11bHRpCj4gICAgICAgICAgKiBsaW5lCj4gICAgICAgICAgKi8KClVuZGVyc3Rvb2QsIEJq b3JuIGFsc28gd2FybmVkIG1lIGFib3V0IHRoYXQuIEknbGwgZml4IHRoYXQuCgo+IAo+PiArc3Rh dGljIHZvaWQgc3RhcnRfdHJhbnNmZXIoc3RydWN0IGR3X2VkbWFfY2hhbiAqY2hhbikKPj4gK3sK Pj4gKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7Cj4+ICsJc3RydWN0IGR3X2VkbWFfZGVzYyAq ZGVzYzsKPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaHVuayAqY2hpbGQsICpfbmV4dDsKPj4gKwljb25z dCBzdHJ1Y3QgZHdfZWRtYV9jb3JlX29wcyAqb3BzID0gY2hhbjJvcHMoY2hhbik7Cj4+ICsKPj4g Kwl2ZCA9IHZjaGFuX25leHRfZGVzYygmY2hhbi0+dmMpOwo+PiArCWlmICghdmQpCj4+ICsJCXJl dHVybjsKPj4gKwo+PiArCWRlc2MgPSB2ZDJkd19lZG1hX2Rlc2ModmQpOwo+PiArCWlmICghZGVz YykKPj4gKwkJcmV0dXJuOwo+PiArCj4+ICsJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoaWxk LCBfbmV4dCwgJmRlc2MtPmNodW5rLT5saXN0LCBsaXN0KSB7Cj4+ICsJCW9wcy0+c3RhcnQoY2hp bGQsICFkZXNjLT54ZmVyX3N6KTsKPj4gKwkJZGVzYy0+eGZlcl9zeiArPSBjaGlsZC0+c3o7Cj4+ ICsJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksCj4+ICsJCQkiOiB0cmFuc2ZlciBvZiAldSBieXRl cyBzdGFydGVkXG4iLCBjaGlsZC0+c3opOwo+PiArCj4+ICsJCWR3X2VkbWFfZnJlZV9idXJzdChj aGlsZCk7Cj4+ICsJCWlmIChhdG9taWNfcmVhZCgmY2hpbGQtPmJ1cnN0c19hbGxvYykpCj4+ICsJ CQlkZXZfZGJnKGNoYW4yZGV2KGNoYW4pLAo+PiArCQkJCSI6ICVkIGJ1cnN0cyBzdGlsbCBhbGxv Y2F0ZWRcbiIsCj4+ICsJCQkJYXRvbWljX3JlYWQoJmNoaWxkLT5idXJzdHNfYWxsb2MpKTsKPj4g KwkJbGlzdF9kZWwoJmNoaWxkLT5saXN0KTsKPj4gKwkJa2ZyZWUoY2hpbGQpOwo+PiArCQlhdG9t aWNfZGVjKCZkZXNjLT5jaHVua3NfYWxsb2MpOwo+PiArCj4+ICsJCXJldHVybjsKPj4gKwl9Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgZHdfZWRtYV9kZXZpY2VfY29uZmlnKHN0cnVjdCBkbWFf Y2hhbiAqZGNoYW4sCj4+ICsJCQkJIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCj4g Cj4gcGxlYXNlIGFsaWduIHRvIHByZWNlZGluZyBicmFjZS4gQWxzbyBydW5uaW5nIGNoZWNrcGF0 Y2ggd2l0aCAtLXN0cmljdAo+IG9wdGlvbiBoZWxwcywgd2FybmluZyBjaGVja3BhdGNoIGlzIGEg Z3VpZGVib29rIGFuZCBub3QgYSBydWxlIGJvb2shCgpJIGRpZG4ndCBrbm93IHRoYXQgb3B0aW9u IG9uIHRoZSBjaGVja3BhdGNoIHNjcmlwdC4gQ29vbCEKSSd2ZSBmaXhlZCBzb21lIHdhcm5pbmdz IGFuZCBjaGVja3Mgd2l0aCB0aGF0IG9wdGlvbiwgYnV0IHRoZXJlIGlzIHNvbWUgZmFsc2UKcG9z aXRpdmVzIHRoZXJlIHRoYXQgSSBkaWRuJ3QgZml4ZWQgbW9zdCBvZiB0aGVtIHJlbGF0ZWQgd2l0 aCBtYWNyb3MgKHJldXNlIGFuZApwYXJlbnRoZXNpcykuCgo+IAo+IAo+PiArewo+PiArCXN0cnVj dCBkd19lZG1hX2NoYW4gKmNoYW4gPSBkY2hhbjJkd19lZG1hX2NoYW4oZGNoYW4pOwo+PiArCWNv bnN0IHN0cnVjdCBkd19lZG1hX2NvcmVfb3BzICpvcHMgPSBjaGFuMm9wcyhjaGFuKTsKPj4gKwll bnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOwo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 Cj4+ICsJaW50IGVyciA9IDA7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+dmMu bG9jaywgZmxhZ3MpOwo+PiArCj4+ICsJaWYgKCFjb25maWcpIHsKPj4gKwkJZXJyID0gLUVJTlZB TDsKPj4gKwkJZ290byBlcnJfY29uZmlnOwo+PiArCX0KPj4gKwo+PiArCWlmIChjaGFuLT5jb25m aWd1cmVkKSB7Cj4+ICsJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiksICI6IGNoYW5uZWwgYWxyZWFk eSBjb25maWd1cmVkXG4iKTsKPj4gKwkJZXJyID0gLUVQRVJNOwo+PiArCQlnb3RvIGVycl9jb25m aWc7Cj4+ICsJfQo+PiArCj4+ICsJZGlyID0gY29uZmlnLT5kaXJlY3Rpb247Cj4gCj4gRGlyZWN0 aW9uIGlzIGRlcHJlY2lhdGVkLCBJIGhhdmUgYWxyZWFkeSByZW1vdmVkIHRoZSB1c2FnZXMsIHNv IHBsZWFzZQo+IGRvIG5vdCBhZGQgbmV3IG9uZXMuCj4gCj4gWW91IG5lZWQgdG8gdGFrZSBkaXJl Y3Rpb24gZm9yIHJlc3BlY3RpdmUgcHJlcF8gY2FsbHMKCk9rLCBJIGFscmVhZHkgZG8gdGhhdC4g SU1ITyBJIGZvdW5kIGl0IHN0cmFuZ2UgdG8gaGF2ZSB0aGUgc2FtZSBpbmZvcm1hdGlvbgpyZXBl YXRlZCBvbiB0d28gcGxhY2VzLiBCdXQgbm93IHRoYXQgeW91IHNheSB0aGF0IHRoaXMgaXMgZGVw cmVjYXRlZCwgaXQgbWFrZXMKc2Vuc2Ugbm93LgoKPiAKPj4gKwlpZiAoZGlyID09IERNQV9ERVZf VE9fTUVNICYmIGNoYW4tPmRpciA9PSBFRE1BX0RJUl9XUklURSkgewo+PiArCQlkZXZfaW5mbyhj aGFuMmRldihjaGFuKSwKPj4gKwkJCSI6IGRpcmVjdGlvbiBETUFfREVWX1RPX01FTSAoRURNQV9E SVJfV1JJVEUpXG4iKTsKPj4gKwkJY2hhbi0+cF9hZGRyID0gY29uZmlnLT5zcmNfYWRkcjsKPj4g Kwl9IGVsc2UgaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFViAmJiBjaGFuLT5kaXIgPT0gRURNQV9E SVJfUkVBRCkgewo+PiArCQlkZXZfaW5mbyhjaGFuMmRldihjaGFuKSwKPj4gKwkJCSI6IGRpcmVj dGlvbiBETUFfTUVNX1RPX0RFViAoRURNQV9ESVJfUkVBRClcbiIpOwo+PiArCQljaGFuLT5wX2Fk ZHIgPSBjb25maWctPmRzdF9hZGRyOwo+PiArCX0gZWxzZSB7Cj4+ICsJCWRldl9lcnIoY2hhbjJk ZXYoY2hhbiksICI6IGludmFsaWQgZGlyZWN0aW9uXG4iKTsKPj4gKwkJZXJyID0gLUVJTlZBTDsK Pj4gKwkJZ290byBlcnJfY29uZmlnOwo+PiArCX0KPiAKPiBUaGlzIHNob3VsZCBiZSByZW1vdmVk CgpZZWFoLCBpdCB3YXMganVzdCBmb3IgdmFsaWRhdGlvbiBwdXJwb3Nlcy4gTm93IHRoYXQgZGly ZWN0aW9uIGlzIGRlcHJlY2F0ZWQgb24KdGhlIEFQSSwgbWFrZXMgbm8gc2Vuc2UgdG8gdmFsaWRh dGUgaXQuCgo+IAo+PiArCj4+ICsJZGV2X2luZm8oY2hhbjJkZXYoY2hhbiksCj4+ICsJCSI6IHNy Y19hZGRyKHBoeXNpY2FsKSA9IDB4JS4xNnhcbiIsIGNvbmZpZy0+c3JjX2FkZHIpOwo+PiArCWRl dl9pbmZvKGNoYW4yZGV2KGNoYW4pLAo+PiArCQkiOiBkc3RfYWRkcihwaHlzaWNhbCkgPSAweCUu MTZ4XG4iLCBjb25maWctPmRzdF9hZGRyKTsKPiAKPiBZb3UgaGF2ZSB0b28gbWFueSBsb2dzLCBp dCBpcyBnb29kIGZvciBicmluZ3VwIGFuZCBpbml0aWFsIHdvcmsgYnV0IG5vdAo+IHN1aXRlZCBm b3IgcHJvZHVjdGlvbi4KCllvdSdyZSByaWdodC4gQW5keSBTaGV2Y2hlbmtvIGFsc28gd2FybmVk IG1lIGFib3V0IHRoYXQuIEkndmUgbW92ZSBwcmV0dHkgYWxsCmZyb20gaW5mbyB0byBkYmcuCgo+ IAo+PiArCj4+ICsJZXJyID0gb3BzLT5kZXZpY2VfY29uZmlnKGRjaGFuKTsKPiAKPiBva2F5IHdo YXQgZG9lcyB0aGlzIGNhbGxiYWNrIGRvLiBZb3UgYXJlIGFscmVhZHkgdW5kZXIgYW5kIGRtYWVu Z2luZSBmd2sKPiBzbyB3aGF0IGlzIHRoZSBuZWVkIHRvIGFkZCBvbmUgbW9yZSBhYnN0cmFjdGlv biBsYXllciwgY2FuIHlvdSBleHBsYWluCj4gdGhhdCBpbiBkZXRhaWxzIHBsZWFzZQoKVGhpcyBj YWxsYmFjayBqdXN0IGNvbmZpZ3VyZXMgdGhlIGVETUEgSFcgYmxvY2sgaW50ZXJydXB0IGFkZHJl c3MgKGFib3J0IGFuZApkb25lKSBhbmQgZGF0YSBmb3IgZWFjaCBjaGFubmVsLiBUaGlzIGNhbGxi YWNrIGNvdWxkIGVhc2lseSBtb3ZlZCB0byB0aGUKZHdfZWRtYV9wcm9iZSgpIHdoZXJlIGVhY2gg Y2hhbm5lbCBpcyBjcmVhdGVkIGF0IGZpcnN0LgpTaG91bGQgSSBkbyBpdCBpbiB5b3VyIG9waW5p b24/Cgo+IAo+PiArc3RhdGljIGludCBkd19lZG1hX2RldmljZV9wYXVzZShzdHJ1Y3QgZG1hX2No YW4gKmRjaGFuKQo+PiArewo+PiArCXN0cnVjdCBkd19lZG1hX2NoYW4gKmNoYW4gPSBkY2hhbjJk d19lZG1hX2NoYW4oZGNoYW4pOwo+PiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+ICsJaW50IGVy ciA9IDA7Cj4+ICsKPj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hhbi0+dmMubG9jaywgZmxhZ3Mp Owo+PiArCj4+ICsJaWYgKCFjaGFuLT5jb25maWd1cmVkKSB7Cj4+ICsJCWRldl9lcnIoZGNoYW4y ZGV2KGRjaGFuKSwgIjogY2hhbm5lbCBub3QgY29uZmlndXJlZFxuIik7Cj4+ICsJCWVyciA9IC1F UEVSTTsKPj4gKwkJZ290byBlcnJfcGF1c2U7Cj4+ICsJfQo+PiArCj4+ICsJc3dpdGNoIChjaGFu LT5zdGF0dXMpIHsKPj4gKwljYXNlIEVETUFfU1RfSURMRToKPj4gKwkJZGV2X2VycihkY2hhbjJk ZXYoZGNoYW4pLCAiOiBjaGFubmVsIGlzIGlkbGVcbiIpOwo+PiArCQllcnIgPSAtRVBFUk07Cj4+ ICsJCWdvdG8gZXJyX3BhdXNlOwo+PiArCWNhc2UgRURNQV9TVF9QQVVTRToKPj4gKwkJZGV2X2Vy cihkY2hhbjJkZXYoZGNoYW4pLCAiOiBjaGFubmVsIGlzIGFscmVhZHkgcGF1c2VkXG4iKTsKPj4g KwkJZXJyID0gLUVQRVJNOwo+PiArCQlnb3RvIGVycl9wYXVzZTsKPj4gKwljYXNlIEVETUFfU1Rf QlVTWToKPj4gKwkJLy8gT25seSBhY2NlcHRhYmxlIHN0YXRlCj4+ICsJCWJyZWFrOwo+IAo+IERv ZXNuJ3QgaXQgbG9vayBhcyBvdmVya2lsbCB0byB1c2Ugc3dpdGNoIGZvciBzaW5nbGUgYWNjZXB0 YWJsZSBjYXNlLgo+IFdoeSBub3QgZG8KPiAKPiAgICAgICAgIGlmIChjaGFuLT5zdGF0dXMgIT0g RURNQV9TVF9CVVNZKSB7Cj4gICAgICAgICAgICAgICAgIGVyciA9IC1FUEVSTTsKPiAgICAgICAg ICAgICAgICAgLi4uCj4gICAgICAgICB9CgpUaGUgaWRlYSBiZWhpbmQgb2YgdGhpcyB3YXMgdG8g aGF2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50IHN0YXRlLApidXQgbGlrZSB5 b3Ugc2FpZCBiZWZvcmUgaXQncyBuaWNlIGZvciBicmluZyB1cCBhbmQgaW5pdGlhbCB3b3JrIGJ1 dCBub3QgaXQgbm90CnN1aXRhYmxlIGZvciBwcm9kdWN0aW9uLiBJJ2xsIHJld29yayBpdC4KPiAK Pj4gKwlkZWZhdWx0Ogo+PiArCQlkZXZfZXJyKGRjaGFuMmRldihkY2hhbiksICI6IGludmFsaWQg c3RhdHVzIHN0YXRlXG4iKTsKPj4gKwkJZXJyID0gLUVJTlZBTDsKPj4gKwkJZ290byBlcnJfcGF1 c2U7Cj4+ICsJfQo+PiArCj4+ICsJc3dpdGNoIChjaGFuLT5yZXF1ZXN0KSB7Cj4gCj4gd2hhdCBp cyB0aGUgbmVlZCB0byB0cmFjayBjaGFubmVsIHN0YXR1cyBhbmQgY2hhbm5lbCByZXF1ZXN0cz8K PiAKCkp1c3QgdG8gYXZvaWQgbWlzdGFrZXMgZnJvbSBvdGhlciBkcml2ZXIgdGhhdCB3b3VsZCB1 c2UgdGhpcyBkcml2ZXIgdG8gdHJhbnNmZXIKZGF0YSB0by9mcm9tIHRoZSBkZXZpY2UuIE1heWJl IEknbSBiZWluZyBwYXJhbm9pZC4KCgpUaGFua3MgVmlub2QgZm9yIHRoZSByZXZpZXchCg==