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,4/6] dma: Add Synopsys eDMA IP PCIe glue-logic From: Gustavo Pimentel Message-Id: Date: Thu, 13 Dec 2018 14:40:40 +0000 To: Andy Shevchenko , Gustavo Pimentel Cc: "linux-pci@vger.kernel.org" , "dmaengine@vger.kernel.org" , Vinod Koul , Eugeniy Paltsev , Lorenzo Pieralisi , Joao Pinto List-ID: SGksCgpPbiAxMi8xMi8yMDE4IDEzOjI1LCBBbmR5IFNoZXZjaGVua28gd3JvdGU6Cj4gT24gV2Vk LCBEZWMgMTIsIDIwMTggYXQgMTI6MTM6MjRQTSArMDEwMCwgR3VzdGF2byBQaW1lbnRlbCB3cm90 ZToKPj4gU3lub3BzeXMgZURNQSBJUCBpcyBub3JtYWxseSBkaXN0cmlidXRlZCBhbG9uZyB3aXRo IFN5bm9wc3lzIFBDSWUKPj4gRW5kUG9pbnQgSVAgKGRlcGVuZHMgb2YgdGhlIHVzZSBhbmQgbGlj ZW5zaW5nIGFncmVlbWVudCkuCj4+Cj4+IFRoaXMgSVAgcmVxdWlyZXMgc29tZSBiYXNpYyBjb25m aWd1cmF0aW9ucywgc3VjaCBhczoKPj4gIC0gZURNQSByZWdpc3RlcnMgQkFSCj4+ICAtIGVETUEg cmVnaXN0ZXJzIG9mZnNldAo+PiAgLSBlRE1BIGxpbmtlZCBsaXN0IEJBUgo+PiAgLSBlRE1BIGxp bmtlZCBsaXN0IG9mZnNldAo+PiAgLSBlRE1BIGxpbmtlZCBsaXN0IHNpemUKPj4gIC0gZURNQSB2 ZXJzaW9uCj4+ICAtIGVETUEgbW9kZQo+Pgo+PiBBcyBhIHdvcmtpbmcgZXhhbXBsZSwgUENJZSBn bHVlLWxvZ2ljIHdpbGwgYXR0YWNoIHRvIGEgU3lub3BzeXMgUENJZQo+PiBFbmRQb2ludCBJUCBw cm90b3R5cGUga2l0IChWZW5kb3IgSUQgPSAweDE2YzMsIERldmljZSBJRCA9IDB4ZWRkYSksCj4+ IHdoaWNoIGhhcyBidWlsdC1pbiBhbiBlRE1BIElQIHdpdGggdGhpcyBkZWZhdWx0IGNvbmZpZ3Vy YXRpb246Cj4+ICAtIGVETUEgcmVnaXN0ZXJzIEJBUiA9IDAKPj4gIC0gZURNQSByZWdpc3RlcnMg b2Zmc2V0ID0gMHgxMDAwICg0IEtieXRlcykKPj4gIC0gZURNQSBsaW5rZWQgbGlzdCBCQVIgPSAy Cj4+ICAtIGVETUEgbGlua2VkIGxpc3Qgb2Zmc2V0ID0gMHgwICgwIEtieXRlcykKPj4gIC0gZURN QSBsaW5rZWQgbGlzdCBzaXplID0gMHgyMDAwMCAoMTI4IEtieXRlcykKPj4gIC0gZURNQSB2ZXJz aW9uID0gMAo+PiAgLSBlRE1BIG1vZGUgPSBFRE1BX01PREVfVU5ST0xMCj4+Cj4+IFRoaXMgZHJp dmVyIGNhbiBiZSBjb21waWxlIGFzIGJ1aWx0LWluIG9yIGV4dGVybmFsIG1vZHVsZSBpbiBrZXJu ZWwuCj4+Cj4+IFRvIGVuYWJsZSB0aGlzIGRyaXZlciBqdXN0IHNlbGVjdCBEV19FRE1BX1BDSUUg b3B0aW9uIGluIGtlcm5lbAo+PiBjb25maWd1cmF0aW9uLCBob3dldmVyIGl0IHJlcXVpcmVzIGFu ZCBzZWxlY3RzIGF1dG9tYXRpY2FsbHkgRFdfRURNQQo+PiBvcHRpb24gdG9vLgo+IAo+IEl0IHNl ZW1zIHRoaXMgZHJpdmVyIHNvbWVob3cgd3JpdHRlbiBhcyBhIGNvcHktcGFzdGUgb2YgZXhpc3Rp bmcgcGllY2VzIHcvbyBnb29kIHJlYXNvbnMgdG8gZG8gc3VjaC4KCldoYXQgZG8geW91IG1lYW4/ IEl0J3MgdHJ1ZSBJIHJlbGllZCBvbiBleGlzdGluZyBkcml2ZXJzIHRvIGRldmVsb3AgdGhpcwpz b2x1dGlvbiwgYnV0IGlzIG5vdCBpdCBzdXBwb3NlZCB0byBiZSBzbz8KCj4gCj4+ICtlbnVtIGR3 X2VkbWFfcGNpZV9iYXIgewo+PiArCUJBUl8wLAo+PiArCUJBUl8xLAo+PiArCUJBUl8yLAo+PiAr CUJBUl8zLAo+PiArCUJBUl80LAo+PiArCUJBUl81Cj4+ICt9Owo+IAo+IFdoeSBkbyB5b3UgbmVl ZCB0aGlzIGF0IGFsbD8KClNlZSBteSBhbnN3ZXIgYmVsb3cuCgo+IAo+PiArc3RhdGljIGNvbnN0 IHN0cnVjdCBkd19lZG1hX3BjaWVfZGF0YSBzbnBzX2VkZGFfZGF0YSA9IHsKPj4gKwkvLyBlRE1B IHJlZ2lzdGVycyBsb2NhdGlvbgo+PiArCS5yZWdzX2JhcgkJCT0gQkFSXzAsCj4+ICsJLnJlZ3Nf b2ZmCQkJPSAweDEwMDAsCS8vICAgNCBLQnl0ZXMKPj4gKwkvLyBlRE1BIG1lbW9yeSBsaW5rZWQg bGlzdCBsb2NhdGlvbgo+PiArCS5sbF9iYXIJCQkJPSBCQVJfMiwKPj4gKwkubGxfb2ZmCQkJCT0g MCwJCS8vICAgMCBLQnl0ZXMKPj4gKwkubGxfc3oJCQkJPSAweDIwMDAwLAkvLyAxMjggS0J5dGVz Cj4+ICsJLy8gT3RoZXIKPj4gKwkudmVyc2lvbgkJCT0gMCwKPj4gKwkubW9kZQkJCQk9IEVETUFf TU9ERV9VTlJPTEwsCj4+ICt9Owo+IAo+IEh1aD8gSXNuJ3QgdGhpcyAKClRoZSBlRE1BIGlzIGEg aGFyZHdhcmUgYmxvY2sgKHdpdGggcmVxdWlyZXMgc29tZSBjb25maWd1cmF0aW9uKSBhY2Nlc3Np YmxlCnRocm91Z2ggYSBQQ0llIEVuZFBvaW50LCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGlzbid0IGFu eSB3YXkgZm9yIG5vdyAoYXQgbGVhc3QpCnRocm91Z2ggYW4gUENJZSBjYXBhYmlsaXR5IGZvciBp bnN0YW5jZSB0byBkZXRlY3QgdGhvc2UgY29uZmlndXJhdGlvbnMKYXV0b21hdGljYWxseSwgdGhl cmVmb3JlIHRoZSBvbmx5IHdheSB0byBwYXNzIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0byBhc3Nv Y2lhdGUKaXQgdG8gUENJZSBWZW5kb3IoMHgxNmMzKSBhbmQgRGV2aWNlICgweGVkZGEpIElkLgoK VG8gaW50ZXJhY3Qgd2l0aCBlRE1BIGhhcmR3YXJlIGJsb2NrIHRoZSBkcml2ZXIgbmVlZHMgdG8g YWNjZXNzIHRoZSBlRE1BCnJlZ2lzdGVycyBhbmQgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IGlzIHRo cm91Z2ggUENJZSBtYXBwaW5nLiBJbiB0aGlzIHRob3NlCnJlZ2lzdGVycyB3aWxsIGJlIGF2YWls YWJsZSBvbiBCQVIgMCwgd2l0aCBhIG9mZnNldCBvZiA0S0IgZnJvbSB0aGUgc3RhcnQuCgpUaGUg ZHJpdmVyIGFsc28gcmVxdWlyZXMgYSBtZW1vcnkgc3BhY2UgKFJBTSkgdG8gY3JlYXRlIGEgbGlu a2VkIGxpc3QKZGVzY3JpcHRvcnMgYW5kIHBhc3MgdGhlIGZpcnN0IGRlc2NyaXB0b3IgYWRkcmVz cyB0byB0aGUgZURNQSBoYXJkd2FyZSBibG9jayBzbwp0aGF0IGl0IGNhbiBzdGFydCBwZXJmb3Jt aW5nIHRoZSB0cmFuc2ZlciBhdXRvbm9tb3VzbHkuIE9uY2UgYWdhaW4gdGhpcyBtZW1vcnkKc3Bh Y2UgaXMgcHJvdmlkZSB0aHJvdWdoIFBDSWUgb24gQkFSIDIuIFRoaXMgbGlua2VkIGxpc3Qgc3Bh Y2UgaXMgaW4gdGhlCmJlZ2lubmluZyBhbmQgaXQncyByZXN0cmljdGVkIHRvIGEgc2l6ZSBvZiAx MjhLQi4KClNpbmNlIHRoaXMgZURNQSBoYXJkd2FyZSBibG9jayAobW9yZSBzcGVjaWZpY2FsbHkg ZURNQSByZWdpc3RlcnMpIGNhbiBldm9sdmUgaW4KdGhlIGZ1dHVyZSwgSSBjaG9vc2VkIHRvIHB1 dCBoZXJlIGEgdmVyc2lvbiBpbiBvcmRlciB0byBoYXZlIGEgZHJpdmVyIHRoYXQgY2FuCmJlIGVh c2lseSBhZGFwdGFibGUgYW5kIHJldXNhYmxlIHdpdGhvdXQgbXVjaCBlZmZvcnQuCgo+IAo+PiAr Cj4+ICtzdGF0aWMgaW50IGR3X2VkbWFfcGNpZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwK Pj4gKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQpCj4+ICt7Cj4+ICsJ Y29uc3Qgc3RydWN0IGR3X2VkbWFfcGNpZV9kYXRhICpwZGF0YSA9ICh2b2lkICopcGlkLT5kcml2 ZXJfZGF0YTsKPj4gKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2Owo+PiArCXN0cnVj dCBkd19lZG1hX2NoaXAgKmNoaXA7Cj4+ICsJc3RydWN0IGR3X2VkbWEgKmR3Owo+PiArCXZvaWQg X19pb21lbSAqcmVnOwo+PiArCWludCBlcnIsIGlycSA9IC0xOwo+PiArCXUzMiBhZGRyX2hpLCBh ZGRyX2xvOwo+PiArCXUxNiBmbGFnczsKPj4gKwl1OCBjYXBfb2ZmOwo+PiArCj4+ICsJaWYgKCFw ZGF0YSkgewo+PiArCQlkZXZfZXJyKGRldiwgIiVzIG1pc3NpbmcgZGF0YSBzdHJ1dHVyZVxuIiwK Pj4gKwkJCXBjaV9uYW1lKHBkZXYpKTsKPj4gKwkJcmV0dXJuIC1FRkFVTFQ7Cj4+ICsJfQo+PiAr Cj4+ICsJZXJyID0gcGNpbV9lbmFibGVfZGV2aWNlKHBkZXYpOwo+PiArCWlmIChlcnIpIHsKPj4g KwkJZGV2X2VycihkZXYsICIlcyBlbmFibGluZyBkZXZpY2UgZmFpbGVkXG4iLAo+PiArCQkJcGNp X25hbWUocGRldikpOwo+PiArCQlyZXR1cm4gZXJyOwo+PiArCX0KPj4gKwo+IAo+PiArCWVyciA9 IHBjaW1faW9tYXBfcmVnaW9ucyhwZGV2LCAxIDw8IHBkYXRhLT5yZWdzX2JhciwgcGNpX25hbWUo cGRldikpOwo+PiArCWlmIChlcnIpIHsKPj4gKwkJZGV2X2VycihkZXYsICIlcyBlRE1BIHJlZ2lz dGVyIEJBUiBJL08gbWVtb3J5IHJlbWFwcGluZyBmYWlsZWRcbiIsCj4+ICsJCQlwY2lfbmFtZShw ZGV2KSk7Cj4+ICsJCXJldHVybiBlcnI7Cj4+ICsJfQo+PiArCj4+ICsJZXJyID0gcGNpbV9pb21h cF9yZWdpb25zKHBkZXYsIDEgPDwgcGRhdGEtPmxsX2JhciwgcGNpX25hbWUocGRldikpOwo+PiAr CWlmIChlcnIpIHsKPj4gKwkJZGV2X2VycihkZXYsICIlcyBlRE1BIGxpbmtlZCBsaXN0IEJBUiBJ L08gcmVtYXBwaW5nIGZhaWxlZFxuIiwKPj4gKwkJCXBjaV9uYW1lKHBkZXYpKTsKPj4gKwkJcmV0 dXJuIGVycjsKPj4gKwl9Cj4gCj4gVGhpcyBjb3VsZCBiZSBkb25lIGluIG9uZSBjYWxsLgoKWWVz LCB0aGF0J3MgdHJ1ZS4gSSB3aWxsIGNoYW5nZSB0aGF0LgoKPiAKPj4gKwo+PiArCXBjaV9zZXRf bWFzdGVyKHBkZXYpOwo+PiArCj4gCj4+ICsJZXJyID0gcGNpX3RyeV9zZXRfbXdpKHBkZXYpOwo+ PiArCWlmIChlcnIpIHsKPj4gKwkJZGV2X2VycihkZXYsICIlcyBETUEgbWVtb3J5IHdyaXRlIGlu dmFsaWRhdGVcbiIsCj4+ICsJCQlwY2lfbmFtZShwZGV2KSk7Cj4+ICsJCXJldHVybiBlcnI7Cj4+ ICsJfQo+IAo+IEFyZSB5b3Ugc3VyZSB5b3UgbmVlZCB0aGlzPwoKSSdtIG5vdCBzdXJlLCBwcm9i YWJseSBub3QuIEkgc2F3IHVzaW5nIHRoaXMgYmVpbmcgdXNlIG9uIC9kbWEvZHcvcGNpLmMgZHJp dmVyLgpJJ2xsIHRlc3Qgd2l0aG91dCBpdC4KCj4gCj4+ICsKPj4gKwllcnIgPSBwY2lfc2V0X2Rt YV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwo+PiArCWlmIChlcnIpIHsKPj4gKwkJZGV2 X2VycihkZXYsICIlcyBETUEgbWFzayBzZXQgZmFpbGVkXG4iLAo+PiArCQkJcGNpX25hbWUocGRl dikpOwo+PiArCQlyZXR1cm4gZXJyOwo+PiArCX0KPj4gKwo+PiArCWVyciA9IHBjaV9zZXRfY29u c2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKPj4gKwlpZiAoZXJyKSB7 Cj4+ICsJCWRldl9lcnIoZGV2LCAiJXMgY29uc2lzdGVudCBETUEgbWFzayBzZXQgZmFpbGVkXG4i LAo+PiArCQkJcGNpX25hbWUocGRldikpOwo+PiArCQlyZXR1cm4gZXJyOwo+PiArCX0KPj4gKwo+ PiArCWNoaXAgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpjaGlwKSwgR0ZQX0tF Uk5FTCk7Cj4+ICsJaWYgKCFjaGlwKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWR3 ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqZHcpLCBHRlBfS0VSTkVMKTsKPj4g KwlpZiAoIWR3KQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWlycSA9IHBjaV9hbGxv Y19pcnFfdmVjdG9ycyhwZGV2LCAxLCAxLCBQQ0lfSVJRX01TSSB8IFBDSV9JUlFfTVNJWCk7Cj4+ ICsJaWYgKGlycSA8IDApIHsKPj4gKwkJZGV2X2VycihkZXYsICIlcyBmYWlsZWQgdG8gYWxsb2Mg SVJRIHZlY3RvclxuIiwKPj4gKwkJCXBjaV9uYW1lKHBkZXYpKTsKPj4gKwkJcmV0dXJuIC1FUEVS TTsKPj4gKwl9Cj4+ICsKPj4gKwljaGlwLT5kdyA9IGR3Owo+PiArCWNoaXAtPmRldiA9IGRldjsK Pj4gKwljaGlwLT5pZCA9IHBkZXYtPmRldmZuOwo+PiArCWNoaXAtPmlycSA9IHBkZXYtPmlycTsK Pj4gKwo+PiArCWR3LT5yZWdzID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtwZGF0YS0+cmVnc19i YXJdOwo+PiArCWR3LT5yZWdzICs9IHBkYXRhLT5yZWdzX29mZjsKPj4gKwo+PiArCWR3LT52YV9s bCA9IHBjaW1faW9tYXBfdGFibGUocGRldilbcGRhdGEtPmxsX2Jhcl07Cj4+ICsJZHctPnZhX2xs ICs9IHBkYXRhLT5sbF9vZmY7Cj4+ICsJZHctPnBhX2xsID0gcGRldi0+cmVzb3VyY2VbcGRhdGEt PmxsX2Jhcl0uc3RhcnQ7Cj4+ICsJZHctPnBhX2xsICs9IHBkYXRhLT5sbF9vZmY7Cj4+ICsJZHct PmxsX3N6ID0gcGRhdGEtPmxsX3N6Owo+PiArCj4+ICsJZHctPm1zaV9hZGRyID0gMDsKPj4gKwlk dy0+bXNpX2RhdGEgPSAwOwo+PiArCj4+ICsJZHctPnZlcnNpb24gPSBwZGF0YS0+dmVyc2lvbjsK Pj4gKwlkdy0+bW9kZSA9IHBkYXRhLT5tb2RlOwo+PiArCj4+ICsJZGV2X2luZm8oZGV2LCAiVmVy c2lvbjpcdCV1XG4iLCBkdy0+dmVyc2lvbik7Cj4+ICsKPj4gKwlkZXZfaW5mbyhkZXYsICJNb2Rl Olx0JXNcbiIsCj4+ICsJCSBkdy0+bW9kZSA9PSBFRE1BX01PREVfTEVHQUNZID8gIkxlZ2FjeSIg OiAiVW5yb2xsIik7Cj4+ICsKPiAKPiAKPj4gKwlkZXZfaW5mbyhkZXYsICJSZWdpc3RlcnM6XHRC QVI9JXUsIG9mZj0weCUuMTZsbHggQiwgYWRkcj0weCUuOGx4XG4iLAo+PiArCQkgcGRhdGEtPnJl Z3NfYmFyLCBwZGF0YS0+cmVnc19vZmYsCj4+ICsJCSAodW5zaWduZWQgbG9uZykgZHctPnJlZ3Mp Owo+IAo+IE9oLCBubywgZG9uJ3QgZG8gY2FzdGluZyB3aGVuIHByaW50aW5nIHNvbWV0aGluZy4g SW4gb25seSByYXJlIGNhc2VzIGl0J3MgbmVlZGVkLCBub3QgaGVyZS4KCkkndmUgcHV0IHRoZSBj YXN0IHRvIHJlbW92ZSB0aGUgZm9sbG93aW5nIHdhcm5pbmc6Cgpkcml2ZXJzL2RtYS9kdy1lZG1h L2R3LWVkbWEtcGNpZS5jOjEzODoxNTogIHdhcm5pbmc6IGZvcm1hdCDigJglbHjigJkgZXhwZWN0 cwphcmd1bWVudCBvZiB0eXBlIOKAmGxvbmcgdW5zaWduZWQgaW504oCZLCBidXQgYXJndW1lbnQg NiBoYXMgdHlwZSDigJh2b2lkICrigJkKCj4gCj4+ICsKPj4gKwlkZXZfaW5mbyhkZXYsCj4+ICsJ CSJMLiBMaXN0Olx0QkFSPSV1LCBvZmY9MHglLjE2bGx4IEIsIHN6PTB4JS44eCBCLCB2YWRkcj0w eCUuOGx4LCBwYWRkcj0weCUuOGx4IiwKPj4gKwkJIHBkYXRhLT5sbF9iYXIsIHBkYXRhLT5sbF9v ZmYsIHBkYXRhLT5sbF9zeiwKPj4gKwkJICh1bnNpZ25lZCBsb25nKSBkdy0+dmFfbGwsCj4+ICsJ CSAodW5zaWduZWQgbG9uZykgZHctPnBhX2xsKTsKPiAKPiBUaGlzIGlzIG5vaXNlLCBlaXRoZXIg cmVtb3ZlIG9yIG1vdmUgdG8gZGJnIGxldmVsLgoKSSdsbCBtb3ZlIGl0IHRvIGRlYnVnLgoKPiAK Pj4gKwlpZiAocGRldi0+bXNpX2NhcCAmJiBwZGV2LT5tc2lfZW5hYmxlZCkgewo+PiArCQljYXBf b2ZmID0gcGRldi0+bXNpX2NhcCArIFBDSV9NU0lfRkxBR1M7Cj4+ICsJCXBjaV9yZWFkX2NvbmZp Z193b3JkKHBkZXYsIGNhcF9vZmYsICZmbGFncyk7Cj4+ICsJCWlmIChmbGFncyAmIFBDSV9NU0lf RkxBR1NfRU5BQkxFKSB7Cj4+ICsJCQljYXBfb2ZmID0gcGRldi0+bXNpX2NhcCArIFBDSV9NU0lf QUREUkVTU19MTzsKPj4gKwkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjYXBfb2ZmLCAm YWRkcl9sbyk7Cj4+ICsKPj4gKwkJCWlmIChmbGFncyAmIFBDSV9NU0lfRkxBR1NfNjRCSVQpIHsK Pj4gKwkJCQljYXBfb2ZmID0gcGRldi0+bXNpX2NhcCArIFBDSV9NU0lfQUREUkVTU19ISTsKPj4g KwkJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgY2FwX29mZiwgJmFkZHJfaGkpOwo+PiAr CQkJCWNhcF9vZmYgPSBwZGV2LT5tc2lfY2FwICsgUENJX01TSV9EQVRBXzY0Owo+PiArCQkJfSBl bHNlIHsKPj4gKwkJCQlhZGRyX2hpID0gMDsKPj4gKwkJCQljYXBfb2ZmID0gcGRldi0+bXNpX2Nh cCArIFBDSV9NU0lfREFUQV8zMjsKPj4gKwkJCX0KPj4gKwo+PiArCQkJZHctPm1zaV9hZGRyID0g YWRkcl9oaTsKPj4gKwkJCWR3LT5tc2lfYWRkciA8PD0gMzI7Cj4+ICsJCQlkdy0+bXNpX2FkZHIg fD0gYWRkcl9sbzsKPj4gKwo+PiArCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGNhcF9v ZmYsICYoZHctPm1zaV9kYXRhKSk7Cj4+ICsJCQlkdy0+bXNpX2RhdGEgJj0gMHhmZmZmOwo+PiAr Cj4+ICsJCQlkZXZfaW5mbyhkZXYsCj4+ICsJCQkJICJNU0k6XHRcdGFkZHI9MHglLjE2bGx4LCBk YXRhPTB4JS44eCwgbnI9JWRcbiIsCj4+ICsJCQkJIGR3LT5tc2lfYWRkciwgZHctPm1zaV9kYXRh LCBwZGV2LT5pcnEpOwo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJaWYgKHBkZXYtPm1zaXhfY2Fw ICYmIHBkZXYtPm1zaXhfZW5hYmxlZCkgewo+PiArCQl1MzIgb2Zmc2V0Owo+PiArCQl1OCBiaXI7 Cj4+ICsKPj4gKwkJY2FwX29mZiA9IHBkZXYtPm1zaXhfY2FwICsgUENJX01TSVhfRkxBR1M7Cj4+ ICsJCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIGNhcF9vZmYsICZmbGFncyk7Cj4+ICsKPj4g KwkJaWYgKGZsYWdzICYgUENJX01TSVhfRkxBR1NfRU5BQkxFKSB7Cj4+ICsJCQljYXBfb2ZmID0g cGRldi0+bXNpeF9jYXAgKyBQQ0lfTVNJWF9UQUJMRTsKPj4gKwkJCXBjaV9yZWFkX2NvbmZpZ19k d29yZChwZGV2LCBjYXBfb2ZmLCAmb2Zmc2V0KTsKPj4gKwo+PiArCQkJYmlyID0gb2Zmc2V0ICYg UENJX01TSVhfVEFCTEVfQklSOwo+PiArCQkJb2Zmc2V0ICY9IFBDSV9NU0lYX1RBQkxFX09GRlNF VDsKPj4gKwo+PiArCQkJcmVnID0gcGNpbV9pb21hcF90YWJsZShwZGV2KVtiaXJdOwo+PiArCQkJ cmVnICs9IG9mZnNldDsKPj4gKwo+PiArCQkJYWRkcl9sbyA9IHJlYWRsKHJlZyArIFBDSV9NU0lY X0VOVFJZX0xPV0VSX0FERFIpOwo+PiArCQkJYWRkcl9oaSA9IHJlYWRsKHJlZyArIFBDSV9NU0lY X0VOVFJZX1VQUEVSX0FERFIpOwo+PiArCQkJZHctPm1zaV9hZGRyID0gYWRkcl9oaTsKPj4gKwkJ CWR3LT5tc2lfYWRkciA8PD0gMzI7Cj4+ICsJCQlkdy0+bXNpX2FkZHIgfD0gYWRkcl9sbzsKPj4g Kwo+PiArCQkJZHctPm1zaV9kYXRhID0gcmVhZGwocmVnICsgUENJX01TSVhfRU5UUllfREFUQSk7 Cj4+ICsKPj4gKwkJCWRldl9pbmZvKGRldiwKPj4gKwkJCQkgIk1TSS1YOlx0YWRkcj0weCUuMTZs bHgsIGRhdGE9MHglLjh4LCBucj0lZFxuIiwKPj4gKwkJCQkgZHctPm1zaV9hZGRyLCBkdy0+bXNp X2RhdGEsIHBkZXYtPmlycSk7Cj4+ICsJCX0KPj4gKwl9Cj4gCj4gV2hhdCBpcyB0aGlzPyBXaHk/ CgpJIG5lZWQgdG8gZmluZCB0aGUgUENJZSBpbnRlcnJ1cHQgdmVjdG9yIGFkZHJlc3MgYW5kIHZh bHVlIChlaXRoZXIgZm9yIE1TSSBvcgpNU0ktWCwgZGVwZW5kcyB3aGF0IHRoZSBzeXN0ZW0gaGFz IHNlbGVjdGVkKSBpbiBvcmRlciB0byBjb25maWd1cmUgZURNQSBsYXRlciB0bwpnZW5lcmF0ZSB0 aGUgKGRvbmUgb3IgYWJvcnQpIGludGVycnVwdGlvbnMuCgo+IAo+PiArCj4+ICsJaWYgKCFwZGV2 LT5tc2lfZW5hYmxlZCAmJiAhcGRldi0+bXNpeF9lbmFibGVkKSB7CgpJJ20gbm90IGZpbmRpbmcg aXQuIENhbiB5b3UgdGVsbCBtZSB3aGF0IGl0IGlzPwoKTm90ZTogcGNpX21zaV9lbmFibGVkKCkg b24gbXNpLmMgcmV0dXJucyBpZiBNU0kgaGFzIG5vdCBiZWVuIGRpc2FibGVkIGJ5IHRoZQpjb21t YW5kLWxpbmUgb3B0aW9uIHBjaT1ub21zaQoKPiAKPiBUaGVyZSBpcyBhIGhlbHBlciBmcm9tIFBD SSBjb3JlIGZvciB0aGlzLgo+IAo+PiArCQlkZXZfZXJyKGRldiwgIiVzIGVuYWJsZSBpbnRlcnJ1 cHQgZmFpbGVkXG4iLAo+PiArCQkJcGNpX25hbWUocGRldikpOwo+PiArCQlyZXR1cm4gLUVQRVJN Owo+PiArCX0KPj4gKwo+PiArCWVyciA9IGR3X2VkbWFfcHJvYmUoY2hpcCk7Cj4+ICsJaWYgKGVy cikgewo+PiArCQlkZXZfZXJyKGRldiwgIiVzIGVETUEgcHJvYmUgZmFpbGVkXG4iLAo+PiArCQkJ cGNpX25hbWUocGRldikpOwo+PiArCQlyZXR1cm4gZXJyOwo+PiArCX0KPj4gKwo+PiArCXBjaV9z ZXRfZHJ2ZGF0YShwZGV2LCBjaGlwKTsKPj4gKwo+PiArCWRldl9pbmZvKGRldiwgIkRlc2lnbldh cmUgZURNQSBQQ0llIGRyaXZlciBsb2FkZWQgY29tcGxldGVseVxuIik7Cj4+ICsKPj4gKwlyZXR1 cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgZHdfZWRtYV9wY2llX3JlbW92ZShzdHJ1 Y3QgcGNpX2RldiAqcGRldikKPj4gK3sKPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGlwICpjaGlwID0g cGNpX2dldF9kcnZkYXRhKHBkZXYpOwo+PiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5k ZXY7Cj4+ICsJaW50IGVycjsKPj4gKwo+PiArCWVyciA9IGR3X2VkbWFfcmVtb3ZlKGNoaXApOwo+ PiArCWlmIChlcnIpIHsKPj4gKwkJZGV2X3dhcm4oZGV2LCAiJXMgY2FuJ3QgcmVtb3ZlIGRldmlj ZSBwcm9wZXJseTogJWRcbiIsCj4+ICsJCQlwY2lfbmFtZShwZGV2KSwgZXJyKTsKPiAKPiBkZXZf d2FybiArIGRldl9uYW1lID8hIEhhdmUgeW91IHRyaWVkIHRvIHNlZSB3aGF0IHdvdWxkIGJlIHRo ZSBvdXRwdXQ/CgpObywgSSBkaWRuJ3QsIGxvbC4gVGhhdCB3b3VsZCBiZSBmdW4gYXQgbGVhc3Qu Cgo+IAo+PiArCX0KPj4gKwo+PiArCXBjaV9mcmVlX2lycV92ZWN0b3JzKHBkZXYpOwo+PiArCj4+ ICsJZGV2X2luZm8oZGV2LCAiRGVzaWduV2FyZSBlRE1BIFBDSWUgZHJpdmVyIHVubG9hZGVkIGNv bXBsZXRlbHlcbiIpOwo+PiArfQo+PiArCj4gCj4+ICsjaWZkZWYgQ09ORklHX1BNX1NMRUVQCj4g Cj4gWW91IGNhbiB1c2UgX19tYXliZV91bnVzZWQgaW5zdGVhZCBvZiB0aGlzLgoKSSBhZ3JlZS4K Cj4gCj4+ICsjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCj4gCgpUaGFua3MgQW5keSEK