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: <1539769019-32107-3-git-send-email-shun-chih.yu@mediatek.com> Date: Wed, 17 Oct 2018 17:36:59 +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 aWF0ZWsvS2NvbmZpZyAgICAgfCAgIDEzICsKIGRyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxl ICAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyB8ICA5NDMgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTU3 IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS9tZWRpYXRlay9t dGstY3FkbWEuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDI3YmFjMGIuLjY4MGZjMDUgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvbWVk aWF0ZWsvS2NvbmZpZwpAQCAtMTEsMyArMTEsMTYgQEAgY29uZmlnIE1US19IU0RNQQogCSAgVGhp cyBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8K IAkgIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVSB0aHJvdWdo IHJpbmctCiAJICBiYXNlZCBkZXNjcmlwdG9yIG1hbmFnZW1lbnQuCisKK2NvbmZpZyBNVEtfQ1FE TUEKKwl0cmlzdGF0ZSAiTWVkaWFUZWsgQ29tbWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBzdXBw b3J0IgorCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3Qg RE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUworCXNlbGVjdCBBU1lOQ19U WF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgQ29t bWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBvbiBNZWRpYVRlaworCSAgU29Dcy4KKworCSAgVGhp cyBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8K KwkgIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVS4KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvbWVkaWF0 ZWsvTWFrZWZpbGUKaW5kZXggNmU3NzhmOC4uNDFiYjM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9k bWEvbWVkaWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUK QEAgLTEgKzEsMiBAQAogb2JqLSQoQ09ORklHX01US19IU0RNQSkgKz0gbXRrLWhzZG1hLm8KK29i ai0kKENPTkZJR19NVEtfQ1FETUEpICs9IG10ay1jcWRtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJz L2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay1jcWRt YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGVjYzUKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYwpAQCAtMCwwICsxLDk0 MyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8vIENvcHlyaWdodCAo YykgMjAxOC0yMDE5IE1lZGlhVGVrIEluYy4KKworLyoKKyAqIERyaXZlciBmb3IgTWVkaWFUZWsg Q29tbWFuZC1RdWV1ZSBETUEgQ29udHJvbGxlcgorICoKKyAqIEF1dGhvcjogU2h1bi1DaGloIFl1 IDxzaHVuLWNoaWgueXVAbWVkaWF0ZWsuY29tPgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgv Yml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5n aW5lLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9l cnIuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2Uu aD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcmVmY291 bnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlICIuLi92aXJ0LWRtYS5o IgorCisjZGVmaW5lIE1US19DUURNQV9VU0VDX1BPTEwJCTEwCisjZGVmaW5lIE1US19DUURNQV9U SU1FT1VUX1BPTEwJCTEwMDAKKyNkZWZpbmUgTVRLX0NRRE1BX0RNQV9CVVNXSURUSFMJCUJJVChE TUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUykKKyNkZWZpbmUgTVRLX0NRRE1BX0FMSUdOX1NJWkUJ CTEKKworLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIHZpcnR1YWwgY2hhbm5lbCAqLworI2RlZmlu ZSBNVEtfQ1FETUFfTlJfVkNIQU5TCQkzMgorCisvKiBUaGUgZGVmYXVsdCBudW1iZXIgb2YgcGh5 c2ljYWwgY2hhbm5lbCAqLworI2RlZmluZSBNVEtfQ1FETUFfTlJfUENIQU5TCQkzCisKKy8qIFJl Z2lzdGVycyBmb3IgdW5kZXJseWluZyBkbWEgbWFuaXB1bGF0aW9uICovCisjZGVmaW5lIE1US19D UURNQV9JTlRfRkxBRwkJMHgwCisjZGVmaW5lIE1US19DUURNQV9JTlRfRU4JCTB4NAorI2RlZmlu ZSBNVEtfQ1FETUFfRU4JCQkweDgKKyNkZWZpbmUgTVRLX0NRRE1BX1JFU0VUCQkJMHhjCisjZGVm aW5lIE1US19DUURNQV9GTFVTSAkJCTB4MTQKKyNkZWZpbmUgTVRLX0NRRE1BX1NSQwkJCTB4MWMK KyNkZWZpbmUgTVRLX0NRRE1BX0RTVAkJCTB4MjAKKyNkZWZpbmUgTVRLX0NRRE1BX0xFTjEJCQkw eDI0CisjZGVmaW5lIE1US19DUURNQV9MRU4yCQkJMHgyOAorI2RlZmluZSBNVEtfQ1FETUFfU1JD MgkJCTB4NjAKKyNkZWZpbmUgTVRLX0NRRE1BX0RTVDIJCQkweDY0CisKKy8qIFJlZ2lzdGVycyBz ZXR0aW5nICovCisjZGVmaW5lIE1US19DUURNQV9FTl9CSVQJCUJJVCgwKQorI2RlZmluZSBNVEtf Q1FETUFfSU5UX0ZMQUdfQklUCQlCSVQoMCkKKyNkZWZpbmUgTVRLX0NRRE1BX0lOVF9FTl9CSVQJ CUJJVCgwKQorI2RlZmluZSBNVEtfQ1FETUFfRkxVU0hfQklUCQlCSVQoMCkKKworI2RlZmluZSBN VEtfQ1FETUFfV0FSTV9SU1RfQklUCQlCSVQoMCkKKyNkZWZpbmUgTVRLX0NRRE1BX0hBUkRfUlNU X0JJVAkJQklUKDEpCisKKyNkZWZpbmUgTVRLX0NRRE1BX01BWF9MRU4JCUdFTk1BU0soMjcsIDAp CisjZGVmaW5lIE1US19DUURNQV9BRERSX0xJTUlUCQlHRU5NQVNLKDMxLCAwKQorI2RlZmluZSBN VEtfQ1FETUFfQUREUjJfU0hGSVQJCSgzMikKKworLyoqCisgKiBzdHJ1Y3QgbXRrX2NxZG1hX3Zk ZXNjIC0gVGhlIHN0cnVjdCBob2xkaW5nIGluZm8gZGVzY3JpYmluZyB2aXJ0dWFsCisgKiAgICAg ICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIChDVkQpCisgKiBAdmQ6ICAgICAgICAgICAg ICAgICAgICBBbiBpbnN0YW5jZSBmb3Igc3RydWN0IHZpcnRfZG1hX2Rlc2MKKyAqIEBsZW46ICAg ICAgICAgICAgICAgICAgIFRoZSB0b3RhbCBkYXRhIHNpemUgZGV2aWNlIHdhbnRzIHRvIG1vdmUK KyAqIEByZXNpZHVlOiAgICAgICAgICAgICAgIFRoZSByZW1haW5pbmcgZGF0YSBzaXplIGRldmlj ZSB3aWxsIG1vdmUKKyAqIEBkZXN0OiAgICAgICAgICAgICAgICAgIFRoZSBkZXN0aW5hdGlvbiBh ZGRyZXNzIGRldmljZSB3YW50cyB0byBtb3ZlIHRvCisgKiBAc3JjOiAgICAgICAgICAgICAgICAg ICBUaGUgc291cmNlIGFkZHJlc3MgZGV2aWNlIHdhbnRzIHRvIG1vdmUgZnJvbQorICogQGNoOiAg ICAgICAgICAgICAgICAgICAgVGhlIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZG1hIGNo YW5uZWwKKyAqIEBub2RlOiAgICAgICAgICAgICAgICAgIFRoZSBsaXNlX2hlYWQgc3RydWN0IHRv IGJ1aWxkIGxpbmstbGlzdCBmb3IgVkRzCisgKiBAcGFyZW50OiAgICAgICAgICAgICAgICBUaGUg cG9pbnRlciB0byB0aGUgcGFyZW50IENWRAorICovCitzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjIHsK KwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyB2ZDsKKwlzaXplX3QgbGVuOworCXNpemVfdCByZXNpZHVl OworCWRtYV9hZGRyX3QgZGVzdDsKKwlkbWFfYWRkcl90IHNyYzsKKwlzdHJ1Y3QgZG1hX2NoYW4g KmNoOworCisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBtdGtfY3FkbWFfdmRlc2Mg KnBhcmVudDsKK307CisKKy8qKgorICogc3RydWN0IG10a19jcWRtYV9wY2hhbiAtIFRoZSBzdHJ1 Y3QgaG9sZGluZyBpbmZvIGRlc2NyaWJpbmcgcGh5c2ljYWwKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgIGNoYW5uZWwgKFBDKQorICogQHF1ZXVlOiAgICAgICAgICAgICAgICAgUXVldWUgZm9y IHRoZSBQRHMgaXNzdWVkIHRvIHRoaXMgUEMKKyAqIEBiYXNlOiAgICAgICAgICAgICAgICAgIFRo ZSBtYXBwZWQgcmVnaXN0ZXIgSS9PIGJhc2Ugb2YgdGhpcyBQQworICogQGlycTogICAgICAgICAg ICAgICAgICAgVGhlIElSUSB0aGF0IHRoaXMgUEMgYXJlIHVzaW5nCisgKiBAcmVmY250OiAgICAg ICAgICAgICAgICBUcmFjayBob3cgbWFueSBWQ3MgYXJlIHVzaW5nIHRoaXMgUEMKKyAqIEB0YXNr bGV0OiAgICAgICAgICAgICAgIFRhc2tsZXQgZm9yIHRoaXMgUEMKKyAqIEBsb2NrOiAgICAgICAg ICAgICAgICAgIExvY2sgcHJvdGVjdCBhZ2Fpc3RpbmcgbXVsdGlwbGUgVkNzIGFjY2VzcyBQQwor ICovCitzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlOwor CXZvaWQgX19pb21lbSAqYmFzZTsKKwl1MzIgaXJxOworCisJcmVmY291bnRfdCByZWZjbnQ7CisK KwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKworCS8qIGxvY2sgdG8gcHJvdGVjdCBQ QyAqLworCXNwaW5sb2NrX3QgbG9jazsKK307CisKKy8qKgorICogc3RydWN0IG10a19jcWRtYV92 Y2hhbiAtIFRoZSBzdHJ1Y3QgaG9sZGluZyBpbmZvIGRlc2NyaWJpbmcgdmlydHVhbAorICogICAg ICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAoVkMpCisgKiBAdmM6ICAgICAgICAgICAgICAg ICAgICBBbiBpbnN0YW5jZSBmb3Igc3RydWN0IHZpcnRfZG1hX2NoYW4KKyAqIEBwYzogICAgICAg ICAgICAgICAgICAgIFRoZSBwb2ludGVyIHRvIHRoZSB1bmRlcmx5aW5nIFBDCisgKiBAaXNzdWVf Y29tcGxldGlvbjoJICAgVGhlIHdhaXQgZm9yIGFsbCBpc3N1ZWQgZGVzY3JpcHRvcnMgY29tcGxl dGl0ZWQKKyAqIEBpc3N1ZV9zeW5jaHJvbml6ZToJICAgQm9vbCBpbmRpY2F0aW5nIGNoYW5uZWwg c3luY2hyb25pemF0aW9uIHN0YXJ0cworICovCitzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuIHsKKwlz dHJ1Y3QgdmlydF9kbWFfY2hhbiB2YzsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYzsKKwlz dHJ1Y3QgY29tcGxldGlvbiBpc3N1ZV9jb21wbGV0aW9uOworCWJvb2wgaXNzdWVfc3luY2hyb25p emU7Cit9OworCisvKioKKyAqIHN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlIC0gVGhlIHN0cnVjdCBo b2xkaW5nIGluZm8gZGVzY3JpYmluZyBDUURNQQorICogICAgICAgICAgICAgICAgICAgICAgICAg IGRldmljZQorICogQGRkZXY6ICAgICAgICAgICAgICAgICAgIEFuIGluc3RhbmNlIGZvciBzdHJ1 Y3QgZG1hX2RldmljZQorICogQGNsazogICAgICAgICAgICAgICAgICAgIFRoZSBjbG9jayB0aGF0 IGRldmljZSBpbnRlcm5hbCBpcyB1c2luZworICogQGRtYV9yZXF1ZXN0czogICAgICAgICAgIFRo ZSBudW1iZXIgb2YgVkNzIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG8KKyAqIEBkbWFfY2hhbm5lbHM6 ICAgICAgICAgICBUaGUgbnVtYmVyIG9mIFBDcyB0aGUgZGV2aWNlIHN1cHBvcnRzIHRvCisgKiBA dmM6ICAgICAgICAgICAgICAgICAgICAgVGhlIHBvaW50ZXIgdG8gYWxsIGF2YWlsYWJsZSBWQ3MK KyAqIEBwYzogICAgICAgICAgICAgICAgICAgICBUaGUgcG9pbnRlciB0byBhbGwgdGhlIHVuZGVy bHlpbmcgUENzCisgKi8KK3N0cnVjdCBtdGtfY3FkbWFfZGV2aWNlIHsKKwlzdHJ1Y3QgZG1hX2Rl dmljZSBkZGV2OworCXN0cnVjdCBjbGsgKmNsazsKKworCXUzMiBkbWFfcmVxdWVzdHM7CisJdTMy IGRtYV9jaGFubmVsczsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICp2YzsKKwlzdHJ1Y3QgbXRr X2NxZG1hX3BjaGFuICoqcGM7Cit9OworCitzdGF0aWMgc3RydWN0IG10a19jcWRtYV9kZXZpY2Ug KnRvX2NxZG1hX2RldihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5l cl9vZihjaGFuLT5kZXZpY2UsIHN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlLCBkZGV2KTsKK30KKwor c3RhdGljIHN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKnRvX2NxZG1hX3ZjaGFuKHN0cnVjdCBkbWFf Y2hhbiAqY2hhbikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNoYW4sIHN0cnVjdCBtdGtfY3Fk bWFfdmNoYW4sIHZjLmNoYW4pOworfQorCitzdGF0aWMgc3RydWN0IG10a19jcWRtYV92ZGVzYyAq dG9fY3FkbWFfdmRlc2Moc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXJldHVybiBjb250 YWluZXJfb2YodmQsIHN0cnVjdCBtdGtfY3FkbWFfdmRlc2MsIHZkKTsKK30KKworc3RhdGljIHN0 cnVjdCBkZXZpY2UgKmNxZG1hMmRldihzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAqY3FkbWEpCit7 CisJcmV0dXJuIGNxZG1hLT5kZGV2LmRldjsKK30KKworc3RhdGljIHUzMiBtdGtfZG1hX3JlYWQo c3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcpCit7CisJcmV0dXJuIHJlYWRsKHBj LT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV93cml0ZShzdHJ1Y3QgbXRr X2NxZG1hX3BjaGFuICpwYywgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWxfcmVsYXhlZCh2 YWwsIHBjLT5iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgbXRrX2RtYV9ybXcoc3RydWN0 IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcsCisJCQl1MzIgbWFzaywgdTMyIHNldCkKK3sK Kwl1MzIgdmFsOworCisJdmFsID0gbXRrX2RtYV9yZWFkKHBjLCByZWcpOworCXZhbCAmPSB+bWFz azsKKwl2YWwgfD0gc2V0OworCW10a19kbWFfd3JpdGUocGMsIHJlZywgdmFsKTsKK30KKworc3Rh dGljIHZvaWQgbXRrX2RtYV9zZXQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcs IHUzMiB2YWwpCit7CisJbXRrX2RtYV9ybXcocGMsIHJlZywgMCwgdmFsKTsKK30KKworc3RhdGlj IHZvaWQgbXRrX2RtYV9jbHIoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIHUzMiByZWcsIHUz MiB2YWwpCit7CisJbXRrX2RtYV9ybXcocGMsIHJlZywgdmFsLCAwKTsKK30KKworc3RhdGljIHZv aWQgbXRrX2NxZG1hX3ZkZXNjX2ZyZWUoc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCWtm cmVlKHRvX2NxZG1hX3ZkZXNjKHZkKSk7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX3BvbGxf ZW5naW5lX2RvbmUoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsIGJvb2wgYXRvbWljKQorewor CXUzMiBzdGF0dXMgPSAwOworCisJaWYgKCFhdG9taWMpCisJCXJldHVybiByZWFkbF9wb2xsX3Rp bWVvdXQocGMtPmJhc2UgKyBNVEtfQ1FETUFfRU4sCisJCQkJCSAgc3RhdHVzLAorCQkJCQkgICEo c3RhdHVzICYgTVRLX0NRRE1BX0VOX0JJVCksCisJCQkJCSAgTVRLX0NRRE1BX1VTRUNfUE9MTCwK KwkJCQkJICBNVEtfQ1FETUFfVElNRU9VVF9QT0xMKTsKKworCXJldHVybiByZWFkbF9wb2xsX3Rp bWVvdXRfYXRvbWljKHBjLT5iYXNlICsgTVRLX0NRRE1BX0VOLAorCQkJCQkgc3RhdHVzLAorCQkJ CQkgIShzdGF0dXMgJiBNVEtfQ1FETUFfRU5fQklUKSwKKwkJCQkJIE1US19DUURNQV9VU0VDX1BP TEwsCisJCQkJCSBNVEtfQ1FETUFfVElNRU9VVF9QT0xMKTsKK30KKworc3RhdGljIGludCBtdGtf Y3FkbWFfaGFyZF9yZXNldChzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYykKK3sKKwltdGtfZG1h X3NldChwYywgTVRLX0NRRE1BX1JFU0VULCBNVEtfQ1FETUFfSEFSRF9SU1RfQklUKTsKKwltdGtf ZG1hX2NscihwYywgTVRLX0NRRE1BX1JFU0VULCBNVEtfQ1FETUFfSEFSRF9SU1RfQklUKTsKKwor CXJldHVybiBtdGtfY3FkbWFfcG9sbF9lbmdpbmVfZG9uZShwYywgZmFsc2UpOworfQorCitzdGF0 aWMgdm9pZCBtdGtfY3FkbWFfc3RhcnQoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMsCisJCQkg ICAgc3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkKQoreworCS8qIHdhaXQgZm9yIHRoZSBwcmV2 aW91cyB0cmFuc2FjdGlvbiBkb25lICovCisJaWYgKG10a19jcWRtYV9wb2xsX2VuZ2luZV9kb25l KHBjLCB0cnVlKSA8IDApCisJCWRldl9lcnIoY3FkbWEyZGV2KHRvX2NxZG1hX2RldihjdmQtPmNo KSksICJjcWRtYSB3YWl0IHRyYW5zYWN0aW9uIHRpbWVvdXRcbiIpOworCisJLyogd2FybSByZXNl dCB0aGUgZG1hIGVuZ2luZSBmb3IgdGhlIG5ldyB0cmFuc2FjdGlvbiAqLworCW10a19kbWFfc2V0 KHBjLCBNVEtfQ1FETUFfUkVTRVQsIE1US19DUURNQV9XQVJNX1JTVF9CSVQpOworCWlmIChtdGtf Y3FkbWFfcG9sbF9lbmdpbmVfZG9uZShwYywgdHJ1ZSkgPCAwKQorCQlkZXZfZXJyKGNxZG1hMmRl dih0b19jcWRtYV9kZXYoY3ZkLT5jaCkpLCAiY3FkbWEgd2FybSByZXNldCB0aW1lb3V0XG4iKTsK KworCS8qIHNldHVwIHRoZSBzb3VyY2UgKi8KKwltdGtfZG1hX3NldChwYywgTVRLX0NRRE1BX1NS QywgY3ZkLT5zcmMgJiBNVEtfQ1FETUFfQUREUl9MSU1JVCk7CisJbXRrX2RtYV9zZXQocGMsIE1U S19DUURNQV9TUkMyLCBjdmQtPnNyYyA+PiBNVEtfQ1FETUFfQUREUjJfU0hGSVQpOworCisJLyog c2V0dXAgdGhlIGRlc3RpbmF0aW9uICovCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9EU1Qs IGN2ZC0+ZGVzdCAmIE1US19DUURNQV9BRERSX0xJTUlUKTsKKwltdGtfZG1hX3NldChwYywgTVRL X0NRRE1BX0RTVDIsIGN2ZC0+ZGVzdCA+PiBNVEtfQ1FETUFfQUREUjJfU0hGSVQpOworCisJLyog c2V0dXAgdGhlIGxlbmd0aCAqLworCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FETUFfTEVOMSwgY3Zk LT5sZW4pOworCisJLyogc3RhcnQgZG1hIGVuZ2luZSAqLworCW10a19kbWFfc2V0KHBjLCBNVEtf Q1FETUFfRU4sIE1US19DUURNQV9FTl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFf aXNzdWVfdmNoYW5fcGVuZGluZyhzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMpCit7CisJc3Ry dWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqdmQyOworCXN0cnVjdCBtdGtfY3FkbWFfcGNoYW4gKnBj ID0gY3ZjLT5wYzsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisJYm9vbCB0cmlnZ2Vy X2VuZ2luZSA9IGZhbHNlOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY3ZjLT52Yy5sb2NrKTsK Kwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwYy0+bG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUodmQsIHZkMiwgJmN2Yy0+dmMuZGVzY19pc3N1ZWQsIG5vZGUpIHsKKwkJLyogbmVlZCB0 byB0cmlnZ2VyIGRtYSBlbmdpbmUgaWYgUEMncyBxdWV1ZSBpcyBlbXB0eSAqLworCQlpZiAobGlz dF9lbXB0eSgmcGMtPnF1ZXVlKSkKKwkJCXRyaWdnZXJfZW5naW5lID0gdHJ1ZTsKKworCQljdmQg PSB0b19jcWRtYV92ZGVzYyh2ZCk7CisKKwkJLyogYWRkIFZEIGludG8gUEMncyBxdWV1ZSAqLwor CQlsaXN0X2FkZF90YWlsKCZjdmQtPm5vZGUsICZwYy0+cXVldWUpOworCisJCS8qIHN0YXJ0IHRo ZSBkbWEgZW5naW5lICovCisJCWlmICh0cmlnZ2VyX2VuZ2luZSkKKwkJCW10a19jcWRtYV9zdGFy dChwYywgY3ZkKTsKKworCQkvKiByZW1vdmUgVkQgZnJvbSBsaXN0IGRlc2NfaXNzdWVkICovCisJ CWxpc3RfZGVsKCZ2ZC0+bm9kZSk7CisJfQorfQorCisvKgorICogcmV0dXJuIHRydWUgaWYgdGhp cyBWQyBpcyBhY3RpdmUsCisgKiBtZWFuaW5nIHRoYXQgdGhlcmUgYXJlIFZEcyB1bmRlciBwcm9j ZXNzaW5nIGJ5IHRoZSBQQworICovCitzdGF0aWMgYm9vbCBtdGtfY3FkbWFfaXNfdmNoYW5fYWN0 aXZlKHN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3Zk ZXNjICpjdmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN2ZCwgJmN2Yy0+cGMtPnF1ZXVlLCBu b2RlKQorCQlpZiAoY3ZjID09IHRvX2NxZG1hX3ZjaGFuKGN2ZC0+Y2gpKQorCQkJcmV0dXJuIHRy dWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiByZXR1cm4gdGhlIHBvaW50ZXIgb2Yg dGhlIENWRCB0aGF0IGlzIGp1c3QgY29uc3VtZWQgYnkgdGhlIFBDCisgKi8KK3N0YXRpYyBzdHJ1 Y3QgbXRrX2NxZG1hX3ZkZXNjCisqbXRrX2NxZG1hX2NvbnN1bWVfd29ya19xdWV1ZShzdHJ1Y3Qg bXRrX2NxZG1hX3BjaGFuICpwYykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmM7CisJ c3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkLCAqcmV0ID0gTlVMTDsKKworCS8qIGNvbnN1bWUg YSBDVkQgZnJvbSBQQydzIHF1ZXVlICovCisJY3ZkID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxs KCZwYy0+cXVldWUsCisJCQkJICAgICAgIHN0cnVjdCBtdGtfY3FkbWFfdmRlc2MsIG5vZGUpOwor CWlmICh1bmxpa2VseSghY3ZkIHx8ICFjdmQtPnBhcmVudCkpCisJCXJldHVybiBOVUxMOworCisJ Y3ZjID0gdG9fY3FkbWFfdmNoYW4oY3ZkLT5jaCk7CisJcmV0ID0gY3ZkOworCisJLyogdXBkYXRl IHJlc2lkdWUgb2YgdGhlIHBhcmVudCBDVkQgKi8KKwljdmQtPnBhcmVudC0+cmVzaWR1ZSAtPSBj dmQtPmxlbjsKKworCS8qIGRlbGV0ZSBDVkQgZnJvbSBQQydzIHF1ZXVlICovCisJbGlzdF9kZWwo JmN2ZC0+bm9kZSk7CisKKwlzcGluX2xvY2soJmN2Yy0+dmMubG9jayk7CisKKwkvKiBjaGVjayB3 aGV0aGVyIGFsbCB0aGUgY2hpbGQgQ1ZEcyBjb21wbGV0ZWQgKi8KKwlpZiAoIWN2ZC0+cGFyZW50 LT5yZXNpZHVlKSB7CisJCS8qIGFkZCB0aGUgcGFyZW50IFZEIGludG8gbGlzdCBkZXNjX2NvbXBs ZXRlZCAqLworCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmN2ZC0+cGFyZW50LT52ZCk7CisKKwkJ Lyogc2V0dXAgY29tcGxldGlvbiBpZiB0aGlzIFZDIGlzIHVuZGVyIHN5bmNocm9uaXphdGlvbiAq LworCQlpZiAoY3ZjLT5pc3N1ZV9zeW5jaHJvbml6ZSAmJiAhbXRrX2NxZG1hX2lzX3ZjaGFuX2Fj dGl2ZShjdmMpKSB7CisJCQljb21wbGV0ZSgmY3ZjLT5pc3N1ZV9jb21wbGV0aW9uKTsKKwkJCWN2 Yy0+aXNzdWVfc3luY2hyb25pemUgPSBmYWxzZTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZj dmMtPnZjLmxvY2spOworCisJLyogc3RhcnQgdHJhbnNhY3Rpb24gZm9yIG5leHQgQ1ZEIGluIHRo ZSBxdWV1ZSAqLworCWN2ZCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGMtPnF1ZXVlLAor CQkJCSAgICAgICBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjLCBub2RlKTsKKwlpZiAoY3ZkKQorCQlt dGtfY3FkbWFfc3RhcnQocGMsIGN2ZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9p ZCBtdGtfY3FkbWFfdGFza2xldF9jYih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IG10 a19jcWRtYV9wY2hhbiAqcGMgPSAoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqKWRhdGE7CisJc3Ry dWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5sb2NrLCBmbGFncyk7CisJLyogY29uc3VtZSB0aGUg cXVldWUgKi8KKwljdmQgPSBtdGtfY3FkbWFfY29uc3VtZV93b3JrX3F1ZXVlKHBjKTsKKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZwYy0+bG9jaywgZmxhZ3MpOworCisJLyogc3VibWl0IHRoZSBu ZXh0IENWRCAqLworCWlmIChjdmQpIHsKKwkJZG1hX3J1bl9kZXBlbmRlbmNpZXMoJmN2ZC0+dmQu dHgpOworCisJCS8qCisJCSAqIGZyZWUgY2hpbGQgQ1ZEIGFmdGVyIGNvbXBsZXRpb24uCisJCSAq IHRoZSBwYXJlbnQgQ1ZEIHdvdWxkIGJlIGZyZWVlZCB3aXRoIGRlc2NfZnJlZSBieSB1c2VyLgor CQkgKi8KKwkJaWYgKGN2ZC0+cGFyZW50ICE9IGN2ZCkKKwkJCWtmcmVlKGN2ZCk7CisJfQorCisJ LyogcmUtZW5hYmxlIGludGVycnVwdCBiZWZvcmUgbGVhdmluZyB0YXNrbGV0ICovCisJZW5hYmxl X2lycShwYy0+aXJxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG10a19jcWRtYV9pcnEoaW50 IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKmNxZG1hID0g ZGV2aWQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJYm9vbCBzY2hlZHVsZV90YXNr bGV0ID0gZmFsc2U7CisJdTMyIGk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgZmxhZ3MgZm9yIGVh Y2ggUEMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsgKytpLCBzY2hl ZHVsZV90YXNrbGV0ID0gZmFsc2UpIHsKKwkJc3Bpbl9sb2NrKCZjcWRtYS0+cGNbaV0tPmxvY2sp OworCQlpZiAobXRrX2RtYV9yZWFkKGNxZG1hLT5wY1tpXSwKKwkJCQkgTVRLX0NRRE1BX0lOVF9G TEFHKSAmIE1US19DUURNQV9JTlRfRkxBR19CSVQpIHsKKwkJCS8qIGNsZWFyIGludGVycnVwdCAq LworCQkJbXRrX2RtYV9jbHIoY3FkbWEtPnBjW2ldLCBNVEtfQ1FETUFfSU5UX0ZMQUcsCisJCQkJ ICAgIE1US19DUURNQV9JTlRfRkxBR19CSVQpOworCisJCQlzY2hlZHVsZV90YXNrbGV0ID0gdHJ1 ZTsKKwkJCXJldCA9IElSUV9IQU5ETEVEOworCQl9CisJCXNwaW5fdW5sb2NrKCZjcWRtYS0+cGNb aV0tPmxvY2spOworCisJCWlmIChzY2hlZHVsZV90YXNrbGV0KSB7CisJCQkvKiBkaXNhYmxlIGlu dGVycnVwdCAqLworCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGNxZG1hLT5wY1tpXS0+aXJxKTsKKwor CQkJLyogc2NoZWR1bGUgdGhlIHRhc2tsZXQgdG8gaGFuZGxlIHRoZSB0cmFuc2FjdGlvbnMgKi8K KwkJCXRhc2tsZXRfc2NoZWR1bGUoJmNxZG1hLT5wY1tpXS0+dGFza2xldCk7CisJCX0KKwl9CisK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZpcnRfZG1hX2Rlc2MgKm10a19jcWRt YV9maW5kX2FjdGl2ZV9kZXNjKHN0cnVjdCBkbWFfY2hhbiAqYywKKwkJCQkJCQlkbWFfY29va2ll X3QgY29va2llKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRvX2NxZG1hX3Zj aGFuKGMpOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsKKwlsaXN0X2Zv cl9lYWNoX2VudHJ5KHZkLCAmY3ZjLT5wYy0+cXVldWUsIG5vZGUpCisJCWlmICh2ZC0+dHguY29v a2llID09IGNvb2tpZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3ZjLT5wYy0+bG9j aywgZmxhZ3MpOworCQkJcmV0dXJuIHZkOworCQl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm Y3ZjLT5wYy0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZCwgJmN2Yy0+ dmMuZGVzY19pc3N1ZWQsIG5vZGUpCisJCWlmICh2ZC0+dHguY29va2llID09IGNvb2tpZSkKKwkJ CXJldHVybiB2ZDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdHVz IG10a19jcWRtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjLAorCQkJCQkgICBkbWFfY29v a2llX3QgY29va2llLAorCQkJCQkgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQorewor CXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRvX2NxZG1hX3ZjaGFuKGMpOworCXN0cnVj dCBtdGtfY3FkbWFfdmRlc2MgKmN2ZDsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQ7CisJZW51 bSBkbWFfc3RhdHVzIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNpemVfdCBieXRlcyA9 IDA7CisKKwlyZXQgPSBkbWFfY29va2llX3N0YXR1cyhjLCBjb29raWUsIHR4c3RhdGUpOworCWlm IChyZXQgPT0gRE1BX0NPTVBMRVRFIHx8ICF0eHN0YXRlKQorCQlyZXR1cm4gcmV0OworCisJc3Bp bl9sb2NrX2lycXNhdmUoJmN2Yy0+dmMubG9jaywgZmxhZ3MpOworCXZkID0gbXRrX2NxZG1hX2Zp bmRfYWN0aXZlX2Rlc2MoYywgY29va2llKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMt PnZjLmxvY2ssIGZsYWdzKTsKKworCWlmICh2ZCkgeworCQljdmQgPSB0b19jcWRtYV92ZGVzYyh2 ZCk7CisJCWJ5dGVzID0gY3ZkLT5yZXNpZHVlOworCX0KKworCWRtYV9zZXRfcmVzaWR1ZSh0eHN0 YXRlLCBieXRlcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtdGtfY3FkbWFf aXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IG10a19jcWRtYV92 Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNoYW4oYyk7CisJdW5zaWduZWQgbG9uZyBwY19mbGFnczsK Kwl1bnNpZ25lZCBsb25nIHZjX2ZsYWdzOworCisJLyogYWNxdWlyZSBQQydzIGxvY2sgYmVmb3Jl IFZTJ3MgbG9jayBmb3IgbG9jayBkZXBlbmRlbmN5IGluIHRhc2tsZXQgKi8KKwlzcGluX2xvY2tf aXJxc2F2ZSgmY3ZjLT5wYy0+bG9jaywgcGNfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZj dmMtPnZjLmxvY2ssIHZjX2ZsYWdzKTsKKworCWlmICh2Y2hhbl9pc3N1ZV9wZW5kaW5nKCZjdmMt PnZjKSkKKwkJbXRrX2NxZG1hX2lzc3VlX3ZjaGFuX3BlbmRpbmcoY3ZjKTsKKworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmN2Yy0+dmMubG9jaywgdmNfZmxhZ3MpOworCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIHBjX2ZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBk bWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCittdGtfY3FkbWFfcHJlcF9kbWFfbWVtY3B5KHN0cnVj dCBkbWFfY2hhbiAqYywgZG1hX2FkZHJfdCBkZXN0LAorCQkJICBkbWFfYWRkcl90IHNyYywgc2l6 ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNj ICoqY3ZkOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBOVUxMLCAqcHJl dl90eCA9IE5VTEw7CisJc2l6ZV90IGksIHRsZW4sIG5yX3ZkOworCisJLyoKKwkgKiBJbiB0aGUg Y2FzZSB0aGF0IHRyc2FuY3Rpb24gbGVuZ3RoIGlzIGxhcmdlciB0aGFuIHRoZQorCSAqIERNQSBl bmdpbmUgc3VwcG9ydHMsIGEgc2luZ2xlIG1lbWNweSB0cmFuc2FjdGlvbiBuZWVkcworCSAqIHRv IGJlIHNlcGFyYXRlZCBpbnRvIHNldmVyYWwgRE1BIHRyYW5zYWN0aW9ucy4KKwkgKiBFYWNoIERN QSB0cmFuc2FjdGlvbiB3b3VsZCBiZSBkZXNjcmliZWQgYnkgYSBDVkQsCisJICogYW5kIHRoZSBm aXJzdCBvbmUgaXMgcmVmZXJyZWQgYXMgdGhlIHBhcmVudCBDVkQsCisJICogd2hpbGUgdGhlIG90 aGVycyBhcmUgY2hpbGQgQ1ZEcy4KKwkgKiBUaGUgcGFyZW50IENWRCdzIHR4IGRlc2NyaXB0b3Ig aXMgdGhlIG9ubHkgdHggZGVzY3JpcHRvcgorCSAqIHJldHVybmVkIHRvIHRoZSBETUEgdXNlciwg YW5kIGl0IHNob3VsZCBub3QgYmUgY29tcGxldGVkCisJICogdW50aWwgYWxsIHRoZSBjaGlsZCBD VkRzIGNvbXBsZXRlZC4KKwkgKi8KKwlucl92ZCA9IERJVl9ST1VORF9VUChsZW4sIE1US19DUURN QV9NQVhfTEVOKTsKKwljdmQgPSBrY2FsbG9jKG5yX3ZkLCBzaXplb2YoKmN2ZCksIEdGUF9OT1dB SVQpOworCWlmICghY3ZkKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7IGkgPCBucl92 ZDsgKytpKSB7CisJCWN2ZFtpXSA9IGt6YWxsb2Moc2l6ZW9mKCpjdmRbaV0pLCBHRlBfTk9XQUlU KTsKKwkJaWYgKCFjdmRbaV0pIHsKKwkJCWZvciAoOyBpID4gMDsgLS1pKQorCQkJCWtmcmVlKGN2 ZFtpIC0gMV0pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBzZXR1cCBkbWEgY2hhbm5l bCAqLworCQljdmRbaV0tPmNoID0gYzsKKworCQkvKiBzZXR1cCBzb3VyZWNlLCBkZXN0aW5hdGlv biwgYW5kIGxlbmd0aCAqLworCQl0bGVuID0gKGxlbiA+IE1US19DUURNQV9NQVhfTEVOKSA/IE1U S19DUURNQV9NQVhfTEVOIDogbGVuOworCQljdmRbaV0tPmxlbiA9IHRsZW47CisJCWN2ZFtpXS0+ c3JjID0gc3JjOworCQljdmRbaV0tPmRlc3QgPSBkZXN0OworCisJCS8qIHNldHVwIHR4IGRlc2Ny aXB0b3IgKi8KKwkJdHggPSB2Y2hhbl90eF9wcmVwKHRvX3ZpcnRfY2hhbihjKSwgJmN2ZFtpXS0+ dmQsIGZsYWdzKTsKKwkJdHgtPm5leHQgPSBOVUxMOworCisJCWlmICghaSkgeworCQkJY3ZkWzBd LT5yZXNpZHVlID0gbGVuOworCQl9IGVsc2UgeworCQkJcHJldl90eC0+bmV4dCA9IHR4OworCQkJ Y3ZkW2ldLT5yZXNpZHVlID0gdGxlbjsKKwkJfQorCisJCWN2ZFtpXS0+cGFyZW50ID0gY3ZkWzBd OworCisJCS8qIHVwZGF0ZSB0aGUgc3JjLCBkZXN0LCBsZW4sIHByZXZfdHggZm9yIHRoZSBuZXh0 IENWRCAqLworCQlzcmMgKz0gdGxlbjsKKwkJZGVzdCArPSB0bGVuOworCQlsZW4gLT0gdGxlbjsK KwkJcHJldl90eCA9IHR4OworCX0KKworCXJldHVybiAmY3ZkWzBdLT52ZC50eDsKK30KKworc3Rh dGljIHZvaWQgbXRrX2NxZG1hX2ZyZWVfaW5hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1hX2NoYW4gKmMp Cit7CisJc3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjID0gdG9fdmlydF9jaGFuKGMpOworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJLyoKKwkgKiBzZXQgZGVzY19h bGxvY2F0ZWQsIGRlc2Nfc3VibWl0dGVkLAorCSAqIGFuZCBkZXNjX2lzc3VlZCBhcyB0aGUgY2Fu ZGljYXRlcyB0byBiZSBmcmVlZAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2Yy0+bG9jaywg ZmxhZ3MpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdmMtPmRlc2NfYWxsb2NhdGVkLCAmaGVh ZCk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ2Yy0+ZGVzY19zdWJtaXR0ZWQsICZoZWFkKTsK KwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnZjLT5kZXNjX2lzc3VlZCwgJmhlYWQpOworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnZjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBmcmVlIGRlc2NyaXB0 b3IgbGlzdHMgKi8KKwl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QodmMsICZoZWFkKTsKK30KKwor c3RhdGljIHZvaWQgbXRrX2NxZG1hX2ZyZWVfYWN0aXZlX2Rlc2Moc3RydWN0IGRtYV9jaGFuICpj KQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRvX2NxZG1hX3ZjaGFuKGMpOwor CWJvb2wgc3luY19uZWVkZWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHBjX2ZsYWdzOworCXVu c2lnbmVkIGxvbmcgdmNfZmxhZ3M7CisKKwkvKiBhY3F1aXJlIFBDJ3MgbG9jayBmaXJzdCBkdWUg dG8gbG9jayBkZXBlbmRlbmN5IGluIGRtYSBJU1IgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY3Zj LT5wYy0+bG9jaywgcGNfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMtPnZjLmxvY2ss IHZjX2ZsYWdzKTsKKworCS8qIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBpZiB0aGlzIFZD IGlzIGFjdGl2ZSAqLworCWlmIChtdGtfY3FkbWFfaXNfdmNoYW5fYWN0aXZlKGN2YykpIHsKKwkJ Y3ZjLT5pc3N1ZV9zeW5jaHJvbml6ZSA9IHRydWU7CisJCXN5bmNfbmVlZGVkID0gdHJ1ZTsKKwl9 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnZjLmxvY2ssIHZjX2ZsYWdzKTsKKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7CisKKwkvKiB3 YWl0aW5nIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGlzIFZDICovCisJaWYgKHN5bmNfbmVlZGVk KQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjdmMtPmlzc3VlX2NvbXBsZXRpb24pOworCisJLyog ZnJlZSBhbGwgZGVzY3JpcHRvcnMgaW4gbGlzdCBkZXNjX2NvbXBsZXRlZCAqLworCXZjaGFuX3N5 bmNocm9uaXplKCZjdmMtPnZjKTsKKworCVdBUk5fT05DRSghbGlzdF9lbXB0eSgmY3ZjLT52Yy5k ZXNjX2NvbXBsZXRlZCksCisJCSAgIkRlc2MgcGVuZGluZyBzdGlsbCBpbiBsaXN0IGRlc2NfY29t cGxldGVkXG4iKTsKK30KKworc3RhdGljIGludCBtdGtfY3FkbWFfdGVybWluYXRlX2FsbChzdHJ1 Y3QgZG1hX2NoYW4gKmMpCit7CisJLyogZnJlZSBkZXNjcmlwdG9ycyBub3QgcHJvY2Vzc2VkIHll dCBieSBoYXJkd2FyZSAqLworCW10a19jcWRtYV9mcmVlX2luYWN0aXZlX2Rlc2MoYyk7CisKKwkv KiBmcmVlIGRlc2NyaXB0b3JzIGJlaW5nIHByb2Nlc3NlZCBieSBoYXJkd2FyZSAqLworCW10a19j cWRtYV9mcmVlX2FjdGl2ZV9kZXNjKGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg bXRrX2NxZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAqYykKK3sKKwlz dHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAqY3FkbWEgPSB0b19jcWRtYV9kZXYoYyk7CisJc3RydWN0 IG10a19jcWRtYV92Y2hhbiAqdmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwlzdHJ1Y3QgbXRrX2Nx ZG1hX3BjaGFuICpwYyA9IE5VTEw7CisJdTMyIGksIG1pbl9yZWZjbnQgPSBVMzJfTUFYLCByZWZj bnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGFsbG9jYXRlIFBDIHdpdGggdGhlIG1p bmltdW4gcmVmY291bnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsg KytpKSB7CisJCXJlZmNudCA9IHJlZmNvdW50X3JlYWQoJmNxZG1hLT5wY1tpXS0+cmVmY250KTsK KwkJaWYgKHJlZmNudCA8IG1pbl9yZWZjbnQpIHsKKwkJCXBjID0gY3FkbWEtPnBjW2ldOworCQkJ bWluX3JlZmNudCA9IHJlZmNudDsKKwkJfQorCX0KKworCWlmICghcGMpCisJCXJldHVybiAtRU5P U1BDOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIXJl ZmNvdW50X3JlYWQoJnBjLT5yZWZjbnQpKSB7CisJCS8qIGFsbG9jYXRlIFBDIHdoZW4gdGhlIHJl ZmNvdW50IGlzIHplcm8gKi8KKwkJbXRrX2NxZG1hX2hhcmRfcmVzZXQocGMpOworCisJCS8qIGVu YWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgUEMgKi8KKwkJbXRrX2RtYV9zZXQocGMsIE1US19DUURN QV9JTlRfRU4sIE1US19DUURNQV9JTlRfRU5fQklUKTsKKworCQkvKgorCQkgKiByZWZjb3VudF9p bmMgd291bGQgY29tcGxhaW4gaW5jcmVtZW50IG9uIDA7IHVzZS1hZnRlci1mcmVlLgorCQkgKiBU aHVzLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IGFzIDEgaW5pdGlhbGx5LgorCQkgKi8K KwkJcmVmY291bnRfc2V0KCZwYy0+cmVmY250LCAxKTsKKwl9IGVsc2UgeworCQlyZWZjb3VudF9p bmMoJnBjLT5yZWZjbnQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBjLT5sb2Nr LCBmbGFncyk7CisKKwl2Yy0+cGMgPSBwYzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJ c3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNoYW4oYyk7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKworCS8qIGZyZWUgYWxsIGRlc2NyaXB0b3JzIGluIGFsbCBsaXN0cyBv biB0aGUgVkMgKi8KKwltdGtfY3FkbWFfdGVybWluYXRlX2FsbChjKTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBQQyBpcyBub3QgZnJlZWQgdW50 aWwgdGhlcmUgaXMgbm8gVkMgbWFwcGVkIHRvIGl0ICovCisJaWYgKHJlZmNvdW50X2RlY19hbmRf dGVzdCgmY3ZjLT5wYy0+cmVmY250KSkgeworCQkvKiBzdGFydCB0aGUgZmx1c2ggb3BlcmF0aW9u IGFuZCBzdG9wIHRoZSBlbmdpbmUgKi8KKwkJbXRrX2RtYV9zZXQoY3ZjLT5wYywgTVRLX0NRRE1B X0ZMVVNILCBNVEtfQ1FETUFfRkxVU0hfQklUKTsKKworCQkvKiB3YWl0IGZvciB0aGUgY29tcGxl dGlvbiBvZiBmbHVzaCBvcGVyYXRpb24gKi8KKwkJaWYgKG10a19jcWRtYV9wb2xsX2VuZ2luZV9k b25lKGN2Yy0+cGMsIGZhbHNlKSA8IDApCisJCQlkZXZfZXJyKGNxZG1hMmRldih0b19jcWRtYV9k ZXYoYykpLCAiY3FkbWEgZmx1c2ggdGltZW91dFxuIik7CisKKwkJLyogY2xlYXIgdGhlIGZsdXNo IGJpdCBhbmQgaW50ZXJydXB0IGZsYWcgKi8KKwkJbXRrX2RtYV9jbHIoY3ZjLT5wYywgTVRLX0NR RE1BX0ZMVVNILCBNVEtfQ1FETUFfRkxVU0hfQklUKTsKKwkJbXRrX2RtYV9jbHIoY3ZjLT5wYywg TVRLX0NRRE1BX0lOVF9GTEFHLAorCQkJICAgIE1US19DUURNQV9JTlRfRkxBR19CSVQpOworCisJ CS8qIGRpc2FibGUgaW50ZXJydXB0IGZvciB0aGlzIFBDICovCisJCW10a19kbWFfY2xyKGN2Yy0+ cGMsIE1US19DUURNQV9JTlRfRU4sIE1US19DUURNQV9JTlRfRU5fQklUKTsKKwl9CisKKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBp bnQgbXRrX2NxZG1hX2h3X2luaXQoc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKmNxZG1hKQorewor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKwl1MzIgaTsKKworCXBtX3J1bnRpbWVf ZW5hYmxlKGNxZG1hMmRldihjcWRtYSkpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoY3FkbWEyZGV2 KGNxZG1hKSk7CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoY3FkbWEtPmNsayk7CisKKwlp ZiAoZXJyKSB7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3FkbWEyZGV2KGNxZG1hKSk7CisJCXBt X3J1bnRpbWVfZGlzYWJsZShjcWRtYTJkZXYoY3FkbWEpKTsKKwkJcmV0dXJuIGVycjsKKwl9CisK KwkvKiByZXNldCBhbGwgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5l bHM7ICsraSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFn cyk7CisJCWlmIChtdGtfY3FkbWFfaGFyZF9yZXNldChjcWRtYS0+cGNbaV0pIDwgMCkgeworCQkJ ZGV2X2VycihjcWRtYTJkZXYoY3FkbWEpLCAiY3FkbWEgaGFyZCByZXNldCB0aW1lb3V0XG4iKTsK KwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOwor CisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY3FkbWEtPmNsayk7CisJCQlwbV9ydW50aW1lX3B1 dF9zeW5jKGNxZG1hMmRldihjcWRtYSkpOworCQkJcG1fcnVudGltZV9kaXNhYmxlKGNxZG1hMmRl dihjcWRtYSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIG10a19jcWRtYV9od19kZWluaXQoc3RydWN0IG10a19jcWRtYV9kZXZpY2Ug KmNxZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGk7CisKKwkvKiByZXNldCBh bGwgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5lbHM7ICsraSkgewor CQlzcGluX2xvY2tfaXJxc2F2ZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7CisJCWlmICht dGtfY3FkbWFfaGFyZF9yZXNldChjcWRtYS0+cGNbaV0pIDwgMCkKKwkJCWRldl9lcnIoY3FkbWEy ZGV2KGNxZG1hKSwgImNxZG1hIGhhcmQgcmVzZXQgdGltZW91dFxuIik7CisJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCX0KKworCWNsa19kaXNh YmxlX3VucHJlcGFyZShjcWRtYS0+Y2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3FkbWEy ZGV2KGNxZG1hKSk7CisJcG1fcnVudGltZV9kaXNhYmxlKGNxZG1hMmRldihjcWRtYSkpOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfY3FkbWFfbWF0Y2hbXSA9IHsK Kwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10Njc2NS1jcWRtYSIgfSwKKwl7IC8qIHNlbnRp bmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdGtfY3FkbWFfbWF0Y2gpOwor CitzdGF0aWMgaW50IG10a19jcWRtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYTsKKwlzdHJ1Y3QgbXRrX2NxZG1h X3ZjaGFuICp2YzsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGQ7CisJc3RydWN0IHJlc291cmNlICpy ZXM7CisJaW50IGVycjsKKwl1MzIgaTsKKworCWNxZG1hID0gZGV2bV9remFsbG9jKCZwZGV2LT5k ZXYsIHNpemVvZigqY3FkbWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNxZG1hKQorCQlyZXR1cm4g LUVOT01FTTsKKworCWRkID0gJmNxZG1hLT5kZGV2OworCisJY3FkbWEtPmNsayA9IGRldm1fY2xr X2dldCgmcGRldi0+ZGV2LCAiY3FkbWEiKTsKKwlpZiAoSVNfRVJSKGNxZG1hLT5jbGspKSB7CisJ CWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNsb2NrIGZvciAlc1xuIiwKKwkJCWRldl9uYW1lKCZw ZGV2LT5kZXYpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPmNsayk7CisJfQorCisJZG1hX2Nh cF9zZXQoRE1BX01FTUNQWSwgZGQtPmNhcF9tYXNrKTsKKworCWRkLT5jb3B5X2FsaWduID0gTVRL X0NRRE1BX0FMSUdOX1NJWkU7CisJZGQtPmRldmljZV9hbGxvY19jaGFuX3Jlc291cmNlcyA9IG10 a19jcWRtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2aWNlX2ZyZWVfY2hhbl9yZXNv dXJjZXMgPSBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2aWNlX3R4X3N0 YXR1cyA9IG10a19jcWRtYV90eF9zdGF0dXM7CisJZGQtPmRldmljZV9pc3N1ZV9wZW5kaW5nID0g bXRrX2NxZG1hX2lzc3VlX3BlbmRpbmc7CisJZGQtPmRldmljZV9wcmVwX2RtYV9tZW1jcHkgPSBt dGtfY3FkbWFfcHJlcF9kbWFfbWVtY3B5OworCWRkLT5kZXZpY2VfdGVybWluYXRlX2FsbCA9IG10 a19jcWRtYV90ZXJtaW5hdGVfYWxsOworCWRkLT5zcmNfYWRkcl93aWR0aHMgPSBNVEtfQ1FETUFf RE1BX0JVU1dJRFRIUzsKKwlkZC0+ZHN0X2FkZHJfd2lkdGhzID0gTVRLX0NRRE1BX0RNQV9CVVNX SURUSFM7CisJZGQtPmRpcmVjdGlvbnMgPSBCSVQoRE1BX01FTV9UT19NRU0pOworCWRkLT5yZXNp ZHVlX2dyYW51bGFyaXR5ID0gRE1BX1JFU0lEVUVfR1JBTlVMQVJJVFlfU0VHTUVOVDsKKwlkZC0+ ZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmZGQtPmNoYW5uZWxzKTsKKworCWlm IChwZGV2LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zf bm9kZSwKKwkJCQkJCSAgICAgICJkbWEtcmVxdWVzdHMiLAorCQkJCQkJICAgICAgJmNxZG1hLT5k bWFfcmVxdWVzdHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVzaW5nICV1IGFz IG1pc3NpbmcgZG1hLXJlcXVlc3RzIHByb3BlcnR5XG4iLAorCQkJIE1US19DUURNQV9OUl9WQ0hB TlMpOworCisJCWNxZG1hLT5kbWFfcmVxdWVzdHMgPSBNVEtfQ1FETUFfTlJfVkNIQU5TOworCX0K KworCWlmIChwZGV2LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5k ZXYub2Zfbm9kZSwKKwkJCQkJCSAgICAgICJkbWEtY2hhbm5lbHMiLAorCQkJCQkJICAgICAgJmNx ZG1hLT5kbWFfY2hhbm5lbHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVzaW5n ICV1IGFzIG1pc3NpbmcgZG1hLWNoYW5uZWxzIHByb3BlcnR5XG4iLAorCQkJIE1US19DUURNQV9O Ul9QQ0hBTlMpOworCisJCWNxZG1hLT5kbWFfY2hhbm5lbHMgPSBNVEtfQ1FETUFfTlJfUENIQU5T OworCX0KKworCWNxZG1hLT5wYyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBjcWRtYS0+ZG1h X2NoYW5uZWxzLAorCQkJCSBzaXplb2YoKmNxZG1hLT5wYyksIEdGUF9LRVJORUwpOworCWlmICgh Y3FkbWEtPnBjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXRpYWxpemF0aW9uIGZvciBQ Q3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsgKytpKSB7CisJCWNx ZG1hLT5wY1tpXSA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCAxLAorCQkJCQkgICAgc2l6ZW9m KCoqY3FkbWEtPnBjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3FkbWEtPnBjW2ldKQorCQkJcmV0 dXJuIC1FTk9NRU07CisKKwkJSU5JVF9MSVNUX0hFQUQoJmNxZG1hLT5wY1tpXS0+cXVldWUpOwor CQlzcGluX2xvY2tfaW5pdCgmY3FkbWEtPnBjW2ldLT5sb2NrKTsKKwkJcmVmY291bnRfc2V0KCZj cWRtYS0+cGNbaV0tPnJlZmNudCwgMCk7CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNl KHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRldl9lcnIoJnBk ZXYtPmRldiwgIk5vIG1lbSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQkJZGV2X25hbWUoJnBkZXYt PmRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQljcWRtYS0+cGNbaV0tPmJhc2Ug PSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VSUihj cWRtYS0+cGNbaV0tPmJhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPnBjW2ldLT5iYXNl KTsKKworCQkvKiBhbGxvY2F0ZSBJUlEgcmVzb3VyY2UgKi8KKwkJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRl dl9lcnIoJnBkZXYtPmRldiwgIk5vIGlycSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQkJZGV2X25h bWUoJnBkZXYtPmRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3FkbWEtPnBjW2ld LT5pcnEgPSByZXMtPnN0YXJ0OworCisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRl diwgY3FkbWEtPnBjW2ldLT5pcnEsCisJCQkJICAgICAgIG10a19jcWRtYV9pcnEsIDAsIGRldl9u YW1lKCZwZGV2LT5kZXYpLAorCQkJCSAgICAgICBjcWRtYSk7CisJCWlmIChlcnIpIHsKKwkJCWRl dl9lcnIoJnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdF9pcnEgZmFpbGVkIHdpdGggZXJyICVkXG4i LCBlcnIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBhbGxvY2F0ZSByZXNv dXJjZSBmb3IgVkNzICovCisJY3FkbWEtPnZjID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIGNx ZG1hLT5kbWFfcmVxdWVzdHMsCisJCQkJIHNpemVvZigqY3FkbWEtPnZjKSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFjcWRtYS0+dmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8 IGNxZG1hLT5kbWFfcmVxdWVzdHM7IGkrKykgeworCQl2YyA9ICZjcWRtYS0+dmNbaV07CisJCXZj LT52Yy5kZXNjX2ZyZWUgPSBtdGtfY3FkbWFfdmRlc2NfZnJlZTsKKwkJdmNoYW5faW5pdCgmdmMt PnZjLCBkZCk7CisJCWluaXRfY29tcGxldGlvbigmdmMtPmlzc3VlX2NvbXBsZXRpb24pOworCX0K KworCWVyciA9IGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoZGQpOworCWlmIChlcnIpCisJCXJl dHVybiBlcnI7CisKKwllcnIgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3RlcihwZGV2LT5kZXYu b2Zfbm9kZSwKKwkJCQkJIG9mX2RtYV94bGF0ZV9ieV9jaGFuX2lkLCBjcWRtYSk7CisJaWYgKGVy cikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEgT0YgcmVnaXN0 cmF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfdW5yZWdpc3RlcjsKKwl9CisK KwllcnIgPSBtdGtfY3FkbWFfaHdfaW5pdChjcWRtYSk7CisJaWYgKGVycikgeworCQlkZXZfZXJy KCZwZGV2LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEgSFcgaW5pdGlhbGl6YXRpb24gZmFpbGVk ICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCX0KKworCXBsYXRmb3JtX3Nl dF9kcnZkYXRhKHBkZXYsIGNxZG1hKTsKKworCS8qIGluaXRpYWxpemUgdGFza2xldCBmb3IgZWFj aCBQQyAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyArK2kpCisJCXRh c2tsZXRfaW5pdCgmY3FkbWEtPnBjW2ldLT50YXNrbGV0LCBtdGtfY3FkbWFfdGFza2xldF9jYiwK KwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY3FkbWEtPnBjW2ldKTsKKworCWRldl9pbmZvKCZwZGV2 LT5kZXYsICJNZWRpYVRlayBDUURNQSBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisKKwlyZXR1cm4g MDsKKworZXJyX3VucmVnaXN0ZXI6CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKGRkKTsK KworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX3JlbW92ZShzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRt YSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4g KnZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBraWxsIFZDIHRhc2sg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9yZXF1ZXN0czsgaSsrKSB7CisJCXZjID0g JmNxZG1hLT52Y1tpXTsKKworCQlsaXN0X2RlbCgmdmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOwor CQl0YXNrbGV0X2tpbGwoJnZjLT52Yy50YXNrKTsKKwl9CisKKwkvKiBkaXNhYmxlIGludGVycnVw dCAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyBpKyspIHsKKwkJc3Bp bl9sb2NrX2lycXNhdmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCQltdGtfZG1hX2Ns cihjcWRtYS0+cGNbaV0sIE1US19DUURNQV9JTlRfRU4sCisJCQkgICAgTVRLX0NRRE1BX0lOVF9F Tl9CSVQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0tPmxvY2ssIGZs YWdzKTsKKworCQkvKiBXYWl0cyBmb3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJzIHRvIGNvbXBs ZXRlICovCisJCXN5bmNocm9uaXplX2lycShjcWRtYS0+cGNbaV0tPmlycSk7CisKKwkJdGFza2xl dF9raWxsKCZjcWRtYS0+cGNbaV0tPnRhc2tsZXQpOworCX0KKworCS8qIGRpc2FibGUgaGFyZHdh cmUgKi8KKwltdGtfY3FkbWFfaHdfZGVpbml0KGNxZG1hKTsKKworCWRtYV9hc3luY19kZXZpY2Vf dW5yZWdpc3RlcigmY3FkbWEtPmRkZXYpOworCW9mX2RtYV9jb250cm9sbGVyX2ZyZWUocGRldi0+ ZGV2Lm9mX25vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZHJpdmVyIG10a19jcWRtYV9kcml2ZXIgPSB7CisJLnByb2JlID0gbXRrX2NxZG1hX3Byb2JlLAor CS5yZW1vdmUgPSBtdGtfY3FkbWFfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lICAgICAg ICAgICA9IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtdGtfY3FkbWFfbWF0 Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10a19jcWRtYV9kcml2ZXIpOwor CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIENRRE1BIENvbnRyb2xsZXIgRHJpdmVyIik7 CitNT0RVTEVfQVVUSE9SKCJTaHVuLUNoaWggWXUgPHNodW4tY2hpaC55dUBtZWRpYXRlay5jb20+ Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==