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,v3,1/7] dmaengine: Add Synopsys eDMA IP core driver From: Gustavo Pimentel Message-Id: Date: Thu, 31 Jan 2019 11:33:20 +0000 To: Vinod Koul , Gustavo Pimentel Cc: "linux-pci@vger.kernel.org" , "dmaengine@vger.kernel.org" , Dan Williams , Eugeniy Paltsev , Andy Shevchenko , Russell King , Niklas Cassel , Joao Pinto , Jose Abreu , Luis Oliveira , Vitor Soares , Nelson Costa , Pedro Sousa List-ID: T24gMjMvMDEvMjAxOSAxMzowOCwgVmlub2QgS291bCB3cm90ZToKPiBPbiAyMS0wMS0xOSwgMTU6 NDgsIEd1c3Rhdm8gUGltZW50ZWwgd3JvdGU6Cj4+IE9uIDIwLzAxLzIwMTkgMTE6NDQsIFZpbm9k IEtvdWwgd3JvdGU6Cj4+PiBPbiAxMS0wMS0xOSwgMTk6MzMsIEd1c3Rhdm8gUGltZW50ZWwgd3Jv dGU6Cj4+Pj4gQWRkIFN5bm9wc3lzIGVETUEgSVAgY29yZSBkcml2ZXIgdG8ga2VybmVsLgo+Pj4+ Cj4+Pj4gVGhpcyBjb3JlIGRyaXZlciwgaW5pdGlhbGl6ZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGVE TUEgSVAgdXNpbmcgdm1hLWhlbHBlcnMKPj4+PiBmdW5jdGlvbnMgYW5kIGRtYS1lbmdpbmUgc3Vi c3lzdGVtLgo+Pj4KPj4+IEEgZGVzY3JpcHRpb24gb2YgZURNQSBJUCB3aWxsIGhlbHAgcmV2aWV3 IHRoZSBkcml2ZXIKPj4KPj4gSSd2ZSB0aGUgSVAgZGVzY3JpcHRpb24gb24gdGhlIGNvdmVyLWxl dHRlciwgYnV0IEknbGwgYnJpbmcgaXQgdG8gdGhpcyBwYXRjaCwgaWYKPj4gaXQgaGVscHMuCj4g Cj4geWVhaCBjb3ZlciBkb2VzbnQgZ2V0IGFwcGxpZWQsIGNoYW5nZWxvZyBhcmUgdmVyeSBpbXBv cnRhbnQKPiBkb2N1bWVudGF0aW9uIGZvciBrZXJuZWwKCk9rLiBTZWUgYmVsb3cuCgo+IAo+Pj4+ IEBAIC0wLDAgKzEsMTA1OSBAQAo+Pj4+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMAo+Pj4+ICsvKgo+Pj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTggU3lub3BzeXMsIEluYy4g YW5kL29yIGl0cyBhZmZpbGlhdGVzLgo+Pj4KPj4+IDIwMTkgbm93Cj4+Cj4+IEkndmUgY2hhbmdl ZCB0byAiQ29weXJpZ2h0IChjKSAyMDE4LXByZXNlbnQgU3lub3BzeXMsIEluYy4gYW5kL29yIGl0 cwo+PiBhZmZpbGlhdGVzLiIgdGhpcyB3YXkgaXQncyBhbHdheXMgdXAgdG8gZGF0ZSBhbmQgSSBh bHNvIGtlcHQgMjAxOCwgYmVjYXVzZSBpdAo+PiB3YXMgdGhlIGRhdGUgdGhhdCBJIHN0YXJ0ZWQg dG8gZGV2ZWxvcCB0aGlzIGRyaXZlciwgaWYgeW91IGRvbid0IG1pbmQuCj4gCj4geWVhaCAxOCBp cyBmaW5lIDopIGl0IG5lZWQgdG8gZW5kIHdpdGggY3VycmVudCB5ZWFyIGFsd2F5cwoKSnVzdCB0 byBiZSBzdXJlLCBhcmUgeW91IHNheWluZyB0aGF0IG11c3QgYmU6ICJDb3B5cmlnaHQgKGMpIDIw MTgtMjAxOSBTeW5vcHN5cywKSW5jLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIj8KCj4gCj4+Pj4g K3N0YXRpYyBzdHJ1Y3QgZHdfZWRtYV9jaHVuayAqZHdfZWRtYV9hbGxvY19jaHVuayhzdHJ1Y3Qg ZHdfZWRtYV9kZXNjICpkZXNjKQo+Pj4+ICt7Cj4+Pj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpj aGFuID0gZGVzYy0+Y2hhbjsKPj4+PiArCXN0cnVjdCBkd19lZG1hICpkdyA9IGNoYW4tPmNoaXAt PmR3Owo+Pj4+ICsJc3RydWN0IGR3X2VkbWFfY2h1bmsgKmNodW5rOwo+Pj4+ICsKPj4+PiArCWNo dW5rID0ga3Z6YWxsb2Moc2l6ZW9mKCpjaHVuayksIEdGUF9OT1dBSVQpOwo+Pj4+ICsJaWYgKHVu bGlrZWx5KCFjaHVuaykpCj4+Pj4gKwkJcmV0dXJuIE5VTEw7Cj4+Pj4gKwo+Pj4+ICsJSU5JVF9M SVNUX0hFQUQoJmNodW5rLT5saXN0KTsKPj4+PiArCWNodW5rLT5jaGFuID0gY2hhbjsKPj4+PiAr CWNodW5rLT5jYiA9ICEoZGVzYy0+Y2h1bmtzX2FsbG9jICUgMik7Cj4+Pgo+Pj4gY2IgLi4/Cj4+ Cj4+IENCID0gY2hhbmdlIGJpdCwgaXMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVETUEgSVAuIEJhc2lj YWxseSBpdCBpcyBhIGtpbmQgb2YKPj4gaGFuZHNoYWtlIHdoaWNoIHNlcnZlcyB0byB2YWxpZGF0 ZSB3aGV0aGVyIHRoZSBsaW5rZWQgbGlzdCBoYXMgYmVlbiB1cGRhdGVkIG9yCj4+IG5vdCwgZXNw ZWNpYWxseSB1c2VmdWwgaW4gY2FzZXMgb2YgcmVjeWNsZWQgbGlua2VkIGxpc3QgZWxlbWVudHMg KGV2ZXJ5IGxpbmtlZAo+PiBsaXN0IHJlY3ljbGUgaXMgYSBuZXcgY2h1bmssIHRoaXMgd2lsbCBh bGxvdyB0byBkaWZmZXJlbnRpYXRlIGVhY2ggY2h1bmspLgo+IAo+IG9rYXkgcGxlYXNlIGFkZCB0 aGF0IHNvbWV3aGVyZS4gQWxzbyBpdCB3b3VsZCBoZWxwIG1lIGlmIHlvdSBleHBsYWluCj4gd2hh dCBpcyBjaHVuayBhbmQgb3RoZXIgdGVybWlub2xvZ2llcyB1c2VkIGluIHRoaXMgZHJpdmVyCgpJ J20gdGhpbmtpbmcgdG8gcHV0IHRoZSBiZWxvdyBkZXNjcmlwdGlvbiBvbiB0aGUgcGF0Y2gsIHBs ZWFzZSBjaGVjayBpZiB0aGlzIGlzCnN1ZmZpY2llbnQgZXhwbGljaXQgYW5kIGNsZWFyIHRvIHVu ZGVyc3RhbmQgd2hhdCB0aGlzIElQIG5lZWRzIGFuZCBkb2VzLgoKSW4gb3JkZXIgdG8gdHJhbnNm ZXIgZGF0YSBmcm9tIHBvaW50IEEgdG8gQiBhcyBmYXN0IGFzIHBvc3NpYmxlIHRoaXMgSVAgcmVx dWlyZXMKYSBkZWRpY2F0ZWQgbWVtb3J5IHNwYWNlIHdoZXJlIHdpbGwgcmVzaWRlIGEgbGlua2Vk IGxpc3Qgb2YgZWxlbWVudHMuCkFsbCBlbGVtZW50cyBvZiB0aGlzIGxpbmtlZCBsaXN0IGFyZSBj b250aW51b3VzIGFuZCBlYWNoIG9uZSBkZXNjcmliZXMgYSBkYXRhCnRyYW5zZmVyIChzb3VyY2Ug YW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcywgbGVuZ3RoIGFuZCBhIGNvbnRyb2wgdmFyaWFibGUp LgoKRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIGxldHMgYXNzdW1lIGEgbWVtb3J5IHNwYWNl IGZvciBjaGFubmVsIHdyaXRlIDAgd2hpY2gKYWxsb3dzIGFib3V0IDQyIGVsZW1lbnRzLgoKKy0t LS0tLS0tLSsKfCBEZXNjICMwIHwtLSsKKy0tLS0tLS0tLSsgIHwKICAgICAgICAgICAgIFYKICAg ICAgICArLS0tLS0tLS0tLSsKICAgICAgICB8IENodW5rICMwIHwtLS0rCiAgICAgICAgfCAgQ0Ig PSAxICB8ICAgfCAgICstLS0tLS0tLS0tKyAgICstLS0tLSsgICArLS0tLS0tLS0tLS0rICAgKy0t LS0tKwogICAgICAgICstLS0tLS0tLS0tKyAgICstLT58IEJ1cnN0ICMwIHwtLT58IC4uLiB8LS0+ fCBCdXJzdCAjNDEgfC0tPnwgbGxwIHwKICAgICAgICAgICAgICB8ICAgICAgICAgICAgKy0tLS0t LS0tLS0rICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLSsgICArLS0tLS0rCiAgICAgICAgICAgICAg VgogICAgICAgICstLS0tLS0tLS0tKwogICAgICAgIHwgQ2h1bmsgIzEgfC0tLSsKICAgICAgICB8 ICBDQiA9IDAgIHwgICB8ICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLSsgICArLS0tLS0tLS0tLS0r ICAgKy0tLS0tKwogICAgICAgICstLS0tLS0tLS0tKyAgICstLT58IEJ1cnN0ICM0MiB8LS0+fCAu Li4gfC0tPnwgQnVyc3QgIzgzIHwtLT58IGxscCB8CiAgICAgICAgICAgICAgfCAgICAgICAgICAg ICstLS0tLS0tLS0tLSsgICArLS0tLS0rICAgKy0tLS0tLS0tLS0tKyAgICstLS0tLSsKICAgICAg ICAgICAgICBWCiAgICAgICAgKy0tLS0tLS0tLS0rCiAgICAgICAgfCBDaHVuayAjMiB8LS0tKwog ICAgICAgIHwgIENCID0gMSAgfCAgIHwgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKyAgICstLS0t LS0tLS0tLS0rICAgKy0tLS0tKwogICAgICAgICstLS0tLS0tLS0tKyAgICstLT58IEJ1cnN0ICM4 NCB8LS0+fCAuLi4gfC0tPnwgQnVyc3QgIzEyNSB8LS0+fCBsbHAgfAogICAgICAgICAgICAgIHwg ICAgICAgICAgICArLS0tLS0tLS0tLS0rICAgKy0tLS0tKyAgICstLS0tLS0tLS0tLS0rICAgKy0t LS0tKwogICAgICAgICAgICAgIFYKICAgICAgICArLS0tLS0tLS0tLSsKICAgICAgICB8IENodW5r ICMzIHwtLS0rCiAgICAgICAgfCAgQ0IgPSAwICB8ICAgfCAgICstLS0tLS0tLS0tLS0rICAgKy0t LS0tKyAgICstLS0tLS0tLS0tLS0rICAgKy0tLS0tKwogICAgICAgICstLS0tLS0tLS0tKyAgICst LT58IEJ1cnN0ICMxMjYgfC0tPnwgLi4uIHwtLT58IEJ1cnN0ICMxMjkgfC0tPnwgbGxwIHwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLSsgICArLS0tLS0rICAgKy0tLS0t LS0tLS0tLSsgICArLS0tLS0rCgpMZWdlbmQ6CgoqTGlua2VkIGxpc3QqLCBhbHNvIGtub3cgYXMg Q2h1bmsKKkxpbmtlZCBsaXN0IGVsZW1lbnQqLCBhbHNvIGtub3cgYXMgQnVyc3QKKkNCKiwgYWxz byBrbm93IGFzIENoYW5nZSBCaXQsIGl0J3MgYSBjb250cm9sIGJpdCAoYW5kIHR5cGljYWxseSBp cyB0b2dnbGVkKQp0aGF0IGFsbG93cyB0byBlYXNpbHkgaWRlbnRpZnkgYW5kIGRpZmZlcmVudGlh dGUgYmV0d2VlbiB0aGUgY3VycmVudCBsaW5rZWQgbGlzdAphbmQgdGhlIHByZXZpb3VzIG9yIHRo ZSBuZXh0IG9uZS4KKkxMUCosIGlzIGEgc3BlY2lhbCBlbGVtZW50IHRoYXQgaW5kaWNhdGVzIHRo ZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0IGVsZW1lbnQKc3RyZWFtIGFsc28gaW5mb3JtcyB0aGF0 IHRoZSBuZXh0IENCIHNob3VsZCBiZSB0b2dnbGUuCgpPbiBzY2F0dGVyLWdhdGhlciB0cmFuc2Zl ciBtb2RlLCB0aGUgY2xpZW50IHdpbGwgc3VibWl0IGEgc2NhdHRlci1nYXRoZXIgbGlzdCBvZgpu IChvbiB0aGlzIGNhc2UgMTMwKSBlbGVtZW50cywgdGhhdCB3aWxsIGJlIGRpdmlkZSBpbiBtdWx0 aXBsZSBDaHVua3MsIGVhY2gKQ2h1bmsgd2lsbCBoYXZlIChvbiB0aGlzIGNhc2UgNDIpIGEgbGlt aXRlZCBudW1iZXIgb2YgQnVyc3RzIGFuZCBhZnRlcgp0cmFuc2ZlcnJpbmcgYWxsIEJ1cnN0cywg YW4gaW50ZXJydXB0IHdpbGwgYmUgdHJpZ2dlcmVkLCB3aGljaCB3aWxsIGFsbG93IHRvCnJlY3lj bGUgdGhlIGFsbCBsaW5rZWQgbGlzdCBkZWRpY2F0ZWQgbWVtb3J5IGFnYWluIHdpdGggdGhlIG5l dyBpbmZvcm1hdGlvbgpyZWxhdGl2ZSB0byB0aGUgbmV4dCBDaHVuayBhbmQgcmVzcGVjdGl2ZSBC dXJzdCBhc3NvY2lhdGVkIGFuZCByZXBlYXQgdGhlIHdob2xlCmN5Y2xlIGFnYWluLgoKT24gY3lj bGljIHRyYW5zZmVyIG1vZGUsIHRoZSBjbGllbnQgd2lsbCBzdWJtaXQgYSBidWZmZXIgcG9pbnRl ciwgbGVuZ3RoIG9mIGl0CmFuZCBudW1iZXIgb2YgcmVwZXRpdGlvbnMsIGluIHRoaXMgY2FzZSBl YWNoIGJ1cnN0IHdpbGwgY29ycmVzcG9uZCBkaXJlY3RseSB0bwplYWNoIHJlcGV0aXRpb24uCgpF YWNoIEJ1cnN0IGNhbiBkZXNjcmliZXMgYSBkYXRhIHRyYW5zZmVyIGZyb20gcG9pbnQgQShzb3Vy Y2UpIHRvIHBvaW50CkIoZGVzdGluYXRpb24pIHdpdGggYSBsZW5ndGggdGhhdCBjYW4gYmUgZnJv bSAxIGJ5dGUgdXAgdG8gNCBHQi4gU2luY2UgZGVkaWNhdGVkCnRoZSBtZW1vcnkgc3BhY2Ugd2hl cmUgdGhlIGxpbmtlZCBsaXN0IHdpbGwgcmVzaWRlIGlzIGxpbWl0ZWQsIHRoZSB3aG9sZSBuIGJ1 cnN0CmVsZW1lbnRzIHdpbGwgYmUgb3JnYW5pemVkIGluIHNldmVyYWwgQ2h1bmtzLCB0aGF0IHdp bGwgYmUgdXNlZCBsYXRlciB0byByZWN5Y2xlCnRoZSBkZWRpY2F0ZWQgbWVtb3J5IHNwYWNlIHRv IGluaXRpYXRlIGEgbmV3IHNlcXVlbmNlIG9mIGRhdGEgdHJhbnNmZXJzLgoKVGhlIHdob2xlIHRy YW5zZmVyIGlzIGNvbnNpZGVyZWQgaGFzIGNvbXBsZXRlZCB3aGVuIGl0IHdhcyB0cmFuc2ZlcnJl ZCBhbGwgYnVyc3RzLgoKQ3VycmVudGx5IHRoaXMgSVAgaGFzIGEgc2V0IHdlbGwta25vd24gcmVn aXN0ZXIgbWFwLCB3aGljaCBpbmNsdWRlcyBzdXBwb3J0IGZvcgpsZWdhY3kgYW5kIHVucm9sbCBt b2Rlcy4gTGVnYWN5IG1vZGUgaXMgdmVyc2lvbiBvZiB0aGlzIHJlZ2lzdGVyIG1hcCB0aGF0IGhh cwptdWx0aXBsZXhlciByZWdpc3RlciB0aGF0IGFsbG93cyB0byBzd2l0Y2ggcmVnaXN0ZXJzIGJl dHdlZW4gYWxsIHdyaXRlIGFuZCByZWFkCmNoYW5uZWxzIGFuZCB0aGUgdW5yb2xsIG1vZGVzIHJl cGVhdHMgYWxsIHdyaXRlIGFuZCByZWFkIGNoYW5uZWxzIHJlZ2lzdGVycyB3aXRoCmFuIG9mZnNl dCBiZXR3ZWVuIHRoZW0uIFRoaXMgcmVnaXN0ZXIgbWFwIGlzIGNhbGxlZCB2MC4KClRoZSBJUCB0 ZWFtIGlzIGNyZWF0aW5nIGEgbmV3IHJlZ2lzdGVyIG1hcCBtb3JlIHN1aXRhYmxlIHRvIHRoZSBs YXRlc3QgUENJZQpmZWF0dXJlcywgdGhhdCB2ZXJ5IGxpa2VseSB3aWxsIGNoYW5nZSB0aGUgbWFw IHJlZ2lzdGVyLCB3aGljaCB0aGlzIHZlcnNpb24gd2lsbApiZSBjYWxsZWQgdjEuIEFzIHNvb24g YXMgdGhpcyBuZXcgdmVyc2lvbiBpcyByZWxlYXNlZCBieSB0aGUgSVAgdGVhbSB0aGUgc3VwcG9y dApmb3IgdGhpcyB2ZXJzaW9uIGluIGJlIGluY2x1ZGVkIG9uIHRoaXMgZHJpdmVyLgoKV2hhdCBk byB5b3UgdGhpbms/IFRoZXJlIGlzIGFueSBncmF5IGFyZWEgdGhhdCBJIGNvdWxkIGNsYXJpZnk/ Cgo+IAo+Pj4+ICtzdGF0aWMgaW50IGR3X2VkbWFfZGV2aWNlX2NvbmZpZyhzdHJ1Y3QgZG1hX2No YW4gKmRjaGFuLAo+Pj4+ICsJCQkJIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCj4+ Pj4gK3sKPj4+PiArCXN0cnVjdCBkd19lZG1hX2NoYW4gKmNoYW4gPSBkY2hhbjJkd19lZG1hX2No YW4oZGNoYW4pOwo+Pj4+ICsJY29uc3Qgc3RydWN0IGR3X2VkbWFfY29yZV9vcHMgKm9wcyA9IGNo YW4yb3BzKGNoYW4pOwo+Pj4+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPj4+PiArCWludCBlcnIg PSAwOwo+Pj4+ICsKPj4+PiArCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT52Yy5sb2NrLCBmbGFn cyk7Cj4+Pj4gKwo+Pj4+ICsJaWYgKCFjb25maWcpIHsKPj4+PiArCQllcnIgPSAtRUlOVkFMOwo+ Pj4+ICsJCWdvdG8gZXJyX2NvbmZpZzsKPj4+PiArCX0KPj4+PiArCj4+Pj4gKwlpZiAoY2hhbi0+ c3RhdHVzICE9IEVETUFfU1RfSURMRSkgewo+Pj4+ICsJCWRldl9lcnIoY2hhbjJkZXYoY2hhbiks ICJjaGFubmVsIGlzIGJ1c3kgb3IgcGF1c2VkXG4iKTsKPj4+PiArCQllcnIgPSAtRVBFUk07Cj4+ Pgo+Pj4gdGhpcyBpcyBub3QgY29ycmVjdCBiZWhhdmlvdXIsIGRldmljZV9jb25maWcgY2FuIGJl IGNhbGxlZCBhbnl0aW1lIGFuZAo+Pj4gdmFsdWVzIGNhbiB0YWtlIGFmZmVjdCBvbiBuZXh0IHRy YW5zYWN0aW9uIHN1Ym1pdHRlZC4uCj4+Cj4+IEh1bSwgSSB0aG91Z2h0IHdlIGNvdWxkIG9ubHkg cmVjb25maWd1cmUgYWZ0ZXIgdHJhbnNmZXIgYmVpbmcgZmluaXNoZWQuCj4gCj4gTm9wZSwgYW55 dGltZS4gVGhleSB0YWtlIGVmZmVjdCBmb3IgbmV4dCBwcmVwYXJlIHdoZW4geW91IHVzZSBpdAo+ IAo+Pj4+ICsJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgImFkZHIocGh5c2ljYWwpIHNyYz0lcGEs IGRzdD0lcGFcbiIsCj4+Pj4gKwkJJmNvbmZpZy0+c3JjX2FkZHIsICZjb25maWctPmRzdF9hZGRy KTsKPj4+PiArCj4+Pj4gKwljaGFuLT5zcmNfYWRkciA9IGNvbmZpZy0+c3JjX2FkZHI7Cj4+Pj4g KwljaGFuLT5kc3RfYWRkciA9IGNvbmZpZy0+ZHN0X2FkZHI7Cj4+Pj4gKwo+Pj4+ICsJZXJyID0g b3BzLT5kZXZpY2VfY29uZmlnKGRjaGFuKTsKPj4+Cj4+PiB3aGF0IGRvZXMgdGhpcyBkbz8KPj4K Pj4gVGhpcyBpcyBhbiBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUgdG8gc2V0dXAgaW50ZXJydXB0 cyAoZGF0YSBhbmQgYWRkcmVzc2VzKSB0bwo+PiBlYWNoIGNoYW5uZWwgb24gdGhlIGVETUEgSVAs ICBpbiBvcmRlciB0byBiZSB0cmlnZ2VyZWQgYWZ0ZXIgdHJhbnNmZXIgYmVpbmcKPj4gY29tcGxl dGVkIG9yIGFib3J0ZWQuIER1ZSB0aGUgZmFjdCB0aGUgY29uZmlnKCkgY2FuIGJlIGNhbGxlZCBh dCBhbnl0aW1lLAo+PiBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSB0aGlzIHByb2NlZHVyZSBo ZXJlLCBJJ2xsIG1vdmVkIGl0IHRvIHByb2JlKCkuCj4gCj4gWWVhaCBJIGFtIG5vdCBzdGlsbCBj b252aW5jZWQgYWJvdXQgaGF2aW5nIGFub3RoZXIgbGF5ZXIhIEhhdmUgeW91Cj4gdGhvdWdoIGFi b3V0IHVzaW5nIGNvbW1vbiBsaWIgZm9yIGNvbW1vbiBwYXJ0cyAuLj8KCk1heWJlIEknbSBleHBs YWluaW5nIG15c2VsZiB3cm9uZ2x5LiBJIGRvbid0IGhhdmUgYW55IGNsdWUgYWJvdXQgdGhlIG5l dwpyZWdpc3RlciBtYXAgZm9yIHRoZSBmdXR1cmUgdmVyc2lvbnMuIEkgaG9uZXN0bHkgdHJpZWQg dG8gaW1wbGVtZW50IHRoZSBjb21tb24KbGliIGZvciB0aGUgd2hvbGUgcHJvY2VzcyB0aGF0IGlu dGVyYWN0IHdpdGggZG1hIGVuZ2luZSBjb250cm9sbGVyIHRvIGVhc2UgaW4KdGhlIGZ1dHVyZSBh bnkgbmV3IGFkZGl0aW9uIG9mIHJlZ2lzdGVyIG1hcHBpbmcsIGJ5IGhhdmluZyB0aGlzIGNvbW1v biBjYWxsYmFja3MKdGhhdCB3aWxsIG9ubHkgYmUgcmVzcG9uc2libGUgZm9yIGludGVyZmFjaW5n IHRoZSBIVyBhY2NvcmRpbmdseSB0byByZWdpc3RlciBtYXAKdmVyc2lvbi4gTWF5YmUgSSBjYW4g c2ltcGxpZnkgc29tZXRoaW5nIGluIHRoZSBmdXR1cmUsIGJ1dCBJIG9ubHkgYmUgYWJsZSB0bwpj b25jbHVkZSB0aGF0IGFmdGVyIGhhdmluZyBzb21lIGlkZWEgYWJvdXQgdGhlIG5ldyByZWdpc3Rl ciBtYXAuCgpJTUhPIEkgdGhpbmsgdGhpcyBpcyB0aGUgZWFzaWVyIGFuZCBjbGVhbiB3YXkgdG8g ZG8gaXQsIGluIHRlcm1zIG9mIGNvZGUKbWFpbnRlbmFuY2UgYW5kIGFyY2hpdGVjdHVyZSwgYnV0 IGlmIHlvdSBoYXZlIGFub3RoZXIgaWRlYSB0aGF0IHlvdSBjYW4gc2hvdyBtZQpvciBwb2ludGlu ZyBvdXQgZm9yIGEgZHJpdmVyIHRoYXQgaW1wbGVtZW50cyBzb21ldGhpbmcgc2ltaWxhciwgSSdt IG5vIHByb2JsZW0KdG8gY2hlY2sgaXQgb3V0LgoKPiAKPj4+IHRoaXMgbG9va3MgaW5jb3JyZWN0 IGludGVycHJldGF0aW9uIHRvIG1lLiBUaGUgc3RhdHVzIGlzIHRvIGJlIHJldHJpZXZlZAo+Pj4g Zm9yIHRoZSBnaXZlbiBjb29raWUgcGFzc2VkIGFuZCBnaXZlbiB0aGF0IHlvdSBkbyBub3QgZXZl biB1c2UgdGhpcwo+Pj4gYXJndW1lbnQgdGVsbHMgbWUgdGhhdCB5b3UgaGF2ZSB1bmRlcnN0b29k IHRoaXMgYXMgJ2NoYW5uZWwnIHN0YXR1cwo+Pj4gcmVwb3J0aW5nLCB3aGljaCBpcyBub3QgY29y cmVjdAo+Pgo+PiBZZXMsIHlvdSdyZSByaWdodCwgbXkgaW50ZXJwcmV0YXRpb24gYXNzdW1lcyB0 aGlzIGZ1bmN0aW9uIHJlcG9ydHMKPj4gY2hhbm5lbC90cmFuc2FjdGlvbiBzdGF0dXMuIFdoYXQg d291bGQgYmUgdGhlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24/Cj4+IFNvbWV0aGluZyBsaWtlIHRo aXM/Cj4+Cj4+IHsKPj4gCXN0cnVjdCBkd19lZG1hX2NoYW4gKmNoYW4gPSBkY2hhbjJkd19lZG1h X2NoYW4oZGNoYW4pOwo+PiAJY29uc3Qgc3RydWN0IGR3X2VkbWFfY29yZV9vcHMgKm9wcyA9IGNo YW4yb3BzKGNoYW4pOwo+PiAJc3RydWN0IGR3X2VkbWFfZGVzYyAqZGVzYzsKPj4gCXN0cnVjdCB2 aXJ0X2RtYV9kZXNjICp2ZDsKPj4gCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+IAllbnVtIGRtYV9z dGF0dXMgcmV0Owo+PiAJdTMyIHJlc2lkdWUgPSAwOwo+Pgo+PiAJc3Bpbl9sb2NrX2lycXNhdmUo JmNoYW4tPnZjLmxvY2ssIGZsYWdzKTsKPj4KPj4gCXJldCA9IGRtYV9jb29raWVfc3RhdHVzKGNo YW4sIGNvb2tpZSwgdHhzdGF0ZSk7Cj4+IAlpZiAocmV0ID09IERNQV9DT01QTEVURSkKPj4gCQln b3RvIHJldF9zdGF0dXM7Cj4+Cj4+IAl2ZCA9IHZjaGFuX25leHRfZGVzYygmY2hhbi0+dmMpOwo+ PiAJaWYgKCF2ZCkKPj4gCQlnb3RvIHJldF9zdGF0dXM7Cj4+Cj4+IAlkZXNjID0gdmQyZHdfZWRt YV9kZXNjKHZkKTsKPj4gCWlmICghZGVzYykKPj4gCQlyZXNpZHVlID0gZGVzYy0+YWxsb2Nfc3og LSBkZXNjLT54ZmVyX3N6Owo+PiAJCQo+PiAJaWYgKHJldCA9PSBETUFfSU5fUFJPR1JFU1MgJiYg Y2hhbi0+c3RhdHVzID09IEVETUFfU1RfUEFVU0UpCj4+IAkJcmV0ID0gRE1BX1BBVVNFRDsKPiAK PiB0aGlzIGxvb2tzIGJldHRlciwgcGxlYXNlIGRvIGtlZXAgaW4gbWluZCB0eHN0YXRlIGNhbiBi ZSBudWxsLCBzbwo+IHJlc2lkdWUgY2FsbiBjYW4gYmUgc2tpcHBlZAoKT2suCgo+IAo+Pj4+ICtz dGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICoKPj4+PiArZHdfZWRtYV9kZXZp Y2VfcHJlcF9zbGF2ZV9zZyhzdHJ1Y3QgZG1hX2NoYW4gKmRjaGFuLCBzdHJ1Y3Qgc2NhdHRlcmxp c3QgKnNnbCwKPj4+PiArCQkJICAgICB1bnNpZ25lZCBpbnQgc2dfbGVuLAo+Pj4+ICsJCQkgICAg IGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXJlY3Rpb24sCj4+Pj4gKwkJCSAgICAgdW5z aWduZWQgbG9uZyBmbGFncywgdm9pZCAqY29udGV4dCkKPj4+PiArewo+Pj4+ICsJc3RydWN0IGR3 X2VkbWFfY2hhbiAqY2hhbiA9IGRjaGFuMmR3X2VkbWFfY2hhbihkY2hhbik7Cj4+Pj4gKwlzdHJ1 Y3QgZHdfZWRtYV9kZXNjICpkZXNjOwo+Pj4+ICsJc3RydWN0IGR3X2VkbWFfY2h1bmsgKmNodW5r Owo+Pj4+ICsJc3RydWN0IGR3X2VkbWFfYnVyc3QgKmJ1cnN0Owo+Pj4+ICsJc3RydWN0IHNjYXR0 ZXJsaXN0ICpzZzsKPj4+PiArCXVuc2lnbmVkIGxvbmcgc2ZsYWdzOwo+Pj4+ICsJcGh5c19hZGRy X3Qgc3JjX2FkZHI7Cj4+Pj4gKwlwaHlzX2FkZHJfdCBkc3RfYWRkcjsKPj4+PiArCWludCBpOwo+ Pj4+ICsKPj4+PiArCWlmIChzZ19sZW4gPCAxKSB7Cj4+Pj4gKwkJZGV2X2VycihjaGFuMmRldihj aGFuKSwgImludmFsaWQgc2cgbGVuZ3RoICV1XG4iLCBzZ19sZW4pOwo+Pj4+ICsJCXJldHVybiBO VUxMOwo+Pj4+ICsJfQo+Pj4+ICsKPj4+PiArCWlmIChkaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19N RU0gJiYgY2hhbi0+ZGlyID09IEVETUFfRElSX1dSSVRFKSB7Cj4+Pgo+Pj4gd2hhdCBpcyB0aGUg c2Vjb25kIHBhcnQgb2YgdGhlIGNoZWNrLCBjYW4geW91IGV4cGxhaW4gdGhhdCwgd2hvIHNldHMK Pj4+IGNoYW4tPmRpcj8KPj4KPj4gVGhlIGNoYW4tPmRpciBpcyBzZXQgb24gcHJvYmUoKSBkdXJp bmcgdGhlIHByb2Nlc3Mgb2YgY29uZmlndXJpbmcgZWFjaCBjaGFubmVsLgo+IAo+IFNvIHlvdSBo YXZlIGNoYW5uZWxzIHRoYXQgYXJlIHVuaWRpcmVjdGlvbmFsPwoKWWVzLiBUaGF0J3Mgb25lIGFu b3RoZXIgcmVhc29uIElNSE8gdG8ga2VlcCB0aGUgZHctZWRtYS10ZXN0IHNlcGFyYXRlIGZyb20K ZG1hLXRlc3QsIHNpbmNlIHRoaXMgSVAgaXMgbW9yZSBwaWNreSBhbmQgaGF2ZSB0aGlzIHBhcnRp Y3VsYXJpdGllcy4KClRoaXMgZG9uJ3QgaW52YWxpZGF0ZSB0byBhZGQgaW4gdGhlIGZ1dHVyZSwg c2ltaWxhciBmZWF0dXJlcyB0byBkbWEtdGVzdCB0aGF0CmFyZSBnZW5lcmljIGVub3VnaCB0byB3 b3JrIHdpdGggb3RoZXIgSVBzLCBhdCBsZWFzdCB0aGlzIGlzIG15IG9waW5pb24uCgo+IAo+Pj4+ ICsJCWRldl9kYmcoY2hhbjJkZXYoY2hhbiksCSJwcmVwYXJlIG9wZXJhdGlvbiAoV1JJVEUpXG4i KTsKPj4+PiArCX0gZWxzZSBpZiAoZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWICYmIGNoYW4t PmRpciA9PSBFRE1BX0RJUl9SRUFEKSB7Cj4+Pj4gKwkJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwJ InByZXBhcmUgb3BlcmF0aW9uIChSRUFEKVxuIik7Cj4+Pj4gKwl9IGVsc2Ugewo+Pj4+ICsJCWRl dl9lcnIoY2hhbjJkZXYoY2hhbiksICJpbnZhbGlkIGRpcmVjdGlvblxuIik7Cj4+Pj4gKwkJcmV0 dXJuIE5VTEw7Cj4+Pj4gKwl9Cj4+Pj4gKwo+Pj4+ICsJaWYgKCFjaGFuLT5jb25maWd1cmVkKSB7 Cj4+Pj4gKwkJZGV2X2VycihjaGFuMmRldihjaGFuKSwgIihwcmVwX3NsYXZlX3NnKSBjaGFubmVs IG5vdCBjb25maWd1cmVkXG4iKTsKPj4+PiArCQlyZXR1cm4gTlVMTDsKPj4+PiArCX0KPj4+PiAr Cj4+Pj4gKwlpZiAoY2hhbi0+c3RhdHVzICE9IEVETUFfU1RfSURMRSkgewo+Pj4+ICsJCWRldl9l cnIoY2hhbjJkZXYoY2hhbiksICJjaGFubmVsIGlzIGJ1c3kgb3IgcGF1c2VkXG4iKTsKPj4+PiAr CQlyZXR1cm4gTlVMTDsKPj4+PiArCX0KPj4+Cj4+PiBObywgd3JvbmcgYWdhaW4uIFRoZSB0eG4g bXVzdCBiZSBwcmVwYXJlZCBhbmQgdGhlbiBvbiBzdWJtaXQgYWRkZWQgdG8gYQo+Pj4gcXVldWUu IFlvdSBhcmUgd3JpdGluZyBhIGRyaXZlciBmb3IgZG1hZW5naW5lLCBzdXJlbHkgeW91IGRvbnQg ZXhwZWN0Cj4+PiB0aGUgY2hhbm5lbCB0byBiZSBmcmVlIGFuZCB0aGVuIGRvIGEgdHhuLi4gdGhh dCB3b3VsZCBiZSB2ZXJ5Cj4+PiBpbmVmZmljaWVudCEKPj4KPj4gSSBkaWQgbm90IHJlYWxpemUg dGhhdCB0aGUgZmxvdyBjb3VsZCBiZSBhcyB5b3UgbWVudGlvbmVkLiBUaGUgZG9jdW1lbnRhdGlv biBJCj4+IHJlYWQgYWJvdXQgdGhlIHN1YnN5c3RlbSBkaWQgbm90IGdpdmUgbWUgdGhpcyBpZGVh LiBUaGFuayB5b3UgZm9yIGNsYXJpZnlpbmcgbWUuCj4gCj4gSSB0aGluayB3ZSBoYXZlIGltcHJv dmVkICB0aGF0IHBhcnQgYSBsb3QsIHBsZWFzZSBkbyBmZWVsIGZyZWUgdG8gcG9pbnQKPiBvdXQg aW5jb25zaXN0ZW5jeQo+IFNlZSBETUEgdXNhZ2UgaW4gRG9jdW1lbnRhdGlvbi9kcml2ZXItYXBp L2RtYWVuZ2luZS9jbGllbnQucnN0Cj4gCj4+Pj4gK2ludCBkd19lZG1hX3Byb2JlKHN0cnVjdCBk d19lZG1hX2NoaXAgKmNoaXApCj4+Pj4gK3sKPj4+PiArCXN0cnVjdCBkd19lZG1hICpkdyA9IGNo aXAtPmR3Owo+Pj4+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gY2hpcC0+ZGV2Owo+Pj4+ICsJY29u c3Qgc3RydWN0IGR3X2VkbWFfY29yZV9vcHMgKm9wczsKPj4+PiArCXNpemVfdCBsbF9jaHVuayA9 IGR3LT5sbF9yZWdpb24uc3o7Cj4+Pj4gKwlzaXplX3QgZHRfY2h1bmsgPSBkdy0+ZHRfcmVnaW9u LnN6Owo+Pj4+ICsJdTMyIGNoX3RvdDsKPj4+PiArCWludCBpLCBqLCBlcnI7Cj4+Pj4gKwo+Pj4+ ICsJcmF3X3NwaW5fbG9ja19pbml0KCZkdy0+bG9jayk7Cj4+Pj4gKwo+Pj4+ICsJLyogQ2FsbGJh Y2sgb3BlcmF0aW9uIHNlbGVjdGlvbiBhY2NvcmRpbmdseSB0byBlRE1BIHZlcnNpb24gKi8KPj4+ PiArCXN3aXRjaCAoZHctPnZlcnNpb24pIHsKPj4+PiArCWRlZmF1bHQ6Cj4+Pj4gKwkJZGV2X2Vy cihkZXYsICJ1bnN1cHBvcnRlZCB2ZXJzaW9uXG4iKTsKPj4+PiArCQlyZXR1cm4gLUVQRVJNOwo+ Pj4+ICsJfQo+Pj4KPj4+IFNvIHdlIGhhdmUgb25seSBvbmUgY2FzZSB3aGljaCByZXR1cm5zIGVy cm9yLCB3YXMgdGhpcyBjb2RlIHRlc3RlZD8KPj4KPj4gWWVzIGl0IHdhcywgYnV0IEkgdW5kZXJz dGFuZCB3aGF0IHlvdXIgcG9pbnQgb2Ygdmlldy4KPj4gVGhpcyB3YXMgZG9uZSBsaWtlIHRoaXMs IGJlY2F1c2UgSSB3YW5uYSB0byBzZWdtZW50IHRoZSBwYXRjaCBzZXJpZXMgbGlrZSB0aGlzOgo+ PiAgMSkgQWRkaW5nIGVETUEgZHJpdmVyIGNvcmUsIHdoaWNoIGNvbnRhaW5zIHRoZSBkcml2ZXIg c2tlbGV0b24gYW5kIHRoZSB3aG9sZQo+PiBsb2dpYyBhc3NvY2lhdGVkLgo+PiAgMikgYW5kIDMp IEFkZGluZyB0aGUgY2FsbGJhY2tzIGZvciB0aGUgZURNQSByZWdpc3RlciBtYXBwaW5nIHZlcnNp b24gMCAoaXQgd2lsbAo+PiBhcHBlYXIgaW4gdGhlIGZ1dHVyZSBhIG5ldyB2ZXJzaW9uLCBJIHRo b3VnaHQgdGhhdCB0aGlzIG5ldyB2ZXJzaW9uIHdvdWxkIGNhbWUKPj4gd2hpbGUgSSB3YXMgdHJ5 aW5nIHRvIGdldCB0aGUgZmVlZGJhY2sgYWJvdXQgdGhpcyBwYXRjaCBzZXJpZXMsIHRoZXJlZm9y ZSB3b3VsZAo+PiBoYXZlIGFub3RoZXIgMiBwYXRjaGVzIGZvciB0aGUgdmVyc2lvbiAxIGlzb2xh dGVkIGFuZCBpbmRlcGVuZGVudCBmcm9tIHRoZQo+PiB2ZXJzaW9uIDApLgo+PiAgNCkgYW5kIDUp IEFkZGluZyB0aGUgUENJZSBnbHVlLWxvZ2ljIGFuZCBkZXZpY2UgSUQgYXNzb2NpYXRlZC4KPj4g IDYpIEFkZGluZyBtYWludGFpbmVyIGZvciB0aGlzIGRyaXZlci4KPj4gIDcpIEFkZGluZyBhIHRl c3QgZHJpdmVyLgo+Pgo+PiBTaW5jZSB0aGlzIHN3aXRjaCB3aWxsIG9ubHkgaGF2ZSB0aGUgYXNz b2NpYXRlZCBjYXNlIG9uIHBhdGNoIDIsIHRoYXQgd2h5IG9uCj4+IHBhdGNoIDEgZG9lc24ndCBh cHBlYXIgYW55IHBvc3NpYmlsaXR5Lgo+Pgo+PiBJZiB5b3UgZmVlbCBsb2dpYyB0byBzcXVhc2gg cGF0Y2ggMiB3aXRoIHBhdGNoIDEsIGp1c3Qgc2F5IHNvbWV0aGluZyBhbmQgSSdsbCBkbwo+PiBp dCBmb3IgeW91IDopCj4gCj4gd2VsbCBlYWNoIHBhdGNoIHNob3VsZCBidWlsZCBhbmQgd29yayBv biBpdHMgb3duLCBvdGhlcndpc2Ugd2UgZ2V0Cj4gcHJvYmxlbXMgOikgQnV0IHNpbmNlIHRoaXMg aXMgYSBuZXcgZHJpdmVyIGl0IGlzIG9rYXkuIEFueXdheSB0aGlzIHBhdGNoCj4gaXMgcXVpdGUg X2h1Z2VfIHNvIGxldHMgbm90IGFkZCBtb3JlIHRvIGl0Li4KPiAKPiBJIHdvdWxkIGhhdmUgbW92 ZWQgdGhlIGNhbGxiYWNrIGNoZWNrIHRvIHN1YnNlcXVlbnQgb25lLi4KClNvcnJ5LiBJIGRpZG4n dCBjYXRjaCB0aGlzLiBDYW4geW91IGV4cGxhaW4gaXQ/Cgo+IAo+Pj4+ICsJcG1fcnVudGltZV9n ZXRfc3luYyhkZXYpOwo+Pj4+ICsKPj4+PiArCS8qIEZpbmQgb3V0IGhvdyBtYW55IHdyaXRlIGNo YW5uZWxzIGFyZSBzdXBwb3J0ZWQgYnkgaGFyZHdhcmUgKi8KPj4+PiArCWR3LT53cl9jaF9jbnQg PSBvcHMtPmNoX2NvdW50KGR3LCBFRE1BX0RJUl9XUklURSk7Cj4+Pj4gKwlpZiAoIWR3LT53cl9j aF9jbnQpIHsKPj4+PiArCQlkZXZfZXJyKGRldiwgImludmFsaWQgbnVtYmVyIG9mIHdyaXRlIGNo YW5uZWxzKDApXG4iKTsKPj4+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4+PiArCX0KPj4+PiArCj4+ Pj4gKwkvKiBGaW5kIG91dCBob3cgbWFueSByZWFkIGNoYW5uZWxzIGFyZSBzdXBwb3J0ZWQgYnkg aGFyZHdhcmUgKi8KPj4+PiArCWR3LT5yZF9jaF9jbnQgPSBvcHMtPmNoX2NvdW50KGR3LCBFRE1B X0RJUl9SRUFEKTsKPj4+PiArCWlmICghZHctPnJkX2NoX2NudCkgewo+Pj4+ICsJCWRldl9lcnIo ZGV2LCAiaW52YWxpZCBudW1iZXIgb2YgcmVhZCBjaGFubmVscygwKVxuIik7Cj4+Pj4gKwkJcmV0 dXJuIC1FSU5WQUw7Cj4+Pj4gKwl9Cj4+Pj4gKwo+Pj4+ICsJZGV2X2RiZyhkZXYsICJDaGFubmVs czpcdHdyaXRlPSVkLCByZWFkPSVkXG4iLAo+Pj4+ICsJCWR3LT53cl9jaF9jbnQsIGR3LT5yZF9j aF9jbnQpOwo+Pj4+ICsKPj4+PiArCWNoX3RvdCA9IGR3LT53cl9jaF9jbnQgKyBkdy0+cmRfY2hf Y250Owo+Pj4+ICsKPj4+PiArCS8qIEFsbG9jYXRlIGNoYW5uZWxzICovCj4+Pj4gKwlkdy0+Y2hh biA9IGRldm1fa2NhbGxvYyhkZXYsIGNoX3RvdCwgc2l6ZW9mKCpkdy0+Y2hhbiksIEdGUF9LRVJO RUwpOwo+Pj4KPj4+IHlvdSBtYXkgdXNlIHN0cnVjdF9zaXplKCkgaGVyZQo+Pgo+PiBIdW0sIHRo aXMgd291bGQgYmUgdXNlZnVsIGlmIEkgd2FudGVkIHRvIGFsbG9jYXRlIHRoZSBkdyBzdHJ1Y3Qg YXMgd2VsbCwgcmlnaHQ/Cj4+IFNpbmNlIGR3IHN0cnVjdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCwg aXQgbG9va3MgbGlrZSB0aGlzIGNhbid0IGJlIHVzZWQsIG9yIGFtIEkKPj4gbWlzc2luZyBzb21l dGhpbmc/Cj4gCj4geWVhaCB5b3UgY2FuIGFsbG9jYXRlIGR3ICsgY2hhbiBvbmUgc2hvdC4uLgoK SSdtIGFsbG9jYXRpbmcgZHcgc3RydWN0IG9uIHRoZSBQQ0llIGdsdWUtbG9naWMgZHJpdmVyIGlu IG9yZGVyIHRvIHNldCBpdCBsYXRlcgpzb21lIGRhdGEgdGhhdCB3aWxsIGJlIHVzZWZ1bCBoZXJl IGFuZCBoZXJlIEknbSBvbmx5IGFkZGluZyB0aGUgY2hhbm5lbHMuIFRoYXQncwp3aHkgSSBjYW4n dCBhbGxvY2F0ZSBhbGwgaW4gb25lIHNob3QuCgo+Cg==