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: [v9,3/7] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs From: Peng Ma Message-Id: <20181017055957.542-3-peng.ma@nxp.com> Date: Wed, 17 Oct 2018 13:59:53 +0800 To: vkoul@kernel.org Cc: robh+dt@kernel.org, mark.rutland@arm.com, shawnguo@kernel.org, leoyang.li@nxp.com, dan.j.williams@intel.com, zw@zh-kernel.org, dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linuxppc-dev@lists.ozlabs.org, Peng Ma , Wen He , Jiaheng Fan List-ID: TlhQIFF1ZXVlIERNQSBjb250cm9sbGVyKHFETUEpIG9uIExheWVyc2NhcGUgU29DcyBzdXBwb3J0 cyBjaGFubmVsCnZpcnR1YWxsaXphdGlvbiBieSBhbGxvd2luZyBETUEgam9icyB0byBiZSBlbnF1 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KCk5vdGUgdGhhdCB0aGlzIG1vZHVs ZSBkZXBlbmRzIG9uIE5YUCBEUEFBLgoKU2lnbmVkLW9mZi1ieTogV2VuIEhlIDx3ZW4uaGVfMUBu eHAuY29tPgpTaWduZWQtb2ZmLWJ5OiBKaWFoZW5nIEZhbiA8amlhaGVuZy5mYW5AbnhwLmNvbT4K U2lnbmVkLW9mZi1ieTogUGVuZyBNYSA8cGVuZy5tYUBueHAuY29tPgotLS0KY2hhbmdlIGluIHY5 OgoJLSBhZGQgbXVsdGkgYmxvY2sgZm9yIGVhY2ggY29yZSBxRE1BIGVuZ2luZSBkcml2ZXIgc3Vw cG9ydCAKCS0gcmVtb3ZlIHJlbWFpbmluZyBjb2RlIGZvciBTRyBtb2RlIHRvIGNsZWFuIHVwIHRo ZSBxZG1hIGRyaXZlcgoJLSBzZXQgU2NhdHRlci9HYXRoZXIgdGFibGUgd2l0aCA2NEIgYWxpZ25l ZCB0byBmaXhlZCBhbiBlcnJhdGEKCS0gQWRkZWQgbmV3IGludGVybmFsIGZ1bmN0aW9ucyB0byBp bXByb3ZlIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGRyaXZlciAKCWFuZCBkbyBzb21lIG90aGVyIGNs ZWFudXBzCgktIHJlbW92ZSB1c2VsZXNzIGhlYWRlcnMKCS0gZm9ybWF0IHNvbWUgYmFkIGNvZGUK CS0gdXNlIGRtYV9jb29raWVfc3RhdHVzIGFzIHN0YXR1cyBmbgoKIGRyaXZlcnMvZG1hL0tjb25m aWcgICAgfCAgIDEzICsKIGRyaXZlcnMvZG1hL01ha2VmaWxlICAgfCAgICAxICsKIGRyaXZlcnMv ZG1hL2ZzbC1xZG1hLmMgfCAxMjU3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKwogMyBmaWxlcyBjaGFuZ2VkLCAxMjcxIGluc2VydGlvbnMoKyksIDAgZGVs ZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEvZnNsLXFkbWEuYwoKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2RtYS9LY29uZmlnCmluZGV4 IGRhY2YzZjQuLjUwZTE5ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL0tjb25maWcKKysrIGIv ZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMjE4LDYgKzIxOCwxOSBAQCBjb25maWcgRlNMX0VETUEK IAkgIG11bHRpcGxleGluZyBjYXBhYmlsaXR5IGZvciBETUEgcmVxdWVzdCBzb3VyY2VzKHNsb3Qp LgogCSAgVGhpcyBtb2R1bGUgY2FuIGJlIGZvdW5kIG9uIEZyZWVzY2FsZSBWeWJyaWQgYW5kIExT LTEgU29Dcy4KIAorY29uZmlnIEZTTF9RRE1BCisgICAgICAgdHJpc3RhdGUgIk5YUCBMYXllcnNj YXBlIHFETUEgZW5naW5lIHN1cHBvcnQiCisgICAgICAgZGVwZW5kcyBvbiBBUk0gfHwgQVJNNjQK KyAgICAgICBzZWxlY3QgRE1BX0VOR0lORQorICAgICAgIHNlbGVjdCBETUFfVklSVFVBTF9DSEFO TkVMUworICAgICAgIHNlbGVjdCBETUFfRU5HSU5FX1JBSUQKKyAgICAgICBzZWxlY3QgQVNZTkNf VFhfRU5BQkxFX0NIQU5ORUxfU1dJVENICisgICAgICAgaGVscAorICAgICAgICAgU3VwcG9ydCB0 aGUgTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUgd2l0aCBjb21tYW5kIHF1ZXVlIGFuZCBsZWdh Y3kgbW9kZS4KKyAgICAgICAgIENoYW5uZWwgdmlydHVhbGl6YXRpb24gaXMgc3VwcG9ydGVkIHRo cm91Z2ggZW5xdWV1aW5nIG9mIERNQSBqb2JzIHRvLAorICAgICAgICAgb3IgZGVxdWV1aW5nIERN QSBqb2JzIGZyb20sIGRpZmZlcmVudCB3b3JrIHF1ZXVlcy4KKyAgICAgICAgIFRoaXMgbW9kdWxl IGNhbiBiZSBmb3VuZCBvbiBOWFAgTGF5ZXJzY2FwZSBTb0NzLgorCiBjb25maWcgRlNMX1JBSUQK ICAgICAgICAgdHJpc3RhdGUgIkZyZWVzY2FsZSBSQUlEIGVuZ2luZSBTdXBwb3J0IgogICAgICAg ICBkZXBlbmRzIG9uIEZTTF9TT0MgJiYgIUFTWU5DX1RYX0VOQUJMRV9DSEFOTkVMX1NXSVRDSApk aWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvTWFrZWZpbGUgYi9kcml2ZXJzL2RtYS9NYWtlZmlsZQpp bmRleCBjOTE3MDJkLi4yZDFiNTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9NYWtlZmlsZQor KysgYi9kcml2ZXJzL2RtYS9NYWtlZmlsZQpAQCAtMzIsNiArMzIsNyBAQCBvYmotJChDT05GSUdf RFdfRE1BQ19DT1JFKSArPSBkdy8KIG9iai0kKENPTkZJR19FUDkzWFhfRE1BKSArPSBlcDkzeHhf ZG1hLm8KIG9iai0kKENPTkZJR19GU0xfRE1BKSArPSBmc2xkbWEubwogb2JqLSQoQ09ORklHX0ZT TF9FRE1BKSArPSBmc2wtZWRtYS5vCitvYmotJChDT05GSUdfRlNMX1FETUEpICs9IGZzbC1xZG1h Lm8KIG9iai0kKENPTkZJR19GU0xfUkFJRCkgKz0gZnNsX3JhaWQubwogb2JqLSQoQ09ORklHX0hT VV9ETUEpICs9IGhzdS8KIG9iai0kKENPTkZJR19JTUdfTURDX0RNQSkgKz0gaW1nLW1kYy1kbWEu bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZnNsLXFkbWEuYyBiL2RyaXZlcnMvZG1hL2ZzbC1x ZG1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0ODY5ZQotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvZG1hL2ZzbC1xZG1hLmMKQEAgLTAsMCArMSwxMjU3IEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLy8gQ29weXJpZ2h0IDIwMTggTlhQ CisKKy8qCisgKiBEcml2ZXIgZm9yIE5YUCBMYXllcnNjYXBlIFF1ZXVlIERpcmVjdCBNZW1vcnkg QWNjZXNzIENvbnRyb2xsZXIKKyAqCisgKiBBdXRob3I6CisgKiAgV2VuIEhlIDx3ZW4uaGVfMUBu eHAuY29tPgorICogIEppYWhlbmcgRmFuIDxqaWFoZW5nLmZhbkBueHAuY29tPgorICoKKyAqLwor CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9vZl9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgor I2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+ CisKKyNpbmNsdWRlICJ2aXJ0LWRtYS5oIgorI2luY2x1ZGUgImZzbGRtYS5oIgorCisvKiBSZWdp c3RlciByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlNMX1FETUFfRE1SCQkJMHgwCisj ZGVmaW5lIEZTTF9RRE1BX0RTUgkJCTB4NAorI2RlZmluZSBGU0xfUURNQV9ERUlFUgkJCTB4ZTAw CisjZGVmaW5lIEZTTF9RRE1BX0RFRFIJCQkweGUwNAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFcw UgkJMHhlMTAKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXMVIJCTB4ZTE0CisjZGVmaW5lIEZTTF9R RE1BX0RFQ0ZEVzJSCQkweGUxOAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFczUgkJMHhlMWMKKyNk ZWZpbmUgRlNMX1FETUFfREVDRlFJRFIJCTB4ZTMwCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0JSCQkJ MHhlMzQKKworI2RlZmluZSBGU0xfUURNQV9CQ1FNUih4KQkJKDB4YzAgKyAweDEwMCAqICh4KSkK KyNkZWZpbmUgRlNMX1FETUFfQkNRU1IoeCkJCSgweGM0ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5l IEZTTF9RRE1BX0JDUUVEUEFfU0FERFIoeCkJKDB4YzggKyAweDEwMCAqICh4KSkKKyNkZWZpbmUg RlNMX1FETUFfQkNRRFBBX1NBRERSKHgpCSgweGNjICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZT TF9RRE1BX0JDUUVFUEFfU0FERFIoeCkJKDB4ZDAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUgRlNM X1FETUFfQkNRRVBBX1NBRERSKHgpCSgweGQ0ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9R RE1BX0JDUUlFUih4KQkJKDB4ZTAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUgRlNMX1FETUFfQkNR SURSKHgpCQkoMHhlNCArIDB4MTAwICogKHgpKQorCisjZGVmaW5lIEZTTF9RRE1BX1NRRFBBUgkJ CTB4ODBjCisjZGVmaW5lIEZTTF9RRE1BX1NRRVBBUgkJCTB4ODE0CisjZGVmaW5lIEZTTF9RRE1B X0JTUU1SCQkJMHg4MDAKKyNkZWZpbmUgRlNMX1FETUFfQlNRU1IJCQkweDgwNAorI2RlZmluZSBG U0xfUURNQV9CU1FJQ1IJCQkweDgyOAorI2RlZmluZSBGU0xfUURNQV9DUU1SCQkJMHhhMDAKKyNk ZWZpbmUgRlNMX1FETUFfQ1FEU0NSMQkJMHhhMDgKKyNkZWZpbmUgRlNMX1FETUFfQ1FEU0NSMiAg ICAgICAgICAgICAgICAweGEwYworI2RlZmluZSBGU0xfUURNQV9DUUlFUgkJCTB4YTEwCisjZGVm aW5lIEZTTF9RRE1BX0NRRURSCQkJMHhhMTQKKyNkZWZpbmUgRlNMX1FETUFfU1FDQ01SCQkJMHhh MjAKKworLyogUmVnaXN0ZXJzIGZvciBiaXQgYW5kIGdlbm1hc2sgKi8KKyNkZWZpbmUgRlNMX1FE TUFfQ1FJRFJfU1FUCQlCSVQoMTUpCisjZGVmaW5lIFFETUFfQ0NERl9GT1RNQVQJCUJJVCgyOSkK KyNkZWZpbmUgUURNQV9DQ0RGX1NFUgkJCUJJVCgzMCkKKyNkZWZpbmUgUURNQV9TR19GSU4JCQlC SVQoMzApCisjZGVmaW5lIFFETUFfU0dfTEVOX01BU0sJCUdFTk1BU0soMjksIDApCisjZGVmaW5l IFFETUFfQ0NERl9NQVNLCQkJR0VOTUFTSygyOCwgMjApCisKKyNkZWZpbmUgRlNMX1FETUFfREVE Ul9DTEVBUgkJR0VOTUFTSygzMSwgMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRSURSX0NMRUFSCQlH RU5NQVNLKDMxLCAwKQorI2RlZmluZSBGU0xfUURNQV9ERUlFUl9DTEVBUgkJR0VOTUFTSygzMSwg MCkKKworI2RlZmluZSBGU0xfUURNQV9CQ1FJRVJfQ1FUSUUJCUJJVCgxNSkKKyNkZWZpbmUgRlNM X1FETUFfQkNRSUVSX0NRUEVJRQkJQklUKDIzKQorI2RlZmluZSBGU0xfUURNQV9CU1FJQ1JfSUNF TgkJQklUKDMxKQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUUlDUl9JQ1NUKHgpCQkoKHgpIDw8IDE2 KQorI2RlZmluZSBGU0xfUURNQV9DUUlFUl9NRUlFCQlCSVQoMzEpCisjZGVmaW5lIEZTTF9RRE1B X0NRSUVSX1RFSUUJCUJJVCgwKQorI2RlZmluZSBGU0xfUURNQV9TUUNDTVJfRU5URVJfV00JQklU KDIxKQorCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1SX0VOCQlCSVQoMzEpCisjZGVmaW5lIEZTTF9R RE1BX0JDUU1SX0VJCQlCSVQoMzApCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1SX0NEX1RITEQoeCkJ KCh4KSA8PCAyMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfQ1FfU0laRSh4KQkoKHgpIDw8IDE2 KQorCisjZGVmaW5lIEZTTF9RRE1BX0JDUVNSX1FGCQlCSVQoMTYpCisjZGVmaW5lIEZTTF9RRE1B X0JDUVNSX1hPRkYJCUJJVCgwKQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUU1SX0VOCQlCSVQoMzEp CisjZGVmaW5lIEZTTF9RRE1BX0JTUU1SX0RJCQlCSVQoMzApCisjZGVmaW5lIEZTTF9RRE1BX0JT UU1SX0NRX1NJWkUoeCkJKCh4KSA8PCAxNikKKworI2RlZmluZSBGU0xfUURNQV9CU1FTUl9RRQkJ QklUKDE3KQorCisjZGVmaW5lIEZTTF9RRE1BX0RNUl9EUUQJCUJJVCgzMCkKKyNkZWZpbmUgRlNM X1FETUFfRFNSX0RCCQlCSVQoMzEpCisKKy8qIFNpemUgcmVsYXRlZCBkZWZpbml0aW9uICovCisj ZGVmaW5lIEZTTF9RRE1BX1FVRVVFX01BWAkJOAorI2RlZmluZSBGU0xfUURNQV9DT01NQU5EX0JV RkZFUl9TSVpFCTY0CisjZGVmaW5lIEZTTF9RRE1BX0RFU0NSSVBUT1JfQlVGRkVSX1NJWkUgMzIK KyNkZWZpbmUgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01JTgk2NAorI2RlZmluZSBGU0xf UURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYCTE2Mzg0CisjZGVmaW5lIEZTTF9RRE1BX1FVRVVF X05VTV9NQVgJCTgKKworLyogRmllbGQgZGVmaW5pdGlvbiBmb3IgQ01EICovCisjZGVmaW5lIEZT TF9RRE1BX0NNRF9SV1RUWVBFCQkweDQKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0xXQyAgICAgICAg ICAgICAgICAweDIKKyNkZWZpbmUgRlNMX1FETUFfQ01EX1JXVFRZUEVfT0ZGU0VUCTI4CisjZGVm aW5lIEZTTF9RRE1BX0NNRF9OU19PRkZTRVQJCTI3CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9EUU9T X09GRlNFVAkyNAorI2RlZmluZSBGU0xfUURNQV9DTURfV1RIUk9UTF9PRkZTRVQJMjAKKyNkZWZp bmUgRlNMX1FETUFfQ01EX0RTRU5fT0ZGU0VUCTE5CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9MV0Nf T0ZGU0VUCQkxNgorCisvKiBGaWVsZCBkZWZpbml0aW9uIGZvciBEZXNjcmlwdG9yIG9mZnNldCAq LworI2RlZmluZSBRRE1BX0NDREZfU1RBVFVTCQkyMAorI2RlZmluZSBRRE1BX0NDREZfT0ZGU0VU CQkyMAorCisvKiBGaWVsZCBkZWZpbml0aW9uIGZvciBzYWZlIGxvb3AgY291bnQqLworI2RlZmlu ZSBGU0xfUURNQV9IQUxUX0NPVU5UCQkxNTAwCisjZGVmaW5lIEZTTF9RRE1BX01BWF9TSVpFCQkx NjM4NQorI2RlZmluZQlGU0xfUURNQV9DT01QX1RJTUVPVVQJCTEwMDAKKyNkZWZpbmUgRlNMX0NP TU1BTkRfUVVFVUVfT1ZFUkZMTE9XCTEwCisKKyNkZWZpbmUgRlNMX1FETUFfQkxPQ0tfQkFTRV9P RkZTRVQoZnNsX3FkbWFfZW5naW5lLCB4KQkJCVwKKwkoKChmc2xfcWRtYV9lbmdpbmUpLT5ibG9j a19vZmZzZXQpICogKHgpKQorCisvKioKKyAqIHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgLSBUaGlz IGlzIHRoZSBzdHJ1Y3QgaG9sZGluZyBkZXNjcmliaW5nIGNvbXBvdW5kCisgKgkJCSAgICBkZXNj cmlwdG9yIGZvcm1hdCB3aXRoIHFETUEuCisgKiBAc3RhdHVzOgkJICAgIENvbW1hbmQgc3RhdHVz IGFuZCBlbnF1ZXVlIHN0YXR1cyBub3RpZmljYXRpb24uCisgKiBAY2ZnOgkJICAgIEZyYW1lIG9m ZnNldCBhbmQgZnJhbWUgZm9ybWF0LgorICogQGFkZHJfbG86CQkgICAgSG9sZGluZyB0aGUgY29t cG91bmQgZGVzY3JpcHRvciBvZiB0aGUgbG93ZXIKKyAqCQkJICAgIDMyLWJpdHMgYWRkcmVzcyBp biBtZW1vcnkgNDAtYml0IGFkZHJlc3MuCisgKiBAYWRkcl9oaToJCSAgICBTYW1lIGFzIGFib3Zl IG1lbWJlciwgYnV0IHBvaW50IGhpZ2ggOC1iaXRzIGluCisgKgkJCSAgICBtZW1vcnkgNDAtYml0 IGFkZHJlc3MuCisgKiBAX19yZXNlcnZlZDE6CSAgICBSZXNlcnZlZCBmaWVsZC4KKyAqIEBjZmc4 Yl93MToJCSAgICBDb21wb3VuZCBkZXNjcmlwdG9yIGNvbW1hbmQgcXVldWUgb3JpZ2luIHByb2R1 Y2VkCisgKgkJCSAgICBieSBxRE1BIGFuZCBkeW5hbWljIGRlYnVnIGZpZWxkLgorICogQGRhdGEJ CSAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgNDAtYml0IGFkZHJlc3MsIGRlc2NyaWJlcyBETUEK KyAqCQkJICAgIHNvdXJjZSBpbmZvcm1hdGlvbiBhbmQgRE1BIGRlc3RpbmF0aW9uIGluZm9ybWF0 aW9uLgorICovCitzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0IHsKKwlfX2xlMzIgc3RhdHVzOworCV9f bGUzMiBjZmc7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJX19sZTMyIGFkZHJfbG87CisJCQl1 OCBhZGRyX2hpOworCQkJdTggX19yZXNlcnZlZDFbMl07CisJCQl1OCBjZmc4Yl93MTsKKwkJfSBf X3BhY2tlZDsKKwkJX19sZTY0IGRhdGE7CisJfTsKK30gX19wYWNrZWQ7CisKKy8qIHFETUEgc3Rh dHVzIG5vdGlmaWNhdGlvbiBwcmUgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCBmc2xfcHJlX3N0YXR1 cyB7CisJdTY0IGFkZHI7CisJdTggcXVldWU7Cit9OworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUo c3RydWN0IGZzbF9wcmVfc3RhdHVzLCBwcmUpOworCitzdHJ1Y3QgZnNsX3FkbWFfY2hhbiB7CisJ c3RydWN0IHZpcnRfZG1hX2NoYW4JCXZjaGFuOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjCQl2ZGVz YzsKKwllbnVtIGRtYV9zdGF0dXMJCQlzdGF0dXM7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZQkJ KnFkbWE7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlCQkqcXVldWU7Cit9OworCitzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgeworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKnZpcnRfaGVhZDsKKwlzdHJ1 Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0X3RhaWw7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX3Vz ZWQ7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX2ZyZWU7CisJc3RydWN0IGRtYV9wb29sCQkqY29t cF9wb29sOworCXN0cnVjdCBkbWFfcG9vbAkJKmRlc2NfcG9vbDsKKwlzcGlubG9ja190CQlxdWV1 ZV9sb2NrOworCWRtYV9hZGRyX3QJCWJ1c19hZGRyOworCXUzMiAgICAgICAgICAgICAgICAgICAg IG5fY3E7CisJdTMyCQkJaWQ7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdAkqY3E7CisJdm9pZCBf X2lvbWVtCQkqYmxvY2tfYmFzZTsKK307CisKK3N0cnVjdCBmc2xfcWRtYV9jb21wIHsKKwlkbWFf YWRkcl90ICAgICAgICAgICAgICBidXNfYWRkcjsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgICBk ZXNjX2J1c19hZGRyOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKnZpcnRfYWRkcjsKKwlzdHJ1 Y3QgZnNsX3FkbWFfZm9ybWF0CSpkZXNjX3ZpcnRfYWRkcjsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hh bgkqcWNoYW47CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgICAgdmRlc2M7CisJc3RydWN0IGxpc3Rf aGVhZAlsaXN0OworfTsKKworc3RydWN0IGZzbF9xZG1hX2VuZ2luZSB7CisJc3RydWN0IGRtYV9k ZXZpY2UJZG1hX2RldjsKKwl2b2lkIF9faW9tZW0JCSpjdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVt ICAgICAgICAgICAgKnN0YXR1c19iYXNlOworCXZvaWQgX19pb21lbQkJKmJsb2NrX2Jhc2U7CisJ dTMyCQkJbl9jaGFuczsKKwl1MzIJCQluX3F1ZXVlczsKKwlzdHJ1Y3QgbXV0ZXggICAgICAgICAg ICBmc2xfcWRtYV9tdXRleDsKKwlpbnQJCQllcnJvcl9pcnE7CisJaW50CQkJKnF1ZXVlX2lycTsK Kwl1MzIJCQlmZWF0dXJlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZQkqcXVldWU7CisJc3RydWN0 IGZzbF9xZG1hX3F1ZXVlCSoqc3RhdHVzOworCXN0cnVjdCBmc2xfcWRtYV9jaGFuCSpjaGFuczsK KwlpbnQJCQlibG9ja19udW1iZXI7CisJaW50CQkJYmxvY2tfb2Zmc2V0OworCWludAkJCWlycV9i YXNlOworCWludAkJCWRlc2NfYWxsb2NhdGVkOworCit9OworCitzdGF0aWMgaW5saW5lIHU2NAor cWRtYV9jY2RmX2FkZHJfZ2V0NjQoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikK K3sKKwlyZXR1cm4gbGU2NF90b19jcHUoY2NkZi0+ZGF0YSkgJiAoVTY0X01BWCA+PiAyNCk7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcWRtYV9kZXNjX2FkZHJfc2V0NjQoc3RydWN0IGZzbF9x ZG1hX2Zvcm1hdCAqY2NkZiwgdTY0IGFkZHIpCit7CisJY2NkZi0+YWRkcl9oaSA9IHVwcGVyXzMy X2JpdHMoYWRkcik7CisJY2NkZi0+YWRkcl9sbyA9IGNwdV90b19sZTMyKGxvd2VyXzMyX2JpdHMo YWRkcikpOworfQorCitzdGF0aWMgaW5saW5lIHU4CitxZG1hX2NjZGZfZ2V0X3F1ZXVlKGNvbnN0 IHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCit7CisJcmV0dXJuIGNjZGYtPmNmZzhiX3cx ICYgVThfTUFYOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRtYV9jY2RmX2dldF9vZmZzZXQo Y29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gKGxlMzJfdG9f Y3B1KGNjZGYtPmNmZykgJiBRRE1BX0NDREZfTUFTSykgPj4gUURNQV9DQ0RGX09GRlNFVDsKK30K Kworc3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0X2Zvcm1hdChzdHJ1Y3QgZnNsX3Fk bWFfZm9ybWF0ICpjY2RmLCBpbnQgb2Zmc2V0KQoreworCWNjZGYtPmNmZyA9IGNwdV90b19sZTMy KFFETUFfQ0NERl9GT1RNQVQgfCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRt YV9jY2RmX2dldF9zdGF0dXMoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sK KwlyZXR1cm4gKGxlMzJfdG9fY3B1KGNjZGYtPnN0YXR1cykgJiBRRE1BX0NDREZfTUFTSykgPj4g UURNQV9DQ0RGX1NUQVRVUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0 X3NlcihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCBpbnQgc3RhdHVzKQoreworCWNjZGYt PnN0YXR1cyA9IGNwdV90b19sZTMyKFFETUFfQ0NERl9TRVIgfCBzdGF0dXMpOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgcWRtYV9jc2dmX3NldF9sZW4oc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAq Y3NnZiwgaW50IGxlbikKK3sKKwljc2dmLT5jZmcgPSBjcHVfdG9fbGUzMihsZW4gJiBRRE1BX1NH X0xFTl9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRfZihzdHJ1 Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dmLCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNwdV90 b19sZTMyKFFETUFfU0dfRklOIHwgKGxlbiAmIFFETUFfU0dfTEVOX01BU0spKTsKK30KKworc3Rh dGljIHUzMiBxZG1hX3JlYWRsKHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEsIHZvaWQgX19p b21lbSAqYWRkcikKK3sKKwlyZXR1cm4gRlNMX0RNQV9JTihxZG1hLCBhZGRyLCAzMik7Cit9CisK K3N0YXRpYyB2b2lkIHFkbWFfd3JpdGVsKHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEsIHUz MiB2YWwsCisJCQl2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJRlNMX0RNQV9PVVQocWRtYSwgYWRk ciwgdmFsLCAzMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqdG9fZnNsX3Fk bWFfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihj aGFuLCBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiwgdmNoYW4uY2hhbik7Cit9CisKK3N0YXRpYyBzdHJ1 Y3QgZnNsX3FkbWFfY29tcCAqdG9fZnNsX3FkbWFfY29tcChzdHJ1Y3QgdmlydF9kbWFfZGVzYyAq dmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IGZzbF9xZG1hX2NvbXAsIHZk ZXNjKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1 Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuID0g dG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1 ZSA9IGZzbF9jaGFuLT5xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSA9 IGZzbF9jaGFuLT5xZG1hOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXAsICpfY29t cF90ZW1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJc3Bp bl9sb2NrX2lycXNhdmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisJdmNoYW5fZ2V0 X2FsbF9kZXNjcmlwdG9ycygmZnNsX2NoYW4tPnZjaGFuLCAmaGVhZCk7CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmZnNsX2NoYW4tPnZjaGFuLmxvY2ssIGZsYWdzKTsKKworCXZjaGFuX2RtYV9k ZXNjX2ZyZWVfbGlzdCgmZnNsX2NoYW4tPnZjaGFuLCAmaGVhZCk7CisKKwlpZiAoIWZzbF9xdWV1 ZS0+Y29tcF9wb29sICYmICFmc2xfcXVldWUtPmNvbXBfcG9vbCkKKwkJcmV0dXJuOworCisJbGlz dF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbXBfdGVtcCwgX2NvbXBfdGVtcCwKKwkJCQkgJmZzbF9x dWV1ZS0+Y29tcF91c2VkLAlsaXN0KSB7CisJCWRtYV9wb29sX2ZyZWUoZnNsX3F1ZXVlLT5jb21w X3Bvb2wsCisJCQkgICAgICBjb21wX3RlbXAtPnZpcnRfYWRkciwKKwkJCSAgICAgIGNvbXBfdGVt cC0+YnVzX2FkZHIpOworCQlkbWFfcG9vbF9mcmVlKGZzbF9xdWV1ZS0+ZGVzY19wb29sLAorCQkJ ICAgICAgY29tcF90ZW1wLT5kZXNjX3ZpcnRfYWRkciwKKwkJCSAgICAgIGNvbXBfdGVtcC0+ZGVz Y19idXNfYWRkcik7CisJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCQlrZnJlZShjb21w X3RlbXApOworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb21wX3RlbXAsIF9jb21w X3RlbXAsCisJCQkJICZmc2xfcXVldWUtPmNvbXBfZnJlZSwgbGlzdCkgeworCQlkbWFfcG9vbF9m cmVlKGZzbF9xdWV1ZS0+Y29tcF9wb29sLAorCQkJICAgICAgY29tcF90ZW1wLT52aXJ0X2FkZHIs CisJCQkgICAgICBjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJZG1hX3Bvb2xfZnJlZShmc2xfcXVl dWUtPmRlc2NfcG9vbCwKKwkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIsCisJCQkg ICAgICBjb21wX3RlbXAtPmRlc2NfYnVzX2FkZHIpOworCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5s aXN0KTsKKwkJa2ZyZWUoY29tcF90ZW1wKTsKKwl9CisKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9x dWV1ZS0+Y29tcF9wb29sKTsKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19wb29s KTsKKworCWZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZC0tOworCWZzbF9xdWV1ZS0+Y29tcF9wb29s ID0gTlVMTDsKKwlmc2xfcXVldWUtPmRlc2NfcG9vbCA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lk IGZzbF9xZG1hX2NvbXBfZmlsbF9tZW1jcHkoc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21w LAorCQkJCSAgICAgIGRtYV9hZGRyX3QgZHN0LCBkbWFfYWRkcl90IHNyYywgdTMyIGxlbikKK3sK KwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpzZGYsICpkZGY7CisJc3RydWN0IGZzbF9xZG1hX2Zv cm1hdCAqY2NkZiwgKmNzZ2ZfZGVzYywgKmNzZ2Zfc3JjLCAqY3NnZl9kZXN0OworCisJY2NkZiA9 IGZzbF9jb21wLT52aXJ0X2FkZHI7CisJY3NnZl9kZXNjID0gZnNsX2NvbXAtPnZpcnRfYWRkciAr IDE7CisJY3NnZl9zcmMgPSBmc2xfY29tcC0+dmlydF9hZGRyICsgMjsKKwljc2dmX2Rlc3QgPSBm c2xfY29tcC0+dmlydF9hZGRyICsgMzsKKwlzZGYgPSBmc2xfY29tcC0+ZGVzY192aXJ0X2FkZHI7 CisJZGRmID0gZnNsX2NvbXAtPmRlc2NfdmlydF9hZGRyICsgMTsKKworCW1lbXNldChmc2xfY29t cC0+dmlydF9hZGRyLCAwLCBGU0xfUURNQV9DT01NQU5EX0JVRkZFUl9TSVpFKTsKKwltZW1zZXQo ZnNsX2NvbXAtPmRlc2NfdmlydF9hZGRyLCAwLCBGU0xfUURNQV9ERVNDUklQVE9SX0JVRkZFUl9T SVpFKTsKKwkvKiBIZWFkIENvbW1hbmQgRGVzY3JpcHRvcihGcmFtZSBEZXNjcmlwdG9yKSAqLwor CXFkbWFfZGVzY19hZGRyX3NldDY0KGNjZGYsIGZzbF9jb21wLT5idXNfYWRkciArIDE2KTsKKwlx ZG1hX2NjZGZfc2V0X2Zvcm1hdChjY2RmLCBxZG1hX2NjZGZfZ2V0X29mZnNldChjY2RmKSk7CisJ cWRtYV9jY2RmX3NldF9zZXIoY2NkZiwgcWRtYV9jY2RmX2dldF9zdGF0dXMoY2NkZikpOworCS8q IFN0YXR1cyBub3RpZmljYXRpb24gaXMgZW5xdWV1ZWQgdG8gc3RhdHVzIHF1ZXVlLiAqLworCS8q IENvbXBvdW5kIENvbW1hbmQgRGVzY3JpcHRvcihGcmFtZSBMaXN0IFRhYmxlKSAqLworCXFkbWFf ZGVzY19hZGRyX3NldDY0KGNzZ2ZfZGVzYywgZnNsX2NvbXAtPmRlc2NfYnVzX2FkZHIpOworCS8q IEl0IG11c3QgYmUgMzIgYXMgQ29tcG91bmQgUy9HIERlc2NyaXB0b3IgKi8KKwlxZG1hX2NzZ2Zf c2V0X2xlbihjc2dmX2Rlc2MsIDMyKTsKKwlxZG1hX2Rlc2NfYWRkcl9zZXQ2NChjc2dmX3NyYywg c3JjKTsKKwlxZG1hX2NzZ2Zfc2V0X2xlbihjc2dmX3NyYywgbGVuKTsKKwlxZG1hX2Rlc2NfYWRk cl9zZXQ2NChjc2dmX2Rlc3QsIGRzdCk7CisJcWRtYV9jc2dmX3NldF9sZW4oY3NnZl9kZXN0LCBs ZW4pOworCS8qIFRoaXMgZW50cnkgaXMgdGhlIGxhc3QgZW50cnkuICovCisJcWRtYV9jc2dmX3Nl dF9mKGNzZ2ZfZGVzdCwgbGVuKTsKKwkvKiBEZXNjcmlwdG9yIEJ1ZmZlciAqLworCXNkZi0+ZGF0 YSA9CisJCWNwdV90b19sZTY0KEZTTF9RRE1BX0NNRF9SV1RUWVBFIDw8CisJCQkgICAgRlNMX1FE TUFfQ01EX1JXVFRZUEVfT0ZGU0VUKTsKKwlkZGYtPmRhdGEgPQorCQljcHVfdG9fbGU2NChGU0xf UURNQV9DTURfUldUVFlQRSA8PAorCQkJICAgIEZTTF9RRE1BX0NNRF9SV1RUWVBFX09GRlNFVCk7 CisJZGRmLT5kYXRhIHw9CisJCWNwdV90b19sZTY0KEZTTF9RRE1BX0NNRF9MV0MgPDwgRlNMX1FE TUFfQ01EX0xXQ19PRkZTRVQpOworfQorCisvKgorICogUHJlLXJlcXVlc3QgZnVsbCBjb21tYW5k IGRlc2NyaXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJlX3Jl cXVlc3RfZW5xdWV1ZV9kZXNjKHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWUpCit7CisJaW50 IGk7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmNvbXBfdGVtcCwgKl9jb21wX3RlbXA7CisKKwlm b3IgKGkgPSAwOyBpIDwgcXVldWUtPm5fY3EgKyBGU0xfQ09NTUFORF9RVUVVRV9PVkVSRkxMT1c7 IGkrKykgeworCQljb21wX3RlbXAgPSBremFsbG9jKHNpemVvZigqY29tcF90ZW1wKSwgR0ZQX0tF Uk5FTCk7CisJCWlmICghY29tcF90ZW1wKQorCQkJZ290byBlcnJfYWxsb2M7CisJCWNvbXBfdGVt cC0+dmlydF9hZGRyID0KKwkJCWRtYV9wb29sX2FsbG9jKHF1ZXVlLT5jb21wX3Bvb2wsIEdGUF9L RVJORUwsCisJCQkJICAgICAgICZjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJaWYgKCFjb21wX3Rl bXAtPnZpcnRfYWRkcikKKwkJCWdvdG8gZXJyX2RtYV9hbGxvYzsKKworCQljb21wX3RlbXAtPmRl c2NfdmlydF9hZGRyID0KKwkJCWRtYV9wb29sX2FsbG9jKHF1ZXVlLT5kZXNjX3Bvb2wsIEdGUF9L RVJORUwsCisJCQkJICAgICAgICZjb21wX3RlbXAtPmRlc2NfYnVzX2FkZHIpOworCQlpZiAoIWNv bXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIpCisJCQlnb3RvIGVycl9kZXNjX2RtYV9hbGxvYzsKKwor CQlsaXN0X2FkZF90YWlsKCZjb21wX3RlbXAtPmxpc3QsICZxdWV1ZS0+Y29tcF9mcmVlKTsKKwl9 CisKKwlyZXR1cm4gMDsKKworZXJyX2Rlc2NfZG1hX2FsbG9jOgorCWRtYV9wb29sX2ZyZWUocXVl dWUtPmNvbXBfcG9vbCwgY29tcF90ZW1wLT52aXJ0X2FkZHIsCisJCSAgICAgIGNvbXBfdGVtcC0+ YnVzX2FkZHIpOworCitlcnJfZG1hX2FsbG9jOgorCWtmcmVlKGNvbXBfdGVtcCk7CisKK2Vycl9h bGxvYzoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29tcF90ZW1wLCBfY29tcF90ZW1wLAor CQkJCSAmcXVldWUtPmNvbXBfZnJlZSwgbGlzdCkgeworCQlpZiAoY29tcF90ZW1wLT52aXJ0X2Fk ZHIpCisJCQlkbWFfcG9vbF9mcmVlKHF1ZXVlLT5jb21wX3Bvb2wsCisJCQkJICAgICAgY29tcF90 ZW1wLT52aXJ0X2FkZHIsCisJCQkJICAgICAgY29tcF90ZW1wLT5idXNfYWRkcik7CisJCWlmIChj b21wX3RlbXAtPmRlc2NfdmlydF9hZGRyKQorCQkJZG1hX3Bvb2xfZnJlZShxdWV1ZS0+ZGVzY19w b29sLAorCQkJCSAgICAgIGNvbXBfdGVtcC0+ZGVzY192aXJ0X2FkZHIsCisJCQkJICAgICAgY29t cF90ZW1wLT5kZXNjX2J1c19hZGRyKTsKKworCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0KTsK KwkJa2ZyZWUoY29tcF90ZW1wKTsKKwl9CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAq IFJlcXVlc3QgYSBjb21tYW5kIGRlc2NyaXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRpYyBz dHJ1Y3QgZnNsX3FkbWFfY29tcAorKmZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKHN0cnVj dCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0 cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXA7CisJaW50IHRpbWVvdXQgPSBGU0xfUURNQV9D T01QX1RJTUVPVVQ7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpxdWV1ZSA9IGZzbF9jaGFuLT5x dWV1ZTsKKworCXdoaWxlICh0aW1lb3V0LS0pIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVl LT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWlmICghbGlzdF9lbXB0eSgmcXVldWUtPmNvbXBfZnJl ZSkpIHsKKwkJCWNvbXBfdGVtcCA9IGxpc3RfZmlyc3RfZW50cnkoJnF1ZXVlLT5jb21wX2ZyZWUs CisJCQkJCQkgICAgIHN0cnVjdCBmc2xfcWRtYV9jb21wLAorCQkJCQkJICAgICBsaXN0KTsKKwkJ CWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQkJY29tcF90ZW1wLT5xY2hhbiA9IGZzbF9j aGFuOworCQkJcmV0dXJuIGNvbXBfdGVtcDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQl1ZGVsYXkoMSk7CisJfQorCisJcmV0dXJu IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfcXVldWUKKypmc2xfcWRtYV9hbGxv Y19xdWV1ZV9yZXNvdXJjZXMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQlzdHJ1 Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgcmV0LCBsZW4sIGksIGo7CisJ aW50IHF1ZXVlX251bSwgYmxvY2tfbnVtYmVyOworCXVuc2lnbmVkIGludCBxdWV1ZV9zaXplW0ZT TF9RRE1BX1FVRVVFX01BWF07CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpxdWV1ZV9oZWFkLCAq cXVldWVfdGVtcDsKKworCXF1ZXVlX251bSA9IGZzbF9xZG1hLT5uX3F1ZXVlczsKKwlibG9ja19u dW1iZXIgPSBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOworCisJaWYgKHF1ZXVlX251bSA+IEZTTF9R RE1BX1FVRVVFX01BWCkKKwkJcXVldWVfbnVtID0gRlNMX1FETUFfUVVFVUVfTUFYOworCWxlbiA9 IHNpemVvZigqcXVldWVfaGVhZCkgKiBxdWV1ZV9udW0gKiBibG9ja19udW1iZXI7CisJcXVldWVf aGVhZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICgh cXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVh ZF91MzJfYXJyYXkoJnBkZXYtPmRldiwgInF1ZXVlLXNpemVzIiwKKwkJCQkJICAgICBxdWV1ZV9z aXplLCBxdWV1ZV9udW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fu J3QgZ2V0IHF1ZXVlLXNpemVzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlmb3IgKGogPSAw OyBqIDwgYmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IHF1ZXVlX251bTsg aSsrKSB7CisJCQlpZiAocXVldWVfc2l6ZVtpXSA+IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0la RV9NQVggfHwKKwkJCSAgICBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19T SVpFX01JTikgeworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkJIkdldCB3cm9uZyBxdWV1 ZS1zaXplcy5cbiIpOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQkJcXVldWVfdGVtcCA9IHF1 ZXVlX2hlYWQgKyBpICsgKGogKiBxdWV1ZV9udW0pOworCisJCQlxdWV1ZV90ZW1wLT5jcSA9CisJ CQlkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkJICAgc2l6ZW9mKHN0cnVjdCBm c2xfcWRtYV9mb3JtYXQpICoKKwkJCQkJICAgcXVldWVfc2l6ZVtpXSwKKwkJCQkJICAgJnF1ZXVl X3RlbXAtPmJ1c19hZGRyLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJCWlmICghcXVldWVfdGVt cC0+Y3EpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlxdWV1ZV90ZW1wLT5ibG9ja19iYXNlID0gZnNs X3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJCUZTTF9RRE1BX0JMT0NLX0JBU0VfT0ZGU0VUKGZzbF9x ZG1hLCBqKTsKKwkJCXF1ZXVlX3RlbXAtPm5fY3EgPSBxdWV1ZV9zaXplW2ldOworCQkJcXVldWVf dGVtcC0+aWQgPSBpOworCQkJcXVldWVfdGVtcC0+dmlydF9oZWFkID0gcXVldWVfdGVtcC0+Y3E7 CisJCQlxdWV1ZV90ZW1wLT52aXJ0X3RhaWwgPSBxdWV1ZV90ZW1wLT5jcTsKKwkJCS8qCisJCQkg KiBMaXN0IGZvciBxdWV1ZSBjb21tYW5kIGJ1ZmZlcgorCQkJICovCisJCQlJTklUX0xJU1RfSEVB RCgmcXVldWVfdGVtcC0+Y29tcF91c2VkKTsKKwkJCXNwaW5fbG9ja19pbml0KCZxdWV1ZV90ZW1w LT5xdWV1ZV9sb2NrKTsKKwkJfQorCX0KKwlyZXR1cm4gcXVldWVfaGVhZDsKK30KKworc3RhdGlj IHN0cnVjdCBmc2xfcWRtYV9xdWV1ZQorKmZzbF9xZG1hX3ByZXBfc3RhdHVzX3F1ZXVlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgc3Rh dHVzX3NpemU7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpzdGF0dXNfaGVhZDsKKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyZXQgPSBvZl9wcm9wZXJ0 eV9yZWFkX3UzMihucCwgInN0YXR1cy1zaXplcyIsICZzdGF0dXNfc2l6ZSk7CisJaWYgKHJldCkg eworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgc3RhdHVzLXNpemVzLlxuIik7CisJ CXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RhdHVzX3NpemUgPiBGU0xfUURNQV9DSVJDVUxBUl9E RVNDX1NJWkVfTUFYIHx8CisJICAgIHN0YXR1c19zaXplIDwgRlNMX1FETUFfQ0lSQ1VMQVJfREVT Q19TSVpFX01JTikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJHZXQgd3Jvbmcgc3RhdHVzX3Np emUuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXN0YXR1c19oZWFkID0gZGV2bV9remFsbG9j KCZwZGV2LT5kZXYsCisJCQkJICAgc2l6ZW9mKCpzdGF0dXNfaGVhZCksIEdGUF9LRVJORUwpOwor CWlmICghc3RhdHVzX2hlYWQpCisJCXJldHVybiBOVUxMOworCisJLyoKKwkgKiBCdWZmZXIgZm9y IHF1ZXVlIGNvbW1hbmQKKwkgKi8KKwlzdGF0dXNfaGVhZC0+Y3EgPSBkbWFfYWxsb2NfY29oZXJl bnQoJnBkZXYtPmRldiwKKwkJCQkJICAgICBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkg KgorCQkJCQkgICAgIHN0YXR1c19zaXplLAorCQkJCQkgICAgICZzdGF0dXNfaGVhZC0+YnVzX2Fk ZHIsCisJCQkJCSAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGF0dXNfaGVhZC0+Y3EpIHsKKwkJ ZGV2bV9rZnJlZSgmcGRldi0+ZGV2LCBzdGF0dXNfaGVhZCk7CisJCXJldHVybiBOVUxMOworCX0K KwlzdGF0dXNfaGVhZC0+bl9jcSA9IHN0YXR1c19zaXplOworCXN0YXR1c19oZWFkLT52aXJ0X2hl YWQgPSBzdGF0dXNfaGVhZC0+Y3E7CisJc3RhdHVzX2hlYWQtPnZpcnRfdGFpbCA9IHN0YXR1c19o ZWFkLT5jcTsKKwlzdGF0dXNfaGVhZC0+Y29tcF9wb29sID0gTlVMTDsKKworCXJldHVybiBzdGF0 dXNfaGVhZDsKK30KKworc3RhdGljIGludCBmc2xfcWRtYV9oYWx0KHN0cnVjdCBmc2xfcWRtYV9l bmdpbmUgKmZzbF9xZG1hKQoreworCXUzMiByZWc7CisJaW50IGksIGosIGNvdW50ID0gRlNMX1FE TUFfSEFMVF9DT1VOVDsKKwl2b2lkIF9faW9tZW0gKmJsb2NrLCAqY3RybCA9IGZzbF9xZG1hLT5j dHJsX2Jhc2U7CisKKwkvKiBEaXNhYmxlIHRoZSBjb21tYW5kIHF1ZXVlIGFuZCB3YWl0IGZvciBp ZGxlIHN0YXRlLiAqLworCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURN QV9ETVIpOworCXJlZyB8PSBGU0xfUURNQV9ETVJfRFFEOworCXFkbWFfd3JpdGVsKGZzbF9xZG1h LCByZWcsIGN0cmwgKyBGU0xfUURNQV9ETVIpOworCWZvciAoaiA9IDA7IGogPCBmc2xfcWRtYS0+ YmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZSArCisJ CQlGU0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisJCWZvciAoaSA9IDA7 IGkgPCBGU0xfUURNQV9RVUVVRV9OVU1fTUFYOyBpKyspCisJCQlxZG1hX3dyaXRlbChmc2xfcWRt YSwgMCwgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihpKSk7CisJfQorCXdoaWxlICgxKSB7CisJCXJl ZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURNQV9EU1IpOworCQlpZiAoIShy ZWcgJiBGU0xfUURNQV9EU1JfREIpKQorCQkJYnJlYWs7CisJCWlmIChjb3VudC0tIDwgMCkKKwkJ CXJldHVybiAtRUJVU1k7CisJCXVkZWxheSgxMDApOworCX0KKworCWZvciAoaiA9IDA7IGogPCBm c2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBqKyspIHsKKwkJYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tf YmFzZSArCisJCQlGU0xfUURNQV9CTE9DS19CQVNFX09GRlNFVChmc2xfcWRtYSwgaik7CisKKwkJ LyogRGlzYWJsZSBzdGF0dXMgcXVldWUuICovCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCAwLCBi bG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKworCQkvKgorCQkgKiBjbGVhciB0aGUgY29tbWFuZCBx dWV1ZSBpbnRlcnJ1cHQgZGV0ZWN0IHJlZ2lzdGVyIGZvcgorCQkgKiBhbGwgcXVldWVzLgorCQkg Ki8KKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0JDUUlEUl9DTEVBUiwKKwkJCSAg ICBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQKK2ZzbF9xZG1hX3F1ZXVlX3RyYW5zZmVyX2NvbXBsZXRlKHN0cnVjdCBmc2xfcWRt YV9lbmdpbmUgKmZzbF9xZG1hLAorCQkJCSB2b2lkICpibG9jaywKKwkJCQkgaW50IGlkKQorewor CWJvb2wgZHVwbGljYXRlOworCXUzMiByZWcsIGksIGNvdW50OworCXN0cnVjdCBmc2xfcWRtYV9x dWV1ZSAqdGVtcF9xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpzdGF0dXNfYWRkcjsK KwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqZnNsX2NvbXAgPSBOVUxMOworCXN0cnVjdCBmc2xfcWRt YV9xdWV1ZSAqZnNsX3F1ZXVlID0gZnNsX3FkbWEtPnF1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9x dWV1ZSAqZnNsX3N0YXR1cyA9IGZzbF9xZG1hLT5zdGF0dXNbaWRdOworCisJY291bnQgPSBGU0xf UURNQV9NQVhfU0laRTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCWR1cGxpY2F0ZSA9IDA7CisJ CXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGJsb2NrICsgRlNMX1FETUFfQlNRU1IpOworCQlp ZiAocmVnICYgRlNMX1FETUFfQlNRU1JfUUUpCisJCQlyZXR1cm4gMDsKKworCQlzdGF0dXNfYWRk ciA9IGZzbF9zdGF0dXMtPnZpcnRfaGVhZDsKKworCQlpZiAocWRtYV9jY2RmX2dldF9xdWV1ZShz dGF0dXNfYWRkcikgPT0KKwkJICAgX190aGlzX2NwdV9yZWFkKHByZS5xdWV1ZSkgJiYKKwkJCXFk bWFfY2NkZl9hZGRyX2dldDY0KHN0YXR1c19hZGRyKSA9PQorCQkJX190aGlzX2NwdV9yZWFkKHBy ZS5hZGRyKSkKKwkJCWR1cGxpY2F0ZSA9IDE7CisJCWkgPSBxZG1hX2NjZGZfZ2V0X3F1ZXVlKHN0 YXR1c19hZGRyKSArCisJCQlpZCAqIGZzbF9xZG1hLT5uX3F1ZXVlczsKKwkJX190aGlzX2NwdV93 cml0ZShwcmUuYWRkciwgcWRtYV9jY2RmX2FkZHJfZ2V0NjQoc3RhdHVzX2FkZHIpKTsKKwkJX190 aGlzX2NwdV93cml0ZShwcmUucXVldWUsIHFkbWFfY2NkZl9nZXRfcXVldWUoc3RhdHVzX2FkZHIp KTsKKwkJdGVtcF9xdWV1ZSA9IGZzbF9xdWV1ZSArIGk7CisKKwkJc3Bpbl9sb2NrKCZ0ZW1wX3F1 ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnRlbXBfcXVldWUtPmNvbXBfdXNl ZCkpIHsKKwkJCWlmICghZHVwbGljYXRlKSB7CisJCQkJc3Bpbl91bmxvY2soJnRlbXBfcXVldWUt PnF1ZXVlX2xvY2spOworCQkJCXJldHVybiAtRUFHQUlOOworCQkJfQorCQl9IGVsc2UgeworCQkJ ZnNsX2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0ZW1wX3F1ZXVlLT5jb21wX3VzZWQsCisJCQkJ CQkgICAgc3RydWN0IGZzbF9xZG1hX2NvbXAsIGxpc3QpOworCQkJaWYgKGZzbF9jb21wLT5idXNf YWRkciArIDE2ICE9CisJCQkJX190aGlzX2NwdV9yZWFkKHByZS5hZGRyKSkgeworCQkJCWlmICgh ZHVwbGljYXRlKSB7CisJCQkJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsK KwkJCQkJcmV0dXJuIC1FQUdBSU47CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGR1cGxpY2F0 ZSkgeworCQkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CU1FN Uik7CisJCQlyZWcgfD0gRlNMX1FETUFfQlNRTVJfREk7CisJCQlxZG1hX2Rlc2NfYWRkcl9zZXQ2 NChzdGF0dXNfYWRkciwgMHgwKTsKKwkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCsrOworCQkJaWYg KGZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9PSBmc2xfc3RhdHVzLT5jcQorCQkJCQkJICAgKyBmc2xf c3RhdHVzLT5uX2NxKQorCQkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9IGZzbF9zdGF0dXMtPmNx OworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CU1FNUik7 CisJCQlzcGluX3VubG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCQljb250aW51ZTsK KwkJfQorCQlsaXN0X2RlbCgmZnNsX2NvbXAtPmxpc3QpOworCisJCXJlZyA9IHFkbWFfcmVhZGwo ZnNsX3FkbWEsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQlyZWcgfD0gRlNMX1FETUFfQlNR TVJfREk7CisJCXFkbWFfZGVzY19hZGRyX3NldDY0KHN0YXR1c19hZGRyLCAweDApOworCQlmc2xf c3RhdHVzLT52aXJ0X2hlYWQrKzsKKwkJaWYgKGZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9PSBmc2xf c3RhdHVzLT5jcSArIGZzbF9zdGF0dXMtPm5fY3EpCisJCQlmc2xfc3RhdHVzLT52aXJ0X2hlYWQg PSBmc2xfc3RhdHVzLT5jcTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHJlZywgYmxvY2sgKyBG U0xfUURNQV9CU1FNUik7CisJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsK KworCQlzcGluX2xvY2soJmZzbF9jb21wLT5xY2hhbi0+dmNoYW4ubG9jayk7CisJCXZjaGFuX2Nv b2tpZV9jb21wbGV0ZSgmZnNsX2NvbXAtPnZkZXNjKTsKKwkJZnNsX2NvbXAtPnFjaGFuLT5zdGF0 dXMgPSBETUFfQ09NUExFVEU7CisJCXNwaW5fdW5sb2NrKCZmc2xfY29tcC0+cWNoYW4tPnZjaGFu LmxvY2spOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3Fk bWFfZXJyb3JfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJdW5zaWduZWQgaW50 IGludHI7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEgPSBkZXZfaWQ7CisJdm9p ZCBfX2lvbWVtICpzdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisKKwlpbnRyID0gcWRt YV9yZWFkbChmc2xfcWRtYSwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisKKwlpZiAoaW50cikg eworCQlkZXZfZXJyKGZzbF9xZG1hLT5kbWFfZGV2LmRldiwgIkRNQSB0cmFuc2FjdGlvbiBlcnJv ciFcbiIpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJcWRtYV93cml0ZWwoZnNsX3FkbWEs IEZTTF9RRE1BX0RFRFJfQ0xFQVIsIHN0YXR1cyArIEZTTF9RRE1BX0RFRFIpOworCXJldHVybiBJ UlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZzbF9xZG1hX3F1ZXVlX2hhbmRs ZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCWludCBpZDsKKwl1bnNpZ25lZCBpbnQgaW50 ciwgcmVnOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hID0gZGV2X2lkOworCXZv aWQgX19pb21lbSAqYmxvY2ssICpjdHJsID0gZnNsX3FkbWEtPmN0cmxfYmFzZTsKKworCWlkID0g aXJxIC0gZnNsX3FkbWEtPmlycV9iYXNlOworCWlmIChpZCA8IDAgJiYgaWQgPiBmc2xfcWRtYS0+ YmxvY2tfbnVtYmVyKSB7CisJCWRldl9lcnIoZnNsX3FkbWEtPmRtYV9kZXYuZGV2LAorCQkJImly cSAlZCBpcyB3cm9uZyBpcnFfYmFzZSBpcyAlZFxuIiwKKwkJCWlycSwgZnNsX3FkbWEtPmlycV9i YXNlKTsKKwl9CisKKwlibG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlICsKKwkJRlNMX1FETUFf QkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGlkKTsKKworCWludHIgPSBxZG1hX3JlYWRsKGZz bF9xZG1hLCBibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisKKwlpZiAoKGludHIgJiBGU0xf UURNQV9DUUlEUl9TUVQpICE9IDApCisJCWludHIgPSBmc2xfcWRtYV9xdWV1ZV90cmFuc2Zlcl9j b21wbGV0ZShmc2xfcWRtYSwgYmxvY2ssIGlkKTsKKworCWlmIChpbnRyICE9IDApIHsKKwkJcmVn ID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RNUik7CisJCXJlZyB8PSBG U0xfUURNQV9ETVJfRFFEOworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNM X1FETUFfRE1SKTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFf QkNRSUVSKDApKTsKKwkJZGV2X2Vycihmc2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJRRE1BOiBzdGF0 dXMgZXJyIVxuIik7CisJfQorCisJLyogQ2xlYXIgYWxsIGRldGVjdGVkIGV2ZW50cyBhbmQgaW50 ZXJydXB0cy4gKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NMRUFS LAorCQkgICAgYmxvY2sgKyBGU0xfUURNQV9CQ1FJRFIoMCkpOworCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCitzdGF0aWMgaW50Citmc2xfcWRtYV9pcnFfaW5pdChzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2LAorCQkgIHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQorewor CWludCBpOworCWludCBjcHU7CisJaW50IHJldDsKKwljaGFyIGlycV9uYW1lWzIwXTsKKworCWZz bF9xZG1hLT5lcnJvcl9pcnEgPQorCQlwbGF0Zm9ybV9nZXRfaXJxX2J5bmFtZShwZGV2LCAicWRt YS1lcnJvciIpOworCWlmIChmc2xfcWRtYS0+ZXJyb3JfaXJxIDwgMCkgeworCQlkZXZfZXJyKCZw ZGV2LT5kZXYsICJDYW4ndCBnZXQgcWRtYSBjb250cm9sbGVyIGlycS5cbiIpOworCQlyZXR1cm4g ZnNsX3FkbWEtPmVycm9yX2lycTsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2 LT5kZXYsIGZzbF9xZG1hLT5lcnJvcl9pcnEsCisJCQkgICAgICAgZnNsX3FkbWFfZXJyb3JfaGFu ZGxlciwgMCwKKwkJCSAgICAgICAicURNQSBlcnJvciIsIGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHFETUEgY29udHJvbGxlciBJ UlEuXG4iKTsKKwkJcmV0dXJuICByZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1h LT5ibG9ja19udW1iZXI7IGkrKykgeworCQlzcHJpbnRmKGlycV9uYW1lLCAicWRtYS1xdWV1ZSVk IiwgaSk7CisJCWZzbF9xZG1hLT5xdWV1ZV9pcnFbaV0gPQorCQkJCXBsYXRmb3JtX2dldF9pcnFf YnluYW1lKHBkZXYsIGlycV9uYW1lKTsKKworCQlpZiAoZnNsX3FkbWEtPnF1ZXVlX2lycVtpXSA8 IDApIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2FuJ3QgZ2V0IHFkbWEgcXVldWUg JWQgaXJxLlxuIiwgaSk7CisJCQlyZXR1cm4gZnNsX3FkbWEtPnF1ZXVlX2lycVtpXTsKKwkJfQor CisJCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwKKwkJCQkgICAgICAgZnNsX3Fk bWEtPnF1ZXVlX2lycVtpXSwKKwkJCQkgICAgICAgZnNsX3FkbWFfcXVldWVfaGFuZGxlciwKKwkJ CQkgICAgICAgMCwKKwkJCQkgICAgICAgInFETUEgcXVldWUiLAorCQkJCSAgICAgICBmc2xfcWRt YSk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiQ2FuJ3QgcmVn aXN0ZXIgcURNQSBxdWV1ZSBJUlEuXG4iKTsKKwkJCXJldHVybiAgcmV0OworCQl9CisKKwkJY3B1 ID0gaSAlIG51bV9vbmxpbmVfY3B1cygpOworCQlyZXQgPSBpcnFfc2V0X2FmZmluaXR5X2hpbnQo ZnNsX3FkbWEtPnF1ZXVlX2lycVtpXSwKKwkJCQkJICAgIGdldF9jcHVfbWFzayhjcHUpKTsKKwkJ aWYgKHJldCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJCSJDYW4ndCBzZXQgY3B1ICVk IGFmZmluaXR5IHRvIElSUSAlZC5cbiIsCisJCQkJY3B1LAorCQkJCWZzbF9xZG1hLT5xdWV1ZV9p cnFbaV0pOworCQkJcmV0dXJuICByZXQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIHZvaWQgZnNsX3FkbWFfaXJxX2V4aXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwK KwkJCSAgICAgIHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQoreworCWludCBpOwor CisJZGV2bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+ZXJyb3JfaXJxLCBmc2xfcWRt YSk7CisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5ibG9ja19udW1iZXI7IGkrKykKKwkJZGV2 bV9mcmVlX2lycSgmcGRldi0+ZGV2LCBmc2xfcWRtYS0+cXVldWVfaXJxW2ldLCBmc2xfcWRtYSk7 Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcmVnX2luaXQoc3RydWN0IGZzbF9xZG1hX2VuZ2lu ZSAqZnNsX3FkbWEpCit7CisJdTMyIHJlZzsKKwlpbnQgaSwgaiwgcmV0OworCXN0cnVjdCBmc2xf cWRtYV9xdWV1ZSAqdGVtcDsKKwl2b2lkIF9faW9tZW0gKnN0YXR1cyA9IGZzbF9xZG1hLT5zdGF0 dXNfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmJsb2NrLCAqY3RybCA9IGZzbF9xZG1hLT5jdHJsX2Jh c2U7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfcWRtYS0+cXVldWU7 CisKKwkvKiBUcnkgdG8gaGFsdCB0aGUgcURNQSBlbmdpbmUgZmlyc3QuICovCisJcmV0ID0gZnNs X3FkbWFfaGFsdChmc2xfcWRtYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGZzbF9xZG1hLT5k bWFfZGV2LmRldiwgIkRNQSBoYWx0IGZhaWxlZCEiKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlm b3IgKGkgPSAwOyBpIDwgZnNsX3FkbWEtPmJsb2NrX251bWJlcjsgaSsrKSB7CisJCS8qCisJCSAq IENsZWFyIHRoZSBjb21tYW5kIHF1ZXVlIGludGVycnVwdCBkZXRlY3QgcmVnaXN0ZXIgZm9yCisJ CSAqIGFsbCBxdWV1ZXMuCisJCSAqLworCisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2Ug KworCQkJRlNMX1FETUFfQkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGkpOworCQlxZG1hX3dy aXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NMRUFSLAorCQkJICAgIGJsb2NrICsgRlNM X1FETUFfQkNRSURSKDApKTsKKwl9CisKKwlmb3IgKGogPSAwOyBqIDwgZnNsX3FkbWEtPmJsb2Nr X251bWJlcjsgaisrKSB7CisJCWJsb2NrID0gZnNsX3FkbWEtPmJsb2NrX2Jhc2UgKworCQkJRlNM X1FETUFfQkxPQ0tfQkFTRV9PRkZTRVQoZnNsX3FkbWEsIGopOworCQlmb3IgKGkgPSAwOyBpIDwg ZnNsX3FkbWEtPm5fcXVldWVzOyBpKyspIHsKKwkJCXRlbXAgPSBmc2xfcXVldWUgKyBpICsgKGog KiBmc2xfcWRtYS0+bl9xdWV1ZXMpOworCQkJLyoKKwkJCSAqIEluaXRpYWxpemUgQ29tbWFuZCBR dWV1ZSByZWdpc3RlcnMgdG8KKwkJCSAqIHBvaW50IHRvIHRoZSBmaXJzdAorCQkJICogY29tbWFu ZCBkZXNjcmlwdG9yIGluIG1lbW9yeS4KKwkJCSAqIERlcXVldWUgUG9pbnRlciBBZGRyZXNzIFJl Z2lzdGVycworCQkJICogRW5xdWV1ZSBQb2ludGVyIEFkZHJlc3MgUmVnaXN0ZXJzCisJCQkgKi8K KworCQkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHRlbXAtPmJ1c19hZGRyLAorCQkJCSAgICBibG9j ayArIEZTTF9RRE1BX0JDUURQQV9TQUREUihpKSk7CisJCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwg dGVtcC0+YnVzX2FkZHIsCisJCQkJICAgIGJsb2NrICsgRlNMX1FETUFfQkNRRVBBX1NBRERSKGkp KTsKKworCQkJLyogSW5pdGlhbGl6ZSB0aGUgcXVldWUgbW9kZS4gKi8KKwkJCXJlZyA9IEZTTF9R RE1BX0JDUU1SX0VOOworCQkJcmVnIHw9IEZTTF9RRE1BX0JDUU1SX0NEX1RITEQoaWxvZzIodGVt cC0+bl9jcSkgLSA0KTsKKwkJCXJlZyB8PSBGU0xfUURNQV9CQ1FNUl9DUV9TSVpFKGlsb2cyKHRl bXAtPm5fY3EpIC0gNik7CisJCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZT TF9RRE1BX0JDUU1SKGkpKTsKKwkJfQorCisJCS8qCisJCSAqIFdvcmthcm91bmQgZm9yIGVycmF0 dW06IEVSUjAxMDgxMi4KKwkJICogV2UgbXVzdCBlbmFibGUgWE9GRiB0byBhdm9pZCB0aGUgZW5x dWV1ZSByZWplY3Rpb24gb2NjdXJzLgorCQkgKiBTZXR0aW5nIFNRQ0NNUiBFTlRFUl9XTSB0byAw eDIwLgorCQkgKi8KKworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfU1FDQ01SX0VO VEVSX1dNLAorCQkJICAgIGJsb2NrICsgRlNMX1FETUFfU1FDQ01SKTsKKworCQkvKgorCQkgKiBJ bml0aWFsaXplIHN0YXR1cyBxdWV1ZSByZWdpc3RlcnMgdG8gcG9pbnQgdG8gdGhlIGZpcnN0CisJ CSAqIGNvbW1hbmQgZGVzY3JpcHRvciBpbiBtZW1vcnkuCisJCSAqIERlcXVldWUgUG9pbnRlciBB ZGRyZXNzIFJlZ2lzdGVycworCQkgKiBFbnF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMK KwkJICovCisKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIGZzbF9xZG1hLT5zdGF0dXNbal0tPmJ1 c19hZGRyLAorCQkJICAgIGJsb2NrICsgRlNMX1FETUFfU1FFUEFSKTsKKwkJcWRtYV93cml0ZWwo ZnNsX3FkbWEsIGZzbF9xZG1hLT5zdGF0dXNbal0tPmJ1c19hZGRyLAorCQkJICAgIGJsb2NrICsg RlNMX1FETUFfU1FEUEFSKTsKKwkJLyogSW5pdGlhbGl6ZSBzdGF0dXMgcXVldWUgaW50ZXJydXB0 LiAqLworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSUVSX0NRVElFLAorCQkJ ICAgIGJsb2NrICsgRlNMX1FETUFfQkNRSUVSKDApKTsKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEs IEZTTF9RRE1BX0JTUUlDUl9JQ0VOIHwKKwkJCQkgICBGU0xfUURNQV9CU1FJQ1JfSUNTVCg1KSB8 IDB4ODAwMCwKKwkJCQkgICBibG9jayArIEZTTF9RRE1BX0JTUUlDUik7CisJCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCBGU0xfUURNQV9DUUlFUl9NRUlFIHwKKwkJCQkgICBGU0xfUURNQV9DUUlFUl9U RUlFLAorCQkJCSAgIGJsb2NrICsgRlNMX1FETUFfQ1FJRVIpOworCisJCS8qIEluaXRpYWxpemUg dGhlIHN0YXR1cyBxdWV1ZSBtb2RlLiAqLworCQlyZWcgPSBGU0xfUURNQV9CU1FNUl9FTjsKKwkJ cmVnIHw9IEZTTF9RRE1BX0JTUU1SX0NRX1NJWkUoaWxvZzIKKwkJCShmc2xfcWRtYS0+c3RhdHVz W2pdLT5uX2NxKSAtIDYpOworCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGJsb2NrICsg RlNMX1FETUFfQlNRTVIpOworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBibG9jayArIEZT TF9RRE1BX0JTUU1SKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIGNvbnRyb2xsZXIgaW50ZXJydXB0 IHJlZ2lzdGVyLiAqLworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9ERURSX0NMRUFS LCBzdGF0dXMgKyBGU0xfUURNQV9ERURSKTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FE TUFfREVJRVJfQ0xFQVIsIHN0YXR1cyArIEZTTF9RRE1BX0RFSUVSKTsKKworCXJlZyA9IHFkbWFf cmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURNQV9ETVIpOworCXJlZyAmPSB+RlNMX1FETUFf RE1SX0RRRDsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNMX1FETUFfRE1S KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlw dG9yICoKK2ZzbF9xZG1hX3ByZXBfbWVtY3B5KHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2Fk ZHJfdCBkc3QsCisJCSAgICAgZG1hX2FkZHJfdCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxv bmcgZmxhZ3MpCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9jb21wOworCXN0cnVjdCBm c2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisKKwlmc2xf Y29tcCA9IGZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKGZzbF9jaGFuKTsKKworCWlmICgh ZnNsX2NvbXApCisJCXJldHVybiBOVUxMOworCisJZnNsX3FkbWFfY29tcF9maWxsX21lbWNweShm c2xfY29tcCwgZHN0LCBzcmMsIGxlbik7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmZnNsX2No YW4tPnZjaGFuLCAmZnNsX2NvbXAtPnZkZXNjLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZz bF9xZG1hX2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4pCit7CisJ dTMyIHJlZzsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmRlc2M7CisJc3RydWN0IGZzbF9xZG1h X2NvbXAgKmZzbF9jb21wOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVlID0gZnNs X2NoYW4tPnF1ZXVlOworCXZvaWQgX19pb21lbSAqYmxvY2sgPSBmc2xfcXVldWUtPmJsb2NrX2Jh c2U7CisKKwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9jaGFuLT5xZG1hLCBibG9jayArIEZTTF9RRE1B X0JDUVNSKGZzbF9xdWV1ZS0+aWQpKTsKKwlpZiAocmVnICYgKEZTTF9RRE1BX0JDUVNSX1FGIHwg RlNMX1FETUFfQkNRU1JfWE9GRikpCisJCXJldHVybjsKKwl2ZGVzYyA9IHZjaGFuX25leHRfZGVz YygmZnNsX2NoYW4tPnZjaGFuKTsKKwlpZiAoIXZkZXNjKQorCQlyZXR1cm47CisJbGlzdF9kZWwo JnZkZXNjLT5ub2RlKTsKKwlmc2xfY29tcCA9IHRvX2ZzbF9xZG1hX2NvbXAodmRlc2MpOworCisJ bWVtY3B5KGZzbF9xdWV1ZS0+dmlydF9oZWFkKyssCisJICAgICAgIGZzbF9jb21wLT52aXJ0X2Fk ZHIsIHNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSk7CisJaWYgKGZzbF9xdWV1ZS0+dmly dF9oZWFkID09IGZzbF9xdWV1ZS0+Y3EgKyBmc2xfcXVldWUtPm5fY3EpCisJCWZzbF9xdWV1ZS0+ dmlydF9oZWFkID0gZnNsX3F1ZXVlLT5jcTsKKworCWxpc3RfYWRkX3RhaWwoJmZzbF9jb21wLT5s aXN0LCAmZnNsX3F1ZXVlLT5jb21wX3VzZWQpOworCWJhcnJpZXIoKTsKKwlyZWcgPSBxZG1hX3Jl YWRsKGZzbF9jaGFuLT5xZG1hLCBibG9jayArIEZTTF9RRE1BX0JDUU1SKGZzbF9xdWV1ZS0+aWQp KTsKKwlyZWcgfD0gRlNMX1FETUFfQkNRTVJfRUk7CisJcWRtYV93cml0ZWwoZnNsX2NoYW4tPnFk bWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihmc2xfcXVldWUtPmlkKSk7CisJZnNsX2No YW4tPnN0YXR1cyA9IERNQV9JTl9QUk9HUkVTUzsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFf ZnJlZV9kZXNjKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZGVzYykKK3sKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNsX3Fk bWFfcXVldWUgKmZzbF9xdWV1ZTsKKworCWZzbF9jb21wID0gdG9fZnNsX3FkbWFfY29tcCh2ZGVz Yyk7CisJZnNsX3F1ZXVlID0gZnNsX2NvbXAtPnFjaGFuLT5xdWV1ZTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0X2FkZF90YWlsKCZm c2xfY29tcC0+bGlzdCwgJmZzbF9xdWV1ZS0+Y29tcF9mcmVlKTsKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQg ZnNsX3FkbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19mc2xf cWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVlID0gZnNs X2NoYW4tPnF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9xdWV1ZS0+cXVldWVfbG9j aywgZmxhZ3MpOworCXNwaW5fbG9jaygmZnNsX2NoYW4tPnZjaGFuLmxvY2spOworCWlmICh2Y2hh bl9pc3N1ZV9wZW5kaW5nKCZmc2xfY2hhbi0+dmNoYW4pKQorCQlmc2xfcWRtYV9lbnF1ZXVlX2Rl c2MoZnNsX2NoYW4pOworCXNwaW5fdW5sb2NrKCZmc2xfY2hhbi0+dmNoYW4ubG9jayk7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7Cit9CisK K3N0YXRpYyB2b2lkIGZzbF9xZG1hX3N5bmNocm9uaXplKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikK K3sKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19mc2xfcWRtYV9jaGFuKGNo YW4pOworCisJdmNoYW5fc3luY2hyb25pemUoJmZzbF9jaGFuLT52Y2hhbik7Cit9CisKK3N0YXRp YyBpbnQgZnNsX3FkbWFfdGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJ TElTVF9IRUFEKGhlYWQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGZzbF9xZG1h X2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZmc2xfY2hhbi0+dmNoYW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2dldF9hbGxfZGVz Y3JpcHRvcnMoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisJdmNoYW5fZG1hX2Rlc2NfZnJlZV9s aXN0KCZmc2xfY2hhbi0+dmNoYW4sICZoZWFkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBmc2xfcWRtYV9hbGxvY19jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7 CisJaW50IHJldDsKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0b19mc2xfcWRt YV9jaGFuKGNoYW4pOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hID0gZnNsX2No YW4tPnFkbWE7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+ cXVldWU7CisKKwlpZiAoZnNsX3F1ZXVlLT5jb21wX3Bvb2wgJiYgZnNsX3F1ZXVlLT5kZXNjX3Bv b2wpCisJCXJldHVybiBmc2xfcWRtYS0+ZGVzY19hbGxvY2F0ZWQ7CisKKwlJTklUX0xJU1RfSEVB RCgmZnNsX3F1ZXVlLT5jb21wX2ZyZWUpOworCisJLyoKKwkgKiBUaGUgZG1hIHBvb2wgZm9yIHF1 ZXVlIGNvbW1hbmQgYnVmZmVyCisJICovCisJZnNsX3F1ZXVlLT5jb21wX3Bvb2wgPQorCWRtYV9w b29sX2NyZWF0ZSgiY29tcF9wb29sIiwKKwkJCWNoYW4tPmRldmljZS0+ZGV2LAorCQkJRlNMX1FE TUFfQ09NTUFORF9CVUZGRVJfU0laRSwKKwkJCTY0LCAwKTsKKwlpZiAoIWZzbF9xdWV1ZS0+Y29t cF9wb29sKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qCisJICogVGhlIGRtYSBwb29sIGZvciBE ZXNjcmlwdG9yKFNEL0REKSBidWZmZXIKKwkgKi8KKwlmc2xfcXVldWUtPmRlc2NfcG9vbCA9CisJ ZG1hX3Bvb2xfY3JlYXRlKCJkZXNjX3Bvb2wiLAorCQkJY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQlG U0xfUURNQV9ERVNDUklQVE9SX0JVRkZFUl9TSVpFLAorCQkJMzIsIDApOworCWlmICghZnNsX3F1 ZXVlLT5kZXNjX3Bvb2wpCisJCWdvdG8gZXJyX2Rlc2NfcG9vbDsKKworCXJldCA9IGZzbF9xZG1h X3ByZV9yZXF1ZXN0X2VucXVldWVfZGVzYyhmc2xfcXVldWUpOworCWlmIChyZXQpIHsKKwkJZGV2 X2VycihjaGFuLT5kZXZpY2UtPmRldiwKKwkJCSJmYWlsZWQgdG8gYWxsb2MgZG1hIGJ1ZmZlciBm b3IgUy9HIGRlc2NyaXB0b3JcbiIpOworCQlnb3RvIGVycl9tZW07CisJfQorCisJZnNsX3FkbWEt PmRlc2NfYWxsb2NhdGVkKys7CisJcmV0dXJuIGZzbF9xZG1hLT5kZXNjX2FsbG9jYXRlZDsKKwor ZXJyX21lbToKKwlkbWFfcG9vbF9kZXN0cm95KGZzbF9xdWV1ZS0+ZGVzY19wb29sKTsKK2Vycl9k ZXNjX3Bvb2w6CisJZG1hX3Bvb2xfZGVzdHJveShmc2xfcXVldWUtPmNvbXBfcG9vbCk7CisJcmV0 dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0LCBpOworCWludCBibGtfbnVtLCBibGtfb2Zm OworCXUzMiBsZW4sIGNoYW5zLCBxdWV1ZXM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3Ry dWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuOworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZz bF9xZG1hOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwor CXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5wLCAiZG1hLWNoYW5uZWxzIiwgJmNoYW5zKTsK KwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBkbWEtY2hhbm5l bHMuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3Uz MihucCwgImJsb2NrLW9mZnNldCIsICZibGtfb2ZmKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIo JnBkZXYtPmRldiwgIkNhbid0IGdldCBibG9jay1vZmZzZXQuXG4iKTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImJsb2NrLW51bWJlciIsICZi bGtfbnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBi bG9jay1udW1iZXIuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlibGtfbnVtID0gbWluX3Qo aW50LCBibGtfbnVtLCBudW1fb25saW5lX2NwdXMoKSk7CisKKwlsZW4gPSBzaXplb2YoKmZzbF9x ZG1hKTsKKwlmc2xfcWRtYSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJO RUwpOworCWlmICghZnNsX3FkbWEpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuID0gc2l6ZW9m KCpmc2xfY2hhbikgKiBjaGFuczsKKwlmc2xfcWRtYS0+Y2hhbnMgPSBkZXZtX2t6YWxsb2MoJnBk ZXYtPmRldiwgbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzbF9xZG1hLT5jaGFucykKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IGZzbF9xZG1hX3F1ZXVlICopICog YmxrX251bTsKKwlmc2xfcWRtYS0+c3RhdHVzID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGxl biwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmc2xfcWRtYS0+c3RhdHVzKQorCQlyZXR1cm4gLUVOT01F TTsKKworCWxlbiA9IHNpemVvZihpbnQpICogYmxrX251bTsKKwlmc2xfcWRtYS0+cXVldWVfaXJx ID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIGxlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmc2xf cWRtYS0+cXVldWVfaXJxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9mX3Byb3BlcnR5 X3JlYWRfdTMyKG5wLCAiZnNsLGRtYS1xdWV1ZXMiLCAmcXVldWVzKTsKKwlpZiAocmV0KSB7CisJ CWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxdWV1ZXMuXG4iKTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwlmc2xfcWRtYS0+ZGVzY19hbGxvY2F0ZWQgPSAwOworCWZzbF9xZG1hLT5uX2No YW5zID0gY2hhbnM7CisJZnNsX3FkbWEtPm5fcXVldWVzID0gcXVldWVzOworCWZzbF9xZG1hLT5i bG9ja19udW1iZXIgPSBibGtfbnVtOworCWZzbF9xZG1hLT5ibG9ja19vZmZzZXQgPSBibGtfb2Zm OworCisJbXV0ZXhfaW5pdCgmZnNsX3FkbWEtPmZzbF9xZG1hX211dGV4KTsKKworCWZvciAoaSA9 IDA7IGkgPCBmc2xfcWRtYS0+YmxvY2tfbnVtYmVyOyBpKyspIHsKKwkJZnNsX3FkbWEtPnN0YXR1 c1tpXSA9IGZzbF9xZG1hX3ByZXBfc3RhdHVzX3F1ZXVlKHBkZXYpOworCQlpZiAoIWZzbF9xZG1h LT5zdGF0dXNbaV0pCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlmc2xfcWRtYS0+Y3RybF9iYXNl ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihm c2xfcWRtYS0+Y3RybF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmN0cmxfYmFz ZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0s IDEpOworCWZzbF9xZG1hLT5zdGF0dXNfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRl di0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKSkKKwkJcmV0 dXJuIFBUUl9FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dl dF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJZnNsX3FkbWEtPmJsb2NrX2Jh c2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJS KGZzbF9xZG1hLT5ibG9ja19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmJsb2Nr X2Jhc2UpOworCWZzbF9xZG1hLT5xdWV1ZSA9IGZzbF9xZG1hX2FsbG9jX3F1ZXVlX3Jlc291cmNl cyhwZGV2LCBmc2xfcWRtYSk7CisJaWYgKCFmc2xfcWRtYS0+cXVldWUpCisJCXJldHVybiAtRU5P TUVNOworCisJcmV0ID0gZnNsX3FkbWFfaXJxX2luaXQocGRldiwgZnNsX3FkbWEpOworCWlmIChy ZXQpCisJCXJldHVybiByZXQ7CisKKwlmc2xfcWRtYS0+aXJxX2Jhc2UgPSBwbGF0Zm9ybV9nZXRf aXJxX2J5bmFtZShwZGV2LCAicWRtYS1xdWV1ZTAiKTsKKwlmc2xfcWRtYS0+ZmVhdHVyZSA9IG9m X3Byb3BlcnR5X3JlYWRfYm9vbChucCwgImJpZy1lbmRpYW4iKTsKKwlJTklUX0xJU1RfSEVBRCgm ZnNsX3FkbWEtPmRtYV9kZXYuY2hhbm5lbHMpOworCisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1h LT5uX2NoYW5zOyBpKyspIHsKKwkJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuID0gJmZz bF9xZG1hLT5jaGFuc1tpXTsKKworCQlmc2xfY2hhbi0+cWRtYSA9IGZzbF9xZG1hOworCQlmc2xf Y2hhbi0+cXVldWUgPSBmc2xfcWRtYS0+cXVldWUgKyBpICUgKGZzbF9xZG1hLT5uX3F1ZXVlcyAq CisJCQkJCQkJZnNsX3FkbWEtPmJsb2NrX251bWJlcik7CisJCWZzbF9jaGFuLT52Y2hhbi5kZXNj X2ZyZWUgPSBmc2xfcWRtYV9mcmVlX2Rlc2M7CisJCXZjaGFuX2luaXQoJmZzbF9jaGFuLT52Y2hh biwgJmZzbF9xZG1hLT5kbWFfZGV2KTsKKwl9CisKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBm c2xfcWRtYS0+ZG1hX2Rldi5jYXBfbWFzayk7CisKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXYgPSAm cGRldi0+ZGV2OworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2Vz ID0KKwkJZnNsX3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlczsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5k ZXZpY2VfYWxsb2NfY2hhbl9yZXNvdXJjZXMgPQorCQlmc2xfcWRtYV9hbGxvY19jaGFuX3Jlc291 cmNlczsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfdHhfc3RhdHVzID0gZG1hX2Nvb2tpZV9z dGF0dXM7CisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2aWNlX3ByZXBfZG1hX21lbWNweSA9IGZzbF9x ZG1hX3ByZXBfbWVtY3B5OworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9pc3N1ZV9wZW5kaW5n ID0gZnNsX3FkbWFfaXNzdWVfcGVuZGluZzsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2Vfc3lu Y2hyb25pemUgPSBmc2xfcWRtYV9zeW5jaHJvbml6ZTsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZp Y2VfdGVybWluYXRlX2FsbCA9IGZzbF9xZG1hX3Rlcm1pbmF0ZV9hbGw7CisKKwlkbWFfc2V0X21h c2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDQwKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0 YShwZGV2LCBmc2xfcWRtYSk7CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZm c2xfcWRtYS0+ZG1hX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJ CQkiQ2FuJ3QgcmVnaXN0ZXIgTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUuXG4iKTsKKwkJcmV0 dXJuIHJldDsKKwl9CisKKwlyZXQgPSBmc2xfcWRtYV9yZWdfaW5pdChmc2xfcWRtYSk7CisJaWYg KHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBJbml0aWFsaXplIHRoZSBxRE1B IGVuZ2luZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBmc2xfcWRtYV9jbGVhbnVwX3ZjaGFuKHN0cnVjdCBkbWFfZGV2aWNlICpkbWFkZXYp Cit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsKKworCWxpc3RfZm9yX2Vh Y2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwKKwkJCQkgJmRtYWRldi0+Y2hhbm5lbHMsIHZjaGFu LmNoYW4uZGV2aWNlX25vZGUpIHsKKwkJbGlzdF9kZWwoJmNoYW4tPnZjaGFuLmNoYW4uZGV2aWNl X25vZGUpOworCQl0YXNrbGV0X2tpbGwoJmNoYW4tPnZjaGFuLnRhc2spOworCX0KK30KKworc3Rh dGljIGludCBmc2xfcWRtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sK KwlpbnQgaTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnN0YXR1czsKKwlzdHJ1Y3QgZGV2aWNl X25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAq ZnNsX3FkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWZzbF9xZG1hX2lycV9l eGl0KHBkZXYsIGZzbF9xZG1hKTsKKwlmc2xfcWRtYV9jbGVhbnVwX3ZjaGFuKCZmc2xfcWRtYS0+ ZG1hX2Rldik7CisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShucCk7CisJZG1hX2FzeW5jX2Rldmlj ZV91bnJlZ2lzdGVyKCZmc2xfcWRtYS0+ZG1hX2Rldik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZnNs X3FkbWEtPmJsb2NrX251bWJlcjsgaSsrKSB7CisJCXN0YXR1cyA9IGZzbF9xZG1hLT5zdGF0dXNb aV07CisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZnNsX3Fk bWFfZm9ybWF0KSAqCisJCQkJc3RhdHVzLT5uX2NxLCBzdGF0dXMtPmNxLCBzdGF0dXMtPmJ1c19h ZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNl X2lkIGZzbF9xZG1hX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGxzMTAyMWEt cWRtYSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShv ZiwgZnNsX3FkbWFfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNs X3FkbWFfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJmc2wtcWRtYSIsCisJ CS5vZl9tYXRjaF90YWJsZSA9IGZzbF9xZG1hX2R0X2lkcywKKwl9LAorCS5wcm9iZSAgICAgICAg ICA9IGZzbF9xZG1hX3Byb2JlLAorCS5yZW1vdmUJCT0gZnNsX3FkbWFfcmVtb3ZlLAorfTsKKwor bW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfcWRtYV9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMo InBsYXRmb3JtOmZzbC1xZG1hIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5YUCBMYXllcnNjYXBl IHFETUEgZW5naW5lIGRyaXZlciIpOwo=