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: [3/7] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs From: Peng Ma Message-Id: <20181026095240.33668-3-peng.ma@nxp.com> Date: Fri, 26 Oct 2018 17:52:36 +0800 To: vkoul@kernel.org Cc: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, leoyang.li@nxp.com, dan.j.williams@intel.com, zw@zh-kernel.org, dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, Peng Ma , Wen He , Jiaheng Fan List-ID: TlhQIFF1ZXVlIERNQSBjb250cm9sbGVyKHFETUEpIG9uIExheWVyc2NhcGUgU29DcyBzdXBwb3J0 cyBjaGFubmVsCnZpcnR1YWxsaXphdGlvbiBieSBhbGxvd2luZyBETUEgam9icyB0byBiZSBlbnF1 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KCk5vdGUgdGhhdCB0aGlzIG1vZHVs ZSBkZXBlbmRzIG9uIE5YUCBEUEFBLgoKU2lnbmVkLW9mZi1ieTogV2VuIEhlIDx3ZW4uaGVfMUBu eHAuY29tPgpTaWduZWQtb2ZmLWJ5OiBKaWFoZW5nIEZhbiA8amlhaGVuZy5mYW5AbnhwLmNvbT4K U2lnbmVkLW9mZi1ieTogUGVuZyBNYSA8cGVuZy5tYUBueHAuY29tPgotLS0KY2hhbmdlIGluIHYx MDoKCS0gbm8KCiBkcml2ZXJzL2RtYS9LY29uZmlnICAgIHwgICAxMyArCiBkcml2ZXJzL2RtYS9N YWtlZmlsZSAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS9mc2wtcWRtYS5jIHwgMTI1NyArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdl ZCwgMTI3MSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvZG1hL2ZzbC1xZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmln IGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBkYWNmM2Y0Li41MGUxOWQ3IDEwMDY0NAotLS0g YS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTIxOCw2 ICsyMTgsMTkgQEAgY29uZmlnIEZTTF9FRE1BCiAJICBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSBm b3IgRE1BIHJlcXVlc3Qgc291cmNlcyhzbG90KS4KIAkgIFRoaXMgbW9kdWxlIGNhbiBiZSBmb3Vu ZCBvbiBGcmVlc2NhbGUgVnlicmlkIGFuZCBMUy0xIFNvQ3MuCiAKK2NvbmZpZyBGU0xfUURNQQor ICAgICAgIHRyaXN0YXRlICJOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2luZSBzdXBwb3J0IgorICAg ICAgIGRlcGVuZHMgb24gQVJNIHx8IEFSTTY0CisgICAgICAgc2VsZWN0IERNQV9FTkdJTkUKKyAg ICAgICBzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKyAgICAgICBzZWxlY3QgRE1BX0VOR0lO RV9SQUlECisgICAgICAgc2VsZWN0IEFTWU5DX1RYX0VOQUJMRV9DSEFOTkVMX1NXSVRDSAorICAg ICAgIGhlbHAKKyAgICAgICAgIFN1cHBvcnQgdGhlIE5YUCBMYXllcnNjYXBlIHFETUEgZW5naW5l IHdpdGggY29tbWFuZCBxdWV1ZSBhbmQgbGVnYWN5IG1vZGUuCisgICAgICAgICBDaGFubmVsIHZp cnR1YWxpemF0aW9uIGlzIHN1cHBvcnRlZCB0aHJvdWdoIGVucXVldWluZyBvZiBETUEgam9icyB0 bywKKyAgICAgICAgIG9yIGRlcXVldWluZyBETUEgam9icyBmcm9tLCBkaWZmZXJlbnQgd29yayBx dWV1ZXMuCisgICAgICAgICBUaGlzIG1vZHVsZSBjYW4gYmUgZm91bmQgb24gTlhQIExheWVyc2Nh cGUgU29Dcy4KKwogY29uZmlnIEZTTF9SQUlECiAgICAgICAgIHRyaXN0YXRlICJGcmVlc2NhbGUg UkFJRCBlbmdpbmUgU3VwcG9ydCIKICAgICAgICAgZGVwZW5kcyBvbiBGU0xfU09DICYmICFBU1lO Q19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL01ha2Vm aWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggYzkxNzAyZC4uMmQxYjU4NiAxMDA2NDQK LS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKQEAg LTMyLDYgKzMyLDcgQEAgb2JqLSQoQ09ORklHX0RXX0RNQUNfQ09SRSkgKz0gZHcvCiBvYmotJChD T05GSUdfRVA5M1hYX0RNQSkgKz0gZXA5M3h4X2RtYS5vCiBvYmotJChDT05GSUdfRlNMX0RNQSkg Kz0gZnNsZG1hLm8KIG9iai0kKENPTkZJR19GU0xfRURNQSkgKz0gZnNsLWVkbWEubworb2JqLSQo Q09ORklHX0ZTTF9RRE1BKSArPSBmc2wtcWRtYS5vCiBvYmotJChDT05GSUdfRlNMX1JBSUQpICs9 IGZzbF9yYWlkLm8KIG9iai0kKENPTkZJR19IU1VfRE1BKSArPSBoc3UvCiBvYmotJChDT05GSUdf SU1HX01EQ19ETUEpICs9IGltZy1tZGMtZG1hLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2Zz bC1xZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2wtcWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjQwNDg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9mc2wt cWRtYS5jCkBAIC0wLDAgKzEsMTI1NyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAKKy8vIENvcHlyaWdodCAyMDE4IE5YUAorCisvKgorICogRHJpdmVyIGZvciBOWFAgTGF5 ZXJzY2FwZSBRdWV1ZSBEaXJlY3QgTWVtb3J5IEFjY2VzcyBDb250cm9sbGVyCisgKgorICogQXV0 aG9yOgorICogIFdlbiBIZSA8d2VuLmhlXzFAbnhwLmNvbT4KKyAqICBKaWFoZW5nIEZhbiA8amlh aGVuZy5mYW5AbnhwLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgor I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5j bHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KKyNp bmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmlydC1kbWEuaCIKKyNp bmNsdWRlICJmc2xkbWEuaCIKKworLyogUmVnaXN0ZXIgcmVsYXRlZCBkZWZpbml0aW9uICovCisj ZGVmaW5lIEZTTF9RRE1BX0RNUgkJCTB4MAorI2RlZmluZSBGU0xfUURNQV9EU1IJCQkweDQKKyNk ZWZpbmUgRlNMX1FETUFfREVJRVIJCQkweGUwMAorI2RlZmluZSBGU0xfUURNQV9ERURSCQkJMHhl MDQKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXMFIJCTB4ZTEwCisjZGVmaW5lIEZTTF9RRE1BX0RF Q0ZEVzFSCQkweGUxNAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFcyUgkJMHhlMTgKKyNkZWZpbmUg RlNMX1FETUFfREVDRkRXM1IJCTB4ZTFjCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0ZRSURSCQkweGUz MAorI2RlZmluZSBGU0xfUURNQV9ERUNCUgkJCTB4ZTM0CisKKyNkZWZpbmUgRlNMX1FETUFfQkNR TVIoeCkJCSgweGMwICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUVNSKHgpCQko MHhjNCArIDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FFRFBBX1NBRERSKHgpCSgw eGM4ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUURQQV9TQUREUih4KQkoMHhj YyArIDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FFRVBBX1NBRERSKHgpCSgweGQw ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUUVQQV9TQUREUih4KQkoMHhkNCAr IDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FJRVIoeCkJCSgweGUwICsgMHgxMDAg KiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUUlEUih4KQkJKDB4ZTQgKyAweDEwMCAqICh4KSkK KworI2RlZmluZSBGU0xfUURNQV9TUURQQVIJCQkweDgwYworI2RlZmluZSBGU0xfUURNQV9TUUVQ QVIJCQkweDgxNAorI2RlZmluZSBGU0xfUURNQV9CU1FNUgkJCTB4ODAwCisjZGVmaW5lIEZTTF9R RE1BX0JTUVNSCQkJMHg4MDQKKyNkZWZpbmUgRlNMX1FETUFfQlNRSUNSCQkJMHg4MjgKKyNkZWZp bmUgRlNMX1FETUFfQ1FNUgkJCTB4YTAwCisjZGVmaW5lIEZTTF9RRE1BX0NRRFNDUjEJCTB4YTA4 CisjZGVmaW5lIEZTTF9RRE1BX0NRRFNDUjIgICAgICAgICAgICAgICAgMHhhMGMKKyNkZWZpbmUg RlNMX1FETUFfQ1FJRVIJCQkweGExMAorI2RlZmluZSBGU0xfUURNQV9DUUVEUgkJCTB4YTE0Cisj ZGVmaW5lIEZTTF9RRE1BX1NRQ0NNUgkJCTB4YTIwCisKKy8qIFJlZ2lzdGVycyBmb3IgYml0IGFu ZCBnZW5tYXNrICovCisjZGVmaW5lIEZTTF9RRE1BX0NRSURSX1NRVAkJQklUKDE1KQorI2RlZmlu ZSBRRE1BX0NDREZfRk9UTUFUCQlCSVQoMjkpCisjZGVmaW5lIFFETUFfQ0NERl9TRVIJCQlCSVQo MzApCisjZGVmaW5lIFFETUFfU0dfRklOCQkJQklUKDMwKQorI2RlZmluZSBRRE1BX1NHX0xFTl9N QVNLCQlHRU5NQVNLKDI5LCAwKQorI2RlZmluZSBRRE1BX0NDREZfTUFTSwkJCUdFTk1BU0soMjgs IDIwKQorCisjZGVmaW5lIEZTTF9RRE1BX0RFRFJfQ0xFQVIJCUdFTk1BU0soMzEsIDApCisjZGVm aW5lIEZTTF9RRE1BX0JDUUlEUl9DTEVBUgkJR0VOTUFTSygzMSwgMCkKKyNkZWZpbmUgRlNMX1FE TUFfREVJRVJfQ0xFQVIJCUdFTk1BU0soMzEsIDApCisKKyNkZWZpbmUgRlNMX1FETUFfQkNRSUVS X0NRVElFCQlCSVQoMTUpCisjZGVmaW5lIEZTTF9RRE1BX0JDUUlFUl9DUVBFSUUJCUJJVCgyMykK KyNkZWZpbmUgRlNMX1FETUFfQlNRSUNSX0lDRU4JCUJJVCgzMSkKKworI2RlZmluZSBGU0xfUURN QV9CU1FJQ1JfSUNTVCh4KQkJKCh4KSA8PCAxNikKKyNkZWZpbmUgRlNMX1FETUFfQ1FJRVJfTUVJ RQkJQklUKDMxKQorI2RlZmluZSBGU0xfUURNQV9DUUlFUl9URUlFCQlCSVQoMCkKKyNkZWZpbmUg RlNMX1FETUFfU1FDQ01SX0VOVEVSX1dNCUJJVCgyMSkKKworI2RlZmluZSBGU0xfUURNQV9CQ1FN Ul9FTgkJQklUKDMxKQorI2RlZmluZSBGU0xfUURNQV9CQ1FNUl9FSQkJQklUKDMwKQorI2RlZmlu ZSBGU0xfUURNQV9CQ1FNUl9DRF9USExEKHgpCSgoeCkgPDwgMjApCisjZGVmaW5lIEZTTF9RRE1B X0JDUU1SX0NRX1NJWkUoeCkJKCh4KSA8PCAxNikKKworI2RlZmluZSBGU0xfUURNQV9CQ1FTUl9R RgkJQklUKDE2KQorI2RlZmluZSBGU0xfUURNQV9CQ1FTUl9YT0ZGCQlCSVQoMCkKKworI2RlZmlu ZSBGU0xfUURNQV9CU1FNUl9FTgkJQklUKDMxKQorI2RlZmluZSBGU0xfUURNQV9CU1FNUl9ESQkJ QklUKDMwKQorI2RlZmluZSBGU0xfUURNQV9CU1FNUl9DUV9TSVpFKHgpCSgoeCkgPDwgMTYpCisK KyNkZWZpbmUgRlNMX1FETUFfQlNRU1JfUUUJCUJJVCgxNykKKworI2RlZmluZSBGU0xfUURNQV9E TVJfRFFECQlCSVQoMzApCisjZGVmaW5lIEZTTF9RRE1BX0RTUl9EQgkJQklUKDMxKQorCisvKiBT aXplIHJlbGF0ZWQgZGVmaW5pdGlvbiAqLworI2RlZmluZSBGU0xfUURNQV9RVUVVRV9NQVgJCTgK KyNkZWZpbmUgRlNMX1FETUFfQ09NTUFORF9CVUZGRVJfU0laRQk2NAorI2RlZmluZSBGU0xfUURN QV9ERVNDUklQVE9SX0JVRkZFUl9TSVpFIDMyCisjZGVmaW5lIEZTTF9RRE1BX0NJUkNVTEFSX0RF U0NfU0laRV9NSU4JNjQKKyNkZWZpbmUgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01BWAkx NjM4NAorI2RlZmluZSBGU0xfUURNQV9RVUVVRV9OVU1fTUFYCQk4CisKKy8qIEZpZWxkIGRlZmlu aXRpb24gZm9yIENNRCAqLworI2RlZmluZSBGU0xfUURNQV9DTURfUldUVFlQRQkJMHg0CisjZGVm aW5lIEZTTF9RRE1BX0NNRF9MV0MgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lIEZTTF9RRE1B X0NNRF9SV1RUWVBFX09GRlNFVAkyOAorI2RlZmluZSBGU0xfUURNQV9DTURfTlNfT0ZGU0VUCQky NworI2RlZmluZSBGU0xfUURNQV9DTURfRFFPU19PRkZTRVQJMjQKKyNkZWZpbmUgRlNMX1FETUFf Q01EX1dUSFJPVExfT0ZGU0VUCTIwCisjZGVmaW5lIEZTTF9RRE1BX0NNRF9EU0VOX09GRlNFVAkx OQorI2RlZmluZSBGU0xfUURNQV9DTURfTFdDX09GRlNFVAkJMTYKKworLyogRmllbGQgZGVmaW5p dGlvbiBmb3IgRGVzY3JpcHRvciBvZmZzZXQgKi8KKyNkZWZpbmUgUURNQV9DQ0RGX1NUQVRVUwkJ MjAKKyNkZWZpbmUgUURNQV9DQ0RGX09GRlNFVAkJMjAKKworLyogRmllbGQgZGVmaW5pdGlvbiBm b3Igc2FmZSBsb29wIGNvdW50Ki8KKyNkZWZpbmUgRlNMX1FETUFfSEFMVF9DT1VOVAkJMTUwMAor I2RlZmluZSBGU0xfUURNQV9NQVhfU0laRQkJMTYzODUKKyNkZWZpbmUJRlNMX1FETUFfQ09NUF9U SU1FT1VUCQkxMDAwCisjZGVmaW5lIEZTTF9DT01NQU5EX1FVRVVFX09WRVJGTExPVwkxMAorCisj ZGVmaW5lIEZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9xZG1hX2VuZ2luZSwgeCkJCQlc CisJKCgoZnNsX3FkbWFfZW5naW5lKS0+YmxvY2tfb2Zmc2V0KSAqICh4KSkKKworLyoqCisgKiBz dHJ1Y3QgZnNsX3FkbWFfZm9ybWF0IC0gVGhpcyBpcyB0aGUgc3RydWN0IGhvbGRpbmcgZGVzY3Jp YmluZyBjb21wb3VuZAorICoJCQkgICAgZGVzY3JpcHRvciBmb3JtYXQgd2l0aCBxRE1BLgorICog QHN0YXR1czoJCSAgICBDb21tYW5kIHN0YXR1cyBhbmQgZW5xdWV1ZSBzdGF0dXMgbm90aWZpY2F0 aW9uLgorICogQGNmZzoJCSAgICBGcmFtZSBvZmZzZXQgYW5kIGZyYW1lIGZvcm1hdC4KKyAqIEBh ZGRyX2xvOgkJICAgIEhvbGRpbmcgdGhlIGNvbXBvdW5kIGRlc2NyaXB0b3Igb2YgdGhlIGxvd2Vy CisgKgkJCSAgICAzMi1iaXRzIGFkZHJlc3MgaW4gbWVtb3J5IDQwLWJpdCBhZGRyZXNzLgorICog QGFkZHJfaGk6CQkgICAgU2FtZSBhcyBhYm92ZSBtZW1iZXIsIGJ1dCBwb2ludCBoaWdoIDgtYml0 cyBpbgorICoJCQkgICAgbWVtb3J5IDQwLWJpdCBhZGRyZXNzLgorICogQF9fcmVzZXJ2ZWQxOgkg ICAgUmVzZXJ2ZWQgZmllbGQuCisgKiBAY2ZnOGJfdzE6CQkgICAgQ29tcG91bmQgZGVzY3JpcHRv ciBjb21tYW5kIHF1ZXVlIG9yaWdpbiBwcm9kdWNlZAorICoJCQkgICAgYnkgcURNQSBhbmQgZHlu YW1pYyBkZWJ1ZyBmaWVsZC4KKyAqIEBkYXRhCQkgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IDQw LWJpdCBhZGRyZXNzLCBkZXNjcmliZXMgRE1BCisgKgkJCSAgICBzb3VyY2UgaW5mb3JtYXRpb24g YW5kIERNQSBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGZzbF9xZG1hX2Zv cm1hdCB7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMzIgY2ZnOworCXVuaW9uIHsKKwkJc3RydWN0 IHsKKwkJCV9fbGUzMiBhZGRyX2xvOworCQkJdTggYWRkcl9oaTsKKwkJCXU4IF9fcmVzZXJ2ZWQx WzJdOworCQkJdTggY2ZnOGJfdzE7CisJCX0gX19wYWNrZWQ7CisJCV9fbGU2NCBkYXRhOworCX07 Cit9IF9fcGFja2VkOworCisvKiBxRE1BIHN0YXR1cyBub3RpZmljYXRpb24gcHJlIGluZm9ybWF0 aW9uICovCitzdHJ1Y3QgZnNsX3ByZV9zdGF0dXMgeworCXU2NCBhZGRyOworCXU4IHF1ZXVlOwor fTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBmc2xfcHJlX3N0YXR1cywgcHJlKTsK Kworc3RydWN0IGZzbF9xZG1hX2NoYW4geworCXN0cnVjdCB2aXJ0X2RtYV9jaGFuCQl2Y2hhbjsK KwlzdHJ1Y3QgdmlydF9kbWFfZGVzYwkJdmRlc2M7CisJZW51bSBkbWFfc3RhdHVzCQkJc3RhdHVz OworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUJCSpxZG1hOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1 ZQkJKnF1ZXVlOworfTsKKworc3RydWN0IGZzbF9xZG1hX3F1ZXVlIHsKKwlzdHJ1Y3QgZnNsX3Fk bWFfZm9ybWF0CSp2aXJ0X2hlYWQ7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdAkqdmlydF90YWls OworCXN0cnVjdCBsaXN0X2hlYWQJY29tcF91c2VkOworCXN0cnVjdCBsaXN0X2hlYWQJY29tcF9m cmVlOworCXN0cnVjdCBkbWFfcG9vbAkJKmNvbXBfcG9vbDsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCSpk ZXNjX3Bvb2w7CisJc3BpbmxvY2tfdAkJcXVldWVfbG9jazsKKwlkbWFfYWRkcl90CQlidXNfYWRk cjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBuX2NxOworCXUzMgkJCWlkOworCXN0cnVjdCBm c2xfcWRtYV9mb3JtYXQJKmNxOworCXZvaWQgX19pb21lbQkJKmJsb2NrX2Jhc2U7Cit9OworCitz dHJ1Y3QgZnNsX3FkbWFfY29tcCB7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgYnVzX2FkZHI7 CisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgZGVzY19idXNfYWRkcjsKKwlzdHJ1Y3QgZnNsX3Fk bWFfZm9ybWF0CSp2aXJ0X2FkZHI7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdAkqZGVzY192aXJ0 X2FkZHI7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4JKnFjaGFuOworCXN0cnVjdCB2aXJ0X2RtYV9k ZXNjICAgIHZkZXNjOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKK3N0cnVjdCBmc2xf cWRtYV9lbmdpbmUgeworCXN0cnVjdCBkbWFfZGV2aWNlCWRtYV9kZXY7CisJdm9pZCBfX2lvbWVt CQkqY3RybF9iYXNlOworCXZvaWQgX19pb21lbSAgICAgICAgICAgICpzdGF0dXNfYmFzZTsKKwl2 b2lkIF9faW9tZW0JCSpibG9ja19iYXNlOworCXUzMgkJCW5fY2hhbnM7CisJdTMyCQkJbl9xdWV1 ZXM7CisJc3RydWN0IG11dGV4ICAgICAgICAgICAgZnNsX3FkbWFfbXV0ZXg7CisJaW50CQkJZXJy b3JfaXJxOworCWludAkJCSpxdWV1ZV9pcnE7CisJdTMyCQkJZmVhdHVyZTsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUJKnF1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZQkqKnN0YXR1czsKKwlz dHJ1Y3QgZnNsX3FkbWFfY2hhbgkqY2hhbnM7CisJaW50CQkJYmxvY2tfbnVtYmVyOworCWludAkJ CWJsb2NrX29mZnNldDsKKwlpbnQJCQlpcnFfYmFzZTsKKwlpbnQJCQlkZXNjX2FsbG9jYXRlZDsK KworfTsKKworc3RhdGljIGlubGluZSB1NjQKK3FkbWFfY2NkZl9hZGRyX2dldDY0KGNvbnN0IHN0 cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCit7CisJcmV0dXJuIGxlNjRfdG9fY3B1KGNjZGYt PmRhdGEpICYgKFU2NF9NQVggPj4gMjQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FkbWFf ZGVzY19hZGRyX3NldDY0KHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYsIHU2NCBhZGRyKQor eworCWNjZGYtPmFkZHJfaGkgPSB1cHBlcl8zMl9iaXRzKGFkZHIpOworCWNjZGYtPmFkZHJfbG8g PSBjcHVfdG9fbGUzMihsb3dlcl8zMl9iaXRzKGFkZHIpKTsKK30KKworc3RhdGljIGlubGluZSB1 OAorcWRtYV9jY2RmX2dldF9xdWV1ZShjb25zdCBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2Rm KQoreworCXJldHVybiBjY2RmLT5jZmc4Yl93MSAmIFU4X01BWDsKK30KKworc3RhdGljIGlubGlu ZSBpbnQKK3FkbWFfY2NkZl9nZXRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQg KmNjZGYpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShjY2RmLT5jZmcpICYgUURNQV9DQ0RGX01B U0spID4+IFFETUFfQ0NERl9PRkZTRVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWRtYV9j Y2RmX3NldF9mb3JtYXQoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZiwgaW50IG9mZnNldCkK K3sKKwljY2RmLT5jZmcgPSBjcHVfdG9fbGUzMihRRE1BX0NDREZfRk9UTUFUIHwgb2Zmc2V0KTsK K30KKworc3RhdGljIGlubGluZSBpbnQKK3FkbWFfY2NkZl9nZXRfc3RhdHVzKGNvbnN0IHN0cnVj dCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCit7CisJcmV0dXJuIChsZTMyX3RvX2NwdShjY2RmLT5z dGF0dXMpICYgUURNQV9DQ0RGX01BU0spID4+IFFETUFfQ0NERl9TVEFUVVM7Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZAorcWRtYV9jY2RmX3NldF9zZXIoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAq Y2NkZiwgaW50IHN0YXR1cykKK3sKKwljY2RmLT5zdGF0dXMgPSBjcHVfdG9fbGUzMihRRE1BX0ND REZfU0VSIHwgc3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRf bGVuKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNzZ2YsIGludCBsZW4pCit7CisJY3NnZi0+Y2Zn ID0gY3B1X3RvX2xlMzIobGVuICYgUURNQV9TR19MRU5fTUFTSyk7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBxZG1hX2NzZ2Zfc2V0X2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY3NnZiwgaW50 IGxlbikKK3sKKwljc2dmLT5jZmcgPSBjcHVfdG9fbGUzMihRRE1BX1NHX0ZJTiB8IChsZW4gJiBR RE1BX1NHX0xFTl9NQVNLKSk7Cit9CisKK3N0YXRpYyB1MzIgcWRtYV9yZWFkbChzdHJ1Y3QgZnNs X3FkbWFfZW5naW5lICpxZG1hLCB2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIEZTTF9E TUFfSU4ocWRtYSwgYWRkciwgMzIpOworfQorCitzdGF0aWMgdm9pZCBxZG1hX3dyaXRlbChzdHJ1 Y3QgZnNsX3FkbWFfZW5naW5lICpxZG1hLCB1MzIgdmFsLAorCQkJdm9pZCBfX2lvbWVtICphZGRy KQoreworCUZTTF9ETUFfT1VUKHFkbWEsIGFkZHIsIHZhbCwgMzIpOworfQorCitzdGF0aWMgc3Ry dWN0IGZzbF9xZG1hX2NoYW4gKnRvX2ZzbF9xZG1hX2NoYW4oc3RydWN0IGRtYV9jaGFuICpjaGFu KQoreworCXJldHVybiBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0IGZzbF9xZG1hX2NoYW4sIHZj aGFuLmNoYW4pOworfQorCitzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2NvbXAgKnRvX2ZzbF9xZG1h X2NvbXAoc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXJldHVybiBjb250YWluZXJfb2Yo dmQsIHN0cnVjdCBmc2xfcWRtYV9jb21wLCB2ZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9x ZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVj dCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJc3Ry dWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJc3RydWN0 IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEgPSBmc2xfY2hhbi0+cWRtYTsKKwlzdHJ1Y3QgZnNs X3FkbWFfY29tcCAqY29tcF90ZW1wLCAqX2NvbXBfdGVtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCUxJU1RfSEVBRChoZWFkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfY2hhbi0+dmNo YW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2dldF9hbGxfZGVzY3JpcHRvcnMoJmZzbF9jaGFuLT52 Y2hhbiwgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9jaGFuLT52Y2hhbi5s b2NrLCBmbGFncyk7CisKKwl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QoJmZzbF9jaGFuLT52Y2hh biwgJmhlYWQpOworCisJaWYgKCFmc2xfcXVldWUtPmNvbXBfcG9vbCAmJiAhZnNsX3F1ZXVlLT5j b21wX3Bvb2wpCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb21wX3Rl bXAsIF9jb21wX3RlbXAsCisJCQkJICZmc2xfcXVldWUtPmNvbXBfdXNlZCwJbGlzdCkgeworCQlk bWFfcG9vbF9mcmVlKGZzbF9xdWV1ZS0+Y29tcF9wb29sLAorCQkJICAgICAgY29tcF90ZW1wLT52 aXJ0X2FkZHIsCisJCQkgICAgICBjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJZG1hX3Bvb2xfZnJl ZShmc2xfcXVldWUtPmRlc2NfcG9vbCwKKwkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY192aXJ0X2Fk ZHIsCisJCQkgICAgICBjb21wX3RlbXAtPmRlc2NfYnVzX2FkZHIpOworCQlsaXN0X2RlbCgmY29t cF90ZW1wLT5saXN0KTsKKwkJa2ZyZWUoY29tcF90ZW1wKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUoY29tcF90ZW1wLCBfY29tcF90ZW1wLAorCQkJCSAmZnNsX3F1ZXVlLT5jb21w X2ZyZWUsIGxpc3QpIHsKKwkJZG1hX3Bvb2xfZnJlZShmc2xfcXVldWUtPmNvbXBfcG9vbCwKKwkJ CSAgICAgIGNvbXBfdGVtcC0+dmlydF9hZGRyLAorCQkJICAgICAgY29tcF90ZW1wLT5idXNfYWRk cik7CisJCWRtYV9wb29sX2ZyZWUoZnNsX3F1ZXVlLT5kZXNjX3Bvb2wsCisJCQkgICAgICBjb21w X3RlbXAtPmRlc2NfdmlydF9hZGRyLAorCQkJICAgICAgY29tcF90ZW1wLT5kZXNjX2J1c19hZGRy KTsKKwkJbGlzdF9kZWwoJmNvbXBfdGVtcC0+bGlzdCk7CisJCWtmcmVlKGNvbXBfdGVtcCk7CisJ fQorCisJZG1hX3Bvb2xfZGVzdHJveShmc2xfcXVldWUtPmNvbXBfcG9vbCk7CisJZG1hX3Bvb2xf ZGVzdHJveShmc2xfcXVldWUtPmRlc2NfcG9vbCk7CisKKwlmc2xfcWRtYS0+ZGVzY19hbGxvY2F0 ZWQtLTsKKwlmc2xfcXVldWUtPmNvbXBfcG9vbCA9IE5VTEw7CisJZnNsX3F1ZXVlLT5kZXNjX3Bv b2wgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9jb21wX2ZpbGxfbWVtY3B5KHN0 cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcCwKKwkJCQkgICAgICBkbWFfYWRkcl90IGRzdCwg ZG1hX2FkZHJfdCBzcmMsIHUzMiBsZW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqc2Rm LCAqZGRmOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYsICpjc2dmX2Rlc2MsICpjc2dm X3NyYywgKmNzZ2ZfZGVzdDsKKworCWNjZGYgPSBmc2xfY29tcC0+dmlydF9hZGRyOworCWNzZ2Zf ZGVzYyA9IGZzbF9jb21wLT52aXJ0X2FkZHIgKyAxOworCWNzZ2Zfc3JjID0gZnNsX2NvbXAtPnZp cnRfYWRkciArIDI7CisJY3NnZl9kZXN0ID0gZnNsX2NvbXAtPnZpcnRfYWRkciArIDM7CisJc2Rm ID0gZnNsX2NvbXAtPmRlc2NfdmlydF9hZGRyOworCWRkZiA9IGZzbF9jb21wLT5kZXNjX3ZpcnRf YWRkciArIDE7CisKKwltZW1zZXQoZnNsX2NvbXAtPnZpcnRfYWRkciwgMCwgRlNMX1FETUFfQ09N TUFORF9CVUZGRVJfU0laRSk7CisJbWVtc2V0KGZzbF9jb21wLT5kZXNjX3ZpcnRfYWRkciwgMCwg RlNMX1FETUFfREVTQ1JJUFRPUl9CVUZGRVJfU0laRSk7CisJLyogSGVhZCBDb21tYW5kIERlc2Ny aXB0b3IoRnJhbWUgRGVzY3JpcHRvcikgKi8KKwlxZG1hX2Rlc2NfYWRkcl9zZXQ2NChjY2RmLCBm c2xfY29tcC0+YnVzX2FkZHIgKyAxNik7CisJcWRtYV9jY2RmX3NldF9mb3JtYXQoY2NkZiwgcWRt YV9jY2RmX2dldF9vZmZzZXQoY2NkZikpOworCXFkbWFfY2NkZl9zZXRfc2VyKGNjZGYsIHFkbWFf Y2NkZl9nZXRfc3RhdHVzKGNjZGYpKTsKKwkvKiBTdGF0dXMgbm90aWZpY2F0aW9uIGlzIGVucXVl dWVkIHRvIHN0YXR1cyBxdWV1ZS4gKi8KKwkvKiBDb21wb3VuZCBDb21tYW5kIERlc2NyaXB0b3Io RnJhbWUgTGlzdCBUYWJsZSkgKi8KKwlxZG1hX2Rlc2NfYWRkcl9zZXQ2NChjc2dmX2Rlc2MsIGZz bF9jb21wLT5kZXNjX2J1c19hZGRyKTsKKwkvKiBJdCBtdXN0IGJlIDMyIGFzIENvbXBvdW5kIFMv RyBEZXNjcmlwdG9yICovCisJcWRtYV9jc2dmX3NldF9sZW4oY3NnZl9kZXNjLCAzMik7CisJcWRt YV9kZXNjX2FkZHJfc2V0NjQoY3NnZl9zcmMsIHNyYyk7CisJcWRtYV9jc2dmX3NldF9sZW4oY3Nn Zl9zcmMsIGxlbik7CisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY3NnZl9kZXN0LCBkc3QpOworCXFk bWFfY3NnZl9zZXRfbGVuKGNzZ2ZfZGVzdCwgbGVuKTsKKwkvKiBUaGlzIGVudHJ5IGlzIHRoZSBs YXN0IGVudHJ5LiAqLworCXFkbWFfY3NnZl9zZXRfZihjc2dmX2Rlc3QsIGxlbik7CisJLyogRGVz Y3JpcHRvciBCdWZmZXIgKi8KKwlzZGYtPmRhdGEgPQorCQljcHVfdG9fbGU2NChGU0xfUURNQV9D TURfUldUVFlQRSA8PAorCQkJICAgIEZTTF9RRE1BX0NNRF9SV1RUWVBFX09GRlNFVCk7CisJZGRm LT5kYXRhID0KKwkJY3B1X3RvX2xlNjQoRlNMX1FETUFfQ01EX1JXVFRZUEUgPDwKKwkJCSAgICBG U0xfUURNQV9DTURfUldUVFlQRV9PRkZTRVQpOworCWRkZi0+ZGF0YSB8PQorCQljcHVfdG9fbGU2 NChGU0xfUURNQV9DTURfTFdDIDw8IEZTTF9RRE1BX0NNRF9MV0NfT0ZGU0VUKTsKK30KKworLyoK KyAqIFByZS1yZXF1ZXN0IGZ1bGwgY29tbWFuZCBkZXNjcmlwdG9yIGZvciBlbnF1ZXVlLgorICov CitzdGF0aWMgaW50IGZzbF9xZG1hX3ByZV9yZXF1ZXN0X2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKnF1ZXVlKQoreworCWludCBpOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpj b21wX3RlbXAsICpfY29tcF90ZW1wOworCisJZm9yIChpID0gMDsgaSA8IHF1ZXVlLT5uX2NxICsg RlNMX0NPTU1BTkRfUVVFVUVfT1ZFUkZMTE9XOyBpKyspIHsKKwkJY29tcF90ZW1wID0ga3phbGxv YyhzaXplb2YoKmNvbXBfdGVtcCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbXBfdGVtcCkKKwkJ CWdvdG8gZXJyX2FsbG9jOworCQljb21wX3RlbXAtPnZpcnRfYWRkciA9CisJCQlkbWFfcG9vbF9h bGxvYyhxdWV1ZS0+Y29tcF9wb29sLCBHRlBfS0VSTkVMLAorCQkJCSAgICAgICAmY29tcF90ZW1w LT5idXNfYWRkcik7CisJCWlmICghY29tcF90ZW1wLT52aXJ0X2FkZHIpCisJCQlnb3RvIGVycl9k bWFfYWxsb2M7CisKKwkJY29tcF90ZW1wLT5kZXNjX3ZpcnRfYWRkciA9CisJCQlkbWFfcG9vbF9h bGxvYyhxdWV1ZS0+ZGVzY19wb29sLCBHRlBfS0VSTkVMLAorCQkJCSAgICAgICAmY29tcF90ZW1w LT5kZXNjX2J1c19hZGRyKTsKKwkJaWYgKCFjb21wX3RlbXAtPmRlc2NfdmlydF9hZGRyKQorCQkJ Z290byBlcnJfZGVzY19kbWFfYWxsb2M7CisKKwkJbGlzdF9hZGRfdGFpbCgmY29tcF90ZW1wLT5s aXN0LCAmcXVldWUtPmNvbXBfZnJlZSk7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9kZXNjX2Rt YV9hbGxvYzoKKwlkbWFfcG9vbF9mcmVlKHF1ZXVlLT5jb21wX3Bvb2wsIGNvbXBfdGVtcC0+dmly dF9hZGRyLAorCQkgICAgICBjb21wX3RlbXAtPmJ1c19hZGRyKTsKKworZXJyX2RtYV9hbGxvYzoK KwlrZnJlZShjb21wX3RlbXApOworCitlcnJfYWxsb2M6CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9z YWZlKGNvbXBfdGVtcCwgX2NvbXBfdGVtcCwKKwkJCQkgJnF1ZXVlLT5jb21wX2ZyZWUsIGxpc3Qp IHsKKwkJaWYgKGNvbXBfdGVtcC0+dmlydF9hZGRyKQorCQkJZG1hX3Bvb2xfZnJlZShxdWV1ZS0+ Y29tcF9wb29sLAorCQkJCSAgICAgIGNvbXBfdGVtcC0+dmlydF9hZGRyLAorCQkJCSAgICAgIGNv bXBfdGVtcC0+YnVzX2FkZHIpOworCQlpZiAoY29tcF90ZW1wLT5kZXNjX3ZpcnRfYWRkcikKKwkJ CWRtYV9wb29sX2ZyZWUocXVldWUtPmRlc2NfcG9vbCwKKwkJCQkgICAgICBjb21wX3RlbXAtPmRl c2NfdmlydF9hZGRyLAorCQkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY19idXNfYWRkcik7CisKKwkJ bGlzdF9kZWwoJmNvbXBfdGVtcC0+bGlzdCk7CisJCWtmcmVlKGNvbXBfdGVtcCk7CisJfQorCisJ cmV0dXJuIC1FTk9NRU07Cit9CisKKy8qCisgKiBSZXF1ZXN0IGEgY29tbWFuZCBkZXNjcmlwdG9y IGZvciBlbnF1ZXVlLgorICovCitzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2NvbXAKKypmc2xfcWRt YV9yZXF1ZXN0X2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4pCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqY29tcF90ZW1w OworCWludCB0aW1lb3V0ID0gRlNMX1FETUFfQ09NUF9USU1FT1VUOworCXN0cnVjdCBmc2xfcWRt YV9xdWV1ZSAqcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisKKwl3aGlsZSAodGltZW91dC0tKSB7 CisJCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQlpZiAo IWxpc3RfZW1wdHkoJnF1ZXVlLT5jb21wX2ZyZWUpKSB7CisJCQljb21wX3RlbXAgPSBsaXN0X2Zp cnN0X2VudHJ5KCZxdWV1ZS0+Y29tcF9mcmVlLAorCQkJCQkJICAgICBzdHJ1Y3QgZnNsX3FkbWFf Y29tcCwKKwkJCQkJCSAgICAgbGlzdCk7CisJCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0KTsK KworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsK KwkJCWNvbXBfdGVtcC0+cWNoYW4gPSBmc2xfY2hhbjsKKwkJCXJldHVybiBjb21wX3RlbXA7CisJ CX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsK KwkJdWRlbGF5KDEpOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGZz bF9xZG1hX3F1ZXVlCisqZnNsX3FkbWFfYWxsb2NfcXVldWVfcmVzb3VyY2VzKHN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEp Cit7CisJaW50IHJldCwgbGVuLCBpLCBqOworCWludCBxdWV1ZV9udW0sIGJsb2NrX251bWJlcjsK Kwl1bnNpZ25lZCBpbnQgcXVldWVfc2l6ZVtGU0xfUURNQV9RVUVVRV9NQVhdOworCXN0cnVjdCBm c2xfcWRtYV9xdWV1ZSAqcXVldWVfaGVhZCwgKnF1ZXVlX3RlbXA7CisKKwlxdWV1ZV9udW0gPSBm c2xfcWRtYS0+bl9xdWV1ZXM7CisJYmxvY2tfbnVtYmVyID0gZnNsX3FkbWEtPmJsb2NrX251bWJl cjsKKworCWlmIChxdWV1ZV9udW0gPiBGU0xfUURNQV9RVUVVRV9NQVgpCisJCXF1ZXVlX251bSA9 IEZTTF9RRE1BX1FVRVVFX01BWDsKKwlsZW4gPSBzaXplb2YoKnF1ZXVlX2hlYWQpICogcXVldWVf bnVtICogYmxvY2tfbnVtYmVyOworCXF1ZXVlX2hlYWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRl diwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXF1ZXVlX2hlYWQpCisJCXJldHVybiBOVUxMOwor CisJcmV0ID0gZGV2aWNlX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KCZwZGV2LT5kZXYsICJxdWV1 ZS1zaXplcyIsCisJCQkJCSAgICAgcXVldWVfc2l6ZSwgcXVldWVfbnVtKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxdWV1ZS1zaXplcy5cbiIpOworCQly ZXR1cm4gTlVMTDsKKwl9CisJZm9yIChqID0gMDsgaiA8IGJsb2NrX251bWJlcjsgaisrKSB7CisJ CWZvciAoaSA9IDA7IGkgPCBxdWV1ZV9udW07IGkrKykgeworCQkJaWYgKHF1ZXVlX3NpemVbaV0g PiBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYIHx8CisJCQkgICAgcXVldWVfc2l6ZVtp XSA8IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0laRV9NSU4pIHsKKwkJCQlkZXZfZXJyKCZwZGV2 LT5kZXYsCisJCQkJCSJHZXQgd3JvbmcgcXVldWUtc2l6ZXMuXG4iKTsKKwkJCQlyZXR1cm4gTlVM TDsKKwkJCX0KKwkJCXF1ZXVlX3RlbXAgPSBxdWV1ZV9oZWFkICsgaSArIChqICogcXVldWVfbnVt KTsKKworCQkJcXVldWVfdGVtcC0+Y3EgPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5k ZXYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSAqCisJCQkJCSAgIHF1 ZXVlX3NpemVbaV0sCisJCQkJCSAgICZxdWV1ZV90ZW1wLT5idXNfYWRkciwKKwkJCQkJICAgR0ZQ X0tFUk5FTCk7CisJCQlpZiAoIXF1ZXVlX3RlbXAtPmNxKQorCQkJCXJldHVybiBOVUxMOworCQkJ cXVldWVfdGVtcC0+YmxvY2tfYmFzZSA9IGZzbF9xZG1hLT5ibG9ja19iYXNlICsKKwkJCQlGU0xf UURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisJCQlxdWV1ZV90ZW1wLT5uX2Nx ID0gcXVldWVfc2l6ZVtpXTsKKwkJCXF1ZXVlX3RlbXAtPmlkID0gaTsKKwkJCXF1ZXVlX3RlbXAt PnZpcnRfaGVhZCA9IHF1ZXVlX3RlbXAtPmNxOworCQkJcXVldWVfdGVtcC0+dmlydF90YWlsID0g cXVldWVfdGVtcC0+Y3E7CisJCQkvKgorCQkJICogTGlzdCBmb3IgcXVldWUgY29tbWFuZCBidWZm ZXIKKwkJCSAqLworCQkJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlX3RlbXAtPmNvbXBfdXNlZCk7CisJ CQlzcGluX2xvY2tfaW5pdCgmcXVldWVfdGVtcC0+cXVldWVfbG9jayk7CisJCX0KKwl9CisJcmV0 dXJuIHF1ZXVlX2hlYWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfcXVldWUKKypmc2xf cWRtYV9wcmVwX3N0YXR1c19xdWV1ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQorewor CWludCByZXQ7CisJdW5zaWduZWQgaW50IHN0YXR1c19zaXplOworCXN0cnVjdCBmc2xfcWRtYV9x dWV1ZSAqc3RhdHVzX2hlYWQ7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5v Zl9ub2RlOworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzdGF0dXMtc2l6ZXMi LCAmc3RhdHVzX3NpemUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fu J3QgZ2V0IHN0YXR1cy1zaXplcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHN0YXR1 c19zaXplID4gRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01BWCB8fAorCSAgICBzdGF0dXNf c2l6ZSA8IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0laRV9NSU4pIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiR2V0IHdyb25nIHN0YXR1c19zaXplLlxuIik7CisJCXJldHVybiBOVUxMOworCX0K KwlzdGF0dXNfaGVhZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LAorCQkJCSAgIHNpemVvZigq c3RhdHVzX2hlYWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXR1c19oZWFkKQorCQlyZXR1cm4g TlVMTDsKKworCS8qCisJICogQnVmZmVyIGZvciBxdWV1ZSBjb21tYW5kCisJICovCisJc3RhdHVz X2hlYWQtPmNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJCSAgICAgc2l6 ZW9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoKKwkJCQkJICAgICBzdGF0dXNfc2l6ZSwKKwkJ CQkJICAgICAmc3RhdHVzX2hlYWQtPmJ1c19hZGRyLAorCQkJCQkgICAgIEdGUF9LRVJORUwpOwor CWlmICghc3RhdHVzX2hlYWQtPmNxKSB7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgc3RhdHVz X2hlYWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJc3RhdHVzX2hlYWQtPm5fY3EgPSBzdGF0dXNf c2l6ZTsKKwlzdGF0dXNfaGVhZC0+dmlydF9oZWFkID0gc3RhdHVzX2hlYWQtPmNxOworCXN0YXR1 c19oZWFkLT52aXJ0X3RhaWwgPSBzdGF0dXNfaGVhZC0+Y3E7CisJc3RhdHVzX2hlYWQtPmNvbXBf cG9vbCA9IE5VTEw7CisKKwlyZXR1cm4gc3RhdHVzX2hlYWQ7Cit9CisKK3N0YXRpYyBpbnQgZnNs X3FkbWFfaGFsdChzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwl1MzIgcmVn OworCWludCBpLCBqLCBjb3VudCA9IEZTTF9RRE1BX0hBTFRfQ09VTlQ7CisJdm9pZCBfX2lvbWVt ICpibG9jaywgKmN0cmwgPSBmc2xfcWRtYS0+Y3RybF9iYXNlOworCisJLyogRGlzYWJsZSB0aGUg Y29tbWFuZCBxdWV1ZSBhbmQgd2FpdCBmb3IgaWRsZSBzdGF0ZS4gKi8KKwlyZWcgPSBxZG1hX3Jl YWRsKGZzbF9xZG1hLCBjdHJsICsgRlNMX1FETUFfRE1SKTsKKwlyZWcgfD0gRlNMX1FETUFfRE1S X0RRRDsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNMX1FETUFfRE1SKTsK Kwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJsb2NrX251bWJlcjsgaisrKSB7CisJCWJsb2Nr ID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJRlNMX1FETUFfQkxPQ0tfQkFTRV9PRkZTRVQo ZnNsX3FkbWEsIGopOworCQlmb3IgKGkgPSAwOyBpIDwgRlNMX1FETUFfUVVFVUVfTlVNX01BWDsg aSsrKQorCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQkNRTVIo aSkpOworCX0KKwl3aGlsZSAoMSkgeworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBjdHJs ICsgRlNMX1FETUFfRFNSKTsKKwkJaWYgKCEocmVnICYgRlNMX1FETUFfRFNSX0RCKSkKKwkJCWJy ZWFrOworCQlpZiAoY291bnQtLSA8IDApCisJCQlyZXR1cm4gLUVCVVNZOworCQl1ZGVsYXkoMTAw KTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJsb2NrX251bWJlcjsgaisrKSB7 CisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJRlNMX1FETUFfQkxPQ0tfQkFT RV9PRkZTRVQoZnNsX3FkbWEsIGopOworCisJCS8qIERpc2FibGUgc3RhdHVzIHF1ZXVlLiAqLwor CQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgMCwgYmxvY2sgKyBGU0xfUURNQV9CU1FNUik7CisKKwkJ LyoKKwkJICogY2xlYXIgdGhlIGNvbW1hbmQgcXVldWUgaW50ZXJydXB0IGRldGVjdCByZWdpc3Rl ciBmb3IKKwkJICogYWxsIHF1ZXVlcy4KKwkJICovCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBG U0xfUURNQV9CQ1FJRFJfQ0xFQVIsCisJCQkgICAgYmxvY2sgKyBGU0xfUURNQV9CQ1FJRFIoMCkp OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citmc2xfcWRtYV9xdWV1ZV90cmFu c2Zlcl9jb21wbGV0ZShzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSwKKwkJCQkgdm9p ZCAqYmxvY2ssCisJCQkJIGludCBpZCkKK3sKKwlib29sIGR1cGxpY2F0ZTsKKwl1MzIgcmVnLCBp LCBjb3VudDsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnRlbXBfcXVldWU7CisJc3RydWN0IGZz bF9xZG1hX2Zvcm1hdCAqc3RhdHVzX2FkZHI7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9j b21wID0gTlVMTDsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9xZG1h LT5xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9zdGF0dXMgPSBmc2xfcWRtYS0+ c3RhdHVzW2lkXTsKKworCWNvdW50ID0gRlNMX1FETUFfTUFYX1NJWkU7CisKKwl3aGlsZSAoY291 bnQtLSkgeworCQlkdXBsaWNhdGUgPSAwOworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBi bG9jayArIEZTTF9RRE1BX0JTUVNSKTsKKwkJaWYgKHJlZyAmIEZTTF9RRE1BX0JTUVNSX1FFKQor CQkJcmV0dXJuIDA7CisKKwkJc3RhdHVzX2FkZHIgPSBmc2xfc3RhdHVzLT52aXJ0X2hlYWQ7CisK KwkJaWYgKHFkbWFfY2NkZl9nZXRfcXVldWUoc3RhdHVzX2FkZHIpID09CisJCSAgIF9fdGhpc19j cHVfcmVhZChwcmUucXVldWUpICYmCisJCQlxZG1hX2NjZGZfYWRkcl9nZXQ2NChzdGF0dXNfYWRk cikgPT0KKwkJCV9fdGhpc19jcHVfcmVhZChwcmUuYWRkcikpCisJCQlkdXBsaWNhdGUgPSAxOwor CQlpID0gcWRtYV9jY2RmX2dldF9xdWV1ZShzdGF0dXNfYWRkcikgKworCQkJaWQgKiBmc2xfcWRt YS0+bl9xdWV1ZXM7CisJCV9fdGhpc19jcHVfd3JpdGUocHJlLmFkZHIsIHFkbWFfY2NkZl9hZGRy X2dldDY0KHN0YXR1c19hZGRyKSk7CisJCV9fdGhpc19jcHVfd3JpdGUocHJlLnF1ZXVlLCBxZG1h X2NjZGZfZ2V0X3F1ZXVlKHN0YXR1c19hZGRyKSk7CisJCXRlbXBfcXVldWUgPSBmc2xfcXVldWUg KyBpOworCisJCXNwaW5fbG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCWlmIChsaXN0 X2VtcHR5KCZ0ZW1wX3F1ZXVlLT5jb21wX3VzZWQpKSB7CisJCQlpZiAoIWR1cGxpY2F0ZSkgewor CQkJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJCQlyZXR1cm4gLUVB R0FJTjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZzbF9jb21wID0gbGlzdF9maXJzdF9lbnRyeSgm dGVtcF9xdWV1ZS0+Y29tcF91c2VkLAorCQkJCQkJICAgIHN0cnVjdCBmc2xfcWRtYV9jb21wLCBs aXN0KTsKKwkJCWlmIChmc2xfY29tcC0+YnVzX2FkZHIgKyAxNiAhPQorCQkJCV9fdGhpc19jcHVf cmVhZChwcmUuYWRkcikpIHsKKwkJCQlpZiAoIWR1cGxpY2F0ZSkgeworCQkJCQlzcGluX3VubG9j aygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCQkJCXJldHVybiAtRUFHQUlOOworCQkJCX0K KwkJCX0KKwkJfQorCisJCWlmIChkdXBsaWNhdGUpIHsKKwkJCXJlZyA9IHFkbWFfcmVhZGwoZnNs X3FkbWEsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQkJcmVnIHw9IEZTTF9RRE1BX0JTUU1S X0RJOworCQkJcWRtYV9kZXNjX2FkZHJfc2V0NjQoc3RhdHVzX2FkZHIsIDB4MCk7CisJCQlmc2xf c3RhdHVzLT52aXJ0X2hlYWQrKzsKKwkJCWlmIChmc2xfc3RhdHVzLT52aXJ0X2hlYWQgPT0gZnNs X3N0YXR1cy0+Y3EKKwkJCQkJCSAgICsgZnNsX3N0YXR1cy0+bl9jcSkKKwkJCQlmc2xfc3RhdHVz LT52aXJ0X2hlYWQgPSBmc2xfc3RhdHVzLT5jcTsKKwkJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBy ZWcsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQkJc3Bpbl91bmxvY2soJnRlbXBfcXVldWUt PnF1ZXVlX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJbGlzdF9kZWwoJmZzbF9jb21wLT5s aXN0KTsKKworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBibG9jayArIEZTTF9RRE1BX0JT UU1SKTsKKwkJcmVnIHw9IEZTTF9RRE1BX0JTUU1SX0RJOworCQlxZG1hX2Rlc2NfYWRkcl9zZXQ2 NChzdGF0dXNfYWRkciwgMHgwKTsKKwkJZnNsX3N0YXR1cy0+dmlydF9oZWFkKys7CisJCWlmIChm c2xfc3RhdHVzLT52aXJ0X2hlYWQgPT0gZnNsX3N0YXR1cy0+Y3EgKyBmc2xfc3RhdHVzLT5uX2Nx KQorCQkJZnNsX3N0YXR1cy0+dmlydF9oZWFkID0gZnNsX3N0YXR1cy0+Y3E7CisJCXFkbWFfd3Jp dGVsKGZzbF9xZG1hLCByZWcsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQlzcGluX3VubG9j aygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisKKwkJc3Bpbl9sb2NrKCZmc2xfY29tcC0+cWNo YW4tPnZjaGFuLmxvY2spOworCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmZzbF9jb21wLT52ZGVz Yyk7CisJCWZzbF9jb21wLT5xY2hhbi0+c3RhdHVzID0gRE1BX0NPTVBMRVRFOworCQlzcGluX3Vu bG9jaygmZnNsX2NvbXAtPnFjaGFuLT52Y2hhbi5sb2NrKTsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGlycXJldHVybl90IGZzbF9xZG1hX2Vycm9yX2hhbmRsZXIoaW50IGlycSwgdm9p ZCAqZGV2X2lkKQoreworCXVuc2lnbmVkIGludCBpbnRyOworCXN0cnVjdCBmc2xfcWRtYV9lbmdp bmUgKmZzbF9xZG1hID0gZGV2X2lkOworCXZvaWQgX19pb21lbSAqc3RhdHVzID0gZnNsX3FkbWEt PnN0YXR1c19iYXNlOworCisJaW50ciA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIHN0YXR1cyArIEZT TF9RRE1BX0RFRFIpOworCisJaWYgKGludHIpIHsKKwkJZGV2X2Vycihmc2xfcWRtYS0+ZG1hX2Rl di5kZXYsICJETUEgdHJhbnNhY3Rpb24gZXJyb3IhXG4iKTsKKwkJcmV0dXJuIElSUV9OT05FOwor CX0KKworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9ERURSX0NMRUFSLCBzdGF0dXMg KyBGU0xfUURNQV9ERURSKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFy ZXR1cm5fdCBmc2xfcWRtYV9xdWV1ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sK KwlpbnQgaWQ7CisJdW5zaWduZWQgaW50IGludHIsIHJlZzsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5n aW5lICpmc2xfcWRtYSA9IGRldl9pZDsKKwl2b2lkIF9faW9tZW0gKmJsb2NrLCAqY3RybCA9IGZz bF9xZG1hLT5jdHJsX2Jhc2U7CisKKwlpZCA9IGlycSAtIGZzbF9xZG1hLT5pcnFfYmFzZTsKKwlp ZiAoaWQgPCAwICYmIGlkID4gZnNsX3FkbWEtPmJsb2NrX251bWJlcikgeworCQlkZXZfZXJyKGZz bF9xZG1hLT5kbWFfZGV2LmRldiwKKwkJCSJpcnEgJWQgaXMgd3JvbmcgaXJxX2Jhc2UgaXMgJWRc biIsCisJCQlpcnEsIGZzbF9xZG1hLT5pcnFfYmFzZSk7CisJfQorCisJYmxvY2sgPSBmc2xfcWRt YS0+YmxvY2tfYmFzZSArCisJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9xZG1hLCBp ZCk7CisKKwlpbnRyID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CQ1FJ RFIoMCkpOworCisJaWYgKChpbnRyICYgRlNMX1FETUFfQ1FJRFJfU1FUKSAhPSAwKQorCQlpbnRy ID0gZnNsX3FkbWFfcXVldWVfdHJhbnNmZXJfY29tcGxldGUoZnNsX3FkbWEsIGJsb2NrLCBpZCk7 CisKKwlpZiAoaW50ciAhPSAwKSB7CisJCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwg KyBGU0xfUURNQV9ETVIpOworCQlyZWcgfD0gRlNMX1FETUFfRE1SX0RRRDsKKwkJcWRtYV93cml0 ZWwoZnNsX3FkbWEsIHJlZywgY3RybCArIEZTTF9RRE1BX0RNUik7CisJCXFkbWFfd3JpdGVsKGZz bF9xZG1hLCAwLCBibG9jayArIEZTTF9RRE1BX0JDUUlFUigwKSk7CisJCWRldl9lcnIoZnNsX3Fk bWEtPmRtYV9kZXYuZGV2LCAiUURNQTogc3RhdHVzIGVyciFcbiIpOworCX0KKworCS8qIENsZWFy IGFsbCBkZXRlY3RlZCBldmVudHMgYW5kIGludGVycnVwdHMuICovCisJcWRtYV93cml0ZWwoZnNs X3FkbWEsIEZTTF9RRE1BX0JDUUlEUl9DTEVBUiwKKwkJICAgIGJsb2NrICsgRlNMX1FETUFfQkNR SURSKDApKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorZnNsX3Fk bWFfaXJxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICBzdHJ1Y3QgZnNs X3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgaTsKKwlpbnQgY3B1OworCWludCByZXQ7 CisJY2hhciBpcnFfbmFtZVsyMF07CisKKwlmc2xfcWRtYS0+ZXJyb3JfaXJxID0KKwkJcGxhdGZv cm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInFkbWEtZXJyb3IiKTsKKwlpZiAoZnNsX3FkbWEtPmVy cm9yX2lycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHFkbWEgY29u dHJvbGxlciBpcnEuXG4iKTsKKwkJcmV0dXJuIGZzbF9xZG1hLT5lcnJvcl9pcnE7CisJfQorCisJ cmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+ZXJyb3JfaXJxLAor CQkJICAgICAgIGZzbF9xZG1hX2Vycm9yX2hhbmRsZXIsIDAsCisJCQkgICAgICAgInFETUEgZXJy b3IiLCBmc2xfcWRtYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4n dCByZWdpc3RlciBxRE1BIGNvbnRyb2xsZXIgSVJRLlxuIik7CisJCXJldHVybiAgcmV0OworCX0K KworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBpKyspIHsKKwkJc3By aW50ZihpcnFfbmFtZSwgInFkbWEtcXVldWUlZCIsIGkpOworCQlmc2xfcWRtYS0+cXVldWVfaXJx W2ldID0KKwkJCQlwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCBpcnFfbmFtZSk7CisKKwkJ aWYgKGZzbF9xZG1hLT5xdWV1ZV9pcnFbaV0gPCAwKSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYs CisJCQkJIkNhbid0IGdldCBxZG1hIHF1ZXVlICVkIGlycS5cbiIsIGkpOworCQkJcmV0dXJuIGZz bF9xZG1hLT5xdWV1ZV9pcnFbaV07CisJCX0KKworCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZw ZGV2LT5kZXYsCisJCQkJICAgICAgIGZzbF9xZG1hLT5xdWV1ZV9pcnFbaV0sCisJCQkJICAgICAg IGZzbF9xZG1hX3F1ZXVlX2hhbmRsZXIsCisJCQkJICAgICAgIDAsCisJCQkJICAgICAgICJxRE1B IHF1ZXVlIiwKKwkJCQkgICAgICAgZnNsX3FkbWEpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJy KCZwZGV2LT5kZXYsCisJCQkJIkNhbid0IHJlZ2lzdGVyIHFETUEgcXVldWUgSVJRLlxuIik7CisJ CQlyZXR1cm4gIHJldDsKKwkJfQorCisJCWNwdSA9IGkgJSBudW1fb25saW5lX2NwdXMoKTsKKwkJ cmV0ID0gaXJxX3NldF9hZmZpbml0eV9oaW50KGZzbF9xZG1hLT5xdWV1ZV9pcnFbaV0sCisJCQkJ CSAgICBnZXRfY3B1X21hc2soY3B1KSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYt PmRldiwKKwkJCQkiQ2FuJ3Qgc2V0IGNwdSAlZCBhZmZpbml0eSB0byBJUlEgJWQuXG4iLAorCQkJ CWNwdSwKKwkJCQlmc2xfcWRtYS0+cXVldWVfaXJxW2ldKTsKKwkJCXJldHVybiAgcmV0OworCQl9 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2lycV9leGl0KHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgICAgICBzdHJ1Y3QgZnNsX3FkbWFfZW5n aW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgaTsKKworCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwg ZnNsX3FkbWEtPmVycm9yX2lycSwgZnNsX3FkbWEpOworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRt YS0+YmxvY2tfbnVtYmVyOyBpKyspCisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgZnNsX3Fk bWEtPnF1ZXVlX2lycVtpXSwgZnNsX3FkbWEpOworfQorCitzdGF0aWMgaW50IGZzbF9xZG1hX3Jl Z19pbml0KHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQoreworCXUzMiByZWc7CisJ aW50IGksIGosIHJldDsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnRlbXA7CisJdm9pZCBfX2lv bWVtICpzdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpibG9j aywgKmN0cmwgPSBmc2xfcWRtYS0+Y3RybF9iYXNlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAq ZnNsX3F1ZXVlID0gZnNsX3FkbWEtPnF1ZXVlOworCisJLyogVHJ5IHRvIGhhbHQgdGhlIHFETUEg ZW5naW5lIGZpcnN0LiAqLworCXJldCA9IGZzbF9xZG1hX2hhbHQoZnNsX3FkbWEpOworCWlmIChy ZXQpIHsKKwkJZGV2X2Vycihmc2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJETUEgaGFsdCBmYWlsZWQh Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5ibG9j a19udW1iZXI7IGkrKykgeworCQkvKgorCQkgKiBDbGVhciB0aGUgY29tbWFuZCBxdWV1ZSBpbnRl cnJ1cHQgZGV0ZWN0IHJlZ2lzdGVyIGZvcgorCQkgKiBhbGwgcXVldWVzLgorCQkgKi8KKworCQli bG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlICsKKwkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZG U0VUKGZzbF9xZG1hLCBpKTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0JDUUlE Ul9DTEVBUiwKKwkJCSAgICBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisJfQorCisJZm9y IChqID0gMDsgaiA8IGZzbF9xZG1hLT5ibG9ja19udW1iZXI7IGorKykgeworCQlibG9jayA9IGZz bF9xZG1hLT5ibG9ja19iYXNlICsKKwkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9x ZG1hLCBqKTsKKwkJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5uX3F1ZXVlczsgaSsrKSB7CisJ CQl0ZW1wID0gZnNsX3F1ZXVlICsgaSArIChqICogZnNsX3FkbWEtPm5fcXVldWVzKTsKKwkJCS8q CisJCQkgKiBJbml0aWFsaXplIENvbW1hbmQgUXVldWUgcmVnaXN0ZXJzIHRvCisJCQkgKiBwb2lu dCB0byB0aGUgZmlyc3QKKwkJCSAqIGNvbW1hbmQgZGVzY3JpcHRvciBpbiBtZW1vcnkuCisJCQkg KiBEZXF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJCSAqIEVucXVldWUgUG9pbnRl ciBBZGRyZXNzIFJlZ2lzdGVycworCQkJICovCisKKwkJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCB0 ZW1wLT5idXNfYWRkciwKKwkJCQkgICAgYmxvY2sgKyBGU0xfUURNQV9CQ1FEUEFfU0FERFIoaSkp OworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHRlbXAtPmJ1c19hZGRyLAorCQkJCSAgICBibG9j ayArIEZTTF9RRE1BX0JDUUVQQV9TQUREUihpKSk7CisKKwkJCS8qIEluaXRpYWxpemUgdGhlIHF1 ZXVlIG1vZGUuICovCisJCQlyZWcgPSBGU0xfUURNQV9CQ1FNUl9FTjsKKwkJCXJlZyB8PSBGU0xf UURNQV9CQ1FNUl9DRF9USExEKGlsb2cyKHRlbXAtPm5fY3EpIC0gNCk7CisJCQlyZWcgfD0gRlNM X1FETUFfQkNRTVJfQ1FfU0laRShpbG9nMih0ZW1wLT5uX2NxKSAtIDYpOworCQkJcWRtYV93cml0 ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihpKSk7CisJCX0KKworCQkv KgorCQkgKiBXb3JrYXJvdW5kIGZvciBlcnJhdHVtOiBFUlIwMTA4MTIuCisJCSAqIFdlIG11c3Qg ZW5hYmxlIFhPRkYgdG8gYXZvaWQgdGhlIGVucXVldWUgcmVqZWN0aW9uIG9jY3Vycy4KKwkJICog U2V0dGluZyBTUUNDTVIgRU5URVJfV00gdG8gMHgyMC4KKwkJICovCisKKwkJcWRtYV93cml0ZWwo ZnNsX3FkbWEsIEZTTF9RRE1BX1NRQ0NNUl9FTlRFUl9XTSwKKwkJCSAgICBibG9jayArIEZTTF9R RE1BX1NRQ0NNUik7CisKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBzdGF0dXMgcXVldWUgcmVnaXN0 ZXJzIHRvIHBvaW50IHRvIHRoZSBmaXJzdAorCQkgKiBjb21tYW5kIGRlc2NyaXB0b3IgaW4gbWVt b3J5LgorCQkgKiBEZXF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJICogRW5xdWV1 ZSBQb2ludGVyIEFkZHJlc3MgUmVnaXN0ZXJzCisJCSAqLworCisJCXFkbWFfd3JpdGVsKGZzbF9x ZG1hLCBmc2xfcWRtYS0+c3RhdHVzW2pdLT5idXNfYWRkciwKKwkJCSAgICBibG9jayArIEZTTF9R RE1BX1NRRVBBUik7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBmc2xfcWRtYS0+c3RhdHVzW2pd LT5idXNfYWRkciwKKwkJCSAgICBibG9jayArIEZTTF9RRE1BX1NRRFBBUik7CisJCS8qIEluaXRp YWxpemUgc3RhdHVzIHF1ZXVlIGludGVycnVwdC4gKi8KKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEs IEZTTF9RRE1BX0JDUUlFUl9DUVRJRSwKKwkJCSAgICBibG9jayArIEZTTF9RRE1BX0JDUUlFUigw KSk7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9CU1FJQ1JfSUNFTiB8CisJCQkJ ICAgRlNMX1FETUFfQlNRSUNSX0lDU1QoNSkgfCAweDgwMDAsCisJCQkJICAgYmxvY2sgKyBGU0xf UURNQV9CU1FJQ1IpOworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQ1FJRVJfTUVJ RSB8CisJCQkJICAgRlNMX1FETUFfQ1FJRVJfVEVJRSwKKwkJCQkgICBibG9jayArIEZTTF9RRE1B X0NRSUVSKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBzdGF0dXMgcXVldWUgbW9kZS4gKi8KKwkJ cmVnID0gRlNMX1FETUFfQlNRTVJfRU47CisJCXJlZyB8PSBGU0xfUURNQV9CU1FNUl9DUV9TSVpF KGlsb2cyCisJCQkoZnNsX3FkbWEtPnN0YXR1c1tqXS0+bl9jcSkgLSA2KTsKKworCQlxZG1hX3dy aXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJcmVnID0gcWRt YV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CU1FNUik7CisJfQorCisJLyogSW5p dGlhbGl6ZSBjb250cm9sbGVyIGludGVycnVwdCByZWdpc3Rlci4gKi8KKwlxZG1hX3dyaXRlbChm c2xfcWRtYSwgRlNMX1FETUFfREVEUl9DTEVBUiwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisJ cWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0RFSUVSX0NMRUFSLCBzdGF0dXMgKyBGU0xf UURNQV9ERUlFUik7CisKKwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBjdHJsICsgRlNMX1FE TUFfRE1SKTsKKwlyZWcgJj0gfkZTTF9RRE1BX0RNUl9EUUQ7CisJcWRtYV93cml0ZWwoZnNsX3Fk bWEsIHJlZywgY3RybCArIEZTTF9RRE1BX0RNUik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCitmc2xfcWRtYV9wcmVwX21lbWNweShz dHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZHN0LAorCQkgICAgIGRtYV9hZGRyX3Qg c3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBmc2xfcWRt YV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19m c2xfcWRtYV9jaGFuKGNoYW4pOworCisJZnNsX2NvbXAgPSBmc2xfcWRtYV9yZXF1ZXN0X2VucXVl dWVfZGVzYyhmc2xfY2hhbik7CisKKwlpZiAoIWZzbF9jb21wKQorCQlyZXR1cm4gTlVMTDsKKwor CWZzbF9xZG1hX2NvbXBfZmlsbF9tZW1jcHkoZnNsX2NvbXAsIGRzdCwgc3JjLCBsZW4pOworCisJ cmV0dXJuIHZjaGFuX3R4X3ByZXAoJmZzbF9jaGFuLT52Y2hhbiwgJmZzbF9jb21wLT52ZGVzYywg ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9lbnF1ZXVlX2Rlc2Moc3RydWN0IGZz bF9xZG1hX2NoYW4gKmZzbF9jaGFuKQoreworCXUzMiByZWc7CisJc3RydWN0IHZpcnRfZG1hX2Rl c2MgKnZkZXNjOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9jaGFuLT5xdWV1ZTsKKwl2b2lkIF9faW9tZW0g KmJsb2NrID0gZnNsX3F1ZXVlLT5ibG9ja19iYXNlOworCisJcmVnID0gcWRtYV9yZWFkbChmc2xf Y2hhbi0+cWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CQ1FTUihmc2xfcXVldWUtPmlkKSk7CisJaWYg KHJlZyAmIChGU0xfUURNQV9CQ1FTUl9RRiB8IEZTTF9RRE1BX0JDUVNSX1hPRkYpKQorCQlyZXR1 cm47CisJdmRlc2MgPSB2Y2hhbl9uZXh0X2Rlc2MoJmZzbF9jaGFuLT52Y2hhbik7CisJaWYgKCF2 ZGVzYykKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZ2ZGVzYy0+bm9kZSk7CisJZnNsX2NvbXAgPSB0 b19mc2xfcWRtYV9jb21wKHZkZXNjKTsKKworCW1lbWNweShmc2xfcXVldWUtPnZpcnRfaGVhZCsr LAorCSAgICAgICBmc2xfY29tcC0+dmlydF9hZGRyLCBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zv cm1hdCkpOworCWlmIChmc2xfcXVldWUtPnZpcnRfaGVhZCA9PSBmc2xfcXVldWUtPmNxICsgZnNs X3F1ZXVlLT5uX2NxKQorCQlmc2xfcXVldWUtPnZpcnRfaGVhZCA9IGZzbF9xdWV1ZS0+Y3E7CisK KwlsaXN0X2FkZF90YWlsKCZmc2xfY29tcC0+bGlzdCwgJmZzbF9xdWV1ZS0+Y29tcF91c2VkKTsK KwliYXJyaWVyKCk7CisJcmVnID0gcWRtYV9yZWFkbChmc2xfY2hhbi0+cWRtYSwgYmxvY2sgKyBG U0xfUURNQV9CQ1FNUihmc2xfcXVldWUtPmlkKSk7CisJcmVnIHw9IEZTTF9RRE1BX0JDUU1SX0VJ OworCXFkbWFfd3JpdGVsKGZzbF9jaGFuLT5xZG1hLCByZWcsIGJsb2NrICsgRlNMX1FETUFfQkNR TVIoZnNsX3F1ZXVlLT5pZCkpOworCWZzbF9jaGFuLT5zdGF0dXMgPSBETUFfSU5fUFJPR1JFU1M7 Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2ZyZWVfZGVzYyhzdHJ1Y3QgdmlydF9kbWFfZGVz YyAqdmRlc2MpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29t cCAqZnNsX2NvbXA7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWU7CisKKwlmc2xf Y29tcCA9IHRvX2ZzbF9xZG1hX2NvbXAodmRlc2MpOworCWZzbF9xdWV1ZSA9IGZzbF9jb21wLT5x Y2hhbi0+cXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2Nr LCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZnNsX2NvbXAtPmxpc3QsICZmc2xfcXVldWUtPmNv bXBfZnJlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2Nr LCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0 IGRtYV9jaGFuICpjaGFuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZzbF9x ZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9jaGFuLT5xdWV1ZTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2soJmZzbF9j aGFuLT52Y2hhbi5sb2NrKTsKKwlpZiAodmNoYW5faXNzdWVfcGVuZGluZygmZnNsX2NoYW4tPnZj aGFuKSkKKwkJZnNsX3FkbWFfZW5xdWV1ZV9kZXNjKGZzbF9jaGFuKTsKKwlzcGluX3VubG9jaygm ZnNsX2NoYW4tPnZjaGFuLmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9xdWV1 ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9zeW5jaHJv bml6ZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZz bF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKworCXZjaGFuX3N5bmNocm9uaXplKCZm c2xfY2hhbi0+dmNoYW4pOworfQorCitzdGF0aWMgaW50IGZzbF9xZG1hX3Rlcm1pbmF0ZV9hbGwo c3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCUxJU1RfSEVBRChoZWFkKTsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1h X2NoYW4oY2hhbik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnNsX2NoYW4tPnZjaGFuLmxvY2ss IGZsYWdzKTsKKwl2Y2hhbl9nZXRfYWxsX2Rlc2NyaXB0b3JzKCZmc2xfY2hhbi0+dmNoYW4sICZo ZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc2xfY2hhbi0+dmNoYW4ubG9jaywgZmxh Z3MpOworCXZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdCgmZnNsX2NoYW4tPnZjaGFuLCAmaGVhZCk7 CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfYWxsb2NfY2hhbl9yZXNvdXJj ZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCWludCByZXQ7CisJc3RydWN0IGZzbF9xZG1h X2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNsX3Fk bWFfZW5naW5lICpmc2xfcWRtYSA9IGZzbF9jaGFuLT5xZG1hOworCXN0cnVjdCBmc2xfcWRtYV9x dWV1ZSAqZnNsX3F1ZXVlID0gZnNsX2NoYW4tPnF1ZXVlOworCisJaWYgKGZzbF9xdWV1ZS0+Y29t cF9wb29sICYmIGZzbF9xdWV1ZS0+ZGVzY19wb29sKQorCQlyZXR1cm4gZnNsX3FkbWEtPmRlc2Nf YWxsb2NhdGVkOworCisJSU5JVF9MSVNUX0hFQUQoJmZzbF9xdWV1ZS0+Y29tcF9mcmVlKTsKKwor CS8qCisJICogVGhlIGRtYSBwb29sIGZvciBxdWV1ZSBjb21tYW5kIGJ1ZmZlcgorCSAqLworCWZz bF9xdWV1ZS0+Y29tcF9wb29sID0KKwlkbWFfcG9vbF9jcmVhdGUoImNvbXBfcG9vbCIsCisJCQlj aGFuLT5kZXZpY2UtPmRldiwKKwkJCUZTTF9RRE1BX0NPTU1BTkRfQlVGRkVSX1NJWkUsCisJCQk2 NCwgMCk7CisJaWYgKCFmc2xfcXVldWUtPmNvbXBfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisK KwkvKgorCSAqIFRoZSBkbWEgcG9vbCBmb3IgRGVzY3JpcHRvcihTRC9ERCkgYnVmZmVyCisJICov CisJZnNsX3F1ZXVlLT5kZXNjX3Bvb2wgPQorCWRtYV9wb29sX2NyZWF0ZSgiZGVzY19wb29sIiwK KwkJCWNoYW4tPmRldmljZS0+ZGV2LAorCQkJRlNMX1FETUFfREVTQ1JJUFRPUl9CVUZGRVJfU0la RSwKKwkJCTMyLCAwKTsKKwlpZiAoIWZzbF9xdWV1ZS0+ZGVzY19wb29sKQorCQlnb3RvIGVycl9k ZXNjX3Bvb2w7CisKKwlyZXQgPSBmc2xfcWRtYV9wcmVfcmVxdWVzdF9lbnF1ZXVlX2Rlc2MoZnNs X3F1ZXVlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQki ZmFpbGVkIHRvIGFsbG9jIGRtYSBidWZmZXIgZm9yIFMvRyBkZXNjcmlwdG9yXG4iKTsKKwkJZ290 byBlcnJfbWVtOworCX0KKworCWZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZCsrOworCXJldHVybiBm c2xfcWRtYS0+ZGVzY19hbGxvY2F0ZWQ7CisKK2Vycl9tZW06CisJZG1hX3Bvb2xfZGVzdHJveShm c2xfcXVldWUtPmRlc2NfcG9vbCk7CitlcnJfZGVzY19wb29sOgorCWRtYV9wb29sX2Rlc3Ryb3ko ZnNsX3F1ZXVlLT5jb21wX3Bvb2wpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50 IGZzbF9xZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJl dCwgaTsKKwlpbnQgYmxrX251bSwgYmxrX29mZjsKKwl1MzIgbGVuLCBjaGFucywgcXVldWVzOwor CXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbjsK KwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYTsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUg Km5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihu cCwgImRtYS1jaGFubmVscyIsICZjaGFucyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJDYW4ndCBnZXQgZG1hLWNoYW5uZWxzLlxuIik7CisJCXJldHVybiByZXQ7CisJfQor CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJibG9jay1vZmZzZXQiLCAmYmxrX29m Zik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgYmxvY2st b2Zmc2V0LlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVh ZF91MzIobnAsICJibG9jay1udW1iZXIiLCAmYmxrX251bSk7CisJaWYgKHJldCkgeworCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgYmxvY2stbnVtYmVyLlxuIik7CisJCXJldHVybiBy ZXQ7CisJfQorCisJYmxrX251bSA9IG1pbl90KGludCwgYmxrX251bSwgbnVtX29ubGluZV9jcHVz KCkpOworCisJbGVuID0gc2l6ZW9mKCpmc2xfcWRtYSk7CisJZnNsX3FkbWEgPSBkZXZtX2t6YWxs b2MoJnBkZXYtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzbF9xZG1hKQorCQlyZXR1 cm4gLUVOT01FTTsKKworCWxlbiA9IHNpemVvZigqZnNsX2NoYW4pICogY2hhbnM7CisJZnNsX3Fk bWEtPmNoYW5zID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJ aWYgKCFmc2xfcWRtYS0+Y2hhbnMpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gc2l6ZW9m KHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqKSAqIGJsa19udW07CisJZnNsX3FkbWEtPnN0YXR1cyA9 IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghZnNsX3Fk bWEtPnN0YXR1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsZW4gPSBzaXplb2YoaW50KSAqIGJs a19udW07CisJZnNsX3FkbWEtPnF1ZXVlX2lycSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBs ZW4sIEdGUF9LRVJORUwpOworCWlmICghZnNsX3FkbWEtPnF1ZXVlX2lycSkKKwkJcmV0dXJuIC1F Tk9NRU07CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxkbWEtcXVldWVz IiwgJnF1ZXVlcyk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBn ZXQgcXVldWVzLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJZnNsX3FkbWEtPmRlc2NfYWxs b2NhdGVkID0gMDsKKwlmc2xfcWRtYS0+bl9jaGFucyA9IGNoYW5zOworCWZzbF9xZG1hLT5uX3F1 ZXVlcyA9IHF1ZXVlczsKKwlmc2xfcWRtYS0+YmxvY2tfbnVtYmVyID0gYmxrX251bTsKKwlmc2xf cWRtYS0+YmxvY2tfb2Zmc2V0ID0gYmxrX29mZjsKKworCW11dGV4X2luaXQoJmZzbF9xZG1hLT5m c2xfcWRtYV9tdXRleCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnNsX3FkbWEtPmJsb2NrX251bWJl cjsgaSsrKSB7CisJCWZzbF9xZG1hLT5zdGF0dXNbaV0gPSBmc2xfcWRtYV9wcmVwX3N0YXR1c19x dWV1ZShwZGV2KTsKKwkJaWYgKCFmc2xfcWRtYS0+c3RhdHVzW2ldKQorCQkJcmV0dXJuIC1FTk9N RU07CisJfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01F TSwgMCk7CisJZnNsX3FkbWEtPmN0cmxfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRl di0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPmN0cmxfYmFzZSkpCisJCXJldHVy biBQVFJfRVJSKGZzbF9xZG1hLT5jdHJsX2Jhc2UpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jl c291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlmc2xfcWRtYS0+c3RhdHVzX2Jhc2Ug PSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGZz bF9xZG1hLT5zdGF0dXNfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGZzbF9xZG1hLT5zdGF0dXNf YmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9N RU0sIDIpOworCWZzbF9xZG1hLT5ibG9ja19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZw ZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihmc2xfcWRtYS0+YmxvY2tfYmFzZSkpCisJCXJl dHVybiBQVFJfRVJSKGZzbF9xZG1hLT5ibG9ja19iYXNlKTsKKwlmc2xfcWRtYS0+cXVldWUgPSBm c2xfcWRtYV9hbGxvY19xdWV1ZV9yZXNvdXJjZXMocGRldiwgZnNsX3FkbWEpOworCWlmICghZnNs X3FkbWEtPnF1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGZzbF9xZG1hX2lycV9p bml0KHBkZXYsIGZzbF9xZG1hKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZnNsX3Fk bWEtPmlycV9iYXNlID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgInFkbWEtcXVldWUw Iik7CisJZnNsX3FkbWEtPmZlYXR1cmUgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWct ZW5kaWFuIik7CisJSU5JVF9MSVNUX0hFQUQoJmZzbF9xZG1hLT5kbWFfZGV2LmNoYW5uZWxzKTsK KworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRtYS0+bl9jaGFuczsgaSsrKSB7CisJCXN0cnVjdCBm c2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9ICZmc2xfcWRtYS0+Y2hhbnNbaV07CisKKwkJZnNsX2No YW4tPnFkbWEgPSBmc2xfcWRtYTsKKwkJZnNsX2NoYW4tPnF1ZXVlID0gZnNsX3FkbWEtPnF1ZXVl ICsgaSAlIChmc2xfcWRtYS0+bl9xdWV1ZXMgKgorCQkJCQkJCWZzbF9xZG1hLT5ibG9ja19udW1i ZXIpOworCQlmc2xfY2hhbi0+dmNoYW4uZGVzY19mcmVlID0gZnNsX3FkbWFfZnJlZV9kZXNjOwor CQl2Y2hhbl9pbml0KCZmc2xfY2hhbi0+dmNoYW4sICZmc2xfcWRtYS0+ZG1hX2Rldik7CisJfQor CisJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgZnNsX3FkbWEtPmRtYV9kZXYuY2FwX21hc2spOwor CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2ID0gJnBkZXYtPmRldjsKKwlmc2xfcWRtYS0+ZG1hX2Rl di5kZXZpY2VfZnJlZV9jaGFuX3Jlc291cmNlcyA9CisJCWZzbF9xZG1hX2ZyZWVfY2hhbl9yZXNv dXJjZXM7CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0K KwkJZnNsX3FkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXM7CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2 aWNlX3R4X3N0YXR1cyA9IGRtYV9jb29raWVfc3RhdHVzOworCWZzbF9xZG1hLT5kbWFfZGV2LmRl dmljZV9wcmVwX2RtYV9tZW1jcHkgPSBmc2xfcWRtYV9wcmVwX21lbWNweTsKKwlmc2xfcWRtYS0+ ZG1hX2Rldi5kZXZpY2VfaXNzdWVfcGVuZGluZyA9IGZzbF9xZG1hX2lzc3VlX3BlbmRpbmc7CisJ ZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX3N5bmNocm9uaXplID0gZnNsX3FkbWFfc3luY2hyb25p emU7CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX3Rlcm1pbmF0ZV9hbGwgPSBmc2xfcWRtYV90 ZXJtaW5hdGVfYWxsOworCisJZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg0 MCkpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZnNsX3FkbWEpOworCisJcmV0ID0g ZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmZnNsX3FkbWEtPmRtYV9kZXYpOworCWlmIChyZXQp IHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkNhbid0IHJlZ2lzdGVyIE5YUCBMYXllcnNj YXBlIHFETUEgZW5naW5lLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gZnNsX3Fk bWFfcmVnX2luaXQoZnNsX3FkbWEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiQ2FuJ3QgSW5pdGlhbGl6ZSB0aGUgcURNQSBlbmdpbmUuXG4iKTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFfY2xlYW51cF92Y2hh bihzdHJ1Y3QgZG1hX2RldmljZSAqZG1hZGV2KQoreworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpj aGFuLCAqX2NoYW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgX2NoYW4sCisJ CQkJICZkbWFkZXYtPmNoYW5uZWxzLCB2Y2hhbi5jaGFuLmRldmljZV9ub2RlKSB7CisJCWxpc3Rf ZGVsKCZjaGFuLT52Y2hhbi5jaGFuLmRldmljZV9ub2RlKTsKKwkJdGFza2xldF9raWxsKCZjaGFu LT52Y2hhbi50YXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcmVtb3ZlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGZzbF9xZG1hX3F1 ZXVlICpzdGF0dXM7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2Rl OworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7CisKKwlmc2xfcWRtYV9pcnFfZXhpdChwZGV2LCBmc2xfcWRtYSk7CisJZnNsX3Fk bWFfY2xlYW51cF92Y2hhbigmZnNsX3FkbWEtPmRtYV9kZXYpOworCW9mX2RtYV9jb250cm9sbGVy X2ZyZWUobnApOworCWRtYV9hc3luY19kZXZpY2VfdW5yZWdpc3RlcigmZnNsX3FkbWEtPmRtYV9k ZXYpOworCisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5ibG9ja19udW1iZXI7IGkrKykgewor CQlzdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzW2ldOworCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRl di0+ZGV2LCBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkgKgorCQkJCXN0YXR1cy0+bl9j cSwgc3RhdHVzLT5jcSwgc3RhdHVzLT5idXNfYWRkcik7CisJfQorCXJldHVybiAwOworfQorCitz dGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfcWRtYV9kdF9pZHNbXSA9IHsKKwl7 IC5jb21wYXRpYmxlID0gImZzbCxsczEwMjFhLXFkbWEiLCB9LAorCXsgLyogc2VudGluZWwgKi8g fQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGZzbF9xZG1hX2R0X2lkcyk7CisKK3N0YXRp YyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGZzbF9xZG1hX2RyaXZlciA9IHsKKwkuZHJpdmVyCQk9 IHsKKwkJLm5hbWUJPSAiZnNsLXFkbWEiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBmc2xfcWRtYV9k dF9pZHMsCisJfSwKKwkucHJvYmUgICAgICAgICAgPSBmc2xfcWRtYV9wcm9iZSwKKwkucmVtb3Zl CQk9IGZzbF9xZG1hX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZnNsX3Fk bWFfZHJpdmVyKTsKKworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpmc2wtcWRtYSIpOworTU9EVUxF X0RFU0NSSVBUSU9OKCJOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2luZSBkcml2ZXIiKTsK