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: <1539848951-14798-3-git-send-email-shun-chih.yu@mediatek.com> Date: Thu, 18 Oct 2018 15:49:11 +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 ICAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyB8ICA5NTEgKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgOTY1 IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2RtYS9tZWRpYXRlay9t dGstY3FkbWEuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcgYi9k cml2ZXJzL2RtYS9tZWRpYXRlay9LY29uZmlnCmluZGV4IDI3YmFjMGIuLjY4MGZjMDUgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvbWVk aWF0ZWsvS2NvbmZpZwpAQCAtMTEsMyArMTEsMTYgQEAgY29uZmlnIE1US19IU0RNQQogCSAgVGhp cyBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8K IAkgIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVSB0aHJvdWdo IHJpbmctCiAJICBiYXNlZCBkZXNjcmlwdG9yIG1hbmFnZW1lbnQuCisKK2NvbmZpZyBNVEtfQ1FE TUEKKwl0cmlzdGF0ZSAiTWVkaWFUZWsgQ29tbWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBzdXBw b3J0IgorCWRlcGVuZHMgb24gQVJDSF9NRURJQVRFSyB8fCBDT01QSUxFX1RFU1QKKwlzZWxlY3Qg RE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUworCXNlbGVjdCBBU1lOQ19U WF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgQ29t bWFuZC1RdWV1ZSBETUEgY29udHJvbGxlciBvbiBNZWRpYVRlaworCSAgU29Dcy4KKworCSAgVGhp cyBjb250cm9sbGVyIHByb3ZpZGVzIHRoZSBjaGFubmVscyB3aGljaCBpcyBkZWRpY2F0ZWQgdG8K KwkgIG1lbW9yeS10by1tZW1vcnkgdHJhbnNmZXIgdG8gb2ZmbG9hZCBmcm9tIENQVS4KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZG1hL21lZGlhdGVrL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvbWVkaWF0 ZWsvTWFrZWZpbGUKaW5kZXggNmU3NzhmOC4uNDFiYjM4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9k bWEvbWVkaWF0ZWsvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvbWVkaWF0ZWsvTWFrZWZpbGUK QEAgLTEgKzEsMiBAQAogb2JqLSQoQ09ORklHX01US19IU0RNQSkgKz0gbXRrLWhzZG1hLm8KK29i ai0kKENPTkZJR19NVEtfQ1FETUEpICs9IG10ay1jcWRtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJz L2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYyBiL2RyaXZlcnMvZG1hL21lZGlhdGVrL210ay1jcWRt YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWYzOTcKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL2RtYS9tZWRpYXRlay9tdGstY3FkbWEuYwpAQCAtMCwwICsxLDk1 MSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8vIENvcHlyaWdodCAo 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 QywgY3ZkLT5zcmMgJiBNVEtfQ1FETUFfQUREUl9MSU1JVCk7CisjaWZkZWYgQ09ORklHX0FSQ0hf RE1BX0FERFJfVF82NEJJVAorCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FETUFfU1JDMiwgY3ZkLT5z cmMgPj4gTVRLX0NRRE1BX0FERFIyX1NIRklUKTsKKyNlbHNlCisJbXRrX2RtYV9zZXQocGMsIE1U S19DUURNQV9TUkMyLCAwKTsKKyNlbmRpZgorCisJLyogc2V0dXAgdGhlIGRlc3RpbmF0aW9uICov CisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9EU1QsIGN2ZC0+ZGVzdCAmIE1US19DUURNQV9B RERSX0xJTUlUKTsKKyNpZmRlZiBDT05GSUdfQVJDSF9ETUFfQUREUl9UXzY0QklUCisJbXRrX2Rt YV9zZXQocGMsIE1US19DUURNQV9EU1QyLCBjdmQtPmRlc3QgPj4gTVRLX0NRRE1BX0FERFIyX1NI RklUKTsKKyNlbHNlCisJbXRrX2RtYV9zZXQocGMsIE1US19DUURNQV9TUkMyLCAwKTsKKyNlbmRp ZgorCisJLyogc2V0dXAgdGhlIGxlbmd0aCAqLworCW10a19kbWFfc2V0KHBjLCBNVEtfQ1FETUFf TEVOMSwgY3ZkLT5sZW4pOworCisJLyogc3RhcnQgZG1hIGVuZ2luZSAqLworCW10a19kbWFfc2V0 KHBjLCBNVEtfQ1FETUFfRU4sIE1US19DUURNQV9FTl9CSVQpOworfQorCitzdGF0aWMgdm9pZCBt dGtfY3FkbWFfaXNzdWVfdmNoYW5fcGVuZGluZyhzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFuICpjdmMp Cit7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqdmQyOworCXN0cnVjdCBtdGtfY3FkbWFf cGNoYW4gKnBjID0gY3ZjLT5wYzsKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjICpjdmQ7CisJYm9v bCB0cmlnZ2VyX2VuZ2luZSA9IGZhbHNlOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmY3ZjLT52 Yy5sb2NrKTsKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwYy0+bG9jayk7CisKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5X3NhZmUodmQsIHZkMiwgJmN2Yy0+dmMuZGVzY19pc3N1ZWQsIG5vZGUpIHsKKwkJ LyogbmVlZCB0byB0cmlnZ2VyIGRtYSBlbmdpbmUgaWYgUEMncyBxdWV1ZSBpcyBlbXB0eSAqLwor CQlpZiAobGlzdF9lbXB0eSgmcGMtPnF1ZXVlKSkKKwkJCXRyaWdnZXJfZW5naW5lID0gdHJ1ZTsK KworCQljdmQgPSB0b19jcWRtYV92ZGVzYyh2ZCk7CisKKwkJLyogYWRkIFZEIGludG8gUEMncyBx dWV1ZSAqLworCQlsaXN0X2FkZF90YWlsKCZjdmQtPm5vZGUsICZwYy0+cXVldWUpOworCisJCS8q IHN0YXJ0IHRoZSBkbWEgZW5naW5lICovCisJCWlmICh0cmlnZ2VyX2VuZ2luZSkKKwkJCW10a19j cWRtYV9zdGFydChwYywgY3ZkKTsKKworCQkvKiByZW1vdmUgVkQgZnJvbSBsaXN0IGRlc2NfaXNz dWVkICovCisJCWxpc3RfZGVsKCZ2ZC0+bm9kZSk7CisJfQorfQorCisvKgorICogcmV0dXJuIHRy dWUgaWYgdGhpcyBWQyBpcyBhY3RpdmUsCisgKiBtZWFuaW5nIHRoYXQgdGhlcmUgYXJlIFZEcyB1 bmRlciBwcm9jZXNzaW5nIGJ5IHRoZSBQQworICovCitzdGF0aWMgYm9vbCBtdGtfY3FkbWFfaXNf dmNoYW5fYWN0aXZlKHN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YykKK3sKKwlzdHJ1Y3QgbXRr X2NxZG1hX3ZkZXNjICpjdmQ7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN2ZCwgJmN2Yy0+cGMt PnF1ZXVlLCBub2RlKQorCQlpZiAoY3ZjID09IHRvX2NxZG1hX3ZjaGFuKGN2ZC0+Y2gpKQorCQkJ cmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qCisgKiByZXR1cm4gdGhlIHBv aW50ZXIgb2YgdGhlIENWRCB0aGF0IGlzIGp1c3QgY29uc3VtZWQgYnkgdGhlIFBDCisgKi8KK3N0 YXRpYyBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjCisqbXRrX2NxZG1hX2NvbnN1bWVfd29ya19xdWV1 ZShzdHJ1Y3QgbXRrX2NxZG1hX3BjaGFuICpwYykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX3ZjaGFu ICpjdmM7CisJc3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkLCAqcmV0ID0gTlVMTDsKKworCS8q IGNvbnN1bWUgYSBDVkQgZnJvbSBQQydzIHF1ZXVlICovCisJY3ZkID0gbGlzdF9maXJzdF9lbnRy eV9vcl9udWxsKCZwYy0+cXVldWUsCisJCQkJICAgICAgIHN0cnVjdCBtdGtfY3FkbWFfdmRlc2Ms IG5vZGUpOworCWlmICh1bmxpa2VseSghY3ZkIHx8ICFjdmQtPnBhcmVudCkpCisJCXJldHVybiBO VUxMOworCisJY3ZjID0gdG9fY3FkbWFfdmNoYW4oY3ZkLT5jaCk7CisJcmV0ID0gY3ZkOworCisJ LyogdXBkYXRlIHJlc2lkdWUgb2YgdGhlIHBhcmVudCBDVkQgKi8KKwljdmQtPnBhcmVudC0+cmVz aWR1ZSAtPSBjdmQtPmxlbjsKKworCS8qIGRlbGV0ZSBDVkQgZnJvbSBQQydzIHF1ZXVlICovCisJ bGlzdF9kZWwoJmN2ZC0+bm9kZSk7CisKKwlzcGluX2xvY2soJmN2Yy0+dmMubG9jayk7CisKKwkv KiBjaGVjayB3aGV0aGVyIGFsbCB0aGUgY2hpbGQgQ1ZEcyBjb21wbGV0ZWQgKi8KKwlpZiAoIWN2 ZC0+cGFyZW50LT5yZXNpZHVlKSB7CisJCS8qIGFkZCB0aGUgcGFyZW50IFZEIGludG8gbGlzdCBk ZXNjX2NvbXBsZXRlZCAqLworCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmN2ZC0+cGFyZW50LT52 ZCk7CisKKwkJLyogc2V0dXAgY29tcGxldGlvbiBpZiB0aGlzIFZDIGlzIHVuZGVyIHN5bmNocm9u aXphdGlvbiAqLworCQlpZiAoY3ZjLT5pc3N1ZV9zeW5jaHJvbml6ZSAmJiAhbXRrX2NxZG1hX2lz X3ZjaGFuX2FjdGl2ZShjdmMpKSB7CisJCQljb21wbGV0ZSgmY3ZjLT5pc3N1ZV9jb21wbGV0aW9u KTsKKwkJCWN2Yy0+aXNzdWVfc3luY2hyb25pemUgPSBmYWxzZTsKKwkJfQorCX0KKworCXNwaW5f dW5sb2NrKCZjdmMtPnZjLmxvY2spOworCisJLyogc3RhcnQgdHJhbnNhY3Rpb24gZm9yIG5leHQg Q1ZEIGluIHRoZSBxdWV1ZSAqLworCWN2ZCA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmcGMt PnF1ZXVlLAorCQkJCSAgICAgICBzdHJ1Y3QgbXRrX2NxZG1hX3ZkZXNjLCBub2RlKTsKKwlpZiAo Y3ZkKQorCQltdGtfY3FkbWFfc3RhcnQocGMsIGN2ZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitz dGF0aWMgdm9pZCBtdGtfY3FkbWFfdGFza2xldF9jYih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJ c3RydWN0IG10a19jcWRtYV9wY2hhbiAqcGMgPSAoc3RydWN0IG10a19jcWRtYV9wY2hhbiAqKWRh dGE7CisJc3RydWN0IG10a19jcWRtYV92ZGVzYyAqY3ZkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5sb2NrLCBmbGFncyk7CisJLyogY29u c3VtZSB0aGUgcXVldWUgKi8KKwljdmQgPSBtdGtfY3FkbWFfY29uc3VtZV93b3JrX3F1ZXVlKHBj KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYy0+bG9jaywgZmxhZ3MpOworCisJLyogc3Vi bWl0IHRoZSBuZXh0IENWRCAqLworCWlmIChjdmQpIHsKKwkJZG1hX3J1bl9kZXBlbmRlbmNpZXMo JmN2ZC0+dmQudHgpOworCisJCS8qCisJCSAqIGZyZWUgY2hpbGQgQ1ZEIGFmdGVyIGNvbXBsZXRp b24uCisJCSAqIHRoZSBwYXJlbnQgQ1ZEIHdvdWxkIGJlIGZyZWVlZCB3aXRoIGRlc2NfZnJlZSBi eSB1c2VyLgorCQkgKi8KKwkJaWYgKGN2ZC0+cGFyZW50ICE9IGN2ZCkKKwkJCWtmcmVlKGN2ZCk7 CisJfQorCisJLyogcmUtZW5hYmxlIGludGVycnVwdCBiZWZvcmUgbGVhdmluZyB0YXNrbGV0ICov CisJZW5hYmxlX2lycShwYy0+aXJxKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG10a19jcWRt YV9pcnEoaW50IGlycSwgdm9pZCAqZGV2aWQpCit7CisJc3RydWN0IG10a19jcWRtYV9kZXZpY2Ug KmNxZG1hID0gZGV2aWQ7CisJaXJxcmV0dXJuX3QgcmV0ID0gSVJRX05PTkU7CisJYm9vbCBzY2hl ZHVsZV90YXNrbGV0ID0gZmFsc2U7CisJdTMyIGk7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgZmxh Z3MgZm9yIGVhY2ggUEMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsg KytpLCBzY2hlZHVsZV90YXNrbGV0ID0gZmFsc2UpIHsKKwkJc3Bpbl9sb2NrKCZjcWRtYS0+cGNb aV0tPmxvY2spOworCQlpZiAobXRrX2RtYV9yZWFkKGNxZG1hLT5wY1tpXSwKKwkJCQkgTVRLX0NR RE1BX0lOVF9GTEFHKSAmIE1US19DUURNQV9JTlRfRkxBR19CSVQpIHsKKwkJCS8qIGNsZWFyIGlu dGVycnVwdCAqLworCQkJbXRrX2RtYV9jbHIoY3FkbWEtPnBjW2ldLCBNVEtfQ1FETUFfSU5UX0ZM QUcsCisJCQkJICAgIE1US19DUURNQV9JTlRfRkxBR19CSVQpOworCisJCQlzY2hlZHVsZV90YXNr bGV0ID0gdHJ1ZTsKKwkJCXJldCA9IElSUV9IQU5ETEVEOworCQl9CisJCXNwaW5fdW5sb2NrKCZj cWRtYS0+cGNbaV0tPmxvY2spOworCisJCWlmIChzY2hlZHVsZV90YXNrbGV0KSB7CisJCQkvKiBk aXNhYmxlIGludGVycnVwdCAqLworCQkJZGlzYWJsZV9pcnFfbm9zeW5jKGNxZG1hLT5wY1tpXS0+ aXJxKTsKKworCQkJLyogc2NoZWR1bGUgdGhlIHRhc2tsZXQgdG8gaGFuZGxlIHRoZSB0cmFuc2Fj dGlvbnMgKi8KKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmNxZG1hLT5wY1tpXS0+dGFza2xldCk7CisJ CX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZpcnRfZG1hX2Rlc2Mg Km10a19jcWRtYV9maW5kX2FjdGl2ZV9kZXNjKHN0cnVjdCBkbWFfY2hhbiAqYywKKwkJCQkJCQlk bWFfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRv X2NxZG1hX3ZjaGFuKGMpOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+cGMtPmxvY2ssIGZsYWdzKTsK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZkLCAmY3ZjLT5wYy0+cXVldWUsIG5vZGUpCisJCWlmICh2 ZC0+dHguY29va2llID09IGNvb2tpZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3Zj LT5wYy0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIHZkOworCQl9CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmY3ZjLT5wYy0+bG9jaywgZmxhZ3MpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2 ZCwgJmN2Yy0+dmMuZGVzY19pc3N1ZWQsIG5vZGUpCisJCWlmICh2ZC0+dHguY29va2llID09IGNv b2tpZSkKKwkJCXJldHVybiB2ZDsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgZW51bSBk bWFfc3RhdHVzIG10a19jcWRtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9jaGFuICpjLAorCQkJCQkg ICBkbWFfY29va2llX3QgY29va2llLAorCQkJCQkgICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0 YXRlKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRvX2NxZG1hX3ZjaGFuKGMp OworCXN0cnVjdCBtdGtfY3FkbWFfdmRlc2MgKmN2ZDsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAq dmQ7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNpemVf dCBieXRlcyA9IDA7CisKKwlyZXQgPSBkbWFfY29va2llX3N0YXR1cyhjLCBjb29raWUsIHR4c3Rh dGUpOworCWlmIChyZXQgPT0gRE1BX0NPTVBMRVRFIHx8ICF0eHN0YXRlKQorCQlyZXR1cm4gcmV0 OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmN2Yy0+dmMubG9jaywgZmxhZ3MpOworCXZkID0gbXRr X2NxZG1hX2ZpbmRfYWN0aXZlX2Rlc2MoYywgY29va2llKTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZjdmMtPnZjLmxvY2ssIGZsYWdzKTsKKworCWlmICh2ZCkgeworCQljdmQgPSB0b19jcWRt YV92ZGVzYyh2ZCk7CisJCWJ5dGVzID0gY3ZkLT5yZXNpZHVlOworCX0KKworCWRtYV9zZXRfcmVz aWR1ZSh0eHN0YXRlLCBieXRlcyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBt dGtfY3FkbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJc3RydWN0IG10 a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNoYW4oYyk7CisJdW5zaWduZWQgbG9uZyBw Y19mbGFnczsKKwl1bnNpZ25lZCBsb25nIHZjX2ZsYWdzOworCisJLyogYWNxdWlyZSBQQydzIGxv Y2sgYmVmb3JlIFZTJ3MgbG9jayBmb3IgbG9jayBkZXBlbmRlbmN5IGluIHRhc2tsZXQgKi8KKwlz cGluX2xvY2tfaXJxc2F2ZSgmY3ZjLT5wYy0+bG9jaywgcGNfZmxhZ3MpOworCXNwaW5fbG9ja19p cnFzYXZlKCZjdmMtPnZjLmxvY2ssIHZjX2ZsYWdzKTsKKworCWlmICh2Y2hhbl9pc3N1ZV9wZW5k aW5nKCZjdmMtPnZjKSkKKwkJbXRrX2NxZG1hX2lzc3VlX3ZjaGFuX3BlbmRpbmcoY3ZjKTsKKwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+dmMubG9jaywgdmNfZmxhZ3MpOworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmN2Yy0+cGMtPmxvY2ssIHBjX2ZsYWdzKTsKK30KKworc3RhdGlj IHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCittdGtfY3FkbWFfcHJlcF9kbWFfbWVt Y3B5KHN0cnVjdCBkbWFfY2hhbiAqYywgZG1hX2FkZHJfdCBkZXN0LAorCQkJICBkbWFfYWRkcl90 IHNyYywgc2l6ZV90IGxlbiwgdW5zaWduZWQgbG9uZyBmbGFncykKK3sKKwlzdHJ1Y3QgbXRrX2Nx ZG1hX3ZkZXNjICoqY3ZkOworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHggPSBO VUxMLCAqcHJldl90eCA9IE5VTEw7CisJc2l6ZV90IGksIHRsZW4sIG5yX3ZkOworCisJLyoKKwkg KiBJbiB0aGUgY2FzZSB0aGF0IHRyc2FuY3Rpb24gbGVuZ3RoIGlzIGxhcmdlciB0aGFuIHRoZQor CSAqIERNQSBlbmdpbmUgc3VwcG9ydHMsIGEgc2luZ2xlIG1lbWNweSB0cmFuc2FjdGlvbiBuZWVk cworCSAqIHRvIGJlIHNlcGFyYXRlZCBpbnRvIHNldmVyYWwgRE1BIHRyYW5zYWN0aW9ucy4KKwkg KiBFYWNoIERNQSB0cmFuc2FjdGlvbiB3b3VsZCBiZSBkZXNjcmliZWQgYnkgYSBDVkQsCisJICog YW5kIHRoZSBmaXJzdCBvbmUgaXMgcmVmZXJyZWQgYXMgdGhlIHBhcmVudCBDVkQsCisJICogd2hp bGUgdGhlIG90aGVycyBhcmUgY2hpbGQgQ1ZEcy4KKwkgKiBUaGUgcGFyZW50IENWRCdzIHR4IGRl c2NyaXB0b3IgaXMgdGhlIG9ubHkgdHggZGVzY3JpcHRvcgorCSAqIHJldHVybmVkIHRvIHRoZSBE TUEgdXNlciwgYW5kIGl0IHNob3VsZCBub3QgYmUgY29tcGxldGVkCisJICogdW50aWwgYWxsIHRo ZSBjaGlsZCBDVkRzIGNvbXBsZXRlZC4KKwkgKi8KKwlucl92ZCA9IERJVl9ST1VORF9VUChsZW4s IE1US19DUURNQV9NQVhfTEVOKTsKKwljdmQgPSBrY2FsbG9jKG5yX3ZkLCBzaXplb2YoKmN2ZCks IEdGUF9OT1dBSVQpOworCWlmICghY3ZkKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaSA9IDA7 IGkgPCBucl92ZDsgKytpKSB7CisJCWN2ZFtpXSA9IGt6YWxsb2Moc2l6ZW9mKCpjdmRbaV0pLCBH RlBfTk9XQUlUKTsKKwkJaWYgKCFjdmRbaV0pIHsKKwkJCWZvciAoOyBpID4gMDsgLS1pKQorCQkJ CWtmcmVlKGN2ZFtpIC0gMV0pOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKworCQkvKiBzZXR1cCBk bWEgY2hhbm5lbCAqLworCQljdmRbaV0tPmNoID0gYzsKKworCQkvKiBzZXR1cCBzb3VyZWNlLCBk ZXN0aW5hdGlvbiwgYW5kIGxlbmd0aCAqLworCQl0bGVuID0gKGxlbiA+IE1US19DUURNQV9NQVhf TEVOKSA/IE1US19DUURNQV9NQVhfTEVOIDogbGVuOworCQljdmRbaV0tPmxlbiA9IHRsZW47CisJ CWN2ZFtpXS0+c3JjID0gc3JjOworCQljdmRbaV0tPmRlc3QgPSBkZXN0OworCisJCS8qIHNldHVw IHR4IGRlc2NyaXB0b3IgKi8KKwkJdHggPSB2Y2hhbl90eF9wcmVwKHRvX3ZpcnRfY2hhbihjKSwg JmN2ZFtpXS0+dmQsIGZsYWdzKTsKKwkJdHgtPm5leHQgPSBOVUxMOworCisJCWlmICghaSkgewor CQkJY3ZkWzBdLT5yZXNpZHVlID0gbGVuOworCQl9IGVsc2UgeworCQkJcHJldl90eC0+bmV4dCA9 IHR4OworCQkJY3ZkW2ldLT5yZXNpZHVlID0gdGxlbjsKKwkJfQorCisJCWN2ZFtpXS0+cGFyZW50 ID0gY3ZkWzBdOworCisJCS8qIHVwZGF0ZSB0aGUgc3JjLCBkZXN0LCBsZW4sIHByZXZfdHggZm9y IHRoZSBuZXh0IENWRCAqLworCQlzcmMgKz0gdGxlbjsKKwkJZGVzdCArPSB0bGVuOworCQlsZW4g LT0gdGxlbjsKKwkJcHJldl90eCA9IHR4OworCX0KKworCXJldHVybiAmY3ZkWzBdLT52ZC50eDsK K30KKworc3RhdGljIHZvaWQgbXRrX2NxZG1hX2ZyZWVfaW5hY3RpdmVfZGVzYyhzdHJ1Y3QgZG1h X2NoYW4gKmMpCit7CisJc3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjID0gdG9fdmlydF9jaGFuKGMp OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJLyoKKwkgKiBz ZXQgZGVzY19hbGxvY2F0ZWQsIGRlc2Nfc3VibWl0dGVkLAorCSAqIGFuZCBkZXNjX2lzc3VlZCBh cyB0aGUgY2FuZGljYXRlcyB0byBiZSBmcmVlZAorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2 Yy0+bG9jaywgZmxhZ3MpOworCWxpc3Rfc3BsaWNlX3RhaWxfaW5pdCgmdmMtPmRlc2NfYWxsb2Nh dGVkLCAmaGVhZCk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ2Yy0+ZGVzY19zdWJtaXR0ZWQs ICZoZWFkKTsKKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJnZjLT5kZXNjX2lzc3VlZCwgJmhlYWQp OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBmcmVl IGRlc2NyaXB0b3IgbGlzdHMgKi8KKwl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QodmMsICZoZWFk KTsKK30KKworc3RhdGljIHZvaWQgbXRrX2NxZG1hX2ZyZWVfYWN0aXZlX2Rlc2Moc3RydWN0IGRt YV9jaGFuICpjKQoreworCXN0cnVjdCBtdGtfY3FkbWFfdmNoYW4gKmN2YyA9IHRvX2NxZG1hX3Zj aGFuKGMpOworCWJvb2wgc3luY19uZWVkZWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIHBjX2Zs YWdzOworCXVuc2lnbmVkIGxvbmcgdmNfZmxhZ3M7CisKKwkvKiBhY3F1aXJlIFBDJ3MgbG9jayBm aXJzdCBkdWUgdG8gbG9jayBkZXBlbmRlbmN5IGluIGRtYSBJU1IgKi8KKwlzcGluX2xvY2tfaXJx c2F2ZSgmY3ZjLT5wYy0+bG9jaywgcGNfZmxhZ3MpOworCXNwaW5fbG9ja19pcnFzYXZlKCZjdmMt PnZjLmxvY2ssIHZjX2ZsYWdzKTsKKworCS8qIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCBp ZiB0aGlzIFZDIGlzIGFjdGl2ZSAqLworCWlmIChtdGtfY3FkbWFfaXNfdmNoYW5fYWN0aXZlKGN2 YykpIHsKKwkJY3ZjLT5pc3N1ZV9zeW5jaHJvbml6ZSA9IHRydWU7CisJCXN5bmNfbmVlZGVkID0g dHJ1ZTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnZjLmxvY2ssIHZjX2Zs YWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnBjLT5sb2NrLCBwY19mbGFncyk7 CisKKwkvKiB3YWl0aW5nIGZvciB0aGUgY29tcGxldGlvbiBvZiB0aGlzIFZDICovCisJaWYgKHN5 bmNfbmVlZGVkKQorCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjdmMtPmlzc3VlX2NvbXBsZXRpb24p OworCisJLyogZnJlZSBhbGwgZGVzY3JpcHRvcnMgaW4gbGlzdCBkZXNjX2NvbXBsZXRlZCAqLwor CXZjaGFuX3N5bmNocm9uaXplKCZjdmMtPnZjKTsKKworCVdBUk5fT05DRSghbGlzdF9lbXB0eSgm Y3ZjLT52Yy5kZXNjX2NvbXBsZXRlZCksCisJCSAgIkRlc2MgcGVuZGluZyBzdGlsbCBpbiBsaXN0 IGRlc2NfY29tcGxldGVkXG4iKTsKK30KKworc3RhdGljIGludCBtdGtfY3FkbWFfdGVybWluYXRl X2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmMpCit7CisJLyogZnJlZSBkZXNjcmlwdG9ycyBub3QgcHJv Y2Vzc2VkIHlldCBieSBoYXJkd2FyZSAqLworCW10a19jcWRtYV9mcmVlX2luYWN0aXZlX2Rlc2Mo Yyk7CisKKwkvKiBmcmVlIGRlc2NyaXB0b3JzIGJlaW5nIHByb2Nlc3NlZCBieSBoYXJkd2FyZSAq LworCW10a19jcWRtYV9mcmVlX2FjdGl2ZV9kZXNjKGMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgbXRrX2NxZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKHN0cnVjdCBkbWFfY2hhbiAq YykKK3sKKwlzdHJ1Y3QgbXRrX2NxZG1hX2RldmljZSAqY3FkbWEgPSB0b19jcWRtYV9kZXYoYyk7 CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqdmMgPSB0b19jcWRtYV92Y2hhbihjKTsKKwlzdHJ1 Y3QgbXRrX2NxZG1hX3BjaGFuICpwYyA9IE5VTEw7CisJdTMyIGksIG1pbl9yZWZjbnQgPSBVMzJf TUFYLCByZWZjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGFsbG9jYXRlIFBDIHdp dGggdGhlIG1pbmltdW4gcmVmY291bnQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9j aGFubmVsczsgKytpKSB7CisJCXJlZmNudCA9IHJlZmNvdW50X3JlYWQoJmNxZG1hLT5wY1tpXS0+ cmVmY250KTsKKwkJaWYgKHJlZmNudCA8IG1pbl9yZWZjbnQpIHsKKwkJCXBjID0gY3FkbWEtPnBj W2ldOworCQkJbWluX3JlZmNudCA9IHJlZmNudDsKKwkJfQorCX0KKworCWlmICghcGMpCisJCXJl dHVybiAtRU5PU1BDOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBjLT5sb2NrLCBmbGFncyk7CisK KwlpZiAoIXJlZmNvdW50X3JlYWQoJnBjLT5yZWZjbnQpKSB7CisJCS8qIGFsbG9jYXRlIFBDIHdo ZW4gdGhlIHJlZmNvdW50IGlzIHplcm8gKi8KKwkJbXRrX2NxZG1hX2hhcmRfcmVzZXQocGMpOwor CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgZm9yIHRoaXMgUEMgKi8KKwkJbXRrX2RtYV9zZXQocGMs IE1US19DUURNQV9JTlRfRU4sIE1US19DUURNQV9JTlRfRU5fQklUKTsKKworCQkvKgorCQkgKiBy ZWZjb3VudF9pbmMgd291bGQgY29tcGxhaW4gaW5jcmVtZW50IG9uIDA7IHVzZS1hZnRlci1mcmVl LgorCQkgKiBUaHVzLCB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IGl0IGFzIDEgaW5pdGlhbGx5 LgorCQkgKi8KKwkJcmVmY291bnRfc2V0KCZwYy0+cmVmY250LCAxKTsKKwl9IGVsc2UgeworCQly ZWZjb3VudF9pbmMoJnBjLT5yZWZjbnQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnBjLT5sb2NrLCBmbGFncyk7CisKKwl2Yy0+cGMgPSBwYzsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4g KmMpCit7CisJc3RydWN0IG10a19jcWRtYV92Y2hhbiAqY3ZjID0gdG9fY3FkbWFfdmNoYW4oYyk7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGZyZWUgYWxsIGRlc2NyaXB0b3JzIGluIGFs bCBsaXN0cyBvbiB0aGUgVkMgKi8KKwltdGtfY3FkbWFfdGVybWluYXRlX2FsbChjKTsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBQQyBpcyBub3Qg ZnJlZWQgdW50aWwgdGhlcmUgaXMgbm8gVkMgbWFwcGVkIHRvIGl0ICovCisJaWYgKHJlZmNvdW50 X2RlY19hbmRfdGVzdCgmY3ZjLT5wYy0+cmVmY250KSkgeworCQkvKiBzdGFydCB0aGUgZmx1c2gg b3BlcmF0aW9uIGFuZCBzdG9wIHRoZSBlbmdpbmUgKi8KKwkJbXRrX2RtYV9zZXQoY3ZjLT5wYywg TVRLX0NRRE1BX0ZMVVNILCBNVEtfQ1FETUFfRkxVU0hfQklUKTsKKworCQkvKiB3YWl0IGZvciB0 aGUgY29tcGxldGlvbiBvZiBmbHVzaCBvcGVyYXRpb24gKi8KKwkJaWYgKG10a19jcWRtYV9wb2xs X2VuZ2luZV9kb25lKGN2Yy0+cGMsIGZhbHNlKSA8IDApCisJCQlkZXZfZXJyKGNxZG1hMmRldih0 b19jcWRtYV9kZXYoYykpLCAiY3FkbWEgZmx1c2ggdGltZW91dFxuIik7CisKKwkJLyogY2xlYXIg dGhlIGZsdXNoIGJpdCBhbmQgaW50ZXJydXB0IGZsYWcgKi8KKwkJbXRrX2RtYV9jbHIoY3ZjLT5w YywgTVRLX0NRRE1BX0ZMVVNILCBNVEtfQ1FETUFfRkxVU0hfQklUKTsKKwkJbXRrX2RtYV9jbHIo Y3ZjLT5wYywgTVRLX0NRRE1BX0lOVF9GTEFHLAorCQkJICAgIE1US19DUURNQV9JTlRfRkxBR19C SVQpOworCisJCS8qIGRpc2FibGUgaW50ZXJydXB0IGZvciB0aGlzIFBDICovCisJCW10a19kbWFf Y2xyKGN2Yy0+cGMsIE1US19DUURNQV9JTlRfRU4sIE1US19DUURNQV9JTlRfRU5fQklUKTsKKwl9 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdmMtPnBjLT5sb2NrLCBmbGFncyk7Cit9CisK K3N0YXRpYyBpbnQgbXRrX2NxZG1hX2h3X2luaXQoc3RydWN0IG10a19jcWRtYV9kZXZpY2UgKmNx ZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKwl1MzIgaTsKKworCXBt X3J1bnRpbWVfZW5hYmxlKGNxZG1hMmRldihjcWRtYSkpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMo Y3FkbWEyZGV2KGNxZG1hKSk7CisKKwllcnIgPSBjbGtfcHJlcGFyZV9lbmFibGUoY3FkbWEtPmNs ayk7CisKKwlpZiAoZXJyKSB7CisJCXBtX3J1bnRpbWVfcHV0X3N5bmMoY3FkbWEyZGV2KGNxZG1h KSk7CisJCXBtX3J1bnRpbWVfZGlzYWJsZShjcWRtYTJkZXYoY3FkbWEpKTsKKwkJcmV0dXJuIGVy cjsKKwl9CisKKwkvKiByZXNldCBhbGwgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5k bWFfY2hhbm5lbHM7ICsraSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3FkbWEtPnBjW2ldLT5s b2NrLCBmbGFncyk7CisJCWlmIChtdGtfY3FkbWFfaGFyZF9yZXNldChjcWRtYS0+cGNbaV0pIDwg MCkgeworCQkJZGV2X2VycihjcWRtYTJkZXYoY3FkbWEpLCAiY3FkbWEgaGFyZCByZXNldCB0aW1l b3V0XG4iKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywg ZmxhZ3MpOworCisJCQljbGtfZGlzYWJsZV91bnByZXBhcmUoY3FkbWEtPmNsayk7CisJCQlwbV9y dW50aW1lX3B1dF9zeW5jKGNxZG1hMmRldihjcWRtYSkpOworCQkJcG1fcnVudGltZV9kaXNhYmxl KGNxZG1hMmRldihjcWRtYSkpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19jcWRtYV9od19kZWluaXQoc3RydWN0IG10a19jcWRt YV9kZXZpY2UgKmNxZG1hKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGk7CisKKwkv KiByZXNldCBhbGwgUENzICovCisJZm9yIChpID0gMDsgaSA8IGNxZG1hLT5kbWFfY2hhbm5lbHM7 ICsraSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY3FkbWEtPnBjW2ldLT5sb2NrLCBmbGFncyk7 CisJCWlmIChtdGtfY3FkbWFfaGFyZF9yZXNldChjcWRtYS0+cGNbaV0pIDwgMCkKKwkJCWRldl9l cnIoY3FkbWEyZGV2KGNxZG1hKSwgImNxZG1hIGhhcmQgcmVzZXQgdGltZW91dFxuIik7CisJCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCX0KKwor CWNsa19kaXNhYmxlX3VucHJlcGFyZShjcWRtYS0+Y2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5 bmMoY3FkbWEyZGV2KGNxZG1hKSk7CisJcG1fcnVudGltZV9kaXNhYmxlKGNxZG1hMmRldihjcWRt YSkpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBtdGtfY3FkbWFfbWF0 Y2hbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gIm1lZGlhdGVrLG10Njc2NS1jcWRtYSIgfSwKKwl7 IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBtdGtfY3FkbWFf bWF0Y2gpOworCitzdGF0aWMgaW50IG10a19jcWRtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2aWNlICpjcWRtYTsKKwlzdHJ1Y3Qg bXRrX2NxZG1hX3ZjaGFuICp2YzsKKwlzdHJ1Y3QgZG1hX2RldmljZSAqZGQ7CisJc3RydWN0IHJl c291cmNlICpyZXM7CisJaW50IGVycjsKKwl1MzIgaTsKKworCWNxZG1hID0gZGV2bV9remFsbG9j KCZwZGV2LT5kZXYsIHNpemVvZigqY3FkbWEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNxZG1hKQor CQlyZXR1cm4gLUVOT01FTTsKKworCWRkID0gJmNxZG1hLT5kZGV2OworCisJY3FkbWEtPmNsayA9 IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAiY3FkbWEiKTsKKwlpZiAoSVNfRVJSKGNxZG1hLT5j bGspKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGNsb2NrIGZvciAlc1xuIiwKKwkJCWRl dl9uYW1lKCZwZGV2LT5kZXYpKTsKKwkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPmNsayk7CisJfQor CisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgZGQtPmNhcF9tYXNrKTsKKworCWRkLT5jb3B5X2Fs aWduID0gTVRLX0NRRE1BX0FMSUdOX1NJWkU7CisJZGQtPmRldmljZV9hbGxvY19jaGFuX3Jlc291 cmNlcyA9IG10a19jcWRtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2aWNlX2ZyZWVf Y2hhbl9yZXNvdXJjZXMgPSBtdGtfY3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlkZC0+ZGV2 aWNlX3R4X3N0YXR1cyA9IG10a19jcWRtYV90eF9zdGF0dXM7CisJZGQtPmRldmljZV9pc3N1ZV9w ZW5kaW5nID0gbXRrX2NxZG1hX2lzc3VlX3BlbmRpbmc7CisJZGQtPmRldmljZV9wcmVwX2RtYV9t ZW1jcHkgPSBtdGtfY3FkbWFfcHJlcF9kbWFfbWVtY3B5OworCWRkLT5kZXZpY2VfdGVybWluYXRl X2FsbCA9IG10a19jcWRtYV90ZXJtaW5hdGVfYWxsOworCWRkLT5zcmNfYWRkcl93aWR0aHMgPSBN VEtfQ1FETUFfRE1BX0JVU1dJRFRIUzsKKwlkZC0+ZHN0X2FkZHJfd2lkdGhzID0gTVRLX0NRRE1B X0RNQV9CVVNXSURUSFM7CisJZGQtPmRpcmVjdGlvbnMgPSBCSVQoRE1BX01FTV9UT19NRU0pOwor CWRkLT5yZXNpZHVlX2dyYW51bGFyaXR5ID0gRE1BX1JFU0lEVUVfR1JBTlVMQVJJVFlfU0VHTUVO VDsKKwlkZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlJTklUX0xJU1RfSEVBRCgmZGQtPmNoYW5uZWxz KTsKKworCWlmIChwZGV2LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2 LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAgICAgICJkbWEtcmVxdWVzdHMiLAorCQkJCQkJICAgICAg JmNxZG1hLT5kbWFfcmVxdWVzdHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJCQkgIlVz aW5nICV1IGFzIG1pc3NpbmcgZG1hLXJlcXVlc3RzIHByb3BlcnR5XG4iLAorCQkJIE1US19DUURN QV9OUl9WQ0hBTlMpOworCisJCWNxZG1hLT5kbWFfcmVxdWVzdHMgPSBNVEtfQ1FETUFfTlJfVkNI QU5TOworCX0KKworCWlmIChwZGV2LT5kZXYub2Zfbm9kZSAmJiBvZl9wcm9wZXJ0eV9yZWFkX3Uz MihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJCSAgICAgICJkbWEtY2hhbm5lbHMiLAorCQkJCQkJ ICAgICAgJmNxZG1hLT5kbWFfY2hhbm5lbHMpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsCisJ CQkgIlVzaW5nICV1IGFzIG1pc3NpbmcgZG1hLWNoYW5uZWxzIHByb3BlcnR5XG4iLAorCQkJIE1U S19DUURNQV9OUl9QQ0hBTlMpOworCisJCWNxZG1hLT5kbWFfY2hhbm5lbHMgPSBNVEtfQ1FETUFf TlJfUENIQU5TOworCX0KKworCWNxZG1hLT5wYyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBj cWRtYS0+ZG1hX2NoYW5uZWxzLAorCQkJCSBzaXplb2YoKmNxZG1hLT5wYyksIEdGUF9LRVJORUwp OworCWlmICghY3FkbWEtPnBjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXRpYWxpemF0 aW9uIGZvciBQQ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9jaGFubmVsczsgKytp KSB7CisJCWNxZG1hLT5wY1tpXSA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCAxLAorCQkJCQkg ICAgc2l6ZW9mKCoqY3FkbWEtPnBjKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY3FkbWEtPnBjW2ld KQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJSU5JVF9MSVNUX0hFQUQoJmNxZG1hLT5wY1tpXS0+ cXVldWUpOworCQlzcGluX2xvY2tfaW5pdCgmY3FkbWEtPnBjW2ldLT5sb2NrKTsKKwkJcmVmY291 bnRfc2V0KCZjcWRtYS0+cGNbaV0tPnJlZmNudCwgMCk7CisKKwkJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCBpKTsKKwkJaWYgKCFyZXMpIHsKKwkJCWRl dl9lcnIoJnBkZXYtPmRldiwgIk5vIG1lbSByZXNvdXJjZSBmb3IgJXNcbiIsCisJCQkJZGV2X25h bWUoJnBkZXYtPmRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQljcWRtYS0+cGNb aV0tPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYg KElTX0VSUihjcWRtYS0+cGNbaV0tPmJhc2UpKQorCQkJcmV0dXJuIFBUUl9FUlIoY3FkbWEtPnBj W2ldLT5iYXNlKTsKKworCQkvKiBhbGxvY2F0ZSBJUlEgcmVzb3VyY2UgKi8KKwkJcmVzID0gcGxh dGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCBpKTsKKwkJaWYgKCFyZXMp IHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGlycSByZXNvdXJjZSBmb3IgJXNcbiIsCisJ CQkJZGV2X25hbWUoJnBkZXYtPmRldikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3Fk bWEtPnBjW2ldLT5pcnEgPSByZXMtPnN0YXJ0OworCisJCWVyciA9IGRldm1fcmVxdWVzdF9pcnEo JnBkZXYtPmRldiwgY3FkbWEtPnBjW2ldLT5pcnEsCisJCQkJICAgICAgIG10a19jcWRtYV9pcnEs IDAsIGRldl9uYW1lKCZwZGV2LT5kZXYpLAorCQkJCSAgICAgICBjcWRtYSk7CisJCWlmIChlcnIp IHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkicmVxdWVzdF9pcnEgZmFpbGVkIHdpdGgg ZXJyICVkXG4iLCBlcnIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwkvKiBhbGxv Y2F0ZSByZXNvdXJjZSBmb3IgVkNzICovCisJY3FkbWEtPnZjID0gZGV2bV9rY2FsbG9jKCZwZGV2 LT5kZXYsIGNxZG1hLT5kbWFfcmVxdWVzdHMsCisJCQkJIHNpemVvZigqY3FkbWEtPnZjKSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCFjcWRtYS0+dmMpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChp ID0gMDsgaSA8IGNxZG1hLT5kbWFfcmVxdWVzdHM7IGkrKykgeworCQl2YyA9ICZjcWRtYS0+dmNb aV07CisJCXZjLT52Yy5kZXNjX2ZyZWUgPSBtdGtfY3FkbWFfdmRlc2NfZnJlZTsKKwkJdmNoYW5f aW5pdCgmdmMtPnZjLCBkZCk7CisJCWluaXRfY29tcGxldGlvbigmdmMtPmlzc3VlX2NvbXBsZXRp b24pOworCX0KKworCWVyciA9IGRtYV9hc3luY19kZXZpY2VfcmVnaXN0ZXIoZGQpOworCWlmIChl cnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBvZl9kbWFfY29udHJvbGxlcl9yZWdpc3Rlcihw ZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJIG9mX2RtYV94bGF0ZV9ieV9jaGFuX2lkLCBjcWRtYSk7 CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEg T0YgcmVnaXN0cmF0aW9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwkJZ290byBlcnJfdW5yZWdpc3Rl cjsKKwl9CisKKwllcnIgPSBtdGtfY3FkbWFfaHdfaW5pdChjcWRtYSk7CisJaWYgKGVycikgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTWVkaWFUZWsgQ1FETUEgSFcgaW5pdGlhbGl6YXRp b24gZmFpbGVkICVkXG4iLCBlcnIpOworCQlnb3RvIGVycl91bnJlZ2lzdGVyOworCX0KKworCXBs YXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGNxZG1hKTsKKworCS8qIGluaXRpYWxpemUgdGFza2xl dCBmb3IgZWFjaCBQQyAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyAr K2kpCisJCXRhc2tsZXRfaW5pdCgmY3FkbWEtPnBjW2ldLT50YXNrbGV0LCBtdGtfY3FkbWFfdGFz a2xldF9jYiwKKwkJCSAgICAgKHVuc2lnbmVkIGxvbmcpY3FkbWEtPnBjW2ldKTsKKworCWRldl9p bmZvKCZwZGV2LT5kZXYsICJNZWRpYVRlayBDUURNQSBkcml2ZXIgcmVnaXN0ZXJlZFxuIik7CisK KwlyZXR1cm4gMDsKKworZXJyX3VucmVnaXN0ZXI6CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lz dGVyKGRkKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2NxZG1hX3JlbW92 ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfY3FkbWFfZGV2 aWNlICpjcWRtYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBtdGtfY3Fk bWFfdmNoYW4gKnZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBraWxs IFZDIHRhc2sgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3FkbWEtPmRtYV9yZXF1ZXN0czsgaSsrKSB7 CisJCXZjID0gJmNxZG1hLT52Y1tpXTsKKworCQlsaXN0X2RlbCgmdmMtPnZjLmNoYW4uZGV2aWNl X25vZGUpOworCQl0YXNrbGV0X2tpbGwoJnZjLT52Yy50YXNrKTsKKwl9CisKKwkvKiBkaXNhYmxl IGludGVycnVwdCAqLworCWZvciAoaSA9IDA7IGkgPCBjcWRtYS0+ZG1hX2NoYW5uZWxzOyBpKysp IHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNxZG1hLT5wY1tpXS0+bG9jaywgZmxhZ3MpOworCQlt dGtfZG1hX2NscihjcWRtYS0+cGNbaV0sIE1US19DUURNQV9JTlRfRU4sCisJCQkgICAgTVRLX0NR RE1BX0lOVF9FTl9CSVQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcWRtYS0+cGNbaV0t PmxvY2ssIGZsYWdzKTsKKworCQkvKiBXYWl0cyBmb3IgYW55IHBlbmRpbmcgSVJRIGhhbmRsZXJz IHRvIGNvbXBsZXRlICovCisJCXN5bmNocm9uaXplX2lycShjcWRtYS0+cGNbaV0tPmlycSk7CisK KwkJdGFza2xldF9raWxsKCZjcWRtYS0+cGNbaV0tPnRhc2tsZXQpOworCX0KKworCS8qIGRpc2Fi bGUgaGFyZHdhcmUgKi8KKwltdGtfY3FkbWFfaHdfZGVpbml0KGNxZG1hKTsKKworCWRtYV9hc3lu Y19kZXZpY2VfdW5yZWdpc3RlcigmY3FkbWEtPmRkZXYpOworCW9mX2RtYV9jb250cm9sbGVyX2Zy ZWUocGRldi0+ZGV2Lm9mX25vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg cGxhdGZvcm1fZHJpdmVyIG10a19jcWRtYV9kcml2ZXIgPSB7CisJLnByb2JlID0gbXRrX2NxZG1h X3Byb2JlLAorCS5yZW1vdmUgPSBtdGtfY3FkbWFfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5u YW1lICAgICAgICAgICA9IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBtdGtf Y3FkbWFfbWF0Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG10a19jcWRtYV9k cml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhVGVrIENRRE1BIENvbnRyb2xsZXIg RHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJTaHVuLUNoaWggWXUgPHNodW4tY2hpaC55dUBtZWRp YXRlay5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==