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: [v8,3/7] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs From: Wen He Message-Id: <20180817025417.37388-3-wen.he_1@nxp.com> Date: Fri, 17 Aug 2018 10:54:13 +0800 To: vkoul@kernel.org, dmaengine@vger.kernel.org Cc: robh+dt@kernel.org, leoyang.li@nxp.com, jiafei.pan@nxp.com, peng.ma@nxp.com, wen.he_1@nxp.com List-ID: TlhQIFF1ZXVlIERNQSBjb250cm9sbGVyKHFETUEpIG9uIExheWVyc2NhcGUgU29DcyBzdXBwb3J0 cyBjaGFubmVsCnZpcnR1YWxsaXphdGlvbiBieSBhbGxvd2luZyBETUEgam9icyB0byBiZSBlbnF1 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KClNpZ25lZC1vZmYtYnk6IFdlbiBI ZSA8d2VuLmhlXzFAbnhwLmNvbT4KU2lnbmVkLW9mZi1ieTogSmlhaGVuZyBGYW4gPGppYWhlbmcu ZmFuQG54cC5jb20+Ci0tLQogZHJpdmVycy9kbWEvS2NvbmZpZyAgICB8ICAgMTMgKwogZHJpdmVy cy9kbWEvTWFrZWZpbGUgICB8ICAgIDEgKwogZHJpdmVycy9kbWEvZnNsLXFkbWEuYyB8IDExMDUg KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVz IGNoYW5nZWQsIDExMTkgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv ZG1hL2ZzbC1xZG1hLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVy cy9kbWEvS2NvbmZpZwppbmRleCBjYTE2ODBhLi4yOTE0Y2FmYiAxMDA2NDQKLS0tIGEvZHJpdmVy cy9kbWEvS2NvbmZpZworKysgYi9kcml2ZXJzL2RtYS9LY29uZmlnCkBAIC0yMTgsNiArMjE4LDE5 IEBAIGNvbmZpZyBGU0xfRURNQQogCSAgbXVsdGlwbGV4aW5nIGNhcGFiaWxpdHkgZm9yIERNQSBy ZXF1ZXN0IHNvdXJjZXMoc2xvdCkuCiAJICBUaGlzIG1vZHVsZSBjYW4gYmUgZm91bmQgb24gRnJl ZXNjYWxlIFZ5YnJpZCBhbmQgTFMtMSBTb0NzLgogCitjb25maWcgRlNMX1FETUEKKyAgICAgICB0 cmlzdGF0ZSAiTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUgc3VwcG9ydCIKKyAgICAgICBkZXBl bmRzIG9uIEFSTSB8fCBBUk02NAorICAgICAgIHNlbGVjdCBETUFfRU5HSU5FCisgICAgICAgc2Vs ZWN0IERNQV9WSVJUVUFMX0NIQU5ORUxTCisgICAgICAgc2VsZWN0IERNQV9FTkdJTkVfUkFJRAor ICAgICAgIHNlbGVjdCBBU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gKKyAgICAgICBoZWxw CisgICAgICAgICBTdXBwb3J0IHRoZSBOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2luZSB3aXRoIGNv bW1hbmQgcXVldWUgYW5kIGxlZ2FjeSBtb2RlLgorICAgICAgICAgQ2hhbm5lbCB2aXJ0dWFsaXph dGlvbiBpcyBzdXBwb3J0ZWQgdGhyb3VnaCBlbnF1ZXVpbmcgb2YgRE1BIGpvYnMgdG8sCisgICAg ICAgICBvciBkZXF1ZXVpbmcgRE1BIGpvYnMgZnJvbSwgZGlmZmVyZW50IHdvcmsgcXVldWVzLgor ICAgICAgICAgVGhpcyBtb2R1bGUgY2FuIGJlIGZvdW5kIG9uIE5YUCBMYXllcnNjYXBlIFNvQ3Mu CisKIGNvbmZpZyBGU0xfUkFJRAogICAgICAgICB0cmlzdGF0ZSAiRnJlZXNjYWxlIFJBSUQgZW5n aW5lIFN1cHBvcnQiCiAgICAgICAgIGRlcGVuZHMgb24gRlNMX1NPQyAmJiAhQVNZTkNfVFhfRU5B QkxFX0NIQU5ORUxfU1dJVENICmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9NYWtlZmlsZSBiL2Ry aXZlcnMvZG1hL01ha2VmaWxlCmluZGV4IDIwM2E5OWQuLjA1NTZmOWQgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZG1hL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL01ha2VmaWxlCkBAIC0zMiw2ICsz Miw3IEBAIG9iai0kKENPTkZJR19EV19ETUFDX0NPUkUpICs9IGR3Lwogb2JqLSQoQ09ORklHX0VQ OTNYWF9ETUEpICs9IGVwOTN4eF9kbWEubwogb2JqLSQoQ09ORklHX0ZTTF9ETUEpICs9IGZzbGRt YS5vCiBvYmotJChDT05GSUdfRlNMX0VETUEpICs9IGZzbC1lZG1hLm8KK29iai0kKENPTkZJR19G U0xfUURNQSkgKz0gZnNsLXFkbWEubwogb2JqLSQoQ09ORklHX0ZTTF9SQUlEKSArPSBmc2xfcmFp ZC5vCiBvYmotJChDT05GSUdfSFNVX0RNQSkgKz0gaHN1Lwogb2JqLSQoQ09ORklHX0lNR19NRENf RE1BKSArPSBpbWctbWRjLWRtYS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9mc2wtcWRtYS5j IGIvZHJpdmVycy9kbWEvZnNsLXFkbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi5mNjEyZjVhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvZnNsLXFkbWEuYwpA QCAtMCwwICsxLDExMDUgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisv LyBDb3B5cmlnaHQgMjAxOCBOWFAKKworLyoKKyAqIERyaXZlciBmb3IgTlhQIExheWVyc2NhcGUg UXVldWUgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgQ29udHJvbGxlcgorICoKKyAqIEF1dGhvcjoKKyAq ICBXZW4gSGUgPHdlbi5oZV8xQG54cC5jb20+CisgKiAgSmlhaGVuZyBGYW4gPGppYWhlbmcuZmFu QG54cC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUg PGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRl IDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1 ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZG1hcG9vbC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNs dWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAidmlydC1kbWEuaCIKKyNpbmNsdWRl ICJmc2xkbWEuaCIKKworLyogUmVnaXN0ZXIgcmVsYXRlZCBkZWZpbml0aW9uICovCisjZGVmaW5l IEZTTF9RRE1BX0RNUgkJCTB4MAorI2RlZmluZSBGU0xfUURNQV9EU1IJCQkweDQKKyNkZWZpbmUg RlNMX1FETUFfREVJRVIJCQkweGUwMAorI2RlZmluZSBGU0xfUURNQV9ERURSCQkJMHhlMDQKKyNk ZWZpbmUgRlNMX1FETUFfREVDRkRXMFIJCTB4ZTEwCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0ZEVzFS CQkweGUxNAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFcyUgkJMHhlMTgKKyNkZWZpbmUgRlNMX1FE TUFfREVDRkRXM1IJCTB4ZTFjCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0ZRSURSCQkweGUzMAorI2Rl ZmluZSBGU0xfUURNQV9ERUNCUgkJCTB4ZTM0CisKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVIoeCkJ CSgweGMwICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUVNSKHgpCQkoMHhjNCAr IDB4MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FFRFBBX1NBRERSKHgpCSgweGM4ICsg MHgxMDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUURQQV9TQUREUih4KQkoMHhjYyArIDB4 MTAwICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FFRVBBX1NBRERSKHgpCSgweGQwICsgMHgx MDAgKiAoeCkpCisjZGVmaW5lIEZTTF9RRE1BX0JDUUVQQV9TQUREUih4KQkoMHhkNCArIDB4MTAw ICogKHgpKQorI2RlZmluZSBGU0xfUURNQV9CQ1FJRVIoeCkJCSgweGUwICsgMHgxMDAgKiAoeCkp CisjZGVmaW5lIEZTTF9RRE1BX0JDUUlEUih4KQkJKDB4ZTQgKyAweDEwMCAqICh4KSkKKworI2Rl ZmluZSBGU0xfUURNQV9TUURQQVIJCQkweDgwYworI2RlZmluZSBGU0xfUURNQV9TUUVQQVIJCQkw eDgxNAorI2RlZmluZSBGU0xfUURNQV9CU1FNUgkJCTB4ODAwCisjZGVmaW5lIEZTTF9RRE1BX0JT UVNSCQkJMHg4MDQKKyNkZWZpbmUgRlNMX1FETUFfQlNRSUNSCQkJMHg4MjgKKyNkZWZpbmUgRlNM X1FETUFfQ1FNUgkJCTB4YTAwCisjZGVmaW5lIEZTTF9RRE1BX0NRRFNDUjEJCTB4YTA4CisjZGVm aW5lIEZTTF9RRE1BX0NRRFNDUjIgICAgICAgICAgICAgICAgMHhhMGMKKyNkZWZpbmUgRlNMX1FE TUFfQ1FJRVIJCQkweGExMAorI2RlZmluZSBGU0xfUURNQV9DUUVEUgkJCTB4YTE0CisjZGVmaW5l IEZTTF9RRE1BX1NRQ0NNUgkJCTB4YTIwCisKKy8qIFJlZ2lzdGVycyBmb3IgYml0IGFuZCBnZW5t YXNrICovCisjZGVmaW5lIEZTTF9RRE1BX0NRSURSX1NRVAkJQklUKDE1KQorI2RlZmluZSBRRE1B X0NDREZfRk9UTUFUCQlCSVQoMjkpCisjZGVmaW5lIFFETUFfQ0NERl9TRVIJCQlCSVQoMzApCisj ZGVmaW5lIFFETUFfU0dfRklOCQkJQklUKDMwKQorI2RlZmluZSBRRE1BX1NHX0VYVAkJCUJJVCgz MSkKKyNkZWZpbmUgUURNQV9TR19MRU5fTUFTSwkJR0VOTUFTSygyOSwgMCkKKyNkZWZpbmUgUURN QV9DQ0RGX01BU0sJCQlHRU5NQVNLKDI4LCAyMCkKKworI2RlZmluZSBGU0xfUURNQV9ERURSX0NM RUFSCQlHRU5NQVNLKDMxLCAwKQorI2RlZmluZSBGU0xfUURNQV9CQ1FJRFJfQ0xFQVIJCUdFTk1B U0soMzEsIDApCisjZGVmaW5lIEZTTF9RRE1BX0RFSUVSX0NMRUFSCQlHRU5NQVNLKDMxLCAwKQor CisjZGVmaW5lIEZTTF9RRE1BX0JDUUlFUl9DUVRJRQkJQklUKDE1KQorI2RlZmluZSBGU0xfUURN QV9CQ1FJRVJfQ1FQRUlFCQlCSVQoMjMpCisjZGVmaW5lIEZTTF9RRE1BX0JTUUlDUl9JQ0VOCQlC SVQoMzEpCisKKyNkZWZpbmUgRlNMX1FETUFfQlNRSUNSX0lDU1QoeCkJCSgoeCkgPDwgMTYpCisj ZGVmaW5lIEZTTF9RRE1BX0NRSUVSX01FSUUJCUJJVCgzMSkKKyNkZWZpbmUgRlNMX1FETUFfQ1FJ RVJfVEVJRQkJQklUKDApCisjZGVmaW5lIEZTTF9RRE1BX1NRQ0NNUl9FTlRFUl9XTQlCSVQoMjEp CisKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfRU4JCUJJVCgzMSkKKyNkZWZpbmUgRlNMX1FETUFf QkNRTVJfRUkJCUJJVCgzMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfQ0RfVEhMRCh4KQkoKHgp IDw8IDIwKQorI2RlZmluZSBGU0xfUURNQV9CQ1FNUl9DUV9TSVpFKHgpCSgoeCkgPDwgMTYpCisK KyNkZWZpbmUgRlNMX1FETUFfQkNRU1JfUUYJCUJJVCgxNikKKyNkZWZpbmUgRlNMX1FETUFfQkNR U1JfWE9GRgkJQklUKDApCisKKyNkZWZpbmUgRlNMX1FETUFfQlNRTVJfRU4JCUJJVCgzMSkKKyNk ZWZpbmUgRlNMX1FETUFfQlNRTVJfREkJCUJJVCgzMCkKKyNkZWZpbmUgRlNMX1FETUFfQlNRTVJf Q1FfU0laRSh4KQkoKHgpIDw8IDE2KQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUVNSX1FFCQlCSVQo MTcpCisKKyNkZWZpbmUgRlNMX1FETUFfRE1SX0RRRAkJQklUKDMwKQorI2RlZmluZSBGU0xfUURN QV9EU1JfREIJCUJJVCgzMSkKKworLyogU2l6ZSByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZp bmUgRlNMX1FETUFfUVVFVUVfTUFYCQk4CisjZGVmaW5lIEZTTF9RRE1BX0JBU0VfQlVGRkVSX1NJ WkUJOTYKKyNkZWZpbmUgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01JTgk2NAorI2RlZmlu ZSBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYCTE2Mzg0CisjZGVmaW5lIEZTTF9RRE1B X1FVRVVFX05VTV9NQVgJCTgKKworLyogRmllbGQgZGVmaW5pdGlvbiBmb3IgQ01EICovCisjZGVm aW5lIEZTTF9RRE1BX0NNRF9SV1RUWVBFCQkweDQKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0xXQyAg ICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgRlNMX1FETUFfQ01EX1JXVFRZUEVfT0ZGU0VUCTI4 CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9OU19PRkZTRVQJCTI3CisjZGVmaW5lIEZTTF9RRE1BX0NN RF9EUU9TX09GRlNFVAkyNAorI2RlZmluZSBGU0xfUURNQV9DTURfV1RIUk9UTF9PRkZTRVQJMjAK KyNkZWZpbmUgRlNMX1FETUFfQ01EX0RTRU5fT0ZGU0VUCTE5CisjZGVmaW5lIEZTTF9RRE1BX0NN RF9MV0NfT0ZGU0VUCQkxNgorCisjZGVmaW5lIEZTTF9RRE1BX0VfU0dfVEFCTEUJCTEKKyNkZWZp bmUgRlNMX1FETUFfRV9EQVRBX0JVRkZFUgkJMAorI2RlZmluZSBGU0xfUURNQV9GX0xBU1RfRU5U UlkJCTEKKworLyogRmllbGQgZGVmaW5pdGlvbiBmb3Igc2FmZSBsb29wIGNvdW50Ki8KKyNkZWZp bmUgRlNMX1FETUFfSEFMVF9DT1VOVAkJMTUwMAorI2RlZmluZSBGU0xfUURNQV9NQVhfU0laRQkJ MTYzODUKKworLyogRmllbGQgZGVmaW5pdGlvbiBmb3IgRGVzY3JpcHRvciBvZmZzZXQgKi8KKyNk ZWZpbmUgUURNQV9DQ0RGX1NUQVRVUwkJMjAKKyNkZWZpbmUgUURNQV9DQ0RGX09GRlNFVAkJMjAK KworLyoqCisgKiBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0IC0gVGhpcyBpcyB0aGUgc3RydWN0IGhv bGRpbmcgZGVzY3JpYmluZyBjb21wb3VuZAorICoJCQkgICAgZGVzY3JpcHRvciBmb3JtYXQgd2l0 aCBxRE1BLgorICogQHN0YXR1czoJCSAgICBDb21tYW5kIHN0YXR1cyBhbmQgZW5xdWV1ZSBzdGF0 dXMgbm90aWZpY2F0aW9uLgorICogQGNmZzoJCSAgICBGcmFtZSBvZmZzZXQgYW5kIGZyYW1lIGZv cm1hdC4KKyAqIEBhZGRyX2xvOgkJICAgIEhvbGRpbmcgdGhlIGNvbXBvdW5kIGRlc2NyaXB0b3Ig b2YgdGhlIGxvd2VyCisgKgkJCSAgICAzMi1iaXRzIGFkZHJlc3MgaW4gbWVtb3J5IDQwLWJpdCBh ZGRyZXNzLgorICogQGFkZHJfaGk6CQkgICAgU2FtZSBhcyBhYm92ZSBtZW1iZXIsIGJ1dCBwb2lu dCBoaWdoIDgtYml0cyBpbgorICoJCQkgICAgbWVtb3J5IDQwLWJpdCBhZGRyZXNzLgorICogQF9f cmVzZXJ2ZWQxOgkgICAgUmVzZXJ2ZWQgZmllbGQuCisgKiBAY2ZnOGJfdzE6CQkgICAgQ29tcG91 bmQgZGVzY3JpcHRvciBjb21tYW5kIHF1ZXVlIG9yaWdpbiBwcm9kdWNlZAorICoJCQkgICAgYnkg cURNQSBhbmQgZHluYW1pYyBkZWJ1ZyBmaWVsZC4KKyAqIEBkYXRhCQkgICAgUG9pbnRlciB0byB0 aGUgbWVtb3J5IDQwLWJpdCBhZGRyZXNzLCBkZXNjcmliZXMgRE1BCisgKgkJCSAgICBzb3VyY2Ug aW5mb3JtYXRpb24gYW5kIERNQSBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvbi4KKyAqLworc3RydWN0 IGZzbF9xZG1hX2Zvcm1hdCB7CisJX19sZTMyIHN0YXR1czsKKwlfX2xlMzIgY2ZnOworCXVuaW9u IHsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBhZGRyX2xvOworCQkJdTggYWRkcl9oaTsKKwkJCXU4 IF9fcmVzZXJ2ZWQxWzJdOworCQkJdTggY2ZnOGJfdzE7CisJCX0gX19wYWNrZWQ7CisJCV9fbGU2 NCBkYXRhOworCX07Cit9IF9fcGFja2VkOworCisvKiBxRE1BIHN0YXR1cyBub3RpZmljYXRpb24g cHJlIGluZm9ybWF0aW9uICovCitzdHJ1Y3QgZnNsX3ByZV9zdGF0dXMgeworCXU2NCBxdWV1ZTsK Kwl1NjQgYWRkcjsKK307CisKK3N0cnVjdCBmc2xfcWRtYV9jaGFuIHsKKwlzdHJ1Y3QgdmlydF9k bWFfY2hhbgkJdmNoYW47CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MJCXZkZXNjOworCWVudW0gZG1h X3N0YXR1cwkJCXN0YXR1czsKKwl1MzIJCQkJc2xhdmVfaWQ7CisJc3RydWN0IGZzbF9xZG1hX2Vu Z2luZQkJKnFkbWE7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlCQkqcXVldWU7CisJc3RydWN0IGxp c3RfaGVhZAkJcWNvbXA7Cit9OworCitzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgeworCXN0cnVjdCBm c2xfcWRtYV9mb3JtYXQJKnZpcnRfaGVhZDsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0 X3RhaWw7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX3VzZWQ7CisJc3RydWN0IGxpc3RfaGVhZAlj b21wX2ZyZWU7CisJc3RydWN0IGRtYV9wb29sCQkqY29tcF9wb29sOworCXNwaW5sb2NrX3QJCXF1 ZXVlX2xvY2s7CisJZG1hX2FkZHJfdAkJYnVzX2FkZHI7CisJdTMyICAgICAgICAgICAgICAgICAg ICAgbl9jcTsKKwl1MzIJCQlpZDsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSpjcTsKK307CisK K3N0cnVjdCBmc2xfcWRtYV9jb21wIHsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgICBidXNfYWRk cjsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0X2FkZHI7CisJc3RydWN0IGZzbF9xZG1h X2NoYW4JKnFjaGFuOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICAgIHZkZXNjOworCXN0cnVjdCBs aXN0X2hlYWQJbGlzdDsKK307CisKK3N0cnVjdCBmc2xfcWRtYV9lbmdpbmUgeworCXN0cnVjdCBk bWFfZGV2aWNlCWRtYV9kZXY7CisJdm9pZCBfX2lvbWVtCQkqY3RybF9iYXNlOworCXZvaWQgX19p b21lbSAgICAgICAgICAgICpzdGF0dXNfYmFzZTsKKwl2b2lkIF9faW9tZW0JCSpibG9ja19iYXNl OworCXUzMgkJCW5fY2hhbnM7CisJdTMyCQkJbl9xdWV1ZXM7CisJc3RydWN0IG11dGV4ICAgICAg ICAgICAgZnNsX3FkbWFfbXV0ZXg7CisJaW50CQkJZXJyb3JfaXJxOworCWludAkJCXF1ZXVlX2ly cTsKKwlib29sCQkJZmVhdHVyZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUJKnF1ZXVlOworCXN0 cnVjdCBmc2xfcWRtYV9xdWV1ZQkqc3RhdHVzOworCXN0cnVjdCBmc2xfcWRtYV9jaGFuCWNoYW5z W107CisKK307CisKK3N0YXRpYyBpbmxpbmUgdTY0CitxZG1hX2NjZGZfYWRkcl9nZXQ2NChjb25z dCBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmKQoreworCXJldHVybiBsZTY0X3RvX2NwdShj Y2RmLT5kYXRhKSAmIChVNjRfTUFYID4+IDI0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitx ZG1hX2Rlc2NfYWRkcl9zZXQ2NChzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCB1NjQgYWRk cikKK3sKKwljY2RmLT5hZGRyX2hpID0gdXBwZXJfMzJfYml0cyhhZGRyKTsKKwljY2RmLT5hZGRy X2xvID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhhZGRyKSk7Cit9CisKK3N0YXRpYyBpbmxp bmUgdTY0CitxZG1hX2NjZGZfZ2V0X3F1ZXVlKGNvbnN0IHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQg KmNjZGYpCit7CisJcmV0dXJuIGNjZGYtPmNmZzhiX3cxICYgVThfTUFYOworfQorCitzdGF0aWMg aW5saW5lIGludAorcWRtYV9jY2RmX2dldF9vZmZzZXQoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zv cm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGNjZGYtPmNmZykgJiBRRE1BX0ND REZfTUFTSykgPj4gUURNQV9DQ0RGX09GRlNFVDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitx ZG1hX2NjZGZfc2V0X2Zvcm1hdChzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCBpbnQgb2Zm c2V0KQoreworCWNjZGYtPmNmZyA9IGNwdV90b19sZTMyKFFETUFfQ0NERl9GT1RNQVQgfCBvZmZz ZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRtYV9jY2RmX2dldF9zdGF0dXMoY29uc3Qg c3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGNj ZGYtPnN0YXR1cykgJiBRRE1BX0NDREZfTUFTSykgPj4gUURNQV9DQ0RGX1NUQVRVUzsKK30KKwor c3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0X3NlcihzdHJ1Y3QgZnNsX3FkbWFfZm9y bWF0ICpjY2RmLCBpbnQgc3RhdHVzKQoreworCWNjZGYtPnN0YXR1cyA9IGNwdV90b19sZTMyKFFE TUFfQ0NERl9TRVIgfCBzdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcWRtYV9jc2dm X3NldF9sZW4oc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY3NnZiwgaW50IGxlbikKK3sKKwljc2dm LT5jZmcgPSBjcHVfdG9fbGUzMihsZW4gJiBRRE1BX1NHX0xFTl9NQVNLKTsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRfZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dm LCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNwdV90b19sZTMyKFFETUFfU0dfRklOIHwgKGxl biAmIFFETUFfU0dfTEVOX01BU0spKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkbWFfY3Nn Zl9zZXRfZShzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dmLCBpbnQgbGVuKQoreworCWNzZ2Yt PmNmZyA9IGNwdV90b19sZTMyKFFETUFfU0dfRVhUIHwgKGxlbiAmIFFETUFfU0dfTEVOX01BU0sp KTsKK30KKworc3RhdGljIHUzMiBxZG1hX3JlYWRsKHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFk bWEsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4gRlNMX0RNQV9JTihxZG1hLCBhZGRy LCAzMik7Cit9CisKK3N0YXRpYyB2b2lkIHFkbWFfd3JpdGVsKHN0cnVjdCBmc2xfcWRtYV9lbmdp bmUgKnFkbWEsIHUzMiB2YWwsCisJCQkJCQl2b2lkIF9faW9tZW0gKmFkZHIpCit7CisJRlNMX0RN QV9PVVQocWRtYSwgYWRkciwgdmFsLCAzMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFf Y2hhbiAqdG9fZnNsX3FkbWFfY2hhbihzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJcmV0dXJu IGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiwgdmNoYW4uY2hhbik7Cit9 CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqdG9fZnNsX3FkbWFfY29tcChzdHJ1Y3Qg dmlydF9kbWFfZGVzYyAqdmQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2ZCwgc3RydWN0IGZz bF9xZG1hX2NvbXAsIHZkZXNjKTsKK30KKworc3RhdGljIHZvaWQgZnNsX3FkbWFfZnJlZV9jaGFu X3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IGZzbF9xZG1hX2No YW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCUxJU1RfSEVBRChoZWFkKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfY2hhbi0+ dmNoYW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2dldF9hbGxfZGVzY3JpcHRvcnMoJmZzbF9jaGFu LT52Y2hhbiwgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9jaGFuLT52Y2hh bi5sb2NrLCBmbGFncyk7CisKKwl2Y2hhbl9kbWFfZGVzY19mcmVlX2xpc3QoJmZzbF9jaGFuLT52 Y2hhbiwgJmhlYWQpOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9jb21wX2ZpbGxfbWVtY3B5 KHN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcCwKKwkJCQkJZG1hX2FkZHJfdCBkc3QsIGRt YV9hZGRyX3Qgc3JjLCB1MzIgbGVuKQoreworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYs ICpjc2dmX2Rlc2MsICpjc2dmX3NyYywgKmNzZ2ZfZGVzdDsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9y bWF0ICpzZGYsICpkZGY7CisKKwljY2RmID0gZnNsX2NvbXAtPnZpcnRfYWRkcjsKKwljc2dmX2Rl c2MgPSBmc2xfY29tcC0+dmlydF9hZGRyICsgMTsKKwljc2dmX3NyYyA9IGZzbF9jb21wLT52aXJ0 X2FkZHIgKyAyOworCWNzZ2ZfZGVzdCA9IGZzbF9jb21wLT52aXJ0X2FkZHIgKyAzOworCXNkZiA9 IGZzbF9jb21wLT52aXJ0X2FkZHIgKyA0OworCWRkZiA9IGZzbF9jb21wLT52aXJ0X2FkZHIgKyA1 OworCisJbWVtc2V0KGZzbF9jb21wLT52aXJ0X2FkZHIsIDAsIEZTTF9RRE1BX0JBU0VfQlVGRkVS X1NJWkUpOworCS8qIEhlYWQgQ29tbWFuZCBEZXNjcmlwdG9yKEZyYW1lIERlc2NyaXB0b3IpICov CisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY2NkZiwgZnNsX2NvbXAtPmJ1c19hZGRyICsgMTYpOwor CXFkbWFfY2NkZl9zZXRfZm9ybWF0KGNjZGYsIHFkbWFfY2NkZl9nZXRfb2Zmc2V0KGNjZGYpKTsK KwlxZG1hX2NjZGZfc2V0X3NlcihjY2RmLCBxZG1hX2NjZGZfZ2V0X3N0YXR1cyhjY2RmKSk7CisK KwkvKiBTdGF0dXMgbm90aWZpY2F0aW9uIGlzIGVucXVldWVkIHRvIHN0YXR1cyBxdWV1ZS4gKi8K KwkvKiBDb21wb3VuZCBDb21tYW5kIERlc2NyaXB0b3IoRnJhbWUgTGlzdCBUYWJsZSkgKi8KKwlx ZG1hX2Rlc2NfYWRkcl9zZXQ2NChjc2dmX2Rlc2MsIGZzbF9jb21wLT5idXNfYWRkciArIDY0KTsK KwkvKiBJdCBtdXN0IGJlIDMyIGFzIENvbXBvdW5kIFMvRyBEZXNjcmlwdG9yICovCisJcWRtYV9j c2dmX3NldF9sZW4oY3NnZl9kZXNjLCAzMik7CisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY3NnZl9z cmMsIHNyYyk7CisJcWRtYV9jc2dmX3NldF9sZW4oY3NnZl9zcmMsIGxlbik7CisJcWRtYV9kZXNj X2FkZHJfc2V0NjQoY3NnZl9kZXN0LCBkc3QpOworCXFkbWFfY3NnZl9zZXRfbGVuKGNzZ2ZfZGVz dCwgbGVuKTsKKwkvKiBUaGlzIGVudHJ5IGlzIHRoZSBsYXN0IGVudHJ5LiAqLworCXFkbWFfY3Nn Zl9zZXRfZihjc2dmX2Rlc3QsIGxlbik7CisJLyogRGVzY3JpcHRvciBCdWZmZXIgKi8KKwlzZGYt PmRhdGEgPSBjcHVfdG9fbGU2NCgKKwkJCUZTTF9RRE1BX0NNRF9SV1RUWVBFIDw8IEZTTF9RRE1B X0NNRF9SV1RUWVBFX09GRlNFVCk7CisJZGRmLT5kYXRhID0gY3B1X3RvX2xlNjQoCisJCQlGU0xf UURNQV9DTURfUldUVFlQRSA8PCBGU0xfUURNQV9DTURfUldUVFlQRV9PRkZTRVQpOworCWRkZi0+ ZGF0YSB8PSBjcHVfdG9fbGU2NCgKKwkJCUZTTF9RRE1BX0NNRF9MV0MgPDwgRlNMX1FETUFfQ01E X0xXQ19PRkZTRVQpOworfQorCisvKgorICogUHJlLXJlcXVlc3QgZnVsbCBjb21tYW5kIGRlc2Ny aXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJlX3JlcXVlc3Rf ZW5xdWV1ZV9kZXNjKHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWUpCit7CisJc3RydWN0IGZz bF9xZG1hX2NvbXAgKmNvbXBfdGVtcCwgKl9jb21wX3RlbXA7CisJaW50IGk7CisKKwlmb3IgKGkg PSAwOyBpIDwgcXVldWUtPm5fY3E7IGkrKykgeworCQljb21wX3RlbXAgPSBremFsbG9jKHNpemVv ZigqY29tcF90ZW1wKSwgR0ZQX05PV0FJVCk7CisJCWlmICghY29tcF90ZW1wKQorCQkJZ290byBl cnI7CisKKwkJY29tcF90ZW1wLT52aXJ0X2FkZHIgPSBkbWFfcG9vbF9hbGxvYyhxdWV1ZS0+Y29t cF9wb29sLAorCQkJCQkJICAgICAgR0ZQX05PV0FJVCwKKwkJCQkJCSAgICAgICZjb21wX3RlbXAt PmJ1c19hZGRyKTsKKwkJaWYgKCFjb21wX3RlbXAtPnZpcnRfYWRkcikKKwkJCWdvdG8gZXJyOwor CisJCWxpc3RfYWRkX3RhaWwoJmNvbXBfdGVtcC0+bGlzdCwgJnF1ZXVlLT5jb21wX2ZyZWUpOwor CX0KKwlyZXR1cm4gMDsKKworZXJyOgorCWlmIChpID09IDAgJiYgY29tcF90ZW1wKSB7CisJCWtm cmVlKGNvbXBfdGVtcCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdoaWxlICgtLWkgPj0g MSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY29tcF90ZW1wLCBfY29tcF90ZW1wLAor CQkJCSZxdWV1ZS0+Y29tcF9mcmVlLCBsaXN0KSB7CisJCQlkbWFfcG9vbF9mcmVlKHF1ZXVlLT5j b21wX3Bvb2wsCisJCQkJCWNvbXBfdGVtcC0+dmlydF9hZGRyLAorCQkJCQljb21wX3RlbXAtPmJ1 c19hZGRyKTsKKwkJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxpc3QpOworCQkJa2ZyZWUoY29tcF90 ZW1wKTsKKwkJfQorCX0KKwlyZXR1cm4gLUVOT01FTTsKK30KKworLyoKKyAqIFJlcXVlc3QgYSBj b21tYW5kIGRlc2NyaXB0b3IgZm9yIGVucXVldWUuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZnNsX3Fk bWFfY29tcCAqZnNsX3FkbWFfcmVxdWVzdF9lbnF1ZXVlX2Rlc2MoCisJCQkJCXN0cnVjdCBmc2xf cWRtYV9jaGFuICpmc2xfY2hhbiwKKwkJCQkJdW5zaWduZWQgaW50IGRzdF9uZW50cywKKwkJCQkJ dW5zaWduZWQgaW50IHNyY19uZW50cykKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqY29tcF90 ZW1wOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxdWV1ZS0+cXVldWVf bG9jaywgZmxhZ3MpOworCWlmIChsaXN0X2VtcHR5KCZxdWV1ZS0+Y29tcF9mcmVlKSkgeworCQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZxdWV1ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCQljb21w X3RlbXAgPSBremFsbG9jKHNpemVvZigqY29tcF90ZW1wKSwgR0ZQX0tFUk5FTCk7CisJCWlmICgh Y29tcF90ZW1wKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJY29tcF90ZW1wLT52aXJ0X2FkZHIgPSBk bWFfcG9vbF9hbGxvYyhxdWV1ZS0+Y29tcF9wb29sLAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCwK KwkJCQkJCSAgICAgICZjb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJaWYgKCFjb21wX3RlbXAtPnZp cnRfYWRkcikgeworCQkJa2ZyZWUoY29tcF90ZW1wKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisK Kwl9IGVsc2UgeworCQljb21wX3RlbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxdWV1ZS0+Y29tcF9m cmVlLAorCQkJCQkgICAgIHN0cnVjdCBmc2xfcWRtYV9jb21wLAorCQkJCQkgICAgIGxpc3QpOwor CQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm cXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwl9CisKKwljb21wX3RlbXAtPnFjaGFuID0gZnNs X2NoYW47CisKKwlyZXR1cm4gY29tcF90ZW1wOworfQorCitzdGF0aWMgc3RydWN0IGZzbF9xZG1h X3F1ZXVlICpmc2xfcWRtYV9hbGxvY19xdWV1ZV9yZXNvdXJjZXMoCisJCQkJCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCXVuc2lnbmVkIGludCBxdWV1ZV9udW0pCit7CisJc3Ry dWN0IGZzbF9xZG1hX3F1ZXVlICpxdWV1ZV9oZWFkLCAqcXVldWVfdGVtcDsKKwlpbnQgcmV0LCBp OworCXVuc2lnbmVkIGludCBxdWV1ZV9zaXplW0ZTTF9RRE1BX1FVRVVFX01BWF07CisKKwlpZiAo cXVldWVfbnVtID4gRlNMX1FETUFfUVVFVUVfTUFYKQorCQlxdWV1ZV9udW0gPSBGU0xfUURNQV9R VUVVRV9NQVg7CisJcXVldWVfaGVhZCA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCBxdWV1ZV9u dW0sCisJCQkJc2l6ZW9mKCpxdWV1ZV9oZWFkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFxdWV1ZV9o ZWFkKQorCQlyZXR1cm4gTlVMTDsKKworCXJldCA9IGRldmljZV9wcm9wZXJ0eV9yZWFkX3UzMl9h cnJheSgmcGRldi0+ZGV2LCAicXVldWUtc2l6ZXMiLAorCQkJCQlxdWV1ZV9zaXplLCBxdWV1ZV9u dW0pOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHF1ZXVl LXNpemVzLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBxdWV1 ZV9udW07IGkrKykgeworCQlpZiAocXVldWVfc2l6ZVtpXSA+IEZTTF9RRE1BX0NJUkNVTEFSX0RF U0NfU0laRV9NQVggfHwKKwkJCSAgICBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VMQVJf REVTQ19TSVpFX01JTikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiR2V0IHdyb25nIHF1ZXVl LXNpemVzLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlxdWV1ZV90ZW1wID0gcXVldWVf aGVhZCArIGk7CisJCXF1ZXVlX3RlbXAtPmNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5k ZXYsCisJCQkJCQlzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkgKgorCQkJCQkJcXVldWVf c2l6ZVtpXSwKKwkJCQkJCSZxdWV1ZV90ZW1wLT5idXNfYWRkciwKKwkJCQkJCUdGUF9LRVJORUwp OworCQlpZiAoIXF1ZXVlX3RlbXAtPmNxKSB7CisJCQlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHF1 ZXVlX2hlYWQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJcXVldWVfdGVtcC0+bl9jcSA9IHF1 ZXVlX3NpemVbaV07CisJCXF1ZXVlX3RlbXAtPmlkID0gaTsKKwkJcXVldWVfdGVtcC0+dmlydF9o ZWFkID0gcXVldWVfdGVtcC0+Y3E7CisJCXF1ZXVlX3RlbXAtPnZpcnRfdGFpbCA9IHF1ZXVlX3Rl bXAtPmNxOworCisJCS8qCisJCSAqIENyZWF0ZSBhIGNvbXAgZG1hIHBvb2wgdGhhdCBzaXplCisJ CSAqIGlzICdGU0xfUURNQV9CQVNFX0JVRkZFUl9TSVpFJy4KKwkJICogVGhlIGRtYSBwb29sIGZv ciBxdWV1ZSBjb21tYW5kIGJ1ZmZlci4KKwkJICovCisJCXF1ZXVlX3RlbXAtPmNvbXBfcG9vbCA9 IGRtYV9wb29sX2NyZWF0ZSgiY29tcF9wb29sIiwKKwkJCQkJCSZwZGV2LT5kZXYsCisJCQkJCQlG U0xfUURNQV9CQVNFX0JVRkZFUl9TSVpFLAorCQkJCQkJMTYsIDApOworCQlpZiAoIXF1ZXVlX3Rl bXAtPmNvbXBfcG9vbCkKKwkJCWdvdG8gZXJyOworCisJCS8qCisJCSAqIExpc3QgZm9yIHF1ZXVl IGNvbW1hbmQgYnVmZmVyCisJCSAqLworCQlJTklUX0xJU1RfSEVBRCgmcXVldWVfdGVtcC0+Y29t cF91c2VkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlX3RlbXAtPmNvbXBfZnJlZSk7CisJCXNw aW5fbG9ja19pbml0KCZxdWV1ZV90ZW1wLT5xdWV1ZV9sb2NrKTsKKwl9CisKKwlyZXR1cm4gcXVl dWVfaGVhZDsKKworZXJyOgorCWlmIChpID09IDAgJiYgcXVldWVfdGVtcC0+Y29tcF9wb29sKQor CQlkbWFfcG9vbF9kZXN0cm95KHF1ZXVlX3RlbXAtPmNvbXBfcG9vbCk7CisJd2hpbGUgKC0taSA+ PSAxKSB7CisJCXF1ZXVlX3RlbXAgPSBxdWV1ZV9oZWFkICsgaTsKKwkJaWYgKGkgPT0gMSAmJiB1 bmxpa2VseShxdWV1ZV90ZW1wLT5jb21wX3Bvb2wpKQorCQkJZG1hX3Bvb2xfZGVzdHJveShxdWV1 ZV90ZW1wLT5jb21wX3Bvb2wpOworCX0KKworCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJInVuYWJs ZSB0byBhbGxvY2F0ZSBjaGFubmVsICVkIGRlc2NyaXB0b3IgcG9vbFxuIiwKKwkJcXVldWVfdGVt cC0+aWQpOworCisJd2hpbGUgKC0taSA+PSAwKSB7CisJCXF1ZXVlX3RlbXAgPSBxdWV1ZV9oZWFk ICsgaTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0 IGZzbF9xZG1hX2Zvcm1hdCkgKgorCQkJCXF1ZXVlX3NpemVbaV0sCisJCQkJcXVldWVfdGVtcC0+ Y3EsCisJCQkJcXVldWVfdGVtcC0+YnVzX2FkZHIpOworCX0KKwlkZXZtX2tmcmVlKCZwZGV2LT5k ZXYsIHF1ZXVlX2hlYWQpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGZzbF9x ZG1hX3F1ZXVlICpmc2xfcWRtYV9wcmVwX3N0YXR1c19xdWV1ZSgKKwkJCQkJCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRl di5vZl9ub2RlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqc3RhdHVzX2hlYWQ7CisJdW5zaWdu ZWQgaW50IHN0YXR1c19zaXplOworCWludCByZXQ7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFk X3UzMihucCwgInN0YXR1cy1zaXplcyIsICZzdGF0dXNfc2l6ZSk7CisJaWYgKHJldCkgeworCQlk ZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgc3RhdHVzLXNpemVzLlxuIik7CisJCXJldHVy biBOVUxMOworCX0KKwlpZiAoc3RhdHVzX3NpemUgPiBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJ WkVfTUFYCisJCQl8fCBzdGF0dXNfc2l6ZSA8IEZTTF9RRE1BX0NJUkNVTEFSX0RFU0NfU0laRV9N SU4pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiR2V0IHdyb25nIHN0YXR1c19zaXplLlxuIik7 CisJCXJldHVybiBOVUxMOworCX0KKwlzdGF0dXNfaGVhZCA9IGRldm1fa3phbGxvYygmcGRldi0+ ZGV2LCBzaXplb2YoKnN0YXR1c19oZWFkKSwKKwkJCQkJCQkJR0ZQX0tFUk5FTCk7CisJaWYgKCFz dGF0dXNfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIEJ1ZmZlciBmb3IgcXVldWUg Y29tbWFuZAorCSAqLworCXN0YXR1c19oZWFkLT5jcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRl di0+ZGV2LAorCQkJCQkJc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoKKwkJCQkJCXN0 YXR1c19zaXplLAorCQkJCQkJJnN0YXR1c19oZWFkLT5idXNfYWRkciwKKwkJCQkJCUdGUF9LRVJO RUwpOworCWlmICghc3RhdHVzX2hlYWQtPmNxKSB7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwg c3RhdHVzX2hlYWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdGF0dXNfaGVhZC0+bl9jcSA9 IHN0YXR1c19zaXplOworCXN0YXR1c19oZWFkLT52aXJ0X2hlYWQgPSBzdGF0dXNfaGVhZC0+Y3E7 CisJc3RhdHVzX2hlYWQtPnZpcnRfdGFpbCA9IHN0YXR1c19oZWFkLT5jcTsKKwlzdGF0dXNfaGVh ZC0+Y29tcF9wb29sID0gTlVMTDsKKworCXJldHVybiBzdGF0dXNfaGVhZDsKK30KKworc3RhdGlj IGludCBmc2xfcWRtYV9oYWx0KHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQorewor CXZvaWQgX19pb21lbSAqY3RybCA9IGZzbF9xZG1hLT5jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVt ICpibG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlOworCWludCBpLCBjb3VudCA9IEZTTF9RRE1B X0hBTFRfQ09VTlQ7CisJdTMyIHJlZzsKKworCS8qIERpc2FibGUgdGhlIGNvbW1hbmQgcXVldWUg YW5kIHdhaXQgZm9yIGlkbGUgc3RhdGUuICovCisJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwg Y3RybCArIEZTTF9RRE1BX0RNUik7CisJcmVnIHw9IEZTTF9RRE1BX0RNUl9EUUQ7CisJcWRtYV93 cml0ZWwoZnNsX3FkbWEsIHJlZywgY3RybCArIEZTTF9RRE1BX0RNUik7CisJZm9yIChpID0gMDsg aSA8IEZTTF9RRE1BX1FVRVVFX05VTV9NQVg7IGkrKykKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEs IDAsIGJsb2NrICsgRlNMX1FETUFfQkNRTVIoaSkpOworCisJd2hpbGUgKDEpIHsKKwkJcmVnID0g cWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RTUik7CisJCWlmICghKHJlZyAm IEZTTF9RRE1BX0RTUl9EQikpCisJCQlicmVhazsKKwkJaWYgKGNvdW50LS0gPCAwKQorCQkJcmV0 dXJuIC1FQlVTWTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJLyogRGlzYWJsZSBzdGF0dXMgcXVl dWUuICovCisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIp OworCisJLyogQ2xlYXIgYWxsIGRldGVjdGVkIGV2ZW50cyBhbmQgaW50ZXJydXB0cyBmb3IgYWxs IHF1ZXVlcy4gKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NMRUFS LAorCQkJCWJsb2NrICsgRlNMX1FETUFfQkNRSURSKDApKTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IGZzbF9xZG1hX3F1ZXVlX3RyYW5zZmVyX2NvbXBsZXRlKHN0cnVjdCBmc2xfcWRt YV9lbmdpbmUgKmZzbF9xZG1hKQoreworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVl ID0gZnNsX3FkbWEtPnF1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3N0YXR1cyA9 IGZzbF9xZG1hLT5zdGF0dXM7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICp0ZW1wX3F1ZXVlOwor CXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0 ICpzdGF0dXNfYWRkcjsKKwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dmX3NyYzsKKwlzdHJ1 Y3QgZnNsX3ByZV9zdGF0dXMgcHJlOworCXZvaWQgX19pb21lbSAqYmxvY2sgPSBmc2xfcWRtYS0+ YmxvY2tfYmFzZTsKKwl1MzIgcmVnLCBpLCBjb3VudDsKKwlib29sIGR1cGxpY2F0ZTsKKworCW1l bXNldCgmcHJlLCAwLCBzaXplb2Yoc3RydWN0IGZzbF9wcmVfc3RhdHVzKSk7CisJY291bnQgPSBG U0xfUURNQV9NQVhfU0laRTsKKworCXdoaWxlIChjb3VudC0tKSB7CisJCWR1cGxpY2F0ZSA9IDA7 CisKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURNQV9CU1FTUik7 CisJCWlmIChyZWcgJiBGU0xfUURNQV9CU1FTUl9RRSkKKwkJCXJldHVybiAwOworCisJCXN0YXR1 c19hZGRyID0gZnNsX3N0YXR1cy0+dmlydF9oZWFkOworCQlpZiAocWRtYV9jY2RmX2dldF9xdWV1 ZShzdGF0dXNfYWRkcikgPT0gcHJlLnF1ZXVlICYmCisJCQlxZG1hX2NjZGZfYWRkcl9nZXQ2NChz dGF0dXNfYWRkcikgPT0gcHJlLmFkZHIpCisJCQlkdXBsaWNhdGUgPSAxOworCisJCWkgPSBxZG1h X2NjZGZfZ2V0X3F1ZXVlKHN0YXR1c19hZGRyKTsKKwkJcHJlLnF1ZXVlID0gcWRtYV9jY2RmX2dl dF9xdWV1ZShzdGF0dXNfYWRkcik7CisJCXByZS5hZGRyID0gcWRtYV9jY2RmX2FkZHJfZ2V0NjQo c3RhdHVzX2FkZHIpOworCQl0ZW1wX3F1ZXVlID0gZnNsX3F1ZXVlICsgaTsKKwkJc3Bpbl9sb2Nr KCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnRlbXBfcXVldWUt PmNvbXBfdXNlZCkpIHsKKwkJCWlmICghZHVwbGljYXRlKSB7CisJCQkJc3Bpbl91bmxvY2soJnRl bXBfcXVldWUtPnF1ZXVlX2xvY2spOworCQkJCXJldHVybiAtRUFHQUlOOworCQkJfQorCQl9IGVs c2UgeworCQkJZnNsX2NvbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ0ZW1wX3F1ZXVlLT5jb21wX3Vz ZWQsCisJCQkJCQkJc3RydWN0IGZzbF9xZG1hX2NvbXAsCisJCQkJCQkJbGlzdCk7CisJCQljc2dm X3NyYyA9IGZzbF9jb21wLT52aXJ0X2FkZHIgKyAyOworCQkJaWYgKGZzbF9jb21wLT5idXNfYWRk ciArIDE2ICE9IHByZS5hZGRyKSB7CisJCQkJaWYgKGR1cGxpY2F0ZSkgeworCQkJCQlzcGluX3Vu bG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisJCQkJCXJldHVybiAtRUFHQUlOOworCQkJ CX0KKwkJCX0KKwkJfQorCisJCQlpZiAoZHVwbGljYXRlKSB7CisJCQkJcmVnID0gcWRtYV9yZWFk bChmc2xfcWRtYSwgYmxvY2sgKworCQkJCQkJRlNMX1FETUFfQlNRTVIpOworCQkJcmVnIHw9IEZT TF9RRE1BX0JTUU1SX0RJOworCQkJcWRtYV9kZXNjX2FkZHJfc2V0NjQoc3RhdHVzX2FkZHIsIDB4 MCk7CisJCQlmc2xfc3RhdHVzLT52aXJ0X2hlYWQrKzsKKwkJCWlmIChmc2xfc3RhdHVzLT52aXJ0 X2hlYWQgPT0gZnNsX3N0YXR1cy0+Y3EKKwkJCQkJCSAgICsgZnNsX3N0YXR1cy0+bl9jcSkKKwkJ CQlmc2xfc3RhdHVzLT52aXJ0X2hlYWQgPSBmc2xfc3RhdHVzLT5jcTsKKwkJCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCByZWcsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCQkJc3Bpbl91bmxvY2so JnRlbXBfcXVldWUtPnF1ZXVlX2xvY2spOworCQkJY29udGludWU7CisJCX0KKwkJbGlzdF9kZWwo JmZzbF9jb21wLT5saXN0KTsKKworCQlyZWcgPSBxZG1hX3JlYWRsKGZzbF9xZG1hLCBibG9jayAr IEZTTF9RRE1BX0JTUU1SKTsKKwkJcmVnIHw9IEZTTF9RRE1BX0JTUU1SX0RJOworCQlxZG1hX2Rl c2NfYWRkcl9zZXQ2NChzdGF0dXNfYWRkciwgMHgwKTsKKwkJZnNsX3N0YXR1cy0+dmlydF9oZWFk Kys7CisJCWlmIChmc2xfc3RhdHVzLT52aXJ0X2hlYWQgPT0gZnNsX3N0YXR1cy0+Y3EgKyBmc2xf c3RhdHVzLT5uX2NxKQorCQkJZnNsX3N0YXR1cy0+dmlydF9oZWFkID0gZnNsX3N0YXR1cy0+Y3E7 CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOwor CQlzcGluX3VubG9jaygmdGVtcF9xdWV1ZS0+cXVldWVfbG9jayk7CisKKwkJc3Bpbl9sb2NrKCZm c2xfY29tcC0+cWNoYW4tPnZjaGFuLmxvY2spOworCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmZz bF9jb21wLT52ZGVzYyk7CisJCWZzbF9jb21wLT5xY2hhbi0+c3RhdHVzID0gRE1BX0NPTVBMRVRF OworCQlzcGluX3VubG9jaygmZnNsX2NvbXAtPnFjaGFuLT52Y2hhbi5sb2NrKTsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZzbF9xZG1hX2Vycm9yX2hhbmRsZXIo aW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9x ZG1hID0gZGV2X2lkOworCXVuc2lnbmVkIGludCBpbnRyOworCXZvaWQgX19pb21lbSAqc3RhdHVz ID0gZnNsX3FkbWEtPnN0YXR1c19iYXNlOworCisJaW50ciA9IHFkbWFfcmVhZGwoZnNsX3FkbWEs IHN0YXR1cyArIEZTTF9RRE1BX0RFRFIpOworCisJaWYgKGludHIpCisJCWRldl9lcnIoZnNsX3Fk bWEtPmRtYV9kZXYuZGV2LCAiRE1BIHRyYW5zYWN0aW9uIGVycm9yIVxuIik7CisKKwkvKiBDbGVh ciBhbGwgZXJyb3IgY29uZGl0aW9ucyBhbmQgaW50ZXJydXB0cy4gKi8KKwlxZG1hX3dyaXRlbChm c2xfcWRtYSwgRlNMX1FETUFfREVEUl9DTEVBUiwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisK KwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfcWRtYV9x dWV1ZV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFf ZW5naW5lICpmc2xfcWRtYSA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50ciwgcmVnOworCXZv aWQgX19pb21lbSAqYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZTsKKwl2b2lkIF9faW9tZW0g KmN0cmwgPSBmc2xfcWRtYS0+Y3RybF9iYXNlOworCisJaW50ciA9IHFkbWFfcmVhZGwoZnNsX3Fk bWEsIGJsb2NrICsgRlNMX1FETUFfQkNRSURSKDApKTsKKworCWlmICgoaW50ciAmIEZTTF9RRE1B X0NRSURSX1NRVCkgIT0gMCkKKwkJaW50ciA9IGZzbF9xZG1hX3F1ZXVlX3RyYW5zZmVyX2NvbXBs ZXRlKGZzbF9xZG1hKTsKKworCWlmIChpbnRyICE9IDApIHsKKwkJcmVnID0gcWRtYV9yZWFkbChm c2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RNUik7CisJCXJlZyB8PSBGU0xfUURNQV9ETVJfRFFE OworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNMX1FETUFfRE1SKTsKKwkJ cWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQkNRSUVSKDApKTsKKwkJ ZGV2X2Vycihmc2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJRRE1BOiBzdGF0dXMgZXJyIVxuIik7CisJ fQorCisJLyogQ2xlYXIgYWxsIGRldGVjdGVkIGV2ZW50cyBhbmQgaW50ZXJydXB0cy4gKi8KKwlx ZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQkNRSURSX0NMRUFSLAorCQkJCWJsb2NrICsg RlNMX1FETUFfQkNRSURSKDApKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGlj IGludAorZnNsX3FkbWFfaXJxX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJ ICBzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgcmV0OworCisJZnNs X3FkbWEtPmVycm9yX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsCisJCQkJCQkJ InFkbWEtZXJyb3IiKTsKKwlpZiAoZnNsX3FkbWEtPmVycm9yX2lycSA8IDApIHsKKwkJZGV2X2Vy cigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHFkbWEgY29udHJvbGxlciBpcnEuXG4iKTsKKwkJcmV0 dXJuIGZzbF9xZG1hLT5lcnJvcl9pcnE7CisJfQorCisJZnNsX3FkbWEtPnF1ZXVlX2lycSA9IHBs YXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJxZG1hLXF1ZXVlIik7CisJaWYgKGZzbF9xZG1h LT5xdWV1ZV9pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxZG1h IHF1ZXVlIGlycS5cbiIpOworCQlyZXR1cm4gZnNsX3FkbWEtPnF1ZXVlX2lycTsKKwl9CisKKwly ZXQgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIGZzbF9xZG1hLT5lcnJvcl9pcnEsCisJ CQlmc2xfcWRtYV9lcnJvcl9oYW5kbGVyLCAwLCAicURNQSBlcnJvciIsIGZzbF9xZG1hKTsKKwlp ZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHFETUEgY29u dHJvbGxlciBJUlEuXG4iKTsKKwkJcmV0dXJuICByZXQ7CisJfQorCXJldCA9IGRldm1fcmVxdWVz dF9pcnEoJnBkZXYtPmRldiwgZnNsX3FkbWEtPnF1ZXVlX2lycSwKKwkJCWZzbF9xZG1hX3F1ZXVl X2hhbmRsZXIsIDAsICJxRE1BIHF1ZXVlIiwgZnNsX3FkbWEpOworCWlmIChyZXQpIHsKKwkJZGV2 X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgcURNQSBxdWV1ZSBJUlEuXG4iKTsKKwkJ cmV0dXJuICByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1h X2lycV9leGl0KAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZnNsX3Fk bWFfZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpZiAoZnNsX3FkbWEtPnF1ZXVlX2lycSA9PSBmc2xf cWRtYS0+ZXJyb3JfaXJxKSB7CisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgZnNsX3FkbWEt PnF1ZXVlX2lycSwgZnNsX3FkbWEpOworCX0gZWxzZSB7CisJCWRldm1fZnJlZV9pcnEoJnBkZXYt PmRldiwgZnNsX3FkbWEtPnF1ZXVlX2lycSwgZnNsX3FkbWEpOworCQlkZXZtX2ZyZWVfaXJxKCZw ZGV2LT5kZXYsIGZzbF9xZG1hLT5lcnJvcl9pcnEsIGZzbF9xZG1hKTsKKwl9Cit9CisKK3N0YXRp YyBpbnQgZnNsX3FkbWFfcmVnX2luaXQoc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEp Cit7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfcWRtYS0+cXVldWU7 CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICp0ZW1wOworCXZvaWQgX19pb21lbSAqY3RybCA9IGZz bF9xZG1hLT5jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpzdGF0dXMgPSBmc2xfcWRtYS0+c3Rh dHVzX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpibG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlOwor CWludCBpLCByZXQ7CisJdTMyIHJlZzsKKworCS8qIFRyeSB0byBoYWx0IHRoZSBxRE1BIGVuZ2lu ZSBmaXJzdC4gKi8KKwlyZXQgPSBmc2xfcWRtYV9oYWx0KGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7 CisJCWRldl9lcnIoZnNsX3FkbWEtPmRtYV9kZXYuZGV2LCAiRE1BIGhhbHQgZmFpbGVkISIpOwor CQlyZXR1cm4gcmV0OworCX0KKworCS8qIENsZWFyIGFsbCBkZXRlY3RlZCBldmVudHMgYW5kIGlu dGVycnVwdHMgZm9yIGFsbCBxdWV1ZXMuICovCisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9R RE1BX0JDUUlEUl9DTEVBUiwKKwkJCQlibG9jayArIEZTTF9RRE1BX0JDUUlEUigwKSk7CisKKwlm b3IgKGkgPSAwOyBpIDwgZnNsX3FkbWEtPm5fcXVldWVzOyBpKyspIHsKKwkJdGVtcCA9IGZzbF9x dWV1ZSArIGk7CisJCS8qCisJCSAqIEluaXRpYWxpemUgQ29tbWFuZCBRdWV1ZSByZWdpc3RlcnMg dG8gcG9pbnQgdG8gdGhlIGZpcnN0CisJCSAqIGNvbW1hbmQgZGVzY3JpcHRvciBpbiBtZW1vcnku CisJCSAqIERlcXVldWUgUG9pbnRlciBBZGRyZXNzIFJlZ2lzdGVycworCQkgKiBFbnF1ZXVlIFBv aW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJICovCisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCB0 ZW1wLT5idXNfYWRkciwKKwkJCQlibG9jayArIEZTTF9RRE1BX0JDUURQQV9TQUREUihpKSk7CisJ CXFkbWFfd3JpdGVsKGZzbF9xZG1hLCB0ZW1wLT5idXNfYWRkciwKKwkJCQlibG9jayArIEZTTF9R RE1BX0JDUUVQQV9TQUREUihpKSk7CisKKwkJLyogSW5pdGlhbGl6ZSB0aGUgcXVldWUgbW9kZS4g Ki8KKwkJcmVnID0gRlNMX1FETUFfQkNRTVJfRU47CisJCXJlZyB8PSBGU0xfUURNQV9CQ1FNUl9D RF9USExEKGlsb2cyKHRlbXAtPm5fY3EpIC0gNCk7CisJCXJlZyB8PSBGU0xfUURNQV9CQ1FNUl9D UV9TSVpFKGlsb2cyKHRlbXAtPm5fY3EpIC0gNik7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBy ZWcsIGJsb2NrICsgRlNMX1FETUFfQkNRTVIoaSkpOworCX0KKworCS8qCisJICogV29ya2Fyb3Vu ZCBmb3IgZXJyYXR1bTogRVJSMDEwODEyLgorCSAqIFdlIG11c3QgZW5hYmxlIFhPRkYgdG8gYXZv aWQgdGhlIGVucXVldWUgcmVqZWN0aW9uIG9jY3Vycy4KKwkgKiBTZXR0aW5nIFNRQ0NNUiBFTlRF Ul9XTSB0byAweDIwLgorCSAqLworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9TUUND TVJfRU5URVJfV00sCisJCQkgICAgICBibG9jayArIEZTTF9RRE1BX1NRQ0NNUik7CisJLyoKKwkg KiBJbml0aWFsaXplIHN0YXR1cyBxdWV1ZSByZWdpc3RlcnMgdG8gcG9pbnQgdG8gdGhlIGZpcnN0 CisJICogY29tbWFuZCBkZXNjcmlwdG9yIGluIG1lbW9yeS4KKwkgKiBEZXF1ZXVlIFBvaW50ZXIg QWRkcmVzcyBSZWdpc3RlcnMKKwkgKiBFbnF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMK KwkgKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgZnNsX3FkbWEtPnN0YXR1cy0+YnVzX2FkZHIs CisJCQkJCWJsb2NrICsgRlNMX1FETUFfU1FFUEFSKTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwg ZnNsX3FkbWEtPnN0YXR1cy0+YnVzX2FkZHIsCisJCQkJCWJsb2NrICsgRlNMX1FETUFfU1FEUEFS KTsKKwkvKiBJbml0aWFsaXplIHN0YXR1cyBxdWV1ZSBpbnRlcnJ1cHQuICovCisJcWRtYV93cml0 ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0JDUUlFUl9DUVRJRSwKKwkJCSAgICAgIGJsb2NrICsgRlNM X1FETUFfQkNRSUVSKDApKTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQlNRSUNS X0lDRU4gfCBGU0xfUURNQV9CU1FJQ1JfSUNTVCg1KQorCQkJCQkJICAgfCAweDgwMDAsCisJCQkg ICAgICBibG9jayArIEZTTF9RRE1BX0JTUUlDUik7CisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZT TF9RRE1BX0NRSUVSX01FSUUgfCBGU0xfUURNQV9DUUlFUl9URUlFLAorCQkJICAgICAgYmxvY2sg KyBGU0xfUURNQV9DUUlFUik7CisJLyogSW5pdGlhbGl6ZSBjb250cm9sbGVyIGludGVycnVwdCBy ZWdpc3Rlci4gKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfREVEUl9DTEVBUiwg c3RhdHVzICsgRlNMX1FETUFfREVEUik7CisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1B X0RFSUVSX0NMRUFSLCBzdGF0dXMgKyBGU0xfUURNQV9ERUlFUik7CisKKwkvKiBJbml0aWFsaXpl IHRoZSBzdGF0dXMgcXVldWUgbW9kZS4gKi8KKwlyZWcgPSBGU0xfUURNQV9CU1FNUl9FTjsKKwly ZWcgfD0gRlNMX1FETUFfQlNRTVJfQ1FfU0laRShpbG9nMihmc2xfcWRtYS0+c3RhdHVzLT5uX2Nx KS02KTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1S KTsKKworCXJlZyA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGN0cmwgKyBGU0xfUURNQV9ETVIpOwor CXJlZyAmPSB+RlNMX1FETUFfRE1SX0RRRDsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBj dHJsICsgRlNMX1FETUFfRE1SKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRt YV9hc3luY190eF9kZXNjcmlwdG9yICoKK2ZzbF9xZG1hX3ByZXBfbWVtY3B5KHN0cnVjdCBkbWFf Y2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBkc3QsCisJCWRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVu LCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hh biA9IHRvX2ZzbF9xZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmZzbF9j b21wOworCisJZnNsX2NvbXAgPSBmc2xfcWRtYV9yZXF1ZXN0X2VucXVldWVfZGVzYyhmc2xfY2hh biwgMCwgMCk7CisJZnNsX3FkbWFfY29tcF9maWxsX21lbWNweShmc2xfY29tcCwgZHN0LCBzcmMs IGxlbik7CisKKwlyZXR1cm4gdmNoYW5fdHhfcHJlcCgmZnNsX2NoYW4tPnZjaGFuLCAmZnNsX2Nv bXAtPnZkZXNjLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2VucXVldWVfZGVz YyhzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4pCit7CisJdm9pZCBfX2lvbWVtICpibG9j ayA9IGZzbF9jaGFuLT5xZG1hLT5ibG9ja19iYXNlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAq ZnNsX3F1ZXVlID0gZnNsX2NoYW4tPnF1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xf Y29tcDsKKwlzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmRlc2M7CisJdTMyIHJlZzsKKworCXJlZyA9 IHFkbWFfcmVhZGwoZnNsX2NoYW4tPnFkbWEsIGJsb2NrICsgRlNMX1FETUFfQkNRU1IoZnNsX3F1 ZXVlLT5pZCkpOworCWlmIChyZWcgJiAoRlNMX1FETUFfQkNRU1JfUUYgfCBGU0xfUURNQV9CQ1FT Ul9YT0ZGKSkKKwkJcmV0dXJuOworCXZkZXNjID0gdmNoYW5fbmV4dF9kZXNjKCZmc2xfY2hhbi0+ dmNoYW4pOworCWlmICghdmRlc2MpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmdmRlc2MtPm5vZGUp OworCWZzbF9jb21wID0gdG9fZnNsX3FkbWFfY29tcCh2ZGVzYyk7CisKKwltZW1jcHkoZnNsX3F1 ZXVlLT52aXJ0X2hlYWQrKywgZnNsX2NvbXAtPnZpcnRfYWRkciwKKwkJCQkJc2l6ZW9mKHN0cnVj dCBmc2xfcWRtYV9mb3JtYXQpKTsKKwlpZiAoZnNsX3F1ZXVlLT52aXJ0X2hlYWQgPT0gZnNsX3F1 ZXVlLT5jcSArIGZzbF9xdWV1ZS0+bl9jcSkKKwkJZnNsX3F1ZXVlLT52aXJ0X2hlYWQgPSBmc2xf cXVldWUtPmNxOworCisJbGlzdF9hZGRfdGFpbCgmZnNsX2NvbXAtPmxpc3QsICZmc2xfcXVldWUt PmNvbXBfdXNlZCk7CisJYmFycmllcigpOworCXJlZyA9IHFkbWFfcmVhZGwoZnNsX2NoYW4tPnFk bWEsIGJsb2NrICsgRlNMX1FETUFfQkNRTVIoZnNsX3F1ZXVlLT5pZCkpOworCXJlZyB8PSBGU0xf UURNQV9CQ1FNUl9FSTsKKwlxZG1hX3dyaXRlbChmc2xfY2hhbi0+cWRtYSwgcmVnLCBibG9jayAr IEZTTF9RRE1BX0JDUU1SKGZzbF9xdWV1ZS0+aWQpKTsKKwlmc2xfY2hhbi0+c3RhdHVzID0gRE1B X0lOX1BST0dSRVNTOworfQorCitzdGF0aWMgZW51bSBkbWFfc3RhdHVzIGZzbF9xZG1hX3R4X3N0 YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCWRtYV9jb29raWVfdCBjb29raWUsIHN0cnVj dCBkbWFfdHhfc3RhdGUgKnR4c3RhdGUpCit7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKworCXJl dCA9IGRtYV9jb29raWVfc3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7CisJaWYgKHJldCA9 PSBETUFfQ09NUExFVEUgfHwgIXR4c3RhdGUpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9mcmVlX2Rlc2Moc3RydWN0IHZpcnRfZG1hX2Rl c2MgKnZkZXNjKQoreworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3Qg ZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZnNs X2NvbXAgPSB0b19mc2xfcWRtYV9jb21wKHZkZXNjKTsKKwlmc2xfcXVldWUgPSBmc2xfY29tcC0+ cWNoYW4tPnF1ZXVlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9xdWV1ZS0+cXVldWVfbG9j aywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmZzbF9jb21wLT5saXN0LCAmZnNsX3F1ZXVlLT5j b21wX2ZyZWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzbF9xdWV1ZS0+cXVldWVfbG9j aywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9pc3N1ZV9wZW5kaW5nKHN0cnVj dCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW4gPSB0 b19mc2xfcWRtYV9jaGFuKGNoYW4pOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3F1ZXVl ID0gZnNsX2NoYW4tPnF1ZXVlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrKCZmc2xf Y2hhbi0+dmNoYW4ubG9jayk7CisJaWYgKHZjaGFuX2lzc3VlX3BlbmRpbmcoJmZzbF9jaGFuLT52 Y2hhbikpCisJCWZzbF9xZG1hX2VucXVldWVfZGVzYyhmc2xfY2hhbik7CisJc3Bpbl91bmxvY2so JmZzbF9jaGFuLT52Y2hhbi5sb2NrKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmc2xfcXVl dWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBmc2xfcWRtYV9wcm9iZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAg PSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYTsK KwlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqZnNsX2NoYW47CisJc3RydWN0IHJlc291cmNlICpyZXM7 CisJdW5zaWduZWQgaW50IGxlbiwgY2hhbnMsIHF1ZXVlczsKKwlpbnQgcmV0LCBpOworCisJcmV0 ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJkbWEtY2hhbm5lbHMiLCAmY2hhbnMpOworCWlm IChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IGRtYS1jaGFubmVscy5c biIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWxlbiA9IHNpemVvZigqZnNsX3FkbWEpICsgc2l6 ZW9mKCpmc2xfY2hhbikgKiBjaGFuczsKKwlmc2xfcWRtYSA9IGRldm1fa3phbGxvYygmcGRldi0+ ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICghZnNsX3FkbWEpCisJCXJldHVybiAtRU5PTUVN OworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJmc2wsZG1hLXF1ZXVlcyIsICZx dWV1ZXMpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHF1 ZXVlcy5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWZzbF9xZG1hLT5xdWV1ZSA9IGZzbF9x ZG1hX2FsbG9jX3F1ZXVlX3Jlc291cmNlcyhwZGV2LCBxdWV1ZXMpOworCWlmICghZnNsX3FkbWEt PnF1ZXVlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZzbF9xZG1hLT5zdGF0dXMgPSBmc2xfcWRt YV9wcmVwX3N0YXR1c19xdWV1ZShwZGV2KTsKKwlpZiAoIWZzbF9xZG1hLT5zdGF0dXMpCisJCXJl dHVybiAtRU5PTUVNOworCisJZnNsX3FkbWEtPm5fY2hhbnMgPSBjaGFuczsKKwlmc2xfcWRtYS0+ bl9xdWV1ZXMgPSBxdWV1ZXM7CisJbXV0ZXhfaW5pdCgmZnNsX3FkbWEtPmZzbF9xZG1hX211dGV4 KTsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwg MCk7CisJZnNsX3FkbWEtPmN0cmxfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPmN0cmxfYmFzZSkpCisJCXJldHVybiBQ VFJfRVJSKGZzbF9xZG1hLT5jdHJsX2Jhc2UpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlmc2xfcWRtYS0+c3RhdHVzX2Jhc2UgPSBk ZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKGZzbF9x ZG1hLT5zdGF0dXNfYmFzZSkpCisJCXJldHVybiBQVFJfRVJSKGZzbF9xZG1hLT5zdGF0dXNfYmFz ZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0s IDIpOworCWZzbF9xZG1hLT5ibG9ja19iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2 LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihmc2xfcWRtYS0+YmxvY2tfYmFzZSkpCisJCXJldHVy biBQVFJfRVJSKGZzbF9xZG1hLT5ibG9ja19iYXNlKTsKKworCXJldCA9IGZzbF9xZG1hX2lycV9p bml0KHBkZXYsIGZzbF9xZG1hKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZnNsX3Fk bWEtPmZlYXR1cmUgPSBvZl9wcm9wZXJ0eV9yZWFkX2Jvb2wobnAsICJiaWctZW5kaWFuIik7CisJ SU5JVF9MSVNUX0hFQUQoJmZzbF9xZG1hLT5kbWFfZGV2LmNoYW5uZWxzKTsKKwlmb3IgKGkgPSAw OyBpIDwgZnNsX3FkbWEtPm5fY2hhbnM7IGkrKykgeworCQlzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAq ZnNsX2NoYW4gPSAmZnNsX3FkbWEtPmNoYW5zW2ldOworCisJCWZzbF9jaGFuLT5xZG1hID0gZnNs X3FkbWE7CisJCWZzbF9jaGFuLT5xdWV1ZSA9IGZzbF9xZG1hLT5xdWV1ZSArIGkgJSBmc2xfcWRt YS0+bl9xdWV1ZXM7CisJCWZzbF9jaGFuLT52Y2hhbi5kZXNjX2ZyZWUgPSBmc2xfcWRtYV9mcmVl X2Rlc2M7CisJCUlOSVRfTElTVF9IRUFEKCZmc2xfY2hhbi0+cWNvbXApOworCQl2Y2hhbl9pbml0 KCZmc2xfY2hhbi0+dmNoYW4sICZmc2xfcWRtYS0+ZG1hX2Rldik7CisJfQorCWZvciAoaSA9IDA7 IGkgPCBmc2xfcWRtYS0+bl9xdWV1ZXM7IGkrKykKKwkJZnNsX3FkbWFfcHJlX3JlcXVlc3RfZW5x dWV1ZV9kZXNjKGZzbF9xZG1hLT5xdWV1ZSArIGkpOworCisJZG1hX2NhcF9zZXQoRE1BX01FTUNQ WSwgZnNsX3FkbWEtPmRtYV9kZXYuY2FwX21hc2spOworCisJZnNsX3FkbWEtPmRtYV9kZXYuZGV2 ID0gJnBkZXYtPmRldjsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfZnJlZV9jaGFuX3Jlc291 cmNlcworCQk9IGZzbF9xZG1hX2ZyZWVfY2hhbl9yZXNvdXJjZXM7CisJZnNsX3FkbWEtPmRtYV9k ZXYuZGV2aWNlX3R4X3N0YXR1cyA9IGZzbF9xZG1hX3R4X3N0YXR1czsKKwlmc2xfcWRtYS0+ZG1h X2Rldi5kZXZpY2VfcHJlcF9kbWFfbWVtY3B5ID0gZnNsX3FkbWFfcHJlcF9tZW1jcHk7CisJZnNs X3FkbWEtPmRtYV9kZXYuZGV2aWNlX2lzc3VlX3BlbmRpbmcgPSBmc2xfcWRtYV9pc3N1ZV9wZW5k aW5nOworCisJZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSyg0MCkpOworCisJ cGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZnNsX3FkbWEpOworCisJcmV0ID0gZG1hX2FzeW5j X2RldmljZV9yZWdpc3RlcigmZnNsX3FkbWEtPmRtYV9kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2 X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgcmVnaXN0ZXIgTlhQIExheWVyc2NhcGUgcURNQSBlbmdp bmUuXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBmc2xfcWRtYV9yZWdfaW5pdChm c2xfcWRtYSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBJbml0 aWFsaXplIHRoZSBxRE1BIGVuZ2luZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBmc2xfcWRtYV9jbGVhbnVwX3ZjaGFuKHN0cnVjdCBkbWFf ZGV2aWNlICpkbWFkZXYpCit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmNoYW4sICpfY2hhbjsK KworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGFuLCBfY2hhbiwKKwkJCQkmZG1hZGV2LT5j aGFubmVscywgdmNoYW4uY2hhbi5kZXZpY2Vfbm9kZSkgeworCQlsaXN0X2RlbCgmY2hhbi0+dmNo YW4uY2hhbi5kZXZpY2Vfbm9kZSk7CisJCXRhc2tsZXRfa2lsbCgmY2hhbi0+dmNoYW4udGFzayk7 CisJfQorfQorCitzdGF0aWMgaW50IGZzbF9xZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9k ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSA9IHBsYXRmb3JtX2dldF9kcnZk YXRhKHBkZXYpOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqcXVldWVfdGVtcDsKKwlzdHJ1Y3Qg ZnNsX3FkbWFfcXVldWUgKnN0YXR1cyA9IGZzbF9xZG1hLT5zdGF0dXM7CisJc3RydWN0IGZzbF9x ZG1hX2NvbXAgKmNvbXBfdGVtcCwgKl9jb21wX3RlbXA7CisJaW50IGk7CisKKwlmc2xfcWRtYV9p cnFfZXhpdChwZGV2LCBmc2xfcWRtYSk7CisJZnNsX3FkbWFfY2xlYW51cF92Y2hhbigmZnNsX3Fk bWEtPmRtYV9kZXYpOworCW9mX2RtYV9jb250cm9sbGVyX2ZyZWUobnApOworCWRtYV9hc3luY19k ZXZpY2VfdW5yZWdpc3RlcigmZnNsX3FkbWEtPmRtYV9kZXYpOworCisJLyogRnJlZSBkZXNjcmlw dG9yIGFyZWFzICovCisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5uX3F1ZXVlczsgaSsrKSB7 CisJCXF1ZXVlX3RlbXAgPSBmc2xfcWRtYS0+cXVldWUgKyBpOworCQlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUoY29tcF90ZW1wLCBfY29tcF90ZW1wLAorCQkJCQkmcXVldWVfdGVtcC0+Y29tcF91 c2VkLAlsaXN0KSB7CisJCQlkbWFfcG9vbF9mcmVlKHF1ZXVlX3RlbXAtPmNvbXBfcG9vbCwKKwkJ CQkJY29tcF90ZW1wLT52aXJ0X2FkZHIsCisJCQkJCWNvbXBfdGVtcC0+YnVzX2FkZHIpOworCQkJ bGlzdF9kZWwoJmNvbXBfdGVtcC0+bGlzdCk7CisJCQlrZnJlZShjb21wX3RlbXApOworCQl9CisJ CWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb21wX3RlbXAsIF9jb21wX3RlbXAsCisJCQkJCSZx dWV1ZV90ZW1wLT5jb21wX2ZyZWUsIGxpc3QpIHsKKwkJCWRtYV9wb29sX2ZyZWUocXVldWVfdGVt cC0+Y29tcF9wb29sLAorCQkJCQljb21wX3RlbXAtPnZpcnRfYWRkciwKKwkJCQkJY29tcF90ZW1w LT5idXNfYWRkcik7CisJCQlsaXN0X2RlbCgmY29tcF90ZW1wLT5saXN0KTsKKwkJCWtmcmVlKGNv bXBfdGVtcCk7CisJCX0KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwgc2l6ZW9mKHN0 cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoKKwkJCQkJcXVldWVfdGVtcC0+bl9jcSwgcXVldWVfdGVt cC0+Y3EsCisJCQkJCXF1ZXVlX3RlbXAtPmJ1c19hZGRyKTsKKwkJZG1hX3Bvb2xfZGVzdHJveShx dWV1ZV90ZW1wLT5jb21wX3Bvb2wpOworCX0KKworCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5k ZXYsIHNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSAqCisJCQkJc3RhdHVzLT5uX2NxLCBz dGF0dXMtPmNxLCBzdGF0dXMtPmJ1c19hZGRyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNv bnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgZnNsX3FkbWFfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0 aWJsZSA9ICJmc2wsbHMxMDIxYS1xZG1hIiwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitN T0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmc2xfcWRtYV9kdF9pZHMpOworCitzdGF0aWMgc3RydWN0 IHBsYXRmb3JtX2RyaXZlciBmc2xfcWRtYV9kcml2ZXIgPSB7CisJLmRyaXZlcgkJPSB7CisJCS5u YW1lCT0gImZzbC1xZG1hIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZnNsX3FkbWFfZHRfaWRzLAor CX0sCisJLnByb2JlICAgICAgICAgID0gZnNsX3FkbWFfcHJvYmUsCisJLnJlbW92ZQkJPSBmc2xf cWRtYV9yZW1vdmUsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGZzbF9xZG1hX2RyaXZl cik7CisKK01PRFVMRV9BTElBUygicGxhdGZvcm06ZnNsLXFkbWEiKTsKK01PRFVMRV9ERVNDUklQ VElPTigiTlhQIExheWVyc2NhcGUgcURNQSBlbmdpbmUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5T RSgiR1BMIHYyIik7Cg==