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: [2/2] dmaengine: mediatek: Add MediaTek Command-Queue DMA controller for MT6765 SoC From: shun-chih.yu@mediatek.com Message-Id: <1545916258-18218-3-git-send-email-shun-chih.yu@mediatek.com> Date: Thu, 27 Dec 2018 21:10:58 +0800 To: Sean Wang , Vinod Koul , Rob Herring , Matthias Brugger , Dan Williams Cc: dmaengine@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, srv_wsdupstream@mediatek.com, Shun-Chih Yu List-ID: RnJvbTogU2h1bi1DaGloIFl1IDxzaHVuLWNoaWgueXVAbWVkaWF0ZWsuY29tPgoKTWVkaWFUZWsg Q29tbWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciAoQ1FETUEpIG9uIE1UNjc2NSBTb0MgaXMgZGVk aWNhdGVkCnRvIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdGhyb3VnaCBxdWV1ZSBiYXNlZCBk ZXNjcmlwdG9yIG1hbmFnZW1lbnQuCgpUaGVyZSBhcmUgb25seSAzIHBoeXNpY2FsIGNoYW5uZWxz IGluc2lkZSBDUURNQSwgd2hpbGUgdGhlIGRyaXZlciBpcwpleHRlbmRlZCB0byBzdXBwb3J0IDMy IHZpcnR1YWwgY2hhbm5lbHMgZm9yIG11bHRpcGxlIGRtYSB1c2VycyB0byBpc3N1ZQpkbWEgcmVx dWVzdHMgb250byB0aGUgQ1FETUEgc2ltdWx0YW5lb3VzbHkuCgpDaGFuZ2UtSWQ6IEkxZThkMTE2 YzVlY2JiYzQ5MTkwZmZjOTI1Y2I1OWEwZDAzNWQ4ODZiClNpZ25lZC1vZmYtYnk6IFNodW4tQ2hp aCBZdSA8c2h1bi1jaGloLnl1QG1lZGlhdGVrLmNvbT4KUmV2aWV3ZWQtYnk6IFZpbm9kIEtvdWwg PHZrb3VsQGtlcm5lbC5vcmc+Ci0tLQogZHJpdmVycy9kbWEvbWVkaWF0ZWsvS2NvbmZpZyAgICAg fCAgIDEyICsKIGRyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlICAgIHwgICAgMSArCiBkcml2 ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyB8ICA4NjcgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgODgwIGluc2VydGlvbnMoKykKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYwoKZGlmZiAt LWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcgYi9kcml2ZXJzL2RtYS9tZWRpYXRl ay9LY29uZmlnCmluZGV4IDI3YmFjMGIuLjRhMTU4MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1h L21lZGlhdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsvS2NvbmZpZwpAQCAt MTEsMyArMTEsMTUgQEAgY29uZmlnIE1US19IU0RNQQogCSAgVGhpcyBjb250cm9sbGVyIHByb3Zp ZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8KIAkgIG1lbW9yeS10by1tZW1v cnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVSB0aHJvdWdoIHJpbmctCiAJICBiYXNlZCBk ZXNjcmlwdG9yIG1hbmFnZW1lbnQuCisKK2NvbmZpZyBNVEtfQ1FETUEKKwl0cmlzdGF0ZSAiTWVk aWFUZWsgQ29tbWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24g QVJDSF9NRURJQVRFSyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3QgRE1BX0VOR0lORQorCXNlbGVj dCBETUFfVklSVFVBTF9DSEFOTkVMUworCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBDb21t YW5kLVF1ZXVlIERNQSBjb250cm9sbGVyIG9uIE1lZGlhVGVrCisJICBTb0NzLgorCisJICBUaGlz IGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGNoYW5uZWxzIHdoaWNoIGlzIGRlZGljYXRlZCB0bwor CSAgbWVtb3J5LXRvLW1lbW9yeSB0cmFuc2ZlciB0byBvZmZsb2FkIGZyb20gQ1BVLgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUgYi9kcml2ZXJzL2RtYS9tZWRpYXRl ay9NYWtlZmlsZQppbmRleCA2ZTc3OGY4Li40MWJiMzgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Rt YS9tZWRpYXRlay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQpA QCAtMSArMSwyIEBACiBvYmotJChDT05GSUdfTVRLX0hTRE1BKSArPSBtdGstaHNkbWEubworb2Jq LSQoQ09ORklHX01US19DUURNQSkgKz0gbXRrLWNxZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMv ZG1hL21lZGlhdGVrL210ay1jcWRtYS5jIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsvbXRrLWNxZG1h LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0ZWIwYQotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay1jcWRtYS5jCkBAIC0wLDAgKzEsODY3 IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLy8gQ29weXJpZ2h0IChj KSAyMDE4LTIwMTkgTWVkaWFUZWsgSW5jLgorCisvKgorICogRHJpdmVyIGZvciBNZWRpYVRlayBD b21tYW5kLVF1ZXVlIERNQSBDb250cm9sbGVyCisgKgorICogQXV0aG9yOiBTaHVuLUNoaWggWXUg PHNodW4tY2hpaC55dUBtZWRpYXRlay5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9i aXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdp bmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vy ci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4K KyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5o PgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWZjb3Vu dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIi4uL3ZpcnQtZG1hLmgi CisKKyNkZWZpbmUgTVRLX0NRRE1BX1VTRUNfUE9MTAkJMTAKKyNkZWZpbmUgTVRLX0NRRE1BX1RJ TUVPVVRfUE9MTAkJMTAwMAorI2RlZmluZSBNVEtfQ1FETUFfRE1BX0JVU1dJRFRIUwkJQklUKERN QV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKQorI2RlZmluZSBNVEtfQ1FETUFfQUxJR05fU0laRQkJ MQorCisvKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgdmlydHVhbCBjaGFubmVsICovCisjZGVmaW5l IE1US19DUURNQV9OUl9WQ0hBTlMJCTMyCisKKy8qIFRoZSBkZWZhdWx0IG51bWJlciBvZiBwaHlz aWNhbCBjaGFubmVsICovCisjZGVmaW5lIE1US19DUURNQV9OUl9QQ0hBTlMJCTMKKworLyogUmVn aXN0ZXJzIGZvciB1bmRlcmx5aW5nIGRtYSBtYW5pcHVsYXRpb24gKi8KKyNkZWZpbmUgTVRLX0NR RE1BX0lOVF9GTEFHCQkweDAKKyNkZWZpbmUgTVRLX0NRRE1BX0lOVF9FTgkJMHg0CisjZGVmaW5l IE1US19DUURNQV9FTgkJCTB4OAorI2RlZmluZSBNVEtfQ1FETUFfUkVTRVQJCQkweGMKKyNkZWZp bmUgTVRLX0NRRE1BX0ZMVVNICQkJMHgxNAorI2RlZmluZSBNVEtfQ1FETUFfU1JDCQkJMHgxYwor I2RlZmluZSBNVEtfQ1FETUFfRFNUCQkJMHgyMAorI2RlZmluZSBNVEtfQ1FETUFfTEVOMQkJCTB4 MjQKKyNkZWZpbmUgTVRLX0NRRE1BX0xFTjIJCQkweDI4CisjZGVmaW5lIE1US19DUURNQV9TUkMy CQkJMHg2MAorI2RlZmluZSBNVEtfQ1FETUFfRFNUMgkJCTB4NjQKKworLyogUmVnaXN0ZXJzIHNl dHRpbmcgKi8KKyNkZWZpbmUgTVRLX0NRRE1BX0VOX0JJVAkJQklUKDApCisjZGVmaW5lIE1US19D UURNQV9JTlRfRkxBR19CSVQJCUJJVCgwKQorI2RlZmluZSBNVEtfQ1FETUFfSU5UX0VOX0JJVAkJ QklUKDApCisjZGVmaW5lIE1US19DUURNQV9GTFVTSF9CSVQJCUJJVCgwKQorCisjZGVmaW5lIE1U S19DUURNQV9XQVJNX1JTVF9CSVQJCUJJVCgwKQorI2RlZmluZSBNVEtfQ1FETUFfSEFSRF9SU1Rf QklUCQlCSVQoMSkKKworI2RlZmluZSBNVEtfQ1FETUFfTUFYX0xFTgkJR0VOTUFTSygyNywgMCkK KyNkZWZpbmUgTVRLX0NRRE1BX0FERFJfTElNSVQJCUdFTk1BU0soMzEsIDApCisjZGVmaW5lIE1U S19DUURNQV9BRERSMl9TSEZJVAkJKDMyKQorCisvKioKKyAqIHN0cnVjdCBtdGtfY3FkbWFfdmRl c2MgLSBUaGUgc3RydWN0IGhvbGRpbmcgaW5mbyBkZXNjcmliaW5nIHZpcnR1YWwKKyAqICAgICAg ICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IgKENWRCkKKyAqIEB2ZDogICAgICAgICAgICAg ICAgICAgIEFuIGluc3RhbmNlIGZvciBzdHJ1Y3QgdmlydF9kbWFfZGVzYworICogQGxlbjogICAg ICAgICAgICAgICAgICAgVGhlIHRvdGFsIGRhdGEgc2l6ZSBkZXZpY2Ugd2FudHMgdG8gbW92ZQor ICogQGRlc3Q6ICAgICAgICAgICAgICAgICAgVGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgZGV2aWNl IHdhbnRzIHRvIG1vdmUgdG8KKyAqIEBzcmM6ICAgICAgICAgICAgICAgICAgIFRoZSBzb3VyY2Ug YWRkcmVzcyBkZXZpY2Ugd2FudHMgdG8gbW92ZSBmcm9tCisgKiBAY2g6ICAgICAgICAgICAgICAg ICAgICBUaGUgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBkbWEgY2hhbm5lbAorICogQG5v ZGU6ICAgICAgICAgICAgICAgICAgVG8gYnVpbGQgbGlua2VkLWxpc3QgZm9yIFBDIHF1ZXVlCisg Ki8KK3N0cnVjdCBtdGtfY3FkbWFfdmRlc2MgeworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjIHZkOwor CXNpemVfdCBsZW47CisJZG1hX2FkZHJfdCBkZXN0OworCWRtYV9hZGRyX3Qgc3JjOworCXN0cnVj dCBkbWFfY2hhbiAqY2g7CisKKwkvKiBwcm90ZWN0ZWQgYnkgcGMubG9jayAqLworCXN0cnVjdCBs aXN0X2hlYWQgbm9kZTsKK307CisKKy8qKgorICogc3RydWN0IG10a19jcWRtYV9wY2hhbiAtIFRo ZSBzdHJ1Y3QgaG9sZGluZyBpbmZvIGRlc2NyaWJpbmcgcGh5c2ljYWwKKyAqICAgICAgICAgICAg ICAgICAgICAgICAgIGNoYW5uZWwgKFBDKQorICogQHF1ZXVlOiAgICAgICAgICAgICAgICAgUXVl dWUgZm9yIHRoZSBDVkRzIGlzc3VlZCB0byB0aGlzIFBDCisgKiBAYmFzZTogICAgICAgICAgICAg ICAgICBUaGUgbWFwcGVkIHJlZ2lzdGVyIEkvTyBiYXNlIG9mIHRoaXMgUEMKKyAqIEBpcnE6ICAg ICAgICAgICAgICAgICAgIFRoZSBJUlEgdGhhdCB0aGlzIFBDIGFyZSB1c2luZworICogQHJlZmNu dDogICAgICAgICAgICAgICAgVHJhY2sgaG93IG1hbnkgVkNzIGFyZSB1c2luZyB0aGlzIFBDCisg KiBAbG9jazogICAgICAgICAgICAgICAgIExvY2sgcHJvdGVjdCBhZ2Fpc3RpbmcgbXVsdGlwbGUg VkNzIGFjY2VzcyBQQworICovCitzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuIHsKKwlzdHJ1Y3QgbGlz dF9oZWFkIHF1ZXVlOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgaXJxOworCXJlZmNvdW50 X3QgcmVmY250OworCisJLyogbG9jayB0byBwcm90ZWN0IFBDICovCisJc3BpbmxvY2tfdCBsb2Nr OworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuIC0gVGhlIHN0cnVjdCBob2xk aW5nIGluZm8gZGVzY3JpYmluZyB2aXJ0dWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBj aGFubmVsIChWQykKKyAqIEB2YzogICAgICAgICAgICAgICAgICAgIEFuIGluc3RhbmNlIGZvciBz dHJ1Y3QgdmlydF9kbWFfY2hhbgorICogQHBjOiAgICAgICAgICAgICAgICAgICAgVGhlIHBvaW50 ZXIgdG8gdGhlIHVuZGVybHlpbmcgUEMKKyAqIEBpc3N1ZV9jb21wbGV0aW9uOgkgICBUaGUgd2Fp dCBmb3IgYWxsIGlzc3VlZCBkZXNjcmlwdG9ycyBjb21wbGV0aXRlZAorICogQGlzc3VlX3N5bmNo cm9uaXplOgkgICBCb29sIGluZGljYXRpbmcgY2hhbm5lbCBzeW5jaHJvbml6YXRpb24gc3RhcnRz CisgKi8KK3N0cnVjdCBtdGtfY3FkbWFfdmNoYW4geworCXN0cnVjdCB2aXJ0X2RtYV9jaGFuIHZj OworCXN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjOworCXN0cnVjdCBjb21wbGV0aW9uIGlzc3Vl X2NvbXBsZXRpb247CisJYm9vbCBpc3N1ZV9zeW5jaHJvbml6ZTsKKwkvKiBwcm90ZWN0ZWQgYnkg dmMubG9jayAqLworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAtIFRoZSBz dHJ1Y3QgaG9sZGluZyBpbmZvIGRlc2NyaWJpbmcgQ1FETUEKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICBkZXZpY2UKKyAqIEBkZGV2OiAgICAgICAgICAgICAgICAgICBBbiBpbnN0YW5jZSBm b3Igc3RydWN0IGRtYV9kZXZpY2UKKyAqIEBjbGs6ICAgICAgICAgICAgICAgICAgICBUaGUgY2xv Y2sgdGhhdCBkZXZpY2UgaW50ZXJuYWwgaXMgdXNpbmcKKyAqIEBkbWFfcmVxdWVzdHM6ICAgICAg ICAgICBUaGUgbnVtYmVyIG9mIFZDcyB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvCisgKiBAZG1hX2No YW5uZWxzOiAgICAgICAgICAgVGhlIG51bWJlciBvZiBQQ3MgdGhlIGRldmljZSBzdXBwb3J0cyB0 bworICogQHZjOiAgICAgICAgICAgICAgICAgICAgIFRoZSBwb2ludGVyIHRvIGFsbCBhdmFpbGFi bGUgVkNzCisgKiBAcGM6ICAgICAgICAgICAgICAgICAgICAgVGhlIHBvaW50ZXIgdG8gYWxsIHRo ZSB1bmRlcmx5aW5nIFBDcworICovCitzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSB7CisJc3RydWN0 IGRtYV9kZXZpY2UgZGRldjsKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwl1MzIgZG1hX3JlcXVlc3Rz OworCXUzMiBkbWFfY2hhbm5lbHM7CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqdmM7CisJc3Ry dWN0IG10a19jcWRtYV9wY2hhbiAqKnBjOworfTsKKworc3RhdGljIHN0cnVjdCBtdGtfY3FkbWFf ZGV2aWNlICp0b19jcWRtYV9kZXYoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiBj b250YWluZXJfb2YoY2hhbi0+ZGV2aWNlLCBzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSwgZGRldik7 Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICp0b19jcWRtYV92Y2hhbihzdHJ1 Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3Qg bXRrX2NxZG1hX3ZjaGFuLCB2Yy5jaGFuKTsKK30KKworc3RhdGljIHN0cnVjdCBtdGtfY3FkbWFf dmRlc2MgKnRvX2NxZG1hX3ZkZXNjKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKK3sKKwlyZXR1 cm4gY29udGFpbmVyX29mKHZkLCBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjLCB2ZCk7Cit9CisKK3N0 YXRpYyBzdHJ1Y3QgZGV2aWNlICpjcWRtYTJkZXYoc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKmNx ZG1hKQoreworCXJldHVybiBjcWRtYS0+ZGRldi5kZXY7Cit9CisKK3N0YXRpYyB1MzIgbXRrX2Rt YV9yZWFkKHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjLCB1MzIgcmVnKQoreworCXJldHVybiBy ZWFkbChwYy0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfd3JpdGUoc3Ry dWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJd3JpdGVsX3Jl bGF4ZWQodmFsLCBwYy0+YmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfcm13 KHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjLCB1MzIgcmVnLAorCQkJdTMyIG1hc2ssIHUzMiBz ZXQpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IG10a19kbWFfcmVhZChwYywgcmVnKTsKKwl2YWwg Jj0gfm1hc2s7CisJdmFsIHw9IHNldDsKKwltdGtfZG1hX3dyaXRlKHBjLCByZWcsIHZhbCk7Cit9 CisKK3N0YXRpYyB2b2lkIG10a19kbWFfc2V0KHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjLCB1 MzIgcmVnLCB1MzIgdmFsKQoreworCW10a19kbWFfcm13KHBjLCByZWcsIDAsIHZhbCk7Cit9CisK K3N0YXRpYyB2b2lkIG10a19kbWFfY2xyKHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjLCB1MzIg cmVnLCB1MzIgdmFsKQoreworCW10a19kbWFfcm13KHBjLCByZWcsIHZhbCwgMCk7Cit9CisKK3N0 YXRpYyB2b2lkIG10a19jcWRtYV92ZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkK K3sKKwlrZnJlZSh0b19jcWRtYV92ZGVzYyh2ZCkpOworfQorCitzdGF0aWMgaW50IG10a19jcWRt YV9wb2xsX2VuZ2luZV9kb25lKHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjLCBib29sIGF0b21p YykKK3sKKwl1MzIgc3RhdHVzID0gMDsKKworCWlmICghYXRvbWljKQorCQlyZXR1cm4gcmVhZGxf cG9sbF90aW1lb3V0KHBjLT5iYXNlICsgTVRLX0NRRE1BX0VOLAorCQkJCQkgIHN0YXR1cywKKwkJ CQkJICAhKHN0YXR1cyAmIE1US19DUURNQV9FTl9CSVQpLAorCQkJCQkgIE1US19DUURNQV9VU0VD X1BPTEwsCisJCQkJCSAgTVRLX0NRRE1BX1RJTUVPVVRfUE9MTCk7CisKKwlyZXR1cm4gcmVhZGxf cG9sbF90aW1lb3V0X2F0b21pYyhwYy0+YmFzZSArIE1US19DUURNQV9FTiwKKwkJCQkJIHN0YXR1 cywKKwkJCQkJICEoc3RhdHVzICYgTVRLX0NRRE1BX0VOX0JJVCksCisJCQkJCSBNVEtfQ1FETUFf VVNFQ19QT0xMLAorCQkJCQkgTVRLX0NRRE1BX1RJTUVPVVRfUE9MTCk7Cit9CisKK3N0YXRpYyBp bnQgbXRrX2NxZG1hX2hhcmRfcmVzZXQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMpCit7CisJ bXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9SRVNFVCwgTVRLX0NRRE1BX0hBUkRfUlNUX0JJVCk7 CisJbXRrX2RtYV9jbHIocGMsIE1US19DUURNQV9SRVNFVCwgTVRLX0NRRE1BX0hBUkRfUlNUX0JJ VCk7CisKKwlyZXR1cm4gbXRrX2NxZG1hX3BvbGxfZW5naW5lX2RvbmUocGMsIGZhbHNlKTsKK30K Kworc3RhdGljIHZvaWQgbXRrX2NxZG1hX3N0YXJ0KHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBj LAorCQkJICAgIHN0cnVjdCBtdGtfY3FkbWFfdmRlc2MgKmN2ZCkKK3sKKwkvKiB3YWl0IGZvciB0 aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24gZG9uZSAqLworCWlmIChtdGtfY3FkbWFfcG9sbF9lbmdp bmVfZG9uZShwYywgdHJ1ZSkgPCAwKQorCQlkZXZfZXJyKGNxZG1hMmRldih0b19jcWRtYV9kZXYo Y3ZkLT5jaCkpLAorCQkJImNxZG1hIHdhaXQgdHJhbnNhY3Rpb24gdGltZW91dFxuIik7CisKKwkv KiB3YXJtIHJlc2V0IHRoZSBkbWEgZW5naW5lIGZvciB0aGUgbmV3IHRyYW5zYWN0aW9uICovCisJ bXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9SRVNFVCwgTVRLX0NRRE1BX1dBUk1fUlNUX0JJVCk7 CisJaWYgKG10a19jcWRtYV9wb2xsX2VuZ2luZV9kb25lKHBjLCB0cnVlKSA8IDApCisJCWRldl9l cnIoY3FkbWEyZGV2KHRvX2NxZG1hX2RldihjdmQtPmNoKSksCisJCQkiY3FkbWEgd2FybSByZXNl dCB0aW1lb3V0XG4iKTsKKworCS8qIHNldHVwIHRoZSBzb3VyY2UgKi8KKwltdGtfZG1hX3NldChw YywgTVRLX0NRRE1BX1NSQywgY3ZkLT5zcmMgJiBNVEtfQ1FETUFfQUREUl9MSU1JVCk7CisjaWZk ZWYgQ09ORklHX0FSQ0hfRE1BX0FERFJfVF82NEJJVAorCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FE TUFfU1JDMiwgY3ZkLT5zcmMgPj4gTVRLX0NRRE1BX0FERFIyX1NIRklUKTsKKyNlbHNlCisJbXRr X2RtYV9zZXQocGMsIE1US19DUURNQV9TUkMyLCAwKTsKKyNlbmRpZgorCisJLyogc2V0dXAgdGhl IGRlc3RpbmF0aW9uICovCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9EU1QsIGN2ZC0+ZGVz dCAmIE1US19DUURNQV9BRERSX0xJTUlUKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9U XzY0QklUCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9EU1QyLCBjdmQtPmRlc3QgPj4gTVRL X0NRRE1BX0FERFIyX1NIRklUKTsKKyNlbHNlCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9T UkMyLCAwKTsKKyNlbmRpZgorCisJLyogc2V0dXAgdGhlIGxlbmd0aCAqLworCW10a19kbWFfc2V0 KHBjLCBNVEtfQ1FETUFfTEVOMSwKKwkJICAgIChjdmQtPmxlbiA8IE1US19DUURNQV9NQVhfTEVO KSA/CisJCSAgICBjdmQtPmxlbiA6IE1US19DUURNQV9NQVhfTEVOKTsKKworCS8qIHN0YXJ0IGRt YSBlbmdpbmUgKi8KKwltdGtfZG1hX3NldChwYywgTVRLX0NRRE1BX0VOLCBNVEtfQ1FETUFfRU5f QklUKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2NxZG1hX2lzc3VlX3ZjaGFuX3BlbmRpbmcoc3Ry dWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjKQoreworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCwg KnZkMjsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYyA9IGN2Yy0+cGM7CisJc3RydWN0IG10 a19jcWRtYV92ZGVzYyAqY3ZkOworCWJvb2wgdHJpZ2dlcl9lbmdpbmUgPSBmYWxzZTsKKworCWxv Y2tkZXBfYXNzZXJ0X2hlbGQoJmN2Yy0+dmMubG9jayk7CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgm cGMtPmxvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZkLCB2ZDIsICZjdmMtPnZj LmRlc2NfaXNzdWVkLCBub2RlKSB7CisJCS8qIG5lZWQgdG8gdHJpZ2dlciBkbWEgZW5naW5lIGlm IFBDJ3MgcXVldWUgaXMgZW1wdHkgKi8KKwkJaWYgKGxpc3RfZW1wdHkoJnBjLT5xdWV1ZSkpCisJ CQl0cmlnZ2VyX2VuZ2luZSA9IHRydWU7CisKKwkJY3ZkID0gdG9fY3FkbWFfdmRlc2ModmQpOwor CisJCS8qIGFkZCBWRCBpbnRvIFBDJ3MgcXVldWUgKi8KKwkJbGlzdF9hZGRfdGFpbCgmY3ZkLT5u b2RlLCAmcGMtPnF1ZXVlKTsKKworCQkvKiBzdGFydCB0aGUgZG1hIGVuZ2luZSAqLworCQlpZiAo dHJpZ2dlcl9lbmdpbmUpCisJCQltdGtfY3FkbWFfc3RhcnQocGMsIGN2ZCk7CisKKwkJLyogcmVt b3ZlIFZEIGZyb20gbGlzdCBkZXNjX2lzc3VlZCAqLworCQlsaXN0X2RlbCgmdmQtPm5vZGUpOwor CX0KK30KKworLyoKKyAqIHJldHVybiB0cnVlIGlmIHRoaXMgVkMgaXMgYWN0aXZlLAorICogbWVh bmluZyB0aGF0IHRoZXJlIGFyZSBWRHMgdW5kZXIgcHJvY2Vzc2luZyBieSB0aGUgUEMKKyAqLwor c3RhdGljIGJvb2wgbXRrX2NxZG1hX2lzX3ZjaGFuX2FjdGl2ZShzdHJ1Y3QgbXRrX2NxZG1hX3Zj aGFuICpjdmMpCit7CisJc3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkOworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeShjdmQsICZjdmMtPnBjLT5xdWV1ZSwgbm9kZSkKKwkJaWYgKGN2YyA9PSB0b19j cWRtYV92Y2hhbihjdmQtPmNoKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZhbHNlOwor fQorCisvKgorICogcmV0dXJuIHRoZSBwb2ludGVyIG9mIHRoZSBDVkQgdGhhdCBpcyBqdXN0IGNv bnN1bWVkIGJ5IHRoZSBQQworICovCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfY29uc3VtZV93b3Jr X3F1ZXVlKHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBjKQoreworCXN0cnVjdCBtdGtfY3FkbWFf dmNoYW4gKmN2YzsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisJc2l6ZV90IHRsZW47 CisKKwkvKiBjb25zdW1lIGEgQ1ZEIGZyb20gUEMncyBxdWV1ZSAqLworCWN2ZCA9IGxpc3RfZmly c3RfZW50cnlfb3JfbnVsbCgmcGMtPnF1ZXVlLAorCQkJCSAgICAgICBzdHJ1Y3QgbXRrX2NxZG1h X3ZkZXNjLCBub2RlKTsKKwlpZiAodW5saWtlbHkoIWN2ZCkpCisJCXJldHVybjsKKworCWN2YyA9 IHRvX2NxZG1hX3ZjaGFuKGN2ZC0+Y2gpOworCisJdGxlbiA9IChjdmQtPmxlbiA8IE1US19DUURN QV9NQVhfTEVOKSA/IGN2ZC0+bGVuIDogTVRLX0NRRE1BX01BWF9MRU47CisJY3ZkLT5sZW4gLT0g dGxlbjsKKwljdmQtPnNyYyArPSB0bGVuOworCWN2ZC0+ZGVzdCArPSB0bGVuOworCisJLyogY2hl Y2sgd2hldGhlciB0aGUgQ1ZEIGNvbXBsZXRlZCAqLworCWlmICghY3ZkLT5sZW4pIHsKKwkJLyog ZGVsZXRlIENWRCBmcm9tIFBDJ3MgcXVldWUgKi8KKwkJbGlzdF9kZWwoJmN2ZC0+bm9kZSk7CisK KwkJc3Bpbl9sb2NrKCZjdmMtPnZjLmxvY2spOworCisJCS8qIGFkZCB0aGUgVkQgaW50byBsaXN0 IGRlc2NfY29tcGxldGVkICovCisJCXZjaGFuX2Nvb2tpZV9jb21wbGV0ZSgmY3ZkLT52ZCk7CisK KwkJLyogc2V0dXAgY29tcGxldGlvbiBpZiB0aGlzIFZDIGlzIHVuZGVyIHN5bmNocm9uaXphdGlv biAqLworCQlpZiAoY3ZjLT5pc3N1ZV9zeW5jaHJvbml6ZSAmJiAhbXRrX2NxZG1hX2lzX3ZjaGFu X2FjdGl2ZShjdmMpKSB7CisJCQljb21wbGV0ZSgmY3ZjLT5pc3N1ZV9jb21wbGV0aW9uKTsKKwkJ CWN2Yy0+aXNzdWVfc3luY2hyb25pemUgPSBmYWxzZTsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZj dmMtPnZjLmxvY2spOworCX0KKworCS8qIGl0ZXJhdGUgb24gdGhlIG5leHQgQ1ZEIGlmIHRoZSBj dXJyZW50IENWRCBjb21wbGV0ZWQgKi8KKwlpZiAoIWN2ZC0+bGVuKQorCQljdmQgPSBsaXN0X2Zp cnN0X2VudHJ5X29yX251bGwoJnBjLT5xdWV1ZSwKKwkJCQkJICAgICAgIHN0cnVjdCBtdGtfY3Fk bWFfdmRlc2MsIG5vZGUpOworCisJLyogc3RhcnQgdGhlIG5leHQgdHJhbnNhY3Rpb24gKi8KKwlp ZiAoY3ZkKQorCQltdGtfY3FkbWFfc3RhcnQocGMsIGN2ZCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1 cm5fdCBtdGtfY3FkbWFfaXJxKGludCBpcnEsIHZvaWQgKmRldmlkKQoreworCXN0cnVjdCBtdGtf Y3FkbWFfZGV2aWNlICpjcWRtYSA9IGRldmlkOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05F OworCXUzMiBpOworCisJLyogY2xlYXIgaW50ZXJydXB0IGZsYWdzIGZvciBlYWNoIFBDICovCisJ Zm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5lbHM7ICsraSkgeworCQlzcGluX2xvY2so JmNxZG1hLT5wY1tpXS0+bG9jayk7CisJCWlmIChtdGtfZG1hX3JlYWQoY3FkbWEtPnBjW2ldLAor CQkJCSBNVEtfQ1FETUFfSU5UX0ZMQUcpICYgTVRLX0NRRE1BX0lOVF9GTEFHX0JJVCkgeworCQkJ LyogY2xlYXIgaW50ZXJydXB0ICovCisJCQltdGtfZG1hX2NscihjcWRtYS0+cGNbaV0sIE1US19D UURNQV9JTlRfRkxBRywKKwkJCQkgICAgTVRLX0NRRE1BX0lOVF9GTEFHX0JJVCk7CisKKwkJCW10 a19jcWRtYV9jb25zdW1lX3dvcmtfcXVldWUoY3FkbWEtPnBjW2ldKTsKKworCQkJcmV0ID0gSVJR X0hBTkRMRUQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNxZG1hLT5wY1tpXS0+bG9jayk7CisJfQor CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2aXJ0X2RtYV9kZXNjICptdGtfY3Fk bWFfZmluZF9hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1hX2NoYW4gKmMsCisJCQkJCQkJZG1hX2Nvb2tp ZV90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMgPSB0b19jcWRtYV92 Y2hhbihjKTsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7CisJbGlzdF9m b3JfZWFjaF9lbnRyeSh2ZCwgJmN2Yy0+cGMtPnF1ZXVlLCBub2RlKQorCQlpZiAodmQtPnR4LmNv b2tpZSA9PSBjb29raWUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxv Y2ssIGZsYWdzKTsKKwkJCXJldHVybiB2ZDsKKwkJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmQsICZjdmMt PnZjLmRlc2NfaXNzdWVkLCBub2RlKQorCQlpZiAodmQtPnR4LmNvb2tpZSA9PSBjb29raWUpCisJ CQlyZXR1cm4gdmQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGVudW0gZG1hX3N0YXR1 cyBtdGtfY3FkbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqYywKKwkJCQkJICAgZG1hX2Nv b2tpZV90IGNvb2tpZSwKKwkJCQkJICAgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKK3sK KwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwlzdHJ1 Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkOworCWVu dW0gZG1hX3N0YXR1cyByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaXplX3QgYnl0ZXMg PSAwOworCisJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoYywgY29va2llLCB0eHN0YXRlKTsKKwlp ZiAocmV0ID09IERNQV9DT01QTEVURSB8fCAhdHhzdGF0ZSkKKwkJcmV0dXJuIHJldDsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZjdmMtPnZjLmxvY2ssIGZsYWdzKTsKKwl2ZCA9IG10a19jcWRtYV9m aW5kX2FjdGl2ZV9kZXNjKGMsIGNvb2tpZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Zj LT52Yy5sb2NrLCBmbGFncyk7CisKKwlpZiAodmQpIHsKKwkJY3ZkID0gdG9fY3FkbWFfdmRlc2Mo dmQpOworCQlieXRlcyA9IGN2ZC0+bGVuOworCX0KKworCWRtYV9zZXRfcmVzaWR1ZSh0eHN0YXRl LCBieXRlcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfaXNz dWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IG10a19jcWRtYV92Y2hh biAqY3ZjID0gdG9fY3FkbWFfdmNoYW4oYyk7CisJdW5zaWduZWQgbG9uZyBwY19mbGFnczsKKwl1 bnNpZ25lZCBsb25nIHZjX2ZsYWdzOworCisJLyogYWNxdWlyZSBQQydzIGxvY2sgYmVmb3JlIFZT J3MgbG9jayBmb3IgbG9jayBkZXBlbmRlbmN5IGluIElTUiAqLworCXNwaW5fbG9ja19pcnFzYXZl KCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+dmMu bG9jaywgdmNfZmxhZ3MpOworCisJaWYgKHZjaGFuX2lzc3VlX3BlbmRpbmcoJmN2Yy0+dmMpKQor CQltdGtfY3FkbWFfaXNzdWVfdmNoYW5fcGVuZGluZyhjdmMpOworCisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmY3ZjLT52Yy5sb2NrLCB2Y19mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmY3ZjLT5wYy0+bG9jaywgcGNfZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3lu Y190eF9kZXNjcmlwdG9yICoKK210a19jcWRtYV9wcmVwX2RtYV9tZW1jcHkoc3RydWN0IGRtYV9j aGFuICpjLCBkbWFfYWRkcl90IGRlc3QsCisJCQkgIGRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVu LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmRlc2MgKmN2ZDsK KworCWN2ZCA9IGt6YWxsb2Moc2l6ZW9mKCpjdmQpLCBHRlBfTk9XQUlUKTsKKwlpZiAoIWN2ZCkK KwkJcmV0dXJuIE5VTEw7CisKKwkvKiBzZXR1cCBkbWEgY2hhbm5lbCAqLworCWN2ZC0+Y2ggPSBj OworCisJLyogc2V0dXAgc291cmVjZSwgZGVzdGluYXRpb24sIGFuZCBsZW5ndGggKi8KKwljdmQt PmxlbiA9IGxlbjsKKwljdmQtPnNyYyA9IHNyYzsKKwljdmQtPmRlc3QgPSBkZXN0OworCisJcmV0 dXJuIHZjaGFuX3R4X3ByZXAodG9fdmlydF9jaGFuKGMpLCAmY3ZkLT52ZCwgZmxhZ3MpOworfQor CitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9pbmFjdGl2ZV9kZXNjKHN0cnVjdCBkbWFfY2hh biAqYykKK3sKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMgPSB0b192aXJ0X2NoYW4oYyk7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwkvKgorCSAqIHNldCBk ZXNjX2FsbG9jYXRlZCwgZGVzY19zdWJtaXR0ZWQsCisJICogYW5kIGRlc2NfaXNzdWVkIGFzIHRo ZSBjYW5kaWNhdGVzIHRvIGJlIGZyZWVkCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZjLT5s b2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ2Yy0+ZGVzY19hbGxvY2F0ZWQs ICZoZWFkKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnZjLT5kZXNjX3N1Ym1pdHRlZCwgJmhl YWQpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdmMtPmRlc2NfaXNzdWVkLCAmaGVhZCk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmMtPmxvY2ssIGZsYWdzKTsKKworCS8qIGZyZWUgZGVz Y3JpcHRvciBsaXN0cyAqLworCXZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdCh2YywgJmhlYWQpOwor fQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1hX2No YW4gKmMpCit7CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNoYW4o Yyk7CisJYm9vbCBzeW5jX25lZWRlZCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgcGNfZmxhZ3M7 CisJdW5zaWduZWQgbG9uZyB2Y19mbGFnczsKKworCS8qIGFjcXVpcmUgUEMncyBsb2NrIGZpcnN0 IGR1ZSB0byBsb2NrIGRlcGVuZGVuY3kgaW4gZG1hIElTUiAqLworCXNwaW5fbG9ja19pcnFzYXZl KCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+dmMu bG9jaywgdmNfZmxhZ3MpOworCisJLyogc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkIGlmIHRo aXMgVkMgaXMgYWN0aXZlICovCisJaWYgKG10a19jcWRtYV9pc192Y2hhbl9hY3RpdmUoY3ZjKSkg eworCQljdmMtPmlzc3VlX3N5bmNocm9uaXplID0gdHJ1ZTsKKwkJc3luY19uZWVkZWQgPSB0cnVl OworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+dmMubG9jaywgdmNfZmxhZ3Mp OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIHBjX2ZsYWdzKTsKKwor CS8qIHdhaXRpbmcgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgVkMgKi8KKwlpZiAoc3luY19u ZWVkZWQpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmN2Yy0+aXNzdWVfY29tcGxldGlvbik7CisK KwkvKiBmcmVlIGFsbCBkZXNjcmlwdG9ycyBpbiBsaXN0IGRlc2NfY29tcGxldGVkICovCisJdmNo YW5fc3luY2hyb25pemUoJmN2Yy0+dmMpOworCisJV0FSTl9PTkNFKCFsaXN0X2VtcHR5KCZjdmMt PnZjLmRlc2NfY29tcGxldGVkKSwKKwkJICAiRGVzYyBwZW5kaW5nIHN0aWxsIGluIGxpc3QgZGVz Y19jb21wbGV0ZWRcbiIpOworfQorCitzdGF0aWMgaW50IG10a19jcWRtYV90ZXJtaW5hdGVfYWxs KHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwkvKiBmcmVlIGRlc2NyaXB0b3JzIG5vdCBwcm9jZXNz ZWQgeWV0IGJ5IGhhcmR3YXJlICovCisJbXRrX2NxZG1hX2ZyZWVfaW5hY3RpdmVfZGVzYyhjKTsK KworCS8qIGZyZWUgZGVzY3JpcHRvcnMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGhhcmR3YXJlICovCisJ bXRrX2NxZG1hX2ZyZWVfYWN0aXZlX2Rlc2MoYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBtdGtfY3FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjKQor eworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYSA9IHRvX2NxZG1hX2RldihjKTsKKwlz dHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICp2YyA9IHRvX2NxZG1hX3ZjaGFuKGMpOworCXN0cnVjdCBt dGtfY3FkbWFfcGNoYW4gKnBjID0gTlVMTDsKKwl1MzIgaSwgbWluX3JlZmNudCA9IFUzMl9NQVgs IHJlZmNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogYWxsb2NhdGUgUEMgd2l0aCB0 aGUgbWluaW11bSByZWZjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5u ZWxzOyArK2kpIHsKKwkJcmVmY250ID0gcmVmY291bnRfcmVhZCgmY3FkbWEtPnBjW2ldLT5yZWZj bnQpOworCQlpZiAocmVmY250IDwgbWluX3JlZmNudCkgeworCQkJcGMgPSBjcWRtYS0+cGNbaV07 CisJCQltaW5fcmVmY250ID0gcmVmY250OworCQl9CisJfQorCisJaWYgKCFwYykKKwkJcmV0dXJu IC1FTk9TUEM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGMtPmxvY2ssIGZsYWdzKTsKKworCWlm ICghcmVmY291bnRfcmVhZCgmcGMtPnJlZmNudCkpIHsKKwkJLyogYWxsb2NhdGUgUEMgd2hlbiB0 aGUgcmVmY291bnQgaXMgemVybyAqLworCQltdGtfY3FkbWFfaGFyZF9yZXNldChwYyk7CisKKwkJ LyogZW5hYmxlIGludGVycnVwdCBmb3IgdGhpcyBQQyAqLworCQltdGtfZG1hX3NldChwYywgTVRL X0NRRE1BX0lOVF9FTiwgTVRLX0NRRE1BX0lOVF9FTl9CSVQpOworCisJCS8qCisJCSAqIHJlZmNv dW50X2luYyB3b3VsZCBjb21wbGFpbiBpbmNyZW1lbnQgb24gMDsgdXNlLWFmdGVyLWZyZWUuCisJ CSAqIFRodXMsIHdlIG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgYXMgMSBpbml0aWFsbHkuCisJ CSAqLworCQlyZWZjb3VudF9zZXQoJnBjLT5yZWZjbnQsIDEpOworCX0gZWxzZSB7CisJCXJlZmNv dW50X2luYygmcGMtPnJlZmNudCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGMt PmxvY2ssIGZsYWdzKTsKKworCXZjLT5wYyA9IHBjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIG10a19jcWRtYV9mcmVlX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYykK K3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogZnJlZSBhbGwgZGVzY3JpcHRvcnMgaW4gYWxsIGxp c3RzIG9uIHRoZSBWQyAqLworCW10a19jcWRtYV90ZXJtaW5hdGVfYWxsKGMpOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsKKworCS8qIFBDIGlzIG5vdCBmcmVl ZCB1bnRpbCB0aGVyZSBpcyBubyBWQyBtYXBwZWQgdG8gaXQgKi8KKwlpZiAocmVmY291bnRfZGVj X2FuZF90ZXN0KCZjdmMtPnBjLT5yZWZjbnQpKSB7CisJCS8qIHN0YXJ0IHRoZSBmbHVzaCBvcGVy YXRpb24gYW5kIHN0b3AgdGhlIGVuZ2luZSAqLworCQltdGtfZG1hX3NldChjdmMtPnBjLCBNVEtf Q1FETUFfRkxVU0gsIE1US19DUURNQV9GTFVTSF9CSVQpOworCisJCS8qIHdhaXQgZm9yIHRoZSBj b21wbGV0aW9uIG9mIGZsdXNoIG9wZXJhdGlvbiAqLworCQlpZiAobXRrX2NxZG1hX3BvbGxfZW5n aW5lX2RvbmUoY3ZjLT5wYywgZmFsc2UpIDwgMCkKKwkJCWRldl9lcnIoY3FkbWEyZGV2KHRvX2Nx ZG1hX2RldihjKSksCisJCQkJImNxZG1hIGZsdXNoIHRpbWVvdXRcbiIpOworCisJCS8qIGNsZWFy IHRoZSBmbHVzaCBiaXQgYW5kIGludGVycnVwdCBmbGFnICovCisJCW10a19kbWFfY2xyKGN2Yy0+ cGMsIE1US19DUURNQV9GTFVTSCwgTVRLX0NRRE1BX0ZMVVNIX0JJVCk7CisJCW10a19kbWFfY2xy KGN2Yy0+cGMsIE1US19DUURNQV9JTlRfRkxBRywKKwkJCSAgICBNVEtfQ1FETUFfSU5UX0ZMQUdf QklUKTsKKworCQkvKiBkaXNhYmxlIGludGVycnVwdCBmb3IgdGhpcyBQQyAqLworCQltdGtfZG1h X2NscihjdmMtPnBjLCBNVEtfQ1FETUFfSU5UX0VOLCBNVEtfQ1FETUFfSU5UX0VOX0JJVCk7CisJ fQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3ZjLT5wYy0+bG9jaywgZmxhZ3MpOworfQor CitzdGF0aWMgaW50IG10a19jcWRtYV9od19pbml0KHN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpj cWRtYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CisJdTMyIGk7CisKKwlw bV9ydW50aW1lX2VuYWJsZShjcWRtYTJkZXYoY3FkbWEpKTsKKwlwbV9ydW50aW1lX2dldF9zeW5j KGNxZG1hMmRldihjcWRtYSkpOworCisJZXJyID0gY2xrX3ByZXBhcmVfZW5hYmxlKGNxZG1hLT5j bGspOworCisJaWYgKGVycikgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGNxZG1hMmRldihjcWRt YSkpOworCQlwbV9ydW50aW1lX2Rpc2FibGUoY3FkbWEyZGV2KGNxZG1hKSk7CisJCXJldHVybiBl cnI7CisJfQorCisJLyogcmVzZXQgYWxsIFBDcyAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ ZG1hX2NoYW5uZWxzOyArK2kpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNxZG1hLT5wY1tpXS0+ bG9jaywgZmxhZ3MpOworCQlpZiAobXRrX2NxZG1hX2hhcmRfcmVzZXQoY3FkbWEtPnBjW2ldKSA8 IDApIHsKKwkJCWRldl9lcnIoY3FkbWEyZGV2KGNxZG1hKSwgImNxZG1hIGhhcmQgcmVzZXQgdGlt ZW91dFxuIik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0tPmxvY2ss IGZsYWdzKTsKKworCQkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGNxZG1hLT5jbGspOworCQkJcG1f cnVudGltZV9wdXRfc3luYyhjcWRtYTJkZXYoY3FkbWEpKTsKKwkJCXBtX3J1bnRpbWVfZGlzYWJs ZShjcWRtYTJkZXYoY3FkbWEpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfaHdfZGVpbml0KHN0cnVjdCBtdGtfY3Fk bWFfZGV2aWNlICpjcWRtYSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpOworCisJ LyogcmVzZXQgYWxsIFBDcyAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxz OyArK2kpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3Mp OworCQlpZiAobXRrX2NxZG1hX2hhcmRfcmVzZXQoY3FkbWEtPnBjW2ldKSA8IDApCisJCQlkZXZf ZXJyKGNxZG1hMmRldihjcWRtYSksICJjcWRtYSBoYXJkIHJlc2V0IHRpbWVvdXRcbiIpOworCQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0tPmxvY2ssIGZsYWdzKTsKKwl9CisK KwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3FkbWEtPmNsayk7CisKKwlwbV9ydW50aW1lX3B1dF9z eW5jKGNxZG1hMmRldihjcWRtYSkpOworCXBtX3J1bnRpbWVfZGlzYWJsZShjcWRtYTJkZXYoY3Fk bWEpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXRrX2NxZG1hX21h dGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDY3NjUtY3FkbWEiIH0sCisJ eyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXRrX2NxZG1h X21hdGNoKTsKKworc3RhdGljIGludCBtdGtfY3FkbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAqY3FkbWE7CisJc3RydWN0 IG10a19jcWRtYV92Y2hhbiAqdmM7CisJc3RydWN0IGRtYV9kZXZpY2UgKmRkOworCXN0cnVjdCBy ZXNvdXJjZSAqcmVzOworCWludCBlcnI7CisJdTMyIGk7CisKKwljcWRtYSA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKmNxZG1hKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjcWRtYSkK KwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZCA9ICZjcWRtYS0+ZGRldjsKKworCWNxZG1hLT5jbGsg PSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwgImNxZG1hIik7CisJaWYgKElTX0VSUihjcWRtYS0+ Y2xrKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBjbG9jayBmb3IgJXNcbiIsCisJCQlk ZXZfbmFtZSgmcGRldi0+ZGV2KSk7CisJCXJldHVybiBQVFJfRVJSKGNxZG1hLT5jbGspOworCX0K KworCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGRkLT5jYXBfbWFzayk7CisKKwlkZC0+Y29weV9h bGlnbiA9IE1US19DUURNQV9BTElHTl9TSVpFOworCWRkLT5kZXZpY2VfYWxsb2NfY2hhbl9yZXNv dXJjZXMgPSBtdGtfY3FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZGQtPmRldmljZV9mcmVl X2NoYW5fcmVzb3VyY2VzID0gbXRrX2NxZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJZGQtPmRl dmljZV90eF9zdGF0dXMgPSBtdGtfY3FkbWFfdHhfc3RhdHVzOworCWRkLT5kZXZpY2VfaXNzdWVf cGVuZGluZyA9IG10a19jcWRtYV9pc3N1ZV9wZW5kaW5nOworCWRkLT5kZXZpY2VfcHJlcF9kbWFf bWVtY3B5ID0gbXRrX2NxZG1hX3ByZXBfZG1hX21lbWNweTsKKwlkZC0+ZGV2aWNlX3Rlcm1pbmF0 ZV9hbGwgPSBtdGtfY3FkbWFfdGVybWluYXRlX2FsbDsKKwlkZC0+c3JjX2FkZHJfd2lkdGhzID0g TVRLX0NRRE1BX0RNQV9CVVNXSURUSFM7CisJZGQtPmRzdF9hZGRyX3dpZHRocyA9IE1US19DUURN QV9ETUFfQlVTV0lEVEhTOworCWRkLT5kaXJlY3Rpb25zID0gQklUKERNQV9NRU1fVE9fTUVNKTsK KwlkZC0+cmVzaWR1ZV9ncmFudWxhcml0eSA9IERNQV9SRVNJRFVFX0dSQU5VTEFSSVRZX1NFR01F TlQ7CisJZGQtPmRldiA9ICZwZGV2LT5kZXY7CisJSU5JVF9MSVNUX0hFQUQoJmRkLT5jaGFubmVs cyk7CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUgJiYgb2ZfcHJvcGVydHlfcmVhZF91MzIocGRl di0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgICAiZG1hLXJlcXVlc3RzIiwKKwkJCQkJCSAgICAg ICZjcWRtYS0+ZG1hX3JlcXVlc3RzKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQkiVXNp bmcgJXUgYXMgbWlzc2luZyBkbWEtcmVxdWVzdHMgcHJvcGVydHlcbiIsCisJCQlNVEtfQ1FETUFf TlJfVkNIQU5TKTsKKworCQljcWRtYS0+ZG1hX3JlcXVlc3RzID0gTVRLX0NRRE1BX05SX1ZDSEFO UzsKKwl9CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUgJiYgb2ZfcHJvcGVydHlfcmVhZF91MzIo cGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQkgICAgICAiZG1hLWNoYW5uZWxzIiwKKwkJCQkJCSAg ICAgICZjcWRtYS0+ZG1hX2NoYW5uZWxzKSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsCisJCQki VXNpbmcgJXUgYXMgbWlzc2luZyBkbWEtY2hhbm5lbHMgcHJvcGVydHlcbiIsCisJCQlNVEtfQ1FE TUFfTlJfUENIQU5TKTsKKworCQljcWRtYS0+ZG1hX2NoYW5uZWxzID0gTVRLX0NRRE1BX05SX1BD SEFOUzsKKwl9CisKKwljcWRtYS0+cGMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgY3FkbWEt PmRtYV9jaGFubmVscywKKwkJCQkgc2l6ZW9mKCpjcWRtYS0+cGMpLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIWNxZG1hLT5wYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBpbml0aWFsaXphdGlvbiBm b3IgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5lbHM7ICsraSkgewor CQljcWRtYS0+cGNbaV0gPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgMSwKKwkJCQkJICAgIHNp emVvZigqKmNxZG1hLT5wYyksIEdGUF9LRVJORUwpOworCQlpZiAoIWNxZG1hLT5wY1tpXSkKKwkJ CXJldHVybiAtRU5PTUVNOworCisJCUlOSVRfTElTVF9IRUFEKCZjcWRtYS0+cGNbaV0tPnF1ZXVl KTsKKwkJc3Bpbl9sb2NrX2luaXQoJmNxZG1hLT5wY1tpXS0+bG9jayk7CisJCXJlZmNvdW50X3Nl dCgmY3FkbWEtPnBjW2ldLT5yZWZjbnQsIDApOworCisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNv dXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgaSk7CisJCWlmICghcmVzKSB7CisJCQlkZXZfZXJy KCZwZGV2LT5kZXYsICJObyBtZW0gcmVzb3VyY2UgZm9yICVzXG4iLAorCQkJCWRldl9uYW1lKCZw ZGV2LT5kZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJY3FkbWEtPnBjW2ldLT5i YXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJCWlmIChJU19F UlIoY3FkbWEtPnBjW2ldLT5iYXNlKSkKKwkJCXJldHVybiBQVFJfRVJSKGNxZG1hLT5wY1tpXS0+ YmFzZSk7CisKKwkJLyogYWxsb2NhdGUgSVJRIHJlc291cmNlICovCisJCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgaSk7CisJCWlmICghcmVzKSB7CisJ CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBpcnEgcmVzb3VyY2UgZm9yICVzXG4iLAorCQkJCWRl dl9uYW1lKCZwZGV2LT5kZXYpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWNxZG1hLT5w Y1tpXS0+aXJxID0gcmVzLT5zdGFydDsKKworCQllcnIgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2 LT5kZXYsIGNxZG1hLT5wY1tpXS0+aXJxLAorCQkJCSAgICAgICBtdGtfY3FkbWFfaXJxLCAwLCBk ZXZfbmFtZSgmcGRldi0+ZGV2KSwKKwkJCQkgICAgICAgY3FkbWEpOworCQlpZiAoZXJyKSB7CisJ CQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJInJlcXVlc3RfaXJxIGZhaWxlZCB3aXRoIGVyciAl ZFxuIiwgZXJyKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJLyogYWxsb2NhdGUg cmVzb3VyY2UgZm9yIFZDcyAqLworCWNxZG1hLT52YyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2 LCBjcWRtYS0+ZG1hX3JlcXVlc3RzLAorCQkJCSBzaXplb2YoKmNxZG1hLT52YyksIEdGUF9LRVJO RUwpOworCWlmICghY3FkbWEtPnZjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7 IGkgPCBjcWRtYS0+ZG1hX3JlcXVlc3RzOyBpKyspIHsKKwkJdmMgPSAmY3FkbWEtPnZjW2ldOwor CQl2Yy0+dmMuZGVzY19mcmVlID0gbXRrX2NxZG1hX3ZkZXNjX2ZyZWU7CisJCXZjaGFuX2luaXQo JnZjLT52YywgZGQpOworCQlpbml0X2NvbXBsZXRpb24oJnZjLT5pc3N1ZV9jb21wbGV0aW9uKTsK Kwl9CisKKwllcnIgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKGRkKTsKKwlpZiAoZXJyKQor CQlyZXR1cm4gZXJyOworCisJZXJyID0gb2ZfZG1hX2NvbnRyb2xsZXJfcmVnaXN0ZXIocGRldi0+ ZGV2Lm9mX25vZGUsCisJCQkJCSBvZl9kbWFfeGxhdGVfYnlfY2hhbl9pZCwgY3FkbWEpOworCWlm IChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIk1lZGlhVGVrIENRRE1BIE9GIHJl Z2lzdHJhdGlvbiBmYWlsZWQgJWRcbiIsIGVycik7CisJCWdvdG8gZXJyX3VucmVnaXN0ZXI7CisJ fQorCisJZXJyID0gbXRrX2NxZG1hX2h3X2luaXQoY3FkbWEpOworCWlmIChlcnIpIHsKKwkJZGV2 X2VycigmcGRldi0+ZGV2LAorCQkJIk1lZGlhVGVrIENRRE1BIEhXIGluaXRpYWxpemF0aW9uIGZh aWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwl9CisKKwlwbGF0Zm9y bV9zZXRfZHJ2ZGF0YShwZGV2LCBjcWRtYSk7CisKKwlkZXZfZGJnKCZwZGV2LT5kZXYsICJNZWRp YVRlayBDUURNQSBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX3Vu cmVnaXN0ZXI6CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKGRkKTsKKworCXJldHVybiBl cnI7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYSA9IHBsYXRmb3Jt X2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKnZjOworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBraWxsIFZDIHRhc2sgKi8KKwlmb3IgKGkg PSAwOyBpIDwgY3FkbWEtPmRtYV9yZXF1ZXN0czsgaSsrKSB7CisJCXZjID0gJmNxZG1hLT52Y1tp XTsKKworCQlsaXN0X2RlbCgmdmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOworCQl0YXNrbGV0X2tp bGwoJnZjLT52Yy50YXNrKTsKKwl9CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCWZvciAo aSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNh dmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCQltdGtfZG1hX2NscihjcWRtYS0+cGNb aV0sIE1US19DUURNQV9JTlRfRU4sCisJCQkgICAgTVRLX0NRRE1BX0lOVF9FTl9CSVQpOworCQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0tPmxvY2ssIGZsYWdzKTsKKworCQkv KiBXYWl0cyBmb3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJzIHRvIGNvbXBsZXRlICovCisJCXN5 bmNocm9uaXplX2lycShjcWRtYS0+cGNbaV0tPmlycSk7CisJfQorCisJLyogZGlzYWJsZSBoYXJk d2FyZSAqLworCW10a19jcWRtYV9od19kZWluaXQoY3FkbWEpOworCisJZG1hX2FzeW5jX2Rldmlj ZV91bnJlZ2lzdGVyKCZjcWRtYS0+ZGRldik7CisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2 LT5kZXYub2Zfbm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9y bV9kcml2ZXIgbXRrX2NxZG1hX2RyaXZlciA9IHsKKwkucHJvYmUgPSBtdGtfY3FkbWFfcHJvYmUs CisJLnJlbW92ZSA9IG10a19jcWRtYV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAg ICAgICAgID0gS0JVSUxEX01PRE5BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10a19jcWRtYV9t YXRjaCwKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXRrX2NxZG1hX2RyaXZlcik7 CisKK01PRFVMRV9ERVNDUklQVElPTigiTWVkaWFUZWsgQ1FETUEgQ29udHJvbGxlciBEcml2ZXIi KTsKK01PRFVMRV9BVVRIT1IoIlNodW4tQ2hpaCBZdSA8c2h1bi1jaGloLnl1QG1lZGlhdGVrLmNv bT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK