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: [v10,1/3] dmaengine: 8250_mtk_dma: add MediaTek uart DMA support From: Long Cheng Message-Id: <1547781016-890-2-git-send-email-long.cheng@mediatek.com> Date: Fri, 18 Jan 2019 11:10:14 +0800 To: Vinod Koul , Randy Dunlap , Rob Herring , Mark Rutland , Ryder Lee , Sean Wang , Nicolas Boichat Cc: Matthias Brugger , 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 L21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMgfCAgNjY5ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCA2ODEgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvZG1hL21lZGlhdGVrL210ay11YXJ0LWFwZG1hLmMKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsv S2NvbmZpZwppbmRleCA2ODBmYzA1Li5hYzQ5ZWI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9t ZWRpYXRlay9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKQEAgLTI0 LDMgKzI0LDE0IEBAIGNvbmZpZyBNVEtfQ1FETUEKIAogCSAgVGhpcyBjb250cm9sbGVyIHByb3Zp ZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8KIAkgIG1lbW9yeS10by1tZW1v cnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVS4KKworY29uZmlnIE1US19VQVJUX0FQRE1B CisJdHJpc3RhdGUgIk1lZGlhVGVrIFNvQ3MgQVBETUEgc3VwcG9ydCBmb3IgVUFSVCIKKwlkZXBl bmRzIG9uIE9GICYmIFNFUklBTF84MjUwX01UNjU3NworCXNlbGVjdCBETUFfRU5HSU5FCisJc2Vs ZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgdGhlIFVBUlQg RE1BIGVuZ2luZSBmb3VuZCBvbiBNZWRpYVRlayBNVEsgU29Dcy4KKwkgIFdoZW4gU0VSSUFMXzgy NTBfTVQ2NTc3IGlzIGVuYWJsZWQsIGFuZCBpZiB5b3Ugd2FudCB0byB1c2UgRE1BLAorCSAgeW91 IGNhbiBlbmFibGUgdGhlIGNvbmZpZy4gVGhlIERNQSBlbmdpbmUgY2FuIG9ubHkgYmUgdXNlZAor CSAgd2l0aCBNZWRpYVRlayBTb0NzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsv TWFrZWZpbGUgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQppbmRleCA0MWJiMzgxLi42 MWE2ZDI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQorKysgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQpAQCAtMSwyICsxLDMgQEAKK29iai0kKENPTkZJ R19NVEtfVUFSVF9BUERNQSkgKz0gbXRrLXVhcnQtYXBkbWEubwogb2JqLSQoQ09ORklHX01US19I U0RNQSkgKz0gbXRrLWhzZG1hLm8KIG9iai0kKENPTkZJR19NVEtfQ1FETUEpICs9IG10ay1jcWRt YS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstdWFydC1hcGRtYS5jIGIv ZHJpdmVycy9kbWEvbWVkaWF0ZWsvbXRrLXVhcnQtYXBkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi40MjdkYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEv bWVkaWF0ZWsvbXRrLXVhcnQtYXBkbWEuYwpAQCAtMCwwICsxLDY2OSBAQAorLy8gU1BEWC1MaWNl 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 OworCWxlbiA9IG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0xFTik7CisKKwlkX3dwdCA9IHdw dCArIHNlbmQ7CisJaWYgKChkX3dwdCAmIFZGRl9SSU5HX1NJWkUpID49IGxlbikgeworCQlkX3dw dCA9IGRfd3B0IC0gbGVuOworCQlkX3dwdCA9IGRfd3B0IF4gVkZGX1JJTkdfV1JBUDsKKwl9CisJ bXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX1dQVCwgZF93cHQpOworCisJYy0+ZGVzYy0+YXZh aWxfbGVuIC09IHNlbmQ7CisKKwltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0VOLCBW RkZfVFhfSU5UX0VOX0IpOworCWlmIChtdGtfdWFydF9hcGRtYV9yZWFkKGMsIFZGRl9GTFVTSCkg PT0gMFUpCisJCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9GTFVTSCwgVkZGX0ZMVVNIX0Ip OworfQorCitzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV9zdGFydF9yeChzdHJ1Y3QgbXRrX2No YW4gKmMpCit7CisJc3RydWN0IG10a191YXJ0X2FwZG1hX2Rlc2MgKmQgPSBjLT5kZXNjOworCXVu c2lnbmVkIGludCBsZW4sIHdnLCByZzsKKwlpbnQgY250OworCisJaWYgKChtdGtfdWFydF9hcGRt YV9yZWFkKGMsIFZGRl9WQUxJRF9TSVpFKSA9PSAwVSkgfHwKKwkJIWQgfHwgIXZjaGFuX25leHRf ZGVzYygmYy0+dmMpKQorCQlyZXR1cm47CisKKwlsZW4gPSBtdGtfdWFydF9hcGRtYV9yZWFkKGMs IFZGRl9MRU4pOworCXJnID0gbXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZfUlBUKTsKKwl3ZyA9 IG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX1dQVCk7CisJY250ID0gKHdnICYgVkZGX1JJTkdf U0laRSkgLSAocmcgJiBWRkZfUklOR19TSVpFKTsKKwkvKgorCSAqIFRoZSBidWZmZXIgaXMgcmlu ZyBidWZmZXIuIElmIHdyYXAgYml0IGRpZmZlcmVudCwKKwkgKiByZXByZXNlbnRzIHRoZSBzdGFy dCBvZiB0aGUgbmV4dCBjeWNsZSBmb3IgV1BUCisJICovCisJaWYgKChyZyBeIHdnKSAmIFZGRl9S SU5HX1dSQVApCisJCWNudCArPSBsZW47CisKKwljLT5yeF9zdGF0dXMgPSBjbnQ7CisJbXRrX3Vh cnRfYXBkbWFfd3JpdGUoYywgVkZGX1JQVCwgd2cpOworCisJbGlzdF9kZWwoJmQtPnZkLm5vZGUp OworCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmZC0+dmQpOworfQorCitzdGF0aWMgaXJxcmV0dXJu X3QgbXRrX3VhcnRfYXBkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQorewor CXN0cnVjdCBkbWFfY2hhbiAqY2hhbiA9IChzdHJ1Y3QgZG1hX2NoYW4gKilkZXZfaWQ7CisJc3Ry dWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3Qg bXRrX3VhcnRfYXBkbWFfZGVzYyAqZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwlpZiAoYy0+ZGlyID09IERNQV9ERVZf VE9fTUVNKSB7CisJCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1JY X0lOVF9DTFJfQik7CisJCW10a191YXJ0X2FwZG1hX3N0YXJ0X3J4KGMpOworCX0gZWxzZSBpZiAo Yy0+ZGlyID09IERNQV9NRU1fVE9fREVWKSB7CisJCWQgPSBjLT5kZXNjOworCisJCW10a191YXJ0 X2FwZG1hX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1RYX0lOVF9DTFJfQik7CisKKwkJaWYg KGQtPmF2YWlsX2xlbiAhPSAwVSkgeworCQkJbXRrX3VhcnRfYXBkbWFfc3RhcnRfdHgoYyk7CisJ CX0gZWxzZSB7CisJCQlsaXN0X2RlbCgmZC0+dmQubm9kZSk7CisJCQl2Y2hhbl9jb29raWVfY29t cGxldGUoJmQtPnZkKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5s b2NrLCBmbGFncyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbXRr X3VhcnRfYXBkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQor eworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9IHRvX210a191YXJ0X2FwZG1hX2Rl dihjaGFuLT5kZXZpY2UpOworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a191YXJ0X2FwZG1h X2NoYW4oY2hhbik7CisJdW5zaWduZWQgaW50IHRtcDsKKwlpbnQgcmV0OworCisJcG1fcnVudGlt ZV9nZXRfc3luYyhtdGtkLT5kZGV2LmRldik7CisKKwltdGtfdWFydF9hcGRtYV93cml0ZShjLCBW RkZfQUREUiwgMCk7CisJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX1RIUkUsIDApOworCW10 a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9MRU4sIDApOworCW10a191YXJ0X2FwZG1hX3dyaXRl KGMsIFZGRl9SU1QsIFZGRl9XQVJNX1JTVF9CKTsKKworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91 dChyZWFkbCwgYy0+YmFzZSArIFZGRl9FTiwgdG1wLCAhdG1wLCAxMCwgMTAwKTsKKwlpZiAocmV0 KSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsICJkbWEgcmVzZXQ6IGZhaWwsIHRpbWVv dXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghYy0+cmVxdWVzdGVkKSB7CisJCWMt PnJlcXVlc3RlZCA9IHRydWU7CisJCXJldCA9IHJlcXVlc3RfaXJxKG10a2QtPmRtYV9pcnFbY2hh bi0+Y2hhbl9pZF0sCisJCQkJICBtdGtfdWFydF9hcGRtYV9pcnFfaGFuZGxlciwgSVJRRl9UUklH R0VSX05PTkUsCisJCQkJICBLQlVJTERfTU9ETkFNRSwgY2hhbik7CisJCWlmIChyZXQgPCAwKSB7 CisJCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiQ2FuJ3QgcmVxdWVzdCBkbWEgSVJRXG4i KTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJaWYgKG10a2QtPnN1cHBvcnRfMzNi aXRzKQorCQltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfNEdfU1VQUE9SVCwgVkZGXzRHX1NV UFBPUlRfQ0xSX0IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgbXRrX3VhcnRf YXBkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3Ry dWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkID0gdG9fbXRrX3VhcnRfYXBkbWFfZGV2KGNoYW4t PmRldmljZSk7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hhbihj aGFuKTsKKworCWlmIChjLT5yZXF1ZXN0ZWQpIHsKKwkJYy0+cmVxdWVzdGVkID0gZmFsc2U7CisJ CWZyZWVfaXJxKG10a2QtPmRtYV9pcnFbY2hhbi0+Y2hhbl9pZF0sIGNoYW4pOworCX0KKworCXRh c2tsZXRfa2lsbCgmYy0+dmMudGFzayk7CisKKwl2Y2hhbl9mcmVlX2NoYW5fcmVzb3VyY2VzKCZj LT52Yyk7CisKKwlwbV9ydW50aW1lX3B1dF9zeW5jKG10a2QtPmRkZXYuZGV2KTsKK30KKworc3Rh dGljIGVudW0gZG1hX3N0YXR1cyBtdGtfdWFydF9hcGRtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9j aGFuICpjaGFuLAorCQkJCQkgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJCQkJIHN0cnVjdCBkbWFf dHhfc3RhdGUgKnR4c3RhdGUpCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRf YXBkbWFfY2hhbihjaGFuKTsKKwllbnVtIGRtYV9zdGF0dXMgcmV0OworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisKKwlpZiAoIXR4c3RhdGUpCisJCXJldHVybiBETUFfRVJST1I7CisKKwlyZXQgPSBk bWFfY29va2llX3N0YXR1cyhjaGFuLCBjb29raWUsIHR4c3RhdGUpOworCXNwaW5fbG9ja19pcnFz YXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJaWYgKHJldCA9PSBETUFfSU5fUFJPR1JFU1MpIHsK KwkJYy0+cnhfc3RhdHVzID0gbXRrX3VhcnRfYXBkbWFfcmVhZChjLCBWRkZfUlBUKSAmIFZGRl9S SU5HX1NJWkU7CisJCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRlLCBjLT5yeF9zdGF0dXMpOworCX0g ZWxzZSBpZiAocmV0ID09IERNQV9DT01QTEVURSAmJiBjLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0p IHsKKwkJZG1hX3NldF9yZXNpZHVlKHR4c3RhdGUsIGMtPnJ4X3N0YXR1cyk7CisJfSBlbHNlIHsK KwkJZG1hX3NldF9yZXNpZHVlKHR4c3RhdGUsIDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9p ZCBtdGtfdWFydF9hcGRtYV9jb25maWdfd3JpdGUoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJ ICAgICAgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjZmcsCisJCQkgICAgICAgZW51bSBkbWFf dHJhbnNmZXJfZGlyZWN0aW9uIGRpcikKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtf dWFydF9hcGRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9 CisJCQkJdG9fbXRrX3VhcnRfYXBkbWFfZGV2KGMtPnZjLmNoYW4uZGV2aWNlKTsKKwl1bnNpZ25l ZCBpbnQgdG1wOworCisJaWYgKG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0VOKSA9PSBWRkZf RU5fQikKKwkJcmV0dXJuOworCisJYy0+ZGlyID0gZGlyOworCisJaWYgKGRpciA9PSBETUFfREVW X1RPX01FTSkgeworCQl0bXAgPSBjZmctPnNyY19hZGRyX3dpZHRoICogMTAyNDsKKworCQltdGtf dWFydF9hcGRtYV93cml0ZShjLCBWRkZfQUREUiwgY2ZnLT5zcmNfYWRkcik7CisJCW10a191YXJ0 X2FwZG1hX3dyaXRlKGMsIFZGRl9MRU4sIHRtcCk7CisJCW10a191YXJ0X2FwZG1hX3dyaXRlKGMs IFZGRl9USFJFLCBWRkZfUlhfVEhSRSh0bXApKTsKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywg VkZGX0lOVF9FTiwKKwkJCQlWRkZfUlhfSU5UX0VOMF9CIHwgVkZGX1JYX0lOVF9FTjFfQik7CisJ CW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9SUFQsIDApOworCQltdGtfdWFydF9hcGRtYV93 cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9SWF9JTlRfQ0xSX0IpOworCX0gZWxzZSBpZiAoZGly ID09IERNQV9NRU1fVE9fREVWKQl7CisJCXRtcCA9IGNmZy0+ZHN0X2FkZHJfd2lkdGggKiAxMDI0 OworCisJCW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9BRERSLCBjZmctPmRzdF9hZGRyKTsK KwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0xFTiwgdG1wKTsKKwkJbXRrX3VhcnRfYXBk bWFfd3JpdGUoYywgVkZGX1RIUkUsIFZGRl9UWF9USFJFKHRtcCkpOworCQltdGtfdWFydF9hcGRt YV93cml0ZShjLCBWRkZfV1BULCAwKTsKKwkJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX0lO VF9GTEFHLCBWRkZfVFhfSU5UX0NMUl9CKTsKKwl9CisKKwltdGtfdWFydF9hcGRtYV93cml0ZShj LCBWRkZfRU4sIFZGRl9FTl9CKTsKKworCWlmIChtdGtkLT5zdXBwb3J0XzMzYml0cykKKwkJbXRr X3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGXzRHX1NVUFBPUlQsIFZGRl80R19TVVBQT1JUX0IpOwor CisJaWYgKG10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0VOKSAhPSBWRkZfRU5fQikKKwkJZGV2 X2VycihjaGFuLT5kZXZpY2UtPmRldiwgImRpclslZF0gZmFpbFxuIiwgZGlyKTsKK30KKworLyoK KyAqIGRtYWVuZ2luZV9wcmVwX3NsYXZlX3NpbmdsZSB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9uLiBh bmQgc2dsZW4gaXMgMS4KKyAqIDgyNTAgdWFydCB1c2luZyBvbmUgcmluZyBidWZmZXIsIGFuZCBk ZWFsIHdpdGggb25lIHNnLgorICovCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlw dG9yICptdGtfdWFydF9hcGRtYV9wcmVwX3NsYXZlX3NnCisJKHN0cnVjdCBkbWFfY2hhbiAqY2hh biwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJdW5zaWduZWQgaW50IHNnbGVuLCBlbnVtIGRt YV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCXVuc2lnbmVkIGxvbmcgdHhfZmxhZ3MsIHZvaWQg KmNvbnRleHQpCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hh bihjaGFuKTsKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFfZGVzYyAqZDsKKworCWlmICghaXNfc2xh dmVfZGlyZWN0aW9uKGRpcikpCisJCXJldHVybiBOVUxMOworCisJbXRrX3VhcnRfYXBkbWFfY29u ZmlnX3dyaXRlKGNoYW4sICZjLT5jZmcsIGRpcik7CisKKwkvKiBOb3cgYWxsb2NhdGUgYW5kIHNl dHVwIHRoZSBkZXNjcmlwdG9yICovCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSwgR0ZQX0FUT01J Qyk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIHNnbGVuIGlzIDEgKi8KKwlkLT5h dmFpbF9sZW4gPSBzZ19kbWFfbGVuKHNnbCk7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmYy0+ dmMsICZkLT52ZCwgdHhfZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtdGtfdWFydF9hcGRtYV9p c3N1ZV9wZW5kaW5nKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4g KmMgPSB0b19tdGtfdWFydF9hcGRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNj ICp2ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZj LmxvY2ssIGZsYWdzKTsKKwlpZiAodmNoYW5faXNzdWVfcGVuZGluZygmYy0+dmMpKSB7CisJCXZk ID0gdmNoYW5fbmV4dF9kZXNjKCZjLT52Yyk7CisJCWMtPmRlc2MgPSB0b19tdGtfdWFydF9hcGRt YV9kZXNjKCZ2ZC0+dHgpOworCX0KKworCWlmIChjLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0pCisJ CW10a191YXJ0X2FwZG1hX3N0YXJ0X3J4KGMpOworCWVsc2UgaWYgKGMtPmRpciA9PSBETUFfTUVN X1RPX0RFVikKKwkJbXRrX3VhcnRfYXBkbWFfc3RhcnRfdHgoYyk7CisKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3VhcnRf YXBkbWFfc2xhdmVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJCQkgICBzdHJ1Y3Qg ZG1hX3NsYXZlX2NvbmZpZyAqY29uZmlnKQoreworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210 a191YXJ0X2FwZG1hX2NoYW4oY2hhbik7CisKKwltZW1jcHkoJmMtPmNmZywgY29uZmlnLCBzaXpl b2YoKmNvbmZpZykpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX3VhcnRfYXBk bWFfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19j aGFuICpjID0gdG9fbXRrX3VhcnRfYXBkbWFfY2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCXVuc2lnbmVkIGludCB0bXA7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfRkxV U0gsIFZGRl9GTFVTSF9CKTsKKwkvKiBXYWl0IDFzZWMgZm9yIGZsdXNoLCBjYW4ndCBzbGVlcCAq LworCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChyZWFkbCwgYy0+YmFzZSArIFZGRl9GTFVTSCwg dG1wLAorCQkJdG1wICE9IFZGRl9GTFVTSF9CLCAwLCAxMDAwMDAwKTsKKwlpZiAocmV0KQorCQlk ZXZfZXJyKGMtPnZjLmNoYW4uZGV2aWNlLT5kZXYsICJmbHVzaDogZmFpbCwgZGVidWc9MHgleFxu IiwKKwkJCW10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0RFQlVHX1NUQVRVUykpOworCisJLyog c2V0IHN0b3AgYXMgMSAtPiB3YWl0IHVudGlsIGVuIGlzIDAgLT4gc2V0IHN0b3AgYXMgMCAqLwor CW10a191YXJ0X2FwZG1hX3dyaXRlKGMsIFZGRl9TVE9QLCBWRkZfU1RPUF9CKTsKKwlyZXQgPSBy ZWFkeF9wb2xsX3RpbWVvdXQocmVhZGwsIGMtPmJhc2UgKyBWRkZfRU4sIHRtcCwgIXRtcCwgMTAs IDEwMCk7CisJaWYgKHJldCkKKwkJZGV2X2VycihjLT52Yy5jaGFuLmRldmljZS0+ZGV2LCAic3Rv cDogZmFpbCwgZGVidWc9MHgleFxuIiwKKwkJCW10a191YXJ0X2FwZG1hX3JlYWQoYywgVkZGX0RF QlVHX1NUQVRVUykpOworCisJbXRrX3VhcnRfYXBkbWFfd3JpdGUoYywgVkZGX1NUT1AsIFZGRl9T VE9QX0NMUl9CKTsKKwltdGtfdWFydF9hcGRtYV93cml0ZShjLCBWRkZfSU5UX0VOLCBWRkZfSU5U X0VOX0NMUl9CKTsKKworCWlmIChjLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0pCisJCW10a191YXJ0 X2FwZG1hX3dyaXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1JYX0lOVF9DTFJfQik7CisJZWxzZSBp ZiAoYy0+ZGlyID09IERNQV9NRU1fVE9fREVWKQorCQltdGtfdWFydF9hcGRtYV93cml0ZShjLCBW RkZfSU5UX0ZMQUcsIFZGRl9UWF9JTlRfQ0xSX0IpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRr X3VhcnRfYXBkbWFfZGV2aWNlX3BhdXNlKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwkvKiBq dXN0IGZvciBjaGVjayBjYXBzIHBhc3MgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg bXRrX3VhcnRfYXBkbWFfZnJlZShzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYgKm10a2QpCit7CisJ d2hpbGUgKCFsaXN0X2VtcHR5KCZtdGtkLT5kZGV2LmNoYW5uZWxzKSkgeworCQlzdHJ1Y3QgbXRr X2NoYW4gKmMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZtdGtkLT5kZGV2LmNoYW5uZWxzLAorCQkJc3Ry dWN0IG10a19jaGFuLCB2Yy5jaGFuLmRldmljZV9ub2RlKTsKKworCQlsaXN0X2RlbCgmYy0+dmMu Y2hhbi5kZXZpY2Vfbm9kZSk7CisJCXRhc2tsZXRfa2lsbCgmYy0+dmMudGFzayk7CisJfQorfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfdWFydF9hcGRtYV9tYXRjaFtd ID0geworCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2NTc3LXVhcnQtZG1hIiwgfSwKKwl7 IC8qIHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXRrX3VhcnRf YXBkbWFfbWF0Y2gpOworCitzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3Byb2JlKHN0cnVjdCBw bGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYt PmRldi5vZl9ub2RlOworCXN0cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZDsKKwlzdHJ1Y3Qg cmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgbXRrX2NoYW4gKmM7CisJaW50IGJpdF9tYXNrID0gMzIs IHJjOworCXVuc2lnbmVkIGludCBpOworCisJbXRrZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2 LCBzaXplb2YoKm10a2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10a2QpCisJCXJldHVybiAtRU5P TUVNOworCisJbXRrZC0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlm IChJU19FUlIobXRrZC0+Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjbG9jayBz cGVjaWZpZWRcbiIpOworCQlyYyA9IFBUUl9FUlIobXRrZC0+Y2xrKTsKKwkJcmV0dXJuIHJjOwor CX0KKworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJkbWEtMzNiaXRzIikpCisJCW10 a2QtPnN1cHBvcnRfMzNiaXRzID0gdHJ1ZTsKKworCWlmIChtdGtkLT5zdXBwb3J0XzMzYml0cykK KwkJYml0X21hc2sgPSAzMzsKKworCXJjID0gZG1hX3NldF9tYXNrX2FuZF9jb2hlcmVudCgmcGRl di0+ZGV2LCBETUFfQklUX01BU0soYml0X21hc2spKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsK KworCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgbXRrZC0+ZGRldi5jYXBfbWFzayk7CisJbXRrZC0+ ZGRldi5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPQorCQkJCW10a191YXJ0X2FwZG1hX2Fs bG9jX2NoYW5fcmVzb3VyY2VzOworCW10a2QtPmRkZXYuZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJj ZXMgPQorCQkJCW10a191YXJ0X2FwZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJbXRrZC0+ZGRl di5kZXZpY2VfdHhfc3RhdHVzID0gbXRrX3VhcnRfYXBkbWFfdHhfc3RhdHVzOworCW10a2QtPmRk ZXYuZGV2aWNlX2lzc3VlX3BlbmRpbmcgPSBtdGtfdWFydF9hcGRtYV9pc3N1ZV9wZW5kaW5nOwor CW10a2QtPmRkZXYuZGV2aWNlX3ByZXBfc2xhdmVfc2cgPSBtdGtfdWFydF9hcGRtYV9wcmVwX3Ns YXZlX3NnOworCW10a2QtPmRkZXYuZGV2aWNlX2NvbmZpZyA9IG10a191YXJ0X2FwZG1hX3NsYXZl X2NvbmZpZzsKKwltdGtkLT5kZGV2LmRldmljZV9wYXVzZSA9IG10a191YXJ0X2FwZG1hX2Rldmlj ZV9wYXVzZTsKKwltdGtkLT5kZGV2LmRldmljZV90ZXJtaW5hdGVfYWxsID0gbXRrX3VhcnRfYXBk bWFfdGVybWluYXRlX2FsbDsKKwltdGtkLT5kZGV2LnNyY19hZGRyX3dpZHRocyA9IEJJVChETUFf U0xBVkVfQlVTV0lEVEhfMV9CWVRFKTsKKwltdGtkLT5kZGV2LmRzdF9hZGRyX3dpZHRocyA9IEJJ VChETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFKTsKKwltdGtkLT5kZGV2LmRpcmVjdGlvbnMgPSBC SVQoRE1BX0RFVl9UT19NRU0pIHwgQklUKERNQV9NRU1fVE9fREVWKTsKKwltdGtkLT5kZGV2LnJl c2lkdWVfZ3JhbnVsYXJpdHkgPSBETUFfUkVTSURVRV9HUkFOVUxBUklUWV9TRUdNRU5UOworCW10 a2QtPmRkZXYuZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmbXRrZC0+ZGRldi5j aGFubmVscyk7CisKKwltdGtkLT5kbWFfcmVxdWVzdHMgPSBNVEtfVUFSVF9BUERNQV9OUl9WQ0hB TlM7CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZG1hLXJlcXVlc3RzIiwgJm10a2Qt PmRtYV9yZXF1ZXN0cykpIHsKKwkJZGV2X2luZm8oJnBkZXYtPmRldiwKKwkJCSAiVXNpbmcgJXUg YXMgbWlzc2luZyBkbWEtcmVxdWVzdHMgcHJvcGVydHlcbiIsCisJCQkgTVRLX1VBUlRfQVBETUFf TlJfVkNIQU5TKTsKKwl9CisKKwltdGtkLT5kbWFfaXJxID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5k ZXYsIG10a2QtPmRtYV9yZXF1ZXN0cywKKwkJCQkgc2l6ZW9mKCptdGtkLT5kbWFfaXJxKSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCFtdGtkLT5kbWFfaXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZv ciAoaSA9IDA7IGkgPCBtdGtkLT5kbWFfcmVxdWVzdHM7IGkrKykgeworCQljID0gZGV2bV9remFs bG9jKG10a2QtPmRkZXYuZGV2LCBzaXplb2YoKmMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjKSB7 CisJCQlyYyA9IC1FTk9ERVY7CisJCQlnb3RvIGVycl9ub19kbWE7CisJCX0KKworCQlyZXMgPSBw bGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIGkpOworCQlpZiAoIXJl cykgeworCQkJcmMgPSAtRU5PREVWOworCQkJZ290byBlcnJfbm9fZG1hOworCQl9CisKKwkJYy0+ YmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNf RVJSKGMtPmJhc2UpKSB7CisJCQlyYyA9IFBUUl9FUlIoYy0+YmFzZSk7CisJCQlnb3RvIGVycl9u b19kbWE7CisJCX0KKwkJYy0+cmVxdWVzdGVkID0gZmFsc2U7CisJCWMtPnZjLmRlc2NfZnJlZSA9 IG10a191YXJ0X2FwZG1hX2Rlc2NfZnJlZTsKKwkJdmNoYW5faW5pdCgmYy0+dmMsICZtdGtkLT5k ZGV2KTsKKworCQltdGtkLT5kbWFfaXJxW2ldID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsK KwkJaWYgKChpbnQpbXRrZC0+ZG1hX2lycVtpXSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRl diwgImZhaWxlZCB0byBnZXQgSVJRWyVkXVxuIiwgaSk7CisJCQlyYyA9IC1FSU5WQUw7CisJCQln b3RvIGVycl9ub19kbWE7CisJCX0KKwl9CisKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2 KTsKKwlwbV9ydW50aW1lX3NldF9hY3RpdmUoJnBkZXYtPmRldik7CisKKwlyYyA9IGRtYV9hc3lu Y19kZXZpY2VfcmVnaXN0ZXIoJm10a2QtPmRkZXYpOworCWlmIChyYykKKwkJZ290byBycG1fZGlz YWJsZTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG10a2QpOworCisJLyogRGV2aWNl LXRyZWUgRE1BIGNvbnRyb2xsZXIgcmVnaXN0cmF0aW9uICovCisJcmMgPSBvZl9kbWFfY29udHJv bGxlcl9yZWdpc3RlcihucCwgb2ZfZG1hX3hsYXRlX2J5X2NoYW5faWQsIG10a2QpOworCWlmIChy YykKKwkJZ290byBkbWFfcmVtb3ZlOworCisJcmV0dXJuIHJjOworCitkbWFfcmVtb3ZlOgorCWRt YV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmbXRrZC0+ZGRldik7CitycG1fZGlzYWJsZToKKwlw bV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CitlcnJfbm9fZG1hOgorCW10a191YXJ0X2Fw ZG1hX2ZyZWUobXRrZCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG10a191YXJ0X2Fw ZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtf dWFydF9hcGRtYWRldiAqbXRrZCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYg KHBkZXYtPmRldi5vZl9ub2RlKQorCQlvZl9kbWFfY29udHJvbGxlcl9mcmVlKHBkZXYtPmRldi5v Zl9ub2RlKTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlwbV9ydW50aW1l X3B1dF9ub2lkbGUoJnBkZXYtPmRldik7CisKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIo Jm10a2QtPmRkZXYpOworCW10a191YXJ0X2FwZG1hX2ZyZWUobXRrZCk7CisKKwlyZXR1cm4gMDsK K30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9z dXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXRrX3VhcnRfYXBkbWFkZXYg Km10a2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcG1fcnVudGltZV9zdXNwZW5k ZWQoZGV2KSkKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG10a2QtPmNsayk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBtdGtfdWFydF9hcGRtYV9yZXN1bWUoc3RydWN0IGRldmljZSAq ZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IG10a191YXJ0X2FwZG1hZGV2ICptdGtkID0gZGV2 X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVuZGVkKGRldikpIHsK KwkJcmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG10a2QtPmNsayk7CisJCWlmIChyZXQpCisJCQly ZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVF UCAqLworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG10a191YXJ0X2FwZG1hX3J1bnRp bWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG10a191YXJ0X2FwZG1h ZGV2ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwljbGtfZGlzYWJsZV91bnByZXBh cmUobXRrZC0+Y2xrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG10a191YXJ0X2Fw ZG1hX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0OworCXN0 cnVjdCBtdGtfdWFydF9hcGRtYWRldiAqbXRrZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJ cmV0ID0gY2xrX3ByZXBhcmVfZW5hYmxlKG10a2QtPmNsayk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbXRrX3VhcnRfYXBkbWFfcG1fb3BzID0geworCVNFVF9T WVNURU1fU0xFRVBfUE1fT1BTKG10a191YXJ0X2FwZG1hX3N1c3BlbmQsIG10a191YXJ0X2FwZG1h X3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMobXRrX3VhcnRfYXBkbWFfcnVudGltZV9zdXNw ZW5kLAorCQkJICAgbXRrX3VhcnRfYXBkbWFfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCitz dGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBtdGtfdWFydF9hcGRtYV9kcml2ZXIgPSB7CisJ LnByb2JlCT0gbXRrX3VhcnRfYXBkbWFfcHJvYmUsCisJLnJlbW92ZQk9IG10a191YXJ0X2FwZG1h X3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSBLQlVJTERfTU9ETkFNRSwKKwkJLnBt CQk9ICZtdGtfdWFydF9hcGRtYV9wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IG9mX21hdGNo X3B0cihtdGtfdWFydF9hcGRtYV9tYXRjaCksCisJfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9k cml2ZXIobXRrX3VhcnRfYXBkbWFfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJNZWRp YVRlayBVQVJUIEFQRE1BIENvbnRyb2xsZXIgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMb25n IENoZW5nIDxsb25nLmNoZW5nQG1lZGlhdGVrLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwg djIiKTsKKwo=