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: [v4,2/6] dmaengine: fsl-qdma: Add qDMA controller driver for Layerscape SoCs From: Wen He Message-Id: <20180514120307.15592-2-wen.he_1@nxp.com> Date: Mon, 14 May 2018 20:03:03 +0800 To: vinod.koul@intel.com, dmaengine@vger.kernel.org Cc: robh+dt@kernel.org, devicetree@vger.kernel.org, leoyang.li@nxp.com, jiafei.pan@nxp.com, jiaheng.fan@nxp.com, Wen He List-ID: TlhQIFF1ZXVlIERNQSBjb250cm9sbGVyKHFETUEpIG9uIExheWVyc2NhcGUgU29DcyBzdXBwb3J0 cyBjaGFubmVsCnZpcnR1YWxsaXphdGlvbiBieSBhbGxvd2luZyBETUEgam9icyB0byBiZSBlbnF1 ZXVlZCBpbnRvIGRpZmZlcmVudApjb21tYW5kIHF1ZXVlcy4KCk5vdGUgdGhhdCB0aGlzIG1vZHVs ZSBkZXBlbmRzIG9uIE5YUCBEUEFBLgoKU2lnbmVkLW9mZi1ieTogV2VuIEhlIDx3ZW4uaGVfMUBu eHAuY29tPgpTaWduZWQtb2ZmLWJ5OiBKaWFoZW5nIEZhbiA8amlhaGVuZy5mYW5AbnhwLmNvbT4K LS0tCmNoYW5nZSBpbiB2NDoKCS0gRml4ZWQgdGhlIGlzc3VlcyB0aGF0IFZpbm9kIHBvaW50IG91 dCBpbiB0aGUgbWFpbCBsaXN0LgoKY2hhbmdlIGluIHYzOgoJLSBBZGQgJ2RlcGVuZHMgb24gQVJN IHx8IEFSTTY0JyBpbiBmaWxlICdkcml2ZXJzL2RtYS9LY29uZmlnJwoKY2hhbmdlIGluIHYyOgoJ LSBSZXBsYWNlIEdQTCBWMiBMaWNlbnNlIGRldGFpbHMgYnkgU1BEWCB0YWdzCgktIFJlcGxhY2Ug RnJlZXNjYWxlIGJ5IE5YUAoJLSBSZWR1Y2UgYW5kIG9wdGltaXplIGhlYWRlciBmaWxlIHJlZmVy ZW5jZXMKCS0gUmVwbGFjZSBiaWdfZW5kaWFuIGJ5IGZlYXR1cmUgaW4gc3RydWN0IGZzbF9xZG1h X2VuZ2luZQoJLSBSZXBsYWNlIHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgYnkgc3RydWN0IGZzbF9x ZG1hX2NjZGYKCSAgYW5kIHN0cnVjdCBmc2xfcWRtYV9jc2dmCgktIFJlbW92ZSBlbXB0eSBsaW5l CgktIFJlcGxhY2UgJ2lmLi5lbHNlJyBieSBtYWNybyAnRlNMX1FETUFfSU4vT1VUJyBpbiBmdW5j dGlvbgoJICBxZG1hX3JlYWRsKCkgYW5kIHFkbWFfd3JpdGVsKCkKCS0gUmVtb3ZlIGZ1bmN0aW9u IGZzbF9xZG1hX2FsbG9jX2NoYW5fcmVzb3VyY2VzKCkKCS0gUmVwbGFjZSAncHJlaScgYnkgJ3By ZScKCS0gUmVwbGFjZSAnLTEnIGJ5ICctRU5PTUVNJyBpbiBmdW5jdGlvbiBmc2xfcWRtYV9wcmVf cmVxdWVzdF9lbnF1ZXVlX2Rlc2MoKQoJLSBGaXggZG1hIHBvb2wgYWxsb2NhdGlvbiBuZWVkIHRv IHJvbGxlZCBiYWNrIGluIGZ1bmN0aW9uCgkgIGZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNj KCkKCS0gUmVwbGFjZSBmdW5jdGlvbiBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSgpIGJ5IGRl dmljZV9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheSgpCgktIEFkZCBmdW5jdGlvbnMgZnNsX3FkbWFf Y2xlYW51cF92Y2hhbigpIGFuZCBmc2xfcWRtYV9pcnFfZXhpdCgpIHRvIGVuc3VyZQoJICBpcnEg YW5kIHRhc2tsZXRzIHN0b3BwZWQKCS0gUmVwbGFjZSBkdHMgbm9kZSBlbGVtZW50ICdjaGFubmVs cycgYnkgJ2RtYS1jaGFubmVscycKCS0gUmVwbGFjZSBmdW5jdGlvbiBwbGF0Zm9ybV9kcml2ZXJf cmVnaXN0ZXIoKSBieSBtb2R1bGVfcGxhdGZvcm1fZHJpdmVyKCkKCiBkcml2ZXJzL2RtYS9LY29u ZmlnICAgIHwgICAxMyArCiBkcml2ZXJzL2RtYS9NYWtlZmlsZSAgIHwgICAgMSArCiBkcml2ZXJz L2RtYS9mc2wtcWRtYS5jIHwgMTEyMCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysKIDMgZmlsZXMgY2hhbmdlZCwgMTEzNCBpbnNlcnRpb25zKCspLCAwIGRl bGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1hL2ZzbC1xZG1hLmMKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRl eCA2ZDYxY2QwLi45OWFmZjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBi L2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTIyNSw2ICsyMjUsMTkgQEAgY29uZmlnIEZTTF9FRE1B CiAJICBtdWx0aXBsZXhpbmcgY2FwYWJpbGl0eSBmb3IgRE1BIHJlcXVlc3Qgc291cmNlcyhzbG90 KS4KIAkgIFRoaXMgbW9kdWxlIGNhbiBiZSBmb3VuZCBvbiBGcmVlc2NhbGUgVnlicmlkIGFuZCBM Uy0xIFNvQ3MuCiAKK2NvbmZpZyBGU0xfUURNQQorICAgICAgIHRyaXN0YXRlICJOWFAgTGF5ZXJz Y2FwZSBxRE1BIGVuZ2luZSBzdXBwb3J0IgorICAgICAgIGRlcGVuZHMgb24gQVJNIHx8IEFSTTY0 CisgICAgICAgc2VsZWN0IERNQV9FTkdJTkUKKyAgICAgICBzZWxlY3QgRE1BX1ZJUlRVQUxfQ0hB Tk5FTFMKKyAgICAgICBzZWxlY3QgRE1BX0VOR0lORV9SQUlECisgICAgICAgc2VsZWN0IEFTWU5D X1RYX0VOQUJMRV9DSEFOTkVMX1NXSVRDSAorICAgICAgIGhlbHAKKyAgICAgICAgIFN1cHBvcnQg dGhlIE5YUCBMYXllcnNjYXBlIHFETUEgZW5naW5lIHdpdGggY29tbWFuZCBxdWV1ZSBhbmQgbGVn YWN5IG1vZGUuCisgICAgICAgICBDaGFubmVsIHZpcnR1YWxpemF0aW9uIGlzIHN1cHBvcnRlZCB0 aHJvdWdoIGVucXVldWluZyBvZiBETUEgam9icyB0bywKKyAgICAgICAgIG9yIGRlcXVldWluZyBE TUEgam9icyBmcm9tLCBkaWZmZXJlbnQgd29yayBxdWV1ZXMuCisgICAgICAgICBUaGlzIG1vZHVs ZSBjYW4gYmUgZm91bmQgb24gTlhQIExheWVyc2NhcGUgU29Dcy4KKwogY29uZmlnIEZTTF9SQUlE CiAgICAgICAgIHRyaXN0YXRlICJGcmVlc2NhbGUgUkFJRCBlbmdpbmUgU3VwcG9ydCIKICAgICAg ICAgZGVwZW5kcyBvbiBGU0xfU09DICYmICFBU1lOQ19UWF9FTkFCTEVfQ0hBTk5FTF9TV0lUQ0gK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUK aW5kZXggMGY2MmE0ZC4uOTNkYjBmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUK KysrIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKQEAgLTMzLDYgKzMzLDcgQEAgb2JqLSQoQ09ORklH X0RXX0RNQUNfQ09SRSkgKz0gZHcvCiBvYmotJChDT05GSUdfRVA5M1hYX0RNQSkgKz0gZXA5M3h4 X2RtYS5vCiBvYmotJChDT05GSUdfRlNMX0RNQSkgKz0gZnNsZG1hLm8KIG9iai0kKENPTkZJR19G U0xfRURNQSkgKz0gZnNsLWVkbWEubworb2JqLSQoQ09ORklHX0ZTTF9RRE1BKSArPSBmc2wtcWRt YS5vCiBvYmotJChDT05GSUdfRlNMX1JBSUQpICs9IGZzbF9yYWlkLm8KIG9iai0kKENPTkZJR19I U1VfRE1BKSArPSBoc3UvCiBvYmotJChDT05GSUdfSU1HX01EQ19ETUEpICs9IGltZy1tZGMtZG1h Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2ZzbC1xZG1hLmMgYi9kcml2ZXJzL2RtYS9mc2wt cWRtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNDFiODYKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS9mc2wtcWRtYS5jCkBAIC0wLDAgKzEsMTEyMCBAQAor Ly8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8vIENvcHlyaWdodCAyMDE4IE5Y UAorCisvKgorICogRHJpdmVyIGZvciBOWFAgTGF5ZXJzY2FwZSBRdWV1ZSBEaXJlY3QgTWVtb3J5 IEFjY2VzcyBDb250cm9sbGVyCisgKgorICogQXV0aG9yOgorICogIFdlbiBIZSA8d2VuLmhlXzFA bnhwLmNvbT4KKyAqICBKaWFoZW5nIEZhbiA8amlhaGVuZy5mYW5AbnhwLmNvbT4KKyAqCisgKi8K KworI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o PgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+Cisj aW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3Jt Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZG1hLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBp bmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFwb29sLmg+CisjaW5jbHVkZSA8bGludXgvZG1hZW5n aW5lLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2Nr Lmg+CisKKyNpbmNsdWRlICJ2aXJ0LWRtYS5oIgorI2luY2x1ZGUgImZzbGRtYS5oIgorCisvKiBS ZWdpc3RlciByZWxhdGVkIGRlZmluaXRpb24gKi8KKyNkZWZpbmUgRlNMX1FETUFfRE1SCQkJMHgw CisjZGVmaW5lIEZTTF9RRE1BX0RTUgkJCTB4NAorI2RlZmluZSBGU0xfUURNQV9ERUlFUgkJCTB4 ZTAwCisjZGVmaW5lIEZTTF9RRE1BX0RFRFIJCQkweGUwNAorI2RlZmluZSBGU0xfUURNQV9ERUNG RFcwUgkJMHhlMTAKKyNkZWZpbmUgRlNMX1FETUFfREVDRkRXMVIJCTB4ZTE0CisjZGVmaW5lIEZT TF9RRE1BX0RFQ0ZEVzJSCQkweGUxOAorI2RlZmluZSBGU0xfUURNQV9ERUNGRFczUgkJMHhlMWMK KyNkZWZpbmUgRlNMX1FETUFfREVDRlFJRFIJCTB4ZTMwCisjZGVmaW5lIEZTTF9RRE1BX0RFQ0JS CQkJMHhlMzQKKworI2RlZmluZSBGU0xfUURNQV9CQ1FNUih4KQkJKDB4YzAgKyAweDEwMCAqICh4 KSkKKyNkZWZpbmUgRlNMX1FETUFfQkNRU1IoeCkJCSgweGM0ICsgMHgxMDAgKiAoeCkpCisjZGVm aW5lIEZTTF9RRE1BX0JDUUVEUEFfU0FERFIoeCkJKDB4YzggKyAweDEwMCAqICh4KSkKKyNkZWZp bmUgRlNMX1FETUFfQkNRRFBBX1NBRERSKHgpCSgweGNjICsgMHgxMDAgKiAoeCkpCisjZGVmaW5l IEZTTF9RRE1BX0JDUUVFUEFfU0FERFIoeCkJKDB4ZDAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUg RlNMX1FETUFfQkNRRVBBX1NBRERSKHgpCSgweGQ0ICsgMHgxMDAgKiAoeCkpCisjZGVmaW5lIEZT TF9RRE1BX0JDUUlFUih4KQkJKDB4ZTAgKyAweDEwMCAqICh4KSkKKyNkZWZpbmUgRlNMX1FETUFf QkNRSURSKHgpCQkoMHhlNCArIDB4MTAwICogKHgpKQorCisjZGVmaW5lIEZTTF9RRE1BX1NRRFBB UgkJCTB4ODBjCisjZGVmaW5lIEZTTF9RRE1BX1NRRVBBUgkJCTB4ODE0CisjZGVmaW5lIEZTTF9R RE1BX0JTUU1SCQkJMHg4MDAKKyNkZWZpbmUgRlNMX1FETUFfQlNRU1IJCQkweDgwNAorI2RlZmlu ZSBGU0xfUURNQV9CU1FJQ1IJCQkweDgyOAorI2RlZmluZSBGU0xfUURNQV9DUU1SCQkJMHhhMDAK KyNkZWZpbmUgRlNMX1FETUFfQ1FEU0NSMQkJMHhhMDgKKyNkZWZpbmUgRlNMX1FETUFfQ1FEU0NS MiAgICAgICAgICAgICAgICAweGEwYworI2RlZmluZSBGU0xfUURNQV9DUUlFUgkJCTB4YTEwCisj ZGVmaW5lIEZTTF9RRE1BX0NRRURSCQkJMHhhMTQKKyNkZWZpbmUgRlNMX1FETUFfU1FDQ01SCQkJ MHhhMjAKKworLyogUmVnaXN0ZXJzIGZvciBiaXQgYW5kIGdlbm1hc2sgKi8KKyNkZWZpbmUgRlNM X1FETUFfQ1FJRFJfU1FUCQkweDgwMDAKKyNkZWZpbmUgUURNQV9DQ0RGX01BU0sJCQlHRU5NQVNL KDI4LCAyMCkKKyNkZWZpbmUgUURNQV9DQ0RGX0ZPVE1BVAkJQklUKDI5KQorI2RlZmluZSBRRE1B X0NDREZfU0VSCQkJQklUKDMwKQorI2RlZmluZSBRRE1BX1NHX0ZJTgkJCUJJVCgzMCkKKyNkZWZp bmUgUURNQV9TR19FWFQJCQlCSVQoMzEpCisjZGVmaW5lIFFETUFfU0dfTEVOX01BU0sJCUdFTk1B U0soMjksIDApCisKKyNkZWZpbmUgUURNQV9DQ0RGX1NUQVRVUwkJMjAKKyNkZWZpbmUgUURNQV9D Q0RGX09GRlNFVAkJMjAKKyNkZWZpbmUgRlNMX1FETUFfQkNRSUVSX0NRVElFCQkweDgwMDAKKyNk ZWZpbmUgRlNMX1FETUFfQkNRSUVSX0NRUEVJRQkJMHg4MDAwMDAKKyNkZWZpbmUgRlNMX1FETUFf QlNRSUNSX0lDRU4JCTB4ODAwMDAwMDAKKyNkZWZpbmUgRlNMX1FETUFfQlNRSUNSX0lDU1QoeCkJ CSgoeCkgPDwgMTYpCisjZGVmaW5lIEZTTF9RRE1BX0NRSUVSX01FSUUJCTB4ODAwMDAwMDAKKyNk ZWZpbmUgRlNMX1FETUFfQ1FJRVJfVEVJRQkJMHgxCisjZGVmaW5lIEZTTF9RRE1BX1NRQ0NNUl9F TlRFUl9XTQkweDIwMDAwMAorCisjZGVmaW5lIEZTTF9RRE1BX1FVRVVFX01BWAkJOAorCisjZGVm aW5lIEZTTF9RRE1BX0JDUU1SX0VOCQkweDgwMDAwMDAwCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1S X0VJCQkweDQwMDAwMDAwCisjZGVmaW5lIEZTTF9RRE1BX0JDUU1SX0NEX1RITEQoeCkJKCh4KSA8 PCAyMCkKKyNkZWZpbmUgRlNMX1FETUFfQkNRTVJfQ1FfU0laRSh4KQkoKHgpIDw8IDE2KQorCisj ZGVmaW5lIEZTTF9RRE1BX0JDUVNSX1FGCQkweDEwMDAwCisjZGVmaW5lIEZTTF9RRE1BX0JDUVNS X1hPRkYJCTB4MQorCisjZGVmaW5lIEZTTF9RRE1BX0JTUU1SX0VOCQkweDgwMDAwMDAwCisjZGVm aW5lIEZTTF9RRE1BX0JTUU1SX0RJCQkweDQwMDAwMDAwCisjZGVmaW5lIEZTTF9RRE1BX0JTUU1S X0NRX1NJWkUoeCkJKCh4KSA8PCAxNikKKworI2RlZmluZSBGU0xfUURNQV9CU1FTUl9RRQkJMHgy MDAwMAorCisjZGVmaW5lIEZTTF9RRE1BX0RNUl9EUUQJCTB4NDAwMDAwMDAKKyNkZWZpbmUgRlNM X1FETUFfRFNSX0RCCQkJMHg4MDAwMDAwMAorCisvKiBTaXplIHJlbGF0ZWQgZGVmaW5pdGlvbiAq LworI2RlZmluZSBGU0xfUURNQV9CQVNFX0JVRkZFUl9TSVpFCTk2CisjZGVmaW5lIEZTTF9RRE1B X0VYUEVDVF9TR19FTlRSWV9OVU0JMTYKKyNkZWZpbmUgRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19T SVpFX01JTgk2NAorI2RlZmluZSBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUFYCTE2Mzg0 CisjZGVmaW5lIEZTTF9RRE1BX1FVRVVFX05VTV9NQVgJCTgKKworLyogRmllbGQgZGVmaW5pdGlv biBmb3IgQ01EICovCisjZGVmaW5lIEZTTF9RRE1BX0NNRF9SV1RUWVBFCQkweDQKKyNkZWZpbmUg RlNMX1FETUFfQ01EX0xXQyAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgRlNMX1FETUFfQ01E X1JXVFRZUEVfT0ZGU0VUCTI4CisjZGVmaW5lIEZTTF9RRE1BX0NNRF9OU19PRkZTRVQJCTI3Cisj ZGVmaW5lIEZTTF9RRE1BX0NNRF9EUU9TX09GRlNFVAkyNAorI2RlZmluZSBGU0xfUURNQV9DTURf V1RIUk9UTF9PRkZTRVQJMjAKKyNkZWZpbmUgRlNMX1FETUFfQ01EX0RTRU5fT0ZGU0VUCTE5Cisj ZGVmaW5lIEZTTF9RRE1BX0NNRF9MV0NfT0ZGU0VUCQkxNgorCisjZGVmaW5lIEZTTF9RRE1BX0Vf U0dfVEFCTEUJCTEKKyNkZWZpbmUgRlNMX1FETUFfRV9EQVRBX0JVRkZFUgkJMAorI2RlZmluZSBG U0xfUURNQV9GX0xBU1RfRU5UUlkJCTEKKwordTY0IHByZV9hZGRyLCBwcmVfcXVldWU7CisKKy8q IHFETUEgQ29tbWFuZCBEZXNjcmlwdG9yIEZvdG1hdHMgKi8KKworc3RydWN0IGZzbF9xZG1hX2Zv cm1hdCB7CisJX19sZTMyIHN0YXR1czsgLyogc2VyLCBzdGF0dXMgKi8KKwlfX2xlMzIgY2ZnOwkv KiBmb3JtYXQsIG9mZnNldCAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fbGUzMiBhZGRy X2xvOwkvKiBsb3cgMzItYml0cyBvZiA0MC1iaXQgYWRkcmVzcyAqLworCQkJdTggYWRkcl9oaTsJ LyogaGlnaCA4LWJpdHMgb2YgNDAtYml0IGFkZHJlc3MgKi8KKwkJCXU4IF9fcmVzZXJ2ZWQxWzJd OworCQkJdTggY2ZnOGJfdzE7IC8qIGRkLCBxdWV1ZSAqLworCQl9IF9fcGFja2VkOworCQlfX2xl NjQgZGF0YTsKKwl9OworfSBfX3BhY2tlZDsKKworLyogcURNQSBTb3VyY2UgRGVzY3JpcHRvciBG b3JtYXQgKi8KK3N0cnVjdCBmc2xfcWRtYV9zZGYgeworCV9fbGUzMiByZXYzOworCV9fbGUzMiBj Zmc7IC8qIHJldjQsIGJpdFswLTExXSAtIHNzZCwgYml0WzEyLTIzXSBzc3MgKi8KKwlfX2xlMzIg cmV2NTsKKwlfX2xlMzIgY21kOworfSBfX3BhY2tlZDsKKworLyogcURNQSBEZXN0aW5hdGlvbiBE ZXNjcmlwdG9yIEZvcm1hdCAqLworc3RydWN0IGZzbF9xZG1hX2RkZiB7CisJX19sZTMyIHJldjE7 CisJX19sZTMyIGNmZzsgLyogcmV2MiwgYml0WzAtMTFdIC0gZHNkLCBiaXRbMTItMjNdIC0gZHNz ICovCisJX19sZTMyIHJldjM7CisJX19sZTMyIGNtZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBm c2xfcWRtYV9jaGFuIHsKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbgkJdmNoYW47CisJc3RydWN0IHZp cnRfZG1hX2Rlc2MJCXZkZXNjOworCWVudW0gZG1hX3N0YXR1cwkJCXN0YXR1czsKKwl1MzIJCQkJ c2xhdmVfaWQ7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZQkJKnFkbWE7CisJc3RydWN0IGZzbF9x ZG1hX3F1ZXVlCQkqcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZAkJcWNvbXA7Cit9OworCitzdHJ1 Y3QgZnNsX3FkbWFfcXVldWUgeworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKnZpcnRfaGVhZDsK KwlzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0CSp2aXJ0X3RhaWw7CisJc3RydWN0IGxpc3RfaGVhZAlj b21wX3VzZWQ7CisJc3RydWN0IGxpc3RfaGVhZAljb21wX2ZyZWU7CisJc3RydWN0IGRtYV9wb29s CQkqY29tcF9wb29sOworCXN0cnVjdCBkbWFfcG9vbAkJKnNnX3Bvb2w7CisJc3BpbmxvY2tfdAkJ cXVldWVfbG9jazsKKwlkbWFfYWRkcl90CQlidXNfYWRkcjsKKwl1MzIgICAgICAgICAgICAgICAg ICAgICBuX2NxOworCXUzMgkJCWlkOworCXN0cnVjdCBmc2xfcWRtYV9mb3JtYXQJKmNxOworfTsK Kworc3RydWN0IGZzbF9xZG1hX3NnIHsKKwlkbWFfYWRkcl90CQlidXNfYWRkcjsKKwl2b2lkCQkJ KnZpcnRfYWRkcjsKK307CisKK3N0cnVjdCBmc2xfcWRtYV9jb21wIHsKKwlkbWFfYWRkcl90ICAg ICAgICAgICAgICBidXNfYWRkcjsKKwl2b2lkCQkJKnZpcnRfYWRkcjsKKwlzdHJ1Y3QgZnNsX3Fk bWFfY2hhbgkqcWNoYW47CisJc3RydWN0IGZzbF9xZG1hX3NnCSpzZ19ibG9jazsKKwlzdHJ1Y3Qg dmlydF9kbWFfZGVzYyAgICB2ZGVzYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTMyCQkJ c2dfYmxvY2tfc3JjOworCXUzMgkJCXNnX2Jsb2NrX2RzdDsKK307CisKK3N0cnVjdCBmc2xfcWRt YV9lbmdpbmUgeworCXN0cnVjdCBkbWFfZGV2aWNlCWRtYV9kZXY7CisJdm9pZCBfX2lvbWVtCQkq Y3RybF9iYXNlOworCXZvaWQgX19pb21lbSAgICAgICAgICAgICpzdGF0dXNfYmFzZTsKKwl2b2lk IF9faW9tZW0JCSpibG9ja19iYXNlOworCXUzMgkJCW5fY2hhbnM7CisJdTMyCQkJbl9xdWV1ZXM7 CisJc3RydWN0IG11dGV4ICAgICAgICAgICAgZnNsX3FkbWFfbXV0ZXg7CisJaW50CQkJZXJyb3Jf aXJxOworCWludAkJCXF1ZXVlX2lycTsKKwlib29sCQkJZmVhdHVyZTsKKwlzdHJ1Y3QgZnNsX3Fk bWFfcXVldWUJKnF1ZXVlOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZQkqc3RhdHVzOworCXN0cnVj dCBmc2xfcWRtYV9jaGFuCWNoYW5zW107CisKK307CisKK3N0YXRpYyBpbmxpbmUgdTY0CitxZG1h X2NjZGZfYWRkcl9nZXQ2NChjb25zdCBzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmKQorewor CXJldHVybiBsZTY0X3RvX2NwdShjY2RmLT5kYXRhKSAmIChVNjRfTUFYID4+IDI0KTsKK30KKwor c3RhdGljIGlubGluZSB2b2lkCitxZG1hX2Rlc2NfYWRkcl9zZXQ2NChzdHJ1Y3QgZnNsX3FkbWFf Zm9ybWF0ICpjY2RmLCB1NjQgYWRkcikKK3sKKwljY2RmLT5hZGRyX2hpID0gdXBwZXJfMzJfYml0 cyhhZGRyKTsKKwljY2RmLT5hZGRyX2xvID0gY3B1X3RvX2xlMzIobG93ZXJfMzJfYml0cyhhZGRy KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0CitxZG1hX2NjZGZfZ2V0X3F1ZXVlKGNvbnN0IHN0 cnVjdCBmc2xfcWRtYV9mb3JtYXQgKmNjZGYpCit7CisJcmV0dXJuIGNjZGYtPmNmZzhiX3cxICYg VThfTUFYOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRtYV9jY2RmX2dldF9vZmZzZXQoY29u c3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sKKwlyZXR1cm4gKGxlMzJfdG9fY3B1 KGNjZGYtPmNmZykgJiBRRE1BX0NDREZfTUFTSykgPj4gUURNQV9DQ0RGX09GRlNFVDsKK30KKwor c3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0X2Zvcm1hdChzdHJ1Y3QgZnNsX3FkbWFf Zm9ybWF0ICpjY2RmLCBpbnQgb2Zmc2V0KQoreworCWNjZGYtPmNmZyA9IGNwdV90b19sZTMyKFFE TUFfQ0NERl9GT1RNQVQgfCBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcWRtYV9j Y2RmX2dldF9zdGF0dXMoY29uc3Qgc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY2NkZikKK3sKKwly ZXR1cm4gKGxlMzJfdG9fY3B1KGNjZGYtPnN0YXR1cykgJiBRRE1BX0NDREZfTUFTSykgPj4gUURN QV9DQ0RGX1NUQVRVUzsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitxZG1hX2NjZGZfc2V0X3Nl cihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjY2RmLCBpbnQgc3RhdHVzKQoreworCWNjZGYtPnN0 YXR1cyA9IGNwdV90b19sZTMyKFFETUFfQ0NERl9TRVIgfCBzdGF0dXMpOworfQorCitzdGF0aWMg aW5saW5lIHZvaWQgcWRtYV9jc2dmX3NldF9sZW4oc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqY3Nn ZiwgaW50IGxlbikKK3sKKwljc2dmLT5jZmcgPSBjcHVfdG9fbGUzMihsZW4gJiBRRE1BX1NHX0xF Tl9NQVNLKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRfZihzdHJ1Y3Qg ZnNsX3FkbWFfZm9ybWF0ICpjc2dmLCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNwdV90b19s ZTMyKFFETUFfU0dfRklOIHwgKGxlbiAmIFFETUFfU0dfTEVOX01BU0spKTsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIHFkbWFfY3NnZl9zZXRfZShzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICpjc2dm LCBpbnQgbGVuKQoreworCWNzZ2YtPmNmZyA9IGNwdV90b19sZTMyKFFETUFfU0dfRVhUIHwgKGxl biAmIFFETUFfU0dfTEVOX01BU0spKTsKK30KKworc3RhdGljIHUzMiBxZG1hX3JlYWRsKHN0cnVj dCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEsIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwlyZXR1cm4g RlNMX0RNQV9JTihxZG1hLCBhZGRyLCAzMik7Cit9CisKK3N0YXRpYyB2b2lkIHFkbWFfd3JpdGVs KHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKnFkbWEsIHUzMiB2YWwsCisJCQkJCQl2b2lkIF9faW9t ZW0gKmFkZHIpCit7CisJRlNMX0RNQV9PVVQocWRtYSwgYWRkciwgdmFsLCAzMik7Cit9CisKK3N0 YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfY2hhbiAqdG9fZnNsX3FkbWFfY2hhbihzdHJ1Y3QgZG1hX2No YW4gKmNoYW4pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3QgZnNsX3FkbWFf Y2hhbiwgdmNoYW4uY2hhbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfY29tcCAqdG9f ZnNsX3FkbWFfY29tcChzdHJ1Y3QgdmlydF9kbWFfZGVzYyAqdmQpCit7CisJcmV0dXJuIGNvbnRh aW5lcl9vZih2ZCwgc3RydWN0IGZzbF9xZG1hX2NvbXAsIHZkZXNjKTsKK30KKworc3RhdGljIHZv aWQgZnNsX3FkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7 CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFu KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUxJU1RfSEVBRChoZWFkKTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZmc2xfY2hhbi0+dmNoYW4ubG9jaywgZmxhZ3MpOworCXZjaGFuX2dldF9hbGxf ZGVzY3JpcHRvcnMoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmZzbF9jaGFuLT52Y2hhbi5sb2NrLCBmbGFncyk7CisKKwl2Y2hhbl9kbWFfZGVzY19m cmVlX2xpc3QoJmZzbF9jaGFuLT52Y2hhbiwgJmhlYWQpOworfQorCitzdGF0aWMgdm9pZCBmc2xf cWRtYV9jb21wX2ZpbGxfbWVtY3B5KHN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcCwKKwkJ CQkJZG1hX2FkZHJfdCBkc3QsIGRtYV9hZGRyX3Qgc3JjLCB1MzIgbGVuKQoreworCXN0cnVjdCBm c2xfcWRtYV9mb3JtYXQgKmNjZGYsICpjc2dmX2Rlc2MsICpjc2dmX3NyYywgKmNzZ2ZfZGVzdDsK KwlzdHJ1Y3QgZnNsX3FkbWFfc2RmICpzZGY7CisJc3RydWN0IGZzbF9xZG1hX2RkZiAqZGRmOwor CisJY2NkZiA9IChzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0ICopZnNsX2NvbXAtPnZpcnRfYWRkcjsK Kwljc2dmX2Rlc2MgPSAoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqKWZzbF9jb21wLT52aXJ0X2Fk ZHIgKyAxOworCWNzZ2Zfc3JjID0gKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQgKilmc2xfY29tcC0+ dmlydF9hZGRyICsgMjsKKwljc2dmX2Rlc3QgPSAoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqKWZz bF9jb21wLT52aXJ0X2FkZHIgKyAzOworCXNkZiA9IChzdHJ1Y3QgZnNsX3FkbWFfc2RmICopZnNs X2NvbXAtPnZpcnRfYWRkciArIDQ7CisJZGRmID0gKHN0cnVjdCBmc2xfcWRtYV9kZGYgKilmc2xf Y29tcC0+dmlydF9hZGRyICsgNTsKKworCW1lbXNldChmc2xfY29tcC0+dmlydF9hZGRyLCAwLCBG U0xfUURNQV9CQVNFX0JVRkZFUl9TSVpFKTsKKwkvKiBIZWFkIENvbW1hbmQgRGVzY3JpcHRvcihG cmFtZSBEZXNjcmlwdG9yKSAqLworCXFkbWFfZGVzY19hZGRyX3NldDY0KGNjZGYsIGZzbF9jb21w LT5idXNfYWRkciArIDE2KTsKKwlxZG1hX2NjZGZfc2V0X2Zvcm1hdChjY2RmLCBxZG1hX2NjZGZf Z2V0X29mZnNldChjY2RmKSk7CisJcWRtYV9jY2RmX3NldF9zZXIoY2NkZiwgcWRtYV9jY2RmX2dl dF9zdGF0dXMoY2NkZikpOworCisJLyogU3RhdHVzIG5vdGlmaWNhdGlvbiBpcyBlbnF1ZXVlZCB0 byBzdGF0dXMgcXVldWUuICovCisJLyogQ29tcG91bmQgQ29tbWFuZCBEZXNjcmlwdG9yKEZyYW1l IExpc3QgVGFibGUpICovCisJcWRtYV9kZXNjX2FkZHJfc2V0NjQoY3NnZl9kZXNjLCBmc2xfY29t cC0+YnVzX2FkZHIgKyA2NCk7CisJLyogSXQgbXVzdCBiZSAzMiBhcyBDb21wb3VuZCBTL0cgRGVz Y3JpcHRvciAqLworCXFkbWFfY3NnZl9zZXRfbGVuKGNzZ2ZfZGVzYywgMzIpOworCXFkbWFfZGVz Y19hZGRyX3NldDY0KGNzZ2Zfc3JjLCBzcmMpOworCXFkbWFfY3NnZl9zZXRfbGVuKGNzZ2Zfc3Jj LCBsZW4pOworCXFkbWFfZGVzY19hZGRyX3NldDY0KGNzZ2ZfZGVzdCwgZHN0KTsKKwlxZG1hX2Nz Z2Zfc2V0X2xlbihjc2dmX2Rlc3QsIGxlbik7CisJLyogVGhpcyBlbnRyeSBpcyB0aGUgbGFzdCBl bnRyeS4gKi8KKwlxZG1hX2NzZ2Zfc2V0X2YoY3NnZl9kZXN0LCBsZW4pOworCS8qIERlc2NyaXB0 b3IgQnVmZmVyICovCisJc2RmLT5jbWQgPSBjcHVfdG9fbGUzMigKKwkJCUZTTF9RRE1BX0NNRF9S V1RUWVBFIDw8IEZTTF9RRE1BX0NNRF9SV1RUWVBFX09GRlNFVCk7CisJZGRmLT5jbWQgPSBjcHVf dG9fbGUzMigKKwkJCUZTTF9RRE1BX0NNRF9SV1RUWVBFIDw8IEZTTF9RRE1BX0NNRF9SV1RUWVBF X09GRlNFVCk7CisJZGRmLT5jbWQgfD0gY3B1X3RvX2xlMzIoCisJCQlGU0xfUURNQV9DTURfTFdD IDw8IEZTTF9RRE1BX0NNRF9MV0NfT0ZGU0VUKTsKK30KKworLyoKKyAqIFByZS1yZXF1ZXN0IGZ1 bGwgY29tbWFuZCBkZXNjcmlwdG9yIGZvciBlbnF1ZXVlLgorICovCitzdGF0aWMgaW50IGZzbF9x ZG1hX3ByZV9yZXF1ZXN0X2VucXVldWVfZGVzYyhzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKnF1ZXVl KQoreworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXA7CisJaW50IGk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgcXVldWUtPm5fY3E7IGkrKykgeworCQljb21wX3RlbXAgPSBremFsbG9jKHNp emVvZigqY29tcF90ZW1wKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghY29tcF90ZW1wKQorCQkJcmV0 dXJuIC1FTk9NRU07CisJCWNvbXBfdGVtcC0+dmlydF9hZGRyID0gZG1hX3Bvb2xfYWxsb2MocXVl dWUtPmNvbXBfcG9vbCwKKwkJCQkJCSAgICAgIEdGUF9LRVJORUwsCisJCQkJCQkgICAgICAmY29t cF90ZW1wLT5idXNfYWRkcik7CisJCWlmICghY29tcF90ZW1wLT52aXJ0X2FkZHIpCisJCQlyZXR1 cm4gLUVOT01FTTsKKwkJbGlzdF9hZGRfdGFpbCgmY29tcF90ZW1wLT5saXN0LCAmcXVldWUtPmNv bXBfZnJlZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXF1ZXN0IGEgY29tbWFu ZCBkZXNjcmlwdG9yIGZvciBlbnF1ZXVlLgorICovCitzdGF0aWMgc3RydWN0IGZzbF9xZG1hX2Nv bXAgKmZzbF9xZG1hX3JlcXVlc3RfZW5xdWV1ZV9kZXNjKAorCQkJCQlzdHJ1Y3QgZnNsX3FkbWFf Y2hhbiAqZnNsX2NoYW4sCisJCQkJCXVuc2lnbmVkIGludCBkc3RfbmVudHMsCisJCQkJCXVuc2ln bmVkIGludCBzcmNfbmVudHMpCit7CisJc3RydWN0IGZzbF9xZG1hX2NvbXAgKmNvbXBfdGVtcDsK KwlzdHJ1Y3QgZnNsX3FkbWFfc2cgKnNnX2Jsb2NrOworCXN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAq cXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25l ZCBpbnQgZHN0X3NnX2VudHJ5X2Jsb2NrLCBzcmNfc2dfZW50cnlfYmxvY2ssIHNnX2VudHJ5X3Rv dGFsLCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7 CisJaWYgKGxpc3RfZW1wdHkoJnF1ZXVlLT5jb21wX2ZyZWUpKSB7CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnF1ZXVlLT5xdWV1ZV9sb2NrLCBmbGFncyk7CisJCWNvbXBfdGVtcCA9IGt6YWxs b2Moc2l6ZW9mKCpjb21wX3RlbXApLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFjb21wX3RlbXApCisJ CQlyZXR1cm4gTlVMTDsKKwkJY29tcF90ZW1wLT52aXJ0X2FkZHIgPSBkbWFfcG9vbF9hbGxvYyhx dWV1ZS0+Y29tcF9wb29sLAorCQkJCQkJICAgICAgR0ZQX0tFUk5FTCwKKwkJCQkJCSAgICAgICZj b21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJaWYgKCFjb21wX3RlbXAtPnZpcnRfYWRkcikgeworCQkJ a2ZyZWUoY29tcF90ZW1wKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwl9IGVsc2UgeworCQlj b21wX3RlbXAgPSBsaXN0X2ZpcnN0X2VudHJ5KCZxdWV1ZS0+Y29tcF9mcmVlLAorCQkJCQkgICAg IHN0cnVjdCBmc2xfcWRtYV9jb21wLAorCQkJCQkgICAgIGxpc3QpOworCQlsaXN0X2RlbCgmY29t cF90ZW1wLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcXVldWUtPnF1ZXVlX2xv Y2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoZHN0X25lbnRzICE9IDApCisJCWRzdF9zZ19lbnRyeV9i bG9jayA9IGRzdF9uZW50cyAvCisJCQkJCShGU0xfUURNQV9FWFBFQ1RfU0dfRU5UUllfTlVNIC0g MSkgKyAxOworCWVsc2UKKwkJZHN0X3NnX2VudHJ5X2Jsb2NrID0gMDsKKworCWlmIChzcmNfbmVu dHMgIT0gMCkKKwkJc3JjX3NnX2VudHJ5X2Jsb2NrID0gc3JjX25lbnRzIC8KKwkJCQkJKEZTTF9R RE1BX0VYUEVDVF9TR19FTlRSWV9OVU0gLSAxKSArIDE7CisJZWxzZQorCQlzcmNfc2dfZW50cnlf YmxvY2sgPSAwOworCisJc2dfZW50cnlfdG90YWwgPSBkc3Rfc2dfZW50cnlfYmxvY2sgKyBzcmNf c2dfZW50cnlfYmxvY2s7CisJaWYgKHNnX2VudHJ5X3RvdGFsKSB7CisJCXNnX2Jsb2NrID0ga3ph bGxvYyhzaXplb2YoKnNnX2Jsb2NrKSAqCisJCQkJCSAgICAgIHNnX2VudHJ5X3RvdGFsLAorCQkJ CQkgICAgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCFzZ19ibG9jaykgeworCQkJZG1hX3Bvb2xfZnJl ZShxdWV1ZS0+Y29tcF9wb29sLAorCQkJCQljb21wX3RlbXAtPnZpcnRfYWRkciwKKwkJCQkJY29t cF90ZW1wLT5idXNfYWRkcik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQljb21wX3RlbXAtPnNn X2Jsb2NrID0gc2dfYmxvY2s7CisJCWZvciAoaSA9IDA7IGkgPCBzZ19lbnRyeV90b3RhbDsgaSsr KSB7CisJCQlzZ19ibG9jay0+dmlydF9hZGRyID0gZG1hX3Bvb2xfYWxsb2MocXVldWUtPnNnX3Bv b2wsCisJCQkJCQkJR0ZQX0tFUk5FTCwKKwkJCQkJCQkmc2dfYmxvY2stPmJ1c19hZGRyKTsKKwkJ CW1lbXNldChzZ19ibG9jay0+dmlydF9hZGRyLCAwLAorCQkJCQlGU0xfUURNQV9FWFBFQ1RfU0df RU5UUllfTlVNICogMTYpOworCQkJc2dfYmxvY2srKzsKKwkJfQorCX0KKworCWNvbXBfdGVtcC0+ c2dfYmxvY2tfc3JjID0gc3JjX3NnX2VudHJ5X2Jsb2NrOworCWNvbXBfdGVtcC0+c2dfYmxvY2tf ZHN0ID0gZHN0X3NnX2VudHJ5X2Jsb2NrOworCWNvbXBfdGVtcC0+cWNoYW4gPSBmc2xfY2hhbjsK KworCXJldHVybiBjb21wX3RlbXA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZnNsX3FkbWFfcXVldWUg KmZzbF9xZG1hX2FsbG9jX3F1ZXVlX3Jlc291cmNlcygKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldiwKKwkJCQkJdW5zaWduZWQgaW50IHF1ZXVlX251bSkKK3sKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKnF1ZXVlX2hlYWQsICpxdWV1ZV90ZW1wOworCWludCByZXQsIGxlbiwgaTsK Kwl1bnNpZ25lZCBpbnQgcXVldWVfc2l6ZVtGU0xfUURNQV9RVUVVRV9NQVhdOworCisJaWYgKHF1 ZXVlX251bSA+IEZTTF9RRE1BX1FVRVVFX01BWCkKKwkJcXVldWVfbnVtID0gRlNMX1FETUFfUVVF VUVfTUFYOworCWxlbiA9IHNpemVvZigqcXVldWVfaGVhZCkgKiBxdWV1ZV9udW07CisJcXVldWVf aGVhZCA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBsZW4sIEdGUF9LRVJORUwpOworCWlmICgh cXVldWVfaGVhZCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQgPSBkZXZpY2VfcHJvcGVydHlfcmVh ZF91MzJfYXJyYXkoJnBkZXYtPmRldiwgInF1ZXVlLXNpemVzIiwKKwkJCQkJcXVldWVfc2l6ZSwg cXVldWVfbnVtKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdl dCBxdWV1ZS1zaXplcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBp IDwgcXVldWVfbnVtOyBpKyspIHsKKwkJaWYgKHF1ZXVlX3NpemVbaV0gPiBGU0xfUURNQV9DSVJD VUxBUl9ERVNDX1NJWkVfTUFYCisJCQl8fCBxdWV1ZV9zaXplW2ldIDwgRlNMX1FETUFfQ0lSQ1VM QVJfREVTQ19TSVpFX01JTikgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiR2V0IHdyb25nIHF1 ZXVlLXNpemVzLlxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlxdWV1ZV90ZW1wID0gcXVl dWVfaGVhZCArIGk7CisJCXF1ZXVlX3RlbXAtPmNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2 LT5kZXYsCisJCQkJCQlzaXplb2Yoc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCkgKgorCQkJCQkJcXVl dWVfc2l6ZVtpXSwKKwkJCQkJCSZxdWV1ZV90ZW1wLT5idXNfYWRkciwKKwkJCQkJCUdGUF9LRVJO RUwpOworCQlpZiAoIXF1ZXVlX3RlbXAtPmNxKQorCQkJcmV0dXJuIE5VTEw7CisJCXF1ZXVlX3Rl bXAtPm5fY3EgPSBxdWV1ZV9zaXplW2ldOworCQlxdWV1ZV90ZW1wLT5pZCA9IGk7CisJCXF1ZXVl X3RlbXAtPnZpcnRfaGVhZCA9IHF1ZXVlX3RlbXAtPmNxOworCQlxdWV1ZV90ZW1wLT52aXJ0X3Rh aWwgPSBxdWV1ZV90ZW1wLT5jcTsKKwkJLyoKKwkJICogVGhlIGRtYSBwb29sIGZvciBxdWV1ZSBj b21tYW5kIGJ1ZmZlcgorCQkgKi8KKwkJcXVldWVfdGVtcC0+Y29tcF9wb29sID0gZG1hX3Bvb2xf Y3JlYXRlKCJjb21wX3Bvb2wiLAorCQkJCQkJJnBkZXYtPmRldiwKKwkJCQkJCUZTTF9RRE1BX0JB U0VfQlVGRkVSX1NJWkUsCisJCQkJCQkxNiwgMCk7CisJCWlmICghcXVldWVfdGVtcC0+Y29tcF9w b29sKQorCQkJZ290byBlcnJfZnJlZV9jb21wOworCisJCS8qCisJCSAqIFRoZSBkbWEgcG9vbCBm b3IgcXVldWUgY29tbWFuZCBidWZmZXIKKwkJICovCisJCXF1ZXVlX3RlbXAtPnNnX3Bvb2wgPSBk bWFfcG9vbF9jcmVhdGUoInNnX3Bvb2wiLAorCQkJCQkmcGRldi0+ZGV2LAorCQkJCQlGU0xfUURN QV9FWFBFQ1RfU0dfRU5UUllfTlVNICogMTYsCisJCQkJCTY0LCAwKTsKKwkJaWYgKCFxdWV1ZV90 ZW1wLT5zZ19wb29sKQorCQkJZ290byBlcnJfZnJlZV9jb21wOworCisJCS8qCisJCSAqIExpc3Qg Zm9yIHF1ZXVlIGNvbW1hbmQgYnVmZmVyCisJCSAqLworCQlJTklUX0xJU1RfSEVBRCgmcXVldWVf dGVtcC0+Y29tcF91c2VkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnF1ZXVlX3RlbXAtPmNvbXBfZnJl ZSk7CisJCXNwaW5fbG9ja19pbml0KCZxdWV1ZV90ZW1wLT5xdWV1ZV9sb2NrKTsKKwl9CisKKwly ZXR1cm4gcXVldWVfaGVhZDsKKworZXJyX2ZyZWVfY29tcDoKKwlkbWFfZnJlZV9jb2hlcmVudCgm cGRldi0+ZGV2LAorCQkJc2l6ZW9mKHN0cnVjdCBmc2xfcWRtYV9mb3JtYXQpICoKKwkJCXF1ZXVl X3NpemVbaV0sCisJCQlxdWV1ZV90ZW1wLT5jcSwKKwkJCXF1ZXVlX3RlbXAtPmJ1c19hZGRyKTsK KwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBmc2xfcWRtYV9xdWV1ZSAqZnNsX3Fk bWFfcHJlcF9zdGF0dXNfcXVldWUoCisJCQkJCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2 KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKwlzdHJ1 Y3QgZnNsX3FkbWFfcXVldWUgKnN0YXR1c19oZWFkOworCXVuc2lnbmVkIGludCBzdGF0dXNfc2l6 ZTsKKwlpbnQgcmV0OworCisJcmV0ID0gb2ZfcHJvcGVydHlfcmVhZF91MzIobnAsICJzdGF0dXMt c2l6ZXMiLCAmc3RhdHVzX3NpemUpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2 LCAiQ2FuJ3QgZ2V0IHN0YXR1cy1zaXplcy5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYg KHN0YXR1c19zaXplID4gRlNMX1FETUFfQ0lSQ1VMQVJfREVTQ19TSVpFX01BWAorCQkJfHwgc3Rh dHVzX3NpemUgPCBGU0xfUURNQV9DSVJDVUxBUl9ERVNDX1NJWkVfTUlOKSB7CisJCWRldl9lcnIo JnBkZXYtPmRldiwgIkdldCB3cm9uZyBzdGF0dXNfc2l6ZS5cbiIpOworCQlyZXR1cm4gTlVMTDsK Kwl9CisJc3RhdHVzX2hlYWQgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpzdGF0 dXNfaGVhZCksCisJCQkJCQkJCUdGUF9LRVJORUwpOworCWlmICghc3RhdHVzX2hlYWQpCisJCXJl dHVybiBOVUxMOworCisJLyoKKwkgKiBCdWZmZXIgZm9yIHF1ZXVlIGNvbW1hbmQKKwkgKi8KKwlz dGF0dXNfaGVhZC0+Y3EgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkJCXNp emVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSAqCisJCQkJCQlzdGF0dXNfc2l6ZSwKKwkJCQkJ CSZzdGF0dXNfaGVhZC0+YnVzX2FkZHIsCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXR1 c19oZWFkLT5jcSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGF0dXNfaGVhZC0+bl9jcSA9IHN0YXR1 c19zaXplOworCXN0YXR1c19oZWFkLT52aXJ0X2hlYWQgPSBzdGF0dXNfaGVhZC0+Y3E7CisJc3Rh dHVzX2hlYWQtPnZpcnRfdGFpbCA9IHN0YXR1c19oZWFkLT5jcTsKKwlzdGF0dXNfaGVhZC0+Y29t cF9wb29sID0gTlVMTDsKKworCXJldHVybiBzdGF0dXNfaGVhZDsKK30KKworc3RhdGljIGludCBm c2xfcWRtYV9oYWx0KHN0cnVjdCBmc2xfcWRtYV9lbmdpbmUgKmZzbF9xZG1hKQoreworCXZvaWQg X19pb21lbSAqY3RybCA9IGZzbF9xZG1hLT5jdHJsX2Jhc2U7CisJdm9pZCBfX2lvbWVtICpibG9j ayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlOworCWludCBpLCBjb3VudCA9IDU7CisJdTMyIHJlZzsK KworCS8qIERpc2FibGUgdGhlIGNvbW1hbmQgcXVldWUgYW5kIHdhaXQgZm9yIGlkbGUgc3RhdGUu ICovCisJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCArIEZTTF9RRE1BX0RNUik7CisJ cmVnIHw9IEZTTF9RRE1BX0RNUl9EUUQ7CisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIHJlZywgY3Ry bCArIEZTTF9RRE1BX0RNUik7CisJZm9yIChpID0gMDsgaSA8IEZTTF9RRE1BX1FVRVVFX05VTV9N QVg7IGkrKykKKwkJcWRtYV93cml0ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQkNR TVIoaSkpOworCisJd2hpbGUgKDEpIHsKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3Ry bCArIEZTTF9RRE1BX0RTUik7CisJCWlmICghKHJlZyAmIEZTTF9RRE1BX0RTUl9EQikpCisJCQli cmVhazsKKwkJaWYgKGNvdW50LS0gPCAwKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJdWRlbGF5KDEw MCk7CisJfQorCisJLyogRGlzYWJsZSBzdGF0dXMgcXVldWUuICovCisJcWRtYV93cml0ZWwoZnNs X3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQlNRTVIpOworCisJLyoKKwkgKiBDbGVhciB0aGUg Y29tbWFuZCBxdWV1ZSBpbnRlcnJ1cHQgZGV0ZWN0IHJlZ2lzdGVyIGZvciBhbGwgcXVldWVzLgor CSAqLworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCAweGZmZmZmZmZmLCBibG9jayArIEZTTF9RRE1B X0JDUUlEUigwKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmc2xfcWRtYV9xdWV1 ZV90cmFuc2Zlcl9jb21wbGV0ZShzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRtYSkKK3sK KwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9xZG1hLT5xdWV1ZTsKKwlz dHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9zdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzOworCXN0 cnVjdCBmc2xfcWRtYV9xdWV1ZSAqdGVtcF9xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfY29tcCAq ZnNsX2NvbXA7CisJc3RydWN0IGZzbF9xZG1hX2Zvcm1hdCAqc3RhdHVzX2FkZHI7CisJc3RydWN0 IGZzbF9xZG1hX2Zvcm1hdCAqY3NnZl9zcmM7CisJdm9pZCBfX2lvbWVtICpibG9jayA9IGZzbF9x ZG1hLT5ibG9ja19iYXNlOworCXUzMiByZWcsIGk7CisJYm9vbCBkdXBsaWNhdGUsIGR1cGxpY2F0 ZV9oYW5kbGU7CisKKwl3aGlsZSAoMSkgeworCQlkdXBsaWNhdGUgPSAwOworCQlkdXBsaWNhdGVf aGFuZGxlID0gMDsKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBGU0xfUURN QV9CU1FTUik7CisJCWlmIChyZWcgJiBGU0xfUURNQV9CU1FTUl9RRSkKKwkJCXJldHVybiAwOwor CQlzdGF0dXNfYWRkciA9IGZzbF9zdGF0dXMtPnZpcnRfaGVhZDsKKwkJaWYgKHFkbWFfY2NkZl9n ZXRfcXVldWUoc3RhdHVzX2FkZHIpID09IHByZV9xdWV1ZSAmJgorCQkJcWRtYV9jY2RmX2FkZHJf Z2V0NjQoc3RhdHVzX2FkZHIpID09IHByZV9hZGRyKQorCQkJZHVwbGljYXRlID0gMTsKKwkJaSA9 IHFkbWFfY2NkZl9nZXRfcXVldWUoc3RhdHVzX2FkZHIpOworCQlwcmVfcXVldWUgPSBxZG1hX2Nj ZGZfZ2V0X3F1ZXVlKHN0YXR1c19hZGRyKTsKKwkJcHJlX2FkZHIgPSBxZG1hX2NjZGZfYWRkcl9n ZXQ2NChzdGF0dXNfYWRkcik7CisJCXRlbXBfcXVldWUgPSBmc2xfcXVldWUgKyBpOworCQlzcGlu X2xvY2soJnRlbXBfcXVldWUtPnF1ZXVlX2xvY2spOworCQlpZiAobGlzdF9lbXB0eSgmdGVtcF9x dWV1ZS0+Y29tcF91c2VkKSkgeworCQkJaWYgKGR1cGxpY2F0ZSkKKwkJCQlkdXBsaWNhdGVfaGFu ZGxlID0gMTsKKwkJCWVsc2UgeworCQkJCXNwaW5fdW5sb2NrKCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9s b2NrKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlmc2xfY29tcCA9IGxp c3RfZmlyc3RfZW50cnkoJnRlbXBfcXVldWUtPmNvbXBfdXNlZCwKKwkJCQkJCQlzdHJ1Y3QgZnNs X3FkbWFfY29tcCwKKwkJCQkJCQlsaXN0KTsKKwkJCWNzZ2Zfc3JjID0gKHN0cnVjdCBmc2xfcWRt YV9mb3JtYXQgKilmc2xfY29tcC0+dmlydF9hZGRyCisJCQkJCQkJICAgKyAyOworCQkJaWYgKGZz bF9jb21wLT5idXNfYWRkciArIDE2ICE9IHByZV9hZGRyKSB7CisJCQkJaWYgKGR1cGxpY2F0ZSkK KwkJCQkJZHVwbGljYXRlX2hhbmRsZSA9IDE7CisJCQkJZWxzZSB7CisJCQkJCXNwaW5fdW5sb2Nr KCZ0ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCX0K KwkJfQorCisJCQlpZiAoZHVwbGljYXRlX2hhbmRsZSkgeworCQkJCXJlZyA9IHFkbWFfcmVhZGwo ZnNsX3FkbWEsIGJsb2NrICsKKwkJCQkJCUZTTF9RRE1BX0JTUU1SKTsKKwkJCXJlZyB8PSBGU0xf UURNQV9CU1FNUl9ESTsKKwkJCXFkbWFfZGVzY19hZGRyX3NldDY0KHN0YXR1c19hZGRyLCAweDAp OworCQkJZnNsX3N0YXR1cy0+dmlydF9oZWFkKys7CisJCQlpZiAoZnNsX3N0YXR1cy0+dmlydF9o ZWFkID09IGZzbF9zdGF0dXMtPmNxCisJCQkJCQkgICArIGZzbF9zdGF0dXMtPm5fY3EpCisJCQkJ ZnNsX3N0YXR1cy0+dmlydF9oZWFkID0gZnNsX3N0YXR1cy0+Y3E7CisJCQlxZG1hX3dyaXRlbChm c2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJCXNwaW5fdW5sb2NrKCZ0 ZW1wX3F1ZXVlLT5xdWV1ZV9sb2NrKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxpc3RfZGVsKCZm c2xfY29tcC0+bGlzdCk7CisKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgYmxvY2sgKyBG U0xfUURNQV9CU1FNUik7CisJCXJlZyB8PSBGU0xfUURNQV9CU1FNUl9ESTsKKwkJcWRtYV9kZXNj X2FkZHJfc2V0NjQoc3RhdHVzX2FkZHIsIDB4MCk7CisJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCsr OworCQlpZiAoZnNsX3N0YXR1cy0+dmlydF9oZWFkID09IGZzbF9zdGF0dXMtPmNxICsgZnNsX3N0 YXR1cy0+bl9jcSkKKwkJCWZzbF9zdGF0dXMtPnZpcnRfaGVhZCA9IGZzbF9zdGF0dXMtPmNxOwor CQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgcmVnLCBibG9jayArIEZTTF9RRE1BX0JTUU1SKTsKKwkJ c3Bpbl91bmxvY2soJnRlbXBfcXVldWUtPnF1ZXVlX2xvY2spOworCisJCXNwaW5fbG9jaygmZnNs X2NvbXAtPnFjaGFuLT52Y2hhbi5sb2NrKTsKKwkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZmc2xf Y29tcC0+dmRlc2MpOworCQlmc2xfY29tcC0+cWNoYW4tPnN0YXR1cyA9IERNQV9DT01QTEVURTsK KwkJc3Bpbl91bmxvY2soJmZzbF9jb21wLT5xY2hhbi0+dmNoYW4ubG9jayk7CisJfQorCXJldHVy biAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX3FkbWFfZXJyb3JfaGFuZGxlcihpbnQg aXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEg PSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IGludHI7CisJdm9pZCBfX2lvbWVtICpzdGF0dXMgPSBm c2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisKKwlpbnRyID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgc3Rh dHVzICsgRlNMX1FETUFfREVEUik7CisKKwlpZiAoaW50cikKKwkJZGV2X2Vycihmc2xfcWRtYS0+ ZG1hX2Rldi5kZXYsICJETUEgdHJhbnNhY3Rpb24gZXJyb3IhXG4iKTsKKworCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCAweGZmZmZmZmZmLCBzdGF0dXMgKyBGU0xfUURNQV9ERURSKTsKKwlyZXR1cm4g SVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBmc2xfcWRtYV9xdWV1ZV9oYW5k bGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpm c2xfcWRtYSA9IGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50ciwgcmVnOworCXZvaWQgX19pb21l bSAqYmxvY2sgPSBmc2xfcWRtYS0+YmxvY2tfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmN0cmwgPSBm c2xfcWRtYS0+Y3RybF9iYXNlOworCisJaW50ciA9IHFkbWFfcmVhZGwoZnNsX3FkbWEsIGJsb2Nr ICsgRlNMX1FETUFfQkNRSURSKDApKTsKKworCWlmICgoaW50ciAmIEZTTF9RRE1BX0NRSURSX1NR VCkgIT0gMCkKKwkJaW50ciA9IGZzbF9xZG1hX3F1ZXVlX3RyYW5zZmVyX2NvbXBsZXRlKGZzbF9x ZG1hKTsKKworCWlmIChpbnRyICE9IDApIHsKKwkJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwg Y3RybCArIEZTTF9RRE1BX0RNUik7CisJCXJlZyB8PSBGU0xfUURNQV9ETVJfRFFEOworCQlxZG1h X3dyaXRlbChmc2xfcWRtYSwgcmVnLCBjdHJsICsgRlNMX1FETUFfRE1SKTsKKwkJcWRtYV93cml0 ZWwoZnNsX3FkbWEsIDAsIGJsb2NrICsgRlNMX1FETUFfQkNRSUVSKDApKTsKKwkJZGV2X2Vycihm c2xfcWRtYS0+ZG1hX2Rldi5kZXYsICJRRE1BOiBzdGF0dXMgZXJyIVxuIik7CisJfQorCisJcWRt YV93cml0ZWwoZnNsX3FkbWEsIDB4ZmZmZmZmZmYsIGJsb2NrICsgRlNMX1FETUFfQkNRSURSKDAp KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAorZnNsX3FkbWFfaXJx X2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJICBzdHJ1Y3QgZnNsX3FkbWFf ZW5naW5lICpmc2xfcWRtYSkKK3sKKwlpbnQgcmV0OworCisJZnNsX3FkbWEtPmVycm9yX2lycSA9 IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsCisJCQkJCQkJInFkbWEtZXJyb3IiKTsKKwlp ZiAoZnNsX3FkbWEtPmVycm9yX2lycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fu J3QgZ2V0IHFkbWEgY29udHJvbGxlciBpcnEuXG4iKTsKKwkJcmV0dXJuIGZzbF9xZG1hLT5lcnJv cl9pcnE7CisJfQorCisJZnNsX3FkbWEtPnF1ZXVlX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnlu YW1lKHBkZXYsICJxZG1hLXF1ZXVlIik7CisJaWYgKGZzbF9xZG1hLT5xdWV1ZV9pcnEgPCAwKSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBxZG1hIHF1ZXVlIGlycS5cbiIpOwor CQlyZXR1cm4gZnNsX3FkbWEtPnF1ZXVlX2lycTsKKwl9CisKKwlyZXQgPSBkZXZtX3JlcXVlc3Rf aXJxKCZwZGV2LT5kZXYsIGZzbF9xZG1hLT5lcnJvcl9pcnEsCisJCQlmc2xfcWRtYV9lcnJvcl9o YW5kbGVyLCAwLCAicURNQSBlcnJvciIsIGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7CisJCWRldl9l cnIoJnBkZXYtPmRldiwgIkNhbid0IHJlZ2lzdGVyIHFETUEgY29udHJvbGxlciBJUlEuXG4iKTsK KwkJcmV0dXJuICByZXQ7CisJfQorCXJldCA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwg ZnNsX3FkbWEtPnF1ZXVlX2lycSwKKwkJCWZzbF9xZG1hX3F1ZXVlX2hhbmRsZXIsIDAsICJxRE1B IHF1ZXVlIiwgZnNsX3FkbWEpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAi Q2FuJ3QgcmVnaXN0ZXIgcURNQSBxdWV1ZSBJUlEuXG4iKTsKKwkJcmV0dXJuICByZXQ7CisJfQor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9xZG1hX2lycV9leGl0KAorCQlzdHJ1 Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBzdHJ1Y3QgZnNsX3FkbWFfZW5naW5lICpmc2xfcWRt YSkKK3sKKwlpZiAoZnNsX3FkbWEtPnF1ZXVlX2lycSA9PSBmc2xfcWRtYS0+ZXJyb3JfaXJxKSB7 CisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgZnNsX3FkbWEtPnF1ZXVlX2lycSwgZnNsX3Fk bWEpOworCX0gZWxzZSB7CisJCWRldm1fZnJlZV9pcnEoJnBkZXYtPmRldiwgZnNsX3FkbWEtPnF1 ZXVlX2lycSwgZnNsX3FkbWEpOworCQlkZXZtX2ZyZWVfaXJxKCZwZGV2LT5kZXYsIGZzbF9xZG1h LT5lcnJvcl9pcnEsIGZzbF9xZG1hKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcmVn X2luaXQoc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWEpCit7CisJc3RydWN0IGZzbF9x ZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfcWRtYS0+cXVldWU7CisJc3RydWN0IGZzbF9xZG1h X3F1ZXVlICp0ZW1wOworCXZvaWQgX19pb21lbSAqY3RybCA9IGZzbF9xZG1hLT5jdHJsX2Jhc2U7 CisJdm9pZCBfX2lvbWVtICpzdGF0dXMgPSBmc2xfcWRtYS0+c3RhdHVzX2Jhc2U7CisJdm9pZCBf X2lvbWVtICpibG9jayA9IGZzbF9xZG1hLT5ibG9ja19iYXNlOworCWludCBpLCByZXQ7CisJdTMy IHJlZzsKKworCS8qIFRyeSB0byBoYWx0IHRoZSBxRE1BIGVuZ2luZSBmaXJzdC4gKi8KKwlyZXQg PSBmc2xfcWRtYV9oYWx0KGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZnNsX3Fk bWEtPmRtYV9kZXYuZGV2LCAiRE1BIGhhbHQgZmFpbGVkISIpOworCQlyZXR1cm4gcmV0OworCX0K KworCS8qCisJICogQ2xlYXIgdGhlIGNvbW1hbmQgcXVldWUgaW50ZXJydXB0IGRldGVjdCByZWdp c3RlciBmb3IgYWxsIHF1ZXVlcy4KKwkgKi8KKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgMHhmZmZm ZmZmZiwgYmxvY2sgKyBGU0xfUURNQV9CQ1FJRFIoMCkpOworCisJZm9yIChpID0gMDsgaSA8IGZz bF9xZG1hLT5uX3F1ZXVlczsgaSsrKSB7CisJCXRlbXAgPSBmc2xfcXVldWUgKyBpOworCQkvKgor CQkgKiBJbml0aWFsaXplIENvbW1hbmQgUXVldWUgcmVnaXN0ZXJzIHRvIHBvaW50IHRvIHRoZSBm aXJzdAorCQkgKiBjb21tYW5kIGRlc2NyaXB0b3IgaW4gbWVtb3J5LgorCQkgKiBEZXF1ZXVlIFBv aW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkJICogRW5xdWV1ZSBQb2ludGVyIEFkZHJlc3MgUmVn aXN0ZXJzCisJCSAqLworCQlxZG1hX3dyaXRlbChmc2xfcWRtYSwgdGVtcC0+YnVzX2FkZHIsCisJ CQkJYmxvY2sgKyBGU0xfUURNQV9CQ1FEUEFfU0FERFIoaSkpOworCQlxZG1hX3dyaXRlbChmc2xf cWRtYSwgdGVtcC0+YnVzX2FkZHIsCisJCQkJYmxvY2sgKyBGU0xfUURNQV9CQ1FFUEFfU0FERFIo aSkpOworCisJCS8qIEluaXRpYWxpemUgdGhlIHF1ZXVlIG1vZGUuICovCisJCXJlZyA9IEZTTF9R RE1BX0JDUU1SX0VOOworCQlyZWcgfD0gRlNMX1FETUFfQkNRTVJfQ0RfVEhMRChpbG9nMih0ZW1w LT5uX2NxKS00KTsKKwkJcmVnIHw9IEZTTF9RRE1BX0JDUU1SX0NRX1NJWkUoaWxvZzIodGVtcC0+ bl9jcSktNik7CisJCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGJsb2NrICsgRlNMX1FETUFf QkNRTVIoaSkpOworCX0KKworCS8qCisJICogV29ya2Fyb3VuZCBmb3IgZXJyYXR1bTogRVJSMDEw ODEyLgorCSAqIFdlIG11c3QgZW5hYmxlIFhPRkYgdG8gYXZvaWQgdGhlIGVucXVldWUgcmVqZWN0 aW9uIG9jY3Vycy4KKwkgKiBTZXR0aW5nIFNRQ0NNUiBFTlRFUl9XTSB0byAweDIwLgorCSAqLwor CXFkbWFfd3JpdGVsKGZzbF9xZG1hLCBGU0xfUURNQV9TUUNDTVJfRU5URVJfV00sCisJCQkgICAg ICBibG9jayArIEZTTF9RRE1BX1NRQ0NNUik7CisJLyoKKwkgKiBJbml0aWFsaXplIHN0YXR1cyBx dWV1ZSByZWdpc3RlcnMgdG8gcG9pbnQgdG8gdGhlIGZpcnN0CisJICogY29tbWFuZCBkZXNjcmlw dG9yIGluIG1lbW9yeS4KKwkgKiBEZXF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkg KiBFbnF1ZXVlIFBvaW50ZXIgQWRkcmVzcyBSZWdpc3RlcnMKKwkgKi8KKwlxZG1hX3dyaXRlbChm c2xfcWRtYSwgZnNsX3FkbWEtPnN0YXR1cy0+YnVzX2FkZHIsCisJCQkJCWJsb2NrICsgRlNMX1FE TUFfU1FFUEFSKTsKKwlxZG1hX3dyaXRlbChmc2xfcWRtYSwgZnNsX3FkbWEtPnN0YXR1cy0+YnVz X2FkZHIsCisJCQkJCWJsb2NrICsgRlNMX1FETUFfU1FEUEFSKTsKKwkvKiBJbml0aWFsaXplIHN0 YXR1cyBxdWV1ZSBpbnRlcnJ1cHQuICovCisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1B X0JDUUlFUl9DUVRJRSwKKwkJCSAgICAgIGJsb2NrICsgRlNMX1FETUFfQkNRSUVSKDApKTsKKwlx ZG1hX3dyaXRlbChmc2xfcWRtYSwgRlNMX1FETUFfQlNRSUNSX0lDRU4gfCBGU0xfUURNQV9CU1FJ Q1JfSUNTVCg1KQorCQkJCQkJICAgfCAweDgwMDAsCisJCQkgICAgICBibG9jayArIEZTTF9RRE1B X0JTUUlDUik7CisJcWRtYV93cml0ZWwoZnNsX3FkbWEsIEZTTF9RRE1BX0NRSUVSX01FSUUgfCBG U0xfUURNQV9DUUlFUl9URUlFLAorCQkJICAgICAgYmxvY2sgKyBGU0xfUURNQV9DUUlFUik7CisJ LyogSW5pdGlhbGl6ZSBjb250cm9sbGVyIGludGVycnVwdCByZWdpc3Rlci4gKi8KKwlxZG1hX3dy aXRlbChmc2xfcWRtYSwgMHhmZmZmZmZmZiwgc3RhdHVzICsgRlNMX1FETUFfREVEUik7CisJcWRt YV93cml0ZWwoZnNsX3FkbWEsIDB4ZmZmZmZmZmYsIHN0YXR1cyArIEZTTF9RRE1BX0RFSUVSKTsK KworCS8qIEluaXRpYWxpemUgdGhlIHN0YXR1cyBxdWV1ZSBtb2RlLiAqLworCXJlZyA9IEZTTF9R RE1BX0JTUU1SX0VOOworCXJlZyB8PSBGU0xfUURNQV9CU1FNUl9DUV9TSVpFKGlsb2cyKGZzbF9x ZG1hLT5zdGF0dXMtPm5fY3EpLTYpOworCXFkbWFfd3JpdGVsKGZzbF9xZG1hLCByZWcsIGJsb2Nr ICsgRlNMX1FETUFfQlNRTVIpOworCisJcmVnID0gcWRtYV9yZWFkbChmc2xfcWRtYSwgY3RybCAr IEZTTF9RRE1BX0RNUik7CisJcmVnICY9IH5GU0xfUURNQV9ETVJfRFFEOworCXFkbWFfd3JpdGVs KGZzbF9xZG1hLCByZWcsIGN0cmwgKyBGU0xfUURNQV9ETVIpOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorZnNsX3FkbWFfcHJlcF9t ZW1jcHkoc3RydWN0IGRtYV9jaGFuICpjaGFuLCBkbWFfYWRkcl90IGRzdCwKKwkJZG1hX2FkZHJf dCBzcmMsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IGZzbF9x ZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgZnNs X3FkbWFfY29tcCAqZnNsX2NvbXA7CisKKwlmc2xfY29tcCA9IGZzbF9xZG1hX3JlcXVlc3RfZW5x dWV1ZV9kZXNjKGZzbF9jaGFuLCAwLCAwKTsKKwlmc2xfcWRtYV9jb21wX2ZpbGxfbWVtY3B5KGZz bF9jb21wLCBkc3QsIHNyYywgbGVuKTsKKworCXJldHVybiB2Y2hhbl90eF9wcmVwKCZmc2xfY2hh bi0+dmNoYW4sICZmc2xfY29tcC0+dmRlc2MsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZnNs X3FkbWFfZW5xdWV1ZV9kZXNjKHN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbikKK3sKKwl2 b2lkIF9faW9tZW0gKmJsb2NrID0gZnNsX2NoYW4tPnFkbWEtPmJsb2NrX2Jhc2U7CisJc3RydWN0 IGZzbF9xZG1hX3F1ZXVlICpmc2xfcXVldWUgPSBmc2xfY2hhbi0+cXVldWU7CisJc3RydWN0IGZz bF9xZG1hX2NvbXAgKmZzbF9jb21wOworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZGVzYzsKKwl1 MzIgcmVnOworCisJcmVnID0gcWRtYV9yZWFkbChmc2xfY2hhbi0+cWRtYSwgYmxvY2sgKyBGU0xf UURNQV9CQ1FTUihmc2xfcXVldWUtPmlkKSk7CisJaWYgKHJlZyAmIChGU0xfUURNQV9CQ1FTUl9R RiB8IEZTTF9RRE1BX0JDUVNSX1hPRkYpKQorCQlyZXR1cm47CisJdmRlc2MgPSB2Y2hhbl9uZXh0 X2Rlc2MoJmZzbF9jaGFuLT52Y2hhbik7CisJaWYgKCF2ZGVzYykKKwkJcmV0dXJuOworCWxpc3Rf ZGVsKCZ2ZGVzYy0+bm9kZSk7CisJZnNsX2NvbXAgPSB0b19mc2xfcWRtYV9jb21wKHZkZXNjKTsK KworCW1lbWNweShmc2xfcXVldWUtPnZpcnRfaGVhZCsrLCBmc2xfY29tcC0+dmlydF9hZGRyLCAx Nik7CisJaWYgKGZzbF9xdWV1ZS0+dmlydF9oZWFkID09IGZzbF9xdWV1ZS0+Y3EgKyBmc2xfcXVl dWUtPm5fY3EpCisJCWZzbF9xdWV1ZS0+dmlydF9oZWFkID0gZnNsX3F1ZXVlLT5jcTsKKworCWxp c3RfYWRkX3RhaWwoJmZzbF9jb21wLT5saXN0LCAmZnNsX3F1ZXVlLT5jb21wX3VzZWQpOworCWJh cnJpZXIoKTsKKwlyZWcgPSBxZG1hX3JlYWRsKGZzbF9jaGFuLT5xZG1hLCBibG9jayArIEZTTF9R RE1BX0JDUU1SKGZzbF9xdWV1ZS0+aWQpKTsKKwlyZWcgfD0gRlNMX1FETUFfQkNRTVJfRUk7CisJ cWRtYV93cml0ZWwoZnNsX2NoYW4tPnFkbWEsIHJlZywgYmxvY2sgKyBGU0xfUURNQV9CQ1FNUihm c2xfcXVldWUtPmlkKSk7CisJZnNsX2NoYW4tPnN0YXR1cyA9IERNQV9JTl9QUk9HUkVTUzsKK30K Kworc3RhdGljIGVudW0gZG1hX3N0YXR1cyBmc2xfcWRtYV90eF9zdGF0dXMoc3RydWN0IGRtYV9j aGFuICpjaGFuLAorCQlkbWFfY29va2llX3QgY29va2llLCBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0 eHN0YXRlKQoreworCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9IHRvX2ZzbF9xZG1h X2NoYW4oY2hhbik7CisJZW51bSBkbWFfc3RhdHVzIHJldDsKKworCXJldCA9IGRtYV9jb29raWVf c3RhdHVzKGNoYW4sIGNvb2tpZSwgdHhzdGF0ZSk7CisJaWYgKHJldCA9PSBETUFfQ09NUExFVEUg fHwgIXR4c3RhdGUpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg dm9pZCBmc2xfcWRtYV9mcmVlX2Rlc2Moc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkZXNjKQorewor CXN0cnVjdCBmc2xfcWRtYV9jb21wICpmc2xfY29tcDsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUg KmZzbF9xdWV1ZTsKKwlzdHJ1Y3QgZnNsX3FkbWFfc2cgKnNnX2Jsb2NrOworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwlmc2xfY29tcCA9IHRvX2ZzbF9xZG1hX2Nv bXAodmRlc2MpOworCWZzbF9xdWV1ZSA9IGZzbF9jb21wLT5xY2hhbi0+cXVldWU7CisKKwlpZiAo ZnNsX2NvbXAtPnNnX2Jsb2NrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBmc2xfY29tcC0+c2dfYmxv Y2tfc3JjICsKKwkJCQlmc2xfY29tcC0+c2dfYmxvY2tfZHN0OyBpKyspIHsKKwkJCXNnX2Jsb2Nr ID0gZnNsX2NvbXAtPnNnX2Jsb2NrICsgaTsKKwkJCWRtYV9wb29sX2ZyZWUoZnNsX3F1ZXVlLT5z Z19wb29sLAorCQkJCSAgICAgIHNnX2Jsb2NrLT52aXJ0X2FkZHIsCisJCQkJICAgICAgc2dfYmxv Y2stPmJ1c19hZGRyKTsKKwkJfQorCQlrZnJlZShmc2xfY29tcC0+c2dfYmxvY2spOworCX0KKwor CXNwaW5fbG9ja19pcnFzYXZlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKKwlsaXN0 X2FkZF90YWlsKCZmc2xfY29tcC0+bGlzdCwgJmZzbF9xdWV1ZS0+Y29tcF9mcmVlKTsKKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZmc2xfcXVldWUtPnF1ZXVlX2xvY2ssIGZsYWdzKTsKK30KKwor c3RhdGljIHZvaWQgZnNsX3FkbWFfaXNzdWVfcGVuZGluZyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4p Cit7CisJc3RydWN0IGZzbF9xZG1hX2NoYW4gKmZzbF9jaGFuID0gdG9fZnNsX3FkbWFfY2hhbihj aGFuKTsKKwlzdHJ1Y3QgZnNsX3FkbWFfcXVldWUgKmZzbF9xdWV1ZSA9IGZzbF9jaGFuLT5xdWV1 ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZzbF9xdWV1 ZS0+cXVldWVfbG9jaywgZmxhZ3MpOworCXNwaW5fbG9jaygmZnNsX2NoYW4tPnZjaGFuLmxvY2sp OworCWlmICh2Y2hhbl9pc3N1ZV9wZW5kaW5nKCZmc2xfY2hhbi0+dmNoYW4pKQorCQlmc2xfcWRt YV9lbnF1ZXVlX2Rlc2MoZnNsX2NoYW4pOworCXNwaW5fdW5sb2NrKCZmc2xfY2hhbi0+dmNoYW4u bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnNsX3F1ZXVlLT5xdWV1ZV9sb2NrLCBm bGFncyk7Cit9CisKK3N0YXRpYyBpbnQgZnNsX3FkbWFfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25v ZGU7CisJc3RydWN0IGZzbF9xZG1hX2VuZ2luZSAqZnNsX3FkbWE7CisJc3RydWN0IGZzbF9xZG1h X2NoYW4gKmZzbF9jaGFuOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGludCBs ZW4sIGNoYW5zLCBxdWV1ZXM7CisJaW50IHJldCwgaTsKKworCXJldCA9IG9mX3Byb3BlcnR5X3Jl YWRfdTMyKG5wLCAiZG1hLWNoYW5uZWxzIiwgJmNoYW5zKTsKKwlpZiAocmV0KSB7CisJCWRldl9l cnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBkbWEtY2hhbm5lbHMuXG4iKTsKKwkJcmV0dXJuIHJl dDsKKwl9CisKKwlsZW4gPSBzaXplb2YoKmZzbF9xZG1hKSArIHNpemVvZigqZnNsX2NoYW4pICog Y2hhbnM7CisJZnNsX3FkbWEgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgbGVuLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWZzbF9xZG1hKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IG9mX3By b3BlcnR5X3JlYWRfdTMyKG5wLCAicXVldWVzIiwgJnF1ZXVlcyk7CisJaWYgKHJldCkgeworCQlk ZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBnZXQgcXVldWVzLlxuIik7CisJCXJldHVybiByZXQ7 CisJfQorCisJZnNsX3FkbWEtPnF1ZXVlID0gZnNsX3FkbWFfYWxsb2NfcXVldWVfcmVzb3VyY2Vz KHBkZXYsIHF1ZXVlcyk7CisJaWYgKCFmc2xfcWRtYS0+cXVldWUpCisJCXJldHVybiAtRU5PTUVN OworCisJZnNsX3FkbWEtPnN0YXR1cyA9IGZzbF9xZG1hX3ByZXBfc3RhdHVzX3F1ZXVlKHBkZXYp OworCWlmICghZnNsX3FkbWEtPnN0YXR1cykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmc2xfcWRt YS0+bl9jaGFucyA9IGNoYW5zOworCWZzbF9xZG1hLT5uX3F1ZXVlcyA9IHF1ZXVlczsKKwltdXRl eF9pbml0KCZmc2xfcWRtYS0+ZnNsX3FkbWFfbXV0ZXgpOworCisJcmVzID0gcGxhdGZvcm1fZ2V0 X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlmc2xfcWRtYS0+Y3RybF9iYXNl ID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUihm c2xfcWRtYS0+Y3RybF9iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmN0cmxfYmFz ZSk7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0s IDEpOworCWZzbF9xZG1hLT5zdGF0dXNfYmFzZSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRl di0+ZGV2LCByZXMpOworCWlmIChJU19FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKSkKKwkJcmV0 dXJuIFBUUl9FUlIoZnNsX3FkbWEtPnN0YXR1c19iYXNlKTsKKworCXJlcyA9IHBsYXRmb3JtX2dl dF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJZnNsX3FkbWEtPmJsb2NrX2Jh c2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJS KGZzbF9xZG1hLT5ibG9ja19iYXNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZnNsX3FkbWEtPmJsb2Nr X2Jhc2UpOworCisJcmV0ID0gZnNsX3FkbWFfaXJxX2luaXQocGRldiwgZnNsX3FkbWEpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlmc2xfcWRtYS0+ZmVhdHVyZSA9IG9mX3Byb3BlcnR5 X3JlYWRfYm9vbChucCwgImJpZy1lbmRpYW4iKTsKKwlJTklUX0xJU1RfSEVBRCgmZnNsX3FkbWEt PmRtYV9kZXYuY2hhbm5lbHMpOworCWZvciAoaSA9IDA7IGkgPCBmc2xfcWRtYS0+bl9jaGFuczsg aSsrKSB7CisJCXN0cnVjdCBmc2xfcWRtYV9jaGFuICpmc2xfY2hhbiA9ICZmc2xfcWRtYS0+Y2hh bnNbaV07CisKKwkJZnNsX2NoYW4tPnFkbWEgPSBmc2xfcWRtYTsKKwkJZnNsX2NoYW4tPnF1ZXVl ID0gZnNsX3FkbWEtPnF1ZXVlICsgaSAlIGZzbF9xZG1hLT5uX3F1ZXVlczsKKwkJZnNsX2NoYW4t PnZjaGFuLmRlc2NfZnJlZSA9IGZzbF9xZG1hX2ZyZWVfZGVzYzsKKwkJSU5JVF9MSVNUX0hFQUQo JmZzbF9jaGFuLT5xY29tcCk7CisJCXZjaGFuX2luaXQoJmZzbF9jaGFuLT52Y2hhbiwgJmZzbF9x ZG1hLT5kbWFfZGV2KTsKKwl9CisJZm9yIChpID0gMDsgaSA8IGZzbF9xZG1hLT5uX3F1ZXVlczsg aSsrKQorCQlmc2xfcWRtYV9wcmVfcmVxdWVzdF9lbnF1ZXVlX2Rlc2MoZnNsX3FkbWEtPnF1ZXVl ICsgaSk7CisKKwlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBmc2xfcWRtYS0+ZG1hX2Rldi5jYXBf bWFzayk7CisKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXYgPSAmcGRldi0+ZGV2OworCWZzbF9xZG1h LT5kbWFfZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzCisJCT0gZnNsX3FkbWFfZnJlZV9j aGFuX3Jlc291cmNlczsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfdHhfc3RhdHVzID0gZnNs X3FkbWFfdHhfc3RhdHVzOworCWZzbF9xZG1hLT5kbWFfZGV2LmRldmljZV9wcmVwX2RtYV9tZW1j cHkgPSBmc2xfcWRtYV9wcmVwX21lbWNweTsKKwlmc2xfcWRtYS0+ZG1hX2Rldi5kZXZpY2VfaXNz dWVfcGVuZGluZyA9IGZzbF9xZG1hX2lzc3VlX3BlbmRpbmc7CisKKwlkbWFfc2V0X21hc2soJnBk ZXYtPmRldiwgRE1BX0JJVF9NQVNLKDQwKSk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2 LCBmc2xfcWRtYSk7CisKKwlyZXQgPSBkbWFfYXN5bmNfZGV2aWNlX3JlZ2lzdGVyKCZmc2xfcWRt YS0+ZG1hX2Rldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBy ZWdpc3RlciBOWFAgTGF5ZXJzY2FwZSBxRE1BIGVuZ2luZS5cbiIpOworCQlyZXR1cm4gcmV0Owor CX0KKworCXJldCA9IGZzbF9xZG1hX3JlZ19pbml0KGZzbF9xZG1hKTsKKwlpZiAocmV0KSB7CisJ CWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IEluaXRpYWxpemUgdGhlIHFETUEgZW5naW5lLlxu Iik7CisJCXJldHVybiByZXQ7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQg ZnNsX3FkbWFfY2xlYW51cF92Y2hhbihzdHJ1Y3QgZG1hX2RldmljZSAqZG1hZGV2KQoreworCXN0 cnVjdCBmc2xfcWRtYV9jaGFuICpjaGFuLCAqX2NoYW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUoY2hhbiwgX2NoYW4sCisJCQkJJmRtYWRldi0+Y2hhbm5lbHMsIHZjaGFuLmNoYW4uZGV2 aWNlX25vZGUpIHsKKwkJbGlzdF9kZWwoJmNoYW4tPnZjaGFuLmNoYW4uZGV2aWNlX25vZGUpOwor CQl0YXNrbGV0X2tpbGwoJmNoYW4tPnZjaGFuLnRhc2spOworCX0KK30KKworc3RhdGljIGludCBm c2xfcWRtYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJc3RydWN0IGZzbF9xZG1hX2Vu Z2luZSAqZnNsX3FkbWEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgZnNs X3FkbWFfcXVldWUgKnF1ZXVlX3RlbXA7CisJc3RydWN0IGZzbF9xZG1hX3F1ZXVlICpzdGF0dXMg PSBmc2xfcWRtYS0+c3RhdHVzOworCXN0cnVjdCBmc2xfcWRtYV9jb21wICpjb21wX3RlbXAsICpf Y29tcF90ZW1wOworCWludCBpOworCisJZnNsX3FkbWFfaXJxX2V4aXQocGRldiwgZnNsX3FkbWEp OworCWZzbF9xZG1hX2NsZWFudXBfdmNoYW4oJmZzbF9xZG1hLT5kbWFfZGV2KTsKKwlvZl9kbWFf Y29udHJvbGxlcl9mcmVlKG5wKTsKKwlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJmZzbF9x ZG1hLT5kbWFfZGV2KTsKKworCS8qIEZyZWUgZGVzY3JpcHRvciBhcmVhcyAqLworCWZvciAoaSA9 IDA7IGkgPCBmc2xfcWRtYS0+bl9xdWV1ZXM7IGkrKykgeworCQlxdWV1ZV90ZW1wID0gZnNsX3Fk bWEtPnF1ZXVlICsgaTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNvbXBfdGVtcCwgX2Nv bXBfdGVtcCwKKwkJCQkJJnF1ZXVlX3RlbXAtPmNvbXBfdXNlZCwJbGlzdCkgeworCQkJZG1hX3Bv b2xfZnJlZShxdWV1ZV90ZW1wLT5jb21wX3Bvb2wsCisJCQkJCWNvbXBfdGVtcC0+dmlydF9hZGRy LAorCQkJCQljb21wX3RlbXAtPmJ1c19hZGRyKTsKKwkJCWxpc3RfZGVsKCZjb21wX3RlbXAtPmxp c3QpOworCQkJa2ZyZWUoY29tcF90ZW1wKTsKKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmUoY29tcF90ZW1wLCBfY29tcF90ZW1wLAorCQkJCQkmcXVldWVfdGVtcC0+Y29tcF9mcmVlLCBs aXN0KSB7CisJCQlkbWFfcG9vbF9mcmVlKHF1ZXVlX3RlbXAtPmNvbXBfcG9vbCwKKwkJCQkJY29t cF90ZW1wLT52aXJ0X2FkZHIsCisJCQkJCWNvbXBfdGVtcC0+YnVzX2FkZHIpOworCQkJbGlzdF9k ZWwoJmNvbXBfdGVtcC0+bGlzdCk7CisJCQlrZnJlZShjb21wX3RlbXApOworCQl9CisJCWRtYV9m cmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgZnNsX3FkbWFfZm9ybWF0KSAq CisJCQkJCXF1ZXVlX3RlbXAtPm5fY3EsIHF1ZXVlX3RlbXAtPmNxLAorCQkJCQlxdWV1ZV90ZW1w LT5idXNfYWRkcik7CisJCWRtYV9wb29sX2Rlc3Ryb3kocXVldWVfdGVtcC0+Y29tcF9wb29sKTsK Kwl9CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGZzbF9x ZG1hX2Zvcm1hdCkgKgorCQkJCXN0YXR1cy0+bl9jcSwgc3RhdHVzLT5jcSwgc3RhdHVzLT5idXNf YWRkcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lk IGZzbF9xZG1hX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGxzMTAyMWEtcWRt YSIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwg ZnNsX3FkbWFfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX3Fk bWFfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9ICJmc2wtcWRtYSIsCisJCS5v Zl9tYXRjaF90YWJsZSA9IGZzbF9xZG1hX2R0X2lkcywKKwl9LAorCS5wcm9iZSAgICAgICAgICA9 IGZzbF9xZG1hX3Byb2JlLAorCS5yZW1vdmUJCT0gZnNsX3FkbWFfcmVtb3ZlLAorfTsKKworbW9k dWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfcWRtYV9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBs YXRmb3JtOmZzbC1xZG1hIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk5YUCBMYXllcnNjYXBlIHFE TUEgZW5naW5lIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo=