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: Vinod Koul Message-Id: <20190123130829.GQ4635@vkoul-mobl> Date: Wed, 23 Jan 2019 18:38:29 +0530 To: 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: T24gMjEtMDEtMTksIDE1OjQ4LCBHdXN0YXZvIFBpbWVudGVsIHdyb3RlOgo+IE9uIDIwLzAxLzIw MTkgMTE6NDQsIFZpbm9kIEtvdWwgd3JvdGU6Cj4gPiBPbiAxMS0wMS0xOSwgMTk6MzMsIEd1c3Rh dm8gUGltZW50ZWwgd3JvdGU6Cj4gPj4gQWRkIFN5bm9wc3lzIGVETUEgSVAgY29yZSBkcml2ZXIg dG8ga2VybmVsLgo+ID4+Cj4gPj4gVGhpcyBjb3JlIGRyaXZlciwgaW5pdGlhbGl6ZXMgYW5kIGNv bmZpZ3VyZXMgdGhlIGVETUEgSVAgdXNpbmcgdm1hLWhlbHBlcnMKPiA+PiBmdW5jdGlvbnMgYW5k IGRtYS1lbmdpbmUgc3Vic3lzdGVtLgo+ID4gCj4gPiBBIGRlc2NyaXB0aW9uIG9mIGVETUEgSVAg d2lsbCBoZWxwIHJldmlldyB0aGUgZHJpdmVyCj4gCj4gSSd2ZSB0aGUgSVAgZGVzY3JpcHRpb24g b24gdGhlIGNvdmVyLWxldHRlciwgYnV0IEknbGwgYnJpbmcgaXQgdG8gdGhpcyBwYXRjaCwgaWYK PiBpdCBoZWxwcy4KCnllYWggY292ZXIgZG9lc250IGdldCBhcHBsaWVkLCBjaGFuZ2Vsb2cgYXJl IHZlcnkgaW1wb3J0YW50CmRvY3VtZW50YXRpb24gZm9yIGtlcm5lbAoKPiA+PiBAQCAtMCwwICsx LDEwNTkgQEAKPiA+PiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPiA+PiAr LyoKPiA+PiArICogQ29weXJpZ2h0IChjKSAyMDE4IFN5bm9wc3lzLCBJbmMuIGFuZC9vciBpdHMg YWZmaWxpYXRlcy4KPiA+IAo+ID4gMjAxOSBub3cKPiAKPiBJJ3ZlIGNoYW5nZWQgdG8gIkNvcHly aWdodCAoYykgMjAxOC1wcmVzZW50IFN5bm9wc3lzLCBJbmMuIGFuZC9vciBpdHMKPiBhZmZpbGlh dGVzLiIgdGhpcyB3YXkgaXQncyBhbHdheXMgdXAgdG8gZGF0ZSBhbmQgSSBhbHNvIGtlcHQgMjAx OCwgYmVjYXVzZSBpdAo+IHdhcyB0aGUgZGF0ZSB0aGF0IEkgc3RhcnRlZCB0byBkZXZlbG9wIHRo aXMgZHJpdmVyLCBpZiB5b3UgZG9uJ3QgbWluZC4KCnllYWggMTggaXMgZmluZSA6KSBpdCBuZWVk IHRvIGVuZCB3aXRoIGN1cnJlbnQgeWVhciBhbHdheXMKCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgZHdf ZWRtYV9jaHVuayAqZHdfZWRtYV9hbGxvY19jaHVuayhzdHJ1Y3QgZHdfZWRtYV9kZXNjICpkZXNj KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0gZGVzYy0+Y2hhbjsK PiA+PiArCXN0cnVjdCBkd19lZG1hICpkdyA9IGNoYW4tPmNoaXAtPmR3Owo+ID4+ICsJc3RydWN0 IGR3X2VkbWFfY2h1bmsgKmNodW5rOwo+ID4+ICsKPiA+PiArCWNodW5rID0ga3Z6YWxsb2Moc2l6 ZW9mKCpjaHVuayksIEdGUF9OT1dBSVQpOwo+ID4+ICsJaWYgKHVubGlrZWx5KCFjaHVuaykpCj4g Pj4gKwkJcmV0dXJuIE5VTEw7Cj4gPj4gKwo+ID4+ICsJSU5JVF9MSVNUX0hFQUQoJmNodW5rLT5s aXN0KTsKPiA+PiArCWNodW5rLT5jaGFuID0gY2hhbjsKPiA+PiArCWNodW5rLT5jYiA9ICEoZGVz Yy0+Y2h1bmtzX2FsbG9jICUgMik7Cj4gPiAKPiA+IGNiIC4uPwo+IAo+IENCID0gY2hhbmdlIGJp dCwgaXMgYSBwcm9wZXJ0eSBvZiB0aGlzIGVETUEgSVAuIEJhc2ljYWxseSBpdCBpcyBhIGtpbmQg b2YKPiBoYW5kc2hha2Ugd2hpY2ggc2VydmVzIHRvIHZhbGlkYXRlIHdoZXRoZXIgdGhlIGxpbmtl ZCBsaXN0IGhhcyBiZWVuIHVwZGF0ZWQgb3IKPiBub3QsIGVzcGVjaWFsbHkgdXNlZnVsIGluIGNh c2VzIG9mIHJlY3ljbGVkIGxpbmtlZCBsaXN0IGVsZW1lbnRzIChldmVyeSBsaW5rZWQKPiBsaXN0 IHJlY3ljbGUgaXMgYSBuZXcgY2h1bmssIHRoaXMgd2lsbCBhbGxvdyB0byBkaWZmZXJlbnRpYXRl IGVhY2ggY2h1bmspLgoKb2theSBwbGVhc2UgYWRkIHRoYXQgc29tZXdoZXJlLiBBbHNvIGl0IHdv dWxkIGhlbHAgbWUgaWYgeW91IGV4cGxhaW4Kd2hhdCBpcyBjaHVuayBhbmQgb3RoZXIgdGVybWlu b2xvZ2llcyB1c2VkIGluIHRoaXMgZHJpdmVyCgo+ID4+ICtzdGF0aWMgaW50IGR3X2VkbWFfZGV2 aWNlX2NvbmZpZyhzdHJ1Y3QgZG1hX2NoYW4gKmRjaGFuLAo+ID4+ICsJCQkJIHN0cnVjdCBkbWFf c2xhdmVfY29uZmlnICpjb25maWcpCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBkd19lZG1hX2NoYW4g KmNoYW4gPSBkY2hhbjJkd19lZG1hX2NoYW4oZGNoYW4pOwo+ID4+ICsJY29uc3Qgc3RydWN0IGR3 X2VkbWFfY29yZV9vcHMgKm9wcyA9IGNoYW4yb3BzKGNoYW4pOwo+ID4+ICsJdW5zaWduZWQgbG9u ZyBmbGFnczsKPiA+PiArCWludCBlcnIgPSAwOwo+ID4+ICsKPiA+PiArCXNwaW5fbG9ja19pcnFz YXZlKCZjaGFuLT52Yy5sb2NrLCBmbGFncyk7Cj4gPj4gKwo+ID4+ICsJaWYgKCFjb25maWcpIHsK PiA+PiArCQllcnIgPSAtRUlOVkFMOwo+ID4+ICsJCWdvdG8gZXJyX2NvbmZpZzsKPiA+PiArCX0K PiA+PiArCj4gPj4gKwlpZiAoY2hhbi0+c3RhdHVzICE9IEVETUFfU1RfSURMRSkgewo+ID4+ICsJ CWRldl9lcnIoY2hhbjJkZXYoY2hhbiksICJjaGFubmVsIGlzIGJ1c3kgb3IgcGF1c2VkXG4iKTsK PiA+PiArCQllcnIgPSAtRVBFUk07Cj4gPiAKPiA+IHRoaXMgaXMgbm90IGNvcnJlY3QgYmVoYXZp b3VyLCBkZXZpY2VfY29uZmlnIGNhbiBiZSBjYWxsZWQgYW55dGltZSBhbmQKPiA+IHZhbHVlcyBj YW4gdGFrZSBhZmZlY3Qgb24gbmV4dCB0cmFuc2FjdGlvbiBzdWJtaXR0ZWQuLgo+IAo+IEh1bSwg SSB0aG91Z2h0IHdlIGNvdWxkIG9ubHkgcmVjb25maWd1cmUgYWZ0ZXIgdHJhbnNmZXIgYmVpbmcg ZmluaXNoZWQuCgpOb3BlLCBhbnl0aW1lLiBUaGV5IHRha2UgZWZmZWN0IGZvciBuZXh0IHByZXBh cmUgd2hlbiB5b3UgdXNlIGl0Cgo+ID4+ICsJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgImFkZHIo cGh5c2ljYWwpIHNyYz0lcGEsIGRzdD0lcGFcbiIsCj4gPj4gKwkJJmNvbmZpZy0+c3JjX2FkZHIs ICZjb25maWctPmRzdF9hZGRyKTsKPiA+PiArCj4gPj4gKwljaGFuLT5zcmNfYWRkciA9IGNvbmZp Zy0+c3JjX2FkZHI7Cj4gPj4gKwljaGFuLT5kc3RfYWRkciA9IGNvbmZpZy0+ZHN0X2FkZHI7Cj4g Pj4gKwo+ID4+ICsJZXJyID0gb3BzLT5kZXZpY2VfY29uZmlnKGRjaGFuKTsKPiA+IAo+ID4gd2hh dCBkb2VzIHRoaXMgZG8/Cj4gCj4gVGhpcyBpcyBhbiBpbml0aWFsaXphdGlvbiBwcm9jZWR1cmUg dG8gc2V0dXAgaW50ZXJydXB0cyAoZGF0YSBhbmQgYWRkcmVzc2VzKSB0bwo+IGVhY2ggY2hhbm5l bCBvbiB0aGUgZURNQSBJUCwgIGluIG9yZGVyIHRvIGJlIHRyaWdnZXJlZCBhZnRlciB0cmFuc2Zl ciBiZWluZwo+IGNvbXBsZXRlZCBvciBhYm9ydGVkLiBEdWUgdGhlIGZhY3QgdGhlIGNvbmZpZygp IGNhbiBiZSBjYWxsZWQgYXQgYW55dGltZSwKPiBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSB0 aGlzIHByb2NlZHVyZSBoZXJlLCBJJ2xsIG1vdmVkIGl0IHRvIHByb2JlKCkuCgpZZWFoIEkgYW0g bm90IHN0aWxsIGNvbnZpbmNlZCBhYm91dCBoYXZpbmcgYW5vdGhlciBsYXllciEgSGF2ZSB5b3UK dGhvdWdoIGFib3V0IHVzaW5nIGNvbW1vbiBsaWIgZm9yIGNvbW1vbiBwYXJ0cyAuLj8KCj4gPiB0 aGlzIGxvb2tzIGluY29ycmVjdCBpbnRlcnByZXRhdGlvbiB0byBtZS4gVGhlIHN0YXR1cyBpcyB0 byBiZSByZXRyaWV2ZWQKPiA+IGZvciB0aGUgZ2l2ZW4gY29va2llIHBhc3NlZCBhbmQgZ2l2ZW4g dGhhdCB5b3UgZG8gbm90IGV2ZW4gdXNlIHRoaXMKPiA+IGFyZ3VtZW50IHRlbGxzIG1lIHRoYXQg eW91IGhhdmUgdW5kZXJzdG9vZCB0aGlzIGFzICdjaGFubmVsJyBzdGF0dXMKPiA+IHJlcG9ydGlu Zywgd2hpY2ggaXMgbm90IGNvcnJlY3QKPiAKPiBZZXMsIHlvdSdyZSByaWdodCwgbXkgaW50ZXJw cmV0YXRpb24gYXNzdW1lcyB0aGlzIGZ1bmN0aW9uIHJlcG9ydHMKPiBjaGFubmVsL3RyYW5zYWN0 aW9uIHN0YXR1cy4gV2hhdCB3b3VsZCBiZSB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbj8KPiBT b21ldGhpbmcgbGlrZSB0aGlzPwo+IAo+IHsKPiAJc3RydWN0IGR3X2VkbWFfY2hhbiAqY2hhbiA9 IGRjaGFuMmR3X2VkbWFfY2hhbihkY2hhbik7Cj4gCWNvbnN0IHN0cnVjdCBkd19lZG1hX2NvcmVf b3BzICpvcHMgPSBjaGFuMm9wcyhjaGFuKTsKPiAJc3RydWN0IGR3X2VkbWFfZGVzYyAqZGVzYzsK PiAJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkOwo+IAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+IAll bnVtIGRtYV9zdGF0dXMgcmV0Owo+IAl1MzIgcmVzaWR1ZSA9IDA7Cj4gCj4gCXNwaW5fbG9ja19p cnFzYXZlKCZjaGFuLT52Yy5sb2NrLCBmbGFncyk7Cj4gCj4gCXJldCA9IGRtYV9jb29raWVfc3Rh dHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7Cj4gCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFKQo+ IAkJZ290byByZXRfc3RhdHVzOwo+IAo+IAl2ZCA9IHZjaGFuX25leHRfZGVzYygmY2hhbi0+dmMp Owo+IAlpZiAoIXZkKQo+IAkJZ290byByZXRfc3RhdHVzOwo+IAo+IAlkZXNjID0gdmQyZHdfZWRt YV9kZXNjKHZkKTsKPiAJaWYgKCFkZXNjKQo+IAkJcmVzaWR1ZSA9IGRlc2MtPmFsbG9jX3N6IC0g ZGVzYy0+eGZlcl9zejsKPiAJCQo+IAlpZiAocmV0ID09IERNQV9JTl9QUk9HUkVTUyAmJiBjaGFu LT5zdGF0dXMgPT0gRURNQV9TVF9QQVVTRSkKPiAJCXJldCA9IERNQV9QQVVTRUQ7Cgp0aGlzIGxv b2tzIGJldHRlciwgcGxlYXNlIGRvIGtlZXAgaW4gbWluZCB0eHN0YXRlIGNhbiBiZSBudWxsLCBz bwpyZXNpZHVlIGNhbG4gY2FuIGJlIHNraXBwZWQKCj4gPj4gK3N0YXRpYyBzdHJ1Y3QgZG1hX2Fz eW5jX3R4X2Rlc2NyaXB0b3IgKgo+ID4+ICtkd19lZG1hX2RldmljZV9wcmVwX3NsYXZlX3NnKHN0 cnVjdCBkbWFfY2hhbiAqZGNoYW4sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLAo+ID4+ICsJCQkg ICAgIHVuc2lnbmVkIGludCBzZ19sZW4sCj4gPj4gKwkJCSAgICAgZW51bSBkbWFfdHJhbnNmZXJf ZGlyZWN0aW9uIGRpcmVjdGlvbiwKPiA+PiArCQkJICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCB2 b2lkICpjb250ZXh0KQo+ID4+ICt7Cj4gPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaGFuICpjaGFuID0g ZGNoYW4yZHdfZWRtYV9jaGFuKGRjaGFuKTsKPiA+PiArCXN0cnVjdCBkd19lZG1hX2Rlc2MgKmRl c2M7Cj4gPj4gKwlzdHJ1Y3QgZHdfZWRtYV9jaHVuayAqY2h1bms7Cj4gPj4gKwlzdHJ1Y3QgZHdf ZWRtYV9idXJzdCAqYnVyc3Q7Cj4gPj4gKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwo+ID4+ICsJ dW5zaWduZWQgbG9uZyBzZmxhZ3M7Cj4gPj4gKwlwaHlzX2FkZHJfdCBzcmNfYWRkcjsKPiA+PiAr CXBoeXNfYWRkcl90IGRzdF9hZGRyOwo+ID4+ICsJaW50IGk7Cj4gPj4gKwo+ID4+ICsJaWYgKHNn X2xlbiA8IDEpIHsKPiA+PiArCQlkZXZfZXJyKGNoYW4yZGV2KGNoYW4pLCAiaW52YWxpZCBzZyBs ZW5ndGggJXVcbiIsIHNnX2xlbik7Cj4gPj4gKwkJcmV0dXJuIE5VTEw7Cj4gPj4gKwl9Cj4gPj4g Kwo+ID4+ICsJaWYgKGRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSAmJiBjaGFuLT5kaXIgPT0g RURNQV9ESVJfV1JJVEUpIHsKPiA+IAo+ID4gd2hhdCBpcyB0aGUgc2Vjb25kIHBhcnQgb2YgdGhl IGNoZWNrLCBjYW4geW91IGV4cGxhaW4gdGhhdCwgd2hvIHNldHMKPiA+IGNoYW4tPmRpcj8KPiAK PiBUaGUgY2hhbi0+ZGlyIGlzIHNldCBvbiBwcm9iZSgpIGR1cmluZyB0aGUgcHJvY2VzcyBvZiBj b25maWd1cmluZyBlYWNoIGNoYW5uZWwuCgpTbyB5b3UgaGF2ZSBjaGFubmVscyB0aGF0IGFyZSB1 bmlkaXJlY3Rpb25hbD8KCj4gPj4gKwkJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwJInByZXBhcmUg b3BlcmF0aW9uIChXUklURSlcbiIpOwo+ID4+ICsJfSBlbHNlIGlmIChkaXJlY3Rpb24gPT0gRE1B X01FTV9UT19ERVYgJiYgY2hhbi0+ZGlyID09IEVETUFfRElSX1JFQUQpIHsKPiA+PiArCQlkZXZf ZGJnKGNoYW4yZGV2KGNoYW4pLAkicHJlcGFyZSBvcGVyYXRpb24gKFJFQUQpXG4iKTsKPiA+PiAr CX0gZWxzZSB7Cj4gPj4gKwkJZGV2X2VycihjaGFuMmRldihjaGFuKSwgImludmFsaWQgZGlyZWN0 aW9uXG4iKTsKPiA+PiArCQlyZXR1cm4gTlVMTDsKPiA+PiArCX0KPiA+PiArCj4gPj4gKwlpZiAo IWNoYW4tPmNvbmZpZ3VyZWQpIHsKPiA+PiArCQlkZXZfZXJyKGNoYW4yZGV2KGNoYW4pLCAiKHBy ZXBfc2xhdmVfc2cpIGNoYW5uZWwgbm90IGNvbmZpZ3VyZWRcbiIpOwo+ID4+ICsJCXJldHVybiBO VUxMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCWlmIChjaGFuLT5zdGF0dXMgIT0gRURNQV9TVF9J RExFKSB7Cj4gPj4gKwkJZGV2X2VycihjaGFuMmRldihjaGFuKSwgImNoYW5uZWwgaXMgYnVzeSBv ciBwYXVzZWRcbiIpOwo+ID4+ICsJCXJldHVybiBOVUxMOwo+ID4+ICsJfQo+ID4gCj4gPiBObywg d3JvbmcgYWdhaW4uIFRoZSB0eG4gbXVzdCBiZSBwcmVwYXJlZCBhbmQgdGhlbiBvbiBzdWJtaXQg YWRkZWQgdG8gYQo+ID4gcXVldWUuIFlvdSBhcmUgd3JpdGluZyBhIGRyaXZlciBmb3IgZG1hZW5n aW5lLCBzdXJlbHkgeW91IGRvbnQgZXhwZWN0Cj4gPiB0aGUgY2hhbm5lbCB0byBiZSBmcmVlIGFu ZCB0aGVuIGRvIGEgdHhuLi4gdGhhdCB3b3VsZCBiZSB2ZXJ5Cj4gPiBpbmVmZmljaWVudCEKPiAK PiBJIGRpZCBub3QgcmVhbGl6ZSB0aGF0IHRoZSBmbG93IGNvdWxkIGJlIGFzIHlvdSBtZW50aW9u ZWQuIFRoZSBkb2N1bWVudGF0aW9uIEkKPiByZWFkIGFib3V0IHRoZSBzdWJzeXN0ZW0gZGlkIG5v dCBnaXZlIG1lIHRoaXMgaWRlYS4gVGhhbmsgeW91IGZvciBjbGFyaWZ5aW5nIG1lLgoKSSB0aGlu ayB3ZSBoYXZlIGltcHJvdmVkICB0aGF0IHBhcnQgYSBsb3QsIHBsZWFzZSBkbyBmZWVsIGZyZWUg dG8gcG9pbnQKb3V0IGluY29uc2lzdGVuY3kKU2VlIERNQSB1c2FnZSBpbiBEb2N1bWVudGF0aW9u L2RyaXZlci1hcGkvZG1hZW5naW5lL2NsaWVudC5yc3QKCj4gPj4gK2ludCBkd19lZG1hX3Byb2Jl KHN0cnVjdCBkd19lZG1hX2NoaXAgKmNoaXApCj4gPj4gK3sKPiA+PiArCXN0cnVjdCBkd19lZG1h ICpkdyA9IGNoaXAtPmR3Owo+ID4+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gY2hpcC0+ZGV2Owo+ ID4+ICsJY29uc3Qgc3RydWN0IGR3X2VkbWFfY29yZV9vcHMgKm9wczsKPiA+PiArCXNpemVfdCBs bF9jaHVuayA9IGR3LT5sbF9yZWdpb24uc3o7Cj4gPj4gKwlzaXplX3QgZHRfY2h1bmsgPSBkdy0+ ZHRfcmVnaW9uLnN6Owo+ID4+ICsJdTMyIGNoX3RvdDsKPiA+PiArCWludCBpLCBqLCBlcnI7Cj4g Pj4gKwo+ID4+ICsJcmF3X3NwaW5fbG9ja19pbml0KCZkdy0+bG9jayk7Cj4gPj4gKwo+ID4+ICsJ LyogQ2FsbGJhY2sgb3BlcmF0aW9uIHNlbGVjdGlvbiBhY2NvcmRpbmdseSB0byBlRE1BIHZlcnNp b24gKi8KPiA+PiArCXN3aXRjaCAoZHctPnZlcnNpb24pIHsKPiA+PiArCWRlZmF1bHQ6Cj4gPj4g KwkJZGV2X2VycihkZXYsICJ1bnN1cHBvcnRlZCB2ZXJzaW9uXG4iKTsKPiA+PiArCQlyZXR1cm4g LUVQRVJNOwo+ID4+ICsJfQo+ID4gCj4gPiBTbyB3ZSBoYXZlIG9ubHkgb25lIGNhc2Ugd2hpY2gg cmV0dXJucyBlcnJvciwgd2FzIHRoaXMgY29kZSB0ZXN0ZWQ/Cj4gCj4gWWVzIGl0IHdhcywgYnV0 IEkgdW5kZXJzdGFuZCB3aGF0IHlvdXIgcG9pbnQgb2Ygdmlldy4KPiBUaGlzIHdhcyBkb25lIGxp a2UgdGhpcywgYmVjYXVzZSBJIHdhbm5hIHRvIHNlZ21lbnQgdGhlIHBhdGNoIHNlcmllcyBsaWtl IHRoaXM6Cj4gIDEpIEFkZGluZyBlRE1BIGRyaXZlciBjb3JlLCB3aGljaCBjb250YWlucyB0aGUg ZHJpdmVyIHNrZWxldG9uIGFuZCB0aGUgd2hvbGUKPiBsb2dpYyBhc3NvY2lhdGVkLgo+ICAyKSBh bmQgMykgQWRkaW5nIHRoZSBjYWxsYmFja3MgZm9yIHRoZSBlRE1BIHJlZ2lzdGVyIG1hcHBpbmcg dmVyc2lvbiAwIChpdCB3aWxsCj4gYXBwZWFyIGluIHRoZSBmdXR1cmUgYSBuZXcgdmVyc2lvbiwg SSB0aG91Z2h0IHRoYXQgdGhpcyBuZXcgdmVyc2lvbiB3b3VsZCBjYW1lCj4gd2hpbGUgSSB3YXMg dHJ5aW5nIHRvIGdldCB0aGUgZmVlZGJhY2sgYWJvdXQgdGhpcyBwYXRjaCBzZXJpZXMsIHRoZXJl Zm9yZSB3b3VsZAo+IGhhdmUgYW5vdGhlciAyIHBhdGNoZXMgZm9yIHRoZSB2ZXJzaW9uIDEgaXNv bGF0ZWQgYW5kIGluZGVwZW5kZW50IGZyb20gdGhlCj4gdmVyc2lvbiAwKS4KPiAgNCkgYW5kIDUp IEFkZGluZyB0aGUgUENJZSBnbHVlLWxvZ2ljIGFuZCBkZXZpY2UgSUQgYXNzb2NpYXRlZC4KPiAg NikgQWRkaW5nIG1haW50YWluZXIgZm9yIHRoaXMgZHJpdmVyLgo+ICA3KSBBZGRpbmcgYSB0ZXN0 IGRyaXZlci4KPiAKPiBTaW5jZSB0aGlzIHN3aXRjaCB3aWxsIG9ubHkgaGF2ZSB0aGUgYXNzb2Np YXRlZCBjYXNlIG9uIHBhdGNoIDIsIHRoYXQgd2h5IG9uCj4gcGF0Y2ggMSBkb2Vzbid0IGFwcGVh ciBhbnkgcG9zc2liaWxpdHkuCj4gCj4gSWYgeW91IGZlZWwgbG9naWMgdG8gc3F1YXNoIHBhdGNo IDIgd2l0aCBwYXRjaCAxLCBqdXN0IHNheSBzb21ldGhpbmcgYW5kIEknbGwgZG8KPiBpdCBmb3Ig eW91IDopCgp3ZWxsIGVhY2ggcGF0Y2ggc2hvdWxkIGJ1aWxkIGFuZCB3b3JrIG9uIGl0cyBvd24s IG90aGVyd2lzZSB3ZSBnZXQKcHJvYmxlbXMgOikgQnV0IHNpbmNlIHRoaXMgaXMgYSBuZXcgZHJp dmVyIGl0IGlzIG9rYXkuIEFueXdheSB0aGlzIHBhdGNoCmlzIHF1aXRlIF9odWdlXyBzbyBsZXRz IG5vdCBhZGQgbW9yZSB0byBpdC4uCgpJIHdvdWxkIGhhdmUgbW92ZWQgdGhlIGNhbGxiYWNrIGNo ZWNrIHRvIHN1YnNlcXVlbnQgb25lLi4KCj4gPj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKGRldik7 Cj4gPj4gKwo+ID4+ICsJLyogRmluZCBvdXQgaG93IG1hbnkgd3JpdGUgY2hhbm5lbHMgYXJlIHN1 cHBvcnRlZCBieSBoYXJkd2FyZSAqLwo+ID4+ICsJZHctPndyX2NoX2NudCA9IG9wcy0+Y2hfY291 bnQoZHcsIEVETUFfRElSX1dSSVRFKTsKPiA+PiArCWlmICghZHctPndyX2NoX2NudCkgewo+ID4+ ICsJCWRldl9lcnIoZGV2LCAiaW52YWxpZCBudW1iZXIgb2Ygd3JpdGUgY2hhbm5lbHMoMClcbiIp Owo+ID4+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4+ICsJfQo+ID4+ICsKPiA+PiArCS8qIEZpbmQg b3V0IGhvdyBtYW55IHJlYWQgY2hhbm5lbHMgYXJlIHN1cHBvcnRlZCBieSBoYXJkd2FyZSAqLwo+ ID4+ICsJZHctPnJkX2NoX2NudCA9IG9wcy0+Y2hfY291bnQoZHcsIEVETUFfRElSX1JFQUQpOwo+ ID4+ICsJaWYgKCFkdy0+cmRfY2hfY250KSB7Cj4gPj4gKwkJZGV2X2VycihkZXYsICJpbnZhbGlk IG51bWJlciBvZiByZWFkIGNoYW5uZWxzKDApXG4iKTsKPiA+PiArCQlyZXR1cm4gLUVJTlZBTDsK PiA+PiArCX0KPiA+PiArCj4gPj4gKwlkZXZfZGJnKGRldiwgIkNoYW5uZWxzOlx0d3JpdGU9JWQs IHJlYWQ9JWRcbiIsCj4gPj4gKwkJZHctPndyX2NoX2NudCwgZHctPnJkX2NoX2NudCk7Cj4gPj4g Kwo+ID4+ICsJY2hfdG90ID0gZHctPndyX2NoX2NudCArIGR3LT5yZF9jaF9jbnQ7Cj4gPj4gKwo+ ID4+ICsJLyogQWxsb2NhdGUgY2hhbm5lbHMgKi8KPiA+PiArCWR3LT5jaGFuID0gZGV2bV9rY2Fs bG9jKGRldiwgY2hfdG90LCBzaXplb2YoKmR3LT5jaGFuKSwgR0ZQX0tFUk5FTCk7Cj4gPiAKPiA+ IHlvdSBtYXkgdXNlIHN0cnVjdF9zaXplKCkgaGVyZQo+IAo+IEh1bSwgdGhpcyB3b3VsZCBiZSB1 c2VmdWwgaWYgSSB3YW50ZWQgdG8gYWxsb2NhdGUgdGhlIGR3IHN0cnVjdCBhcyB3ZWxsLCByaWdo dD8KPiBTaW5jZSBkdyBzdHJ1Y3QgaXMgYWxyZWFkeSBhbGxvY2F0ZWQsIGl0IGxvb2tzIGxpa2Ug dGhpcyBjYW4ndCBiZSB1c2VkLCBvciBhbSBJCj4gbWlzc2luZyBzb21ldGhpbmc/Cgp5ZWFoIHlv dSBjYW4gYWxsb2NhdGUgZHcgKyBjaGFuIG9uZSBzaG90Li4uCg==