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: [v11,3/7] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs From: Peng Ma Message-Id: <20181030023604.34027-3-peng.ma@nxp.com> Date: Tue, 30 Oct 2018 10:36:00 +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 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KClNpZ25lZC1vZmYtYnk6IFdlbiBI ZSA8d2VuLmhlXzFAbnhwLmNvbT4KU2lnbmVkLW9mZi1ieTogSmlhaGVuZyBGYW4gPGppYWhlbmcu ZmFuQG54cC5jb20+ClNpZ25lZC1vZmYtYnk6IFBlbmcgTWEgPHBlbmcubWFAbnhwLmNvbT4KLS0t CmNoYW5nZSBpbiB2MTE6CgktIHJlbW92ZSBzb21lIHVzZWxlc3Mgbm90ZXMKCS0gYWRkIGRyaXZl ciB3b3JrIG9uIGluIEtjb25maWcKCS0gYWRkIHByZXZpb3VzIGNvcHlyaWdodCBjbGFpbXMKCiBk cml2ZXJzL2RtYS9LY29uZmlnICAgIHwgICAxNCArCiBkcml2ZXJzL2RtYS9NYWtlZmlsZSAgIHwg ICAgMSArCiBkcml2ZXJzL2RtYS9mc2wtcWRtYS5jIHwgMTI1OCArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTI3MyBpbnNl cnRpb25zKCspLCAwIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1h L2ZzbC1xZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9k bWEvS2NvbmZpZwppbmRleCBkYWNmM2Y0Li4zY2RhZjg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Rt YS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTIxOCw2ICsyMTgsMjAgQEAg Y29uZmlnIEZTTF9FRE1BCiAJICBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSBmb3IgRE1BIHJlcXVl c3Qgc291cmNlcyhzbG90KS4KIAkgIFRoaXMgbW9kdWxlIGNhbiBiZSBmb3VuZCBvbiBGcmVlc2Nh bGUgVnlicmlkIGFuZCBMUy0xIFNvQ3MuCiAKK2NvbmZpZyBGU0xfUURNQQorICAgICAgIHRyaXN0 YXRlICJOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2luZSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMg b24gQVJNIHx8IEFSTTY0CisgICAgICAgc2VsZWN0IERNQV9FTkdJTkUKKyAgICAgICBzZWxlY3Qg RE1BX1ZJUlRVQUxfQ0hBTk5FTFMKKyAgICAgICBzZWxlY3QgRE1BX0VOR0lORV9SQUlECisgICAg ICAgc2VsZWN0IEFTWU5DX1RYX0VOQUJMRV9DSEFOTkVMX1NXSVRDSAorICAgICAgIGhlbHAKKyAg ICAgICAgIFN1cHBvcnQgdGhlIE5YUCBMYXllcnNjYXBlIHFETUEgZW5naW5lIHdpdGggY29tbWFu ZCBxdWV1ZSBhbmQgbGVnYWN5IG1vZGUuCisgICAgICAgICBDaGFubmVsIHZpcnR1YWxpemF0aW9u IGlzIHN1cHBvcnRlZCB0aHJvdWdoIGVucXVldWluZyBvZiBETUEgam9icyB0bywKKyAgICAgICAg IG9yIGRlcXVldWluZyBETUEgam9icyBmcm9tLCBkaWZmZXJlbnQgd29yayBxdWV1ZXMuCisgICAg ICAgICBUaGlzIG1vZHVsZSBjYW4gYmUgZm91bmQgb24gTlhQIExheWVyc2NhcGUgU29Dcy4KKwkg IFRoZSBxZG1hIGRyaXZlciBvbmx5IHdvcmsgb24gIFNvQ3Mgd2l0aCBhIERQQUEgaGFyZHdhcmUg YmxvY2suCisKIGNvbmZpZyBGU0xfUkFJRAogICAgICAgICB0cmlzdGF0ZSAiRnJlZXNjYWxlIFJB SUQgZW5naW5lIFN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gRlNMX1NPQyAmJiAhQVNZTkNf VFhfRU5BQkxFX0NIQU5ORUxfU1dJVENICmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9NYWtlZmls ZSBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCmluZGV4IGM5MTcwMmQuLjJkMWI1ODYgMTAwNjQ0Ci0t LSBhL2RyaXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC0z Miw2ICszMiw3IEBAIG9iai0kKENPTkZJR19EV19ETUFDX0NPUkUpICs9IGR3Lwogb2JqLSQoQ09O RklHX0VQOTNYWF9ETUEpICs9IGVwOTN4eF9kbWEubwogb2JqLSQoQ09ORklHX0ZTTF9ETUEpICs9 IGZzbGRtYS5vCiBvYmotJChDT05GSUdfRlNMX0VETUEpICs9IGZzbC1lZG1hLm8KK29iai0kKENP TkZJR19GU0xfUURNQSkgKz0gZnNsLXFkbWEubwogb2JqLSQoQ09ORklHX0ZTTF9SQUlEKSArPSBm c2xfcmFpZC5vCiBvYmotJChDT05GSUdfSFNVX0RNQSkgKz0gaHN1Lwogb2JqLSQoQ09ORklHX0lN R19NRENfRE1BKSArPSBpbWctbWRjLWRtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9mc2wt cWRtYS5jIGIvZHJpdmVycy9kbWEvZnNsLXFkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwLi5jMThlMzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvZnNsLXFk bWEuYwpAQCAtMCwwICsxLDEyNTggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wCisvLyBDb3B5cmlnaHQgMjAxNC0yMDE1IEZyZWVzY2FsZQorLy8gQ29weXJpZ2h0IDIwMTgg TlhQCisKKy8qCisgKiBEcml2ZXIgZm9yIE5YUCBMYXllcnNjYXBlIFF1ZXVlIERpcmVjdCBNZW1v cnkgQWNjZXNzIENvbnRyb2xsZXIKKyAqCisgKiBBdXRob3I6CisgKiAgV2VuIEhlIDx3ZW4uaGVf MUBueHAuY29tPgorICogIEppYWhlbmcgRmFuIDxqaWFoZW5nLmZhbkBueHAuY29tPgorICoKKyAq LworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4K KyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5o PgorI2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5n Lmg+CisKKyNpbmNsdWRlICJ2aXJ0LWRtYS5oIgorI2luY2x1ZGUgImZzbGRtYS5oIgorCisvKiBS ZWdpc3RlciByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlNMX1FETUFfRE1SCQkJMHgw CisjZGVmaW5lIEZTTF9RRE1BX0RTUgkJCTB4NAorI2RlZmluZSBGU0xfUURNQV9ERUlFUgkJCTB4 ZTAwCisjZGVmaW5lIEZTTF9RRE1BX0RFRFIJCQkweGUwNAorI2RlZmluZSBGU0xfUURNQV9ERUNG RFcwUgkJMHhlMTAKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXMVIJCTB4ZTE0CisjZGVmaW5lIEZT TF9RRE1BX0RFQ0ZEVzJSCQkweGUxOAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFczUgkJMHhlMWMK KyNkZWZpbmUgRlNMX1FETUFfREVDRlFJRFIJCTB4ZTMwCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0JS CQkJMHhlMzQKKworI2RlZmluZSBGU0xfUURNQV9CQ1FNUih4KQkJKDB4YzAgKyAweDEwMCAqICh4 KSkKKyNkZWZpbmUgRlNMX1FETUFfQkNRU1IoeCkJCSgweGM0ICsgMHgxMDAgKiAoeCkpCisjZGVm aW5lIEZTTF9RRE1BX0JDUUVEUEFfU0FERFIoeCkJKDB4YzggKyAweDEwMCAqICh4KSkKKyNkZWZp bmUgRlNMX1FETUFfQkNRRFBBX1NBRERSKHgpCSgweGNjICsgMHgxMDAgKiAoeCkpCisjZGVmaW5l IEZTTF9RRE1BX0JDUUVFUEFfU0FERFIoeCkJKDB4ZDAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUg RlNMX1FETUFfQkNRRVBBX1NBRERSKHgpCSgweGQ0ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZT TF9RRE1BX0JDUUlFUih4KQkJKDB4ZTAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUgRlNMX1FETUFf QkNRSURSKHgpCQkoMHhlNCArIDB4MTAwICogKHgpKQorCisjZGVmaW5lIEZTTF9RRE1BX1NRRFBB UgkJCTB4ODBjCisjZGVmaW5lIEZTTF9RRE1BX1NRRVBBUgkJCTB4ODE0CisjZGVmaW5lIEZTTF9R RE1BX0JTUU1SCQkJMHg4MDAKKyNkZWZpbmUgRlNMX1FETUFfQlNRU1IJCQkweDgwNAorI2RlZmlu ZSBGU0xfUURNQV9CU1FJQ1IJCQkweDgyOAorI2RlZmluZSBGU0xfUURNQV9DUU1SCQkJMHhhMDAK KyNkZWZpbmUgRlNMX1FETUFfQ1FEU0NSMQkJMHhhMDgKKyNkZWZpbmUgRlNMX1FETUFfQ1FEU0NS MiAgICAgICAgICAgICAgICAweGEwYworI2RlZmluZSBGU0xfUURNQV9DUUlFUgkJCTB4YTEwCisj ZGVmaW5lIEZTTF9RRE1BX0NRRURSCQkJMHhhMTQKKyNkZWZpbmUgRlNMX1FETUFfU1FDQ01SCQkJ MHhhMjAKKworLyogUmVnaXN0ZXJzIGZvciBiaXQgYW5kIGdlbm1hc2sgKi8KKyNkZWZpbmUgRlNM X1FETUFfQ1FJRFJfU1FUCQlCSVQoMTUpCisjZGVmaW5lIFFETUFfQ0NERl9GT1RNQVQJCUJJVCgy OSkKKyNkZWZpbmUgUURNQV9DQ0RGX1NFUgkJCUJJVCgzMCkKKyNkZWZpbmUgUURNQV9TR19GSU4J CQlCSVQoMzApCisjZGVmaW5lIFFETUFfU0dfTEVOX01BU0sJCUdFTk1BU0soMjksIDApCisjZGVm aW5lIFFETUFfQ0NERl9NQVNLCQkJR0VOTUFTSygyOCwgMjApCisKKyNkZWZpbmUgRlNMX1FETUFf REVEUl9DTEVBUgkJR0VOTUFTSygzMSwgMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRSURSX0NMRUFS CQlHRU5NQVNLKDMxLCAwKQorI2RlZmluZSBGU0xfUURNQV9ERUlFUl9DTEVBUgkJR0VOTUFTSygz MSwgMCkKKworI2RlZmluZSBGU0xfUURNQV9CQ1FJRVJfQ1FUSUUJCUJJVCgxNSkKKyNkZWZpbmUg RlNMX1FETUFfQkNRSUVSX0NRUEVJRQkJQklUKDIzKQorI2RlZmluZSBGU0xfUURNQV9CU1FJQ1Jf SUNFTgkJQklUKDMxKQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUUlDUl9JQ1NUKHgpCQkoKHgpIDw8 IDE2KQorI2RlZmluZSBGU0xfUURNQV9DUUlFUl9NRUlFCQlCSVQoMzEpCisjZGVmaW5lIEZTTF9R RE1BX0NRSUVSX1RFSUUJCUJJVCgwKQorI2RlZmluZSBGU0xfUURNQV9TUUNDTVJfRU5URVJfV00J QklUKDIxKQorCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1SX0VOCQlCSVQoMzEpCisjZGVmaW5lIEZT TF9RRE1BX0JDUU1SX0VJCQlCSVQoMzApCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1SX0NEX1RITEQo eCkJKCh4KSA8PCAyMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfQ1FfU0laRSh4KQkoKHgpIDw8 IDE2KQorCisjZGVmaW5lIEZTTF9RRE1BX0JDUVNSX1FGCQlCSVQoMTYpCisjZGVmaW5lIEZTTF9R RE1BX0JDUVNSX1hPRkYJCUJJVCgwKQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUU1SX0VOCQlCSVQo MzEpCisjZGVmaW5lIEZTTF9RRE1BX0JTUU1SX0RJCQlCSVQoMzApCisjZGVmaW5lIEZTTF9RRE1B X0JTUU1SX0NRX1NJWkUoeCkJKCh4KSA8PCAxNikKKworI2RlZmluZSBGU0xfUURNQV9CU1FTUl9R RQkJQklUKDE3KQorCisjZGVmaW5lIEZTTF9RRE1BX0RNUl9EUUQJCUJJVCgzMCkKKyNkZWZpbmUg RlNMX1FETUFfRFNSX0RCCQlCSVQoMzEpCisKKy8qIFNpemUgcmVsYXRlZCBkZWZpbml0aW9uICov CisjZGVmaW5lIEZTTF9RRE1BX1FVRVVFX01BWAkJOAorI2RlZmluZSBGU0xfUURNQV9DT01NQU5E X0JVRkZFUl9TSVpFCTY0CisjZGVmaW5lIEZTTF9RRE1BX0RFU0NSSVBUT1JfQlVGRkVSX1NJWkUg MzIKKyNkZWZpbmUgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01JTgk2NAorI2RlZmluZSBG U0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYCTE2Mzg0CisjZGVmaW5lIEZTTF9RRE1BX1FV RVVFX05VTV9NQVgJCTgKKworLyogRmllbGQgZGVmaW5pdGlvbiBmb3IgQ01EICovCisjZGVmaW5l IEZTTF9RRE1BX0NNRF9SV1RUWVBFCQkweDQKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0xXQyAgICAg ICAgICAgICAgICAweDIKKyNkZWZpbmUgRlNMX1FETUFfQ01EX1JXVFRZUEVfT0ZGU0VUCTI4Cisj ZGVmaW5lIEZTTF9RRE1BX0NNRF9OU19PRkZTRVQJCTI3CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9E UU9TX09GRlNFVAkyNAorI2RlZmluZSBGU0xfUURNQV9DTURfV1RIUk9UTF9PRkZTRVQJMjAKKyNk ZWZpbmUgRlNMX1FETUFfQ01EX0RTRU5fT0ZGU0VUCTE5CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9M V0NfT0ZGU0VUCQkxNgorCisvKiBGaWVsZCBkZWZpbml0aW9uIGZvciBEZXNjcmlwdG9yIG9mZnNl dCAqLworI2RlZmluZSBRRE1BX0NDREZfU1RBVFVTCQkyMAorI2RlZmluZSBRRE1BX0NDREZfT0ZG U0VUCQkyMAorCisvKiBGaWVsZCBkZWZpbml0aW9uIGZvciBzYWZlIGxvb3AgY291bnQqLworI2Rl ZmluZSBGU0xfUURNQV9IQUxUX0NPVU5UCQkxNTAwCisjZGVmaW5lIEZTTF9RRE1BX01BWF9TSVpF CQkxNjM4NQorI2RlZmluZQlGU0xfUURNQV9DT01QX1RJTUVPVVQJCTEwMDAKKyNkZWZpbmUgRlNM X0NPTU1BTkRfUVVFVUVfT1ZFUkZMTE9XCTEwCisKKyNkZWZpbmUgRlNMX1FETUFfQkxPQ0tfQkFT RV9PRkZTRVQoZnNsX3FkbWFfZW5naW5lLCB4KQkJCVwKKwkoKChmc2xfcWRtYV9lbmdpbmUpLT5i bG9ja19vZmZzZXQpICogKHgpKQorCisvKioKKyAqIHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgLSBU aGlzIGlzIHRoZSBzdHJ1Y3QgaG9sZGluZyBkZXNjcmliaW5nIGNvbXBvdW5kCisgKgkJCSAgICBk ZXNjcmlwdG9yIGZvcm1hdCB3aXRoIHFETUEuCisgKiBAc3RhdHVzOgkJICAgIENvbW1hbmQgc3Rh dHVzIGFuZCBlbnF1ZXVlIHN0YXR1cyBub3RpZmljYXRpb24uCisgKiBAY2ZnOgkJICAgIEZyYW1l IG9mZnNldCBhbmQgZnJhbWUgZm9ybWF0LgorICogQGFkZHJfbG86CQkgICAgSG9sZGluZyB0aGUg Y29tcG91bmQgZGVzY3JpcHRvciBvZiB0aGUgbG93ZXIKKyAqCQkJICAgIDMyLWJpdHMgYWRkcmVz cyBpbiBtZW1vcnkgNDAtYml0IGFkZHJlc3MuCisgKiBAYWRkcl9oaToJCSAgICBTYW1lIGFzIGFi b3ZlIG1lbWJlciwgYnV0IHBvaW50IGhpZ2ggOC1iaXRzIGluCisgKgkJCSAgICBtZW1vcnkgNDAt Yml0IGFkZHJlc3MuCisgKiBAX19yZXNlcnZlZDE6CSAgICBSZXNlcnZlZCBmaWVsZC4KKyAqIEBj Zmc4Yl93MToJCSAgICBDb21wb3VuZCBkZXNjcmlwdG9yIGNvbW1hbmQgcXVldWUgb3JpZ2luIHBy b2R1Y2VkCisgKgkJCSAgICBieSBxRE1BIGFuZCBkeW5hbWljIGRlYnVnIGZpZWxkLgorICogQGRh dGEJCSAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgNDAtYml0IGFkZHJlc3MsIGRlc2NyaWJlcyBE TUEKKyAqCQkJICAgIHNvdXJjZSBpbmZvcm1hdGlvbiBhbmQgRE1BIGRlc3RpbmF0aW9uIGluZm9y bWF0aW9uLgorICovCitzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0IHsKKwlfX2xlMzIgc3RhdHVzOwor CV9fbGUzMiBjZmc7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGFkZHJfbG87CisJ CQl1OCBhZGRyX2hpOworCQkJdTggX19yZXNlcnZlZDFbMl07CisJCQl1OCBjZmc4Yl93MTsKKwkJ fSBfX3BhY2tlZDsKKwkJX19sZTY0IGRhdGE7CisJfTsKK30gX19wYWNrZWQ7CisKKy8qIHFETUEg c3RhdHVzIG5vdGlmaWNhdGlvbiBwcmUgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBmc2xfcHJlX3N0 YXR1cyB7CisJdTY0IGFkZHI7CisJdTggcXVldWU7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9D UFUoc3RydWN0IGZzbF9wcmVfc3RhdHVzLCBwcmUpOworCitzdHJ1Y3QgZnNsX3FkbWFfY2hhbiB7 CisJc3RydWN0IHZpcnRfZG1hX2NoYW4JCXZjaGFuOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjCQl2 ZGVzYzsKKwllbnVtIGRtYV9zdGF0dXMJCQlzdGF0dXM7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2lu ZQkJKnFkbWE7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlCQkqcXVldWU7Cit9OworCitzdHJ1Y3Qg ZnNsX3FkbWFfcXVldWUgeworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKnZpcnRfaGVhZDsKKwlz dHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0X3RhaWw7CisJc3RydWN0IGxpc3RfaGVhZAljb21w X3VzZWQ7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX2ZyZWU7CisJc3RydWN0IGRtYV9wb29sCQkq Y29tcF9wb29sOworCXN0cnVjdCBkbWFfcG9vbAkJKmRlc2NfcG9vbDsKKwlzcGlubG9ja190CQlx dWV1ZV9sb2NrOworCWRtYV9hZGRyX3QJCWJ1c19hZGRyOworCXUzMiAgICAgICAgICAgICAgICAg ICAgIG5fY3E7CisJdTMyCQkJaWQ7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdAkqY3E7CisJdm9p ZCBfX2lvbWVtCQkqYmxvY2tfYmFzZTsKK307CisKK3N0cnVjdCBmc2xfcWRtYV9jb21wIHsKKwlk bWFfYWRkcl90ICAgICAgICAgICAgICBidXNfYWRkcjsKKwlkbWFfYWRkcl90ICAgICAgICAgICAg ICBkZXNjX2J1c19hZGRyOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKnZpcnRfYWRkcjsKKwlz dHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSpkZXNjX3ZpcnRfYWRkcjsKKwlzdHJ1Y3QgZnNsX3FkbWFf Y2hhbgkqcWNoYW47CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgICAgdmRlc2M7CisJc3RydWN0IGxp c3RfaGVhZAlsaXN0OworfTsKKworc3RydWN0IGZzbF9xZG1hX2VuZ2luZSB7CisJc3RydWN0IGRt YV9kZXZpY2UJZG1hX2RldjsKKwl2b2lkIF9faW9tZW0JCSpjdHJsX2Jhc2U7CisJdm9pZCBfX2lv bWVtICAgICAgICAgICAgKnN0YXR1c19iYXNlOworCXZvaWQgX19pb21lbQkJKmJsb2NrX2Jhc2U7 CisJdTMyCQkJbl9jaGFuczsKKwl1MzIJCQluX3F1ZXVlczsKKwlzdHJ1Y3QgbXV0ZXggICAgICAg ICAgICBmc2xfcWRtYV9tdXRleDsKKwlpbnQJCQllcnJvcl9pcnE7CisJaW50CQkJKnF1ZXVlX2ly cTsKKwl1MzIJCQlmZWF0dXJlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZQkqcXVldWU7CisJc3Ry dWN0IGZzbF9xZG1hX3F1ZXVlCSoqc3RhdHVzOworCXN0cnVjdCBmc2xfcWRtYV9jaGFuCSpjaGFu czsKKwlpbnQJCQlibG9ja19udW1iZXI7CisJaW50CQkJYmxvY2tfb2Zmc2V0OworCWludAkJCWly cV9iYXNlOworCWludAkJCWRlc2NfYWxsb2NhdGVkOworCit9OworCitzdGF0aWMgaW5saW5lIHU2 NAorcWRtYV9jY2RmX2FkZHJfZ2V0NjQoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2Nk ZikKK3sKKwlyZXR1cm4gbGU2NF90b19jcHUoY2NkZi0+ZGF0YSkgJiAoVTY0X01BWCA+PiAyNCk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWRtYV9kZXNjX2FkZHJfc2V0NjQoc3RydWN0IGZz bF9xZG1hX2Zvcm1hdCAqY2NkZiwgdTY0IGFkZHIpCit7CisJY2NkZi0+YWRkcl9oaSA9IHVwcGVy XzMyX2JpdHMoYWRkcik7CisJY2NkZi0+YWRkcl9sbyA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2Jp dHMoYWRkcikpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitxZG1hX2NjZGZfZ2V0X3F1ZXVlKGNv bnN0IHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCit7CisJcmV0dXJuIGNjZGYtPmNmZzhi X3cxICYgVThfTUFYOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRtYV9jY2RmX2dldF9vZmZz ZXQoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gKGxlMzJf dG9fY3B1KGNjZGYtPmNmZykgJiBRRE1BX0NDREZfTUFTSykgPj4gUURNQV9DQ0RGX09GRlNFVDsK K30KKworc3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0X2Zvcm1hdChzdHJ1Y3QgZnNs X3FkbWFfZm9ybWF0ICpjY2RmLCBpbnQgb2Zmc2V0KQoreworCWNjZGYtPmNmZyA9IGNwdV90b19s ZTMyKFFETUFfQ0NERl9GT1RNQVQgfCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAor cWRtYV9jY2RmX2dldF9zdGF0dXMoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikK K3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGNjZGYtPnN0YXR1cykgJiBRRE1BX0NDREZfTUFTSykg Pj4gUURNQV9DQ0RGX1NUQVRVUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZf c2V0X3NlcihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCBpbnQgc3RhdHVzKQoreworCWNj ZGYtPnN0YXR1cyA9IGNwdV90b19sZTMyKFFETUFfQ0NERl9TRVIgfCBzdGF0dXMpOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgcWRtYV9jc2dmX3NldF9sZW4oc3RydWN0IGZzbF9xZG1hX2Zvcm1h dCAqY3NnZiwgaW50IGxlbikKK3sKKwljc2dmLT5jZmcgPSBjcHVfdG9fbGUzMihsZW4gJiBRRE1B X1NHX0xFTl9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRfZihz dHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dmLCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNw dV90b19sZTMyKFFETUFfU0dfRklOIHwgKGxlbiAmIFFETUFfU0dfTEVOX01BU0spKTsKK30KKwor c3RhdGljIHUzMiBxZG1hX3JlYWRsKHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEsIHZvaWQg X19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gRlNMX0RNQV9JTihxZG1hLCBhZGRyLCAzMik7Cit9 CisKK3N0YXRpYyB2b2lkIHFkbWFfd3JpdGVsKHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEs IHUzMiB2YWwsCisJCQl2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJRlNMX0RNQV9PVVQocWRtYSwg YWRkciwgdmFsLCAzMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqdG9fZnNs X3FkbWFfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9v ZihjaGFuLCBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiwgdmNoYW4uY2hhbik7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZnNsX3FkbWFfY29tcCAqdG9fZnNsX3FkbWFfY29tcChzdHJ1Y3QgdmlydF9kbWFfZGVz YyAqdmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IGZzbF9xZG1hX2NvbXAs IHZkZXNjKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhz dHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFu ID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9x dWV1ZSA9IGZzbF9jaGFuLT5xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRt YSA9IGZzbF9jaGFuLT5xZG1hOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXAsICpf Y29tcF90ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisJdmNoYW5f Z2V0X2FsbF9kZXNjcmlwdG9ycygmZnNsX2NoYW4tPnZjaGFuLCAmaGVhZCk7CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmZnNsX2NoYW4tPnZjaGFuLmxvY2ssIGZsYWdzKTsKKworCXZjaGFuX2Rt YV9kZXNjX2ZyZWVfbGlzdCgmZnNsX2NoYW4tPnZjaGFuLCAmaGVhZCk7CisKKwlpZiAoIWZzbF9x dWV1ZS0+Y29tcF9wb29sICYmICFmc2xfcXVldWUtPmNvbXBfcG9vbCkKKwkJcmV0dXJuOworCisJ bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbXBfdGVtcCwgX2NvbXBfdGVtcCwKKwkJCQkgJmZz bF9xdWV1ZS0+Y29tcF91c2VkLAlsaXN0KSB7CisJCWRtYV9wb29sX2ZyZWUoZnNsX3F1ZXVlLT5j b21wX3Bvb2wsCisJCQkgICAgICBjb21wX3RlbXAtPnZpcnRfYWRkciwKKwkJCSAgICAgIGNvbXBf dGVtcC0+YnVzX2FkZHIpOworCQlkbWFfcG9vbF9mcmVlKGZzbF9xdWV1ZS0+ZGVzY19wb29sLAor CQkJICAgICAgY29tcF90ZW1wLT5kZXNjX3ZpcnRfYWRkciwKKwkJCSAgICAgIGNvbXBfdGVtcC0+ ZGVzY19idXNfYWRkcik7CisJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCQlrZnJlZShj b21wX3RlbXApOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb21wX3RlbXAsIF9j b21wX3RlbXAsCisJCQkJICZmc2xfcXVldWUtPmNvbXBfZnJlZSwgbGlzdCkgeworCQlkbWFfcG9v bF9mcmVlKGZzbF9xdWV1ZS0+Y29tcF9wb29sLAorCQkJICAgICAgY29tcF90ZW1wLT52aXJ0X2Fk ZHIsCisJCQkgICAgICBjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJZG1hX3Bvb2xfZnJlZShmc2xf cXVldWUtPmRlc2NfcG9vbCwKKwkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIsCisJ CQkgICAgICBjb21wX3RlbXAtPmRlc2NfYnVzX2FkZHIpOworCQlsaXN0X2RlbCgmY29tcF90ZW1w LT5saXN0KTsKKwkJa2ZyZWUoY29tcF90ZW1wKTsKKwl9CisKKwlkbWFfcG9vbF9kZXN0cm95KGZz bF9xdWV1ZS0+Y29tcF9wb29sKTsKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19w b29sKTsKKworCWZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZC0tOworCWZzbF9xdWV1ZS0+Y29tcF9w b29sID0gTlVMTDsKKwlmc2xfcXVldWUtPmRlc2NfcG9vbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2 b2lkIGZzbF9xZG1hX2NvbXBfZmlsbF9tZW1jcHkoc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9j b21wLAorCQkJCSAgICAgIGRtYV9hZGRyX3QgZHN0LCBkbWFfYWRkcl90IHNyYywgdTMyIGxlbikK K3sKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpzZGYsICpkZGY7CisJc3RydWN0IGZzbF9xZG1h X2Zvcm1hdCAqY2NkZiwgKmNzZ2ZfZGVzYywgKmNzZ2Zfc3JjLCAqY3NnZl9kZXN0OworCisJY2Nk ZiA9IGZzbF9jb21wLT52aXJ0X2FkZHI7CisJY3NnZl9kZXNjID0gZnNsX2NvbXAtPnZpcnRfYWRk ciArIDE7CisJY3NnZl9zcmMgPSBmc2xfY29tcC0+dmlydF9hZGRyICsgMjsKKwljc2dmX2Rlc3Qg PSBmc2xfY29tcC0+dmlydF9hZGRyICsgMzsKKwlzZGYgPSBmc2xfY29tcC0+ZGVzY192aXJ0X2Fk ZHI7CisJZGRmID0gZnNsX2NvbXAtPmRlc2NfdmlydF9hZGRyICsgMTsKKworCW1lbXNldChmc2xf Y29tcC0+dmlydF9hZGRyLCAwLCBGU0xfUURNQV9DT01NQU5EX0JVRkZFUl9TSVpFKTsKKwltZW1z ZXQoZnNsX2NvbXAtPmRlc2NfdmlydF9hZGRyLCAwLCBGU0xfUURNQV9ERVNDUklQVE9SX0JVRkZF Ul9TSVpFKTsKKwkvKiBIZWFkIENvbW1hbmQgRGVzY3JpcHRvcihGcmFtZSBEZXNjcmlwdG9yKSAq LworCXFkbWFfZGVzY19hZGRyX3NldDY0KGNjZGYsIGZzbF9jb21wLT5idXNfYWRkciArIDE2KTsK KwlxZG1hX2NjZGZfc2V0X2Zvcm1hdChjY2RmLCBxZG1hX2NjZGZfZ2V0X29mZnNldChjY2RmKSk7 CisJcWRtYV9jY2RmX3NldF9zZXIoY2NkZiwgcWRtYV9jY2RmX2dldF9zdGF0dXMoY2NkZikpOwor CS8qIFN0YXR1cyBub3RpZmljYXRpb24gaXMgZW5xdWV1ZWQgdG8gc3RhdHVzIHF1ZXVlLiAqLwor CS8qIENvbXBvdW5kIENvbW1hbmQgRGVzY3JpcHRvcihGcmFtZSBMaXN0IFRhYmxlKSAqLworCXFk bWFfZGVzY19hZGRyX3NldDY0KGNzZ2ZfZGVzYywgZnNsX2NvbXAtPmRlc2NfYnVzX2FkZHIpOwor CS8qIEl0IG11c3QgYmUgMzIgYXMgQ29tcG91bmQgUy9HIERlc2NyaXB0b3IgKi8KKwlxZG1hX2Nz Z2Zfc2V0X2xlbihjc2dmX2Rlc2MsIDMyKTsKKwlxZG1hX2Rlc2NfYWRkcl9zZXQ2NChjc2dmX3Ny Yywgc3JjKTsKKwlxZG1hX2NzZ2Zfc2V0X2xlbihjc2dmX3NyYywgbGVuKTsKKwlxZG1hX2Rlc2Nf YWRkcl9zZXQ2NChjc2dmX2Rlc3QsIGRzdCk7CisJcWRtYV9jc2dmX3NldF9sZW4oY3NnZl9kZXN0 LCBsZW4pOworCS8qIFRoaXMgZW50cnkgaXMgdGhlIGxhc3QgZW50cnkuICovCisJcWRtYV9jc2dm X3NldF9mKGNzZ2ZfZGVzdCwgbGVuKTsKKwkvKiBEZXNjcmlwdG9yIEJ1ZmZlciAqLworCXNkZi0+ ZGF0YSA9CisJCWNwdV90b19sZTY0KEZTTF9RRE1BX0NNRF9SV1RUWVBFIDw8CisJCQkgICAgRlNM X1FETUFfQ01EX1JXVFRZUEVfT0ZGU0VUKTsKKwlkZGYtPmRhdGEgPQorCQljcHVfdG9fbGU2NChG U0xfUURNQV9DTURfUldUVFlQRSA8PAorCQkJICAgIEZTTF9RRE1BX0NNRF9SV1RUWVBFX09GRlNF VCk7CisJZGRmLT5kYXRhIHw9CisJCWNwdV90b19sZTY0KEZTTF9RRE1BX0NNRF9MV0MgPDwgRlNM X1FETUFfQ01EX0xXQ19PRkZTRVQpOworfQorCisvKgorICogUHJlLXJlcXVlc3QgZnVsbCBjb21t YW5kIGRlc2NyaXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJl X3JlcXVlc3RfZW5xdWV1ZV9kZXNjKHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWUpCit7CisJ aW50IGk7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmNvbXBfdGVtcCwgKl9jb21wX3RlbXA7CisK Kwlmb3IgKGkgPSAwOyBpIDwgcXVldWUtPm5fY3EgKyBGU0xfQ09NTUFORF9RVUVVRV9PVkVSRkxM T1c7IGkrKykgeworCQljb21wX3RlbXAgPSBremFsbG9jKHNpemVvZigqY29tcF90ZW1wKSwgR0ZQ X0tFUk5FTCk7CisJCWlmICghY29tcF90ZW1wKQorCQkJZ290byBlcnJfYWxsb2M7CisJCWNvbXBf dGVtcC0+dmlydF9hZGRyID0KKwkJCWRtYV9wb29sX2FsbG9jKHF1ZXVlLT5jb21wX3Bvb2wsIEdG UF9LRVJORUwsCisJCQkJICAgICAgICZjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJaWYgKCFjb21w X3RlbXAtPnZpcnRfYWRkcikKKwkJCWdvdG8gZXJyX2RtYV9hbGxvYzsKKworCQljb21wX3RlbXAt PmRlc2NfdmlydF9hZGRyID0KKwkJCWRtYV9wb29sX2FsbG9jKHF1ZXVlLT5kZXNjX3Bvb2wsIEdG UF9LRVJORUwsCisJCQkJICAgICAgICZjb21wX3RlbXAtPmRlc2NfYnVzX2FkZHIpOworCQlpZiAo IWNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIpCisJCQlnb3RvIGVycl9kZXNjX2RtYV9hbGxvYzsK KworCQlsaXN0X2FkZF90YWlsKCZjb21wX3RlbXAtPmxpc3QsICZxdWV1ZS0+Y29tcF9mcmVlKTsK Kwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2Rlc2NfZG1hX2FsbG9jOgorCWRtYV9wb29sX2ZyZWUo cXVldWUtPmNvbXBfcG9vbCwgY29tcF90ZW1wLT52aXJ0X2FkZHIsCisJCSAgICAgIGNvbXBfdGVt cC0+YnVzX2FkZHIpOworCitlcnJfZG1hX2FsbG9jOgorCWtmcmVlKGNvbXBfdGVtcCk7CisKK2Vy cl9hbGxvYzoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29tcF90ZW1wLCBfY29tcF90ZW1w LAorCQkJCSAmcXVldWUtPmNvbXBfZnJlZSwgbGlzdCkgeworCQlpZiAoY29tcF90ZW1wLT52aXJ0 X2FkZHIpCisJCQlkbWFfcG9vbF9mcmVlKHF1ZXVlLT5jb21wX3Bvb2wsCisJCQkJICAgICAgY29t cF90ZW1wLT52aXJ0X2FkZHIsCisJCQkJICAgICAgY29tcF90ZW1wLT5idXNfYWRkcik7CisJCWlm IChjb21wX3RlbXAtPmRlc2NfdmlydF9hZGRyKQorCQkJZG1hX3Bvb2xfZnJlZShxdWV1ZS0+ZGVz Y19wb29sLAorCQkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIsCisJCQkJICAgICAg Y29tcF90ZW1wLT5kZXNjX2J1c19hZGRyKTsKKworCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0 KTsKKwkJa2ZyZWUoY29tcF90ZW1wKTsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoK KyAqIFJlcXVlc3QgYSBjb21tYW5kIGRlc2NyaXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRp YyBzdHJ1Y3QgZnNsX3FkbWFfY29tcAorKmZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKHN0 cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXA7CisJaW50IHRpbWVvdXQgPSBGU0xfUURN QV9DT01QX1RJTUVPVVQ7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpxdWV1ZSA9IGZzbF9jaGFu LT5xdWV1ZTsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1 ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWlmICghbGlzdF9lbXB0eSgmcXVldWUtPmNvbXBf ZnJlZSkpIHsKKwkJCWNvbXBfdGVtcCA9IGxpc3RfZmlyc3RfZW50cnkoJnF1ZXVlLT5jb21wX2Zy ZWUsCisJCQkJCQkgICAgIHN0cnVjdCBmc2xfcWRtYV9jb21wLAorCQkJCQkJICAgICBsaXN0KTsK KwkJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQkJY29tcF90ZW1wLT5xY2hhbiA9IGZz bF9jaGFuOworCQkJcmV0dXJuIGNvbXBfdGVtcDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0 dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfcXVldWUKKypmc2xfcWRtYV9h bGxvY19xdWV1ZV9yZXNvdXJjZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlz dHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgcmV0LCBsZW4sIGksIGo7 CisJaW50IHF1ZXVlX251bSwgYmxvY2tfbnVtYmVyOworCXVuc2lnbmVkIGludCBxdWV1ZV9zaXpl W0ZTTF9RRE1BX1FVRVVFX01BWF07CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpxdWV1ZV9oZWFk LCAqcXVldWVfdGVtcDsKKworCXF1ZXVlX251bSA9IGZzbF9xZG1hLT5uX3F1ZXVlczsKKwlibG9j a19udW1iZXIgPSBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOworCisJaWYgKHF1ZXVlX251bSA+IEZT TF9RRE1BX1FVRVVFX01BWCkKKwkJcXVldWVfbnVtID0gRlNMX1FETUFfUVVFVUVfTUFYOworCWxl biA9IHNpemVvZigqcXVldWVfaGVhZCkgKiBxdWV1ZV9udW0gKiBibG9ja19udW1iZXI7CisJcXVl dWVfaGVhZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlm ICghcXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlf cmVhZF91MzJfYXJyYXkoJnBkZXYtPmRldiwgInF1ZXVlLXNpemVzIiwKKwkJCQkJICAgICBxdWV1 ZV9zaXplLCBxdWV1ZV9udW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAi Q2FuJ3QgZ2V0IHF1ZXVlLXNpemVzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IgKGog PSAwOyBqIDwgYmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHF1ZXVlX251 bTsgaSsrKSB7CisJCQlpZiAocXVldWVfc2l6ZVtpXSA+IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0Nf U0laRV9NQVggfHwKKwkJCSAgICBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VMQVJfREVT Q19TSVpFX01JTikgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIkdldCB3cm9uZyBx dWV1ZS1zaXplcy5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJcXVldWVfdGVtcCA9 IHF1ZXVlX2hlYWQgKyBpICsgKGogKiBxdWV1ZV9udW0pOworCisJCQlxdWV1ZV90ZW1wLT5jcSA9 CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVj dCBmc2xfcWRtYV9mb3JtYXQpICoKKwkJCQkJICAgcXVldWVfc2l6ZVtpXSwKKwkJCQkJICAgJnF1 ZXVlX3RlbXAtPmJ1c19hZGRyLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcXVldWVf dGVtcC0+Y3EpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlxdWV1ZV90ZW1wLT5ibG9ja19iYXNlID0g ZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZz bF9xZG1hLCBqKTsKKwkJCXF1ZXVlX3RlbXAtPm5fY3EgPSBxdWV1ZV9zaXplW2ldOworCQkJcXVl dWVfdGVtcC0+aWQgPSBpOworCQkJcXVldWVfdGVtcC0+dmlydF9oZWFkID0gcXVldWVfdGVtcC0+ Y3E7CisJCQlxdWV1ZV90ZW1wLT52aXJ0X3RhaWwgPSBxdWV1ZV90ZW1wLT5jcTsKKwkJCS8qCisJ CQkgKiBMaXN0IGZvciBxdWV1ZSBjb21tYW5kIGJ1ZmZlcgorCQkJICovCisJCQlJTklUX0xJU1Rf SEVBRCgmcXVldWVfdGVtcC0+Y29tcF91c2VkKTsKKwkJCXNwaW5fbG9ja19pbml0KCZxdWV1ZV90 ZW1wLT5xdWV1ZV9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gcXVldWVfaGVhZDsKK30KKworc3Rh dGljIHN0cnVjdCBmc2xfcWRtYV9xdWV1ZQorKmZzbF9xZG1hX3ByZXBfc3RhdHVzX3F1ZXVlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQg c3RhdHVzX3NpemU7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpzdGF0dXNfaGVhZDsKKwlzdHJ1 Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyZXQgPSBvZl9wcm9w ZXJ0eV9yZWFkX3UzMihucCwgInN0YXR1cy1zaXplcyIsICZzdGF0dXNfc2l6ZSk7CisJaWYgKHJl dCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgc3RhdHVzLXNpemVzLlxuIik7 CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RhdHVzX3NpemUgPiBGU0xfUURNQV9DSVJDVUxB Ul9ERVNDX1NJWkVfTUFYIHx8CisJICAgIHN0YXR1c19zaXplIDwgRlNMX1FETUFfQ0lSQ1VMQVJf REVTQ19TSVpFX01JTikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgd3Jvbmcgc3RhdHVz X3NpemUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN0YXR1c19oZWFkID0gZGV2bV9remFs bG9jKCZwZGV2LT5kZXYsCisJCQkJICAgc2l6ZW9mKCpzdGF0dXNfaGVhZCksIEdGUF9LRVJORUwp OworCWlmICghc3RhdHVzX2hlYWQpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBCdWZmZXIg Zm9yIHF1ZXVlIGNvbW1hbmQKKwkgKi8KKwlzdGF0dXNfaGVhZC0+Y3EgPSBkbWFfYWxsb2NfY29o ZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1h dCkgKgorCQkJCQkgICAgIHN0YXR1c19zaXplLAorCQkJCQkgICAgICZzdGF0dXNfaGVhZC0+YnVz X2FkZHIsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0dXNfaGVhZC0+Y3EpIHsK KwkJZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBzdGF0dXNfaGVhZCk7CisJCXJldHVybiBOVUxMOwor CX0KKwlzdGF0dXNfaGVhZC0+bl9jcSA9IHN0YXR1c19zaXplOworCXN0YXR1c19oZWFkLT52aXJ0 X2hlYWQgPSBzdGF0dXNfaGVhZC0+Y3E7CisJc3RhdHVzX2hlYWQtPnZpcnRfdGFpbCA9IHN0YXR1 c19oZWFkLT5jcTsKKwlzdGF0dXNfaGVhZC0+Y29tcF9wb29sID0gTlVMTDsKKworCXJldHVybiBz dGF0dXNfaGVhZDsKK30KKworc3RhdGljIGludCBmc2xfcWRtYV9oYWx0KHN0cnVjdCBmc2xfcWRt YV9lbmdpbmUgKmZzbF9xZG1hKQoreworCXUzMiByZWc7CisJaW50IGksIGosIGNvdW50ID0gRlNM X1FETUFfSEFMVF9DT1VOVDsKKwl2b2lkIF9faW9tZW0gKmJsb2NrLCAqY3RybCA9IGZzbF9xZG1h LT5jdHJsX2Jhc2U7CisKKwkvKiBEaXNhYmxlIHRoZSBjb21tYW5kIHF1ZXVlIGFuZCB3YWl0IGZv ciBpZGxlIHN0YXRlLiAqLworCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xf UURNQV9ETVIpOworCXJlZyB8PSBGU0xfUURNQV9ETVJfRFFEOworCXFkbWFfd3JpdGVsKGZzbF9x ZG1hLCByZWcsIGN0cmwgKyBGU0xfUURNQV9ETVIpOworCWZvciAoaiA9IDA7IGogPCBmc2xfcWRt YS0+YmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZSAr CisJCQlGU0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisJCWZvciAoaSA9 IDA7IGkgPCBGU0xfUURNQV9RVUVVRV9OVU1fTUFYOyBpKyspCisJCQlxZG1hX3dyaXRlbChmc2xf cWRtYSwgMCwgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihpKSk7CisJfQorCXdoaWxlICgxKSB7CisJ CXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURNQV9EU1IpOworCQlpZiAo IShyZWcgJiBGU0xfUURNQV9EU1JfREIpKQorCQkJYnJlYWs7CisJCWlmIChjb3VudC0tIDwgMCkK KwkJCXJldHVybiAtRUJVU1k7CisJCXVkZWxheSgxMDApOworCX0KKworCWZvciAoaiA9IDA7IGog PCBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJYmxvY2sgPSBmc2xfcWRtYS0+Ymxv Y2tfYmFzZSArCisJCQlGU0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisK KwkJLyogRGlzYWJsZSBzdGF0dXMgcXVldWUuICovCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCAw LCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKworCQkvKgorCQkgKiBjbGVhciB0aGUgY29tbWFu ZCBxdWV1ZSBpbnRlcnJ1cHQgZGV0ZWN0IHJlZ2lzdGVyIGZvcgorCQkgKiBhbGwgcXVldWVzLgor CQkgKi8KKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0JDUUlEUl9DTEVBUiwKKwkJ CSAgICBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQKK2ZzbF9xZG1hX3F1ZXVlX3RyYW5zZmVyX2NvbXBsZXRlKHN0cnVjdCBmc2xf cWRtYV9lbmdpbmUgKmZzbF9xZG1hLAorCQkJCSB2b2lkICpibG9jaywKKwkJCQkgaW50IGlkKQor eworCWJvb2wgZHVwbGljYXRlOworCXUzMiByZWcsIGksIGNvdW50OworCXN0cnVjdCBmc2xfcWRt YV9xdWV1ZSAqdGVtcF9xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpzdGF0dXNfYWRk cjsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqZnNsX2NvbXAgPSBOVUxMOworCXN0cnVjdCBmc2xf cWRtYV9xdWV1ZSAqZnNsX3F1ZXVlID0gZnNsX3FkbWEtPnF1ZXVlOworCXN0cnVjdCBmc2xfcWRt YV9xdWV1ZSAqZnNsX3N0YXR1cyA9IGZzbF9xZG1hLT5zdGF0dXNbaWRdOworCisJY291bnQgPSBG U0xfUURNQV9NQVhfU0laRTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCWR1cGxpY2F0ZSA9IDA7 CisJCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGJsb2NrICsgRlNMX1FETUFfQlNRU1IpOwor CQlpZiAocmVnICYgRlNMX1FETUFfQlNRU1JfUUUpCisJCQlyZXR1cm4gMDsKKworCQlzdGF0dXNf YWRkciA9IGZzbF9zdGF0dXMtPnZpcnRfaGVhZDsKKworCQlpZiAocWRtYV9jY2RmX2dldF9xdWV1 ZShzdGF0dXNfYWRkcikgPT0KKwkJICAgX190aGlzX2NwdV9yZWFkKHByZS5xdWV1ZSkgJiYKKwkJ CXFkbWFfY2NkZl9hZGRyX2dldDY0KHN0YXR1c19hZGRyKSA9PQorCQkJX190aGlzX2NwdV9yZWFk KHByZS5hZGRyKSkKKwkJCWR1cGxpY2F0ZSA9IDE7CisJCWkgPSBxZG1hX2NjZGZfZ2V0X3F1ZXVl KHN0YXR1c19hZGRyKSArCisJCQlpZCAqIGZzbF9xZG1hLT5uX3F1ZXVlczsKKwkJX190aGlzX2Nw dV93cml0ZShwcmUuYWRkciwgcWRtYV9jY2RmX2FkZHJfZ2V0NjQoc3RhdHVzX2FkZHIpKTsKKwkJ X190aGlzX2NwdV93cml0ZShwcmUucXVldWUsIHFkbWFfY2NkZl9nZXRfcXVldWUoc3RhdHVzX2Fk ZHIpKTsKKwkJdGVtcF9xdWV1ZSA9IGZzbF9xdWV1ZSArIGk7CisKKwkJc3Bpbl9sb2NrKCZ0ZW1w X3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnRlbXBfcXVldWUtPmNvbXBf dXNlZCkpIHsKKwkJCWlmICghZHVwbGljYXRlKSB7CisJCQkJc3Bpbl91bmxvY2soJnRlbXBfcXVl dWUtPnF1ZXVlX2xvY2spOworCQkJCXJldHVybiAtRUFHQUlOOworCQkJfQorCQl9IGVsc2Ugewor CQkJZnNsX2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0ZW1wX3F1ZXVlLT5jb21wX3VzZWQsCisJ CQkJCQkgICAgc3RydWN0IGZzbF9xZG1hX2NvbXAsIGxpc3QpOworCQkJaWYgKGZzbF9jb21wLT5i dXNfYWRkciArIDE2ICE9CisJCQkJX190aGlzX2NwdV9yZWFkKHByZS5hZGRyKSkgeworCQkJCWlm ICghZHVwbGljYXRlKSB7CisJCQkJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2Nr KTsKKwkJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGR1cGxp Y2F0ZSkgeworCQkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9C U1FNUik7CisJCQlyZWcgfD0gRlNMX1FETUFfQlNRTVJfREk7CisJCQlxZG1hX2Rlc2NfYWRkcl9z ZXQ2NChzdGF0dXNfYWRkciwgMHgwKTsKKwkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCsrOworCQkJ aWYgKGZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9PSBmc2xfc3RhdHVzLT5jcQorCQkJCQkJICAgKyBm c2xfc3RhdHVzLT5uX2NxKQorCQkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9IGZzbF9zdGF0dXMt PmNxOworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CU1FN Uik7CisJCQlzcGluX3VubG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCQljb250aW51 ZTsKKwkJfQorCQlsaXN0X2RlbCgmZnNsX2NvbXAtPmxpc3QpOworCisJCXJlZyA9IHFkbWFfcmVh ZGwoZnNsX3FkbWEsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQlyZWcgfD0gRlNMX1FETUFf QlNRTVJfREk7CisJCXFkbWFfZGVzY19hZGRyX3NldDY0KHN0YXR1c19hZGRyLCAweDApOworCQlm c2xfc3RhdHVzLT52aXJ0X2hlYWQrKzsKKwkJaWYgKGZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9PSBm c2xfc3RhdHVzLT5jcSArIGZzbF9zdGF0dXMtPm5fY3EpCisJCQlmc2xfc3RhdHVzLT52aXJ0X2hl YWQgPSBmc2xfc3RhdHVzLT5jcTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sg KyBGU0xfUURNQV9CU1FNUik7CisJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2Nr KTsKKworCQlzcGluX2xvY2soJmZzbF9jb21wLT5xY2hhbi0+dmNoYW4ubG9jayk7CisJCXZjaGFu X2Nvb2tpZV9jb21wbGV0ZSgmZnNsX2NvbXAtPnZkZXNjKTsKKwkJZnNsX2NvbXAtPnFjaGFuLT5z dGF0dXMgPSBETUFfQ09NUExFVEU7CisJCXNwaW5fdW5sb2NrKCZmc2xfY29tcC0+cWNoYW4tPnZj aGFuLmxvY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNs X3FkbWFfZXJyb3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQg aW50IGludHI7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEgPSBkZXZfaWQ7CisJ dm9pZCBfX2lvbWVtICpzdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisKKwlpbnRyID0g cWRtYV9yZWFkbChmc2xfcWRtYSwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisKKwlpZiAoaW50 cikgeworCQlkZXZfZXJyKGZzbF9xZG1hLT5kbWFfZGV2LmRldiwgIkRNQSB0cmFuc2FjdGlvbiBl cnJvciFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcWRtYV93cml0ZWwoZnNsX3Fk bWEsIEZTTF9RRE1BX0RFRFJfQ0xFQVIsIHN0YXR1cyArIEZTTF9RRE1BX0RFRFIpOworCXJldHVy biBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZzbF9xZG1hX3F1ZXVlX2hh bmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpZDsKKwl1bnNpZ25lZCBpbnQg aW50ciwgcmVnOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hID0gZGV2X2lkOwor CXZvaWQgX19pb21lbSAqYmxvY2ssICpjdHJsID0gZnNsX3FkbWEtPmN0cmxfYmFzZTsKKworCWlk ID0gaXJxIC0gZnNsX3FkbWEtPmlycV9iYXNlOworCWlmIChpZCA8IDAgJiYgaWQgPiBmc2xfcWRt YS0+YmxvY2tfbnVtYmVyKSB7CisJCWRldl9lcnIoZnNsX3FkbWEtPmRtYV9kZXYuZGV2LAorCQkJ ImlycSAlZCBpcyB3cm9uZyBpcnFfYmFzZSBpcyAlZFxuIiwKKwkJCWlycSwgZnNsX3FkbWEtPmly cV9iYXNlKTsKKwl9CisKKwlibG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlICsKKwkJRlNMX1FE TUFfQkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGlkKTsKKworCWludHIgPSBxZG1hX3JlYWRs KGZzbF9xZG1hLCBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisKKwlpZiAoKGludHIgJiBG U0xfUURNQV9DUUlEUl9TUVQpICE9IDApCisJCWludHIgPSBmc2xfcWRtYV9xdWV1ZV90cmFuc2Zl cl9jb21wbGV0ZShmc2xfcWRtYSwgYmxvY2ssIGlkKTsKKworCWlmIChpbnRyICE9IDApIHsKKwkJ cmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RNUik7CisJCXJlZyB8 PSBGU0xfUURNQV9ETVJfRFFEOworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsg RlNMX1FETUFfRE1SKTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FE TUFfQkNRSUVSKDApKTsKKwkJZGV2X2Vycihmc2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJRRE1BOiBz dGF0dXMgZXJyIVxuIik7CisJfQorCisJLyogQ2xlYXIgYWxsIGRldGVjdGVkIGV2ZW50cyBhbmQg aW50ZXJydXB0cy4gKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NM RUFSLAorCQkgICAgYmxvY2sgKyBGU0xfUURNQV9CQ1FJRFIoMCkpOworCisJcmV0dXJuIElSUV9I QU5ETEVEOworfQorCitzdGF0aWMgaW50Citmc2xfcWRtYV9pcnFfaW5pdChzdHJ1Y3QgcGxhdGZv cm1fZGV2aWNlICpwZGV2LAorCQkgIHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQor eworCWludCBpOworCWludCBjcHU7CisJaW50IHJldDsKKwljaGFyIGlycV9uYW1lWzIwXTsKKwor CWZzbF9xZG1hLT5lcnJvcl9pcnEgPQorCQlwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAi cWRtYS1lcnJvciIpOworCWlmIChmc2xfcWRtYS0+ZXJyb3JfaXJxIDwgMCkgeworCQlkZXZfZXJy KCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgcWRtYSBjb250cm9sbGVyIGlycS5cbiIpOworCQlyZXR1 cm4gZnNsX3FkbWEtPmVycm9yX2lycTsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZw ZGV2LT5kZXYsIGZzbF9xZG1hLT5lcnJvcl9pcnEsCisJCQkgICAgICAgZnNsX3FkbWFfZXJyb3Jf aGFuZGxlciwgMCwKKwkJCSAgICAgICAicURNQSBlcnJvciIsIGZzbF9xZG1hKTsKKwlpZiAocmV0 KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHFETUEgY29udHJvbGxl ciBJUlEuXG4iKTsKKwkJcmV0dXJuICByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZzbF9x ZG1hLT5ibG9ja19udW1iZXI7IGkrKykgeworCQlzcHJpbnRmKGlycV9uYW1lLCAicWRtYS1xdWV1 ZSVkIiwgaSk7CisJCWZzbF9xZG1hLT5xdWV1ZV9pcnFbaV0gPQorCQkJCXBsYXRmb3JtX2dldF9p cnFfYnluYW1lKHBkZXYsIGlycV9uYW1lKTsKKworCQlpZiAoZnNsX3FkbWEtPnF1ZXVlX2lycVtp XSA8IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2FuJ3QgZ2V0IHFkbWEgcXVl dWUgJWQgaXJxLlxuIiwgaSk7CisJCQlyZXR1cm4gZnNsX3FkbWEtPnF1ZXVlX2lycVtpXTsKKwkJ fQorCisJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwKKwkJCQkgICAgICAgZnNs X3FkbWEtPnF1ZXVlX2lycVtpXSwKKwkJCQkgICAgICAgZnNsX3FkbWFfcXVldWVfaGFuZGxlciwK KwkJCQkgICAgICAgMCwKKwkJCQkgICAgICAgInFETUEgcXVldWUiLAorCQkJCSAgICAgICBmc2xf cWRtYSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2FuJ3Qg cmVnaXN0ZXIgcURNQSBxdWV1ZSBJUlEuXG4iKTsKKwkJCXJldHVybiAgcmV0OworCQl9CisKKwkJ Y3B1ID0gaSAlIG51bV9vbmxpbmVfY3B1cygpOworCQlyZXQgPSBpcnFfc2V0X2FmZmluaXR5X2hp bnQoZnNsX3FkbWEtPnF1ZXVlX2lycVtpXSwKKwkJCQkJICAgIGdldF9jcHVfbWFzayhjcHUpKTsK KwkJaWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJDYW4ndCBzZXQgY3B1 ICVkIGFmZmluaXR5IHRvIElSUSAlZC5cbiIsCisJCQkJY3B1LAorCQkJCWZzbF9xZG1hLT5xdWV1 ZV9pcnFbaV0pOworCQkJcmV0dXJuICByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgZnNsX3FkbWFfaXJxX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRl diwKKwkJCSAgICAgIHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQoreworCWludCBp OworCisJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+ZXJyb3JfaXJxLCBmc2xf cWRtYSk7CisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5ibG9ja19udW1iZXI7IGkrKykKKwkJ ZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+cXVldWVfaXJxW2ldLCBmc2xfcWRt YSk7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcmVnX2luaXQoc3RydWN0IGZzbF9xZG1hX2Vu Z2luZSAqZnNsX3FkbWEpCit7CisJdTMyIHJlZzsKKwlpbnQgaSwgaiwgcmV0OworCXN0cnVjdCBm c2xfcWRtYV9xdWV1ZSAqdGVtcDsKKwl2b2lkIF9faW9tZW0gKnN0YXR1cyA9IGZzbF9xZG1hLT5z dGF0dXNfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmJsb2NrLCAqY3RybCA9IGZzbF9xZG1hLT5jdHJs X2Jhc2U7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfcWRtYS0+cXVl dWU7CisKKwkvKiBUcnkgdG8gaGFsdCB0aGUgcURNQSBlbmdpbmUgZmlyc3QuICovCisJcmV0ID0g ZnNsX3FkbWFfaGFsdChmc2xfcWRtYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGZzbF9xZG1h LT5kbWFfZGV2LmRldiwgIkRNQSBoYWx0IGZhaWxlZCEiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisK Kwlmb3IgKGkgPSAwOyBpIDwgZnNsX3FkbWEtPmJsb2NrX251bWJlcjsgaSsrKSB7CisJCS8qCisJ CSAqIENsZWFyIHRoZSBjb21tYW5kIHF1ZXVlIGludGVycnVwdCBkZXRlY3QgcmVnaXN0ZXIgZm9y CisJCSAqIGFsbCBxdWV1ZXMuCisJCSAqLworCisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jh c2UgKworCQkJRlNMX1FETUFfQkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGkpOworCQlxZG1h X3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NMRUFSLAorCQkJICAgIGJsb2NrICsg RlNMX1FETUFfQkNRSURSKDApKTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJs b2NrX251bWJlcjsgaisrKSB7CisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJ RlNMX1FETUFfQkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGopOworCQlmb3IgKGkgPSAwOyBp IDwgZnNsX3FkbWEtPm5fcXVldWVzOyBpKyspIHsKKwkJCXRlbXAgPSBmc2xfcXVldWUgKyBpICsg KGogKiBmc2xfcWRtYS0+bl9xdWV1ZXMpOworCQkJLyoKKwkJCSAqIEluaXRpYWxpemUgQ29tbWFu ZCBRdWV1ZSByZWdpc3RlcnMgdG8KKwkJCSAqIHBvaW50IHRvIHRoZSBmaXJzdAorCQkJICogY29t bWFuZCBkZXNjcmlwdG9yIGluIG1lbW9yeS4KKwkJCSAqIERlcXVldWUgUG9pbnRlciBBZGRyZXNz IFJlZ2lzdGVycworCQkJICogRW5xdWV1ZSBQb2ludGVyIEFkZHJlc3MgUmVnaXN0ZXJzCisJCQkg Ki8KKworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHRlbXAtPmJ1c19hZGRyLAorCQkJCSAgICBi bG9jayArIEZTTF9RRE1BX0JDUURQQV9TQUREUihpKSk7CisJCQlxZG1hX3dyaXRlbChmc2xfcWRt YSwgdGVtcC0+YnVzX2FkZHIsCisJCQkJICAgIGJsb2NrICsgRlNMX1FETUFfQkNRRVBBX1NBRERS KGkpKTsKKworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcXVldWUgbW9kZS4gKi8KKwkJCXJlZyA9IEZT TF9RRE1BX0JDUU1SX0VOOworCQkJcmVnIHw9IEZTTF9RRE1BX0JDUU1SX0NEX1RITEQoaWxvZzIo dGVtcC0+bl9jcSkgLSA0KTsKKwkJCXJlZyB8PSBGU0xfUURNQV9CQ1FNUl9DUV9TSVpFKGlsb2cy KHRlbXAtPm5fY3EpIC0gNik7CisJCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayAr IEZTTF9RRE1BX0JDUU1SKGkpKTsKKwkJfQorCisJCS8qCisJCSAqIFdvcmthcm91bmQgZm9yIGVy cmF0dW06IEVSUjAxMDgxMi4KKwkJICogV2UgbXVzdCBlbmFibGUgWE9GRiB0byBhdm9pZCB0aGUg ZW5xdWV1ZSByZWplY3Rpb24gb2NjdXJzLgorCQkgKiBTZXR0aW5nIFNRQ0NNUiBFTlRFUl9XTSB0 byAweDIwLgorCQkgKi8KKworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfU1FDQ01S X0VOVEVSX1dNLAorCQkJICAgIGJsb2NrICsgRlNMX1FETUFfU1FDQ01SKTsKKworCQkvKgorCQkg KiBJbml0aWFsaXplIHN0YXR1cyBxdWV1ZSByZWdpc3RlcnMgdG8gcG9pbnQgdG8gdGhlIGZpcnN0 CisJCSAqIGNvbW1hbmQgZGVzY3JpcHRvciBpbiBtZW1vcnkuCisJCSAqIERlcXVldWUgUG9pbnRl ciBBZGRyZXNzIFJlZ2lzdGVycworCQkgKiBFbnF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3Rl cnMKKwkJICovCisKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIGZzbF9xZG1hLT5zdGF0dXNbal0t PmJ1c19hZGRyLAorCQkJICAgIGJsb2NrICsgRlNMX1FETUFfU1FFUEFSKTsKKwkJcWRtYV93cml0 ZWwoZnNsX3FkbWEsIGZzbF9xZG1hLT5zdGF0dXNbal0tPmJ1c19hZGRyLAorCQkJICAgIGJsb2Nr ICsgRlNMX1FETUFfU1FEUEFSKTsKKwkJLyogSW5pdGlhbGl6ZSBzdGF0dXMgcXVldWUgaW50ZXJy dXB0LiAqLworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSUVSX0NRVElFLAor CQkJICAgIGJsb2NrICsgRlNMX1FETUFfQkNRSUVSKDApKTsKKwkJcWRtYV93cml0ZWwoZnNsX3Fk bWEsIEZTTF9RRE1BX0JTUUlDUl9JQ0VOIHwKKwkJCQkgICBGU0xfUURNQV9CU1FJQ1JfSUNTVCg1 KSB8IDB4ODAwMCwKKwkJCQkgICBibG9jayArIEZTTF9RRE1BX0JTUUlDUik7CisJCXFkbWFfd3Jp dGVsKGZzbF9xZG1hLCBGU0xfUURNQV9DUUlFUl9NRUlFIHwKKwkJCQkgICBGU0xfUURNQV9DUUlF Ul9URUlFLAorCQkJCSAgIGJsb2NrICsgRlNMX1FETUFfQ1FJRVIpOworCisJCS8qIEluaXRpYWxp emUgdGhlIHN0YXR1cyBxdWV1ZSBtb2RlLiAqLworCQlyZWcgPSBGU0xfUURNQV9CU1FNUl9FTjsK KwkJcmVnIHw9IEZTTF9RRE1BX0JTUU1SX0NRX1NJWkUoaWxvZzIKKwkJCShmc2xfcWRtYS0+c3Rh dHVzW2pdLT5uX2NxKSAtIDYpOworCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGJsb2Nr ICsgRlNMX1FETUFfQlNRTVIpOworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBibG9jayAr IEZTTF9RRE1BX0JTUU1SKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgaW50ZXJy dXB0IHJlZ2lzdGVyLiAqLworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9ERURSX0NM RUFSLCBzdGF0dXMgKyBGU0xfUURNQV9ERURSKTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNM X1FETUFfREVJRVJfQ0xFQVIsIHN0YXR1cyArIEZTTF9RRE1BX0RFSUVSKTsKKworCXJlZyA9IHFk bWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURNQV9ETVIpOworCXJlZyAmPSB+RlNMX1FE TUFfRE1SX0RRRDsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNMX1FETUFf RE1SKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNj cmlwdG9yICoKK2ZzbF9xZG1hX3ByZXBfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1h X2FkZHJfdCBkc3QsCisJCSAgICAgZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVk IGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21wOworCXN0cnVj dCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisKKwlm c2xfY29tcCA9IGZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKGZzbF9jaGFuKTsKKworCWlm ICghZnNsX2NvbXApCisJCXJldHVybiBOVUxMOworCisJZnNsX3FkbWFfY29tcF9maWxsX21lbWNw eShmc2xfY29tcCwgZHN0LCBzcmMsIGxlbik7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmZnNs X2NoYW4tPnZjaGFuLCAmZnNsX2NvbXAtPnZkZXNjLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lk IGZzbF9xZG1hX2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4pCit7 CisJdTMyIHJlZzsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmRlc2M7CisJc3RydWN0IGZzbF9x ZG1hX2NvbXAgKmZzbF9jb21wOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVlID0g ZnNsX2NoYW4tPnF1ZXVlOworCXZvaWQgX19pb21lbSAqYmxvY2sgPSBmc2xfcXVldWUtPmJsb2Nr X2Jhc2U7CisKKwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9jaGFuLT5xZG1hLCBibG9jayArIEZTTF9R RE1BX0JDUVNSKGZzbF9xdWV1ZS0+aWQpKTsKKwlpZiAocmVnICYgKEZTTF9RRE1BX0JDUVNSX1FG IHwgRlNMX1FETUFfQkNRU1JfWE9GRikpCisJCXJldHVybjsKKwl2ZGVzYyA9IHZjaGFuX25leHRf ZGVzYygmZnNsX2NoYW4tPnZjaGFuKTsKKwlpZiAoIXZkZXNjKQorCQlyZXR1cm47CisJbGlzdF9k ZWwoJnZkZXNjLT5ub2RlKTsKKwlmc2xfY29tcCA9IHRvX2ZzbF9xZG1hX2NvbXAodmRlc2MpOwor CisJbWVtY3B5KGZzbF9xdWV1ZS0+dmlydF9oZWFkKyssCisJICAgICAgIGZzbF9jb21wLT52aXJ0 X2FkZHIsIHNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSk7CisJaWYgKGZzbF9xdWV1ZS0+ dmlydF9oZWFkID09IGZzbF9xdWV1ZS0+Y3EgKyBmc2xfcXVldWUtPm5fY3EpCisJCWZzbF9xdWV1 ZS0+dmlydF9oZWFkID0gZnNsX3F1ZXVlLT5jcTsKKworCWxpc3RfYWRkX3RhaWwoJmZzbF9jb21w LT5saXN0LCAmZnNsX3F1ZXVlLT5jb21wX3VzZWQpOworCWJhcnJpZXIoKTsKKwlyZWcgPSBxZG1h X3JlYWRsKGZzbF9jaGFuLT5xZG1hLCBibG9jayArIEZTTF9RRE1BX0JDUU1SKGZzbF9xdWV1ZS0+ aWQpKTsKKwlyZWcgfD0gRlNMX1FETUFfQkNRTVJfRUk7CisJcWRtYV93cml0ZWwoZnNsX2NoYW4t PnFkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihmc2xfcXVldWUtPmlkKSk7CisJZnNs X2NoYW4tPnN0YXR1cyA9IERNQV9JTl9QUk9HUkVTUzsKK30KKworc3RhdGljIHZvaWQgZnNsX3Fk bWFfZnJlZV9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZGVzYykKK3sKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKmZzbF9xdWV1ZTsKKworCWZzbF9jb21wID0gdG9fZnNsX3FkbWFfY29tcCh2 ZGVzYyk7CisJZnNsX3F1ZXVlID0gZnNsX2NvbXAtPnFjaGFuLT5xdWV1ZTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWls KCZmc2xfY29tcC0+bGlzdCwgJmZzbF9xdWV1ZS0+Y29tcF9mcmVlKTsKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZv aWQgZnNsX3FkbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19m c2xfcWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVlID0g ZnNsX2NoYW4tPnF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9xdWV1ZS0+cXVldWVf bG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZnNsX2NoYW4tPnZjaGFuLmxvY2spOworCWlmICh2 Y2hhbl9pc3N1ZV9wZW5kaW5nKCZmc2xfY2hhbi0+dmNoYW4pKQorCQlmc2xfcWRtYV9lbnF1ZXVl X2Rlc2MoZnNsX2NoYW4pOworCXNwaW5fdW5sb2NrKCZmc2xfY2hhbi0+dmNoYW4ubG9jayk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9 CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX3N5bmNocm9uaXplKHN0cnVjdCBkbWFfY2hhbiAqY2hh bikKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19mc2xfcWRtYV9jaGFu KGNoYW4pOworCisJdmNoYW5fc3luY2hyb25pemUoJmZzbF9jaGFuLT52Y2hhbik7Cit9CisKK3N0 YXRpYyBpbnQgZnNsX3FkbWFfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7 CisJTElTVF9IRUFEKGhlYWQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZzbF9x ZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZmc2xfY2hhbi0+dmNoYW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2dldF9hbGxf ZGVzY3JpcHRvcnMoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisJdmNoYW5fZG1hX2Rlc2NfZnJl ZV9saXN0KCZmc2xfY2hhbi0+dmNoYW4sICZoZWFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBmc2xfcWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4p Cit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19mc2xf cWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hID0gZnNs X2NoYW4tPnFkbWE7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hh bi0+cXVldWU7CisKKwlpZiAoZnNsX3F1ZXVlLT5jb21wX3Bvb2wgJiYgZnNsX3F1ZXVlLT5kZXNj X3Bvb2wpCisJCXJldHVybiBmc2xfcWRtYS0+ZGVzY19hbGxvY2F0ZWQ7CisKKwlJTklUX0xJU1Rf SEVBRCgmZnNsX3F1ZXVlLT5jb21wX2ZyZWUpOworCisJLyoKKwkgKiBUaGUgZG1hIHBvb2wgZm9y IHF1ZXVlIGNvbW1hbmQgYnVmZmVyCisJICovCisJZnNsX3F1ZXVlLT5jb21wX3Bvb2wgPQorCWRt YV9wb29sX2NyZWF0ZSgiY29tcF9wb29sIiwKKwkJCWNoYW4tPmRldmljZS0+ZGV2LAorCQkJRlNM X1FETUFfQ09NTUFORF9CVUZGRVJfU0laRSwKKwkJCTY0LCAwKTsKKwlpZiAoIWZzbF9xdWV1ZS0+ Y29tcF9wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogVGhlIGRtYSBwb29sIGZv ciBEZXNjcmlwdG9yKFNEL0REKSBidWZmZXIKKwkgKi8KKwlmc2xfcXVldWUtPmRlc2NfcG9vbCA9 CisJZG1hX3Bvb2xfY3JlYXRlKCJkZXNjX3Bvb2wiLAorCQkJY2hhbi0+ZGV2aWNlLT5kZXYsCisJ CQlGU0xfUURNQV9ERVNDUklQVE9SX0JVRkZFUl9TSVpFLAorCQkJMzIsIDApOworCWlmICghZnNs X3F1ZXVlLT5kZXNjX3Bvb2wpCisJCWdvdG8gZXJyX2Rlc2NfcG9vbDsKKworCXJldCA9IGZzbF9x ZG1hX3ByZV9yZXF1ZXN0X2VucXVldWVfZGVzYyhmc2xfcXVldWUpOworCWlmIChyZXQpIHsKKwkJ ZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWxsb2MgZG1hIGJ1ZmZl ciBmb3IgUy9HIGRlc2NyaXB0b3JcbiIpOworCQlnb3RvIGVycl9tZW07CisJfQorCisJZnNsX3Fk bWEtPmRlc2NfYWxsb2NhdGVkKys7CisJcmV0dXJuIGZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZDsK KworZXJyX21lbToKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19wb29sKTsKK2Vy cl9kZXNjX3Bvb2w6CisJZG1hX3Bvb2xfZGVzdHJveShmc2xfcXVldWUtPmNvbXBfcG9vbCk7CisJ cmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0LCBpOworCWludCBibGtfbnVtLCBibGtf b2ZmOworCXUzMiBsZW4sIGNoYW5zLCBxdWV1ZXM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJ c3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUg KmZzbF9xZG1hOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsK KworCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZG1hLWNoYW5uZWxzIiwgJmNoYW5z KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBkbWEtY2hh bm5lbHMuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFk X3UzMihucCwgImJsb2NrLW9mZnNldCIsICZibGtfb2ZmKTsKKwlpZiAocmV0KSB7CisJCWRldl9l cnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBibG9jay1vZmZzZXQuXG4iKTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImJsb2NrLW51bWJlciIs ICZibGtfbnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdl dCBibG9jay1udW1iZXIuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlibGtfbnVtID0gbWlu X3QoaW50LCBibGtfbnVtLCBudW1fb25saW5lX2NwdXMoKSk7CisKKwlsZW4gPSBzaXplb2YoKmZz bF9xZG1hKTsKKwlmc2xfcWRtYSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9L RVJORUwpOworCWlmICghZnNsX3FkbWEpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gc2l6 ZW9mKCpmc2xfY2hhbikgKiBjaGFuczsKKwlmc2xfcWRtYS0+Y2hhbnMgPSBkZXZtX2t6YWxsb2Mo JnBkZXYtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzbF9xZG1hLT5jaGFucykKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX3F1ZXVlICop ICogYmxrX251bTsKKwlmc2xfcWRtYS0+c3RhdHVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYs IGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmc2xfcWRtYS0+c3RhdHVzKQorCQlyZXR1cm4gLUVO T01FTTsKKworCWxlbiA9IHNpemVvZihpbnQpICogYmxrX251bTsKKwlmc2xfcWRtYS0+cXVldWVf aXJxID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFm c2xfcWRtYS0+cXVldWVfaXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9mX3Byb3Bl cnR5X3JlYWRfdTMyKG5wLCAiZnNsLGRtYS1xdWV1ZXMiLCAmcXVldWVzKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxdWV1ZXMuXG4iKTsKKwkJcmV0dXJu IHJldDsKKwl9CisKKwlmc2xfcWRtYS0+ZGVzY19hbGxvY2F0ZWQgPSAwOworCWZzbF9xZG1hLT5u X2NoYW5zID0gY2hhbnM7CisJZnNsX3FkbWEtPm5fcXVldWVzID0gcXVldWVzOworCWZzbF9xZG1h LT5ibG9ja19udW1iZXIgPSBibGtfbnVtOworCWZzbF9xZG1hLT5ibG9ja19vZmZzZXQgPSBibGtf b2ZmOworCisJbXV0ZXhfaW5pdCgmZnNsX3FkbWEtPmZzbF9xZG1hX211dGV4KTsKKworCWZvciAo aSA9IDA7IGkgPCBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBpKyspIHsKKwkJZnNsX3FkbWEtPnN0 YXR1c1tpXSA9IGZzbF9xZG1hX3ByZXBfc3RhdHVzX3F1ZXVlKHBkZXYpOworCQlpZiAoIWZzbF9x ZG1hLT5zdGF0dXNbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVzID0gcGxhdGZvcm1f Z2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlmc2xfcWRtYS0+Y3RybF9i YXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VS Uihmc2xfcWRtYS0+Y3RybF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmN0cmxf YmFzZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9N RU0sIDEpOworCWZzbF9xZG1hLT5zdGF0dXNfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgm cGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKSkKKwkJ cmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKTsKKworCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJZnNsX3FkbWEtPmJsb2Nr X2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNf RVJSKGZzbF9xZG1hLT5ibG9ja19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmJs b2NrX2Jhc2UpOworCWZzbF9xZG1hLT5xdWV1ZSA9IGZzbF9xZG1hX2FsbG9jX3F1ZXVlX3Jlc291 cmNlcyhwZGV2LCBmc2xfcWRtYSk7CisJaWYgKCFmc2xfcWRtYS0+cXVldWUpCisJCXJldHVybiAt RU5PTUVNOworCisJcmV0ID0gZnNsX3FkbWFfaXJxX2luaXQocGRldiwgZnNsX3FkbWEpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmc2xfcWRtYS0+aXJxX2Jhc2UgPSBwbGF0Zm9ybV9n ZXRfaXJxX2J5bmFtZShwZGV2LCAicWRtYS1xdWV1ZTAiKTsKKwlmc2xfcWRtYS0+ZmVhdHVyZSA9 IG9mX3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImJpZy1lbmRpYW4iKTsKKwlJTklUX0xJU1RfSEVB RCgmZnNsX3FkbWEtPmRtYV9kZXYuY2hhbm5lbHMpOworCisJZm9yIChpID0gMDsgaSA8IGZzbF9x ZG1hLT5uX2NoYW5zOyBpKyspIHsKKwkJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuID0g JmZzbF9xZG1hLT5jaGFuc1tpXTsKKworCQlmc2xfY2hhbi0+cWRtYSA9IGZzbF9xZG1hOworCQlm c2xfY2hhbi0+cXVldWUgPSBmc2xfcWRtYS0+cXVldWUgKyBpICUgKGZzbF9xZG1hLT5uX3F1ZXVl cyAqCisJCQkJCQkJZnNsX3FkbWEtPmJsb2NrX251bWJlcik7CisJCWZzbF9jaGFuLT52Y2hhbi5k ZXNjX2ZyZWUgPSBmc2xfcWRtYV9mcmVlX2Rlc2M7CisJCXZjaGFuX2luaXQoJmZzbF9jaGFuLT52 Y2hhbiwgJmZzbF9xZG1hLT5kbWFfZGV2KTsKKwl9CisKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZ LCBmc2xfcWRtYS0+ZG1hX2Rldi5jYXBfbWFzayk7CisKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXYg PSAmcGRldi0+ZGV2OworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3Vy Y2VzID0KKwkJZnNsX3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlmc2xfcWRtYS0+ZG1hX2Rl di5kZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPQorCQlmc2xfcWRtYV9hbGxvY19jaGFuX3Jl c291cmNlczsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfdHhfc3RhdHVzID0gZG1hX2Nvb2tp ZV9zdGF0dXM7CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGZz bF9xZG1hX3ByZXBfbWVtY3B5OworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9pc3N1ZV9wZW5k aW5nID0gZnNsX3FkbWFfaXNzdWVfcGVuZGluZzsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2Vf c3luY2hyb25pemUgPSBmc2xfcWRtYV9zeW5jaHJvbml6ZTsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5k ZXZpY2VfdGVybWluYXRlX2FsbCA9IGZzbF9xZG1hX3Rlcm1pbmF0ZV9hbGw7CisKKwlkbWFfc2V0 X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDQwKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2 ZGF0YShwZGV2LCBmc2xfcWRtYSk7CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVy KCZmc2xfcWRtYS0+ZG1hX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYs CisJCQkiQ2FuJ3QgcmVnaXN0ZXIgTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUuXG4iKTsKKwkJ cmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBmc2xfcWRtYV9yZWdfaW5pdChmc2xfcWRtYSk7CisJ aWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBJbml0aWFsaXplIHRoZSBx RE1BIGVuZ2luZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBmc2xfcWRtYV9jbGVhbnVwX3ZjaGFuKHN0cnVjdCBkbWFfZGV2aWNlICpkbWFk ZXYpCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKKworCWxpc3RfZm9y X2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwKKwkJCQkgJmRtYWRldi0+Y2hhbm5lbHMsIHZj aGFuLmNoYW4uZGV2aWNlX25vZGUpIHsKKwkJbGlzdF9kZWwoJmNoYW4tPnZjaGFuLmNoYW4uZGV2 aWNlX25vZGUpOworCQl0YXNrbGV0X2tpbGwoJmNoYW4tPnZjaGFuLnRhc2spOworCX0KK30KKwor c3RhdGljIGludCBmc2xfcWRtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikK K3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnN0YXR1czsKKwlzdHJ1Y3QgZGV2 aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2lu ZSAqZnNsX3FkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZzbF9xZG1hX2ly cV9leGl0KHBkZXYsIGZzbF9xZG1hKTsKKwlmc2xfcWRtYV9jbGVhbnVwX3ZjaGFuKCZmc2xfcWRt YS0+ZG1hX2Rldik7CisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShucCk7CisJZG1hX2FzeW5jX2Rl dmljZV91bnJlZ2lzdGVyKCZmc2xfcWRtYS0+ZG1hX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwg ZnNsX3FkbWEtPmJsb2NrX251bWJlcjsgaSsrKSB7CisJCXN0YXR1cyA9IGZzbF9xZG1hLT5zdGF0 dXNbaV07CisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZnNs X3FkbWFfZm9ybWF0KSAqCisJCQkJc3RhdHVzLT5uX2NxLCBzdGF0dXMtPmNxLCBzdGF0dXMtPmJ1 c19hZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2 aWNlX2lkIGZzbF9xZG1hX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGxzMTAy MWEtcWRtYSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJM RShvZiwgZnNsX3FkbWFfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIg ZnNsX3FkbWFfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJmc2wtcWRtYSIs CisJCS5vZl9tYXRjaF90YWJsZSA9IGZzbF9xZG1hX2R0X2lkcywKKwl9LAorCS5wcm9iZSAgICAg ICAgICA9IGZzbF9xZG1hX3Byb2JlLAorCS5yZW1vdmUJCT0gZnNsX3FkbWFfcmVtb3ZlLAorfTsK KworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfcWRtYV9kcml2ZXIpOworCitNT0RVTEVfQUxJ QVMoInBsYXRmb3JtOmZzbC1xZG1hIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5YUCBMYXllcnNj YXBlIHFETUEgZW5naW5lIGRyaXZlciIpOwo=