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: <20181011094655.45707-3-peng.ma@nxp.com> Date: Thu, 11 Oct 2018 17:46:51 +0800 To: vkoul@kernel.org, leoyang.li@nxp.com Cc: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, 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 List-ID: TlhQIFF1ZXVlIERNQSBjb250cm9sbGVyKHFETUEpIG9uIExheWVyc2NhcGUgU29DcyBzdXBwb3J0 cyBjaGFubmVsCnZpcnR1YWxsaXphdGlvbiBieSBhbGxvd2luZyBETUEgam9icyB0byBiZSBlbnF1 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KClNpZ25lZC1vZmYtYnk6IFBlbmcg TWEgPHBlbmcubWFAbnhwLmNvbT4KLS0tCiBkcml2ZXJzL2RtYS9LY29uZmlnICAgIHwgICAxMyAr CiBkcml2ZXJzL2RtYS9NYWtlZmlsZSAgIHwgICAgMSArCiBkcml2ZXJzL2RtYS9mc2wtcWRtYS5j IHwgMTI4MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK IDMgZmlsZXMgY2hhbmdlZCwgMTI5NiBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1hL2ZzbC1xZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBkYWNmM2Y0Li41MGUx OWQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tj b25maWcKQEAgLTIxOCw2ICsyMTgsMTkgQEAgY29uZmlnIEZTTF9FRE1BCiAJICBtdWx0aXBsZXhp bmcgY2FwYWJpbGl0eSBmb3IgRE1BIHJlcXVlc3Qgc291cmNlcyhzbG90KS4KIAkgIFRoaXMgbW9k dWxlIGNhbiBiZSBmb3VuZCBvbiBGcmVlc2NhbGUgVnlicmlkIGFuZCBMUy0xIFNvQ3MuCiAKK2Nv bmZpZyBGU0xfUURNQQorICAgICAgIHRyaXN0YXRlICJOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2lu ZSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gQVJNIHx8IEFSTTY0CisgICAgICAgc2VsZWN0 IERNQV9FTkdJTkUKKyAgICAgICBzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKyAgICAgICBz ZWxlY3QgRE1BX0VOR0lORV9SQUlECisgICAgICAgc2VsZWN0IEFTWU5DX1RYX0VOQUJMRV9DSEFO TkVMX1NXSVRDSAorICAgICAgIGhlbHAKKyAgICAgICAgIFN1cHBvcnQgdGhlIE5YUCBMYXllcnNj YXBlIHFETUEgZW5naW5lIHdpdGggY29tbWFuZCBxdWV1ZSBhbmQgbGVnYWN5IG1vZGUuCisgICAg ICAgICBDaGFubmVsIHZpcnR1YWxpemF0aW9uIGlzIHN1cHBvcnRlZCB0aHJvdWdoIGVucXVldWlu ZyBvZiBETUEgam9icyB0bywKKyAgICAgICAgIG9yIGRlcXVldWluZyBETUEgam9icyBmcm9tLCBk aWZmZXJlbnQgd29yayBxdWV1ZXMuCisgICAgICAgICBUaGlzIG1vZHVsZSBjYW4gYmUgZm91bmQg b24gTlhQIExheWVyc2NhcGUgU29Dcy4KKwogY29uZmlnIEZTTF9SQUlECiAgICAgICAgIHRyaXN0 YXRlICJGcmVlc2NhbGUgUkFJRCBlbmdpbmUgU3VwcG9ydCIKICAgICAgICAgZGVwZW5kcyBvbiBG U0xfU09DICYmICFBU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggYzkxNzAyZC4u MmQxYjU4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9k bWEvTWFrZWZpbGUKQEAgLTMyLDYgKzMyLDcgQEAgb2JqLSQoQ09ORklHX0RXX0RNQUNfQ09SRSkg Kz0gZHcvCiBvYmotJChDT05GSUdfRVA5M1hYX0RNQSkgKz0gZXA5M3h4X2RtYS5vCiBvYmotJChD T05GSUdfRlNMX0RNQSkgKz0gZnNsZG1hLm8KIG9iai0kKENPTkZJR19GU0xfRURNQSkgKz0gZnNs LWVkbWEubworb2JqLSQoQ09ORklHX0ZTTF9RRE1BKSArPSBmc2wtcWRtYS5vCiBvYmotJChDT05G SUdfRlNMX1JBSUQpICs9IGZzbF9yYWlkLm8KIG9iai0kKENPTkZJR19IU1VfRE1BKSArPSBoc3Uv CiBvYmotJChDT05GSUdfSU1HX01EQ19ETUEpICs9IGltZy1tZGMtZG1hLm8KZGlmZiAtLWdpdCBh L2RyaXZlcnMvZG1hL2ZzbC1xZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2wtcWRtYS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTRmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2RtYS9mc2wtcWRtYS5jCkBAIC0wLDAgKzEsMTI4MiBAQAorLyoKKyAqIERyaXZlciBm b3IgTlhQIExheWVyc2NhcGUgUXVldWUgZGlyZWN0IG1lbW9yeSBhY2Nlc3MgY29udHJvbGxlciAo cURNQSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxOCBOWFAKKyAqCisgKiBBdXRob3I6CisgKiAgSmlh aGVuZyBGYW4gPGppYWhlbmcuZmFuQG54cC5jb20+CisgKiAgV2VuIEhlIDx3ZW4uaGVfMUBueHAu Y29tPgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworICovCisKKyNp bmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1 ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgor I2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+ CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5o PgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgor CisjaW5jbHVkZSAidmlydC1kbWEuaCIKKyNpbmNsdWRlICJmc2xkbWEuaCIKKworLyogUmVnaXN0 ZXIgcmVsYXRlZCBkZWZpbml0aW9uICovCisjZGVmaW5lIEZTTF9RRE1BX0RNUgkJCTB4MAorI2Rl ZmluZSBGU0xfUURNQV9EU1IJCQkweDQKKyNkZWZpbmUgRlNMX1FETUFfREVJRVIJCQkweGUwMAor I2RlZmluZSBGU0xfUURNQV9ERURSCQkJMHhlMDQKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXMFIJ CTB4ZTEwCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0ZEVzFSCQkweGUxNAorI2RlZmluZSBGU0xfUURN QV9ERUNGRFcyUgkJMHhlMTgKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXM1IJCTB4ZTFjCisjZGVm aW5lIEZTTF9RRE1BX0RFQ0ZRSURSCQkweGUzMAorI2RlZmluZSBGU0xfUURNQV9ERUNCUgkJCTB4 ZTM0CisKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVIoeCkJCSgweGMwICsgMHgxMDAgKiAoeCkpCisj ZGVmaW5lIEZTTF9RRE1BX0JDUVNSKHgpCQkoMHhjNCArIDB4MTAwICogKHgpKQorI2RlZmluZSBG U0xfUURNQV9CQ1FFRFBBX1NBRERSKHgpCSgweGM4ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZT TF9RRE1BX0JDUURQQV9TQUREUih4KQkoMHhjYyArIDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xf UURNQV9CQ1FFRVBBX1NBRERSKHgpCSgweGQwICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9R RE1BX0JDUUVQQV9TQUREUih4KQkoMHhkNCArIDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURN QV9CQ1FJRVIoeCkJCSgweGUwICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUUlE Uih4KQkJKDB4ZTQgKyAweDEwMCAqICh4KSkKKworI2RlZmluZSBGU0xfUURNQV9TUURQQVIJCQkw eDgwYworI2RlZmluZSBGU0xfUURNQV9TUUVQQVIJCQkweDgxNAorI2RlZmluZSBGU0xfUURNQV9C U1FNUgkJCTB4ODAwCisjZGVmaW5lIEZTTF9RRE1BX0JTUVNSCQkJMHg4MDQKKyNkZWZpbmUgRlNM X1FETUFfQlNRSUNSCQkJMHg4MjgKKyNkZWZpbmUgRlNMX1FETUFfQ1FNUgkJCTB4YTAwCisjZGVm aW5lIEZTTF9RRE1BX0NRRFNDUjEJCTB4YTA4CisjZGVmaW5lIEZTTF9RRE1BX0NRRFNDUjIgICAg ICAgICAgICAgICAgMHhhMGMKKyNkZWZpbmUgRlNMX1FETUFfQ1FJRVIJCQkweGExMAorI2RlZmlu ZSBGU0xfUURNQV9DUUVEUgkJCTB4YTE0CisjZGVmaW5lIEZTTF9RRE1BX1NRQ0NNUgkJCTB4YTIw CisKKy8qIFJlZ2lzdGVycyBmb3IgYml0IGFuZCBnZW5tYXNrICovCisjZGVmaW5lIEZTTF9RRE1B X0NRSURSX1NRVAkJQklUKDE1KQorI2RlZmluZSBRRE1BX0NDREZfRk9UTUFUCQlCSVQoMjkpCisj ZGVmaW5lIFFETUFfQ0NERl9TRVIJCQlCSVQoMzApCisjZGVmaW5lIFFETUFfU0dfRklOCQkJQklU KDMwKQorI2RlZmluZSBRRE1BX1NHX0xFTl9NQVNLCQlHRU5NQVNLKDI5LCAwKQorI2RlZmluZSBR RE1BX0NDREZfTUFTSwkJCUdFTk1BU0soMjgsIDIwKQorCisjZGVmaW5lIEZTTF9RRE1BX0JDUUlF Ul9DUVRJRQkJQklUKDE1KQorI2RlZmluZSBGU0xfUURNQV9CQ1FJRVJfQ1FQRUlFCQlCSVQoMjMp CisjZGVmaW5lIEZTTF9RRE1BX0JTUUlDUl9JQ0VOCQlCSVQoMzEpCisKKyNkZWZpbmUgRlNMX1FE TUFfQlNRSUNSX0lDU1QoeCkJCSgoeCkgPDwgMTYpCisjZGVmaW5lIEZTTF9RRE1BX0NRSUVSX01F SUUJCUJJVCgzMSkKKyNkZWZpbmUgRlNMX1FETUFfQ1FJRVJfVEVJRQkJQklUKDApCisjZGVmaW5l IEZTTF9RRE1BX1NRQ0NNUl9FTlRFUl9XTQlCSVQoMjEpCisKKyNkZWZpbmUgRlNMX1FETUFfQkNR TVJfRU4JCUJJVCgzMSkKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfRUkJCUJJVCgzMCkKKyNkZWZp bmUgRlNMX1FETUFfQkNRTVJfQ0RfVEhMRCh4KQkoKHgpIDw8IDIwKQorI2RlZmluZSBGU0xfUURN QV9CQ1FNUl9DUV9TSVpFKHgpCSgoeCkgPDwgMTYpCisKKyNkZWZpbmUgRlNMX1FETUFfQkNRU1Jf UUYJCUJJVCgxNikKKyNkZWZpbmUgRlNMX1FETUFfQkNRU1JfWE9GRgkJQklUKDApCisKKyNkZWZp bmUgRlNMX1FETUFfQlNRTVJfRU4JCUJJVCgzMSkKKyNkZWZpbmUgRlNMX1FETUFfQlNRTVJfREkJ CUJJVCgzMCkKKyNkZWZpbmUgRlNMX1FETUFfQlNRTVJfQ1FfU0laRSh4KQkoKHgpIDw8IDE2KQor CisjZGVmaW5lIEZTTF9RRE1BX0JTUVNSX1FFCQlCSVQoMTcpCisKKyNkZWZpbmUgRlNMX1FETUFf RE1SX0RRRAkJQklUKDMwKQorI2RlZmluZSBGU0xfUURNQV9EU1JfREIJCUJJVCgzMSkKKworLyog U2l6ZSByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlNMX1FETUFfUVVFVUVfTUFYCQk4 CisjZGVmaW5lIEZTTF9RRE1BX0NPTU1BTkRfQlVGRkVSX1NJWkUJNjQKKyNkZWZpbmUgRlNMX1FE TUFfREVTQ1JJUFRPUl9CVUZGRVJfU0laRSAzMgorI2RlZmluZSBGU0xfUURNQV9DSVJDVUxBUl9E RVNDX1NJWkVfTUlOCTY0CisjZGVmaW5lIEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0laRV9NQVgJ MTYzODQKKyNkZWZpbmUgRlNMX1FETUFfUVVFVUVfTlVNX01BWAkJOAorCisvKiBGaWVsZCBkZWZp bml0aW9uIGZvciBDTUQgKi8KKyNkZWZpbmUgRlNMX1FETUFfQ01EX1JXVFRZUEUJCTB4NAorI2Rl ZmluZSBGU0xfUURNQV9DTURfTFdDICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSBGU0xfUURN QV9DTURfUldUVFlQRV9PRkZTRVQJMjgKKyNkZWZpbmUgRlNMX1FETUFfQ01EX05TX09GRlNFVAkJ MjcKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0RRT1NfT0ZGU0VUCTI0CisjZGVmaW5lIEZTTF9RRE1B X0NNRF9XVEhST1RMX09GRlNFVAkyMAorI2RlZmluZSBGU0xfUURNQV9DTURfRFNFTl9PRkZTRVQJ MTkKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0xXQ19PRkZTRVQJCTE2CisKKy8qIEZpZWxkIGRlZmlu aXRpb24gZm9yIERlc2NyaXB0b3Igb2Zmc2V0ICovCisjZGVmaW5lIFFETUFfQ0NERl9TVEFUVVMJ CTIwCisjZGVmaW5lIFFETUFfQ0NERl9PRkZTRVQJCTIwCisKKyNkZWZpbmUJQ09NUF9USU1FT1VU CQkJMTAwMAorI2RlZmluZSBDT01NQU5EX1FVRVVFX09WRVJGTExPVwkJMTAKKworI2RlZmluZSBG U0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYV9lbmdpbmUsIHgpCQkJXAorCSgoKGZz bF9xZG1hX2VuZ2luZSktPmJsb2NrX29mZnNldCkgKiAoeCkpCisKKy8qIHFETUEgc3RhdHVzIG5v dGlmaWNhdGlvbiBwcmUgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBmc2xfcHJlX3N0YXR1cyB7CisJ dTY0IHF1ZXVlOworCXU2NCBhZGRyOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVj dCBmc2xfcHJlX3N0YXR1cywgcHJlKTsKKworLyoqCisgKiBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0 IC0gVGhpcyBpcyB0aGUgc3RydWN0IGhvbGRpbmcgZGVzY3JpYmluZyBjb21wb3VuZAorICoJCQkg ICAgZGVzY3JpcHRvciBmb3JtYXQgd2l0aCBxRE1BLgorICogQHN0YXR1czoJCSAgICBDb21tYW5k IHN0YXR1cyBhbmQgZW5xdWV1ZSBzdGF0dXMgbm90aWZpY2F0aW9uLgorICogQGNmZzoJCSAgICBG cmFtZSBvZmZzZXQgYW5kIGZyYW1lIGZvcm1hdC4KKyAqIEBhZGRyX2xvOgkJICAgIEhvbGRpbmcg dGhlIGNvbXBvdW5kIGRlc2NyaXB0b3Igb2YgdGhlIGxvd2VyCisgKgkJCSAgICAzMi1iaXRzIGFk ZHJlc3MgaW4gbWVtb3J5IDQwLWJpdCBhZGRyZXNzLgorICogQGFkZHJfaGk6CQkgICAgU2FtZSBh cyBhYm92ZSBtZW1iZXIsIGJ1dCBwb2ludCBoaWdoIDgtYml0cyBpbgorICoJCQkgICAgbWVtb3J5 IDQwLWJpdCBhZGRyZXNzLgorICogQF9fcmVzZXJ2ZWQxOgkgICAgUmVzZXJ2ZWQgZmllbGQuCisg KiBAY2ZnOGJfdzE6CQkgICAgQ29tcG91bmQgZGVzY3JpcHRvciBjb21tYW5kIHF1ZXVlIG9yaWdp biBwcm9kdWNlZAorICoJCQkgICAgYnkgcURNQSBhbmQgZHluYW1pYyBkZWJ1ZyBmaWVsZC4KKyAq IEBkYXRhCQkgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IDQwLWJpdCBhZGRyZXNzLCBkZXNjcmli ZXMgRE1BCisgKgkJCSAgICBzb3VyY2UgaW5mb3JtYXRpb24gYW5kIERNQSBkZXN0aW5hdGlvbiBp bmZvcm1hdGlvbi4KKyAqLworc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCB7CisJX19sZTMyIHN0YXR1 czsKKwlfX2xlMzIgY2ZnOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBhZGRyX2xv OworCQkJdTggYWRkcl9oaTsKKwkJCXU4IF9fcmVzZXJ2ZWQxWzJdOworCQkJdTggY2ZnOGJfdzE7 CisJCX0gX19wYWNrZWQ7CisJCV9fbGU2NCBkYXRhOworCX07Cit9IF9fcGFja2VkOworCitzdGF0 aWMgaW5saW5lIHU2NAorcWRtYV9jY2RmX2FkZHJfZ2V0NjQoY29uc3Qgc3RydWN0IGZzbF9xZG1h X2Zvcm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUoY2NkZi0+ZGF0YSkgJiAweGZm ZmZmZmZmZmZMTFU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWRtYV9kZXNjX2FkZHJfc2V0 NjQoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZiwgdTY0IGFkZHIpCit7CisJY2NkZi0+YWRk cl9oaSA9IHVwcGVyXzMyX2JpdHMoYWRkcik7CisJY2NkZi0+YWRkcl9sbyA9IGNwdV90b19sZTMy KGxvd2VyXzMyX2JpdHMoYWRkcikpOworfQorCitzdGF0aWMgaW5saW5lIHU2NAorcWRtYV9jY2Rm X2dldF9xdWV1ZShjb25zdCBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmKQoreworCXJldHVy biBjY2RmLT5jZmc4Yl93MSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitxZG1hX2Nj ZGZfZ2V0X29mZnNldChjb25zdCBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmKQoreworCXJl dHVybiAobGUzMl90b19jcHUoY2NkZi0+Y2ZnKSAmIFFETUFfQ0NERl9NQVNLKSA+PiBRRE1BX0ND REZfT0ZGU0VUOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3FkbWFfY2NkZl9zZXRfZm9ybWF0 KHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYsIGludCBvZmZzZXQpCit7CisJY2NkZi0+Y2Zn ID0gY3B1X3RvX2xlMzIoUURNQV9DQ0RGX0ZPVE1BVCB8IG9mZnNldCk7Cit9CisKK3N0YXRpYyBp bmxpbmUgaW50CitxZG1hX2NjZGZfZ2V0X3N0YXR1cyhjb25zdCBzdHJ1Y3QgZnNsX3FkbWFfZm9y bWF0ICpjY2RmKQoreworCXJldHVybiAobGUzMl90b19jcHUoY2NkZi0+c3RhdHVzKSAmIFFETUFf Q0NERl9NQVNLKSA+PiBRRE1BX0NDREZfU1RBVFVTOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQK K3FkbWFfY2NkZl9zZXRfc2VyKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYsIGludCBzdGF0 dXMpCit7CisJY2NkZi0+c3RhdHVzID0gY3B1X3RvX2xlMzIoUURNQV9DQ0RGX1NFUiB8IHN0YXR1 cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBxZG1hX2NzZ2Zfc2V0X2xlbihzdHJ1Y3QgZnNs X3FkbWFfZm9ybWF0ICpjc2dmLCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNwdV90b19sZTMy KGxlbiAmIFFETUFfU0dfTEVOX01BU0spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWRtYV9j c2dmX3NldF9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNzZ2YsIGludCBsZW4pCit7CisJY3Nn Zi0+Y2ZnID0gY3B1X3RvX2xlMzIoUURNQV9TR19GSU4gfCAobGVuICYgUURNQV9TR19MRU5fTUFT SykpOworfQorCisvKiBxRE1BIFNvdXJjZSBEZXNjcmlwdG9yIEZvcm1hdCAqLworc3RydWN0IGZz bF9xZG1hX3NkZiB7CisJX19sZTMyIHJldjM7CisJX19sZTMyIGNmZzsgLyogcmV2NCwgYml0WzAt MTFdIC0gc3NkLCBiaXRbMTItMjNdIHNzcyAqLworCV9fbGUzMiByZXY1OworCV9fbGUzMiBjbWQ7 Cit9IF9fcGFja2VkOworCisvKiBxRE1BIERlc3RpbmF0aW9uIERlc2NyaXB0b3IgRm9ybWF0ICov CitzdHJ1Y3QgZnNsX3FkbWFfZGRmIHsKKwlfX2xlMzIgcmV2MTsKKwlfX2xlMzIgY2ZnOyAvKiBy ZXYyLCBiaXRbMC0xMV0gLSBkc2QsIGJpdFsxMi0yM10gLSBkc3MgKi8KKwlfX2xlMzIgcmV2MzsK KwlfX2xlMzIgY21kOworfSBfX3BhY2tlZDsKKworc3RydWN0IGZzbF9xZG1hX2NoYW4geworCXN0 cnVjdCB2aXJ0X2RtYV9jaGFuCQl2Y2hhbjsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYwkJdmRlc2M7 CisJZW51bSBkbWFfc3RhdHVzCQkJc3RhdHVzOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUJCSpx ZG1hOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZQkJKnF1ZXVlOworfTsKKworc3RydWN0IGZzbF9x ZG1hX3F1ZXVlIHsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0X2hlYWQ7CisJc3RydWN0 IGZzbF9xZG1hX2Zvcm1hdAkqdmlydF90YWlsOworCXN0cnVjdCBsaXN0X2hlYWQJY29tcF91c2Vk OworCXN0cnVjdCBsaXN0X2hlYWQJY29tcF9mcmVlOworCXN0cnVjdCBkbWFfcG9vbAkJKmNvbXBf cG9vbDsKKwlzdHJ1Y3QgZG1hX3Bvb2wJCSpkZXNjX3Bvb2w7CisJc3BpbmxvY2tfdAkJcXVldWVf bG9jazsKKwlkbWFfYWRkcl90CQlidXNfYWRkcjsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBu X2NxOworCXUzMgkJCWlkOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKmNxOworCXZvaWQgX19p b21lbQkJKmJsb2NrX2Jhc2U7Cit9OworCitzdHJ1Y3QgZnNsX3FkbWFfY29tcCB7CisJZG1hX2Fk ZHJfdCAgICAgICAgICAgICAgYnVzX2FkZHI7CisJZG1hX2FkZHJfdCAgICAgICAgICAgICAgZGVz Y19idXNfYWRkcjsKKwl2b2lkCQkJKnZpcnRfYWRkcjsKKwl2b2lkCQkJKmRlc2NfdmlydF9hZGRy OworCXN0cnVjdCBmc2xfcWRtYV9jaGFuCSpxY2hhbjsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAg ICB2ZGVzYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7Cit9OworCitzdHJ1Y3QgZnNsX3FkbWFf ZW5naW5lIHsKKwlzdHJ1Y3QgZG1hX2RldmljZQlkbWFfZGV2OworCXZvaWQgX19pb21lbQkJKmN0 cmxfYmFzZTsKKwl2b2lkIF9faW9tZW0gICAgICAgICAgICAqc3RhdHVzX2Jhc2U7CisJdm9pZCBf X2lvbWVtCQkqYmxvY2tfYmFzZTsKKwl1MzIJCQluX2NoYW5zOworCXUzMgkJCW5fcXVldWVzOwor CXN0cnVjdCBtdXRleCAgICAgICAgICAgIGZzbF9xZG1hX211dGV4OworCWludAkJCWVycm9yX2ly cTsKKwlpbnQJCQkqcXVldWVfaXJxOworCXUzMgkJCWZlYXR1cmU7CisJc3RydWN0IGZzbF9xZG1h X3F1ZXVlCSpxdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUJKipzdGF0dXM7CisJc3RydWN0 IGZzbF9xZG1hX2NoYW4JKmNoYW5zOworCWludAkJCWJsb2NrX251bWJlcjsKKwlpbnQJCQlibG9j a19vZmZzZXQ7CisJaW50CQkJaXJxX2Jhc2U7CisJaW50CQkJZGVzY19hbGxvY2F0ZWQ7CisKK307 CisKK3N0YXRpYyB1MzIgcWRtYV9yZWFkbChzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpxZG1hLCB2 b2lkIF9faW9tZW0gKmFkZHIpCit7CisJcmV0dXJuIEZTTF9ETUFfSU4ocWRtYSwgYWRkciwgMzIp OworfQorCitzdGF0aWMgdm9pZCBxZG1hX3dyaXRlbChzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpx ZG1hLCB1MzIgdmFsLAorCQkJCQkJdm9pZCBfX2lvbWVtICphZGRyKQoreworCUZTTF9ETUFfT1VU KHFkbWEsIGFkZHIsIHZhbCwgMzIpOworfQorCitzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2NoYW4g KnRvX2ZzbF9xZG1hX2NoYW4oc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXJldHVybiBjb250 YWluZXJfb2YoY2hhbiwgc3RydWN0IGZzbF9xZG1hX2NoYW4sIHZjaGFuLmNoYW4pOworfQorCitz dGF0aWMgc3RydWN0IGZzbF9xZG1hX2NvbXAgKnRvX2ZzbF9xZG1hX2NvbXAoc3RydWN0IHZpcnRf ZG1hX2Rlc2MgKnZkKQoreworCXJldHVybiBjb250YWluZXJfb2YodmQsIHN0cnVjdCBmc2xfcWRt YV9jb21wLCB2ZGVzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2ZyZWVfY2hhbl9yZXNv dXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpm c2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVl ICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAq ZnNsX3FkbWEgPSBmc2xfY2hhbi0+cWRtYTsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqY29tcF90 ZW1wLCAqX2NvbXBfdGVtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChoZWFk KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfY2hhbi0+dmNoYW4ubG9jaywgZmxhZ3MpOwor CXZjaGFuX2dldF9hbGxfZGVzY3JpcHRvcnMoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisKKwl2 Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworCisJaWYg KCFmc2xfcXVldWUtPmNvbXBfcG9vbCAmJiAhZnNsX3F1ZXVlLT5jb21wX3Bvb2wpCisJCXJldHVy bjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb21wX3RlbXAsIF9jb21wX3RlbXAsCisJ CQkJJmZzbF9xdWV1ZS0+Y29tcF91c2VkLAlsaXN0KSB7CisJCWRtYV9wb29sX2ZyZWUoZnNsX3F1 ZXVlLT5jb21wX3Bvb2wsCisJCQkJCSBjb21wX3RlbXAtPnZpcnRfYWRkciwKKwkJCQkJIGNvbXBf dGVtcC0+YnVzX2FkZHIpOworCQlkbWFfcG9vbF9mcmVlKGZzbF9xdWV1ZS0+ZGVzY19wb29sLAor CQkJCWNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIsCisJCQkJY29tcF90ZW1wLT5kZXNjX2J1c19h ZGRyKTsKKwkJbGlzdF9kZWwoJmNvbXBfdGVtcC0+bGlzdCk7CisJCWtmcmVlKGNvbXBfdGVtcCk7 CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbXBfdGVtcCwgX2NvbXBfdGVtcCwK KwkJCQkmZnNsX3F1ZXVlLT5jb21wX2ZyZWUsIGxpc3QpIHsKKwkJZG1hX3Bvb2xfZnJlZShmc2xf cXVldWUtPmNvbXBfcG9vbCwKKwkJCQkJIGNvbXBfdGVtcC0+dmlydF9hZGRyLAorCQkJCQkgY29t cF90ZW1wLT5idXNfYWRkcik7CisJCWRtYV9wb29sX2ZyZWUoZnNsX3F1ZXVlLT5kZXNjX3Bvb2ws CisJCQkJY29tcF90ZW1wLT5kZXNjX3ZpcnRfYWRkciwKKwkJCQljb21wX3RlbXAtPmRlc2NfYnVz X2FkZHIpOworCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0KTsKKwkJa2ZyZWUoY29tcF90ZW1w KTsKKwl9CisKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+Y29tcF9wb29sKTsKKwlkbWFf cG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19wb29sKTsKKworCWZzbF9xZG1hLT5kZXNjX2Fs bG9jYXRlZC0tOworCWZzbF9xdWV1ZS0+Y29tcF9wb29sID0gTlVMTDsKKwlmc2xfcXVldWUtPmRl c2NfcG9vbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2NvbXBfZmlsbF9tZW1j cHkoc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21wLAorCQkJCQlkbWFfYWRkcl90IGRzdCwg ZG1hX2FkZHJfdCBzcmMsIHUzMiBsZW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2Nk ZiwgKmNzZ2ZfZGVzYywgKmNzZ2Zfc3JjLCAqY3NnZl9kZXN0OworCXN0cnVjdCBmc2xfcWRtYV9z ZGYgKnNkZjsKKwlzdHJ1Y3QgZnNsX3FkbWFfZGRmICpkZGY7CisKKwljY2RmID0gKHN0cnVjdCBm c2xfcWRtYV9mb3JtYXQgKilmc2xfY29tcC0+dmlydF9hZGRyOworCWNzZ2ZfZGVzYyA9IChzdHJ1 Y3QgZnNsX3FkbWFfZm9ybWF0ICopZnNsX2NvbXAtPnZpcnRfYWRkciArIDE7CisJY3NnZl9zcmMg PSAoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqKWZzbF9jb21wLT52aXJ0X2FkZHIgKyAyOworCWNz Z2ZfZGVzdCA9IChzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICopZnNsX2NvbXAtPnZpcnRfYWRkciAr IDM7CisJc2RmID0gKHN0cnVjdCBmc2xfcWRtYV9zZGYgKilmc2xfY29tcC0+ZGVzY192aXJ0X2Fk ZHI7CisJZGRmID0gKHN0cnVjdCBmc2xfcWRtYV9kZGYgKilmc2xfY29tcC0+ZGVzY192aXJ0X2Fk ZHIgKyAxOworCisJbWVtc2V0KGZzbF9jb21wLT52aXJ0X2FkZHIsIDAsIEZTTF9RRE1BX0NPTU1B TkRfQlVGRkVSX1NJWkUpOworCW1lbXNldChmc2xfY29tcC0+ZGVzY192aXJ0X2FkZHIsIDAsIEZT TF9RRE1BX0RFU0NSSVBUT1JfQlVGRkVSX1NJWkUpOworCS8qIEhlYWQgQ29tbWFuZCBEZXNjcmlw dG9yKEZyYW1lIERlc2NyaXB0b3IpICovCisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY2NkZiwgZnNs X2NvbXAtPmJ1c19hZGRyICsgMTYpOworCXFkbWFfY2NkZl9zZXRfZm9ybWF0KGNjZGYsIHFkbWFf Y2NkZl9nZXRfb2Zmc2V0KGNjZGYpKTsKKwlxZG1hX2NjZGZfc2V0X3NlcihjY2RmLCBxZG1hX2Nj ZGZfZ2V0X3N0YXR1cyhjY2RmKSk7CisJLyogU3RhdHVzIG5vdGlmaWNhdGlvbiBpcyBlbnF1ZXVl ZCB0byBzdGF0dXMgcXVldWUuICovCisJLyogQ29tcG91bmQgQ29tbWFuZCBEZXNjcmlwdG9yKEZy YW1lIExpc3QgVGFibGUpICovCisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY3NnZl9kZXNjLCBmc2xf Y29tcC0+ZGVzY19idXNfYWRkcik7CisJLyogSXQgbXVzdCBiZSAzMiBhcyBDb21wb3VuZCBTL0cg RGVzY3JpcHRvciAqLworCXFkbWFfY3NnZl9zZXRfbGVuKGNzZ2ZfZGVzYywgMzIpOworCXFkbWFf ZGVzY19hZGRyX3NldDY0KGNzZ2Zfc3JjLCBzcmMpOworCXFkbWFfY3NnZl9zZXRfbGVuKGNzZ2Zf c3JjLCBsZW4pOworCXFkbWFfZGVzY19hZGRyX3NldDY0KGNzZ2ZfZGVzdCwgZHN0KTsKKwlxZG1h X2NzZ2Zfc2V0X2xlbihjc2dmX2Rlc3QsIGxlbik7CisJLyogVGhpcyBlbnRyeSBpcyB0aGUgbGFz dCBlbnRyeS4gKi8KKwlxZG1hX2NzZ2Zfc2V0X2YoY3NnZl9kZXN0LCBsZW4pOworCS8qIERlc2Ny aXB0b3IgQnVmZmVyICovCisJc2RmLT5jbWQgPSBjcHVfdG9fbGUzMigKKwkJCUZTTF9RRE1BX0NN RF9SV1RUWVBFIDw8IEZTTF9RRE1BX0NNRF9SV1RUWVBFX09GRlNFVCk7CisJZGRmLT5jbWQgPSBj cHVfdG9fbGUzMigKKwkJCUZTTF9RRE1BX0NNRF9SV1RUWVBFIDw8IEZTTF9RRE1BX0NNRF9SV1RU WVBFX09GRlNFVCk7CisJZGRmLT5jbWQgfD0gY3B1X3RvX2xlMzIoCisJCQlGU0xfUURNQV9DTURf TFdDIDw8IEZTTF9RRE1BX0NNRF9MV0NfT0ZGU0VUKTsKK30KKworLyoKKyAqIFByZS1yZXF1ZXN0 IGNvbW1hbmQgZGVzY3JpcHRvciBhbmQgY29tcG91bmQgUy9HIGZvciBlbnF1ZXVlLgorICovCitz dGF0aWMgaW50IGZzbF9xZG1hX3ByZV9yZXF1ZXN0X2VucXVldWVfY29tcF9kZXNjKHN0cnVjdCBm c2xfcWRtYV9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmNvbXBfdGVt cDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBxdWV1ZS0+bl9jcSArIENPTU1BTkRfUVVF VUVfT1ZFUkZMTE9XOyBpKyspIHsKKwkJY29tcF90ZW1wID0ga3phbGxvYyhzaXplb2YoKmNvbXBf dGVtcCksIEdGUF9LRVJORUwpOworCQlpZiAoIWNvbXBfdGVtcCkKKwkJCXJldHVybiAtRU5PTUVN OworCQljb21wX3RlbXAtPnZpcnRfYWRkciA9IGRtYV9wb29sX2FsbG9jKHF1ZXVlLT5jb21wX3Bv b2wsCisJCQkJCQkgICAgICBHRlBfS0VSTkVMLAorCQkJCQkJICAgICAgJmNvbXBfdGVtcC0+YnVz X2FkZHIpOworCisJCWlmICghY29tcF90ZW1wLT52aXJ0X2FkZHIpIHsKKwkJCWtmcmVlKGNvbXBf dGVtcCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWxpc3RfYWRkX3RhaWwoJmNvbXBf dGVtcC0+bGlzdCwgJnF1ZXVlLT5jb21wX2ZyZWUpOworCX0KKworCXJldHVybiAwOworfQorCisv KgorICogUHJlLXJlcXVlc3Qgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkZXNjcmlwdG9yIGZvciBl bnF1ZXVlLgorICovCitzdGF0aWMgaW50IGZzbF9xZG1hX3ByZV9yZXF1ZXN0X2VucXVldWVfc2Rf ZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBmc2xfcWRtYV9j b21wICpjb21wX3RlbXAsICpfY29tcF90ZW1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZl KGNvbXBfdGVtcCwgX2NvbXBfdGVtcCwKKwkJCQkmcXVldWUtPmNvbXBfZnJlZSwgbGlzdCkgewor CQljb21wX3RlbXAtPmRlc2NfdmlydF9hZGRyID0gZG1hX3Bvb2xfYWxsb2MocXVldWUtPmRlc2Nf cG9vbCwKKwkJCQkJCUdGUF9LRVJORUwsCisJCQkJCQkmY29tcF90ZW1wLT5kZXNjX2J1c19hZGRy KTsKKwkJaWYgKCFjb21wX3RlbXAtPmRlc2NfdmlydF9hZGRyKQorCQkJcmV0dXJuIC1FTk9NRU07 CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXF1ZXN0IGEgY29tbWFuZCBkZXNjcmlw dG9yIGZvciBlbnF1ZXVlLgorICovCitzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9x ZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKAorCQkJCQlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNs X2NoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmNvbXBfdGVtcDsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKnF1ZXVlID0gZnNsX2NoYW4tPnF1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisJaW50IHRpbWVvdXQgPSBDT01QX1RJTUVPVVQ7CisKKwl3aGlsZSAodGltZW91dCkgewor CQlzcGluX2xvY2tfaXJxc2F2ZSgmcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFs aXN0X2VtcHR5KCZxdWV1ZS0+Y29tcF9mcmVlKSkgeworCQkJY29tcF90ZW1wID0gbGlzdF9maXJz dF9lbnRyeSgmcXVldWUtPmNvbXBfZnJlZSwKKwkJCQkJICAgICBzdHJ1Y3QgZnNsX3FkbWFfY29t cCwKKwkJCQkJICAgICBsaXN0KTsKKwkJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCisJ CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQkJ Y29tcF90ZW1wLT5xY2hhbiA9IGZzbF9jaGFuOworCQkJcmV0dXJuIGNvbXBfdGVtcDsKKwkJfQor CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQl1 ZGVsYXkoMSk7CisJCXRpbWVvdXQtLTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGlj IHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3FkbWFfYWxsb2NfcXVldWVfcmVzb3VyY2VzKAor CQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAorCQkJCQlzdHJ1Y3QgZnNsX3FkbWFf ZW5naW5lICpmc2xfcWRtYSkKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnF1ZXVlX2hlYWQs ICpxdWV1ZV90ZW1wOworCWludCByZXQsIGxlbiwgaSwgajsKKwl1bnNpZ25lZCBpbnQgcXVldWVf c2l6ZVtGU0xfUURNQV9RVUVVRV9NQVhdOworCWludCBxdWV1ZV9udW07CisJaW50IGJsb2NrX251 bWJlcjsKKworCXF1ZXVlX251bSA9IGZzbF9xZG1hLT5uX3F1ZXVlczsKKwlibG9ja19udW1iZXIg PSBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOworCisJaWYgKHF1ZXVlX251bSA+IEZTTF9RRE1BX1FV RVVFX01BWCkKKwkJcXVldWVfbnVtID0gRlNMX1FETUFfUVVFVUVfTUFYOworCWxlbiA9IHNpemVv ZigqcXVldWVfaGVhZCkgKiBxdWV1ZV9udW0gKiBibG9ja19udW1iZXI7CisJcXVldWVfaGVhZCA9 IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghcXVldWVf aGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVhZF91MzJf YXJyYXkoJnBkZXYtPmRldiwgInF1ZXVlLXNpemVzIiwKKwkJCQkJcXVldWVfc2l6ZSwgcXVldWVf bnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxdWV1 ZS1zaXplcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZm9yIChqID0gMDsgaiA8IGJsb2Nr X251bWJlcjsgaisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBxdWV1ZV9udW07IGkrKykgeworCQkJ aWYgKHF1ZXVlX3NpemVbaV0gPiBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYIHx8CisJ CQkgICBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01JTikgewor CQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkgICAgICAgIkdldCB3cm9uZyBxdWV1ZS1zaXpl cy5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJcXVldWVfdGVtcCA9IHF1ZXVlX2hl YWQgKyBpICsgKGogKiBxdWV1ZV9udW0pOworCisJCQlxdWV1ZV90ZW1wLT5jcSA9CisJCQlkbWFf YWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9m b3JtYXQpICoKKwkJCQkJcXVldWVfc2l6ZVtpXSwKKwkJCQkJJnF1ZXVlX3RlbXAtPmJ1c19hZGRy LAorCQkJCQlHRlBfS0VSTkVMKTsKKwkJCWlmICghcXVldWVfdGVtcC0+Y3EpCisJCQkJcmV0dXJu IE5VTEw7CisJCQlxdWV1ZV90ZW1wLT5ibG9ja19iYXNlID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2Ug KworCQkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9xZG1hLCBqKTsKKwkJCXF1ZXVl X3RlbXAtPm5fY3EgPSBxdWV1ZV9zaXplW2ldOworCQkJcXVldWVfdGVtcC0+aWQgPSBpOworCQkJ cXVldWVfdGVtcC0+dmlydF9oZWFkID0gcXVldWVfdGVtcC0+Y3E7CisJCQlxdWV1ZV90ZW1wLT52 aXJ0X3RhaWwgPSBxdWV1ZV90ZW1wLT5jcTsKKwkJCS8qCisJCQkgKiBMaXN0IGZvciBxdWV1ZSBj b21tYW5kIGJ1ZmZlcgorCQkJICovCisJCQlJTklUX0xJU1RfSEVBRCgmcXVldWVfdGVtcC0+Y29t cF91c2VkKTsKKwkJCXNwaW5fbG9ja19pbml0KCZxdWV1ZV90ZW1wLT5xdWV1ZV9sb2NrKTsKKwkJ fQorCX0KKwlyZXR1cm4gcXVldWVfaGVhZDsKK30KKworc3RhdGljIHN0cnVjdCBmc2xfcWRtYV9x dWV1ZSAqZnNsX3FkbWFfcHJlcF9zdGF0dXNfcXVldWUoCisJCQkJCQlzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zf bm9kZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnN0YXR1c19oZWFkOworCXVuc2lnbmVkIGlu dCBzdGF0dXNfc2l6ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIo bnAsICJzdGF0dXMtc2l6ZXMiLCAmc3RhdHVzX3NpemUpOworCWlmIChyZXQpIHsKKwkJZGV2X2Vy cigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHN0YXR1cy1zaXplcy5cbiIpOworCQlyZXR1cm4gTlVM TDsKKwl9CisJaWYgKHN0YXR1c19zaXplID4gRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01B WAorCQkJfHwgc3RhdHVzX3NpemUgPCBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUlOKSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkdldCB3cm9uZyBzdGF0dXNfc2l6ZS5cbiIpOworCQly ZXR1cm4gTlVMTDsKKwl9CisJc3RhdHVzX2hlYWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwg c2l6ZW9mKCpzdGF0dXNfaGVhZCksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghc3RhdHVz X2hlYWQpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBCdWZmZXIgZm9yIHF1ZXVlIGNvbW1h bmQKKwkgKi8KKwlzdGF0dXNfaGVhZC0+Y3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRl diwKKwkJCQkJCXNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSAqCisJCQkJCQlzdGF0dXNf c2l6ZSwKKwkJCQkJCSZzdGF0dXNfaGVhZC0+YnVzX2FkZHIsCisJCQkJCQlHRlBfS0VSTkVMKTsK KwlpZiAoIXN0YXR1c19oZWFkLT5jcSkKKwkJcmV0dXJuIE5VTEw7CisJc3RhdHVzX2hlYWQtPm5f Y3EgPSBzdGF0dXNfc2l6ZTsKKwlzdGF0dXNfaGVhZC0+dmlydF9oZWFkID0gc3RhdHVzX2hlYWQt PmNxOworCXN0YXR1c19oZWFkLT52aXJ0X3RhaWwgPSBzdGF0dXNfaGVhZC0+Y3E7CisJc3RhdHVz X2hlYWQtPmNvbXBfcG9vbCA9IE5VTEw7CisKKwlyZXR1cm4gc3RhdHVzX2hlYWQ7Cit9CisKK3N0 YXRpYyBpbnQgZnNsX3FkbWFfaGFsdChzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkK K3sKKwl2b2lkIF9faW9tZW0gKmN0cmwgPSBmc2xfcWRtYS0+Y3RybF9iYXNlOworCXZvaWQgX19p b21lbSAqYmxvY2s7CisJaW50IGksIGNvdW50ID0gNTsKKwlpbnQgajsKKwl1MzIgcmVnOworCisJ LyogRGlzYWJsZSB0aGUgY29tbWFuZCBxdWV1ZSBhbmQgd2FpdCBmb3IgaWRsZSBzdGF0ZS4gKi8K KwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBjdHJsICsgRlNMX1FETUFfRE1SKTsKKwlyZWcg fD0gRlNMX1FETUFfRE1SX0RRRDsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsg RlNMX1FETUFfRE1SKTsKKwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJsb2NrX251bWJlcjsg aisrKSB7CisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJRlNMX1FETUFfQkxP Q0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGopOworCQlmb3IgKGkgPSAwOyBpIDwgRlNMX1FETUFf UVVFVUVfTlVNX01BWDsgaSsrKQorCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsg RlNMX1FETUFfQkNRTVIoaSkpOworCX0KKwl3aGlsZSAoMSkgeworCQlyZWcgPSBxZG1hX3JlYWRs KGZzbF9xZG1hLCBjdHJsICsgRlNMX1FETUFfRFNSKTsKKwkJaWYgKCEocmVnICYgRlNMX1FETUFf RFNSX0RCKSkKKwkJCWJyZWFrOworCQlpZiAoY291bnQtLSA8IDApCisJCQlyZXR1cm4gLUVCVVNZ OworCQl1ZGVsYXkoMTAwKTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJsb2Nr X251bWJlcjsgaisrKSB7CisKKwkJYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZSArCisJCQlG U0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisKKwkJLyogRGlzYWJsZSBz dGF0dXMgcXVldWUuICovCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCAwLCBibG9jayArIEZTTF9R RE1BX0JTUU1SKTsKKworCQkvKgorCQkgKiBjbGVhciB0aGUgY29tbWFuZCBxdWV1ZSBpbnRlcnJ1 cHQgZGV0ZWN0IHJlZ2lzdGVyIGZvcgorCQkgKiBhbGwgcXVldWVzLgorCQkgKi8KKwkJcWRtYV93 cml0ZWwoZnNsX3FkbWEsIDB4ZmZmZmZmZmYsIGJsb2NrICsgRlNMX1FETUFfQkNRSURSKDApKTsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfcWRtYV9xdWV1ZV90cmFuc2Zl cl9jb21wbGV0ZSgKKwkJCQlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSwKKwkJCQl2 b2lkICpibG9jaywKKwkJCQlpbnQgaWQpCit7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xf cXVldWUgPSBmc2xfcWRtYS0+cXVldWU7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfc3Rh dHVzID0gZnNsX3FkbWEtPnN0YXR1c1tpZF07CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICp0ZW1w X3F1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKnN0YXR1c19hZGRyOworCXN0cnVjdCBm c2xfcWRtYV9jb21wICpmc2xfY29tcCA9IE5VTEw7CisJdTMyIHJlZywgaTsKKwlib29sIGR1cGxp Y2F0ZSwgZHVwbGljYXRlX2hhbmRsZTsKKworCXdoaWxlICgxKSB7CisJCWR1cGxpY2F0ZSA9IDA7 CisJCWR1cGxpY2F0ZV9oYW5kbGUgPSAwOworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBi bG9jayArIEZTTF9RRE1BX0JTUVNSKTsKKwkJaWYgKHJlZyAmIEZTTF9RRE1BX0JTUVNSX1FFKQor CQkJcmV0dXJuIDA7CisKKwkJc3RhdHVzX2FkZHIgPSBmc2xfc3RhdHVzLT52aXJ0X2hlYWQ7CisK KwkJaWYgKHFkbWFfY2NkZl9nZXRfcXVldWUoc3RhdHVzX2FkZHIpID09CisJCSAgIF9fdGhpc19j cHVfcmVhZChwcmUucXVldWUpICYmCisJCQlxZG1hX2NjZGZfYWRkcl9nZXQ2NChzdGF0dXNfYWRk cikgPT0KKwkJCV9fdGhpc19jcHVfcmVhZChwcmUuYWRkcikpCisJCQlkdXBsaWNhdGUgPSAxOwor CQlpID0gcWRtYV9jY2RmX2dldF9xdWV1ZShzdGF0dXNfYWRkcikgKworCQkJaWQgKiBmc2xfcWRt YS0+bl9xdWV1ZXM7CisJCV9fdGhpc19jcHVfd3JpdGUocHJlLmFkZHIsIHFkbWFfY2NkZl9hZGRy X2dldDY0KHN0YXR1c19hZGRyKSk7CisJCV9fdGhpc19jcHVfd3JpdGUocHJlLnF1ZXVlLCBxZG1h X2NjZGZfZ2V0X3F1ZXVlKHN0YXR1c19hZGRyKSk7CisJCXRlbXBfcXVldWUgPSBmc2xfcXVldWUg KyBpOworCisJCXNwaW5fbG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCWlmIChsaXN0 X2VtcHR5KCZ0ZW1wX3F1ZXVlLT5jb21wX3VzZWQpKSB7CisJCQlpZiAoZHVwbGljYXRlKQorCQkJ CWR1cGxpY2F0ZV9oYW5kbGUgPSAxOworCQkJZWxzZSB7CisJCQkJc3Bpbl91bmxvY2soJnRlbXBf cXVldWUtPnF1ZXVlX2xvY2spOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJ CWZzbF9jb21wID0gbGlzdF9maXJzdF9lbnRyeSgmdGVtcF9xdWV1ZS0+Y29tcF91c2VkLAorCQkJ CQkJCXN0cnVjdCBmc2xfcWRtYV9jb21wLAorCQkJCQkJCWxpc3QpOworCQkJaWYgKGZzbF9jb21w LT5idXNfYWRkciArIDE2ICE9CisJCQkJX190aGlzX2NwdV9yZWFkKHByZS5hZGRyKSkgeworCQkJ CWlmIChkdXBsaWNhdGUpCisJCQkJCWR1cGxpY2F0ZV9oYW5kbGUgPSAxOworCQkJCWVsc2Ugewor CQkJCQlzcGluX3VubG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCQkJCXJldHVybiAt MTsKKwkJCQl9CisJCQl9CisKKwkJfQorCisJCWlmIChkdXBsaWNhdGVfaGFuZGxlKSB7CisJCQly ZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJCXJl ZyB8PSBGU0xfUURNQV9CU1FNUl9ESTsKKwkJCXFkbWFfZGVzY19hZGRyX3NldDY0KHN0YXR1c19h ZGRyLCAweDApOworCQkJZnNsX3N0YXR1cy0+dmlydF9oZWFkKys7CisJCQlpZiAoZnNsX3N0YXR1 cy0+dmlydF9oZWFkID09IGZzbF9zdGF0dXMtPmNxCisJCQkJCQkgICArIGZzbF9zdGF0dXMtPm5f Y3EpCisJCQkJZnNsX3N0YXR1cy0+dmlydF9oZWFkID0gZnNsX3N0YXR1cy0+Y3E7CisJCQlxZG1h X3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJCXNwaW5f dW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxp c3RfZGVsKCZmc2xfY29tcC0+bGlzdCk7CisKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwg YmxvY2sgKyBGU0xfUURNQV9CU1FNUik7CisJCXJlZyB8PSBGU0xfUURNQV9CU1FNUl9ESTsKKwkJ cWRtYV9kZXNjX2FkZHJfc2V0NjQoc3RhdHVzX2FkZHIsIDB4MCk7CisJCWZzbF9zdGF0dXMtPnZp cnRfaGVhZCsrOworCQlpZiAoZnNsX3N0YXR1cy0+dmlydF9oZWFkID09IGZzbF9zdGF0dXMtPmNx ICsgZnNsX3N0YXR1cy0+bl9jcSkKKwkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9IGZzbF9zdGF0 dXMtPmNxOworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JT UU1SKTsKKwkJc3Bpbl91bmxvY2soJnRlbXBfcXVldWUtPnF1ZXVlX2xvY2spOworCisJCXNwaW5f bG9jaygmZnNsX2NvbXAtPnFjaGFuLT52Y2hhbi5sb2NrKTsKKwkJdmNoYW5fY29va2llX2NvbXBs ZXRlKCZmc2xfY29tcC0+dmRlc2MpOworCQlmc2xfY29tcC0+cWNoYW4tPnN0YXR1cyA9IERNQV9D T01QTEVURTsKKwkJc3Bpbl91bmxvY2soJmZzbF9jb21wLT5xY2hhbi0+dmNoYW4ubG9jayk7CisJ fQorCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3FkbWFfZXJyb3JfaGFu ZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAq ZnNsX3FkbWEgPSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IGludHI7CisJdm9pZCBfX2lvbWVtICpz dGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisKKwlpbnRyID0gcWRtYV9yZWFkbChmc2xf cWRtYSwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisKKwlpZiAoaW50cikKKwkJZGV2X2Vycihm c2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJETUEgdHJhbnNhY3Rpb24gZXJyb3IhXG4iKTsKKworCXFk bWFfd3JpdGVsKGZzbF9xZG1hLCAweGZmZmZmZmZmLCBzdGF0dXMgKyBGU0xfUURNQV9ERURSKTsK KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfcWRtYV9x dWV1ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFf ZW5naW5lICpmc2xfcWRtYSA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50ciwgcmVnOworCXZv aWQgX19pb21lbSAqY3RybCA9IGZzbF9xZG1hLT5jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpi bG9jazsKKwlpbnQgaWQ7CisKKwlpZCA9IGlycSAtIGZzbF9xZG1hLT5pcnFfYmFzZTsKKwlpZiAo aWQgPCAwICYmIGlkID4gZnNsX3FkbWEtPmJsb2NrX251bWJlcikgeworCQlkZXZfZXJyKGZzbF9x ZG1hLT5kbWFfZGV2LmRldiwKKwkJCSJpcnEgJWQgaXMgd3JvbmcgaXJxX2Jhc2UgaXMgJWRcbiIs CisJCQlpcnEsIGZzbF9xZG1hLT5pcnFfYmFzZSk7CisJfQorCisJYmxvY2sgPSBmc2xfcWRtYS0+ YmxvY2tfYmFzZSArCisJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9xZG1hLCBpZCk7 CisKKwlpbnRyID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CQ1FJRFIo MCkpOworCisJaWYgKChpbnRyICYgRlNMX1FETUFfQ1FJRFJfU1FUKSAhPSAwKQorCQlpbnRyID0g ZnNsX3FkbWFfcXVldWVfdHJhbnNmZXJfY29tcGxldGUoZnNsX3FkbWEsIGJsb2NrLCBpZCk7CisK KwlpZiAoaW50ciAhPSAwKSB7CisJCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBG U0xfUURNQV9ETVIpOworCQlyZWcgfD0gRlNMX1FETUFfRE1SX0RRRDsKKwkJcWRtYV93cml0ZWwo ZnNsX3FkbWEsIHJlZywgY3RybCArIEZTTF9RRE1BX0RNUik7CisJCXFkbWFfd3JpdGVsKGZzbF9x ZG1hLCAwLCBibG9jayArIEZTTF9RRE1BX0JDUUlFUigwKSk7CisJCWRldl9lcnIoZnNsX3FkbWEt PmRtYV9kZXYuZGV2LCAiUURNQTogc3RhdHVzIGVyciFcbiIpOworCX0KKworCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCAweGZmZmZmZmZmLCBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisKKwly ZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK2ZzbF9xZG1hX2lycV9pbml0KHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCSAgc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAq ZnNsX3FkbWEpCit7CisJY2hhciBpcnFfbmFtZVsyMF07CisJaW50IGk7CisJaW50IGNwdTsKKwlp bnQgcmV0OworCisJZnNsX3FkbWEtPmVycm9yX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1l KHBkZXYsCisJCQkJCQkJInFkbWEtZXJyb3IiKTsKKwlpZiAoZnNsX3FkbWEtPmVycm9yX2lycSA8 IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHFkbWEgY29udHJvbGxlciBp cnEuXG4iKTsKKwkJcmV0dXJuIGZzbF9xZG1hLT5lcnJvcl9pcnE7CisJfQorCisJcmV0ID0gZGV2 bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+ZXJyb3JfaXJxLAorCQkJZnNsX3Fk bWFfZXJyb3JfaGFuZGxlciwgMCwgInFETUEgZXJyb3IiLCBmc2xfcWRtYSk7CisJaWYgKHJldCkg eworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCByZWdpc3RlciBxRE1BIGNvbnRyb2xsZXIg SVJRLlxuIik7CisJCXJldHVybiAgcmV0OworCX0KKworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRt YS0+YmxvY2tfbnVtYmVyOyBpKyspIHsKKwkJc3ByaW50ZihpcnFfbmFtZSwgInFkbWEtcXVldWUl ZCIsIGkpOworCQlmc2xfcWRtYS0+cXVldWVfaXJxW2ldID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5h bWUocGRldiwKKwkJCQkJCQkJaXJxX25hbWUpOworCisJCWlmIChmc2xfcWRtYS0+cXVldWVfaXJx W2ldIDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSAgICJDYW4ndCBnZXQgcWRt YSBxdWV1ZSAlZCBpcnEuXG4iLAorCQkJCSAgIGkpOworCQkJcmV0dXJuIGZzbF9xZG1hLT5xdWV1 ZV9pcnFbaV07CisJCX0KKworCQlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsCisJ CQkJICAgICAgZnNsX3FkbWEtPnF1ZXVlX2lycVtpXSwKKwkJCQkgICAgICBmc2xfcWRtYV9xdWV1 ZV9oYW5kbGVyLAorCQkJCSAgICAgIDAsCisJCQkJICAgICAgInFETUEgcXVldWUiLAorCQkJCSAg ICAgIGZzbF9xZG1hKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJ ICAgICAgICJDYW4ndCByZWdpc3RlciBxRE1BIHF1ZXVlIElSUS5cbiIpOworCQkJcmV0dXJuICBy ZXQ7CisJCX0KKworCQljcHUgPSBpICUgbnVtX29ubGluZV9jcHVzKCk7CisJCXJldCA9IGlycV9z ZXRfYWZmaW5pdHlfaGludChmc2xfcWRtYS0+cXVldWVfaXJxW2ldLAorCQkJCQkgICBnZXRfY3B1 X21hc2soY3B1KSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSAg ICAgICAiQ2FuJ3Qgc2V0IGNwdSAlZCBhZmZpbml0eSB0byBJUlEgJWQuXG4iLAorCQkJCWNwdSwK KwkJCQlmc2xfcWRtYS0+cXVldWVfaXJxW2ldKTsKKwkJCXJldHVybiAgcmV0OworCQl9CisKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFfaXJxX2V4aXQoCisJCXN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9x ZG1hKQoreworCWlmIChmc2xfcWRtYS0+cXVldWVfaXJxWzBdID09IGZzbF9xZG1hLT5lcnJvcl9p cnEpIHsKKwkJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+cXVldWVfaXJxWzBd LCBmc2xfcWRtYSk7CisJfSBlbHNlIHsKKwkJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xf cWRtYS0+cXVldWVfaXJxWzBdLCBmc2xfcWRtYSk7CisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRl diwgZnNsX3FkbWEtPmVycm9yX2lycSwgZnNsX3FkbWEpOworCX0KK30KKworc3RhdGljIGludCBm c2xfcWRtYV9yZWdfaW5pdChzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlz dHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9xZG1hLT5xdWV1ZTsKKwlzdHJ1 Y3QgZnNsX3FkbWFfcXVldWUgKnRlbXA7CisJdm9pZCBfX2lvbWVtICpjdHJsID0gZnNsX3FkbWEt PmN0cmxfYmFzZTsKKwl2b2lkIF9faW9tZW0gKnN0YXR1cyA9IGZzbF9xZG1hLT5zdGF0dXNfYmFz ZTsKKwl2b2lkIF9faW9tZW0gKmJsb2NrOworCWludCBpLCBqLCByZXQ7CisJdTMyIHJlZzsKKwor CS8qIFRyeSB0byBoYWx0IHRoZSBxRE1BIGVuZ2luZSBmaXJzdC4gKi8KKwlyZXQgPSBmc2xfcWRt YV9oYWx0KGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZnNsX3FkbWEtPmRtYV9k ZXYuZGV2LCAiRE1BIGhhbHQgZmFpbGVkISIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZvciAo aSA9IDA7IGkgPCBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBpKyspIHsKKwkJLyoKKwkJICogQ2xl YXIgdGhlIGNvbW1hbmQgcXVldWUgaW50ZXJydXB0IGRldGVjdCByZWdpc3RlciBmb3IKKwkJICog YWxsIHF1ZXVlcy4KKwkJICovCisKKwkJYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZSArCisJ CQlGU0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaSk7CisJCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCAweGZmZmZmZmZmLCBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisJfQor CisJZm9yIChqID0gMDsgaiA8IGZzbF9xZG1hLT5ibG9ja19udW1iZXI7IGorKykgeworCQlibG9j ayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlICsKKwkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VU KGZzbF9xZG1hLCBqKTsKKwkJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5uX3F1ZXVlczsgaSsr KSB7CisJCQl0ZW1wID0gZnNsX3F1ZXVlICsgaSArIChqICogZnNsX3FkbWEtPm5fcXVldWVzKTsK KwkJCS8qCisJCQkgKiBJbml0aWFsaXplIENvbW1hbmQgUXVldWUgcmVnaXN0ZXJzIHRvCisJCQkg KiBwb2ludCB0byB0aGUgZmlyc3QKKwkJCSAqIGNvbW1hbmQgZGVzY3JpcHRvciBpbiBtZW1vcnku CisJCQkgKiBEZXF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJCSAqIEVucXVldWUg UG9pbnRlciBBZGRyZXNzIFJlZ2lzdGVycworCQkJICovCisKKwkJCXFkbWFfd3JpdGVsKGZzbF9x ZG1hLCB0ZW1wLT5idXNfYWRkciwKKwkJCQkJICAgYmxvY2sgKyBGU0xfUURNQV9CQ1FEUEFfU0FE RFIoaSkpOworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHRlbXAtPmJ1c19hZGRyLAorCQkJCQkg ICBibG9jayArIEZTTF9RRE1BX0JDUUVQQV9TQUREUihpKSk7CisKKwkJCS8qIEluaXRpYWxpemUg dGhlIHF1ZXVlIG1vZGUuICovCisJCQlyZWcgPSBGU0xfUURNQV9CQ1FNUl9FTjsKKwkJCXJlZyB8 PSBGU0xfUURNQV9CQ1FNUl9DRF9USExEKGlsb2cyKHRlbXAtPm5fY3EpIC0gNCk7CisJCQlyZWcg fD0gRlNMX1FETUFfQkNRTVJfQ1FfU0laRShpbG9nMih0ZW1wLT5uX2NxKSAtIDYpOworCQkJcWRt YV93cml0ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihpKSk7CisJCX0K KworCQkvKgorCQkgKiBXb3JrYXJvdW5kIGZvciBlcnJhdHVtOiBFUlIwMTA4MTIuCisJCSAqIFdl IG11c3QgZW5hYmxlIFhPRkYgdG8gYXZvaWQgdGhlIGVucXVldWUgcmVqZWN0aW9uIG9jY3Vycy4K KwkJICogU2V0dGluZyBTUUNDTVIgRU5URVJfV00gdG8gMHgyMC4KKwkJICovCisKKwkJcWRtYV93 cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX1NRQ0NNUl9FTlRFUl9XTSwKKwkJCQkgICBibG9jayAr IEZTTF9RRE1BX1NRQ0NNUik7CisKKwkJLyoKKwkJICogSW5pdGlhbGl6ZSBzdGF0dXMgcXVldWUg cmVnaXN0ZXJzIHRvIHBvaW50IHRvIHRoZSBmaXJzdAorCQkgKiBjb21tYW5kIGRlc2NyaXB0b3Ig aW4gbWVtb3J5LgorCQkgKiBEZXF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJICog RW5xdWV1ZSBQb2ludGVyIEFkZHJlc3MgUmVnaXN0ZXJzCisJCSAqLworCisJCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCBmc2xfcWRtYS0+c3RhdHVzW2pdLT5idXNfYWRkciwKKwkJCQkgICBibG9jayAr IEZTTF9RRE1BX1NRRVBBUik7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBmc2xfcWRtYS0+c3Rh dHVzW2pdLT5idXNfYWRkciwKKwkJCQkgICBibG9jayArIEZTTF9RRE1BX1NRRFBBUik7CisJCS8q IEluaXRpYWxpemUgc3RhdHVzIHF1ZXVlIGludGVycnVwdC4gKi8KKwkJcWRtYV93cml0ZWwoZnNs X3FkbWEsIEZTTF9RRE1BX0JDUUlFUl9DUVRJRSwKKwkJCQkgICBibG9jayArIEZTTF9RRE1BX0JD UUlFUigwKSk7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9CU1FJQ1JfSUNFTiB8 CisJCQkJICAgRlNMX1FETUFfQlNRSUNSX0lDU1QoNSkgfCAweDgwMDAsCisJCQkJICAgYmxvY2sg KyBGU0xfUURNQV9CU1FJQ1IpOworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQ1FJ RVJfTUVJRSB8CisJCQkJICAgRlNMX1FETUFfQ1FJRVJfVEVJRSwKKwkJCQkgICBibG9jayArIEZT TF9RRE1BX0NRSUVSKTsKKworCQkvKiBJbml0aWFsaXplIHRoZSBzdGF0dXMgcXVldWUgbW9kZS4g Ki8KKwkJcmVnID0gRlNMX1FETUFfQlNRTVJfRU47CisJCXJlZyB8PSBGU0xfUURNQV9CU1FNUl9D UV9TSVpFKGlsb2cyKAorCQkJZnNsX3FkbWEtPnN0YXR1c1tqXS0+bl9jcSkgLSA2KTsKKworCQlx ZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJcmVn ID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CU1FNUik7CisKKwl9CisK KwkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgaW50ZXJydXB0IHJlZ2lzdGVyLiAqLworCXFkbWFf d3JpdGVsKGZzbF9xZG1hLCAweGZmZmZmZmZmLCBzdGF0dXMgKyBGU0xfUURNQV9ERURSKTsKKwlx ZG1hX3dyaXRlbChmc2xfcWRtYSwgMHhmZmZmZmZmZiwgc3RhdHVzICsgRlNMX1FETUFfREVJRVIp OworCisJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RNUik7CisJ cmVnICY9IH5GU0xfUURNQV9ETVJfRFFEOworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGN0 cmwgKyBGU0xfUURNQV9ETVIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZG1h X2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorZnNsX3FkbWFfcHJlcF9tZW1jcHkoc3RydWN0IGRtYV9j aGFuICpjaGFuLCBkbWFfYWRkcl90IGRzdCwKKwkJZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4s IHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFu ID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqZnNsX2Nv bXA7CisKKwlmc2xfY29tcCA9IGZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKGZzbF9jaGFu KTsKKworCWlmICghZnNsX2NvbXApCisJCXJldHVybiBOVUxMOworCisJZnNsX3FkbWFfY29tcF9m aWxsX21lbWNweShmc2xfY29tcCwgZHN0LCBzcmMsIGxlbik7CisKKwlyZXR1cm4gdmNoYW5fdHhf cHJlcCgmZnNsX2NoYW4tPnZjaGFuLCAmZnNsX2NvbXAtPnZkZXNjLCBmbGFncyk7Cit9CisKK3N0 YXRpYyB2b2lkIGZzbF9xZG1hX2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNs X2NoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+ cXVldWU7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21wOworCXN0cnVjdCB2aXJ0X2Rt YV9kZXNjICp2ZGVzYzsKKwl2b2lkIF9faW9tZW0gKmJsb2NrID0gZnNsX3F1ZXVlLT5ibG9ja19i YXNlOworCXUzMiByZWc7CisKKwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9jaGFuLT5xZG1hLCBibG9j ayArIEZTTF9RRE1BX0JDUVNSKGZzbF9xdWV1ZS0+aWQpKTsKKwlpZiAocmVnICYgKEZTTF9RRE1B X0JDUVNSX1FGIHwgRlNMX1FETUFfQkNRU1JfWE9GRikpCisJCXJldHVybjsKKwl2ZGVzYyA9IHZj aGFuX25leHRfZGVzYygmZnNsX2NoYW4tPnZjaGFuKTsKKwlpZiAoIXZkZXNjKQorCQlyZXR1cm47 CisJbGlzdF9kZWwoJnZkZXNjLT5ub2RlKTsKKwlmc2xfY29tcCA9IHRvX2ZzbF9xZG1hX2NvbXAo dmRlc2MpOworCisJbWVtY3B5KGZzbF9xdWV1ZS0+dmlydF9oZWFkKyssIGZzbF9jb21wLT52aXJ0 X2FkZHIsIDE2KTsKKwlpZiAoZnNsX3F1ZXVlLT52aXJ0X2hlYWQgPT0gZnNsX3F1ZXVlLT5jcSAr IGZzbF9xdWV1ZS0+bl9jcSkKKwkJZnNsX3F1ZXVlLT52aXJ0X2hlYWQgPSBmc2xfcXVldWUtPmNx OworCisJbGlzdF9hZGRfdGFpbCgmZnNsX2NvbXAtPmxpc3QsICZmc2xfcXVldWUtPmNvbXBfdXNl ZCk7CisJYmFycmllcigpOworCXJlZyA9IHFkbWFfcmVhZGwoZnNsX2NoYW4tPnFkbWEsIGJsb2Nr ICsgRlNMX1FETUFfQkNRTVIoZnNsX3F1ZXVlLT5pZCkpOworCXJlZyB8PSBGU0xfUURNQV9CQ1FN Ul9FSTsKKwlxZG1hX3dyaXRlbChmc2xfY2hhbi0+cWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1B X0JDUU1SKGZzbF9xdWV1ZS0+aWQpKTsKKwlmc2xfY2hhbi0+c3RhdHVzID0gRE1BX0lOX1BST0dS RVNTOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzIGZzbF9xZG1hX3R4X3N0YXR1cyhzdHJ1 Y3QgZG1hX2NoYW4gKmNoYW4sCisJCWRtYV9jb29raWVfdCBjb29raWUsIHN0cnVjdCBkbWFfdHhf c3RhdGUgKnR4c3RhdGUpCit7CisJcmV0dXJuIGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tp ZSwgdHhzdGF0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2ZyZWVfZGVzYyhzdHJ1Y3Qg dmlydF9kbWFfZGVzYyAqdmRlc2MpCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21w OworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisKKwlmc2xfY29tcCA9IHRvX2ZzbF9xZG1hX2NvbXAodmRlc2MpOworCWZzbF9xdWV1ZSA9 IGZzbF9jb21wLT5xY2hhbi0+cXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnNsX3F1ZXVl LT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmZnNsX2NvbXAtPmxpc3QsICZm c2xfcXVldWUtPmNvbXBfZnJlZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX3F1ZXVl LT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2lzc3VlX3Bl bmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpm c2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVl ICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlzcGlu X2xvY2soJmZzbF9jaGFuLT52Y2hhbi5sb2NrKTsKKwlpZiAodmNoYW5faXNzdWVfcGVuZGluZygm ZnNsX2NoYW4tPnZjaGFuKSkKKwkJZnNsX3FkbWFfZW5xdWV1ZV9kZXNjKGZzbF9jaGFuKTsKKwlz cGluX3VubG9jaygmZnNsX2NoYW4tPnZjaGFuLmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmZzbF9xdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmc2xf cWRtYV9zeW5jaHJvbml6ZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9x ZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKworCXZjaGFuX3N5 bmNocm9uaXplKCZmc2xfY2hhbi0+dmNoYW4pOworfQorCitzdGF0aWMgaW50IGZzbF9xZG1hX3Rl cm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBmc2xfcWRtYV9j aGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZnNsX2NoYW4t PnZjaGFuLmxvY2ssIGZsYWdzKTsKKwl2Y2hhbl9nZXRfYWxsX2Rlc2NyaXB0b3JzKCZmc2xfY2hh bi0+dmNoYW4sICZoZWFkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc2xfY2hhbi0+dmNo YW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2RtYV9kZXNjX2ZyZWVfbGlzdCgmZnNsX2NoYW4tPnZj aGFuLCAmaGVhZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfYWxsb2Nf Y2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBmc2xfcWRt YV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGZzbF9x ZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJc3RydWN0IGZzbF9xZG1h X2VuZ2luZSAqZnNsX3FkbWEgPSBmc2xfY2hhbi0+cWRtYTsKKwlpbnQgcmV0OworCisJaWYgKGZz bF9xdWV1ZS0+Y29tcF9wb29sICYmIGZzbF9xdWV1ZS0+ZGVzY19wb29sKQorCQlyZXR1cm4gZnNs X3FkbWEtPmRlc2NfYWxsb2NhdGVkOworCisJSU5JVF9MSVNUX0hFQUQoJmZzbF9xdWV1ZS0+Y29t cF9mcmVlKTsKKworCS8qCisJICogVGhlIGRtYSBwb29sIGZvciBxdWV1ZSBjb21tYW5kIGJ1ZmZl cgorCSAqLworCWZzbF9xdWV1ZS0+Y29tcF9wb29sID0KKwlkbWFfcG9vbF9jcmVhdGUoImNvbXBf cG9vbCIsCisJCSAgICAgICBjaGFuLT5kZXZpY2UtPmRldiwKKwkJICAgICAgIEZTTF9RRE1BX0NP TU1BTkRfQlVGRkVSX1NJWkUsCisJCSAgICAgICA2NCwgMCk7CisJaWYgKCFmc2xfcXVldWUtPmNv bXBfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKgorCSAqIFRoZSBkbWEgcG9vbCBmb3Ig RGVzY3JpcHRvcihTRC9ERCkgYnVmZmVyCisJICovCisJZnNsX3F1ZXVlLT5kZXNjX3Bvb2wgPQor CWRtYV9wb29sX2NyZWF0ZSgiZGVzY19wb29sIiwKKwkJICAgICAgIGNoYW4tPmRldmljZS0+ZGV2 LAorCQkgICAgICAgRlNMX1FETUFfREVTQ1JJUFRPUl9CVUZGRVJfU0laRSwKKwkJICAgICAgIDMy LCAwKTsKKwlpZiAoIWZzbF9xdWV1ZS0+ZGVzY19wb29sKQorCQlnb3RvIGVycl9kZXNjX3Bvb2w7 CisKKwlyZXQgPSBmc2xfcWRtYV9wcmVfcmVxdWVzdF9lbnF1ZXVlX2NvbXBfZGVzYyhmc2xfcXVl dWUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgImZhaWxlZCB0 byBhbGxvYyBkbWEgYnVmZmVyIGZvciAiCisJCQkJImNvbXAgUy9HIGRlc2NyaXB0b3JcbiIpOwor CQlnb3RvIGVycl9tZW07CisJfQorCisJcmV0ID0gZnNsX3FkbWFfcHJlX3JlcXVlc3RfZW5xdWV1 ZV9zZF9kZXNjKGZzbF9xdWV1ZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGNoYW4tPmRldmlj ZS0+ZGV2LCAiZmFpbGVkIHRvIGFsbG9jIGRtYSBidWZmZXIgZm9yICIKKwkJCQkiUy9EIGRlc2Ny aXB0b3JcbiIpOworCQlnb3RvIGVycl9tZW07CisJfQorCisJZnNsX3FkbWEtPmRlc2NfYWxsb2Nh dGVkKys7CisJcmV0dXJuIGZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZDsKKworZXJyX21lbToKKwlk bWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19wb29sKTsKK2Vycl9kZXNjX3Bvb2w6CisJ ZG1hX3Bvb2xfZGVzdHJveShmc2xfcXVldWUtPmNvbXBfcG9vbCk7CisJcmV0dXJuIC1FTk9NRU07 Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAq cGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJ c3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWE7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4g KmZzbF9jaGFuOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGludCBsZW4sIGNo YW5zLCBxdWV1ZXM7CisJaW50IHJldCwgaTsKKwlpbnQgYmxrX251bTsKKwlpbnQgYmxrX29mZjsK KworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiY2hhbm5lbHMiLCAmY2hhbnMpOwor CWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IGNoYW5uZWxzLlxu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAs ICJibG9jay1vZmZzZXQiLCAmYmxrX29mZik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJDYW4ndCBnZXQgYmxvY2stb2Zmc2V0LlxuIik7CisJCXJldHVybiByZXQ7CisJfQor CisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJibG9jay1udW1iZXIiLCAmYmxrX251 bSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgYmxvY2st bnVtYmVyLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJYmxrX251bSA9IG1pbl90KGludCwg YmxrX251bSwgbnVtX29ubGluZV9jcHVzKCkpOworCisJbGVuID0gc2l6ZW9mKCpmc2xfcWRtYSk7 CisJZnNsX3FkbWEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsK KwlpZiAoIWZzbF9xZG1hKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IHNpemVvZigqZnNs X2NoYW4pICogY2hhbnM7CisJZnNsX3FkbWEtPmNoYW5zID0gZGV2bV9remFsbG9jKCZwZGV2LT5k ZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmc2xfcWRtYS0+Y2hhbnMpCisJCXJldHVybiAt RU5PTUVNOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqKSAqIGJsa19u dW07CisJZnNsX3FkbWEtPnN0YXR1cyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdG UF9LRVJORUwpOworCWlmICghZnNsX3FkbWEtPnN0YXR1cykKKwkJcmV0dXJuIC1FTk9NRU07CisK KwlsZW4gPSBzaXplb2YoaW50KSAqIGJsa19udW07CisJZnNsX3FkbWEtPnF1ZXVlX2lycSA9IGRl dm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghZnNsX3FkbWEt PnF1ZXVlX2lycSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFk X3UzMihucCwgInF1ZXVlcyIsICZxdWV1ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiQ2FuJ3QgZ2V0IHF1ZXVlcy5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZz bF9xZG1hLT5kZXNjX2FsbG9jYXRlZCA9IDA7CisJZnNsX3FkbWEtPm5fY2hhbnMgPSBjaGFuczsK Kwlmc2xfcWRtYS0+bl9xdWV1ZXMgPSBxdWV1ZXM7CisJZnNsX3FkbWEtPmJsb2NrX251bWJlciA9 IGJsa19udW07CisJZnNsX3FkbWEtPmJsb2NrX29mZnNldCA9IGJsa19vZmY7CisKKwltdXRleF9p bml0KCZmc2xfcWRtYS0+ZnNsX3FkbWFfbXV0ZXgpOworCisJZm9yIChpID0gMDsgaSA8IGZzbF9x ZG1hLT5ibG9ja19udW1iZXI7IGkrKykgeworCQlmc2xfcWRtYS0+c3RhdHVzW2ldID0gZnNsX3Fk bWFfcHJlcF9zdGF0dXNfcXVldWUocGRldik7CisJCWlmICghZnNsX3FkbWEtPnN0YXR1c1tpXSkK KwkJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRl diwgSU9SRVNPVVJDRV9NRU0sIDApOworCWZzbF9xZG1hLT5jdHJsX2Jhc2UgPSBkZXZtX2lvcmVt YXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGZzbF9xZG1hLT5jdHJs X2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihmc2xfcWRtYS0+Y3RybF9iYXNlKTsKKworCXJlcyA9 IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMSk7CisJZnNsX3Fk bWEtPnN0YXR1c19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7 CisJaWYgKElTX0VSUihmc2xfcWRtYS0+c3RhdHVzX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihm c2xfcWRtYS0+c3RhdHVzX2Jhc2UpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBk ZXYsIElPUkVTT1VSQ0VfTUVNLCAyKTsKKwlmc2xfcWRtYS0+YmxvY2tfYmFzZSA9IGRldm1faW9y ZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPmJs b2NrX2Jhc2UpKQorCQlyZXR1cm4gUFRSX0VSUihmc2xfcWRtYS0+YmxvY2tfYmFzZSk7CisJZnNs X3FkbWEtPnF1ZXVlID0gZnNsX3FkbWFfYWxsb2NfcXVldWVfcmVzb3VyY2VzKHBkZXYsIGZzbF9x ZG1hKTsKKwlpZiAoIWZzbF9xZG1hLT5xdWV1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQg PSBmc2xfcWRtYV9pcnFfaW5pdChwZGV2LCBmc2xfcWRtYSk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCWZzbF9xZG1hLT5pcnFfYmFzZSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBk ZXYsICJxZG1hLXF1ZXVlMCIpOworCWZzbF9xZG1hLT5mZWF0dXJlID0gb2ZfcHJvcGVydHlfcmVh ZF9ib29sKG5wLCAiYmlnLWVuZGlhbiIpOworCUlOSVRfTElTVF9IRUFEKCZmc2xfcWRtYS0+ZG1h X2Rldi5jaGFubmVscyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnNsX3FkbWEtPm5fY2hhbnM7IGkr KykgeworCQlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSAmZnNsX3FkbWEtPmNoYW5z W2ldOworCisJCWZzbF9jaGFuLT5xZG1hID0gZnNsX3FkbWE7CisJCWZzbF9jaGFuLT5xdWV1ZSA9 IGZzbF9xZG1hLT5xdWV1ZSArIGkgJSAoZnNsX3FkbWEtPm5fcXVldWVzICoKKwkJCQkJCQlmc2xf cWRtYS0+YmxvY2tfbnVtYmVyKTsKKwkJZnNsX2NoYW4tPnZjaGFuLmRlc2NfZnJlZSA9IGZzbF9x ZG1hX2ZyZWVfZGVzYzsKKwkJdmNoYW5faW5pdCgmZnNsX2NoYW4tPnZjaGFuLCAmZnNsX3FkbWEt PmRtYV9kZXYpOworCX0KKworCWRtYV9jYXBfc2V0KERNQV9NRU1DUFksIGZzbF9xZG1hLT5kbWFf ZGV2LmNhcF9tYXNrKTsKKworCWZzbF9xZG1hLT5kbWFfZGV2LmRldiA9ICZwZGV2LT5kZXY7CisJ ZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX2ZyZWVfY2hhbl9yZXNvdXJjZXMKKwkJPSBmc2xfcWRt YV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9hbGxvY19j aGFuX3Jlc291cmNlcworCQk9IGZzbF9xZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzOworCWZzbF9x ZG1hLT5kbWFfZGV2LmRldmljZV90eF9zdGF0dXMgPSBmc2xfcWRtYV90eF9zdGF0dXM7CisJZnNs X3FkbWEtPmRtYV9kZXYuZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGZzbF9xZG1hX3ByZXBfbWVt Y3B5OworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9pc3N1ZV9wZW5kaW5nID0gZnNsX3FkbWFf aXNzdWVfcGVuZGluZzsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2Vfc3luY2hyb25pemUgPSBm c2xfcWRtYV9zeW5jaHJvbml6ZTsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfdGVybWluYXRl X2FsbCA9IGZzbF9xZG1hX3Rlcm1pbmF0ZV9hbGw7CisKKwlkbWFfc2V0X21hc2soJnBkZXYtPmRl diwgRE1BX0JJVF9NQVNLKDQwKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBmc2xf cWRtYSk7CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZmc2xfcWRtYS0+ZG1h X2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiQ2FuJ3QgcmVn aXN0ZXIgTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9 CisKKwlyZXQgPSBmc2xfcWRtYV9yZWdfaW5pdChmc2xfcWRtYSk7CisJaWYgKHJldCkgeworCQlk ZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBJbml0aWFsaXplIHRoZSBxRE1BIGVuZ2luZS5cbiIp OworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmc2xf cWRtYV9jbGVhbnVwX3ZjaGFuKHN0cnVjdCBkbWFfZGV2aWNlICpkbWFkZXYpCit7CisJc3RydWN0 IGZzbF9xZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm ZShjaGFuLCBfY2hhbiwKKwkJCQkmZG1hZGV2LT5jaGFubmVscywgdmNoYW4uY2hhbi5kZXZpY2Vf bm9kZSkgeworCQlsaXN0X2RlbCgmY2hhbi0+dmNoYW4uY2hhbi5kZXZpY2Vfbm9kZSk7CisJCXRh c2tsZXRfa2lsbCgmY2hhbi0+dmNoYW4udGFzayk7CisJfQorfQorCitzdGF0aWMgaW50IGZzbF9x ZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZp Y2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5l ICpmc2xfcWRtYSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBmc2xfcWRt YV9xdWV1ZSAqc3RhdHVzOworCWludCBpOworCisJZnNsX3FkbWFfaXJxX2V4aXQocGRldiwgZnNs X3FkbWEpOworCWZzbF9xZG1hX2NsZWFudXBfdmNoYW4oJmZzbF9xZG1hLT5kbWFfZGV2KTsKKwlv Zl9kbWFfY29udHJvbGxlcl9mcmVlKG5wKTsKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIo JmZzbF9xZG1hLT5kbWFfZGV2KTsKKworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRtYS0+YmxvY2tf bnVtYmVyOyBpKyspIHsKKwkJc3RhdHVzID0gZnNsX3FkbWEtPnN0YXR1c1tpXTsKKwkJZG1hX2Zy ZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoK KwkJCQlzdGF0dXMtPm5fY3EsIHN0YXR1cy0+Y3EsIHN0YXR1cy0+YnVzX2FkZHIpOworCX0KKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX3FkbWFf ZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbHMxMDIxYS1xZG1hIiwgfSwKKwl7 IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2xfcWRtYV9k dF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBmc2xfcWRtYV9kcml2ZXIg PSB7CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gImZzbC1xZG1hIiwKKwkJLm9mX21hdGNoX3Rh YmxlID0gZnNsX3FkbWFfZHRfaWRzLAorCX0sCisJLnByb2JlICAgICAgICAgID0gZnNsX3FkbWFf cHJvYmUsCisJLnJlbW92ZQkJPSBmc2xfcWRtYV9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZv cm1fZHJpdmVyKGZzbF9xZG1hX2RyaXZlcik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06ZnNs LXFkbWEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUg ZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==