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: <1551923135-32479-2-git-send-email-long.cheng@mediatek.com> Date: Thu, 7 Mar 2019 09:45:32 +0800 To: Vinod Koul , Randy Dunlap , Rob Herring , Mark Rutland , Ryder Lee , Sean Wang , Nicolas Boichat , Matthias Brugger Cc: Dan Williams , Greg Kroah-Hartman , Jiri Slaby , 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 , Zhenbao Liu , Long Cheng List-ID: SW4gRE1BIGVuZ2luZSBmcmFtZXdvcmssIGFkZCA4MjUwIHVhcnQgZG1hIHRvIHN1cHBvcnQgTWVk aWFUZWsgdWFydC4KSWYgTWVkaWFUZWsgdWFydCBlbmFibGVkKFNFUklBTF84MjUwX01UNjU3Nyks IGFuZCB3YW50IHRvIGltcHJvdmUKdGhlIHBlcmZvcm1hbmNlLCBjYW4gZW5hYmxlIHRoZSBmdW5j dGlvbi4KClNpZ25lZC1vZmYtYnk6IExvbmcgQ2hlbmcgPGxvbmcuY2hlbmdAbWVkaWF0ZWsuY29t PgotLS0KIGRyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcgICAgICAgICAgfCAgIDExICsKIGRy aXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlICAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZG1h L21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMgfCAgNjYwICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA2NzIgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZG1hL21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsv S2NvbmZpZwppbmRleCA2ODBmYzA1Li5hYzQ5ZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9t ZWRpYXRlay9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKQEAgLTI0 LDMgKzI0LDE0IEBAIGNvbmZpZyBNVEtfQ1FETUEKIAogCSAgVGhpcyBjb250cm9sbGVyIHByb3Zp ZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8KIAkgIG1lbW9yeS10by1tZW1v cnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVS4KKworY29uZmlnIE1US19VQVJUX0FQRE1B CisJdHJpc3RhdGUgIk1lZGlhVGVrIFNvQ3MgQVBETUEgc3VwcG9ydCBmb3IgVUFSVCIKKwlkZXBl bmRzIG9uIE9GICYmIFNFUklBTF84MjUwX01UNjU3NworCXNlbGVjdCBETUFfRU5HSU5FCisJc2Vs ZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFVBUlQg RE1BIGVuZ2luZSBmb3VuZCBvbiBNZWRpYVRlayBNVEsgU29Dcy4KKwkgIFdoZW4gU0VSSUFMXzgy NTBfTVQ2NTc3IGlzIGVuYWJsZWQsIGFuZCBpZiB5b3Ugd2FudCB0byB1c2UgRE1BLAorCSAgeW91 IGNhbiBlbmFibGUgdGhlIGNvbmZpZy4gVGhlIERNQSBlbmdpbmUgY2FuIG9ubHkgYmUgdXNlZAor CSAgd2l0aCBNZWRpYVRlayBTb0NzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsv TWFrZWZpbGUgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQppbmRleCA0MWJiMzgxLi42 MWE2ZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQorKysgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKK29iai0kKENPTkZJ R19NVEtfVUFSVF9BUERNQSkgKz0gbXRrLXVhcnQtYXBkbWEubwogb2JqLSQoQ09ORklHX01US19I U0RNQSkgKz0gbXRrLWhzZG1hLm8KIG9iai0kKENPTkZJR19NVEtfQ1FETUEpICs9IG10ay1jcWRt YS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstdWFydC1hcGRtYS5jIGIv ZHJpdmVycy9kbWEvbWVkaWF0ZWsvbXRrLXVhcnQtYXBkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi45ZWQ3YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEv bWVkaWF0ZWsvbXRrLXVhcnQtYXBkbWEuYwpAQCAtMCwwICsxLDY2MCBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBNZWRpYVRlayBVYXJ0IEFQRE1BIGRyaXZl ci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBM b25nIENoZW5nIDxsb25nLmNoZW5nQG1lZGlhdGVrLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGlu dXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5naW5lLmg+CisjaW5jbHVkZSA8bGludXgv ZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9p bml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9w b2xsLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5o PgorI2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9z bGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgIi4uL3ZpcnQt ZG1hLmgiCisKKy8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiB2aXJ0dWFsIGNoYW5uZWwgKi8KKyNk ZWZpbmUgTVRLX1VBUlRfQVBETUFfTlJfVkNIQU5TCTgKKworI2RlZmluZSBWRkZfRU5fQgkJQklU KDApCisjZGVmaW5lIFZGRl9TVE9QX0IJCUJJVCgwKQorI2RlZmluZSBWRkZfRkxVU0hfQgkJQklU KDApCisjZGVmaW5lIFZGRl80R19TVVBQT1JUX0IJQklUKDApCisjZGVmaW5lIFZGRl9SWF9JTlRf RU4wX0IJQklUKDApCS8qIHJ4IHZhbGlkIHNpemUgPj0gIHZmZiB0aHJlICovCisjZGVmaW5lIFZG Rl9SWF9JTlRfRU4xX0IJQklUKDEpCisjZGVmaW5lIFZGRl9UWF9JTlRfRU5fQgkJQklUKDApCS8q IHR4IGxlZnQgc2l6ZSA+PSB2ZmYgdGhyZSAqLworI2RlZmluZSBWRkZfV0FSTV9SU1RfQgkJQklU KDApCisjZGVmaW5lIFZGRl9SWF9JTlRfQ0xSX0IJKEJJVCgwKSB8IEJJVCgxKSkKKyNkZWZpbmUg VkZGX1RYX0lOVF9DTFJfQgkwCisjZGVmaW5lIFZGRl9TVE9QX0NMUl9CCQkwCisjZGVmaW5lIFZG Rl9JTlRfRU5fQ0xSX0IJMAorI2RlZmluZSBWRkZfNEdfU1VQUE9SVF9DTFJfQgkwCisKKy8qIGlu dGVycnVwdCB0cmlnZ2VyIGxldmVsIGZvciB0eCAqLworI2RlZmluZSBWRkZfVFhfVEhSRShuKQkJ KChuKSAqIDcgLyA4KQorLyogaW50ZXJydXB0IHRyaWdnZXIgbGV2ZWwgZm9yIHJ4ICovCisjZGVm aW5lIFZGRl9SWF9USFJFKG4pCQkoKG4pICogMyAvIDQpCisKKyNkZWZpbmUgVkZGX1JJTkdfU0la RQkweGZmZmZVCisvKiBpbnZlcnQgdGhpcyBiaXQgd2hlbiB3cmFwIHJpbmcgaGVhZCBhZ2FpbiAq LworI2RlZmluZSBWRkZfUklOR19XUkFQCTB4MTAwMDBVCisKKyNkZWZpbmUgVkZGX0lOVF9GTEFH CQkweDAwCisjZGVmaW5lIFZGRl9JTlRfRU4JCTB4MDQKKyNkZWZpbmUgVkZGX0VOCQkJMHgwOAor I2RlZmluZSBWRkZfUlNUCQkJMHgwYworI2RlZmluZSBWRkZfU1RPUAkJMHgxMAorI2RlZmluZSBW RkZfRkxVU0gJCTB4MTQKKyNkZWZpbmUgVkZGX0FERFIJCTB4MWMKKyNkZWZpbmUgVkZGX0xFTgkJ CTB4MjQKKyNkZWZpbmUgVkZGX1RIUkUJCTB4MjgKKyNkZWZpbmUgVkZGX1dQVAkJCTB4MmMKKyNk ZWZpbmUgVkZGX1JQVAkJCTB4MzAKKy8qIFRYOiB0aGUgYnVmZmVyIHNpemUgSFcgY2FuIHJlYWQu IFJYOiB0aGUgYnVmZmVyIHNpemUgU1cgY2FuIHJlYWQuICovCisjZGVmaW5lIFZGRl9WQUxJRF9T SVpFCQkweDNjCisvKiBUWDogdGhlIGJ1ZmZlciBzaXplIFNXIGNhbiB3cml0ZS4gUlg6IHRoZSBi dWZmZXIgc2l6ZSBIVyBjYW4gd3JpdGUuICovCisjZGVmaW5lIFZGRl9MRUZUX1NJWkUJCTB4NDAK KyNkZWZpbmUgVkZGX0RFQlVHX1NUQVRVUwkweDUwCisjZGVmaW5lIFZGRl80R19TVVBQT1JUCQkw eDU0CisKK3N0cnVjdCBtdGtfdWFydF9hcGRtYWRldiB7CisJc3RydWN0IGRtYV9kZXZpY2UgZGRl djsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJYm9vbCBzdXBwb3J0XzMzYml0czsKKwl1bnNpZ25lZCBp bnQgZG1hX3JlcXVlc3RzOworCXVuc2lnbmVkIGludCAqZG1hX2lycTsKK307CisKK3N0cnVjdCBt dGtfdWFydF9hcGRtYV9kZXNjIHsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyB2ZDsKKworCXVuc2ln bmVkIGludCBhdmFpbF9sZW47Cit9OworCitzdHJ1Y3QgbXRrX2NoYW4geworCXN0cnVjdCB2aXJ0 X2RtYV9jaGFuIHZjOworCXN0cnVjdCBkbWFfc2xhdmVfY29uZmlnCWNmZzsKKwl2b2lkIF9faW9t ZW0gKmJhc2U7CisJc3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2MgKmRlc2M7CisKKwllbnVtIGRt YV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOworCisJYm9vbCByZXF1ZXN0ZWQ7CisKKwl1bnNpZ25l ZCBpbnQgcnhfc3RhdHVzOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX3VhcnRfYXBk bWFkZXYgKgordG9fbXRrX3VhcnRfYXBkbWFfZGV2KHN0cnVjdCBkbWFfZGV2aWNlICpkKQorewor CXJldHVybiBjb250YWluZXJfb2YoZCwgc3RydWN0IG10a191YXJ0X2FwZG1hZGV2LCBkZGV2KTsK K30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX2NoYW4gKnRvX210a191YXJ0X2FwZG1hX2No YW4oc3RydWN0IGRtYV9jaGFuICpjKQoreworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0 IG10a19jaGFuLCB2Yy5jaGFuKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX3VhcnRf YXBkbWFfZGVzYyAqdG9fbXRrX3VhcnRfYXBkbWFfZGVzYworCShzdHJ1Y3QgZG1hX2FzeW5jX3R4 X2Rlc2NyaXB0b3IgKnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih0LCBzdHJ1Y3QgbXRrX3Vh cnRfYXBkbWFfZGVzYywgdmQudHgpOworfQorCitzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV93 cml0ZShzdHJ1Y3QgbXRrX2NoYW4gKmMsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHJlZywgdW5z aWduZWQgaW50IHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjLT5iYXNlICsgcmVnKTsKK30KKworc3Rh dGljIHVuc2lnbmVkIGludCBtdGtfdWFydF9hcGRtYV9yZWFkKHN0cnVjdCBtdGtfY2hhbiAqYywg dW5zaWduZWQgaW50IHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoYy0+YmFzZSArIHJlZyk7Cit9CisK K3N0YXRpYyB2b2lkIG10a191YXJ0X2FwZG1hX2Rlc2NfZnJlZShzdHJ1Y3QgdmlydF9kbWFfZGVz YyAqdmQpCit7CisJc3RydWN0IGRtYV9jaGFuICpjaGFuID0gdmQtPnR4LmNoYW47CisJc3RydWN0 IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hhbihjaGFuKTsKKworCWtmcmVlKGMt PmRlc2MpOworfQorCitzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV9zdGFydF90eChzdHJ1Y3Qg bXRrX2NoYW4gKmMpCit7CisJdW5zaWduZWQgaW50IGxlbiwgc2VuZCwgbGVmdCwgd3B0LCBkX3dw dCwgdG1wOworCWludCByZXQ7CisKKwlsZWZ0ID0gbXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZf TEVGVF9TSVpFKTsKKwlpZiAoIWxlZnQpIHsKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZG X0lOVF9FTiwgVkZGX1RYX0lOVF9FTl9CKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdhaXQgMXNl YyBmb3IgZmx1c2gsIGNhbid0IHNsZWVwICovCisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJl YWRsLCBjLT5iYXNlICsgVkZGX0ZMVVNILCB0bXAsCisJCQl0bXAgIT0gVkZGX0ZMVVNIX0IsIDAs IDEwMDAwMDApOworCWlmIChyZXQpCisJCWRldl93YXJuKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYs ICJ0eDogZmFpbCwgZGVidWc9MHgleFxuIiwKKwkJCW10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZG X0RFQlVHX1NUQVRVUykpOworCisJc2VuZCA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVmdCwgYy0+ ZGVzYy0+YXZhaWxfbGVuKTsKKwl3cHQgPSBtdGtfdWFydF9hcGRtYV9yZWFkKGMsIFZGRl9XUFQp OworCWxlbiA9IGMtPmNmZy5kc3RfcG9ydF93aW5kb3dfc2l6ZTsKKworCWRfd3B0ID0gd3B0ICsg c2VuZDsKKwlpZiAoKGRfd3B0ICYgVkZGX1JJTkdfU0laRSkgPj0gbGVuKSB7CisJCWRfd3B0ID0g ZF93cHQgLSBsZW47CisJCWRfd3B0ID0gZF93cHQgXiBWRkZfUklOR19XUkFQOworCX0KKwltdGtf dWFydF9hcGRtYV93cml0ZShjLCBWRkZfV1BULCBkX3dwdCk7CisKKwljLT5kZXNjLT5hdmFpbF9s ZW4gLT0gc2VuZDsKKworCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9JTlRfRU4sIFZGRl9U WF9JTlRfRU5fQik7CisJaWYgKG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0ZMVVNIKSA9PSAw VSkKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0ZMVVNILCBWRkZfRkxVU0hfQik7Cit9 CisKK3N0YXRpYyB2b2lkIG10a191YXJ0X2FwZG1hX3N0YXJ0X3J4KHN0cnVjdCBtdGtfY2hhbiAq YykKK3sKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFfZGVzYyAqZCA9IGMtPmRlc2M7CisJdW5zaWdu ZWQgaW50IGxlbiwgd2csIHJnOworCWludCBjbnQ7CisKKwlpZiAoKG10a191YXJ0X2FwZG1hX3Jl YWQoYywgVkZGX1ZBTElEX1NJWkUpID09IDBVKSB8fAorCQkhZCB8fCAhdmNoYW5fbmV4dF9kZXNj KCZjLT52YykpCisJCXJldHVybjsKKworCWxlbiA9IGMtPmNmZy5zcmNfcG9ydF93aW5kb3dfc2l6 ZTsKKwlyZyA9IG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX1JQVCk7CisJd2cgPSBtdGtfdWFy dF9hcGRtYV9yZWFkKGMsIFZGRl9XUFQpOworCWNudCA9ICh3ZyAmIFZGRl9SSU5HX1NJWkUpIC0g KHJnICYgVkZGX1JJTkdfU0laRSk7CisJLyoKKwkgKiBUaGUgYnVmZmVyIGlzIHJpbmcgYnVmZmVy LiBJZiB3cmFwIGJpdCBkaWZmZXJlbnQsCisJICogcmVwcmVzZW50cyB0aGUgc3RhcnQgb2YgdGhl IG5leHQgY3ljbGUgZm9yIFdQVAorCSAqLworCWlmICgocmcgXiB3ZykgJiBWRkZfUklOR19XUkFQ KQorCQljbnQgKz0gbGVuOworCisJYy0+cnhfc3RhdHVzID0gZC0+YXZhaWxfbGVuIC0gY250Owor CW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9SUFQsIHdnKTsKKworCWxpc3RfZGVsKCZkLT52 ZC5ub2RlKTsKKwl2Y2hhbl9jb29raWVfY29tcGxldGUoJmQtPnZkKTsKK30KKworc3RhdGljIGly cXJldHVybl90IG10a191YXJ0X2FwZG1hX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9p ZCkKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSAoc3RydWN0IGRtYV9jaGFuICopZGV2X2lk OworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7CisJ c3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2MgKmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJaWYgKGMtPmRpciA9PSBE TUFfREVWX1RPX01FTSkgeworCQltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0ZMQUcs IFZGRl9SWF9JTlRfQ0xSX0IpOworCQltdGtfdWFydF9hcGRtYV9zdGFydF9yeChjKTsKKwl9IGVs c2UgaWYgKGMtPmRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQlkID0gYy0+ZGVzYzsKKworCQlt dGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9UWF9JTlRfQ0xSX0IpOwor CisJCWlmIChkLT5hdmFpbF9sZW4gIT0gMFUpIHsKKwkJCW10a191YXJ0X2FwZG1hX3N0YXJ0X3R4 KGMpOworCQl9IGVsc2UgeworCQkJbGlzdF9kZWwoJmQtPnZkLm5vZGUpOworCQkJdmNoYW5fY29v a2llX2NvbXBsZXRlKCZkLT52ZCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm Yy0+dmMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMg aW50IG10a191YXJ0X2FwZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAq Y2hhbikKK3sKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYgKm10a2QgPSB0b19tdGtfdWFydF9h cGRtYV9kZXYoY2hhbi0+ZGV2aWNlKTsKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfdWFy dF9hcGRtYV9jaGFuKGNoYW4pOworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IHJldDsKKworCXBt X3J1bnRpbWVfZ2V0X3N5bmMobXRrZC0+ZGRldi5kZXYpOworCisJbXRrX3VhcnRfYXBkbWFfd3Jp dGUoYywgVkZGX0FERFIsIDApOworCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9USFJFLCAw KTsKKwltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfTEVOLCAwKTsKKwltdGtfdWFydF9hcGRt YV93cml0ZShjLCBWRkZfUlNULCBWRkZfV0FSTV9SU1RfQik7CisKKwlyZXQgPSByZWFkeF9wb2xs X3RpbWVvdXQocmVhZGwsIGMtPmJhc2UgKyBWRkZfRU4sIHRtcCwgIXRtcCwgMTAsIDEwMCk7CisJ aWYgKHJldCkgeworCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiZG1hIHJlc2V0OiBmYWls LCB0aW1lb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWMtPnJlcXVlc3RlZCkg eworCQljLT5yZXF1ZXN0ZWQgPSB0cnVlOworCQlyZXQgPSByZXF1ZXN0X2lycShtdGtkLT5kbWFf aXJxW2NoYW4tPmNoYW5faWRdLAorCQkJCSAgbXRrX3VhcnRfYXBkbWFfaXJxX2hhbmRsZXIsIElS UUZfVFJJR0dFUl9OT05FLAorCQkJCSAgS0JVSUxEX01PRE5BTUUsIGNoYW4pOworCQlpZiAocmV0 IDwgMCkgeworCQkJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgIkNhbid0IHJlcXVlc3QgZG1h IElSUVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChtdGtkLT5zdXBw b3J0XzMzYml0cykKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGXzRHX1NVUFBPUlQsIFZG Rl80R19TVVBQT1JUX0NMUl9CKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG10 a191YXJ0X2FwZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQor eworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9IHRvX210a191YXJ0X2FwZG1hX2Rl dihjaGFuLT5kZXZpY2UpOworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1h X2NoYW4oY2hhbik7CisKKwlpZiAoYy0+cmVxdWVzdGVkKSB7CisJCWMtPnJlcXVlc3RlZCA9IGZh bHNlOworCQlmcmVlX2lycShtdGtkLT5kbWFfaXJxW2NoYW4tPmNoYW5faWRdLCBjaGFuKTsKKwl9 CisKKwl0YXNrbGV0X2tpbGwoJmMtPnZjLnRhc2spOworCisJdmNoYW5fZnJlZV9jaGFuX3Jlc291 cmNlcygmYy0+dmMpOworCisJcG1fcnVudGltZV9wdXRfc3luYyhtdGtkLT5kZGV2LmRldik7Cit9 CisKK3N0YXRpYyBlbnVtIGRtYV9zdGF0dXMgbXRrX3VhcnRfYXBkbWFfdHhfc3RhdHVzKHN0cnVj dCBkbWFfY2hhbiAqY2hhbiwKKwkJCQkJIGRtYV9jb29raWVfdCBjb29raWUsCisJCQkJCSBzdHJ1 Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQoreworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210 a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKworCXJldCA9 IGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7CisKKwlkbWFfc2V0X3Jl c2lkdWUodHhzdGF0ZSwgYy0+cnhfc3RhdHVzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyB2b2lkIG10a191YXJ0X2FwZG1hX2NvbmZpZ193cml0ZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4s CisJCQkgICAgICAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNmZywKKwkJCSAgICAgICBlbnVt IGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRv X210a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IG10a191YXJ0X2FwZG1hZGV2ICpt dGtkID0KKwkJCQl0b19tdGtfdWFydF9hcGRtYV9kZXYoYy0+dmMuY2hhbi5kZXZpY2UpOworCXVu c2lnbmVkIGludCB0bXA7CisKKwlpZiAobXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZfRU4pID09 IFZGRl9FTl9CKQorCQlyZXR1cm47CisKKwljLT5kaXIgPSBkaXI7CisKKwlpZiAoZGlyID09IERN QV9ERVZfVE9fTUVNKSB7CisJCXRtcCA9IGNmZy0+c3JjX3BvcnRfd2luZG93X3NpemU7CisKKwkJ bXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0FERFIsIGNmZy0+c3JjX2FkZHIpOworCQltdGtf dWFydF9hcGRtYV93cml0ZShjLCBWRkZfTEVOLCB0bXApOworCQltdGtfdWFydF9hcGRtYV93cml0 ZShjLCBWRkZfVEhSRSwgVkZGX1JYX1RIUkUodG1wKSk7CisJCW10a191YXJ0X2FwZG1hX3dyaXRl KGMsIFZGRl9JTlRfRU4sCisJCQkJVkZGX1JYX0lOVF9FTjBfQiB8IFZGRl9SWF9JTlRfRU4xX0Ip OworCQltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfUlBULCAwKTsKKwkJbXRrX3VhcnRfYXBk bWFfd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBWRkZfUlhfSU5UX0NMUl9CKTsKKwl9IGVsc2UgaWYg KGRpciA9PSBETUFfTUVNX1RPX0RFVikJeworCQl0bXAgPSBjZmctPmRzdF9wb3J0X3dpbmRvd19z aXplOworCisJCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9BRERSLCBjZmctPmRzdF9hZGRy KTsKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0xFTiwgdG1wKTsKKwkJbXRrX3VhcnRf YXBkbWFfd3JpdGUoYywgVkZGX1RIUkUsIFZGRl9UWF9USFJFKHRtcCkpOworCQltdGtfdWFydF9h cGRtYV93cml0ZShjLCBWRkZfV1BULCAwKTsKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZG X0lOVF9GTEFHLCBWRkZfVFhfSU5UX0NMUl9CKTsKKwl9CisKKwltdGtfdWFydF9hcGRtYV93cml0 ZShjLCBWRkZfRU4sIFZGRl9FTl9CKTsKKworCWlmIChtdGtkLT5zdXBwb3J0XzMzYml0cykKKwkJ bXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGXzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0Ip OworCisJaWYgKG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0VOKSAhPSBWRkZfRU5fQikKKwkJ ZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgImRpclslZF0gZmFpbFxuIiwgZGlyKTsKK30KKwor LyoKKyAqIGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZSB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9u LiBhbmQgc2dsZW4gaXMgMS4KKyAqIDgyNTAgdWFydCB1c2luZyBvbmUgcmluZyBidWZmZXIsIGFu ZCBkZWFsIHdpdGggb25lIHNnLgorICovCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNj cmlwdG9yICptdGtfdWFydF9hcGRtYV9wcmVwX3NsYXZlX3NnCisJKHN0cnVjdCBkbWFfY2hhbiAq Y2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJdW5zaWduZWQgaW50IHNnbGVuLCBlbnVt IGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCXVuc2lnbmVkIGxvbmcgdHhfZmxhZ3MsIHZv aWQgKmNvbnRleHQpCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFf Y2hhbihjaGFuKTsKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFfZGVzYyAqZDsKKworCWlmICghaXNf c2xhdmVfZGlyZWN0aW9uKGRpcikpCisJCXJldHVybiBOVUxMOworCisJbXRrX3VhcnRfYXBkbWFf Y29uZmlnX3dyaXRlKGNoYW4sICZjLT5jZmcsIGRpcik7CisKKwkvKiBOb3cgYWxsb2NhdGUgYW5k IHNldHVwIHRoZSBkZXNjcmlwdG9yICovCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSwgR0ZQX0FU T01JQyk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHNnbGVuIGlzIDEgKi8KKwlk LT5hdmFpbF9sZW4gPSBzZ19kbWFfbGVuKHNnbCk7CisJYy0+cnhfc3RhdHVzID0gZC0+YXZhaWxf bGVuOworCisJcmV0dXJuIHZjaGFuX3R4X3ByZXAoJmMtPnZjLCAmZC0+dmQsIHR4X2ZsYWdzKTsK K30KKworc3RhdGljIHZvaWQgbXRrX3VhcnRfYXBkbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1h X2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFf Y2hhbihjaGFuKTsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJaWYgKHZj aGFuX2lzc3VlX3BlbmRpbmcoJmMtPnZjKSkgeworCQl2ZCA9IHZjaGFuX25leHRfZGVzYygmYy0+ dmMpOworCQljLT5kZXNjID0gdG9fbXRrX3VhcnRfYXBkbWFfZGVzYygmdmQtPnR4KTsKKwl9CisK KwlpZiAoYy0+ZGlyID09IERNQV9ERVZfVE9fTUVNKQorCQltdGtfdWFydF9hcGRtYV9zdGFydF9y eChjKTsKKwllbHNlIGlmIChjLT5kaXIgPT0gRE1BX01FTV9UT19ERVYpCisJCW10a191YXJ0X2Fw ZG1hX3N0YXJ0X3R4KGMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMubG9jaywg ZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3NsYXZlX2NvbmZpZyhzdHJ1 Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJICAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZp ZykKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfdWFydF9hcGRtYV9jaGFuKGNoYW4p OworCisJbWVtY3B5KCZjLT5jZmcsIGNvbmZpZywgc2l6ZW9mKCpjb25maWcpKTsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3Rlcm1pbmF0ZV9hbGwoc3RydWN0 IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2Fw ZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdG1w OworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOwor CisJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0ZMVVNILCBWRkZfRkxVU0hfQik7CisJLyog V2FpdCAxc2VjIGZvciBmbHVzaCwgY2FuJ3Qgc2xlZXAgKi8KKwlyZXQgPSByZWFkeF9wb2xsX3Rp bWVvdXQocmVhZGwsIGMtPmJhc2UgKyBWRkZfRkxVU0gsIHRtcCwKKwkJCXRtcCAhPSBWRkZfRkxV U0hfQiwgMCwgMTAwMDAwMCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihjLT52Yy5jaGFuLmRldmlj ZS0+ZGV2LCAiZmx1c2g6IGZhaWwsIGRlYnVnPTB4JXhcbiIsCisJCQltdGtfdWFydF9hcGRtYV9y ZWFkKGMsIFZGRl9ERUJVR19TVEFUVVMpKTsKKworCS8qIHNldCBzdG9wIGFzIDEgLT4gd2FpdCB1 bnRpbCBlbiBpcyAwIC0+IHNldCBzdG9wIGFzIDAgKi8KKwltdGtfdWFydF9hcGRtYV93cml0ZShj LCBWRkZfU1RPUCwgVkZGX1NUT1BfQik7CisJcmV0ID0gcmVhZHhfcG9sbF90aW1lb3V0KHJlYWRs LCBjLT5iYXNlICsgVkZGX0VOLCB0bXAsICF0bXAsIDEwLCAxMDApOworCWlmIChyZXQpCisJCWRl dl9lcnIoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwgInN0b3A6IGZhaWwsIGRlYnVnPTB4JXhcbiIs CisJCQltdGtfdWFydF9hcGRtYV9yZWFkKGMsIFZGRl9ERUJVR19TVEFUVVMpKTsKKworCW10a191 YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9TVE9QLCBWRkZfU1RPUF9DTFJfQik7CisJbXRrX3VhcnRf YXBkbWFfd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX0lOVF9FTl9DTFJfQik7CisKKwlpZiAoYy0+ ZGlyID09IERNQV9ERVZfVE9fTUVNKQorCQltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5U X0ZMQUcsIFZGRl9SWF9JTlRfQ0xSX0IpOworCWVsc2UgaWYgKGMtPmRpciA9PSBETUFfTUVNX1RP X0RFVikKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBWRkZfVFhfSU5U X0NMUl9CKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX2RldmljZV9wYXVz ZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJLyoganVzdCBmb3IgY2hlY2sgY2FwcyBwYXNz ICovCisJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgIlBhdXNlIGNhbid0IHN1cHBvcnRcbiIp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a191YXJ0X2FwZG1hX2ZyZWUoc3Ry dWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkKQoreworCXdoaWxlICghbGlzdF9lbXB0eSgmbXRr ZC0+ZGRldi5jaGFubmVscykpIHsKKwkJc3RydWN0IG10a19jaGFuICpjID0gbGlzdF9maXJzdF9l bnRyeSgmbXRrZC0+ZGRldi5jaGFubmVscywKKwkJCXN0cnVjdCBtdGtfY2hhbiwgdmMuY2hhbi5k ZXZpY2Vfbm9kZSk7CisKKwkJbGlzdF9kZWwoJmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOworCQl0 YXNrbGV0X2tpbGwoJmMtPnZjLnRhc2spOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBv Zl9kZXZpY2VfaWQgbXRrX3VhcnRfYXBkbWFfbWF0Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0g Im1lZGlhdGVrLG10NjU3Ny11YXJ0LWRtYSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9LAorfTsK K01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG10a191YXJ0X2FwZG1hX21hdGNoKTsKKworc3RhdGlj IGludCBtdGtfdWFydF9hcGRtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQor eworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3Qg bXRrX3VhcnRfYXBkbWFkZXYgKm10a2Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0 IG10a19jaGFuICpjOworCWludCBiaXRfbWFzayA9IDMyLCByYzsKKwl1bnNpZ25lZCBpbnQgaTsK KworCW10a2QgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCptdGtkKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFtdGtkKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW10a2QtPmNsayA9IGRl dm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlpZiAoSVNfRVJSKG10a2QtPmNsaykpIHsK KwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gY2xvY2sgc3BlY2lmaWVkXG4iKTsKKwkJcmMgPSBQ VFJfRVJSKG10a2QtPmNsayk7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAob2ZfcHJvcGVydHlf cmVhZF9ib29sKG5wLCAibWVkaWF0ZWssZG1hLTMzYml0cyIpKQorCQltdGtkLT5zdXBwb3J0XzMz Yml0cyA9IHRydWU7CisKKwlpZiAobXRrZC0+c3VwcG9ydF8zM2JpdHMpCisJCWJpdF9tYXNrID0g MzM7CisKKwlyYyA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJ VF9NQVNLKGJpdF9tYXNrKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlkbWFfY2FwX3Nl dChETUFfU0xBVkUsIG10a2QtPmRkZXYuY2FwX21hc2spOworCW10a2QtPmRkZXYuZGV2aWNlX2Fs bG9jX2NoYW5fcmVzb3VyY2VzID0KKwkJCQltdGtfdWFydF9hcGRtYV9hbGxvY19jaGFuX3Jlc291 cmNlczsKKwltdGtkLT5kZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0KKwkJCQltdGtf dWFydF9hcGRtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCW10a2QtPmRkZXYuZGV2aWNlX3R4X3N0 YXR1cyA9IG10a191YXJ0X2FwZG1hX3R4X3N0YXR1czsKKwltdGtkLT5kZGV2LmRldmljZV9pc3N1 ZV9wZW5kaW5nID0gbXRrX3VhcnRfYXBkbWFfaXNzdWVfcGVuZGluZzsKKwltdGtkLT5kZGV2LmRl dmljZV9wcmVwX3NsYXZlX3NnID0gbXRrX3VhcnRfYXBkbWFfcHJlcF9zbGF2ZV9zZzsKKwltdGtk LT5kZGV2LmRldmljZV9jb25maWcgPSBtdGtfdWFydF9hcGRtYV9zbGF2ZV9jb25maWc7CisJbXRr ZC0+ZGRldi5kZXZpY2VfcGF1c2UgPSBtdGtfdWFydF9hcGRtYV9kZXZpY2VfcGF1c2U7CisJbXRr ZC0+ZGRldi5kZXZpY2VfdGVybWluYXRlX2FsbCA9IG10a191YXJ0X2FwZG1hX3Rlcm1pbmF0ZV9h bGw7CisJbXRrZC0+ZGRldi5zcmNfYWRkcl93aWR0aHMgPSBCSVQoRE1BX1NMQVZFX0JVU1dJRFRI XzFfQllURSk7CisJbXRrZC0+ZGRldi5kc3RfYWRkcl93aWR0aHMgPSBCSVQoRE1BX1NMQVZFX0JV U1dJRFRIXzFfQllURSk7CisJbXRrZC0+ZGRldi5kaXJlY3Rpb25zID0gQklUKERNQV9ERVZfVE9f TUVNKSB8IEJJVChETUFfTUVNX1RPX0RFVik7CisJbXRrZC0+ZGRldi5yZXNpZHVlX2dyYW51bGFy aXR5ID0gRE1BX1JFU0lEVUVfR1JBTlVMQVJJVFlfU0VHTUVOVDsKKwltdGtkLT5kZGV2LmRldiA9 ICZwZGV2LT5kZXY7CisJSU5JVF9MSVNUX0hFQUQoJm10a2QtPmRkZXYuY2hhbm5lbHMpOworCisJ bXRrZC0+ZG1hX3JlcXVlc3RzID0gTVRLX1VBUlRfQVBETUFfTlJfVkNIQU5TOworCWlmIChvZl9w cm9wZXJ0eV9yZWFkX3UzMihucCwgImRtYS1yZXF1ZXN0cyIsICZtdGtkLT5kbWFfcmVxdWVzdHMp KSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVzaW5nICV1IGFzIG1pc3NpbmcgZG1h LXJlcXVlc3RzIHByb3BlcnR5XG4iLAorCQkJIE1US19VQVJUX0FQRE1BX05SX1ZDSEFOUyk7CisJ fQorCisJbXRrZC0+ZG1hX2lycSA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBtdGtkLT5kbWFf cmVxdWVzdHMsCisJCQkJIHNpemVvZigqbXRrZC0+ZG1hX2lycSksIEdGUF9LRVJORUwpOworCWlm ICghbXRrZC0+ZG1hX2lycSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBpIDwg bXRrZC0+ZG1hX3JlcXVlc3RzOyBpKyspIHsKKwkJYyA9IGRldm1fa3phbGxvYyhtdGtkLT5kZGV2 LmRldiwgc2l6ZW9mKCpjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghYykgeworCQkJcmMgPSAtRU5P REVWOworCQkJZ290byBlcnJfbm9fZG1hOworCQl9CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jl c291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCXJjID0g LUVOT0RFVjsKKwkJCWdvdG8gZXJyX25vX2RtYTsKKwkJfQorCisJCWMtPmJhc2UgPSBkZXZtX2lv cmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihjLT5iYXNlKSkg eworCQkJcmMgPSBQVFJfRVJSKGMtPmJhc2UpOworCQkJZ290byBlcnJfbm9fZG1hOworCQl9CisJ CWMtPnJlcXVlc3RlZCA9IGZhbHNlOworCQljLT52Yy5kZXNjX2ZyZWUgPSBtdGtfdWFydF9hcGRt YV9kZXNjX2ZyZWU7CisJCXZjaGFuX2luaXQoJmMtPnZjLCAmbXRrZC0+ZGRldik7CisKKwkJbXRr ZC0+ZG1hX2lycVtpXSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCWlmICgoaW50KW10 a2QtPmRtYV9pcnFbaV0gPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8g Z2V0IElSUVslZF1cbiIsIGkpOworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBlcnJfbm9fZG1h OworCQl9CisJfQorCisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGlt ZV9zZXRfYWN0aXZlKCZwZGV2LT5kZXYpOworCisJcmMgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lz dGVyKCZtdGtkLT5kZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gcnBtX2Rpc2FibGU7CisKKwlwbGF0 Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtdGtkKTsKKworCS8qIERldmljZS10cmVlIERNQSBjb250 cm9sbGVyIHJlZ2lzdHJhdGlvbiAqLworCXJjID0gb2ZfZG1hX2NvbnRyb2xsZXJfcmVnaXN0ZXIo bnAsIG9mX2RtYV94bGF0ZV9ieV9jaGFuX2lkLCBtdGtkKTsKKwlpZiAocmMpCisJCWdvdG8gZG1h X3JlbW92ZTsKKworCXJldHVybiByYzsKKworZG1hX3JlbW92ZToKKwlkbWFfYXN5bmNfZGV2aWNl X3VucmVnaXN0ZXIoJm10a2QtPmRkZXYpOworcnBtX2Rpc2FibGU6CisJcG1fcnVudGltZV9kaXNh YmxlKCZwZGV2LT5kZXYpOworZXJyX25vX2RtYToKKwltdGtfdWFydF9hcGRtYV9mcmVlKG10a2Qp OworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9yZW1vdmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYg Km10a2QgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWlmIChwZGV2LT5kZXYub2Zf bm9kZSkKKwkJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zfbm9kZSk7CisKKwlw bV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZw ZGV2LT5kZXYpOworCisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZtdGtkLT5kZGV2KTsK KwltdGtfdWFydF9hcGRtYV9mcmVlKG10a2QpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBD T05GSUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBkbWFfc3VzcGVuZChzdHJ1Y3Qg ZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkID0gZGV2X2dl dF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpCisJCWNs a19kaXNhYmxlX3VucHJlcGFyZShtdGtkLT5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgbXRrX3VhcnRfYXBkbWFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQg cmV0OworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9IGRldl9nZXRfZHJ2ZGF0YShk ZXYpOworCisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKSB7CisJCXJldCA9IGNsa19w cmVwYXJlX2VuYWJsZShtdGtkLT5jbGspOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KKworI2lmZGVm IENPTkZJR19QTQorc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9ydW50aW1lX3N1c3BlbmQoc3Ry dWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9IGRl dl9nZXRfZHJ2ZGF0YShkZXYpOworCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG10a2QtPmNsayk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9ydW50aW1lX3Jl c3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXRrX3VhcnRf YXBkbWFkZXYgKm10a2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldCA9IGNsa19wcmVw YXJlX2VuYWJsZShtdGtkLT5jbGspOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1 cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBk ZXZfcG1fb3BzIG10a191YXJ0X2FwZG1hX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BN X09QUyhtdGtfdWFydF9hcGRtYV9zdXNwZW5kLCBtdGtfdWFydF9hcGRtYV9yZXN1bWUpCisJU0VU X1JVTlRJTUVfUE1fT1BTKG10a191YXJ0X2FwZG1hX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIG10 a191YXJ0X2FwZG1hX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsKKworc3RhdGljIHN0cnVjdCBw bGF0Zm9ybV9kcml2ZXIgbXRrX3VhcnRfYXBkbWFfZHJpdmVyID0geworCS5wcm9iZQk9IG10a191 YXJ0X2FwZG1hX3Byb2JlLAorCS5yZW1vdmUJPSBtdGtfdWFydF9hcGRtYV9yZW1vdmUsCisJLmRy aXZlciA9IHsKKwkJLm5hbWUJCT0gS0JVSUxEX01PRE5BTUUsCisJCS5wbQkJPSAmbXRrX3VhcnRf YXBkbWFfcG1fb3BzLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9tYXRjaF9wdHIobXRrX3VhcnRf YXBkbWFfbWF0Y2gpLAorCX0sCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10a191YXJ0 X2FwZG1hX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiTWVkaWFUZWsgVUFSVCBBUERN QSBDb250cm9sbGVyIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTG9uZyBDaGVuZyA8bG9uZy5j aGVuZ0BtZWRpYXRlay5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CisK