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: [v11,1/4] dmaengine: 8250_mtk_dma: add MediaTek uart DMA support From: Long Cheng Message-Id: <1554802931.14150.1.camel@mhfsdcap03> Date: Tue, 9 Apr 2019 17:42:11 +0800 To: Nicolas Boichat Cc: Vinod Koul , Randy Dunlap , Rob Herring , Mark Rutland , Ryder Lee , Sean Wang , Matthias Brugger , Dan Williams , Greg Kroah-Hartman , Jiri Slaby , Sean Wang , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-arm Mailing List , "moderated list:ARM/Mediatek SoC support" , lkml , linux-serial@vger.kernel.org, srv_heupstream , Yingjoe Chen , YT Shen , Zhenbao Liu List-ID: T24gU3VuLCAyMDE5LTAzLTEwIGF0IDE5OjE1ICswODAwLCBOaWNvbGFzIEJvaWNoYXQgd3JvdGU6 Cj4gT24gVGh1LCBNYXIgNywgMjAxOSBhdCA5OjQ1IEFNIExvbmcgQ2hlbmcgPGxvbmcuY2hlbmdA bWVkaWF0ZWsuY29tPiB3cm90ZToKPiA+Cj4gPiBJbiBETUEgZW5naW5lIGZyYW1ld29yaywgYWRk IDgyNTAgdWFydCBkbWEgdG8gc3VwcG9ydCBNZWRpYVRlayB1YXJ0Lgo+ID4gSWYgTWVkaWFUZWsg dWFydCBlbmFibGVkKFNFUklBTF84MjUwX01UNjU3NyksIGFuZCB3YW50IHRvIGltcHJvdmUKPiA+ IHRoZSBwZXJmb3JtYW5jZSwgY2FuIGVuYWJsZSB0aGUgZnVuY3Rpb24uCj4gPgo+ID4gU2lnbmVk LW9mZi1ieTogTG9uZyBDaGVuZyA8bG9uZy5jaGVuZ0BtZWRpYXRlay5jb20+Cj4gPiAtLS0KPiA+ ICBkcml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnICAgICAgICAgIHwgICAxMSArCj4gPiAgZHJp dmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUgICAgICAgICB8ICAgIDEgKwo+ID4gIGRyaXZlcnMv ZG1hL21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMgfCAgNjYwICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwo+ID4gIDMgZmlsZXMgY2hhbmdlZCwgNjcyIGluc2VydGlvbnMoKykKPiA+ ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEvbWVkaWF0ZWsvbXRrLXVhcnQtYXBkbWEu Ywo+ID4KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnIGIvZHJp dmVycy9kbWEvbWVkaWF0ZWsvS2NvbmZpZwo+ID4gaW5kZXggNjgwZmMwNS4uYWM0OWViNiAxMDA2 NDQKPiA+IC0tLSBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKPiA+ICsrKyBiL2RyaXZl cnMvZG1hL21lZGlhdGVrL0tjb25maWcKPiA+IEBAIC0yNCwzICsyNCwxNCBAQCBjb25maWcgTVRL X0NRRE1BCj4gPgo+ID4gICAgICAgICAgIFRoaXMgY29udHJvbGxlciBwcm92aWRlcyB0aGUgY2hh bm5lbHMgd2hpY2ggaXMgZGVkaWNhdGVkIHRvCj4gPiAgICAgICAgICAgbWVtb3J5LXRvLW1lbW9y eSB0cmFuc2ZlciB0byBvZmZsb2FkIGZyb20gQ1BVLgo+ID4gKwo+ID4gK2NvbmZpZyBNVEtfVUFS VF9BUERNQQo+ID4gKyAgICAgICB0cmlzdGF0ZSAiTWVkaWFUZWsgU29DcyBBUERNQSBzdXBwb3J0 IGZvciBVQVJUIgo+ID4gKyAgICAgICBkZXBlbmRzIG9uIE9GICYmIFNFUklBTF84MjUwX01UNjU3 Nwo+ID4gKyAgICAgICBzZWxlY3QgRE1BX0VOR0lORQo+ID4gKyAgICAgICBzZWxlY3QgRE1BX1ZJ UlRVQUxfQ0hBTk5FTFMKPiA+ICsgICAgICAgaGVscAo+ID4gKyAgICAgICAgIFN1cHBvcnQgZm9y IHRoZSBVQVJUIERNQSBlbmdpbmUgZm91bmQgb24gTWVkaWFUZWsgTVRLIFNvQ3MuCj4gPiArICAg ICAgICAgV2hlbiBTRVJJQUxfODI1MF9NVDY1NzcgaXMgZW5hYmxlZCwgYW5kIGlmIHlvdSB3YW50 IHRvIHVzZSBETUEsCj4gPiArICAgICAgICAgeW91IGNhbiBlbmFibGUgdGhlIGNvbmZpZy4gVGhl IERNQSBlbmdpbmUgY2FuIG9ubHkgYmUgdXNlZAo+ID4gKyAgICAgICAgIHdpdGggTWVkaWFUZWsg U29Dcy4KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZSBiL2Ry aXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlCj4gPiBpbmRleCA0MWJiMzgxLi42MWE2ZDI5IDEw MDY0NAo+ID4gLS0tIGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUKPiA+ICsrKyBiL2Ry aXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlCj4gPiBAQCAtMSwyICsxLDMgQEAKPiA+ICtvYmot JChDT05GSUdfTVRLX1VBUlRfQVBETUEpICs9IG10ay11YXJ0LWFwZG1hLm8KPiA+ICBvYmotJChD T05GSUdfTVRLX0hTRE1BKSArPSBtdGstaHNkbWEubwo+ID4gIG9iai0kKENPTkZJR19NVEtfQ1FE TUEpICs9IG10ay1jcWRtYS5vCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsv bXRrLXVhcnQtYXBkbWEuYyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMK PiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAwMDAwMDAwLi45ZWQ3YTQ5Cj4gPiAt LS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstdWFydC1hcGRt YS5jCj4gPiBAQCAtMCwwICsxLDY2MCBAQAo+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVy OiBHUEwtMi4wCj4gPiArLyoKPiA+ICsgKiBNZWRpYVRlayBVYXJ0IEFQRE1BIGRyaXZlci4KPiA+ ICsgKgo+ID4gKyAqIENvcHlyaWdodCAoYykgMjAxOCBNZWRpYVRlayBJbmMuCj4gPiArICogQXV0 aG9yOiBMb25nIENoZW5nIDxsb25nLmNoZW5nQG1lZGlhdGVrLmNvbT4KPiA+ICsgKi8KPiA+ICsK PiA+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2lu ZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+ID4gKyNpbmNsdWRlIDxs aW51eC9lcnIuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ID4gKyNpbmNsdWRlIDxs aW51eC9pbnRlcnJ1cHQuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvaW9wb2xsLmg+Cj4gPiArI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2Uu aD4KPiA+ICsjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L3Bs YXRmb3JtX2RldmljZS5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Cj4gPiAr I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KPiA+ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4K PiA+ICsKPiA+ICsjaW5jbHVkZSAiLi4vdmlydC1kbWEuaCIKPiA+ICsKPiA+ICsvKiBUaGUgZGVm YXVsdCBudW1iZXIgb2YgdmlydHVhbCBjaGFubmVsICovCj4gPiArI2RlZmluZSBNVEtfVUFSVF9B UERNQV9OUl9WQ0hBTlMgICAgICAgOAo+ID4gKwo+ID4gKyNkZWZpbmUgVkZGX0VOX0IgICAgICAg ICAgICAgICBCSVQoMCkKPiA+ICsjZGVmaW5lIFZGRl9TVE9QX0IgICAgICAgICAgICAgQklUKDAp Cj4gPiArI2RlZmluZSBWRkZfRkxVU0hfQiAgICAgICAgICAgIEJJVCgwKQo+ID4gKyNkZWZpbmUg VkZGXzRHX1NVUFBPUlRfQiAgICAgICBCSVQoMCkKPiA+ICsjZGVmaW5lIFZGRl9SWF9JTlRfRU4w X0IgICAgICAgQklUKDApICAvKiByeCB2YWxpZCBzaXplID49ICB2ZmYgdGhyZSAqLwo+ID4gKyNk ZWZpbmUgVkZGX1JYX0lOVF9FTjFfQiAgICAgICBCSVQoMSkKPiA+ICsjZGVmaW5lIFZGRl9UWF9J TlRfRU5fQiAgICAgICAgICAgICAgICBCSVQoMCkgIC8qIHR4IGxlZnQgc2l6ZSA+PSB2ZmYgdGhy ZSAqLwo+ID4gKyNkZWZpbmUgVkZGX1dBUk1fUlNUX0IgICAgICAgICBCSVQoMCkKPiA+ICsjZGVm aW5lIFZGRl9SWF9JTlRfQ0xSX0IgICAgICAgKEJJVCgwKSB8IEJJVCgxKSkKPiA+ICsjZGVmaW5l IFZGRl9UWF9JTlRfQ0xSX0IgICAgICAgMAo+ID4gKyNkZWZpbmUgVkZGX1NUT1BfQ0xSX0IgICAg ICAgICAwCj4gPiArI2RlZmluZSBWRkZfSU5UX0VOX0NMUl9CICAgICAgIDAKPiA+ICsjZGVmaW5l IFZGRl80R19TVVBQT1JUX0NMUl9CICAgMAo+ID4gKwo+ID4gKy8qIGludGVycnVwdCB0cmlnZ2Vy IGxldmVsIGZvciB0eCAqLwo+ID4gKyNkZWZpbmUgVkZGX1RYX1RIUkUobikgICAgICAgICAoKG4p ICogNyAvIDgpCj4gPiArLyogaW50ZXJydXB0IHRyaWdnZXIgbGV2ZWwgZm9yIHJ4ICovCj4gPiAr I2RlZmluZSBWRkZfUlhfVEhSRShuKSAgICAgICAgICgobikgKiAzIC8gNCkKPiA+ICsKPiA+ICsj ZGVmaW5lIFZGRl9SSU5HX1NJWkUgIDB4ZmZmZlUKPiAKPiBEcm9wIHRoZSBVLCBpdCdzIG5vdCB2 ZXJ5IHVzZWZ1bCAodGhlcmUgYXJlIGEgYSBmZXcgbW9yZSBiZWxvdywgZ3JlcAo+IGZvciBbMC05 YS1mXVUpLgo+IAoKT0ssIGkgd2lsbCBmaXggdGhlc2UuCgo+ID4gKy8qIGludmVydCB0aGlzIGJp dCB3aGVuIHdyYXAgcmluZyBoZWFkIGFnYWluICovCj4gPiArI2RlZmluZSBWRkZfUklOR19XUkFQ ICAweDEwMDAwVQo+ID4gKwo+ID4gKyNkZWZpbmUgVkZGX0lOVF9GTEFHICAgICAgICAgICAweDAw Cj4gPiArI2RlZmluZSBWRkZfSU5UX0VOICAgICAgICAgICAgIDB4MDQKPiA+ICsjZGVmaW5lIFZG Rl9FTiAgICAgICAgICAgICAgICAgMHgwOAo+ID4gKyNkZWZpbmUgVkZGX1JTVCAgICAgICAgICAg ICAgICAgICAgICAgIDB4MGMKPiA+ICsjZGVmaW5lIFZGRl9TVE9QICAgICAgICAgICAgICAgMHgx MAo+ID4gKyNkZWZpbmUgVkZGX0ZMVVNIICAgICAgICAgICAgICAweDE0Cj4gPiArI2RlZmluZSBW RkZfQUREUiAgICAgICAgICAgICAgIDB4MWMKPiA+ICsjZGVmaW5lIFZGRl9MRU4gICAgICAgICAg ICAgICAgICAgICAgICAweDI0Cj4gPiArI2RlZmluZSBWRkZfVEhSRSAgICAgICAgICAgICAgIDB4 MjgKPiA+ICsjZGVmaW5lIFZGRl9XUFQgICAgICAgICAgICAgICAgICAgICAgICAweDJjCj4gPiAr I2RlZmluZSBWRkZfUlBUICAgICAgICAgICAgICAgICAgICAgICAgMHgzMAo+ID4gKy8qIFRYOiB0 aGUgYnVmZmVyIHNpemUgSFcgY2FuIHJlYWQuIFJYOiB0aGUgYnVmZmVyIHNpemUgU1cgY2FuIHJl YWQuICovCj4gPiArI2RlZmluZSBWRkZfVkFMSURfU0laRSAgICAgICAgIDB4M2MKPiA+ICsvKiBU WDogdGhlIGJ1ZmZlciBzaXplIFNXIGNhbiB3cml0ZS4gUlg6IHRoZSBidWZmZXIgc2l6ZSBIVyBj YW4gd3JpdGUuICovCj4gPiArI2RlZmluZSBWRkZfTEVGVF9TSVpFICAgICAgICAgIDB4NDAKPiA+ ICsjZGVmaW5lIFZGRl9ERUJVR19TVEFUVVMgICAgICAgMHg1MAo+ID4gKyNkZWZpbmUgVkZGXzRH X1NVUFBPUlQgICAgICAgICAweDU0Cj4gPiArCj4gPiArc3RydWN0IG10a191YXJ0X2FwZG1hZGV2 IHsKPiA+ICsgICAgICAgc3RydWN0IGRtYV9kZXZpY2UgZGRldjsKPiA+ICsgICAgICAgc3RydWN0 IGNsayAqY2xrOwo+ID4gKyAgICAgICBib29sIHN1cHBvcnRfMzNiaXRzOwo+ID4gKyAgICAgICB1 bnNpZ25lZCBpbnQgZG1hX3JlcXVlc3RzOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgKmRtYV9p cnE7Cj4gPiArfTsKPiA+ICsKPiA+ICtzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFfZGVzYyB7Cj4gPiAr ICAgICAgIHN0cnVjdCB2aXJ0X2RtYV9kZXNjIHZkOwo+ID4gKwo+ID4gKyAgICAgICB1bnNpZ25l ZCBpbnQgYXZhaWxfbGVuOwo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IG10a19jaGFuIHsKPiA+ ICsgICAgICAgc3RydWN0IHZpcnRfZG1hX2NoYW4gdmM7Cj4gPiArICAgICAgIHN0cnVjdCBkbWFf c2xhdmVfY29uZmlnIGNmZzsKPiA+ICsgICAgICAgdm9pZCBfX2lvbWVtICpiYXNlOwo+ID4gKyAg ICAgICBzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFfZGVzYyAqZGVzYzsKPiA+ICsKPiA+ICsgICAgICAg ZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKPiA+ICsKPiA+ICsgICAgICAgYm9vbCBy ZXF1ZXN0ZWQ7Cj4gPiArCj4gPiArICAgICAgIHVuc2lnbmVkIGludCByeF9zdGF0dXM7Cj4gPiAr fTsKPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqCj4g PiArdG9fbXRrX3VhcnRfYXBkbWFfZGV2KHN0cnVjdCBkbWFfZGV2aWNlICpkKQo+ID4gK3sKPiA+ ICsgICAgICAgcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYs IGRkZXYpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfY2hhbiAq dG9fbXRrX3VhcnRfYXBkbWFfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmMpCj4gPiArewo+ID4gKyAg ICAgICByZXR1cm4gY29udGFpbmVyX29mKGMsIHN0cnVjdCBtdGtfY2hhbiwgdmMuY2hhbik7Cj4g PiArfQo+ID4gKwo+ID4gK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2Mg KnRvX210a191YXJ0X2FwZG1hX2Rlc2MKPiA+ICsgICAgICAgKHN0cnVjdCBkbWFfYXN5bmNfdHhf ZGVzY3JpcHRvciAqdCkKPiA+ICt7Cj4gPiArICAgICAgIHJldHVybiBjb250YWluZXJfb2YodCwg c3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2MsIHZkLnR4KTsKPiA+ICt9Cj4gPiArCj4gPiArc3Rh dGljIHZvaWQgbXRrX3VhcnRfYXBkbWFfd3JpdGUoc3RydWN0IG10a19jaGFuICpjLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGlu dCB2YWwpCj4gPiArewo+ID4gKyAgICAgICB3cml0ZWwodmFsLCBjLT5iYXNlICsgcmVnKTsKPiA+ ICt9Cj4gPiArCj4gPiArc3RhdGljIHVuc2lnbmVkIGludCBtdGtfdWFydF9hcGRtYV9yZWFkKHN0 cnVjdCBtdGtfY2hhbiAqYywgdW5zaWduZWQgaW50IHJlZykKPiA+ICt7Cj4gPiArICAgICAgIHJl dHVybiByZWFkbChjLT5iYXNlICsgcmVnKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQg bXRrX3VhcnRfYXBkbWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKPiA+ICt7 Cj4gPiArICAgICAgIHN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IHZkLT50eC5jaGFuOwo+ID4gKyAg ICAgICBzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfdWFydF9hcGRtYV9jaGFuKGNoYW4pOwo+ ID4gKwo+ID4gKyAgICAgICBrZnJlZShjLT5kZXNjKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IHZvaWQgbXRrX3VhcnRfYXBkbWFfc3RhcnRfdHgoc3RydWN0IG10a19jaGFuICpjKQo+ID4gK3sK PiA+ICsgICAgICAgdW5zaWduZWQgaW50IGxlbiwgc2VuZCwgbGVmdCwgd3B0LCBkX3dwdCwgdG1w Owo+ID4gKyAgICAgICBpbnQgcmV0Owo+ID4gKwo+ID4gKyAgICAgICBsZWZ0ID0gbXRrX3VhcnRf YXBkbWFfcmVhZChjLCBWRkZfTEVGVF9TSVpFKTsKPiA+ICsgICAgICAgaWYgKCFsZWZ0KSB7Cj4g PiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZG X1RYX0lOVF9FTl9CKTsKPiA+ICsgICAgICAgICAgICAgICByZXR1cm47Cj4gPiArICAgICAgIH0K PiA+ICsKPiA+ICsgICAgICAgLyogV2FpdCAxc2VjIGZvciBmbHVzaCwgY2FuJ3Qgc2xlZXAgKi8K PiA+ICsgICAgICAgcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCBjLT5iYXNlICsgVkZG X0ZMVVNILCB0bXAsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0bXAgIT0gVkZGX0ZMVVNI X0IsIDAsIDEwMDAwMDApOwo+ID4gKyAgICAgICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICAg IGRldl93YXJuKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYsICJ0eDogZmFpbCwgZGVidWc9MHgleFxu IiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZG X0RFQlVHX1NUQVRVUykpOwo+ID4gKwo+ID4gKyAgICAgICBzZW5kID0gbWluX3QodW5zaWduZWQg aW50LCBsZWZ0LCBjLT5kZXNjLT5hdmFpbF9sZW4pOwo+ID4gKyAgICAgICB3cHQgPSBtdGtfdWFy dF9hcGRtYV9yZWFkKGMsIFZGRl9XUFQpOwo+ID4gKyAgICAgICBsZW4gPSBjLT5jZmcuZHN0X3Bv cnRfd2luZG93X3NpemU7Cj4gPiArCj4gPiArICAgICAgIGRfd3B0ID0gd3B0ICsgc2VuZDsKPiA+ ICsgICAgICAgaWYgKChkX3dwdCAmIFZGRl9SSU5HX1NJWkUpID49IGxlbikgewo+ID4gKyAgICAg ICAgICAgICAgIGRfd3B0ID0gZF93cHQgLSBsZW47Cj4gPiArICAgICAgICAgICAgICAgZF93cHQg PSBkX3dwdCBeIFZGRl9SSU5HX1dSQVA7Cj4gPiArICAgICAgIH0KPiA+ICsgICAgICAgbXRrX3Vh cnRfYXBkbWFfd3JpdGUoYywgVkZGX1dQVCwgZF93cHQpOwo+ID4gKwo+ID4gKyAgICAgICBjLT5k ZXNjLT5hdmFpbF9sZW4gLT0gc2VuZDsKPiA+ICsKPiA+ICsgICAgICAgbXRrX3VhcnRfYXBkbWFf d3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX1RYX0lOVF9FTl9CKTsKPiA+ICsgICAgICAgaWYgKG10 a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0ZMVVNIKSA9PSAwVSkKPiA+ICsgICAgICAgICAgICAg ICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfRkxVU0gsIFZGRl9GTFVTSF9CKTsKPiA+ICt9 Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbXRrX3VhcnRfYXBkbWFfc3RhcnRfcngoc3RydWN0IG10 a19jaGFuICpjKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2Mg KmQgPSBjLT5kZXNjOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgbGVuLCB3Zywgcmc7Cj4gPiAr ICAgICAgIGludCBjbnQ7Cj4gPiArCj4gPiArICAgICAgIGlmICgobXRrX3VhcnRfYXBkbWFfcmVh ZChjLCBWRkZfVkFMSURfU0laRSkgPT0gMFUpIHx8Cj4gPiArICAgICAgICAgICAgICAgIWQgfHwg IXZjaGFuX25leHRfZGVzYygmYy0+dmMpKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybjsKPiA+ ICsKPiA+ICsgICAgICAgbGVuID0gYy0+Y2ZnLnNyY19wb3J0X3dpbmRvd19zaXplOwo+ID4gKyAg ICAgICByZyA9IG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX1JQVCk7Cj4gPiArICAgICAgIHdn ID0gbXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZfV1BUKTsKPiA+ICsgICAgICAgY250ID0gKHdn ICYgVkZGX1JJTkdfU0laRSkgLSAocmcgJiBWRkZfUklOR19TSVpFKTsKPiA+ICsgICAgICAgLyoK PiA+ICsgICAgICAgICogVGhlIGJ1ZmZlciBpcyByaW5nIGJ1ZmZlci4gSWYgd3JhcCBiaXQgZGlm ZmVyZW50LAo+ID4gKyAgICAgICAgKiByZXByZXNlbnRzIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBj eWNsZSBmb3IgV1BUCj4gPiArICAgICAgICAqLwo+ID4gKyAgICAgICBpZiAoKHJnIF4gd2cpICYg VkZGX1JJTkdfV1JBUCkKPiA+ICsgICAgICAgICAgICAgICBjbnQgKz0gbGVuOwo+ID4gKwo+ID4g KyAgICAgICBjLT5yeF9zdGF0dXMgPSBkLT5hdmFpbF9sZW4gLSBjbnQ7Cj4gPiArICAgICAgIG10 a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9SUFQsIHdnKTsKPiA+ICsKPiA+ICsgICAgICAgbGlz dF9kZWwoJmQtPnZkLm5vZGUpOwo+ID4gKyAgICAgICB2Y2hhbl9jb29raWVfY29tcGxldGUoJmQt PnZkKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGlycXJldHVybl90IG10a191YXJ0X2FwZG1h X2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKPiA+ICt7Cj4gPiArICAgICAgIHN0 cnVjdCBkbWFfY2hhbiAqY2hhbiA9IChzdHJ1Y3QgZG1hX2NoYW4gKilkZXZfaWQ7Cj4gPiArICAg ICAgIHN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7Cj4g PiArICAgICAgIHN0cnVjdCBtdGtfdWFydF9hcGRtYV9kZXNjICpkOwo+ID4gKyAgICAgICB1bnNp Z25lZCBsb25nIGZsYWdzOwo+ID4gKwo+ID4gKyAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmYy0+ dmMubG9jaywgZmxhZ3MpOwo+ID4gKyAgICAgICBpZiAoYy0+ZGlyID09IERNQV9ERVZfVE9fTUVN KSB7Cj4gPiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lOVF9G TEFHLCBWRkZfUlhfSU5UX0NMUl9CKTsKPiA+ICsgICAgICAgICAgICAgICBtdGtfdWFydF9hcGRt YV9zdGFydF9yeChjKTsKPiA+ICsgICAgICAgfSBlbHNlIGlmIChjLT5kaXIgPT0gRE1BX01FTV9U T19ERVYpIHsKPiA+ICsgICAgICAgICAgICAgICBkID0gYy0+ZGVzYzsKPiA+ICsKPiA+ICsgICAg ICAgICAgICAgICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9UWF9J TlRfQ0xSX0IpOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGlmIChkLT5hdmFpbF9sZW4gIT0g MFUpIHsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG10a191YXJ0X2FwZG1hX3N0YXJ0X3R4 KGMpOwo+ID4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBsaXN0X2RlbCgmZC0+dmQubm9kZSk7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB2 Y2hhbl9jb29raWVfY29tcGxldGUoJmQtPnZkKTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiAr ICAgICAgIH0KPiA+ICsgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywg ZmxhZ3MpOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gSVJRX0hBTkRMRUQ7Cj4gPiArfQo+ID4g Kwo+ID4gK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3Ry dWN0IGRtYV9jaGFuICpjaGFuKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IG10a191YXJ0X2Fw ZG1hZGV2ICptdGtkID0gdG9fbXRrX3VhcnRfYXBkbWFfZGV2KGNoYW4tPmRldmljZSk7Cj4gPiAr ICAgICAgIHN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7 Cj4gPiArICAgICAgIHVuc2lnbmVkIGludCB0bXA7Cj4gPiArICAgICAgIGludCByZXQ7Cj4gPiAr Cj4gPiArICAgICAgIHBtX3J1bnRpbWVfZ2V0X3N5bmMobXRrZC0+ZGRldi5kZXYpOwo+ID4gKwo+ ID4gKyAgICAgICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfQUREUiwgMCk7Cj4gPiArICAg ICAgIG10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9USFJFLCAwKTsKPiA+ICsgICAgICAgbXRr X3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0xFTiwgMCk7Cj4gPiArICAgICAgIG10a191YXJ0X2Fw ZG1hX3dyaXRlKGMsIFZGRl9SU1QsIFZGRl9XQVJNX1JTVF9CKTsKPiA+ICsKPiA+ICsgICAgICAg cmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCBjLT5iYXNlICsgVkZGX0VOLCB0bXAsICF0 bXAsIDEwLCAxMDApOwo+ID4gKyAgICAgICBpZiAocmV0KSB7Cj4gPiArICAgICAgICAgICAgICAg ZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgImRtYSByZXNldDogZmFpbCwgdGltZW91dFxuIik7 Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+ICsgICAgICAgfQo+ID4gKwo+ID4g KyAgICAgICBpZiAoIWMtPnJlcXVlc3RlZCkgewo+ID4gKyAgICAgICAgICAgICAgIGMtPnJlcXVl c3RlZCA9IHRydWU7Cj4gPiArICAgICAgICAgICAgICAgcmV0ID0gcmVxdWVzdF9pcnEobXRrZC0+ ZG1hX2lycVtjaGFuLT5jaGFuX2lkXSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBtdGtfdWFydF9hcGRtYV9pcnFfaGFuZGxlciwgSVJRRl9UUklHR0VSX05PTkUsCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0JVSUxEX01PRE5BTUUsIGNoYW4pOwo+ ID4gKyAgICAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7Cj4gPiArICAgICAgICAgICAgICAgICAg ICAgICBkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBkbWEgSVJRXG4i KTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKyAgICAg ICAgICAgICAgIH0KPiA+ICsgICAgICAgfQo+ID4gKwo+ID4gKyAgICAgICBpZiAobXRrZC0+c3Vw cG9ydF8zM2JpdHMpCj4gPiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywg VkZGXzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0NMUl9CKTsKPiA+ICsKPiA+ICsgICAgICAg cmV0dXJuIHJldDsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgbXRrX3VhcnRfYXBkbWFf ZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCj4gPiArewo+ID4gKyAg ICAgICBzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYgKm10a2QgPSB0b19tdGtfdWFydF9hcGRtYV9k ZXYoY2hhbi0+ZGV2aWNlKTsKPiA+ICsgICAgICAgc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRr X3VhcnRfYXBkbWFfY2hhbihjaGFuKTsKPiA+ICsKPiA+ICsgICAgICAgaWYgKGMtPnJlcXVlc3Rl ZCkgewo+ID4gKyAgICAgICAgICAgICAgIGMtPnJlcXVlc3RlZCA9IGZhbHNlOwo+ID4gKyAgICAg ICAgICAgICAgIGZyZWVfaXJxKG10a2QtPmRtYV9pcnFbY2hhbi0+Y2hhbl9pZF0sIGNoYW4pOwo+ ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIHRhc2tsZXRfa2lsbCgmYy0+dmMudGFzayk7 Cj4gPiArCj4gPiArICAgICAgIHZjaGFuX2ZyZWVfY2hhbl9yZXNvdXJjZXMoJmMtPnZjKTsKPiA+ ICsKPiA+ICsgICAgICAgcG1fcnVudGltZV9wdXRfc3luYyhtdGtkLT5kZGV2LmRldik7Cj4gPiAr fQo+ID4gKwo+ID4gK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMgbXRrX3VhcnRfYXBkbWFfdHhfc3Rh dHVzKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKPiA+ ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2No YW4oY2hhbik7Cj4gPiArICAgICAgIGVudW0gZG1hX3N0YXR1cyByZXQ7Cj4gPiArCj4gPiArICAg ICAgIHJldCA9IGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7Cj4gPiAr Cj4gPiArICAgICAgIGRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCBjLT5yeF9zdGF0dXMpOwo+ID4g Kwo+ID4gKyAgICAgICByZXR1cm4gcmV0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBt dGtfdWFydF9hcGRtYV9jb25maWdfd3JpdGUoc3RydWN0IGRtYV9jaGFuICpjaGFuLAo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjZmcs Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBkbWFfdHJhbnNmZXJfZGly ZWN0aW9uIGRpcikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210 a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfdWFydF9hcGRt YWRldiAqbXRrZCA9Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX210a191 YXJ0X2FwZG1hX2RldihjLT52Yy5jaGFuLmRldmljZSk7Cj4gPiArICAgICAgIHVuc2lnbmVkIGlu dCB0bXA7Cj4gPiArCj4gPiArICAgICAgIGlmIChtdGtfdWFydF9hcGRtYV9yZWFkKGMsIFZGRl9F TikgPT0gVkZGX0VOX0IpCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuOwo+ID4gKwo+ID4gKyAg ICAgICBjLT5kaXIgPSBkaXI7Cj4gPiArCj4gPiArICAgICAgIGlmIChkaXIgPT0gRE1BX0RFVl9U T19NRU0pIHsKPiA+ICsgICAgICAgICAgICAgICB0bXAgPSBjZmctPnNyY19wb3J0X3dpbmRvd19z aXplOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIG10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZG Rl9BRERSLCBjZmctPnNyY19hZGRyKTsKPiA+ICsgICAgICAgICAgICAgICBtdGtfdWFydF9hcGRt YV93cml0ZShjLCBWRkZfTEVOLCB0bXApOwo+ID4gKyAgICAgICAgICAgICAgIG10a191YXJ0X2Fw ZG1hX3dyaXRlKGMsIFZGRl9USFJFLCBWRkZfUlhfVEhSRSh0bXApKTsKPiA+ICsgICAgICAgICAg ICAgICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0VOLAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBWRkZfUlhfSU5UX0VOMF9CIHwgVkZGX1JYX0lOVF9FTjFfQik7 Cj4gPiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX1JQVCwgMCk7 Cj4gPiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lOVF9GTEFH LCBWRkZfUlhfSU5UX0NMUl9CKTsKPiA+ICsgICAgICAgfSBlbHNlIGlmIChkaXIgPT0gRE1BX01F TV9UT19ERVYpICAgICAgIHsKPiA+ICsgICAgICAgICAgICAgICB0bXAgPSBjZmctPmRzdF9wb3J0 X3dpbmRvd19zaXplOwo+ID4gKwo+ID4gKyAgICAgICAgICAgICAgIG10a191YXJ0X2FwZG1hX3dy aXRlKGMsIFZGRl9BRERSLCBjZmctPmRzdF9hZGRyKTsKPiA+ICsgICAgICAgICAgICAgICBtdGtf dWFydF9hcGRtYV93cml0ZShjLCBWRkZfTEVOLCB0bXApOwo+ID4gKyAgICAgICAgICAgICAgIG10 a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9USFJFLCBWRkZfVFhfVEhSRSh0bXApKTsKPiA+ICsg ICAgICAgICAgICAgICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfV1BULCAwKTsKPiA+ICsg ICAgICAgICAgICAgICBtdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9U WF9JTlRfQ0xSX0IpOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIG10a191YXJ0X2Fw ZG1hX3dyaXRlKGMsIFZGRl9FTiwgVkZGX0VOX0IpOwo+ID4gKwo+ID4gKyAgICAgICBpZiAobXRr ZC0+c3VwcG9ydF8zM2JpdHMpCj4gPiArICAgICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfd3Jp dGUoYywgVkZGXzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0IpOwo+ID4gKwo+ID4gKyAgICAg ICBpZiAobXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZfRU4pICE9IFZGRl9FTl9CKQo+ID4gKyAg ICAgICAgICAgICAgIGRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsICJkaXJbJWRdIGZhaWxcbiIs IGRpcik7Cj4gPiArfQo+ID4gKwo+ID4gKy8qCj4gPiArICogZG1hZW5naW5lX3ByZXBfc2xhdmVf c2luZ2xlIHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24uIGFuZCBzZ2xlbiBpcyAxLgo+ID4gKyAqIDgy NTAgdWFydCB1c2luZyBvbmUgcmluZyBidWZmZXIsIGFuZCBkZWFsIHdpdGggb25lIHNnLgo+ID4g KyAqLwo+ID4gK3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKm10a191YXJ0 X2FwZG1hX3ByZXBfc2xhdmVfc2cKPiA+ICsgICAgICAgKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwg c3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCj4gPiArICAgICAgIHVuc2lnbmVkIGludCBzZ2xlbiwg ZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwKPiA+ICsgICAgICAgdW5zaWduZWQgbG9u ZyB0eF9mbGFncywgdm9pZCAqY29udGV4dCkKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtf Y2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7Cj4gPiArICAgICAgIHN0cnVj dCBtdGtfdWFydF9hcGRtYV9kZXNjICpkOwo+ID4gKwo+ID4gKyAgICAgICBpZiAoIWlzX3NsYXZl X2RpcmVjdGlvbihkaXIpKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwo+ID4gKwo+ ID4gKyAgICAgICBtdGtfdWFydF9hcGRtYV9jb25maWdfd3JpdGUoY2hhbiwgJmMtPmNmZywgZGly KTsKPiA+ICsKPiA+ICsgICAgICAgLyogTm93IGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgZGVzY3Jp cHRvciAqLwo+ID4gKyAgICAgICBkID0ga3phbGxvYyhzaXplb2YoKmQpLCBHRlBfQVRPTUlDKTsK PiA+ICsgICAgICAgaWYgKCFkKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwo+ID4g Kwo+ID4gKyAgICAgICAvKiBzZ2xlbiBpcyAxICovCj4gPiArICAgICAgIGQtPmF2YWlsX2xlbiA9 IHNnX2RtYV9sZW4oc2dsKTsKPiA+ICsgICAgICAgYy0+cnhfc3RhdHVzID0gZC0+YXZhaWxfbGVu Owo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gdmNoYW5fdHhfcHJlcCgmYy0+dmMsICZkLT52ZCwg dHhfZmxhZ3MpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV9p c3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKPiA+ICt7Cj4gPiArICAgICAgIHN0 cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7Cj4gPiArICAg ICAgIHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyBm bGFnczsKPiA+ICsKPiA+ICsgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxvY2ssIGZs YWdzKTsKPiA+ICsgICAgICAgaWYgKHZjaGFuX2lzc3VlX3BlbmRpbmcoJmMtPnZjKSkgewo+ID4g KyAgICAgICAgICAgICAgIHZkID0gdmNoYW5fbmV4dF9kZXNjKCZjLT52Yyk7Cj4gPiArICAgICAg ICAgICAgICAgYy0+ZGVzYyA9IHRvX210a191YXJ0X2FwZG1hX2Rlc2MoJnZkLT50eCk7Cj4gPiAr ICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgaWYgKGMtPmRpciA9PSBETUFfREVWX1RPX01FTSkK PiA+ICsgICAgICAgICAgICAgICBtdGtfdWFydF9hcGRtYV9zdGFydF9yeChjKTsKPiA+ICsgICAg ICAgZWxzZSBpZiAoYy0+ZGlyID09IERNQV9NRU1fVE9fREVWKQo+ID4gKyAgICAgICAgICAgICAg IG10a191YXJ0X2FwZG1hX3N0YXJ0X3R4KGMpOwo+ID4gKwo+ID4gKyAgICAgICBzcGluX3VubG9j a19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRp YyBpbnQgbXRrX3VhcnRfYXBkbWFfc2xhdmVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRtYV9zbGF2ZV9j b25maWcgKmNvbmZpZykKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfY2hhbiAqYyA9IHRv X210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7Cj4gPiArCj4gPiArICAgICAgIG1lbWNweSgmYy0+ Y2ZnLCBjb25maWcsIHNpemVvZigqY29uZmlnKSk7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiAw Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3Rlcm1pbmF0ZV9h bGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQo+ID4gK3sKPiA+ICsgICAgICAgc3RydWN0IG10a19j aGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hhbihjaGFuKTsKPiA+ICsgICAgICAgdW5zaWdu ZWQgbG9uZyBmbGFnczsKPiA+ICsgICAgICAgdW5zaWduZWQgaW50IHRtcDsKPiA+ICsgICAgICAg aW50IHJldDsKPiA+ICsKPiA+ICsgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxvY2ss IGZsYWdzKTsKPiA+ICsKPiA+ICsgICAgICAgbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0ZM VVNILCBWRkZfRkxVU0hfQik7Cj4gPiArICAgICAgIC8qIFdhaXQgMXNlYyBmb3IgZmx1c2gsIGNh bid0IHNsZWVwICovCj4gPiArICAgICAgIHJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwg Yy0+YmFzZSArIFZGRl9GTFVTSCwgdG1wLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdG1w ICE9IFZGRl9GTFVTSF9CLCAwLCAxMDAwMDAwKTsKPiA+ICsgICAgICAgaWYgKHJldCkKPiA+ICsg ICAgICAgICAgICAgICBkZXZfZXJyKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYsICJmbHVzaDogZmFp bCwgZGVidWc9MHgleFxuIiwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIG10a191YXJ0X2Fw ZG1hX3JlYWQoYywgVkZGX0RFQlVHX1NUQVRVUykpOwo+ID4gKwo+ID4gKyAgICAgICAvKiBzZXQg c3RvcCBhcyAxIC0+IHdhaXQgdW50aWwgZW4gaXMgMCAtPiBzZXQgc3RvcCBhcyAwICovCj4gPiAr ICAgICAgIG10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9TVE9QLCBWRkZfU1RPUF9CKTsKPiA+ ICsgICAgICAgcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLCBjLT5iYXNlICsgVkZGX0VO LCB0bXAsICF0bXAsIDEwLCAxMDApOwo+ID4gKyAgICAgICBpZiAocmV0KQo+ID4gKyAgICAgICAg ICAgICAgIGRldl9lcnIoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgInN0b3A6IGZhaWwsIGRlYnVn PTB4JXhcbiIsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBtdGtfdWFydF9hcGRtYV9yZWFk KGMsIFZGRl9ERUJVR19TVEFUVVMpKTsKPiA+ICsKPiA+ICsgICAgICAgbXRrX3VhcnRfYXBkbWFf d3JpdGUoYywgVkZGX1NUT1AsIFZGRl9TVE9QX0NMUl9CKTsKPiA+ICsgICAgICAgbXRrX3VhcnRf YXBkbWFfd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX0lOVF9FTl9DTFJfQik7Cj4gPiArCj4gPiAr ICAgICAgIGlmIChjLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0pCj4gPiArICAgICAgICAgICAgICAg bXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBWRkZfUlhfSU5UX0NMUl9CKTsK PiA+ICsgICAgICAgZWxzZSBpZiAoYy0+ZGlyID09IERNQV9NRU1fVE9fREVWKQo+ID4gKyAgICAg ICAgICAgICAgIG10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1RYX0lO VF9DTFJfQik7Cj4gPiArCj4gPiArICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZj LmxvY2ssIGZsYWdzKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ID4gKwo+ ID4gK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfZGV2aWNlX3BhdXNlKHN0cnVjdCBkbWFfY2hh biAqY2hhbikKPiA+ICt7Cj4gPiArICAgICAgIC8qIGp1c3QgZm9yIGNoZWNrIGNhcHMgcGFzcyAq Lwo+ID4gKyAgICAgICBkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiUGF1c2UgY2FuJ3Qgc3Vw cG9ydFxuIik7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiAKPiBJIHRoaW5r IHdlJ3ZlIHNhaWQgcmVwZWF0ZWRseSB0aGF0IGxlYXZpbmcgdGhpcyBzdHViIGZ1bmN0aW9uIGlz IGluY29ycmVjdC4KPiAKCkkgd2lsbCB0cnkgdG8gaW1wbGVtZW50YXRpb24gaXQuIFRoYW5rcwoK PiA+ICsKPiA+ICtzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV9mcmVlKHN0cnVjdCBtdGtfdWFy dF9hcGRtYWRldiAqbXRrZCkKPiA+ICt7Cj4gPiArICAgICAgIHdoaWxlICghbGlzdF9lbXB0eSgm bXRrZC0+ZGRldi5jaGFubmVscykpIHsKPiA+ICsgICAgICAgICAgICAgICBzdHJ1Y3QgbXRrX2No YW4gKmMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtdGtkLT5kZGV2LmNoYW5uZWxzLAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgc3RydWN0IG10a19jaGFuLCB2Yy5jaGFuLmRldmljZV9ub2RlKTsK PiA+ICsKPiA+ICsgICAgICAgICAgICAgICBsaXN0X2RlbCgmYy0+dmMuY2hhbi5kZXZpY2Vfbm9k ZSk7Cj4gPiArICAgICAgICAgICAgICAgdGFza2xldF9raWxsKCZjLT52Yy50YXNrKTsKPiA+ICsg ICAgICAgfQo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9p ZCBtdGtfdWFydF9hcGRtYV9tYXRjaFtdID0gewo+ID4gKyAgICAgICB7IC5jb21wYXRpYmxlID0g Im1lZGlhdGVrLG10NjU3Ny11YXJ0LWRtYSIsIH0sCj4gPiArICAgICAgIHsgLyogc2VudGluZWwg Ki8gfSwKPiA+ICt9Owo+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10a191YXJ0X2FwZG1h X21hdGNoKTsKPiA+ICsKPiA+ICtzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3Byb2JlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgZGV2aWNl X25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfdWFy dF9hcGRtYWRldiAqbXRrZDsKPiA+ICsgICAgICAgc3RydWN0IHJlc291cmNlICpyZXM7Cj4gPiAr ICAgICAgIHN0cnVjdCBtdGtfY2hhbiAqYzsKPiA+ICsgICAgICAgaW50IGJpdF9tYXNrID0gMzIs IHJjOwo+ID4gKyAgICAgICB1bnNpZ25lZCBpbnQgaTsKPiA+ICsKPiA+ICsgICAgICAgbXRrZCA9 IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKm10a2QpLCBHRlBfS0VSTkVMKTsKPiA+ ICsgICAgICAgaWYgKCFtdGtkKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwo+ ID4gKwo+ID4gKyAgICAgICBtdGtkLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgTlVM TCk7Cj4gPiArICAgICAgIGlmIChJU19FUlIobXRrZC0+Y2xrKSkgewo+ID4gKyAgICAgICAgICAg ICAgIGRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNsb2NrIHNwZWNpZmllZFxuIik7Cj4gPiArICAg ICAgICAgICAgICAgcmMgPSBQVFJfRVJSKG10a2QtPmNsayk7Cj4gPiArICAgICAgICAgICAgICAg cmV0dXJuIHJjOwo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIGlmIChvZl9wcm9wZXJ0 eV9yZWFkX2Jvb2wobnAsICJtZWRpYXRlayxkbWEtMzNiaXRzIikpCj4gPiArICAgICAgICAgICAg ICAgbXRrZC0+c3VwcG9ydF8zM2JpdHMgPSB0cnVlOwo+ID4gKwo+ID4gKyAgICAgICBpZiAobXRr ZC0+c3VwcG9ydF8zM2JpdHMpCj4gPiArICAgICAgICAgICAgICAgYml0X21hc2sgPSAzMzsKPiA+ ICsKPiA+ICsgICAgICAgcmMgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZwZGV2LT5kZXYs IERNQV9CSVRfTUFTSyhiaXRfbWFzaykpOwo+ID4gKyAgICAgICBpZiAocmMpCj4gPiArICAgICAg ICAgICAgICAgcmV0dXJuIHJjOwo+ID4gKwo+ID4gKyAgICAgICBkbWFfY2FwX3NldChETUFfU0xB VkUsIG10a2QtPmRkZXYuY2FwX21hc2spOwo+ID4gKyAgICAgICBtdGtkLT5kZGV2LmRldmljZV9h bGxvY19jaGFuX3Jlc291cmNlcyA9Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IG10a191YXJ0X2FwZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOwo+ID4gKyAgICAgICBtdGtkLT5k ZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKPiA+ICsgICAg ICAgbXRrZC0+ZGRldi5kZXZpY2VfdHhfc3RhdHVzID0gbXRrX3VhcnRfYXBkbWFfdHhfc3RhdHVz Owo+ID4gKyAgICAgICBtdGtkLT5kZGV2LmRldmljZV9pc3N1ZV9wZW5kaW5nID0gbXRrX3VhcnRf YXBkbWFfaXNzdWVfcGVuZGluZzsKPiA+ICsgICAgICAgbXRrZC0+ZGRldi5kZXZpY2VfcHJlcF9z bGF2ZV9zZyA9IG10a191YXJ0X2FwZG1hX3ByZXBfc2xhdmVfc2c7Cj4gPiArICAgICAgIG10a2Qt PmRkZXYuZGV2aWNlX2NvbmZpZyA9IG10a191YXJ0X2FwZG1hX3NsYXZlX2NvbmZpZzsKPiA+ICsg ICAgICAgbXRrZC0+ZGRldi5kZXZpY2VfcGF1c2UgPSBtdGtfdWFydF9hcGRtYV9kZXZpY2VfcGF1 c2U7Cj4gPiArICAgICAgIG10a2QtPmRkZXYuZGV2aWNlX3Rlcm1pbmF0ZV9hbGwgPSBtdGtfdWFy dF9hcGRtYV90ZXJtaW5hdGVfYWxsOwo+ID4gKyAgICAgICBtdGtkLT5kZGV2LnNyY19hZGRyX3dp ZHRocyA9IEJJVChETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFKTsKPiA+ICsgICAgICAgbXRrZC0+ ZGRldi5kc3RfYWRkcl93aWR0aHMgPSBCSVQoRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURSk7Cj4g PiArICAgICAgIG10a2QtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChETUFfREVWX1RPX01FTSkgfCBC SVQoRE1BX01FTV9UT19ERVYpOwo+ID4gKyAgICAgICBtdGtkLT5kZGV2LnJlc2lkdWVfZ3JhbnVs YXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9TRUdNRU5UOwo+ID4gKyAgICAgICBtdGtk LT5kZGV2LmRldiA9ICZwZGV2LT5kZXY7Cj4gPiArICAgICAgIElOSVRfTElTVF9IRUFEKCZtdGtk LT5kZGV2LmNoYW5uZWxzKTsKPiA+ICsKPiA+ICsgICAgICAgbXRrZC0+ZG1hX3JlcXVlc3RzID0g TVRLX1VBUlRfQVBETUFfTlJfVkNIQU5TOwo+ID4gKyAgICAgICBpZiAob2ZfcHJvcGVydHlfcmVh ZF91MzIobnAsICJkbWEtcmVxdWVzdHMiLCAmbXRrZC0+ZG1hX3JlcXVlc3RzKSkgewo+ID4gKyAg ICAgICAgICAgICAgIGRldl9pbmZvKCZwZGV2LT5kZXYsCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgIlVzaW5nICV1IGFzIG1pc3NpbmcgZG1hLXJlcXVlc3RzIHByb3BlcnR5XG4iLAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIE1US19VQVJUX0FQRE1BX05SX1ZDSEFOUyk7Cj4gPiAr ICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgbXRrZC0+ZG1hX2lycSA9IGRldm1fa2NhbGxvYygm cGRldi0+ZGV2LCBtdGtkLT5kbWFfcmVxdWVzdHMsCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBzaXplb2YoKm10a2QtPmRtYV9pcnEpLCBHRlBfS0VSTkVMKTsKPiA+ICsgICAg ICAgaWYgKCFtdGtkLT5kbWFfaXJxKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVN Owo+ID4gKwo+ID4gKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgbXRrZC0+ZG1hX3JlcXVlc3RzOyBp KyspIHsKPiA+ICsgICAgICAgICAgICAgICBjID0gZGV2bV9remFsbG9jKG10a2QtPmRkZXYuZGV2 LCBzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAoIWMpIHsK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVOT0RFVjsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGdvdG8gZXJyX25vX2RtYTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiAr Cj4gPiArICAgICAgICAgICAgICAgcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElP UkVTT1VSQ0VfTUVNLCBpKTsKPiA+ICsgICAgICAgICAgICAgICBpZiAoIXJlcykgewo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgcmMgPSAtRU5PREVWOwo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgZ290byBlcnJfbm9fZG1hOwo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ICsKPiA+ICsg ICAgICAgICAgICAgICBjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYs IHJlcyk7Cj4gPiArICAgICAgICAgICAgICAgaWYgKElTX0VSUihjLT5iYXNlKSkgewo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJSKGMtPmJhc2UpOwo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgZ290byBlcnJfbm9fZG1hOwo+ID4gKyAgICAgICAgICAgICAgIH0KPiA+ ICsgICAgICAgICAgICAgICBjLT5yZXF1ZXN0ZWQgPSBmYWxzZTsKPiA+ICsgICAgICAgICAgICAg ICBjLT52Yy5kZXNjX2ZyZWUgPSBtdGtfdWFydF9hcGRtYV9kZXNjX2ZyZWU7Cj4gPiArICAgICAg ICAgICAgICAgdmNoYW5faW5pdCgmYy0+dmMsICZtdGtkLT5kZGV2KTsKPiA+ICsKPiA+ICsgICAg ICAgICAgICAgICBtdGtkLT5kbWFfaXJxW2ldID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsK PiA+ICsgICAgICAgICAgICAgICBpZiAoKGludCltdGtkLT5kbWFfaXJxW2ldIDwgMCkgewo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdl dCBJUlFbJWRdXG4iLCBpKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVJTlZB TDsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX25vX2RtYTsKPiA+ICsgICAg ICAgICAgICAgICB9Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICsgICAgICAgcG1fcnVudGltZV9l bmFibGUoJnBkZXYtPmRldik7Cj4gPiArICAgICAgIHBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRl di0+ZGV2KTsKPiA+ICsKPiA+ICsgICAgICAgcmMgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVy KCZtdGtkLT5kZGV2KTsKPiA+ICsgICAgICAgaWYgKHJjKQo+ID4gKyAgICAgICAgICAgICAgIGdv dG8gcnBtX2Rpc2FibGU7Cj4gPiArCj4gPiArICAgICAgIHBsYXRmb3JtX3NldF9kcnZkYXRhKHBk ZXYsIG10a2QpOwo+ID4gKwo+ID4gKyAgICAgICAvKiBEZXZpY2UtdHJlZSBETUEgY29udHJvbGxl ciByZWdpc3RyYXRpb24gKi8KPiA+ICsgICAgICAgcmMgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdp c3RlcihucCwgb2ZfZG1hX3hsYXRlX2J5X2NoYW5faWQsIG10a2QpOwo+ID4gKyAgICAgICBpZiAo cmMpCj4gPiArICAgICAgICAgICAgICAgZ290byBkbWFfcmVtb3ZlOwo+ID4gKwo+ID4gKyAgICAg ICByZXR1cm4gcmM7Cj4gPiArCj4gPiArZG1hX3JlbW92ZToKPiA+ICsgICAgICAgZG1hX2FzeW5j X2RldmljZV91bnJlZ2lzdGVyKCZtdGtkLT5kZGV2KTsKPiA+ICtycG1fZGlzYWJsZToKPiA+ICsg ICAgICAgcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwo+ID4gK2Vycl9ub19kbWE6Cj4g PiArICAgICAgIG10a191YXJ0X2FwZG1hX2ZyZWUobXRrZCk7Cj4gPiArICAgICAgIHJldHVybiBy YzsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9yZW1vdmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtf dWFydF9hcGRtYWRldiAqbXRrZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwo+ID4gKwo+ ID4gKyAgICAgICBpZiAocGRldi0+ZGV2Lm9mX25vZGUpCj4gPiArICAgICAgICAgICAgICAgb2Zf ZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zfbm9kZSk7Cj4gPiArCj4gPiArICAgICAg IHBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKPiA+ICsgICAgICAgcG1fcnVudGltZV9w dXRfbm9pZGxlKCZwZGV2LT5kZXYpOwo+ID4gKwo+ID4gKyAgICAgICBkbWFfYXN5bmNfZGV2aWNl X3VucmVnaXN0ZXIoJm10a2QtPmRkZXYpOwo+ID4gKyAgICAgICBtdGtfdWFydF9hcGRtYV9mcmVl KG10a2QpOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiArI2lm ZGVmIENPTkZJR19QTV9TTEVFUAo+ID4gK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfc3VzcGVu ZChzdHJ1Y3QgZGV2aWNlICpkZXYpCj4gPiArewo+ID4gKyAgICAgICBzdHJ1Y3QgbXRrX3VhcnRf YXBkbWFkZXYgKm10a2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiA+ICsKPiA+ICsgICAgICAg aWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKQo+ID4gKyAgICAgICAgICAgICAgIGNsa19k aXNhYmxlX3VucHJlcGFyZShtdGtkLT5jbGspOwo+ID4gKwo+ID4gKyAgICAgICByZXR1cm4gMDsK PiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9yZXN1bWUoc3RydWN0 IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsgICAgICAgaW50IHJldDsKPiA+ICsgICAgICAgc3Ry dWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gPiAr Cj4gPiArICAgICAgIGlmICghcG1fcnVudGltZV9zdXNwZW5kZWQoZGV2KSkgewo+ID4gKyAgICAg ICAgICAgICAgIHJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtdGtkLT5jbGspOwo+ID4gKyAgICAg ICAgICAgICAgIGlmIChyZXQpCj4gPiArICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+ID4gKyAgICAgICB9Cj4gPiArCj4gPiArICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsj ZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCj4gPiArCj4gPiArI2lmZGVmIENPTkZJR19QTQo+ ID4gK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZp Y2UgKmRldikKPiA+ICt7Cj4gPiArICAgICAgIHN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRr ZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ID4gKwo+ID4gKyAgICAgICBjbGtfZGlzYWJsZV91 bnByZXBhcmUobXRrZC0+Y2xrKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0dXJuIDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfcnVudGltZV9yZXN1bWUoc3RydWN0 IGRldmljZSAqZGV2KQo+ID4gK3sKPiA+ICsgICAgICAgaW50IHJldDsKPiA+ICsgICAgICAgc3Ry dWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4gPiAr Cj4gPiArICAgICAgIHJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShtdGtkLT5jbGspOwo+ID4gKyAg ICAgICBpZiAocmV0KQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gPiArCj4gPiAr ICAgICAgIHJldHVybiAwOwo+ID4gK30KPiA+ICsjZW5kaWYgLyogQ09ORklHX1BNICovCj4gPiAr Cj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIG10a191YXJ0X2FwZG1hX3BtX29w cyA9IHsKPiA+ICsgICAgICAgU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMobXRrX3VhcnRfYXBkbWFf c3VzcGVuZCwgbXRrX3VhcnRfYXBkbWFfcmVzdW1lKQo+ID4gKyAgICAgICBTRVRfUlVOVElNRV9Q TV9PUFMobXRrX3VhcnRfYXBkbWFfcnVudGltZV9zdXNwZW5kLAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgbXRrX3VhcnRfYXBkbWFfcnVudGltZV9yZXN1bWUsIE5VTEwpCj4gPiArfTsK PiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdGtfdWFydF9hcGRtYV9k cml2ZXIgPSB7Cj4gPiArICAgICAgIC5wcm9iZSAgPSBtdGtfdWFydF9hcGRtYV9wcm9iZSwKPiA+ ICsgICAgICAgLnJlbW92ZSA9IG10a191YXJ0X2FwZG1hX3JlbW92ZSwKPiA+ICsgICAgICAgLmRy aXZlciA9IHsKPiA+ICsgICAgICAgICAgICAgICAubmFtZSAgICAgICAgICAgPSBLQlVJTERfTU9E TkFNRSwKPiA+ICsgICAgICAgICAgICAgICAucG0gICAgICAgICAgICAgPSAmbXRrX3VhcnRfYXBk bWFfcG1fb3BzLAo+ID4gKyAgICAgICAgICAgICAgIC5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNo X3B0cihtdGtfdWFydF9hcGRtYV9tYXRjaCksCj4gPiArICAgICAgIH0sCj4gPiArfTsKPiA+ICsK PiA+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10a191YXJ0X2FwZG1hX2RyaXZlcik7Cj4gPiAr Cj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRpYVRlayBVQVJUIEFQRE1BIENvbnRyb2xsZXIg RHJpdmVyIik7Cj4gPiArTU9EVUxFX0FVVEhPUigiTG9uZyBDaGVuZyA8bG9uZy5jaGVuZ0BtZWRp YXRlay5jb20+Iik7Cj4gPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ID4gKwo+ID4gLS0K PiA+IDEuNy45LjUKPiA+Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 90EBDC10F0E for ; Tue, 9 Apr 2019 09:42:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 364AB20651 for ; Tue, 9 Apr 2019 09:42:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726517AbfDIJm2 (ORCPT ); Tue, 9 Apr 2019 05:42:28 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:3426 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726352AbfDIJm2 (ORCPT ); Tue, 9 Apr 2019 05:42:28 -0400 X-UUID: 9a54892906bb4beb8dd3bc81cf120cd5-20190409 X-UUID: 9a54892906bb4beb8dd3bc81cf120cd5-20190409 Received: from mtkmrs01.mediatek.inc [(172.21.131.159)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 1727140611; Tue, 09 Apr 2019 17:42:15 +0800 Received: from MTKCAS36.mediatek.inc (172.27.4.186) by mtkmbs08n2.mediatek.inc (172.21.101.56) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 9 Apr 2019 17:42:12 +0800 Received: from [10.17.3.153] (172.27.4.253) by MTKCAS36.mediatek.inc (172.27.4.170) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Tue, 9 Apr 2019 17:42:11 +0800 Message-ID: <1554802931.14150.1.camel@mhfsdcap03> Subject: Re: [PATCH v11 1/4] dmaengine: 8250_mtk_dma: add MediaTek uart DMA support From: Long Cheng To: Nicolas Boichat CC: Vinod Koul , Randy Dunlap , "Rob Herring" , Mark Rutland , "Ryder Lee" , Sean Wang , "Matthias Brugger" , Dan Williams , Greg Kroah-Hartman , Jiri Slaby , Sean Wang , , , "linux-arm Mailing List" , "moderated list:ARM/Mediatek SoC support" , lkml , , srv_heupstream , Yingjoe Chen , YT Shen , Zhenbao Liu Date: Tue, 9 Apr 2019 17:42:11 +0800 In-Reply-To: References: <1551923135-32479-1-git-send-email-long.cheng@mediatek.com> <1551923135-32479-2-git-send-email-long.cheng@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 Content-Transfer-Encoding: 7bit MIME-Version: 1.0 X-TM-SNTS-SMTP: D32DA4BBD107FC6169FC42B76690804295DF453B6DBB0E3B100F82EBED908E2A2000:8 X-MTK: N Sender: dmaengine-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: dmaengine@vger.kernel.org Message-ID: <20190409094211.-WYflXz7HfDMtMU1vt_30AaVtm-W4NswiHhnMyXjWLY@z> On Sun, 2019-03-10 at 19:15 +0800, Nicolas Boichat wrote: > On Thu, Mar 7, 2019 at 9:45 AM Long Cheng wrote: > > > > In DMA engine framework, add 8250 uart dma to support MediaTek uart. > > If MediaTek uart enabled(SERIAL_8250_MT6577), and want to improve > > the performance, can enable the function. > > > > Signed-off-by: Long Cheng > > --- > > drivers/dma/mediatek/Kconfig | 11 + > > drivers/dma/mediatek/Makefile | 1 + > > drivers/dma/mediatek/mtk-uart-apdma.c | 660 +++++++++++++++++++++++++++++++++ > > 3 files changed, 672 insertions(+) > > create mode 100644 drivers/dma/mediatek/mtk-uart-apdma.c > > > > diff --git a/drivers/dma/mediatek/Kconfig b/drivers/dma/mediatek/Kconfig > > index 680fc05..ac49eb6 100644 > > --- a/drivers/dma/mediatek/Kconfig > > +++ b/drivers/dma/mediatek/Kconfig > > @@ -24,3 +24,14 @@ config MTK_CQDMA > > > > This controller provides the channels which is dedicated to > > memory-to-memory transfer to offload from CPU. > > + > > +config MTK_UART_APDMA > > + tristate "MediaTek SoCs APDMA support for UART" > > + depends on OF && SERIAL_8250_MT6577 > > + select DMA_ENGINE > > + select DMA_VIRTUAL_CHANNELS > > + help > > + Support for the UART DMA engine found on MediaTek MTK SoCs. > > + When SERIAL_8250_MT6577 is enabled, and if you want to use DMA, > > + you can enable the config. The DMA engine can only be used > > + with MediaTek SoCs. > > diff --git a/drivers/dma/mediatek/Makefile b/drivers/dma/mediatek/Makefile > > index 41bb381..61a6d29 100644 > > --- a/drivers/dma/mediatek/Makefile > > +++ b/drivers/dma/mediatek/Makefile > > @@ -1,2 +1,3 @@ > > +obj-$(CONFIG_MTK_UART_APDMA) += mtk-uart-apdma.o > > obj-$(CONFIG_MTK_HSDMA) += mtk-hsdma.o > > obj-$(CONFIG_MTK_CQDMA) += mtk-cqdma.o > > diff --git a/drivers/dma/mediatek/mtk-uart-apdma.c b/drivers/dma/mediatek/mtk-uart-apdma.c > > new file mode 100644 > > index 0000000..9ed7a49 > > --- /dev/null > > +++ b/drivers/dma/mediatek/mtk-uart-apdma.c > > @@ -0,0 +1,660 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * MediaTek Uart APDMA driver. > > + * > > + * Copyright (c) 2018 MediaTek Inc. > > + * Author: Long Cheng > > + */ > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +#include "../virt-dma.h" > > + > > +/* The default number of virtual channel */ > > +#define MTK_UART_APDMA_NR_VCHANS 8 > > + > > +#define VFF_EN_B BIT(0) > > +#define VFF_STOP_B BIT(0) > > +#define VFF_FLUSH_B BIT(0) > > +#define VFF_4G_SUPPORT_B BIT(0) > > +#define VFF_RX_INT_EN0_B BIT(0) /* rx valid size >= vff thre */ > > +#define VFF_RX_INT_EN1_B BIT(1) > > +#define VFF_TX_INT_EN_B BIT(0) /* tx left size >= vff thre */ > > +#define VFF_WARM_RST_B BIT(0) > > +#define VFF_RX_INT_CLR_B (BIT(0) | BIT(1)) > > +#define VFF_TX_INT_CLR_B 0 > > +#define VFF_STOP_CLR_B 0 > > +#define VFF_INT_EN_CLR_B 0 > > +#define VFF_4G_SUPPORT_CLR_B 0 > > + > > +/* interrupt trigger level for tx */ > > +#define VFF_TX_THRE(n) ((n) * 7 / 8) > > +/* interrupt trigger level for rx */ > > +#define VFF_RX_THRE(n) ((n) * 3 / 4) > > + > > +#define VFF_RING_SIZE 0xffffU > > Drop the U, it's not very useful (there are a a few more below, grep > for [0-9a-f]U). > OK, i will fix these. > > +/* invert this bit when wrap ring head again */ > > +#define VFF_RING_WRAP 0x10000U > > + > > +#define VFF_INT_FLAG 0x00 > > +#define VFF_INT_EN 0x04 > > +#define VFF_EN 0x08 > > +#define VFF_RST 0x0c > > +#define VFF_STOP 0x10 > > +#define VFF_FLUSH 0x14 > > +#define VFF_ADDR 0x1c > > +#define VFF_LEN 0x24 > > +#define VFF_THRE 0x28 > > +#define VFF_WPT 0x2c > > +#define VFF_RPT 0x30 > > +/* TX: the buffer size HW can read. RX: the buffer size SW can read. */ > > +#define VFF_VALID_SIZE 0x3c > > +/* TX: the buffer size SW can write. RX: the buffer size HW can write. */ > > +#define VFF_LEFT_SIZE 0x40 > > +#define VFF_DEBUG_STATUS 0x50 > > +#define VFF_4G_SUPPORT 0x54 > > + > > +struct mtk_uart_apdmadev { > > + struct dma_device ddev; > > + struct clk *clk; > > + bool support_33bits; > > + unsigned int dma_requests; > > + unsigned int *dma_irq; > > +}; > > + > > +struct mtk_uart_apdma_desc { > > + struct virt_dma_desc vd; > > + > > + unsigned int avail_len; > > +}; > > + > > +struct mtk_chan { > > + struct virt_dma_chan vc; > > + struct dma_slave_config cfg; > > + void __iomem *base; > > + struct mtk_uart_apdma_desc *desc; > > + > > + enum dma_transfer_direction dir; > > + > > + bool requested; > > + > > + unsigned int rx_status; > > +}; > > + > > +static inline struct mtk_uart_apdmadev * > > +to_mtk_uart_apdma_dev(struct dma_device *d) > > +{ > > + return container_of(d, struct mtk_uart_apdmadev, ddev); > > +} > > + > > +static inline struct mtk_chan *to_mtk_uart_apdma_chan(struct dma_chan *c) > > +{ > > + return container_of(c, struct mtk_chan, vc.chan); > > +} > > + > > +static inline struct mtk_uart_apdma_desc *to_mtk_uart_apdma_desc > > + (struct dma_async_tx_descriptor *t) > > +{ > > + return container_of(t, struct mtk_uart_apdma_desc, vd.tx); > > +} > > + > > +static void mtk_uart_apdma_write(struct mtk_chan *c, > > + unsigned int reg, unsigned int val) > > +{ > > + writel(val, c->base + reg); > > +} > > + > > +static unsigned int mtk_uart_apdma_read(struct mtk_chan *c, unsigned int reg) > > +{ > > + return readl(c->base + reg); > > +} > > + > > +static void mtk_uart_apdma_desc_free(struct virt_dma_desc *vd) > > +{ > > + struct dma_chan *chan = vd->tx.chan; > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + > > + kfree(c->desc); > > +} > > + > > +static void mtk_uart_apdma_start_tx(struct mtk_chan *c) > > +{ > > + unsigned int len, send, left, wpt, d_wpt, tmp; > > + int ret; > > + > > + left = mtk_uart_apdma_read(c, VFF_LEFT_SIZE); > > + if (!left) { > > + mtk_uart_apdma_write(c, VFF_INT_EN, VFF_TX_INT_EN_B); > > + return; > > + } > > + > > + /* Wait 1sec for flush, can't sleep */ > > + ret = readx_poll_timeout(readl, c->base + VFF_FLUSH, tmp, > > + tmp != VFF_FLUSH_B, 0, 1000000); > > + if (ret) > > + dev_warn(c->vc.chan.device->dev, "tx: fail, debug=0x%x\n", > > + mtk_uart_apdma_read(c, VFF_DEBUG_STATUS)); > > + > > + send = min_t(unsigned int, left, c->desc->avail_len); > > + wpt = mtk_uart_apdma_read(c, VFF_WPT); > > + len = c->cfg.dst_port_window_size; > > + > > + d_wpt = wpt + send; > > + if ((d_wpt & VFF_RING_SIZE) >= len) { > > + d_wpt = d_wpt - len; > > + d_wpt = d_wpt ^ VFF_RING_WRAP; > > + } > > + mtk_uart_apdma_write(c, VFF_WPT, d_wpt); > > + > > + c->desc->avail_len -= send; > > + > > + mtk_uart_apdma_write(c, VFF_INT_EN, VFF_TX_INT_EN_B); > > + if (mtk_uart_apdma_read(c, VFF_FLUSH) == 0U) > > + mtk_uart_apdma_write(c, VFF_FLUSH, VFF_FLUSH_B); > > +} > > + > > +static void mtk_uart_apdma_start_rx(struct mtk_chan *c) > > +{ > > + struct mtk_uart_apdma_desc *d = c->desc; > > + unsigned int len, wg, rg; > > + int cnt; > > + > > + if ((mtk_uart_apdma_read(c, VFF_VALID_SIZE) == 0U) || > > + !d || !vchan_next_desc(&c->vc)) > > + return; > > + > > + len = c->cfg.src_port_window_size; > > + rg = mtk_uart_apdma_read(c, VFF_RPT); > > + wg = mtk_uart_apdma_read(c, VFF_WPT); > > + cnt = (wg & VFF_RING_SIZE) - (rg & VFF_RING_SIZE); > > + /* > > + * The buffer is ring buffer. If wrap bit different, > > + * represents the start of the next cycle for WPT > > + */ > > + if ((rg ^ wg) & VFF_RING_WRAP) > > + cnt += len; > > + > > + c->rx_status = d->avail_len - cnt; > > + mtk_uart_apdma_write(c, VFF_RPT, wg); > > + > > + list_del(&d->vd.node); > > + vchan_cookie_complete(&d->vd); > > +} > > + > > +static irqreturn_t mtk_uart_apdma_irq_handler(int irq, void *dev_id) > > +{ > > + struct dma_chan *chan = (struct dma_chan *)dev_id; > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + struct mtk_uart_apdma_desc *d; > > + unsigned long flags; > > + > > + spin_lock_irqsave(&c->vc.lock, flags); > > + if (c->dir == DMA_DEV_TO_MEM) { > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_RX_INT_CLR_B); > > + mtk_uart_apdma_start_rx(c); > > + } else if (c->dir == DMA_MEM_TO_DEV) { > > + d = c->desc; > > + > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_TX_INT_CLR_B); > > + > > + if (d->avail_len != 0U) { > > + mtk_uart_apdma_start_tx(c); > > + } else { > > + list_del(&d->vd.node); > > + vchan_cookie_complete(&d->vd); > > + } > > + } > > + spin_unlock_irqrestore(&c->vc.lock, flags); > > + > > + return IRQ_HANDLED; > > +} > > + > > +static int mtk_uart_apdma_alloc_chan_resources(struct dma_chan *chan) > > +{ > > + struct mtk_uart_apdmadev *mtkd = to_mtk_uart_apdma_dev(chan->device); > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + unsigned int tmp; > > + int ret; > > + > > + pm_runtime_get_sync(mtkd->ddev.dev); > > + > > + mtk_uart_apdma_write(c, VFF_ADDR, 0); > > + mtk_uart_apdma_write(c, VFF_THRE, 0); > > + mtk_uart_apdma_write(c, VFF_LEN, 0); > > + mtk_uart_apdma_write(c, VFF_RST, VFF_WARM_RST_B); > > + > > + ret = readx_poll_timeout(readl, c->base + VFF_EN, tmp, !tmp, 10, 100); > > + if (ret) { > > + dev_err(chan->device->dev, "dma reset: fail, timeout\n"); > > + return ret; > > + } > > + > > + if (!c->requested) { > > + c->requested = true; > > + ret = request_irq(mtkd->dma_irq[chan->chan_id], > > + mtk_uart_apdma_irq_handler, IRQF_TRIGGER_NONE, > > + KBUILD_MODNAME, chan); > > + if (ret < 0) { > > + dev_err(chan->device->dev, "Can't request dma IRQ\n"); > > + return -EINVAL; > > + } > > + } > > + > > + if (mtkd->support_33bits) > > + mtk_uart_apdma_write(c, VFF_4G_SUPPORT, VFF_4G_SUPPORT_CLR_B); > > + > > + return ret; > > +} > > + > > +static void mtk_uart_apdma_free_chan_resources(struct dma_chan *chan) > > +{ > > + struct mtk_uart_apdmadev *mtkd = to_mtk_uart_apdma_dev(chan->device); > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + > > + if (c->requested) { > > + c->requested = false; > > + free_irq(mtkd->dma_irq[chan->chan_id], chan); > > + } > > + > > + tasklet_kill(&c->vc.task); > > + > > + vchan_free_chan_resources(&c->vc); > > + > > + pm_runtime_put_sync(mtkd->ddev.dev); > > +} > > + > > +static enum dma_status mtk_uart_apdma_tx_status(struct dma_chan *chan, > > + dma_cookie_t cookie, > > + struct dma_tx_state *txstate) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + enum dma_status ret; > > + > > + ret = dma_cookie_status(chan, cookie, txstate); > > + > > + dma_set_residue(txstate, c->rx_status); > > + > > + return ret; > > +} > > + > > +static void mtk_uart_apdma_config_write(struct dma_chan *chan, > > + struct dma_slave_config *cfg, > > + enum dma_transfer_direction dir) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + struct mtk_uart_apdmadev *mtkd = > > + to_mtk_uart_apdma_dev(c->vc.chan.device); > > + unsigned int tmp; > > + > > + if (mtk_uart_apdma_read(c, VFF_EN) == VFF_EN_B) > > + return; > > + > > + c->dir = dir; > > + > > + if (dir == DMA_DEV_TO_MEM) { > > + tmp = cfg->src_port_window_size; > > + > > + mtk_uart_apdma_write(c, VFF_ADDR, cfg->src_addr); > > + mtk_uart_apdma_write(c, VFF_LEN, tmp); > > + mtk_uart_apdma_write(c, VFF_THRE, VFF_RX_THRE(tmp)); > > + mtk_uart_apdma_write(c, VFF_INT_EN, > > + VFF_RX_INT_EN0_B | VFF_RX_INT_EN1_B); > > + mtk_uart_apdma_write(c, VFF_RPT, 0); > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_RX_INT_CLR_B); > > + } else if (dir == DMA_MEM_TO_DEV) { > > + tmp = cfg->dst_port_window_size; > > + > > + mtk_uart_apdma_write(c, VFF_ADDR, cfg->dst_addr); > > + mtk_uart_apdma_write(c, VFF_LEN, tmp); > > + mtk_uart_apdma_write(c, VFF_THRE, VFF_TX_THRE(tmp)); > > + mtk_uart_apdma_write(c, VFF_WPT, 0); > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_TX_INT_CLR_B); > > + } > > + > > + mtk_uart_apdma_write(c, VFF_EN, VFF_EN_B); > > + > > + if (mtkd->support_33bits) > > + mtk_uart_apdma_write(c, VFF_4G_SUPPORT, VFF_4G_SUPPORT_B); > > + > > + if (mtk_uart_apdma_read(c, VFF_EN) != VFF_EN_B) > > + dev_err(chan->device->dev, "dir[%d] fail\n", dir); > > +} > > + > > +/* > > + * dmaengine_prep_slave_single will call the function. and sglen is 1. > > + * 8250 uart using one ring buffer, and deal with one sg. > > + */ > > +static struct dma_async_tx_descriptor *mtk_uart_apdma_prep_slave_sg > > + (struct dma_chan *chan, struct scatterlist *sgl, > > + unsigned int sglen, enum dma_transfer_direction dir, > > + unsigned long tx_flags, void *context) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + struct mtk_uart_apdma_desc *d; > > + > > + if (!is_slave_direction(dir)) > > + return NULL; > > + > > + mtk_uart_apdma_config_write(chan, &c->cfg, dir); > > + > > + /* Now allocate and setup the descriptor */ > > + d = kzalloc(sizeof(*d), GFP_ATOMIC); > > + if (!d) > > + return NULL; > > + > > + /* sglen is 1 */ > > + d->avail_len = sg_dma_len(sgl); > > + c->rx_status = d->avail_len; > > + > > + return vchan_tx_prep(&c->vc, &d->vd, tx_flags); > > +} > > + > > +static void mtk_uart_apdma_issue_pending(struct dma_chan *chan) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + struct virt_dma_desc *vd; > > + unsigned long flags; > > + > > + spin_lock_irqsave(&c->vc.lock, flags); > > + if (vchan_issue_pending(&c->vc)) { > > + vd = vchan_next_desc(&c->vc); > > + c->desc = to_mtk_uart_apdma_desc(&vd->tx); > > + } > > + > > + if (c->dir == DMA_DEV_TO_MEM) > > + mtk_uart_apdma_start_rx(c); > > + else if (c->dir == DMA_MEM_TO_DEV) > > + mtk_uart_apdma_start_tx(c); > > + > > + spin_unlock_irqrestore(&c->vc.lock, flags); > > +} > > + > > +static int mtk_uart_apdma_slave_config(struct dma_chan *chan, > > + struct dma_slave_config *config) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + > > + memcpy(&c->cfg, config, sizeof(*config)); > > + > > + return 0; > > +} > > + > > +static int mtk_uart_apdma_terminate_all(struct dma_chan *chan) > > +{ > > + struct mtk_chan *c = to_mtk_uart_apdma_chan(chan); > > + unsigned long flags; > > + unsigned int tmp; > > + int ret; > > + > > + spin_lock_irqsave(&c->vc.lock, flags); > > + > > + mtk_uart_apdma_write(c, VFF_FLUSH, VFF_FLUSH_B); > > + /* Wait 1sec for flush, can't sleep */ > > + ret = readx_poll_timeout(readl, c->base + VFF_FLUSH, tmp, > > + tmp != VFF_FLUSH_B, 0, 1000000); > > + if (ret) > > + dev_err(c->vc.chan.device->dev, "flush: fail, debug=0x%x\n", > > + mtk_uart_apdma_read(c, VFF_DEBUG_STATUS)); > > + > > + /* set stop as 1 -> wait until en is 0 -> set stop as 0 */ > > + mtk_uart_apdma_write(c, VFF_STOP, VFF_STOP_B); > > + ret = readx_poll_timeout(readl, c->base + VFF_EN, tmp, !tmp, 10, 100); > > + if (ret) > > + dev_err(c->vc.chan.device->dev, "stop: fail, debug=0x%x\n", > > + mtk_uart_apdma_read(c, VFF_DEBUG_STATUS)); > > + > > + mtk_uart_apdma_write(c, VFF_STOP, VFF_STOP_CLR_B); > > + mtk_uart_apdma_write(c, VFF_INT_EN, VFF_INT_EN_CLR_B); > > + > > + if (c->dir == DMA_DEV_TO_MEM) > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_RX_INT_CLR_B); > > + else if (c->dir == DMA_MEM_TO_DEV) > > + mtk_uart_apdma_write(c, VFF_INT_FLAG, VFF_TX_INT_CLR_B); > > + > > + spin_unlock_irqrestore(&c->vc.lock, flags); > > + > > + return 0; > > +} > > + > > +static int mtk_uart_apdma_device_pause(struct dma_chan *chan) > > +{ > > + /* just for check caps pass */ > > + dev_err(chan->device->dev, "Pause can't support\n"); > > + > > + return 0; > > +} > > I think we've said repeatedly that leaving this stub function is incorrect. > I will try to implementation it. Thanks > > + > > +static void mtk_uart_apdma_free(struct mtk_uart_apdmadev *mtkd) > > +{ > > + while (!list_empty(&mtkd->ddev.channels)) { > > + struct mtk_chan *c = list_first_entry(&mtkd->ddev.channels, > > + struct mtk_chan, vc.chan.device_node); > > + > > + list_del(&c->vc.chan.device_node); > > + tasklet_kill(&c->vc.task); > > + } > > +} > > + > > +static const struct of_device_id mtk_uart_apdma_match[] = { > > + { .compatible = "mediatek,mt6577-uart-dma", }, > > + { /* sentinel */ }, > > +}; > > +MODULE_DEVICE_TABLE(of, mtk_uart_apdma_match); > > + > > +static int mtk_uart_apdma_probe(struct platform_device *pdev) > > +{ > > + struct device_node *np = pdev->dev.of_node; > > + struct mtk_uart_apdmadev *mtkd; > > + struct resource *res; > > + struct mtk_chan *c; > > + int bit_mask = 32, rc; > > + unsigned int i; > > + > > + mtkd = devm_kzalloc(&pdev->dev, sizeof(*mtkd), GFP_KERNEL); > > + if (!mtkd) > > + return -ENOMEM; > > + > > + mtkd->clk = devm_clk_get(&pdev->dev, NULL); > > + if (IS_ERR(mtkd->clk)) { > > + dev_err(&pdev->dev, "No clock specified\n"); > > + rc = PTR_ERR(mtkd->clk); > > + return rc; > > + } > > + > > + if (of_property_read_bool(np, "mediatek,dma-33bits")) > > + mtkd->support_33bits = true; > > + > > + if (mtkd->support_33bits) > > + bit_mask = 33; > > + > > + rc = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(bit_mask)); > > + if (rc) > > + return rc; > > + > > + dma_cap_set(DMA_SLAVE, mtkd->ddev.cap_mask); > > + mtkd->ddev.device_alloc_chan_resources = > > + mtk_uart_apdma_alloc_chan_resources; > > + mtkd->ddev.device_free_chan_resources = > > + mtk_uart_apdma_free_chan_resources; > > + mtkd->ddev.device_tx_status = mtk_uart_apdma_tx_status; > > + mtkd->ddev.device_issue_pending = mtk_uart_apdma_issue_pending; > > + mtkd->ddev.device_prep_slave_sg = mtk_uart_apdma_prep_slave_sg; > > + mtkd->ddev.device_config = mtk_uart_apdma_slave_config; > > + mtkd->ddev.device_pause = mtk_uart_apdma_device_pause; > > + mtkd->ddev.device_terminate_all = mtk_uart_apdma_terminate_all; > > + mtkd->ddev.src_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE); > > + mtkd->ddev.dst_addr_widths = BIT(DMA_SLAVE_BUSWIDTH_1_BYTE); > > + mtkd->ddev.directions = BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV); > > + mtkd->ddev.residue_granularity = DMA_RESIDUE_GRANULARITY_SEGMENT; > > + mtkd->ddev.dev = &pdev->dev; > > + INIT_LIST_HEAD(&mtkd->ddev.channels); > > + > > + mtkd->dma_requests = MTK_UART_APDMA_NR_VCHANS; > > + if (of_property_read_u32(np, "dma-requests", &mtkd->dma_requests)) { > > + dev_info(&pdev->dev, > > + "Using %u as missing dma-requests property\n", > > + MTK_UART_APDMA_NR_VCHANS); > > + } > > + > > + mtkd->dma_irq = devm_kcalloc(&pdev->dev, mtkd->dma_requests, > > + sizeof(*mtkd->dma_irq), GFP_KERNEL); > > + if (!mtkd->dma_irq) > > + return -ENOMEM; > > + > > + for (i = 0; i < mtkd->dma_requests; i++) { > > + c = devm_kzalloc(mtkd->ddev.dev, sizeof(*c), GFP_KERNEL); > > + if (!c) { > > + rc = -ENODEV; > > + goto err_no_dma; > > + } > > + > > + res = platform_get_resource(pdev, IORESOURCE_MEM, i); > > + if (!res) { > > + rc = -ENODEV; > > + goto err_no_dma; > > + } > > + > > + c->base = devm_ioremap_resource(&pdev->dev, res); > > + if (IS_ERR(c->base)) { > > + rc = PTR_ERR(c->base); > > + goto err_no_dma; > > + } > > + c->requested = false; > > + c->vc.desc_free = mtk_uart_apdma_desc_free; > > + vchan_init(&c->vc, &mtkd->ddev); > > + > > + mtkd->dma_irq[i] = platform_get_irq(pdev, i); > > + if ((int)mtkd->dma_irq[i] < 0) { > > + dev_err(&pdev->dev, "failed to get IRQ[%d]\n", i); > > + rc = -EINVAL; > > + goto err_no_dma; > > + } > > + } > > + > > + pm_runtime_enable(&pdev->dev); > > + pm_runtime_set_active(&pdev->dev); > > + > > + rc = dma_async_device_register(&mtkd->ddev); > > + if (rc) > > + goto rpm_disable; > > + > > + platform_set_drvdata(pdev, mtkd); > > + > > + /* Device-tree DMA controller registration */ > > + rc = of_dma_controller_register(np, of_dma_xlate_by_chan_id, mtkd); > > + if (rc) > > + goto dma_remove; > > + > > + return rc; > > + > > +dma_remove: > > + dma_async_device_unregister(&mtkd->ddev); > > +rpm_disable: > > + pm_runtime_disable(&pdev->dev); > > +err_no_dma: > > + mtk_uart_apdma_free(mtkd); > > + return rc; > > +} > > + > > +static int mtk_uart_apdma_remove(struct platform_device *pdev) > > +{ > > + struct mtk_uart_apdmadev *mtkd = platform_get_drvdata(pdev); > > + > > + if (pdev->dev.of_node) > > + of_dma_controller_free(pdev->dev.of_node); > > + > > + pm_runtime_disable(&pdev->dev); > > + pm_runtime_put_noidle(&pdev->dev); > > + > > + dma_async_device_unregister(&mtkd->ddev); > > + mtk_uart_apdma_free(mtkd); > > + > > + return 0; > > +} > > + > > +#ifdef CONFIG_PM_SLEEP > > +static int mtk_uart_apdma_suspend(struct device *dev) > > +{ > > + struct mtk_uart_apdmadev *mtkd = dev_get_drvdata(dev); > > + > > + if (!pm_runtime_suspended(dev)) > > + clk_disable_unprepare(mtkd->clk); > > + > > + return 0; > > +} > > + > > +static int mtk_uart_apdma_resume(struct device *dev) > > +{ > > + int ret; > > + struct mtk_uart_apdmadev *mtkd = dev_get_drvdata(dev); > > + > > + if (!pm_runtime_suspended(dev)) { > > + ret = clk_prepare_enable(mtkd->clk); > > + if (ret) > > + return ret; > > + } > > + > > + return 0; > > +} > > +#endif /* CONFIG_PM_SLEEP */ > > + > > +#ifdef CONFIG_PM > > +static int mtk_uart_apdma_runtime_suspend(struct device *dev) > > +{ > > + struct mtk_uart_apdmadev *mtkd = dev_get_drvdata(dev); > > + > > + clk_disable_unprepare(mtkd->clk); > > + > > + return 0; > > +} > > + > > +static int mtk_uart_apdma_runtime_resume(struct device *dev) > > +{ > > + int ret; > > + struct mtk_uart_apdmadev *mtkd = dev_get_drvdata(dev); > > + > > + ret = clk_prepare_enable(mtkd->clk); > > + if (ret) > > + return ret; > > + > > + return 0; > > +} > > +#endif /* CONFIG_PM */ > > + > > +static const struct dev_pm_ops mtk_uart_apdma_pm_ops = { > > + SET_SYSTEM_SLEEP_PM_OPS(mtk_uart_apdma_suspend, mtk_uart_apdma_resume) > > + SET_RUNTIME_PM_OPS(mtk_uart_apdma_runtime_suspend, > > + mtk_uart_apdma_runtime_resume, NULL) > > +}; > > + > > +static struct platform_driver mtk_uart_apdma_driver = { > > + .probe = mtk_uart_apdma_probe, > > + .remove = mtk_uart_apdma_remove, > > + .driver = { > > + .name = KBUILD_MODNAME, > > + .pm = &mtk_uart_apdma_pm_ops, > > + .of_match_table = of_match_ptr(mtk_uart_apdma_match), > > + }, > > +}; > > + > > +module_platform_driver(mtk_uart_apdma_driver); > > + > > +MODULE_DESCRIPTION("MediaTek UART APDMA Controller Driver"); > > +MODULE_AUTHOR("Long Cheng "); > > +MODULE_LICENSE("GPL v2"); > > + > > -- > > 1.7.9.5 > >