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: <1536050626-21927-3-git-send-email-shun-chih.yu@mediatek.com> Date: Tue, 4 Sep 2018 16:43:46 +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 dWVzdHMgb250byB0aGUgQ1FETUEgc2ltdWx0YW5lb3VzbHkuCgpTaWduZWQtb2ZmLWJ5OiBTaHVu LUNoaWggWXUgPHNodW4tY2hpaC55dUBtZWRpYXRlay5jb20+Ci0tLQogZHJpdmVycy9kbWEvbWVk aWF0ZWsvS2NvbmZpZyAgICAgfCAgIDEyICsKIGRyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxl ICAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyB8ICA5NTIgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTY1 IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS9tZWRpYXRlay9t dGstY3FkbWEuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDI3YmFjMGIuLjRhMTU4MmQgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvbWVk aWF0ZWsvS2NvbmZpZwpAQCAtMTEsMyArMTEsMTUgQEAgY29uZmlnIE1US19IU0RNQQogCSAgVGhp cyBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8K IAkgIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVSB0aHJvdWdo IHJpbmctCiAJICBiYXNlZCBkZXNjcmlwdG9yIG1hbmFnZW1lbnQuCisKK2NvbmZpZyBNVEtfQ1FE TUEKKwl0cmlzdGF0ZSAiTWVkaWFUZWsgQ29tbWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBzdXBw b3J0IgorCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3Qg RE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUworCWhlbHAKKwkgIEVuYWJs ZSBzdXBwb3J0IGZvciBDb21tYW5kLVF1ZXVlIERNQSBjb250cm9sbGVyIG9uIE1lZGlhVGVrCisJ ICBTb0NzLgorCisJICBUaGlzIGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGNoYW5uZWxzIHdoaWNo IGlzIGRlZGljYXRlZCB0bworCSAgbWVtb3J5LXRvLW1lbW9yeSB0cmFuc2ZlciB0byBvZmZsb2Fk IGZyb20gQ1BVLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQppbmRleCA2ZTc3OGY4Li40MWJiMzgxIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2RtYS9tZWRpYXRlay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2RtYS9t ZWRpYXRlay9NYWtlZmlsZQpAQCAtMSArMSwyIEBACiBvYmotJChDT05GSUdfTVRLX0hTRE1BKSAr PSBtdGstaHNkbWEubworb2JqLSQoQ09ORklHX01US19DUURNQSkgKz0gbXRrLWNxZG1hLm8KZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay1jcWRtYS5jIGIvZHJpdmVycy9kbWEv bWVkaWF0ZWsvbXRrLWNxZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u Yzc0YWFhMwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay1jcWRt YS5jCkBAIC0wLDAgKzEsOTUyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MAorLy8gQ29weXJpZ2h0IChjKSAyMDE4LTIwMTkgTWVkaWFUZWsgSW5jLgorCisvKgorICogRHJp dmVyIGZvciBNZWRpYVRlayBDb21tYW5kLVF1ZXVlIERNQSBDb250cm9sbGVyCisgKgorICogQXV0 aG9yOiBTaHVuLUNoaWggWXUgPHNodW4tY2hpaC55dUBtZWRpYXRlay5jb20+CisgKgorICovCisK KyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNs dWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgor I2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgorI2luY2x1 ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxs aW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4 L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWZjb3VudC5oPgorI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgIi4uL3ZpcnQtZG1hLmgiCisKKyNkZWZpbmUg TVRLX0NRRE1BX1VTRUNfUE9MTAkJMTAKKyNkZWZpbmUgTVRLX0NRRE1BX1RJTUVPVVRfUE9MTAkJ MTAwMAorI2RlZmluZSBNVEtfQ1FETUFfRE1BX0JVU1dJRFRIUwkJQklUKERNQV9TTEFWRV9CVVNX SURUSF80X0JZVEVTKQorI2RlZmluZSBNVEtfQ1FETUFfQUxJR05fU0laRQkJMQorCisvKiBUaGUg ZGVmYXVsdCBudW1iZXIgb2YgdmlydHVhbCBjaGFubmVsICovCisjZGVmaW5lIE1US19DUURNQV9O Ul9WQ0hBTlMJCTMKKworLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIHBoeXNpY2FsIGNoYW5uZWwg Ki8KKyNkZWZpbmUgTVRLX0NRRE1BX05SX1BDSEFOUwkJMworCisvKiBSZWdpc3RlcnMgZm9yIHVu ZGVybHlpbmcgZG1hIG1hbmlwdWxhdGlvbiAqLworI2RlZmluZSBNVEtfQ1FETUFfSU5UX0ZMQUcJ CTB4MAorI2RlZmluZSBNVEtfQ1FETUFfSU5UX0VOCQkweDQKKyNkZWZpbmUgTVRLX0NRRE1BX0VO CQkJMHg4CisjZGVmaW5lIE1US19DUURNQV9SRVNFVAkJCTB4YworI2RlZmluZSBNVEtfQ1FETUFf U1RPUAkJCTB4MTAKKyNkZWZpbmUgTVRLX0NRRE1BX0ZMVVNICQkJMHgxNAorI2RlZmluZSBNVEtf Q1FETUFfU1JDCQkJMHgxYworI2RlZmluZSBNVEtfQ1FETUFfRFNUCQkJMHgyMAorI2RlZmluZSBN VEtfQ1FETUFfTEVOMQkJCTB4MjQKKyNkZWZpbmUgTVRLX0NRRE1BX0xFTjIJCQkweDI4CisjZGVm aW5lIE1US19DUURNQV9TUkMyCQkJMHg2MAorI2RlZmluZSBNVEtfQ1FETUFfRFNUMgkJCTB4NjQK KworLyogUmVnaXN0ZXJzIHNldHRpbmcgKi8KKyNkZWZpbmUgTVRLX0NRRE1BX0VOX0JJVAkJQklU KDApCisjZGVmaW5lIE1US19DUURNQV9JTlRfRkxBR19CSVQJCUJJVCgwKQorI2RlZmluZSBNVEtf Q1FETUFfSU5UX0VOX0JJVAkJQklUKDApCisjZGVmaW5lIE1US19DUURNQV9GTFVTSF9CSVQJCUJJ VCgwKQorCisjZGVmaW5lIE1US19DUURNQV9XQVJNX1JTVF9CSVQJCUJJVCgwKQorI2RlZmluZSBN VEtfQ1FETUFfSEFSRF9SU1RfQklUCQlCSVQoMSkKKworI2RlZmluZSBNVEtfQ1FETUFfTUFYX0xF TgkJKDB4ZmZmZmZmZikKKyNkZWZpbmUgTVRLX0NRRE1BX0FERFJfTElNSVQJCSgweGZmZmZmZmZm KQorI2RlZmluZSBNVEtfQ1FETUFfQUREUjJfU0hGSVQJCSgzMikKKworLyoqCisgKiBzdHJ1Y3Qg bXRrX2NxZG1hX3ZkZXNjIC0gVGhlIHN0cnVjdCBob2xkaW5nIGluZm8gZGVzY3JpYmluZyBwaHlz aWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciAoUEQpCisgKiBAbGVu OiAgICAgICAgICAgICAgICAgICBUaGUgdG90YWwgZGF0YSBzaXplIGRldmljZSB3YW50cyB0byBt b3ZlCisgKiBAc3JjOiAgICAgICAgICAgICAgICAgICBUaGUgc291cmNlIGFkZHJlc3MgZGV2aWNl IHdhbnRzIHRvIG1vdmUgZnJvbQorICogQGRlc3Q6ICAgICAgICAgICAgICAgICAgVGhlIGRlc3Rp bmF0aW9uIGFkZHJlc3MgZGV2aWNlIHdhbnRzIHRvIG1vdmUgdG8KKyAqLworc3RydWN0IG10a19j cWRtYV9wZGVzYyB7CisJc2l6ZV90IGxlbjsKKwlkbWFfYWRkcl90IHNyYzsKKwlkbWFfYWRkcl90 IGRlc3Q7Cit9OworCisvKioKKyAqIHN0cnVjdCBtdGtfY3FkbWFfdmRlc2MgLSBUaGUgc3RydWN0 IGhvbGRpbmcgaW5mbyBkZXNjcmliaW5nIHZpcnR1YWwKKyAqICAgICAgICAgICAgICAgICAgICAg ICAgIGRlc2NyaXB0b3IgKFZEKQorICogQHZkOiAgICAgICAgICAgICAgICAgICAgQW4gaW5zdGFu Y2UgZm9yIHN0cnVjdCB2aXJ0X2RtYV9kZXNjCisgKiBAbGVuOiAgICAgICAgICAgICAgICAgICBU aGUgdG90YWwgZGF0YSBzaXplIGRldmljZSB3YW50cyB0byBtb3ZlCisgKiBAcmVzaWR1ZTogICAg ICAgICAgICAgICBUaGUgcmVtYWluaW5nIGRhdGEgc2l6ZSBkZXZpY2Ugd2lsbCBtb3ZlCisgKiBA ZGVzdDogICAgICAgICAgICAgICAgICBUaGUgZGVzdGluYXRpb24gYWRkcmVzcyBkZXZpY2Ugd2Fu dHMgdG8gbW92ZSB0bworICogQHNyYzogICAgICAgICAgICAgICAgICAgVGhlIHNvdXJjZSBhZGRy ZXNzIGRldmljZSB3YW50cyB0byBtb3ZlIGZyb20KKyAqIEBjaDogICAgICAgICAgICAgICAgICAg IFRoZSBwb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRtYSBjaGFubmVsCisgKiBAcGRfbGlz dAkJICAgVGhlIGFycmF5IGZvciBQRHMKKyAqIEBwZF9saXN0X2xlbgkJICAgVGhlIHNpemUgb2Yg UEQgbGlzdAorICogQHBkX2xpc3RfcHRyICAgICAgICAgICAgVGhlIGluZGV4IG9mIHRoZSBQRCBi ZWluZyBwcm9jZXNzZWQKKyAqIEBub2RlICAgICAgICAgICAgICAgICAgIFRoZSBsaXNlX2hlYWQg c3RydWN0IHRvIGJ1aWxkIGxpbmstbGlzdCBmb3IgVkRzCisgKi8KK3N0cnVjdCBtdGtfY3FkbWFf dmRlc2MgeworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjIHZkOworCXNpemVfdCBsZW47CisJc2l6ZV90 IHJlc2lkdWU7CisJZG1hX2FkZHJfdCBkZXN0OworCWRtYV9hZGRyX3Qgc3JjOworCXN0cnVjdCBk bWFfY2hhbiAqY2g7CisKKwlzaXplX3QgcGRfbGlzdF9sZW47CisJc2l6ZV90IHBkX2xpc3RfcHRy OworCXN0cnVjdCBtdGtfY3FkbWFfcGRlc2MgKipwZF9saXN0OworCisJc3RydWN0IGxpc3RfaGVh ZCBub2RlOworfTsKKworLyoqCisgKiBzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuIC0gVGhlIHN0cnVj dCBob2xkaW5nIGluZm8gZGVzY3JpYmluZyBwaHlzaWNhbAorICogICAgICAgICAgICAgICAgICAg ICAgICAgY2hhbm5lbCAoUEMpCisgKiBAcXVldWU6ICAgICAgICAgICAgICAgICBRdWV1ZSBmb3Ig dGhlIFBEcyBpc3N1ZWQgdG8gdGhpcyBQQworICogQGJhc2U6ICAgICAgICAgICAgICAgICAgVGhl IG1hcHBlZCByZWdpc3RlciBJL08gYmFzZSBvZiB0aGlzIFBDCisgKiBAaXJxOiAgICAgICAgICAg ICAgICAgICBUaGUgSVJRIHRoYXQgdGhpcyBQQyBhcmUgdXNpbmcKKyAqIEByZWZjbnQ6ICAgICAg ICAgICAgICAgIFRyYWNrIGhvdyBtYW55IFZDcyBhcmUgdXNpbmcgdGhpcyBQQworICogQGxvY2s6 ICAgICAgICAgICAgICAgICAgTG9jayBwcm90ZWN0IGFnYWlzdGluZyBtdWx0aXBsZSBWQ3MgYWNj ZXNzIFBDCisgKi8KK3N0cnVjdCBtdGtfY3FkbWFfcGNoYW4geworCXN0cnVjdCBsaXN0X2hlYWQg cXVldWU7CisJdm9pZCBfX2lvbWVtICpiYXNlOworCXUzMiBpcnE7CisKKwlyZWZjb3VudF90IHJl ZmNudDsKKworCS8qIGxvY2sgdG8gcHJvdGVjdCBQQyAqLworCXNwaW5sb2NrX3QgbG9jazsKK307 CisKKy8qKgorICogc3RydWN0IG10a19jcWRtYV92Y2hhbiAtIFRoZSBzdHJ1Y3QgaG9sZGluZyBp bmZvIGRlc2NyaWJpbmcgdmlydHVhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5l bCAoVkMpCisgKiBAdmM6ICAgICAgICAgICAgICAgICAgICBBbiBpbnN0YW5jZSBmb3Igc3RydWN0 IHZpcnRfZG1hX2NoYW4KKyAqIEBwYzogICAgICAgICAgICAgICAgICAgIFRoZSBwb2ludGVyIHRv IHRoZSB1bmRlcmx5aW5nIFBDCisgKiBAaXNzdWVfY29tcGxldGlvbjoJICAgVGhlIHdhaXQgZm9y IGFsbCBpc3N1ZWQgZGVzY3JpcHRvcnMgY29tcGxldGl0ZWQKKyAqIEBpc3N1ZV9zeW5jaHJvbml6 ZToJICAgQm9vbCBpbmRpY2F0aW5nIGNoYW5uZWwgc3luY2hyb25pemF0aW9uIHN0YXJ0cworICov CitzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuIHsKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbiB2YzsKKwlz dHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYzsKKwlzdHJ1Y3QgY29tcGxldGlvbiBpc3N1ZV9jb21w bGV0aW9uOworCWJvb2wgaXNzdWVfc3luY2hyb25pemU7Cit9OworCisvKioKKyAqIHN0cnVjdCBt dGtfY3FkbWFfZGV2aWNlIC0gVGhlIHN0cnVjdCBob2xkaW5nIGluZm8gZGVzY3JpYmluZyBDUURN QQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZQorICogQGRkZXY6ICAgICAgICAg ICAgICAgICAgIEFuIGluc3RhbmNlIGZvciBzdHJ1Y3QgZG1hX2RldmljZQorICogQGNsazogICAg ICAgICAgICAgICAgICAgIFRoZSBjbG9jayB0aGF0IGRldmljZSBpbnRlcm5hbCBpcyB1c2luZwor ICogQGRtYV9yZXF1ZXN0czogICAgICAgICAgIFRoZSBudW1iZXIgb2YgVkNzIHRoZSBkZXZpY2Ug c3VwcG9ydHMgdG8KKyAqIEBkbWFfY2hhbm5lbHM6ICAgICAgICAgICBUaGUgbnVtYmVyIG9mIFBD cyB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvCisgKiBAdmM6ICAgICAgICAgICAgICAgICAgICAgVGhl IHBvaW50ZXIgdG8gYWxsIGF2YWlsYWJsZSBWQ3MKKyAqIEBwYzogICAgICAgICAgICAgICAgICAg ICBUaGUgcG9pbnRlciB0byBhbGwgdGhlIHVuZGVybHlpbmcgUENzCisgKi8KK3N0cnVjdCBtdGtf Y3FkbWFfZGV2aWNlIHsKKwlzdHJ1Y3QgZG1hX2RldmljZSBkZGV2OworCXN0cnVjdCBjbGsgKmNs azsKKworCXUzMiBkbWFfcmVxdWVzdHM7CisJdTMyIGRtYV9jaGFubmVsczsKKwlzdHJ1Y3QgbXRr X2NxZG1hX3ZjaGFuICp2YzsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICoqcGM7Cit9OworCitz dGF0aWMgc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKnRvX2NxZG1hX2RldihzdHJ1Y3QgZG1hX2No YW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGFuLT5kZXZpY2UsIHN0cnVjdCBt dGtfY3FkbWFfZGV2aWNlLCBkZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBtdGtfY3FkbWFfdmNo YW4gKnRvX2NxZG1hX3ZjaGFuKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlyZXR1cm4gY29u dGFpbmVyX29mKGNoYW4sIHN0cnVjdCBtdGtfY3FkbWFfdmNoYW4sIHZjLmNoYW4pOworfQorCitz dGF0aWMgc3RydWN0IG10a19jcWRtYV92ZGVzYyAqdG9fY3FkbWFfdmRlc2Moc3RydWN0IHZpcnRf ZG1hX2Rlc2MgKnZkKQoreworCXJldHVybiBjb250YWluZXJfb2YodmQsIHN0cnVjdCBtdGtfY3Fk bWFfdmRlc2MsIHZkKTsKK30KKworc3RhdGljIHN0cnVjdCBkZXZpY2UgKmNxZG1hMmRldihzdHJ1 Y3QgbXRrX2NxZG1hX2RldmljZSAqY3FkbWEpCit7CisJcmV0dXJuIGNxZG1hLT5kZGV2LmRldjsK K30KKworc3RhdGljIHUzMiBtdGtfZG1hX3JlYWQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMs IHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHBjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGlj IHZvaWQgbXRrX2RtYV93cml0ZShzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYywgdTMyIHJlZywg dTMyIHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2YWwsIHBjLT5iYXNlICsgcmVnKTsKK30KKwor c3RhdGljIHZvaWQgbXRrX2RtYV9ybXcoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiBy ZWcsCisJCQl1MzIgbWFzaywgdTMyIHNldCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0gbXRrX2Rt YV9yZWFkKHBjLCByZWcpOworCXZhbCAmPSB+bWFzazsKKwl2YWwgfD0gc2V0OworCW10a19kbWFf d3JpdGUocGMsIHJlZywgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV9zZXQoc3RydWN0 IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJbXRrX2RtYV9ybXco cGMsIHJlZywgMCwgdmFsKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV9jbHIoc3RydWN0IG10 a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJbXRrX2RtYV9ybXcocGMs IHJlZywgdmFsLCAwKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2NxZG1hX3ZkZXNjX2ZyZWUoc3Ry dWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmRlc2MgKmN2ZCA9 IHRvX2NxZG1hX3ZkZXNjKHZkKTsKKwlzaXplX3QgaTsKKworCS8qIGZyZWUgUEQgbGlzdCAqLwor CWZvciAoaSA9IDA7IGkgPCBjdmQtPnBkX2xpc3RfbGVuOyArK2kpCisJCWtmcmVlKGN2ZC0+cGRf bGlzdFtpXSk7CisJa2ZyZWUoY3ZkLT5wZF9saXN0KTsKKworCS8qIGZyZWUgVkQgKi8KKwlrZnJl ZShjdmQpOworfQorCitzdGF0aWMgaW50IG10a19jcWRtYV9wb2xsX2VuZ2luZV9kb25lKHN0cnVj dCBtdGtfY3FkbWFfcGNoYW4gKnBjKQoreworCXUzMiBzdGF0dXMgPSAwOworCisJcmV0dXJuIHJl YWRsX3BvbGxfdGltZW91dChwYy0+YmFzZSArIE1US19DUURNQV9FTiwgc3RhdHVzLAorCQkJCSAg IShzdGF0dXMgJiBNVEtfQ1FETUFfRU5fQklUKSwKKwkJCQkgIE1US19DUURNQV9VU0VDX1BPTEws CisJCQkJICBNVEtfQ1FETUFfVElNRU9VVF9QT0xMKTsKK30KKworc3RhdGljIGludCBtdGtfY3Fk bWFfd2FybV9yZXNldChzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYykKK3sKKwltdGtfZG1hX3Nl dChwYywgTVRLX0NRRE1BX1JFU0VULCBNVEtfQ1FETUFfV0FSTV9SU1RfQklUKTsKKworCXJldHVy biBtdGtfY3FkbWFfcG9sbF9lbmdpbmVfZG9uZShwYyk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2Nx ZG1hX2hhcmRfcmVzZXQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMpCit7CisJbXRrX2RtYV9z ZXQocGMsIE1US19DUURNQV9SRVNFVCwgTVRLX0NRRE1BX0hBUkRfUlNUX0JJVCk7CisJbXRrX2Rt YV9jbHIocGMsIE1US19DUURNQV9SRVNFVCwgTVRLX0NRRE1BX0hBUkRfUlNUX0JJVCk7CisKKwly ZXR1cm4gbXRrX2NxZG1hX3BvbGxfZW5naW5lX2RvbmUocGMpOworfQorCitzdGF0aWMgdm9pZCBt dGtfY3FkbWFfc3RhcnQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMpCit7CisJbXRrX2RtYV9z ZXQocGMsIE1US19DUURNQV9FTiwgTVRLX0NRRE1BX0VOX0JJVCk7Cit9CisKK3N0YXRpYyBpbnQg bXRrX2NxZG1hX3N0b3Aoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMpCit7CisJaW50IGVycjsK KworCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FETUFfRkxVU0gsIE1US19DUURNQV9GTFVTSF9CSVQp OworCisJZXJyID0gbXRrX2NxZG1hX3BvbGxfZW5naW5lX2RvbmUocGMpOworCisJbXRrX2RtYV9j bHIocGMsIE1US19DUURNQV9GTFVTSCwgTVRLX0NRRE1BX0ZMVVNIX0JJVCk7CisJbXRrX2RtYV9j bHIocGMsIE1US19DUURNQV9JTlRfRkxBRywgTVRLX0NRRE1BX0lOVF9GTEFHX0JJVCk7CisKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfc2V0X3RyYW4oc3RydWN0IG10 a19jcWRtYV9wY2hhbiAqcGMsIGRtYV9hZGRyX3Qgc3JjLAorCQkJICAgICAgIGRtYV9hZGRyX3Qg ZGVzdCwgc2l6ZV90IGxlbikKK3sKKwkvKiBzZXR1cCBzb3VyY2UgKi8KKwltdGtfZG1hX3NldChw YywgTVRLX0NRRE1BX1NSQywgc3JjICYgTVRLX0NRRE1BX0FERFJfTElNSVQpOworCW10a19kbWFf c2V0KHBjLCBNVEtfQ1FETUFfU1JDMiwgc3JjID4+IE1US19DUURNQV9BRERSMl9TSEZJVCk7CisK KwkvKiBzZXR1cCBkZXN0aW5hdGlvbiAqLworCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FETUFfRFNU LCBkZXN0ICYgTVRLX0NRRE1BX0FERFJfTElNSVQpOworCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FE TUFfRFNUMiwgZGVzdCA+PiBNVEtfQ1FETUFfQUREUjJfU0hGSVQpOworCisJLyogc2V0dXAgbGVu Z3RoICovCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9MRU4xLCBsZW4pOworfQorCitzdGF0 aWMgdm9pZCBtdGtfY3FkbWFfYWxsb2NfcGNoYW4oc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMp Cit7CisJLyogaGFyZCByZXNldCB0aGUgZG1hIGVuZ2luZSAqLworCW10a19jcWRtYV9oYXJkX3Jl c2V0KHBjKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgUEMgKi8KKwltdGtfZG1h X3NldChwYywgTVRLX0NRRE1BX0lOVF9FTiwgTVRLX0NRRE1BX0lOVF9FTl9CSVQpOworfQorCitz dGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9wY2hhbihzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpw YykKK3sKKwkvKiBzdG9wIHRoZSBlbmdpbmUgYW5kIHdhaXQgZm9yIGVuZ2luZSBzdG9wICovCisJ aWYgKG10a19jcWRtYV9zdG9wKHBjKSA8IDApCisJCXByX3dhcm4oImNxZG1hIHN0b3AgdGltZW91 dFxuIik7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCBmb3IgdGhpcyBQQyAqLworCW10a19kbWFf Y2xyKHBjLCBNVEtfQ1FETUFfSU5UX0VOLCBNVEtfQ1FETUFfSU5UX0VOX0JJVCk7Cit9CisKK3N0 YXRpYyB2b2lkIG10a19jcWRtYV9zdGFydF90cmFuKHN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBj LAorCQkJCSBzdHJ1Y3QgbXRrX2NxZG1hX3BkZXNjICpjcGQpCit7CisJLyogcmVzZXQgdGhlIGRt YSBlbmdpbmUgZm9yIHRoZSB0cmFuc2FjdGlvbiAqLworCWlmIChtdGtfY3FkbWFfd2FybV9yZXNl dChwYykgPCAwKQorCQlwcl93YXJuKCJjcWRtYSB3YXJtIHJlc2V0IHRpbWVvdXRcbiIpOworCisJ Lyogc2V0dXAgZG1hIGVuZ2luZSBmb3IgdGhpcyBQRCAqLworCW10a19jcWRtYV9zZXRfdHJhbihw YywgY3BkLT5zcmMsIGNwZC0+ZGVzdCwgY3BkLT5sZW4pOworCisJLyogc3RhcnQgZG1hIGVuZ2lu ZSAqLworCW10a19jcWRtYV9zdGFydChwYyk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX2lz c3VlX3BlbmRpbmdfdmRlc2Moc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKmNxZG1hLAorCQkJCQkg c3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsCisJCQkJCSBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNj ICpjdmQpCit7CisJYm9vbCB0cmlnZ2VyX2VuZ2luZSA9IGZhbHNlOworCisJaWYgKCFjdmQtPnBk X2xpc3QpCisJCXJldHVybiAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcGMtPmxvY2spOwor CisJLyogbmVlZCB0byB0cmlnZ2VyIGRtYSBlbmdpbmUgaWYgUEMncyBxdWV1ZSBpcyBlbXB0eSAq LworCWlmIChsaXN0X2VtcHR5KCZwYy0+cXVldWUpKQorCQl0cmlnZ2VyX2VuZ2luZSA9IHRydWU7 CisKKwkvKiBhZGQgVkQgaW50byBQQydzIHF1ZXVlICovCisJbGlzdF9hZGRfdGFpbCgmY3ZkLT5u b2RlLCAmcGMtPnF1ZXVlKTsKKworCS8qIHN0YXJ0IHRyYW5zYWN0aW9uIGZvciB0aGlzIFZEICov CisJaWYgKHRyaWdnZXJfZW5naW5lKQorCQltdGtfY3FkbWFfc3RhcnRfdHJhbihwYywgY3ZkLT5w ZF9saXN0W2N2ZC0+cGRfbGlzdF9wdHJdKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBtdGtfY3FkbWFfaXNzdWVfdmNoYW5fcGVuZGluZyhzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAq Y3FkbWEsCisJCQkJCSAgc3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjKQoreworCXN0cnVjdCB2 aXJ0X2RtYV9kZXNjICp2ZCwgKnZkMjsKKwlpbnQgZXJyOworCisJbG9ja2RlcF9hc3NlcnRfaGVs ZCgmY3ZjLT52Yy5sb2NrKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2ZCwgdmQyLCAm Y3ZjLT52Yy5kZXNjX2lzc3VlZCwgbm9kZSkgeworCQlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpj dmQ7CisKKwkJY3ZkID0gdG9fY3FkbWFfdmRlc2ModmQpOworCisJCS8qIGlzc3VlIFZEIHRvIFBD J3MgcXVldWUgKi8KKwkJZXJyID0gbXRrX2NxZG1hX2lzc3VlX3BlbmRpbmdfdmRlc2MoY3FkbWEs IGN2Yy0+cGMsIGN2ZCk7CisKKwkJaWYgKGVyciA9PSAtRU5PU1BDKQorCQkJYnJlYWs7CisKKwkJ LyogcmVtb3ZlIFZEIGZyb20gbGlzdCBkZXNjX2lzc3VlZCAqLworCQlsaXN0X2RlbCgmdmQtPm5v ZGUpOworCX0KK30KKworLyoKKyAqIHJldHVybiB0cnVlIGlmIHRoaXMgVkMgaXMgYWN0aXZlLAor ICogbWVhbmluZyB0aGF0IHRoZXJlIGFyZSBWRHMgdW5kZXIgcHJvY2Vzc2luZyBieSB0aGUgUEMK KyAqLworc3RhdGljIGJvb2wgbXRrX2NxZG1hX2lzX3ZjaGFuX2FjdGl2ZShzdHJ1Y3QgbXRrX2Nx ZG1hX3ZjaGFuICpjdmMpCit7CisJc3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkOworCisJbGlz dF9mb3JfZWFjaF9lbnRyeShjdmQsICZjdmMtPnBjLT5xdWV1ZSwgbm9kZSkKKwkJaWYgKGN2YyA9 PSB0b19jcWRtYV92Y2hhbihjdmQtPmNoKSkKKwkJCXJldHVybiB0cnVlOworCisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfY29uc3VtZV93b3JrX3F1ZXVlKHN0cnVj dCBtdGtfY3FkbWFfcGNoYW4gKnBjKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YzsK KwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisKKwkvKiBjb25zdW1lIGEgVkQgZnJvbSBx dWV1ZSAqLworCWN2ZCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGMtPnF1ZXVlLAorCQkJ CSAgICAgICBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjLCBub2RlKTsKKwlpZiAodW5saWtlbHkoIWN2 ZCkpCisJCXJldHVybjsKKworCS8qIHVwZGF0ZSByZXNpZHVlIG9mIFZEICovCisJY3ZkLT5yZXNp ZHVlIC09IGN2ZC0+cGRfbGlzdFtjdmQtPnBkX2xpc3RfcHRyXS0+bGVuOworCisJY3ZjID0gdG9f Y3FkbWFfdmNoYW4oY3ZkLT5jaCk7CisKKwlpZiAoY3ZkLT5wZF9saXN0X3B0ciA9PSBjdmQtPnBk X2xpc3RfbGVuIC0gMSkgeworCQkvKiBkZWxldGUgVkQgZnJvbSBxdWV1ZSBpZiBpdHMgUEQgbGlz dCBjb21wbGV0ZWQgKi8KKwkJbGlzdF9kZWwoJmN2ZC0+bm9kZSk7CisKKwkJc3Bpbl9sb2NrKCZj dmMtPnZjLmxvY2spOworCisJCS8qIGFkZCBWRCBpbnRvIGxpc3QgZGVzY19jb21wbGV0ZWQgKi8K KwkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZjdmQtPnZkKTsKKworCQkvKiBzZXR1cCBjb21wbGV0 aW9uIGlmIHRoaXMgVkMgaXMgdW5kZXIgc3luY2hyb25pemF0aW9uICovCisJCWlmIChjdmMtPmlz c3VlX3N5bmNocm9uaXplICYmICFtdGtfY3FkbWFfaXNfdmNoYW5fYWN0aXZlKGN2YykpIHsKKwkJ CWNvbXBsZXRlKCZjdmMtPmlzc3VlX2NvbXBsZXRpb24pOworCQkJY3ZjLT5pc3N1ZV9zeW5jaHJv bml6ZSA9IGZhbHNlOworCQl9CisKKwkJc3Bpbl91bmxvY2soJmN2Yy0+dmMubG9jayk7CisJfSBl bHNlIHsKKwkJLyogdGhlcmUgYXJlIHBoeXNpY2FsIGRlc2NzIHF1ZXVlaW5nIHRvIGJlIHNlcnZl ZCAqLworCQljdmQtPnBkX2xpc3RfcHRyKys7CisJfQorCisJLyogc3RhcnQgdHJhbnNhY3Rpb24g Zm9yIG5leHQgUEQgaWYgcXVldWUgaXMgbm90IGVtcHR5ICovCisJY3ZkID0gbGlzdF9maXJzdF9l bnRyeV9vcl9udWxsKCZwYy0+cXVldWUsCisJCQkJICAgICAgIHN0cnVjdCBtdGtfY3FkbWFfdmRl c2MsIG5vZGUpOworCWlmIChjdmQpCisJCW10a19jcWRtYV9zdGFydF90cmFuKHBjLCBjdmQtPnBk X2xpc3RbY3ZkLT5wZF9saXN0X3B0cl0pOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbXRrX2Nx ZG1hX2lycShpbnQgaXJxLCB2b2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX2Rldmlj ZSAqY3FkbWEgPSBkZXZpZDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKwl1MzIgaTsK KworCS8qIGNsZWFyIGludGVycnVwdCBmbGFncyBmb3IgZWFjaCBQQyAqLworCWZvciAoaSA9IDA7 IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyArK2kpIHsKKwkJc3Bpbl9sb2NrKCZjcWRtYS0+cGNb aV0tPmxvY2spOworCQlpZiAobXRrX2RtYV9yZWFkKGNxZG1hLT5wY1tpXSwKKwkJCQkgTVRLX0NR RE1BX0lOVF9GTEFHKSAmIE1US19DUURNQV9JTlRfRkxBR19CSVQpIHsKKwkJCS8qIGNsZWFyIGlu dGVycnVwdCAqLworCQkJbXRrX2RtYV9jbHIoY3FkbWEtPnBjW2ldLCBNVEtfQ1FETUFfSU5UX0ZM QUcsCisJCQkJICAgIE1US19DUURNQV9JTlRfRkxBR19CSVQpOworCisJCQkvKiBjb25zdW1lIHRo ZSBxdWV1ZSAqLworCQkJbXRrX2NxZG1hX2NvbnN1bWVfd29ya19xdWV1ZShjcWRtYS0+cGNbaV0p OworCQkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJCX0KKwkJc3Bpbl91bmxvY2soJmNxZG1hLT5wY1tp XS0+bG9jayk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB2aXJ0X2Rt YV9kZXNjICptdGtfY3FkbWFfZmluZF9hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1hX2NoYW4gKmMsCisJ CQkJCQkJZG1hX2Nvb2tpZV90IGNvb2tpZSkKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpj dmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBm bGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZCwgJmN2Yy0+cGMtPnF1ZXVlLCBub2RlKQor CQlpZiAodmQtPnR4LmNvb2tpZSA9PSBjb29raWUpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiB2ZDsKKwkJfQorCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsKKworCWxpc3RfZm9yX2VhY2hf ZW50cnkodmQsICZjdmMtPnZjLmRlc2NfaXNzdWVkLCBub2RlKQorCQlpZiAodmQtPnR4LmNvb2tp ZSA9PSBjb29raWUpCisJCQlyZXR1cm4gdmQ7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGlj IGVudW0gZG1hX3N0YXR1cyBtdGtfY3FkbWFfdHhfc3RhdHVzKHN0cnVjdCBkbWFfY2hhbiAqYywK KwkJCQkJICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJCQkJICAgc3RydWN0IGRtYV90eF9zdGF0 ZSAqdHhzdGF0ZSkKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMgPSB0b19jcWRtYV92 Y2hhbihjKTsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisJc3RydWN0IHZpcnRfZG1h X2Rlc2MgKnZkOworCWVudW0gZG1hX3N0YXR1cyByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KwlzaXplX3QgYnl0ZXMgPSAwOworCisJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMoYywgY29va2ll LCB0eHN0YXRlKTsKKwlpZiAocmV0ID09IERNQV9DT01QTEVURSB8fCAhdHhzdGF0ZSkKKwkJcmV0 dXJuIHJldDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMtPnZjLmxvY2ssIGZsYWdzKTsKKwl2 ZCA9IG10a19jcWRtYV9maW5kX2FjdGl2ZV9kZXNjKGMsIGNvb2tpZSk7CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmY3ZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwlpZiAodmQpIHsKKwkJY3ZkID0g dG9fY3FkbWFfdmRlc2ModmQpOworCQlieXRlcyA9IGN2ZC0+cmVzaWR1ZTsKKwl9CisKKwlkbWFf c2V0X3Jlc2lkdWUodHhzdGF0ZSwgYnl0ZXMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IHZvaWQgbXRrX2NxZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjKQoreworCXN0 cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYSA9IHRvX2NxZG1hX2RldihjKTsKKwlzdHJ1Y3Qg bXRrX2NxZG1hX3ZjaGFuICpjdmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwl1bnNpZ25lZCBsb25n IHBjX2ZsYWdzOworCXVuc2lnbmVkIGxvbmcgdmNfZmxhZ3M7CisKKwkvKiBhY3F1aXJlIFBDJ3Mg bG9jayBmaXJzdCBkdWUgdG8gbG9jayBkZXBlbmRlbmN5IGluIElTUiAqLworCXNwaW5fbG9ja19p cnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2 Yy0+dmMubG9jaywgdmNfZmxhZ3MpOworCisJaWYgKHZjaGFuX2lzc3VlX3BlbmRpbmcoJmN2Yy0+ dmMpKQorCQltdGtfY3FkbWFfaXNzdWVfdmNoYW5fcGVuZGluZyhjcWRtYSwgY3ZjKTsKKworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+dmMubG9jaywgdmNfZmxhZ3MpOworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIHBjX2ZsYWdzKTsKK30KKworc3RhdGljIHN0 cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCittdGtfY3FkbWFfcHJlcF9kbWFfbWVtY3B5 KHN0cnVjdCBkbWFfY2hhbiAqYywgZG1hX2FkZHJfdCBkZXN0LAorCQkJICBkbWFfYWRkcl90IHNy Yywgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1h X3ZkZXNjICpjdmQ7CisJc2l6ZV90IHBkX2xpc3RfbGVuLCB0bGVuLCBpOworCisJY3ZkID0ga3ph bGxvYyhzaXplb2YoKmN2ZCksIEdGUF9OT1dBSVQpOworCWlmICghY3ZkKQorCQlyZXR1cm4gTlVM TDsKKworCS8qIHNldHVwIGRtYSBjaGFubmVsICovCisJY3ZkLT5jaCA9IGM7CisKKwkvKiBzZXR1 cCBzb3VyZWNlLCBkZXN0aW5hdGlvbiwgYW5kIGxlbmd0aCAqLworCWN2ZC0+bGVuID0gbGVuOwor CWN2ZC0+cmVzaWR1ZSA9IGxlbjsKKwljdmQtPnNyYyA9IHNyYzsKKwljdmQtPmRlc3QgPSBkZXN0 OworCisJLyogc2V0dXAgUEQgbGlzdCAqLworCXBkX2xpc3RfbGVuID0gRElWX1JPVU5EX1VQKGxl biwgTVRLX0NRRE1BX01BWF9MRU4pOworCWN2ZC0+cGRfbGlzdF9sZW4gPSBwZF9saXN0X2xlbjsK KwljdmQtPnBkX2xpc3RfcHRyID0gMDsKKworCWN2ZC0+cGRfbGlzdCA9IGtjYWxsb2MocGRfbGlz dF9sZW4sIHNpemVvZihzdHJ1Y3QgbXRrX2NxZG1hX3BkZXNjICoqKSwKKwkJCSAgICAgICBHRlBf Tk9XQUlUKTsKKwlpZiAoIWN2ZC0+cGRfbGlzdCkgeworCQlrZnJlZShjdmQpOworCQlyZXR1cm4g TlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRfbGlzdF9sZW47ICsraSkgeworCQljdmQt PnBkX2xpc3RbaV0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbXRrX2NxZG1hX3BkZXNjICopLAor CQkJCQkgIEdGUF9OT1dBSVQpOworCQlpZiAoIWN2ZC0+cGRfbGlzdFtpXSkgeworCQkJZm9yICg7 IGkgPiAwOyAtLWkpCisJCQkJa2ZyZWUoY3ZkLT5wZF9saXN0W2kgLSAxXSk7CisJCQlrZnJlZShj dmQtPnBkX2xpc3QpOworCQkJa2ZyZWUoY3ZkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJ dGxlbiA9IChsZW4gPiBNVEtfQ1FETUFfTUFYX0xFTikgPyBNVEtfQ1FETUFfTUFYX0xFTiA6IGxl bjsKKworCQljdmQtPnBkX2xpc3RbaV0tPnNyYyA9IGN2ZC0+c3JjICsgY3ZkLT5sZW4gLSB0bGVu OworCQljdmQtPnBkX2xpc3RbaV0tPmRlc3QgPSBjdmQtPmRlc3QgKyBjdmQtPmxlbiAtIHRsZW47 CisJCWN2ZC0+cGRfbGlzdFtpXS0+bGVuID0gdGxlbjsKKwkJbGVuIC09IHRsZW47CisJfQorCisJ cmV0dXJuIHZjaGFuX3R4X3ByZXAodG9fdmlydF9jaGFuKGMpLCAmY3ZkLT52ZCwgZmxhZ3MpOwor fQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9pbmFjdGl2ZV9kZXNjKHN0cnVjdCBkbWFf Y2hhbiAqYykKK3sKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMgPSB0b192aXJ0X2NoYW4oYyk7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwkvKgorCSAqIHNl dCBkZXNjX2FsbG9jYXRlZCwgZGVzY19zdWJtaXR0ZWQsCisJICogYW5kIGRlc2NfaXNzdWVkIGFz IHRoZSBjYW5kaWNhdGVzIHRvIGJlIGZyZWVkCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZj LT5sb2NrLCBmbGFncyk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ2Yy0+ZGVzY19hbGxvY2F0 ZWQsICZoZWFkKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnZjLT5kZXNjX3N1Ym1pdHRlZCwg JmhlYWQpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdmMtPmRlc2NfaXNzdWVkLCAmaGVhZCk7 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmMtPmxvY2ssIGZsYWdzKTsKKworCS8qIGZyZWUg ZGVzY3JpcHRvciBsaXN0cyAqLworCXZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdCh2YywgJmhlYWQp OworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1h X2NoYW4gKmMpCit7CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNo YW4oYyk7CisJYm9vbCBzeW5jX25lZWRlZCA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgcGNfZmxh Z3M7CisJdW5zaWduZWQgbG9uZyB2Y19mbGFnczsKKworCS8qIGFjcXVpcmUgUEMncyBsb2NrIGZp cnN0IGR1ZSB0byBsb2NrIGRlcGVuZGVuY3kgaW4gZG1hIElTUiAqLworCXNwaW5fbG9ja19pcnFz YXZlKCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+ dmMubG9jaywgdmNfZmxhZ3MpOworCisJLyogc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkIGlm IHRoaXMgVkMgaXMgYWN0aXZlICovCisJaWYgKG10a19jcWRtYV9pc192Y2hhbl9hY3RpdmUoY3Zj KSkgeworCQljdmMtPmlzc3VlX3N5bmNocm9uaXplID0gdHJ1ZTsKKwkJc3luY19uZWVkZWQgPSB0 cnVlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+dmMubG9jaywgdmNfZmxh Z3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIHBjX2ZsYWdzKTsK KworCS8qIHdhaXRpbmcgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoaXMgVkMgKi8KKwlpZiAoc3lu Y19uZWVkZWQpCisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJmN2Yy0+aXNzdWVfY29tcGxldGlvbik7 CisKKwkvKiBmcmVlIGFsbCBkZXNjcmlwdG9ycyBpbiBsaXN0IGRlc2NfY29tcGxldGVkICovCisJ dmNoYW5fc3luY2hyb25pemUoJmN2Yy0+dmMpOworCisJV0FSTl9PTkNFKCFsaXN0X2VtcHR5KCZj dmMtPnZjLmRlc2NfY29tcGxldGVkKSwKKwkJICAiRGVzYyBwZW5kaW5nIHN0aWxsIGluIGxpc3Qg ZGVzY19jb21wbGV0ZWRcbiIpOworfQorCitzdGF0aWMgaW50IG10a19jcWRtYV90ZXJtaW5hdGVf YWxsKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwkvKiBmcmVlIGRlc2NyaXB0b3JzIG5vdCBwcm9j ZXNzZWQgeWV0IGJ5IGhhcmR3YXJlICovCisJbXRrX2NxZG1hX2ZyZWVfaW5hY3RpdmVfZGVzYyhj KTsKKworCS8qIGZyZWUgZGVzY3JpcHRvcnMgYmVpbmcgcHJvY2Vzc2VkIGJ5IGhhcmR3YXJlICov CisJbXRrX2NxZG1hX2ZyZWVfYWN0aXZlX2Rlc2MoYyk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBtdGtfY3FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpj KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYSA9IHRvX2NxZG1hX2RldihjKTsK KwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICp2YyA9IHRvX2NxZG1hX3ZjaGFuKGMpOworCXN0cnVj dCBtdGtfY3FkbWFfcGNoYW4gKnBjID0gTlVMTDsKKwl1MzIgaSwgbWluX3JlZmNudCA9IFUzMl9N QVgsIHJlZmNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogYWxsb2NhdGUgUEMgd2l0 aCB0aGUgbWluaW11biByZWZjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2No YW5uZWxzOyArK2kpIHsKKwkJcmVmY250ID0gcmVmY291bnRfcmVhZCgmY3FkbWEtPnBjW2ldLT5y ZWZjbnQpOworCQlpZiAocmVmY250IDwgbWluX3JlZmNudCkgeworCQkJcGMgPSBjcWRtYS0+cGNb aV07CisJCQltaW5fcmVmY250ID0gcmVmY250OworCQl9CisJfQorCisJaWYgKCFwYykKKwkJcmV0 dXJuIC1FTk9TUEM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGMtPmxvY2ssIGZsYWdzKTsKKwor CWlmICghcmVmY291bnRfcmVhZCgmcGMtPnJlZmNudCkpIHsKKwkJLyogYWxsb2NhdGUgUEMgd2hl biB0aGUgcmVmY291bnQgaXMgemVybyAqLworCQltdGtfY3FkbWFfYWxsb2NfcGNoYW4ocGMpOwor CQkvKgorCQkgKiByZWZjb3VudF9pbmMgd291bGQgY29tcGxhaW4gaW5jcmVtZW50IG9uIDA7IHVz ZS1hZnRlci1mcmVlLgorCQkgKiBUaHVzLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IGFz IDEgaW5pdGlhbGx5LgorCQkgKi8KKwkJcmVmY291bnRfc2V0KCZwYy0+cmVmY250LCAxKTsKKwl9 IGVsc2UgeworCQlyZWZjb3VudF9pbmMoJnBjLT5yZWZjbnQpOworCX0KKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnBjLT5sb2NrLCBmbGFncyk7CisKKwl2Yy0+cGMgPSBwYzsKKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1 Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3Fk bWFfdmNoYW4oYyk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGZyZWUgYWxsIGRlc2Ny aXB0b3JzIGluIGFsbCBsaXN0cyBvbiB0aGUgVkMgKi8KKwltdGtfY3FkbWFfdGVybWluYXRlX2Fs bChjKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7CisKKwkv KiBQQyBpcyBub3QgZnJlZWQgdW50aWwgdGhlcmUgaXMgbm8gVkMgbWFwcGVkIHRvIGl0ICovCisJ aWYgKHJlZmNvdW50X2RlY19hbmRfdGVzdCgmY3ZjLT5wYy0+cmVmY250KSkKKwkJbXRrX2NxZG1h X2ZyZWVfcGNoYW4oY3ZjLT5wYyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnBj LT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX2h3X2luaXQoc3RydWN0 IG10a19jcWRtYV9kZXZpY2UgKmNxZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50 IGVycjsKKwl1MzIgaTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGNxZG1hMmRldihjcWRtYSkpOwor CXBtX3J1bnRpbWVfZ2V0X3N5bmMoY3FkbWEyZGV2KGNxZG1hKSk7CisKKwllcnIgPSBjbGtfcHJl cGFyZV9lbmFibGUoY3FkbWEtPmNsayk7CisKKwlpZiAoZXJyKSB7CisJCXBtX3J1bnRpbWVfcHV0 X3N5bmMoY3FkbWEyZGV2KGNxZG1hKSk7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShjcWRtYTJkZXYo Y3FkbWEpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiByZXNldCBhbGwgUENzICovCisJZm9y IChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5lbHM7ICsraSkgeworCQlzcGluX2xvY2tfaXJx c2F2ZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7CisJCWlmIChtdGtfY3FkbWFfaGFyZF9y ZXNldChjcWRtYS0+cGNbaV0pIDwgMCkgeworCQkJcHJfd2FybigiY3FkbWEgaGFyZCByZXNldCB0 aW1lb3V0XG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9j aywgZmxhZ3MpOworCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY3FkbWEtPmNsayk7CisJCQlw bV9ydW50aW1lX3B1dF9zeW5jKGNxZG1hMmRldihjcWRtYSkpOworCQkJcG1fcnVudGltZV9kaXNh YmxlKGNxZG1hMmRldihjcWRtYSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19jcWRtYV9od19kZWluaXQoc3RydWN0IG10a19j cWRtYV9kZXZpY2UgKmNxZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGk7CisK KwkvKiByZXNldCBhbGwgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5l bHM7ICsraSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFn cyk7CisJCWlmIChtdGtfY3FkbWFfaGFyZF9yZXNldChjcWRtYS0+cGNbaV0pIDwgMCkKKwkJCXBy X3dhcm4oImNxZG1hIGhhcmQgcmVzZXQgdGltZW91dFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCX0KKworCWNsa19kaXNhYmxlX3Vu cHJlcGFyZShjcWRtYS0+Y2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3FkbWEyZGV2KGNx ZG1hKSk7CisJcG1fcnVudGltZV9kaXNhYmxlKGNxZG1hMmRldihjcWRtYSkpOworfQorCitzdGF0 aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfY3FkbWFfbWF0Y2hbXSA9IHsKKwl7IC5j b21wYXRpYmxlID0gIm1lZGlhdGVrLG10Njc2NS1jcWRtYSIgfSwKKwl7IC8qIHNlbnRpbmVsICov IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdGtfY3FkbWFfbWF0Y2gpOworCitzdGF0 aWMgaW50IG10a19jcWRtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorewor CXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYTsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFu ICp2YzsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGQ7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJ aW50IGVycjsKKwl1MzIgaTsKKworCWNxZG1hID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNp emVvZigqY3FkbWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNxZG1hKQorCQlyZXR1cm4gLUVOT01F TTsKKworCWRkID0gJmNxZG1hLT5kZGV2OworCisJY3FkbWEtPmNsayA9IGRldm1fY2xrX2dldCgm cGRldi0+ZGV2LCAiY3FkbWEiKTsKKwlpZiAoSVNfRVJSKGNxZG1hLT5jbGspKSB7CisJCWRldl9l cnIoJnBkZXYtPmRldiwgIk5vIGNsb2NrIGZvciAlc1xuIiwKKwkJCWRldl9uYW1lKCZwZGV2LT5k ZXYpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPmNsayk7CisJfQorCisJZG1hX2NhcF9zZXQo RE1BX01FTUNQWSwgZGQtPmNhcF9tYXNrKTsKKworCWRkLT5jb3B5X2FsaWduID0gTVRLX0NRRE1B X0FMSUdOX1NJWkU7CisJZGQtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IG10a19jcWRt YV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMg PSBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2aWNlX3R4X3N0YXR1cyA9 IG10a19jcWRtYV90eF9zdGF0dXM7CisJZGQtPmRldmljZV9pc3N1ZV9wZW5kaW5nID0gbXRrX2Nx ZG1hX2lzc3VlX3BlbmRpbmc7CisJZGQtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBtdGtfY3Fk bWFfcHJlcF9kbWFfbWVtY3B5OworCWRkLT5kZXZpY2VfdGVybWluYXRlX2FsbCA9IG10a19jcWRt YV90ZXJtaW5hdGVfYWxsOworCWRkLT5zcmNfYWRkcl93aWR0aHMgPSBNVEtfQ1FETUFfRE1BX0JV U1dJRFRIUzsKKwlkZC0+ZHN0X2FkZHJfd2lkdGhzID0gTVRLX0NRRE1BX0RNQV9CVVNXSURUSFM7 CisJZGQtPmRpcmVjdGlvbnMgPSBCSVQoRE1BX01FTV9UT19NRU0pOworCWRkLT5yZXNpZHVlX2dy YW51bGFyaXR5ID0gRE1BX1JFU0lEVUVfR1JBTlVMQVJJVFlfU0VHTUVOVDsKKwlkZC0+ZGV2ID0g JnBkZXYtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmZGQtPmNoYW5uZWxzKTsKKworCWlmIChwZGV2 LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwK KwkJCQkJCSAgICAgICJkbWEtcmVxdWVzdHMiLAorCQkJCQkJICAgICAgJmNxZG1hLT5kbWFfcmVx dWVzdHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVzaW5nICV1IGFzIG1pc3Np bmcgZG1hLXJlcXVlc3RzIHByb3BlcnR5XG4iLAorCQkJIE1US19DUURNQV9OUl9WQ0hBTlMpOwor CisJCWNxZG1hLT5kbWFfcmVxdWVzdHMgPSBNVEtfQ1FETUFfTlJfVkNIQU5TOworCX0KKworCWlm IChwZGV2LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zf bm9kZSwKKwkJCQkJCSAgICAgICJkbWEtY2hhbm5lbHMiLAorCQkJCQkJICAgICAgJmNxZG1hLT5k bWFfY2hhbm5lbHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVzaW5nICV1IGFz IG1pc3NpbmcgZG1hLWNoYW5uZWxzIHByb3BlcnR5XG4iLAorCQkJIE1US19DUURNQV9OUl9QQ0hB TlMpOworCisJCWNxZG1hLT5kbWFfY2hhbm5lbHMgPSBNVEtfQ1FETUFfTlJfUENIQU5TOworCX0K KworCWNxZG1hLT5wYyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjcWRtYS0+ZG1hX2NoYW5u ZWxzLAorCQkJCSBzaXplb2YoKmNxZG1hLT5wYyksIEdGUF9LRVJORUwpOworCWlmICghY3FkbWEt PnBjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXRpYWxpemF0aW9uIGZvciBQQ3MgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsgKytpKSB7CisJCWNxZG1hLT5w Y1tpXSA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCAxLAorCQkJCQkgICAgc2l6ZW9mKCoqY3Fk bWEtPnBjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3FkbWEtPnBjW2ldKQorCQkJcmV0dXJuIC1F Tk9NRU07CisKKwkJSU5JVF9MSVNUX0hFQUQoJmNxZG1hLT5wY1tpXS0+cXVldWUpOworCQlzcGlu X2xvY2tfaW5pdCgmY3FkbWEtPnBjW2ldLT5sb2NrKTsKKwkJcmVmY291bnRfc2V0KCZjcWRtYS0+ cGNbaV0tPnJlZmNudCwgMCk7CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYs IElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRl diwgIk5vIG1lbSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQkJZGV2X25hbWUoJnBkZXYtPmRldikp OworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQljcWRtYS0+cGNbaV0tPmJhc2UgPSBkZXZt X2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihjcWRtYS0+ cGNbaV0tPmJhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPnBjW2ldLT5iYXNlKTsKKwor CQkvKiBhbGxvY2F0ZSBJUlEgcmVzb3VyY2UgKi8KKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRldl9lcnIo JnBkZXYtPmRldiwgIk5vIGlycSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQkJZGV2X25hbWUoJnBk ZXYtPmRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3FkbWEtPnBjW2ldLT5pcnEg PSByZXMtPnN0YXJ0OworCisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgY3Fk bWEtPnBjW2ldLT5pcnEsCisJCQkJICAgICAgIG10a19jcWRtYV9pcnEsIDAsIGRldl9uYW1lKCZw ZGV2LT5kZXYpLAorCQkJCSAgICAgICBjcWRtYSk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIo JnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdF9pcnEgZmFpbGVkIHdpdGggZXJyICVkXG4iLCBlcnIp OworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZSByZXNvdXJjZSBm b3IgVkNzICovCisJY3FkbWEtPnZjID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNxZG1hLT5k bWFfcmVxdWVzdHMsCisJCQkJIHNpemVvZigqY3FkbWEtPnZjKSwgR0ZQX0tFUk5FTCk7CisJaWYg KCFjcWRtYS0+dmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IGNxZG1h LT5kbWFfcmVxdWVzdHM7IGkrKykgeworCQl2YyA9ICZjcWRtYS0+dmNbaV07CisJCXZjLT52Yy5k ZXNjX2ZyZWUgPSBtdGtfY3FkbWFfdmRlc2NfZnJlZTsKKwkJdmNoYW5faW5pdCgmdmMtPnZjLCBk ZCk7CisJCWluaXRfY29tcGxldGlvbigmdmMtPmlzc3VlX2NvbXBsZXRpb24pOworCX0KKworCWVy ciA9IGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoZGQpOworCWlmIChlcnIpCisJCXJldHVybiBl cnI7CisKKwllcnIgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3RlcihwZGV2LT5kZXYub2Zfbm9k ZSwKKwkJCQkJIG9mX2RtYV94bGF0ZV9ieV9jaGFuX2lkLCBjcWRtYSk7CisJaWYgKGVycikgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEgT0YgcmVnaXN0cmF0aW9u IGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwl9CisKKwllcnIg PSBtdGtfY3FkbWFfaHdfaW5pdChjcWRtYSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEgSFcgaW5pdGlhbGl6YXRpb24gZmFpbGVkICVkXG4i LCBlcnIpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZk YXRhKHBkZXYsIGNxZG1hKTsKKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJNZWRpYVRlayBDUURN QSBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXI6 CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKGRkKTsKKworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBpbnQgbXRrX2NxZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYSA9IHBsYXRmb3JtX2dldF9kcnZk YXRhKHBkZXYpOworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKnZjOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJaW50IGk7CisKKwkvKiBraWxsIFZDIHRhc2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwg Y3FkbWEtPmRtYV9yZXF1ZXN0czsgaSsrKSB7CisJCXZjID0gJmNxZG1hLT52Y1tpXTsKKworCQls aXN0X2RlbCgmdmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOworCQl0YXNrbGV0X2tpbGwoJnZjLT52 Yy50YXNrKTsKKwl9CisKKwkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCWZvciAoaSA9IDA7IGkg PCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyBpKyspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNxZG1h LT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCQltdGtfZG1hX2NscihjcWRtYS0+cGNbaV0sIE1US19D UURNQV9JTlRfRU4sCisJCQkgICAgTVRLX0NRRE1BX0lOVF9FTl9CSVQpOworCQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0tPmxvY2ssIGZsYWdzKTsKKworCQkvKiBXYWl0cyBm b3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJzIHRvIGNvbXBsZXRlICovCisJCXN5bmNocm9uaXpl X2lycShjcWRtYS0+cGNbaV0tPmlycSk7CisJfQorCisJLyogZGlzYWJsZSBoYXJkd2FyZSAqLwor CW10a19jcWRtYV9od19kZWluaXQoY3FkbWEpOworCisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lz dGVyKCZjcWRtYS0+ZGRldik7CisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zf bm9kZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIg bXRrX2NxZG1hX2RyaXZlciA9IHsKKwkucHJvYmUgPSBtdGtfY3FkbWFfcHJvYmUsCisJLnJlbW92 ZSA9IG10a19jcWRtYV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgICAgICAgICAgID0g S0JVSUxEX01PRE5BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG10a19jcWRtYV9tYXRjaCwKKwl9 LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobXRrX2NxZG1hX2RyaXZlcik7CisKK01PRFVM RV9ERVNDUklQVElPTigiTWVkaWFUZWsgQ1FETUEgQ29udHJvbGxlciBEcml2ZXIiKTsKK01PRFVM RV9BVVRIT1IoIlNodW4tQ2hpaCBZdSA8c2h1bi1jaGloLnl1QG1lZGlhdGVrLmNvbT4iKTsKK01P RFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK