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: [v3,1/2] dmaengine: 8250_mtk_dma: add Mediatek uart DMA support From: Long Cheng Message-Id: <1544168842-13860-2-git-send-email-long.cheng@mediatek.com> Date: Fri, 7 Dec 2018 15:47:20 +0800 To: Vinod Koul , Rob Herring , Mark Rutland Cc: Matthias Brugger , Dan Williams , Greg Kroah-Hartman , Jiri Slaby , Sean Wang , Sean Wang , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, srv_heupstream@mediatek.com, Yingjoe Chen , YT Shen , Long Cheng List-ID: SW4gRE1BIGVuZ2luZSBmcmFtZXdvcmssIGFkZCA4MjUwIG10ayBkbWEgdG8gc3VwcG9ydCBpdC4K ClNpZ25lZC1vZmYtYnk6IExvbmcgQ2hlbmcgPGxvbmcuY2hlbmdAbWVkaWF0ZWsuY29tPgotLS0K IGRyaXZlcnMvZG1hL21lZGlhdGVrLzgyNTBfbXRrX2RtYS5jIHwgIDg0NyArKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9kbWEvbWVkaWF0ZWsvS2NvbmZpZyAgICAg ICAgfCAgIDExICsKIGRyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlICAgICAgIHwgICAgMSAr CiAzIGZpbGVzIGNoYW5nZWQsIDg1OSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9kbWEvbWVkaWF0ZWsvODI1MF9tdGtfZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJz L2RtYS9tZWRpYXRlay84MjUwX210a19kbWEuYyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrLzgyNTBf bXRrX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZGI5ZWMKLS0t IC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay84MjUwX210a19kbWEuYwpAQCAt MCwwICsxLDg0NyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisg KiBNZWRpYXRlayA4MjUwIERNQSBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE4IE1l ZGlhVGVrIEluYy4KKyAqIEF1dGhvcjogTG9uZyBDaGVuZyA8bG9uZy5jaGVuZ0BtZWRpYXRlay5j b20+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVu Z2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgv ZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4K KyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KKyNp bmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZp Y2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2su aD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb2xs Lmg+CisKKyNpbmNsdWRlICIuLi92aXJ0LWRtYS5oIgorCisjZGVmaW5lIE1US19BUERNQV9ERUZB VUxUX1JFUVVFU1RTCTEyNworI2RlZmluZSBNVEtfQVBETUFfQ0hBTk5FTFMJCShDT05GSUdfU0VS SUFMXzgyNTBfTlJfVUFSVFMgKiAyKQorCisjZGVmaW5lIFZGRl9FTl9CCQlCSVQoMCkKKyNkZWZp bmUgVkZGX1NUT1BfQgkJQklUKDApCisjZGVmaW5lIFZGRl9GTFVTSF9CCQlCSVQoMCkKKyNkZWZp bmUgVkZGXzRHX1NVUFBPUlRfQglCSVQoMCkKKyNkZWZpbmUgVkZGX1JYX0lOVF9FTjBfQglCSVQo MCkJLypyeCB2YWxpZCBzaXplID49ICB2ZmYgdGhyZSovCisjZGVmaW5lIFZGRl9SWF9JTlRfRU4x X0IJQklUKDEpCisjZGVmaW5lIFZGRl9UWF9JTlRfRU5fQgkJQklUKDApCS8qdHggbGVmdCBzaXpl ID49IHZmZiB0aHJlKi8KKyNkZWZpbmUgVkZGX1dBUk1fUlNUX0IJCUJJVCgwKQorI2RlZmluZSBW RkZfUlhfSU5UX0ZMQUdfQ0xSX0IJKEJJVCgwKSB8IEJJVCgxKSkKKyNkZWZpbmUgVkZGX1RYX0lO VF9GTEFHX0NMUl9CCTAKKyNkZWZpbmUgVkZGX1NUT1BfQ0xSX0IJCTAKKyNkZWZpbmUgVkZGX0ZM VVNIX0NMUl9CCQkwCisjZGVmaW5lIFZGRl9JTlRfRU5fQ0xSX0IJMAorI2RlZmluZSBWRkZfNEdf U1VQUE9SVF9DTFJfQgkwCisKKy8qIGludGVycnVwdCB0cmlnZ2VyIGxldmVsIGZvciB0eCAqLwor I2RlZmluZSBWRkZfVFhfVEhSRShuKQkJKChuKSAqIDcgLyA4KQorLyogaW50ZXJydXB0IHRyaWdn ZXIgbGV2ZWwgZm9yIHJ4ICovCisjZGVmaW5lIFZGRl9SWF9USFJFKG4pCQkoKG4pICogMyAvIDQp CisKKyNkZWZpbmUgTVRLX0RNQV9SSU5HX1NJWkUJMHhmZmZmVQorLyogaW52ZXJ0IHRoaXMgYml0 IHdoZW4gd3JhcCByaW5nIGhlYWQgYWdhaW4qLworI2RlZmluZSBNVEtfRE1BX1JJTkdfV1JBUAkw eDEwMDAwVQorCisjZGVmaW5lIFZGRl9JTlRfRkxBRwkJMHgwMAorI2RlZmluZSBWRkZfSU5UX0VO CQkweDA0CisjZGVmaW5lIFZGRl9FTgkJCTB4MDgKKyNkZWZpbmUgVkZGX1JTVAkJCTB4MGMKKyNk ZWZpbmUgVkZGX1NUT1AJCTB4MTAKKyNkZWZpbmUgVkZGX0ZMVVNICQkweDE0CisjZGVmaW5lIFZG Rl9BRERSCQkweDFjCisjZGVmaW5lIFZGRl9MRU4JCQkweDI0CisjZGVmaW5lIFZGRl9USFJFCQkw eDI4CisjZGVmaW5lIFZGRl9XUFQJCQkweDJjCisjZGVmaW5lIFZGRl9SUFQJCQkweDMwCisvKlRY OiB0aGUgYnVmZmVyIHNpemUgSFcgY2FuIHJlYWQuIFJYOiB0aGUgYnVmZmVyIHNpemUgU1cgY2Fu IHJlYWQuKi8KKyNkZWZpbmUgVkZGX1ZBTElEX1NJWkUJCTB4M2MKKy8qVFg6IHRoZSBidWZmZXIg c2l6ZSBTVyBjYW4gd3JpdGUuIFJYOiB0aGUgYnVmZmVyIHNpemUgSFcgY2FuIHdyaXRlLiovCisj ZGVmaW5lIFZGRl9MRUZUX1NJWkUJCTB4NDAKKyNkZWZpbmUgVkZGX0RFQlVHX1NUQVRVUwkweDUw CisjZGVmaW5lIFZGRl80R19TVVBQT1JUCQkweDU0CisKK3N0cnVjdCBtdGtfZG1hZGV2IHsKKwlz dHJ1Y3QgZG1hX2RldmljZSBkZGV2OworCXZvaWQgX19pb21lbSAqbWVtX2Jhc2VbTVRLX0FQRE1B X0NIQU5ORUxTXTsKKwlzcGlubG9ja190IGxvY2s7IC8qIGRtYSBkZXYgbG9jayAqLworCXN0cnVj dCB0YXNrbGV0X3N0cnVjdCB0YXNrOworCXN0cnVjdCBsaXN0X2hlYWQgcGVuZGluZzsKKwlzdHJ1 Y3QgY2xrICpjbGs7CisJdW5zaWduZWQgaW50IGRtYV9yZXF1ZXN0czsKKwlib29sIHN1cHBvcnRf MzNiaXRzOworCXVuc2lnbmVkIGludCBkbWFfaXJxW01US19BUERNQV9DSEFOTkVMU107CisJc3Ry dWN0IG10a19jaGFuICpjaFtNVEtfQVBETUFfQ0hBTk5FTFNdOworfTsKKworc3RydWN0IG10a19j aGFuIHsKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbiB2YzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7 CisJc3RydWN0IGRtYV9zbGF2ZV9jb25maWcJY2ZnOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlz dHJ1Y3QgbXRrX2RtYV9kZXNjICpkZXNjOworCisJYm9vbCBzdG9wOworCWJvb2wgcmVxdWVzdGVk OworCisJdW5zaWduZWQgaW50IHJ4X3N0YXR1czsKK307CisKK3N0cnVjdCBtdGtfZG1hX3NnIHsK KwlkbWFfYWRkcl90IGFkZHI7CisJdW5zaWduZWQgaW50IGVuOwkJLyogbnVtYmVyIG9mIGVsZW1l bnRzICgyNC1iaXQpICovCisJdW5zaWduZWQgaW50IGZuOwkJLyogbnVtYmVyIG9mIGZyYW1lcyAo MTYtYml0KSAqLworfTsKKworc3RydWN0IG10a19kbWFfZGVzYyB7CisJc3RydWN0IHZpcnRfZG1h X2Rlc2MgdmQ7CisJZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsKKworCXVuc2lnbmVk IGludCBzZ2xlbjsKKwlzdHJ1Y3QgbXRrX2RtYV9zZyBzZ1swXTsKKworCXVuc2lnbmVkIGludCBs ZW47Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtdGtfZG1hZGV2ICp0b19tdGtfZG1hX2Rl dihzdHJ1Y3QgZG1hX2RldmljZSAqZCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGQsIHN0cnVj dCBtdGtfZG1hZGV2LCBkZGV2KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX2NoYW4g KnRvX210a19kbWFfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJcmV0dXJuIGNvbnRhaW5l cl9vZihjLCBzdHJ1Y3QgbXRrX2NoYW4sIHZjLmNoYW4pOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCBtdGtfZG1hX2Rlc2MgKnRvX210a19kbWFfZGVzYworCShzdHJ1Y3QgZG1hX2FzeW5jX3R4 X2Rlc2NyaXB0b3IgKnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0LCBzdHJ1Y3QgbXRrX2Rt YV9kZXNjLCB2ZC50eCk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfY2hhbl93cml0ZShzdHJ1 Y3QgbXRrX2NoYW4gKmMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50 IHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHVuc2ln bmVkIGludCBtdGtfZG1hX2NoYW5fcmVhZChzdHJ1Y3QgbXRrX2NoYW4gKmMsIHVuc2lnbmVkIGlu dCByZWcpCit7CisJcmV0dXJuIHJlYWRsKGMtPmJhc2UgKyByZWcpOworfQorCitzdGF0aWMgdm9p ZCBtdGtfZG1hX2Rlc2NfZnJlZShzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQpCit7CisJc3RydWN0 IGRtYV9jaGFuICpjaGFuID0gdmQtPnR4LmNoYW47CisJc3RydWN0IG10a19jaGFuICpjID0gdG9f bXRrX2RtYV9jaGFuKGNoYW4pOworCisJa2ZyZWUoYy0+ZGVzYyk7CisJYy0+ZGVzYyA9IE5VTEw7 Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV9jbGtfZW5hYmxlKHN0cnVjdCBtdGtfZG1hZGV2ICpt dGtkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUobXRrZC0+Y2xr KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIobXRrZC0+ZGRldi5kZXYsICJDb3VsZG4ndCBlbmFi bGUgdGhlIGNsb2NrXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgbXRrX2RtYV9jbGtfZGlzYWJsZShzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCkK K3sKKwljbGtfZGlzYWJsZV91bnByZXBhcmUobXRrZC0+Y2xrKTsKK30KKworc3RhdGljIHZvaWQg bXRrX2RtYV90eF9mbHVzaChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19j aGFuICpjID0gdG9fbXRrX2RtYV9jaGFuKGNoYW4pOworCisJaWYgKG10a19kbWFfY2hhbl9yZWFk KGMsIFZGRl9GTFVTSCkgPT0gMFUpCisJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfRkxVU0gs IFZGRl9GTFVTSF9CKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV90eF93cml0ZShzdHJ1Y3Qg ZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX2RtYV9jaGFu KGNoYW4pOworCXVuc2lnbmVkIGludCB0eGNvdW50ID0gYy0+ZGVzYy0+bGVuOworCXVuc2lnbmVk IGludCBsZW4sIHNlbmQsIGxlZnQsIHdwdCwgd3JhcDsKKworCWxlbiA9IG10a19kbWFfY2hhbl9y ZWFkKGMsIFZGRl9MRU4pOworCisJd2hpbGUgKChsZWZ0ID0gbXRrX2RtYV9jaGFuX3JlYWQoYywg VkZGX0xFRlRfU0laRSkpID4gMFUpIHsKKwkJaWYgKGMtPmRlc2MtPmxlbiA9PSAwVSkKKwkJCWJy ZWFrOworCQlzZW5kID0gbWluX3QodW5zaWduZWQgaW50LCBsZWZ0LCBjLT5kZXNjLT5sZW4pOwor CQl3cHQgPSBtdGtfZG1hX2NoYW5fcmVhZChjLCBWRkZfV1BUKTsKKwkJd3JhcCA9IHdwdCAmIE1U S19ETUFfUklOR19XUkFQID8gMFUgOiBNVEtfRE1BX1JJTkdfV1JBUDsKKworCQlpZiAoKHdwdCAm IChsZW4gLSAxVSkpICsgc2VuZCA8IGxlbikKKwkJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZf V1BULCB3cHQgKyBzZW5kKTsKKwkJZWxzZQorCQkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9X UFQsCisJCQkJCSAgICgod3B0ICsgc2VuZCkgJiAobGVuIC0gMVUpKQorCQkJCQkgICB8IHdyYXAp OworCisJCWMtPmRlc2MtPmxlbiAtPSBzZW5kOworCX0KKworCWlmICh0eGNvdW50ICE9IGMtPmRl c2MtPmxlbikgeworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX1RYX0lO VF9FTl9CKTsKKwkJbXRrX2RtYV90eF9mbHVzaChjaGFuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk IG10a19kbWFfc3RhcnRfdHgoc3RydWN0IG10a19jaGFuICpjKQoreworCWlmIChtdGtfZG1hX2No YW5fcmVhZChjLCBWRkZfTEVGVF9TSVpFKSA9PSAwVSkKKwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMs IFZGRl9JTlRfRU4sIFZGRl9UWF9JTlRfRU5fQik7CisJZWxzZQorCQltdGtfZG1hX3R4X3dyaXRl KCZjLT52Yy5jaGFuKTsKKworCWMtPnN0b3AgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgbXRr X2RtYV9nZXRfcnhfc2l6ZShzdHJ1Y3QgbXRrX2NoYW4gKmMpCit7CisJdW5zaWduZWQgaW50IHJ4 X3NpemUgPSBtdGtfZG1hX2NoYW5fcmVhZChjLCBWRkZfTEVOKTsKKwl1bnNpZ25lZCBpbnQgcmRw dHIsIHdycHRyLCB3cnJlZywgcmRyZWcsIGNvdW50OworCisJcmRyZWcgPSBtdGtfZG1hX2NoYW5f cmVhZChjLCBWRkZfUlBUKTsKKwl3cnJlZyA9IG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9XUFQp OworCXJkcHRyID0gcmRyZWcgJiBNVEtfRE1BX1JJTkdfU0laRTsKKwl3cnB0ciA9IHdycmVnICYg TVRLX0RNQV9SSU5HX1NJWkU7CisJY291bnQgPSAoKHJkcmVnIF4gd3JyZWcpICYgTVRLX0RNQV9S SU5HX1dSQVApID8KKwkJCSh3cnB0ciArIHJ4X3NpemUgLSByZHB0cikgOiAod3JwdHIgLSByZHB0 cik7CisKKwljLT5yeF9zdGF0dXMgPSBjb3VudDsKKworCW10a19kbWFfY2hhbl93cml0ZShjLCBW RkZfUlBULCB3cnJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfc3RhcnRfcngoc3RydWN0 IG10a19jaGFuICpjKQoreworCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9ICZjLT52Yy5jaGFuOwor CXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gdG9fbXRrX2RtYV9kZXYoY2hhbi0+ZGV2aWNlKTsK KwlzdHJ1Y3QgbXRrX2RtYV9kZXNjICpkID0gYy0+ZGVzYzsKKworCWlmIChtdGtfZG1hX2NoYW5f cmVhZChjLCBWRkZfVkFMSURfU0laRSkgPT0gMFUpCisJCXJldHVybjsKKworCWlmIChkICYmIHZj aGFuX25leHRfZGVzYygmYy0+dmMpKSB7CisJCW10a19kbWFfZ2V0X3J4X3NpemUoYyk7CisJCWxp c3RfZGVsKCZkLT52ZC5ub2RlKTsKKwkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZkLT52ZCk7CisJ fSBlbHNlIHsKKwkJc3Bpbl9sb2NrKCZtdGtkLT5sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJm10 a2QtPnBlbmRpbmcpKQorCQkJbGlzdF9hZGRfdGFpbCgmYy0+bm9kZSwgJm10a2QtPnBlbmRpbmcp OworCQlzcGluX3VubG9jaygmbXRrZC0+bG9jayk7CisJCXRhc2tsZXRfc2NoZWR1bGUoJm10a2Qt PnRhc2spOworCX0KK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV9yZXNldChzdHJ1Y3QgbXRrX2No YW4gKmMpCit7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2QgPSB0b19tdGtfZG1hX2RldihjLT52 Yy5jaGFuLmRldmljZSk7CisJdTMyIHN0YXR1czsKKwlpbnQgcmV0OworCisJbXRrX2RtYV9jaGFu X3dyaXRlKGMsIFZGRl9BRERSLCAwKTsKKwltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX1RIUkUs IDApOworCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfTEVOLCAwKTsKKwltdGtfZG1hX2NoYW5f d3JpdGUoYywgVkZGX1JTVCwgVkZGX1dBUk1fUlNUX0IpOworCisJcmV0ID0gcmVhZHhfcG9sbF90 aW1lb3V0KHJlYWRsLAorCQkJCSBjLT5iYXNlICsgVkZGX0VOLAorCQkJCSBzdGF0dXMsIHN0YXR1 cyA9PSAwLCAxMCwgMTAwKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoYy0+dmMuY2hhbi5kZXZp Y2UtPmRldiwKKwkJCQkiZG1hIHJlc2V0OiBmYWlsLCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuOwor CX0KKworCWlmIChjLT5jZmcuZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKQorCQltdGtfZG1h X2NoYW5fd3JpdGUoYywgVkZGX1JQVCwgMCk7CisJZWxzZSBpZiAoYy0+Y2ZnLmRpcmVjdGlvbiA9 PSBETUFfTUVNX1RPX0RFVikKKwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9XUFQsIDApOwor CisJaWYgKG10a2QtPnN1cHBvcnRfMzNiaXRzKQorCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZG XzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0NMUl9CKTsKK30KKworc3RhdGljIHZvaWQgbXRr X2RtYV9zdG9wKHN0cnVjdCBtdGtfY2hhbiAqYykKK3sKKwl1MzIgc3RhdHVzOworCWludCByZXQ7 CisKKwltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0ZMVVNILCBWRkZfRkxVU0hfQ0xSX0IpOwor CS8qIFdhaXQgZm9yIGZsdXNoICovCisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRsLAor CQkJCSBjLT5iYXNlICsgVkZGX0ZMVVNILAorCQkJCSBzdGF0dXMsCisJCQkJIChzdGF0dXMgJiBW RkZfRkxVU0hfQikgIT0gVkZGX0ZMVVNIX0IsCisJCQkJIDEwLCAxMDApOworCWlmIChyZXQpCisJ CWRldl9lcnIoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwKKwkJCSJkbWEgc3RvcDogcG9sbGluZyBG TFVTSCBmYWlsLCBERUJVRz0weCV4XG4iLAorCQkJbXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX0RF QlVHX1NUQVRVUykpOworCisJLypzZXQgc3RvcCBhcyAxIC0+IHdhaXQgdW50aWwgZW4gaXMgMCAt PiBzZXQgc3RvcCBhcyAwKi8KKwltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX1NUT1AsIFZGRl9T VE9QX0IpOworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwKKwkJCQkgYy0+YmFzZSAr IFZGRl9FTiwKKwkJCQkgc3RhdHVzLCBzdGF0dXMgPT0gMCwgMTAsIDEwMCk7CisJaWYgKHJldCkK KwkJZGV2X2VycihjLT52Yy5jaGFuLmRldmljZS0+ZGV2LAorCQkJImRtYSBzdG9wOiBwb2xsaW5n IFZGRl9FTiBmYWlsLCBERUJVRz0weCV4XG4iLAorCQkJbXRrX2RtYV9jaGFuX3JlYWQoYywgVkZG X0RFQlVHX1NUQVRVUykpOworCisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9TVE9QLCBWRkZf U1RPUF9DTFJfQik7CisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9JTlRfRU4sIFZGRl9JTlRf RU5fQ0xSX0IpOworCisJaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19NRU0pCisJ CW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9SWF9JTlRfRkxBR19DTFJf Qik7CisJZWxzZQorCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBWRkZfVFhf SU5UX0ZMQUdfQ0xSX0IpOworCisJYy0+c3RvcCA9IHRydWU7Cit9CisKKy8qCisgKiBUaGlzIGNh bGxiYWNrIHNjaGVkdWxlcyBhbGwgcGVuZGluZyBjaGFubmVscy4gV2UgY291bGQgYmUgbW9yZQor ICogY2xldmVyIGhlcmUgYnkgcG9zdHBvbmluZyBhbGxvY2F0aW9uIG9mIHRoZSByZWFsIERNQSBj aGFubmVscyB0bworICogdGhpcyBwb2ludCwgYW5kIGZyZWVpbmcgdGhlbSB3aGVuIG91ciB2aXJ0 dWFsIGNoYW5uZWwgYmVjb21lcyBpZGxlLgorICoKKyAqIFdlIHdvdWxkIHRoZW4gbmVlZCB0byBk ZWFsIHdpdGggJ2FsbCBjaGFubmVscyBpbi11c2UnCisgKi8KK3N0YXRpYyB2b2lkIG10a19kbWFf c2NoZWQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0g KHN0cnVjdCBtdGtfZG1hZGV2ICopZGF0YTsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7CisJ c3RydWN0IG10a19jaGFuICpjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhl YWQpOworCisJc3Bpbl9sb2NrX2lycSgmbXRrZC0+bG9jayk7CisJbGlzdF9zcGxpY2VfdGFpbF9p bml0KCZtdGtkLT5wZW5kaW5nLCAmaGVhZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZtdGtkLT5sb2Nr KTsKKworCWlmICghbGlzdF9lbXB0eSgmaGVhZCkpIHsKKwkJYyA9IGxpc3RfZmlyc3RfZW50cnko JmhlYWQsIHN0cnVjdCBtdGtfY2hhbiwgbm9kZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmMt PnZjLmxvY2ssIGZsYWdzKTsKKwkJaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19N RU0pIHsKKwkJCWxpc3RfZGVsX2luaXQoJmMtPm5vZGUpOworCQkJbXRrX2RtYV9zdGFydF9yeChj KTsKKwkJfSBlbHNlIGlmIChjLT5jZmcuZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKSB7CisJ CQl2ZCA9IHZjaGFuX25leHRfZGVzYygmYy0+dmMpOworCQkJYy0+ZGVzYyA9IHRvX210a19kbWFf ZGVzYygmdmQtPnR4KTsKKwkJCWxpc3RfZGVsX2luaXQoJmMtPm5vZGUpOworCQkJbXRrX2RtYV9z dGFydF90eChjKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBm bGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IG10a19kbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMo c3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gdG9f bXRrX2RtYV9kZXYoY2hhbi0+ZGV2aWNlKTsKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtf ZG1hX2NoYW4oY2hhbik7CisJaW50IHJldCA9IC1FQlVTWTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5 bmMobXRrZC0+ZGRldi5kZXYpOworCisJaWYgKCFtdGtkLT5jaFtjaGFuLT5jaGFuX2lkXSkgewor CQljLT5iYXNlID0gbXRrZC0+bWVtX2Jhc2VbY2hhbi0+Y2hhbl9pZF07CisJCW10a2QtPmNoW2No YW4tPmNoYW5faWRdID0gYzsKKwkJcmV0ID0gMTsKKwl9CisJYy0+cmVxdWVzdGVkID0gZmFsc2U7 CisJbXRrX2RtYV9yZXNldChjKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG10 a19kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3Ry dWN0IG10a19kbWFkZXYgKm10a2QgPSB0b19tdGtfZG1hX2RldihjaGFuLT5kZXZpY2UpOworCXN0 cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKworCWlmIChjLT5yZXF1 ZXN0ZWQpIHsKKwkJYy0+cmVxdWVzdGVkID0gZmFsc2U7CisJCWZyZWVfaXJxKG10a2QtPmRtYV9p cnFbY2hhbi0+Y2hhbl9pZF0sIGNoYW4pOworCX0KKworCXRhc2tsZXRfa2lsbCgmbXRrZC0+dGFz ayk7CisJdGFza2xldF9raWxsKCZjLT52Yy50YXNrKTsKKworCWMtPmJhc2UgPSBOVUxMOworCW10 a2QtPmNoW2NoYW4tPmNoYW5faWRdID0gTlVMTDsKKwl2Y2hhbl9mcmVlX2NoYW5fcmVzb3VyY2Vz KCZjLT52Yyk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKG10a2QtPmRkZXYuZGV2KTsKK30KKwor c3RhdGljIGVudW0gZG1hX3N0YXR1cyBtdGtfZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4g KmNoYW4sCisJCQkJCSBkbWFfY29va2llX3QgY29va2llLAorCQkJCQkgc3RydWN0IGRtYV90eF9z dGF0ZSAqdHhzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfZG1hX2NoYW4o Y2hhbik7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ aWYgKCF0eHN0YXRlKQorCQlyZXR1cm4gRE1BX0VSUk9SOworCisJcmV0ID0gZG1hX2Nvb2tpZV9z dGF0dXMoY2hhbiwgY29va2llLCB0eHN0YXRlKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMu bG9jaywgZmxhZ3MpOworCWlmIChyZXQgPT0gRE1BX0lOX1BST0dSRVNTKSB7CisJCWMtPnJ4X3N0 YXR1cyA9IG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9SUFQpCisJCQkgICAgICYgTVRLX0RNQV9S SU5HX1NJWkU7CisJCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCBjLT5yeF9zdGF0dXMpOworCX0g ZWxzZSBpZiAocmV0ID09IERNQV9DT01QTEVURSAmJiBjLT5jZmcuZGlyZWN0aW9uID09IERNQV9E RVZfVE9fTUVNKSB7CisJCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCBjLT5yeF9zdGF0dXMpOwor CX0gZWxzZSB7CisJCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCAwKTsKKwl9CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwor c3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqbXRrX2RtYV9wcmVwX3NsYXZl X3NnCisJKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJ dW5zaWduZWQgaW50IHNnbGVuLAllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCXVu c2lnbmVkIGxvbmcgdHhfZmxhZ3MsIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG10a19jaGFu ICpjID0gdG9fbXRrX2RtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dlbnQ7 CisJc3RydWN0IG10a19kbWFfZGVzYyAqZDsKKwlzdHJ1Y3QgbXRrX2RtYV9zZyAqc2c7CisJdW5z aWduZWQgaW50IHNpemUsIGksIGosIGVuOworCisJZW4gPSAxOworCisJaWYgKChkaXIgIT0gRE1B X0RFVl9UT19NRU0pICYmCisJCShkaXIgIT0gRE1BX01FTV9UT19ERVYpKSB7CisJCWRldl9lcnIo Y2hhbi0+ZGV2aWNlLT5kZXYsICJiYWQgZGlyZWN0aW9uXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJ fQorCisJLyogTm93IGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgZGVzY3JpcHRvci4gKi8KKwlkID0g a3phbGxvYyhzaXplb2YoKmQpICsgc2dsZW4gKiBzaXplb2YoZC0+c2dbMF0pLCBHRlBfQVRPTUlD KTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCisJZC0+ZGlyID0gZGlyOworCisJaiA9IDA7 CisJZm9yX2VhY2hfc2coc2dsLCBzZ2VudCwgc2dsZW4sIGkpIHsKKwkJZC0+c2dbal0uYWRkciA9 IHNnX2RtYV9hZGRyZXNzKHNnZW50KTsKKwkJZC0+c2dbal0uZW4gPSBlbjsKKwkJZC0+c2dbal0u Zm4gPSBzZ19kbWFfbGVuKHNnZW50KSAvIGVuOworCQlqKys7CisJfQorCisJZC0+c2dsZW4gPSBq OworCisJaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQlmb3IgKHNpemUgPSBpID0gMDsg aSA8IGQtPnNnbGVuOyBpKyspIHsKKwkJCXNnID0gJmQtPnNnW2ldOworCQkJc2l6ZSArPSBzZy0+ ZW4gKiBzZy0+Zm47CisJCX0KKwkJZC0+bGVuID0gc2l6ZTsKKwl9CisKKwlyZXR1cm4gdmNoYW5f dHhfcHJlcCgmYy0+dmMsICZkLT52ZCwgdHhfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtdGtf ZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtdGtf Y2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAq dmQ7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2Q7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJaWYgKGMtPmNmZy5kaXJl Y3Rpb24gPT0gRE1BX0RFVl9UT19NRU0pIHsKKwkJbXRrZCA9IHRvX210a19kbWFfZGV2KGNoYW4t PmRldmljZSk7CisJCWlmICh2Y2hhbl9pc3N1ZV9wZW5kaW5nKCZjLT52YykgJiYgIWMtPmRlc2Mp IHsKKwkJCXZkID0gdmNoYW5fbmV4dF9kZXNjKCZjLT52Yyk7CisJCQljLT5kZXNjID0gdG9fbXRr X2RtYV9kZXNjKCZ2ZC0+dHgpOworCQl9CisJfSBlbHNlIGlmIChjLT5jZmcuZGlyZWN0aW9uID09 IERNQV9NRU1fVE9fREVWKSB7CisJCWlmICh2Y2hhbl9pc3N1ZV9wZW5kaW5nKCZjLT52YykgJiYg IWMtPmRlc2MpIHsKKwkJCXZkID0gdmNoYW5fbmV4dF9kZXNjKCZjLT52Yyk7CisJCQljLT5kZXNj ID0gdG9fbXRrX2RtYV9kZXNjKCZ2ZC0+dHgpOworCQkJbXRrX2RtYV9zdGFydF90eChjKTsKKwkJ fQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7Cit9CisK K3N0YXRpYyBpcnFyZXR1cm5fdCBtdGtfZG1hX3J4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpk ZXZfaWQpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gKHN0cnVjdCBkbWFfY2hhbiAqKWRl dl9pZDsKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfZG1hX2NoYW4oY2hhbik7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFn cyk7CisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1JYX0lOVF9GTEFH X0NMUl9CKTsKKworCW10a19kbWFfc3RhcnRfcngoYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0 YXRpYyBpcnFyZXR1cm5fdCBtdGtfZG1hX3R4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZf aWQpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gKHN0cnVjdCBkbWFfY2hhbiAqKWRldl9p ZDsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IHRvX210a19kbWFfZGV2KGNoYW4tPmRldmlj ZSk7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX2RtYV9jaGFuKGNoYW4pOworCXN0cnVj dCBtdGtfZG1hX2Rlc2MgKmQgPSBjLT5kZXNjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCWlmIChkLT5sZW4gIT0gMFUp IHsKKwkJbGlzdF9hZGRfdGFpbCgmYy0+bm9kZSwgJm10a2QtPnBlbmRpbmcpOworCQl0YXNrbGV0 X3NjaGVkdWxlKCZtdGtkLT50YXNrKTsKKwl9IGVsc2UgeworCQlsaXN0X2RlbCgmZC0+dmQubm9k ZSk7CisJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOworCX0KKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwltdGtfZG1hX2NoYW5fd3JpdGUoYywg VkZGX0lOVF9GTEFHLCBWRkZfVFhfSU5UX0ZMQUdfQ0xSX0IpOworCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCitzdGF0aWMgaW50IG10a19kbWFfc2xhdmVfY29uZmlnKHN0cnVjdCBkbWFfY2hh biAqY2hhbiwKKwkJCQlzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQoreworCXN0cnVjdCBt dGtfY2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAq bXRrZCA9IHRvX210a19kbWFfZGV2KGMtPnZjLmNoYW4uZGV2aWNlKTsKKwlpbnQgcmV0OworCisJ Yy0+Y2ZnID0gKmNmZzsKKworCWlmIChjZmctPmRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSkg eworCQl1bnNpZ25lZCBpbnQgcnhfbGVuID0gY2ZnLT5zcmNfYWRkcl93aWR0aCAqIDEwMjQ7CisK KwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9BRERSLCBjZmctPnNyY19hZGRyKTsKKwkJbXRr X2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9MRU4sIHJ4X2xlbik7CisJCW10a19kbWFfY2hhbl93cml0 ZShjLCBWRkZfVEhSRSwgVkZGX1JYX1RIUkUocnhfbGVuKSk7CisJCW10a19kbWFfY2hhbl93cml0 ZShjLAorCQkJCSAgIFZGRl9JTlRfRU4sIFZGRl9SWF9JTlRfRU4wX0IKKwkJCQkgICB8IFZGRl9S WF9JTlRfRU4xX0IpOworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBWRkZf UlhfSU5UX0ZMQUdfQ0xSX0IpOworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0VOLCBWRkZf RU5fQik7CisKKwkJaWYgKCFjLT5yZXF1ZXN0ZWQpIHsKKwkJCWMtPnJlcXVlc3RlZCA9IHRydWU7 CisJCQlyZXQgPSByZXF1ZXN0X2lycShtdGtkLT5kbWFfaXJxW2NoYW4tPmNoYW5faWRdLAorCQkJ CQkgIG10a19kbWFfcnhfaW50ZXJydXB0LAorCQkJCQkgIElSUUZfVFJJR0dFUl9OT05FLAorCQkJ CQkgIEtCVUlMRF9NT0ROQU1FLCBjaGFuKTsKKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJZGV2X2Vy cihjaGFuLT5kZXZpY2UtPmRldiwgIkNhbid0IHJlcXVlc3QgcnggZG1hIElSUVxuIik7CisJCQkJ cmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGNmZy0+ZGlyZWN0aW9uID09 IERNQV9NRU1fVE9fREVWKQl7CisJCXVuc2lnbmVkIGludCB0eF9sZW4gPSBjZmctPmRzdF9hZGRy X3dpZHRoICogMTAyNDsKKworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0FERFIsIGNmZy0+ ZHN0X2FkZHIpOworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0xFTiwgdHhfbGVuKTsKKwkJ bXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9USFJFLCBWRkZfVFhfVEhSRSh0eF9sZW4pKTsKKwkJ bXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1RYX0lOVF9GTEFHX0NMUl9C KTsKKwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9FTiwgVkZGX0VOX0IpOworCisJCWlmICgh Yy0+cmVxdWVzdGVkKSB7CisJCQljLT5yZXF1ZXN0ZWQgPSB0cnVlOworCQkJcmV0ID0gcmVxdWVz dF9pcnEobXRrZC0+ZG1hX2lycVtjaGFuLT5jaGFuX2lkXSwKKwkJCQkJICBtdGtfZG1hX3R4X2lu dGVycnVwdCwKKwkJCQkJICBJUlFGX1RSSUdHRVJfTk9ORSwKKwkJCQkJICBLQlVJTERfTU9ETkFN RSwgY2hhbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5k ZXYsICJDYW4ndCByZXF1ZXN0IHR4IGRtYSBJUlFcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOwor CQkJfQorCQl9CisJfQorCisJaWYgKG10a2QtPnN1cHBvcnRfMzNiaXRzKQorCQltdGtfZG1hX2No YW5fd3JpdGUoYywgVkZGXzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0IpOworCisJaWYgKG10 a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9FTikgIT0gVkZGX0VOX0IpIHsKKwkJZGV2X2VycihjaGFu LT5kZXZpY2UtPmRldiwKKwkJCSJjb25maWcgZG1hIGRpclslZF0gZmFpbFxuIiwgY2ZnLT5kaXJl Y3Rpb24pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBtdGtfZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0 cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwlsaXN0 X2RlbF9pbml0KCZjLT5ub2RlKTsKKwltdGtfZG1hX3N0b3AoYyk7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgbXRrX2RtYV9kZXZpY2VfcGF1c2Uoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCS8qIGp1 c3QgZm9yIGNoZWNrIGNhcHMgcGFzcyAqLworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMg aW50IG10a19kbWFfZGV2aWNlX3Jlc3VtZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJLyog anVzdCBmb3IgY2hlY2sgY2FwcyBwYXNzICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRp YyB2b2lkIG10a19kbWFfZnJlZShzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCkKK3sKKwl0YXNrbGV0 X2tpbGwoJm10a2QtPnRhc2spOworCXdoaWxlIChsaXN0X2VtcHR5KCZtdGtkLT5kZGV2LmNoYW5u ZWxzKSA9PSAwKSB7CisJCXN0cnVjdCBtdGtfY2hhbiAqYyA9IGxpc3RfZmlyc3RfZW50cnkoJm10 a2QtPmRkZXYuY2hhbm5lbHMsCisJCQlzdHJ1Y3QgbXRrX2NoYW4sIHZjLmNoYW4uZGV2aWNlX25v ZGUpOworCisJCWxpc3RfZGVsKCZjLT52Yy5jaGFuLmRldmljZV9ub2RlKTsKKwkJdGFza2xldF9r aWxsKCZjLT52Yy50YXNrKTsKKwkJZGV2bV9rZnJlZShtdGtkLT5kZGV2LmRldiwgYyk7CisJfQor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfdWFydF9kbWFfbWF0Y2hb XSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10NjU3Ny11YXJ0LWRtYSIsIH0sCisJ eyAvKiBzZW50aW5lbCAqLyB9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10a191YXJ0 X2RtYV9tYXRjaCk7CisKK3N0YXRpYyBpbnQgbXRrX2FwZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2Q7CisJc3RydWN0IHJl c291cmNlICpyZXM7CisJc3RydWN0IG10a19jaGFuICpjOworCXVuc2lnbmVkIGludCBpOworCWlu dCByYzsKKworCW10a2QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptdGtkKSwg R0ZQX0tFUk5FTCk7CisJaWYgKCFtdGtkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9 IDA7IGkgPCBNVEtfQVBETUFfQ0hBTk5FTFM7IGkrKykgeworCQlyZXMgPSBwbGF0Zm9ybV9nZXRf cmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIGkpOworCQlpZiAoIXJlcykKKwkJCXJldHVy biAtRU5PREVWOworCQltdGtkLT5tZW1fYmFzZVtpXSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgm cGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNfRVJSKG10a2QtPm1lbV9iYXNlW2ldKSkKKwkJCXJl dHVybiBQVFJfRVJSKG10a2QtPm1lbV9iYXNlW2ldKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwg TVRLX0FQRE1BX0NIQU5ORUxTOyBpKyspIHsKKwkJbXRrZC0+ZG1hX2lycVtpXSA9IHBsYXRmb3Jt X2dldF9pcnEocGRldiwgaSk7CisJCWlmICgoaW50KW10a2QtPmRtYV9pcnFbaV0gPCAwKSB7CisJ CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IElSUVslZF1cbiIsIGkpOworCQkJ cmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwltdGtkLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBk ZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihtdGtkLT5jbGspKSB7CisJCWRldl9lcnIoJnBk ZXYtPmRldiwgIk5vIGNsb2NrIHNwZWNpZmllZFxuIik7CisJCXJldHVybiBQVFJfRVJSKG10a2Qt PmNsayk7CisJfQorCisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfYm9vbChwZGV2LT5kZXYub2Zfbm9k ZSwgImRtYS0zM2JpdHMiKSkgeworCQlkZXZfaW5mbygmcGRldi0+ZGV2LCAiU3VwcG9ydCBkbWEg MzNiaXRzXG4iKTsKKwkJbXRrZC0+c3VwcG9ydF8zM2JpdHMgPSB0cnVlOworCX0KKworCWlmICht dGtkLT5zdXBwb3J0XzMzYml0cykKKwkJcmMgPSBkbWFfc2V0X21hc2tfYW5kX2NvaGVyZW50KCZw ZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMykpOworCWVsc2UKKwkJcmMgPSBkbWFfc2V0X21hc2tf YW5kX2NvaGVyZW50KCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChyYykKKwkJ cmV0dXJuIHJjOworCisJZG1hX2NhcF9zZXQoRE1BX1NMQVZFLCBtdGtkLT5kZGV2LmNhcF9tYXNr KTsKKwltdGtkLT5kZGV2LmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IG10a19kbWFfYWxs b2NfY2hhbl9yZXNvdXJjZXM7CisJbXRrZC0+ZGRldi5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNl cyA9IG10a19kbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwltdGtkLT5kZGV2LmRldmljZV90eF9z dGF0dXMgPSBtdGtfZG1hX3R4X3N0YXR1czsKKwltdGtkLT5kZGV2LmRldmljZV9pc3N1ZV9wZW5k aW5nID0gbXRrX2RtYV9pc3N1ZV9wZW5kaW5nOworCW10a2QtPmRkZXYuZGV2aWNlX3ByZXBfc2xh dmVfc2cgPSBtdGtfZG1hX3ByZXBfc2xhdmVfc2c7CisJbXRrZC0+ZGRldi5kZXZpY2VfY29uZmln ID0gbXRrX2RtYV9zbGF2ZV9jb25maWc7CisJbXRrZC0+ZGRldi5kZXZpY2VfcGF1c2UgPSBtdGtf ZG1hX2RldmljZV9wYXVzZTsKKwltdGtkLT5kZGV2LmRldmljZV9yZXN1bWUgPSBtdGtfZG1hX2Rl dmljZV9yZXN1bWU7CisJbXRrZC0+ZGRldi5kZXZpY2VfdGVybWluYXRlX2FsbCA9IG10a19kbWFf dGVybWluYXRlX2FsbDsKKwltdGtkLT5kZGV2LnNyY19hZGRyX3dpZHRocyA9IEJJVChETUFfU0xB VkVfQlVTV0lEVEhfMV9CWVRFKTsKKwltdGtkLT5kZGV2LmRzdF9hZGRyX3dpZHRocyA9IEJJVChE TUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFKTsKKwltdGtkLT5kZGV2LmRpcmVjdGlvbnMgPSBCSVQo RE1BX0RFVl9UT19NRU0pIHwgQklUKERNQV9NRU1fVE9fREVWKTsKKwltdGtkLT5kZGV2LnJlc2lk dWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9TRUdNRU5UOworCW10a2Qt PmRkZXYuZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmbXRrZC0+ZGRldi5jaGFu bmVscyk7CisJSU5JVF9MSVNUX0hFQUQoJm10a2QtPnBlbmRpbmcpOworCisJc3Bpbl9sb2NrX2lu aXQoJm10a2QtPmxvY2spOworCXRhc2tsZXRfaW5pdCgmbXRrZC0+dGFzaywgbXRrX2RtYV9zY2hl ZCwgKHVuc2lnbmVkIGxvbmcpbXRrZCk7CisKKwltdGtkLT5kbWFfcmVxdWVzdHMgPSBNVEtfQVBE TUFfREVGQVVMVF9SRVFVRVNUUzsKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIocGRldi0+ZGV2 Lm9mX25vZGUsCisJCQkJICJkbWEtcmVxdWVzdHMiLCAmbXRrZC0+ZG1hX3JlcXVlc3RzKSkgewor CQlkZXZfaW5mbygmcGRldi0+ZGV2LAorCQkJICJNaXNzaW5nIGRtYS1yZXF1ZXN0cyBwcm9wZXJ0 eSwgdXNpbmcgJXUuXG4iLAorCQkJIE1US19BUERNQV9ERUZBVUxUX1JFUVVFU1RTKTsKKwl9CisK Kwlmb3IgKGkgPSAwOyBpIDwgTVRLX0FQRE1BX0NIQU5ORUxTOyBpKyspIHsKKwkJYyA9IGRldm1f a3phbGxvYyhtdGtkLT5kZGV2LmRldiwgc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICgh YykKKwkJCWdvdG8gZXJyX25vX2RtYTsKKworCQljLT52Yy5kZXNjX2ZyZWUgPSBtdGtfZG1hX2Rl c2NfZnJlZTsKKwkJdmNoYW5faW5pdCgmYy0+dmMsICZtdGtkLT5kZGV2KTsKKwkJSU5JVF9MSVNU X0hFQUQoJmMtPm5vZGUpOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOwor CXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKworCXJjID0gZG1hX2FzeW5jX2Rl dmljZV9yZWdpc3RlcigmbXRrZC0+ZGRldik7CisJaWYgKHJjKQorCQlnb3RvIHJwbV9kaXNhYmxl OworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbXRrZCk7CisKKwlpZiAocGRldi0+ZGV2 Lm9mX25vZGUpIHsKKwkJLyogRGV2aWNlLXRyZWUgRE1BIGNvbnRyb2xsZXIgcmVnaXN0cmF0aW9u ICovCisJCXJjID0gb2ZfZG1hX2NvbnRyb2xsZXJfcmVnaXN0ZXIocGRldi0+ZGV2Lm9mX25vZGUs CisJCQkJCQlvZl9kbWFfeGxhdGVfYnlfY2hhbl9pZCwKKwkJCQkJCW10a2QpOworCQlpZiAocmMp CisJCQlnb3RvIGRtYV9yZW1vdmU7CisJfQorCisJcmV0dXJuIHJjOworCitkbWFfcmVtb3ZlOgor CWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmbXRrZC0+ZGRldik7CitycG1fZGlzYWJsZToK KwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CitlcnJfbm9fZG1hOgorCW10a19kbWFf ZnJlZShtdGtkKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2FwZG1hX3JlbW92 ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfZG1hZGV2ICpt dGtkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAocGRldi0+ZGV2Lm9mX25v ZGUpCisJCW9mX2RtYV9jb250cm9sbGVyX2ZyZWUocGRldi0+ZGV2Lm9mX25vZGUpOworCisJcG1f cnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRl di0+ZGV2KTsKKworCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmbXRrZC0+ZGRldik7CisK KwltdGtfZG1hX2ZyZWUobXRrZCk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19Q TV9TTEVFUAorc3RhdGljIGludCBtdGtfZG1hX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQor eworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlp ZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCisJCW10a19kbWFfY2xrX2Rpc2FibGUobXRr ZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfZG1hX3Jlc3VtZShzdHJ1Y3Qg ZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IGRl dl9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKSB7 CisJCXJldCA9IG10a19kbWFfY2xrX2VuYWJsZShtdGtkKTsKKwkJaWYgKHJldCkKKwkJCXJldHVy biByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV9ydW50aW1l X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtk ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwltdGtfZG1hX2Nsa19kaXNhYmxlKG10a2QpOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV9ydW50aW1lX3Jlc3VtZShzdHJ1 Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9 IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0ID0gbXRrX2RtYV9jbGtfZW5hYmxlKG10a2Qp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmIC8q IENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbXRr X2RtYV9wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFMobXRrX2RtYV9zdXNwZW5k LCBtdGtfZG1hX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMobXRrX2RtYV9ydW50aW1lX3N1 c3BlbmQsCisJCQkgICBtdGtfZG1hX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworc3RhdGlj IHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbXRrX2RtYV9kcml2ZXIgPSB7CisJLnByb2JlCT0gbXRr X2FwZG1hX3Byb2JlLAorCS5yZW1vdmUJPSBtdGtfYXBkbWFfcmVtb3ZlLAorCS5kcml2ZXIgPSB7 CisJCS5uYW1lCQk9IEtCVUlMRF9NT0ROQU1FLAorCQkucG0JCT0gJm10a19kbWFfcG1fb3BzLAor CQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXRrX3VhcnRfZG1hX21hdGNoKSwKKwl9 LAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtdGtfZG1hX2RyaXZlcik7CisKK01PRFVM RV9ERVNDUklQVElPTigiTWVkaWFUZWsgVUFSVCBBUERNQSBDb250cm9sbGVyIERyaXZlciIpOwor TU9EVUxFX0FVVEhPUigiTG9uZyBDaGVuZyA8bG9uZy5jaGVuZ0BtZWRpYXRlay5jb20+Iik7CitN T0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlh dGVrL0tjb25maWcgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDI3YmFjMGIu LmJlZjQzNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKKysrIGIv ZHJpdmVycy9kbWEvbWVkaWF0ZWsvS2NvbmZpZwpAQCAtMSw0ICsxLDE1IEBACiAKK2NvbmZpZyBE TUFfTVRLX1VBUlQKKwl0cmlzdGF0ZSAiTWVkaWFUZWsgU29DcyBBUERNQSBzdXBwb3J0IGZvciBV QVJUIgorCWRlcGVuZHMgb24gT0YKKwlzZWxlY3QgRE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklS VFVBTF9DSEFOTkVMUworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBVQVJUIERNQSBlbmdpbmUg Zm91bmQgb24gTWVkaWFUZWsgTVRLIFNvQ3MuCisJICB3aGVuIDgyNTAgbXRrIHVhcnQgaXMgZW5h YmxlZCwgYW5kIGlmIHlvdSB3YW50IHRvIHVzaW5nIERNQSwKKwkgIHlvdSBjYW4gZW5hYmxlIHRo ZSBjb25maWcuIHRoZSBETUEgZW5naW5lIGp1c3Qgb25seSBiZSB1c2VkCisJICB3aXRoIE1lZGlh VGVrIFNvY3MuCisKIGNvbmZpZyBNVEtfSFNETUEKIAl0cmlzdGF0ZSAiTWVkaWFUZWsgSGlnaC1T cGVlZCBETUEgY29udHJvbGxlciBzdXBwb3J0IgogCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8 fCBDT01QSUxFX1RFU1QKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxl IGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUKaW5kZXggNmU3NzhmOC4uMmYyZWZkOSAx MDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9k bWEvbWVkaWF0ZWsvTWFrZWZpbGUKQEAgLTEgKzEsMiBAQAorb2JqLSQoQ09ORklHX0RNQV9NVEtf VUFSVCkgKz0gODI1MF9tdGtfZG1hLm8KIG9iai0kKENPTkZJR19NVEtfSFNETUEpICs9IG10ay1o c2RtYS5vCg==