From mboxrd@z Thu Jan 1 00:00:00 1970 From: Liu Ying Subject: [PATCH RFC v8 16/21] drm: panel: Add support for Himax HX8369A MIPI DSI panel Date: Wed, 31 Dec 2014 16:23:34 +0800 Message-ID: <1420014219-915-17-git-send-email-Ying.Liu@freescale.com> References: <1420014219-915-1-git-send-email-Ying.Liu@freescale.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1420014219-915-1-git-send-email-Ying.Liu@freescale.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: stefan.wahren@i2se.com, devicetree@vger.kernel.org, linux@arm.linux.org.uk, kernel@pengutronix.de, linux-kernel@vger.kernel.org, a.hajda@samsung.com, mturquette@linaro.org, linux-arm-kernel@lists.infradead.org, andyshrk@gmail.com List-Id: devicetree@vger.kernel.org VGhpcyBwYXRjaCBhZGRzIHN1cHBvcnQgZm9yIEhpbWF4IEhYODM2OUEgTUlQSSBEU0kgcGFuZWwu CgpSZXZpZXdlZC1ieTogQW5kcnplaiBIYWpkYSA8YS5oYWpkYUBzYW1zdW5nLmNvbT4KU2lnbmVk LW9mZi1ieTogTGl1IFlpbmcgPFlpbmcuTGl1QGZyZWVzY2FsZS5jb20+Ci0tLQp2Ny0+djg6CiAq IFJlbW92ZSBzZXZlcmFsIHVubmVjZXNzYXJ5IGhlYWRlcnMgaW5jbHVkZWQgaW4gdGhlIGRyaXZl ci4KCnY2LT52NzoKICogQWRkcmVzcyBBbmRyemVqIEhhamRhJ3MgZm9sbG93aW5nIGNvbW1lbnRz LgogKiBTaW1wbGlmeSB0aGUgcmV0dXJuIGxvZ2ljIGluIGh4ODM2OWFfZGNzX3dyaXRlKCkuCiAq IFJlcGxhY2UgdGhlIG1hY3JvIGh4ODM2OWFfZHNpX2luaXRfaGVscGVyKCkgd2l0aCBhIGZ1bmN0 aW9uIGFycmF5IHRvIGltcHJvdmUKICAgdGhlIGNvZGUgcXVhbGl0eS4KICogSGFuZGxlIGVycm9y IGNhc2VzIGR1cmluZyBnZXR0aW5nIGdwaW9zIGluIHByb2JlKCkuCiAqIEFkZCAnUmV2aWV3ZWQt Ynk6IEFuZHJ6ZWogSGFqZGEgPGEuaGFqZGFAc2Ftc3VuZy5jb20+Jy4KCnY1LT52NjoKICogTWFr ZSB0aGUgY2hlY2twYXRjaC5wbCBzY3JpcHQgYmUgaGFwcGllci4KICogRG8gbm90IHNldCB0aGUg ZHNpIGNoYW5uZWwgbnVtYmVyIHRvIGJlIHplcm8gaW4gcHJvYmUoKSwgYmVjYXVzZSB0aGUgTUlQ SSBEU0kKICAgYnVzIGRyaXZlciB3b3VsZCBzZXQgaXQuCgp2NC0+djU6CiAqIEFkZHJlc3MgQW5k cnplaiBIYWpkYSdzIGNvbW1lbnRzLgogKiBHZXQgdGhlIGJzLWdwaW9zIHByb3BlcnR5IGluc3Rl YWQgb2YgdGhlIGJzWzM6MF0tZ3Bpb3MgcHJvcGVydGllcy4KICogSW1wbGVtZW50IGVycm9yIHBy b3BhZ2F0aW9uIGZvciBwYW5lbCByZWdpc3RlciBjb25maWd1cmF0aW9ucy4KICogT3RoZXIgbWlu b3IgY2hhbmdlcyB0byBpbXByb3ZlIHRoZSBjb2RlIHF1YWxpdHkuCgp2My0+djQ6CiAqIE1vdmUg dGhlIHJlbGV2YW50IGR0LWJpbmRpbmdzIHRvIGEgc2VwYXJhdGUgcGF0Y2ggdG8gYWRkcmVzcyBT dGVmYW4KICAgV2FocmVuJ3MgY29tbWVudC4KCnYyLT52MzoKICogU29ydCB0aGUgaW5jbHVkZWQg aGVhZGVyIGZpbGVzIGFscGhhYmV0aWNhbGx5LgoKdjEtPnYyOgogKiBBZGRyZXNzIGFsbW9zdCBh bGwgY29tbWVudHMgZnJvbSBUaGllcnJ5IFJlZGluZy4KICogUmVtb3ZlIHNldmVyYWwgRFQgcHJv cGVydGllcyBhcyB0aGV5IGNhbiBiZSBpbXBsaWVkIGJ5IHRoZSBjb21wYXRpYmxlIHN0cmluZy4K ICogQWRkIHRoZSBISU1BWC9oaW1heCBwcmVmaXhlcyB0byB0aGUgZHJpdmVyJ3MgS2NvbmZpZyBu YW1lIGFuZCBkcml2ZXIgbmFtZS4KICogTW92ZSB0aGUgZHJpdmVyJ3MgTWFrZWZpbGUgZW50cnkg cGxhY2UgdG8gc29ydCB0aGUgZW50cmllcyBhbHBoYWJldGljYWxseS4KICogUmV1c2Ugc2V2ZXJh bCBzdGFuZGFyZCBEQ1MgZnVuY3Rpb25zIGluc3RlYWQgb2YgaW52ZW50aW5nIHdoZWVscy4KICog TW92ZSB0aGUgcGFuZWwgcmVzZXR0aW5nIGFuZCBwb3dlciBsb2dpY3MgdG8gdGhlIGRyaXZlciBw cm9iZS9yZW1vdmUgc3RhZ2VzLgogICBUaGlzIG1heSBzaW1wbGlmeSBwYW5lbCBwcmVwYXJlL3Vu cHJlcGFyZSBob29rcy4gVGhlIHBvd2VyIGNvbnN1bXB0aW9uIHNob3VsZAogICBub3QgY2hhbmdl IGEgbG90IGF0IERQTVMgc2luY2UgdGhlIHBhbmVsIGVudGVycyBzbGVlcCBtb2RlIGF0IHRoYXQg dGltZS4KICogQWRkIHRoZSBtb2R1bGUgYXV0aG9yLgogKiBPdGhlciBtaW5vciBjaGFuZ2VzLCBz dWNoIGFzIGNvZGluZyBzdHlsZSBpc3N1ZXMuCgogZHJpdmVycy9ncHUvZHJtL3BhbmVsL0tjb25m aWcgICAgICAgICAgICAgICB8ICAgNSArCiBkcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUg ICAgICAgICAgICAgIHwgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1oaW1heC1o eDgzNjlhLmMgfCA2MTAgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMyBmaWxlcyBjaGFu Z2VkLCA2MTYgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2Ry bS9wYW5lbC9wYW5lbC1oaW1heC1oeDgzNjlhLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vcGFuZWwvS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnCmluZGV4IDAy NGU5OGUuLjgxYjBiZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmln CisrKyBiL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9LY29uZmlnCkBAIC0xNiw2ICsxNiwxMSBAQCBj b25maWcgRFJNX1BBTkVMX1NJTVBMRQogCSAgdGhhdCBpdCBjYW4gYmUgYXV0b21hdGljYWxseSB0 dXJuZWQgb2ZmIHdoZW4gdGhlIHBhbmVsIGdvZXMgaW50byBhCiAJICBsb3cgcG93ZXIgc3RhdGUu CiAKK2NvbmZpZyBEUk1fUEFORUxfSElNQVhfSFg4MzY5QQorCXRyaXN0YXRlICJIaW1heCBIWDgz NjlBIHBhbmVsIgorCWRlcGVuZHMgb24gT0YKKwlzZWxlY3QgRFJNX01JUElfRFNJCisKIGNvbmZp ZyBEUk1fUEFORUxfTEQ5MDQwCiAJdHJpc3RhdGUgIkxEOTA0MCBSR0IvU1BJIHBhbmVsIgogCWRl cGVuZHMgb24gT0YgJiYgU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFr ZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vcGFuZWwvTWFrZWZpbGUKaW5kZXggNGIyYTA0My4uZDVk YmUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3BhbmVsL01ha2VmaWxlCisrKyBiL2Ry aXZlcnMvZ3B1L2RybS9wYW5lbC9NYWtlZmlsZQpAQCAtMSw0ICsxLDUgQEAKIG9iai0kKENPTkZJ R19EUk1fUEFORUxfU0lNUExFKSArPSBwYW5lbC1zaW1wbGUubworb2JqLSQoQ09ORklHX0RSTV9Q QU5FTF9ISU1BWF9IWDgzNjlBKSArPSBwYW5lbC1oaW1heC1oeDgzNjlhLm8KIG9iai0kKENPTkZJ R19EUk1fUEFORUxfTEQ5MDQwKSArPSBwYW5lbC1sZDkwNDAubwogb2JqLSQoQ09ORklHX0RSTV9Q QU5FTF9TNkU4QUEwKSArPSBwYW5lbC1zNmU4YWEwLm8KIG9iai0kKENPTkZJR19EUk1fUEFORUxf U0hBUlBfTFExMDFSMVNYMDEpICs9IHBhbmVsLXNoYXJwLWxxMTAxcjFzeDAxLm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9wYW5lbC9wYW5lbC1oaW1heC1oeDgzNjlhLmMgYi9kcml2ZXJz L2dwdS9kcm0vcGFuZWwvcGFuZWwtaGltYXgtaHg4MzY5YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLjM0YjlhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9k cm0vcGFuZWwvcGFuZWwtaGltYXgtaHg4MzY5YS5jCkBAIC0wLDAgKzEsNjEwIEBACisvKgorICog SGltYXggSFg4MzY5QSBwYW5lbCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLTIw MTQgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMg ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICog aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJz aW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgor ICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIFNhbXN1bmcgczZlOGFhMCBwYW5lbCBkcml2 ZXIuCisgKi8KKworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9taXBp X2RzaS5oPgorI2luY2x1ZGUgPGRybS9kcm1fcGFuZWwuaD4KKworI2luY2x1ZGUgPGxpbnV4L2dw aW8vY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxs aW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKworI2RlZmluZSBXUkRJU0JWCQkweDUxCisjZGVm aW5lIFdSQ1RSTEQJCTB4NTMKKyNkZWZpbmUgV1JDQUJDCQkweDU1CisjZGVmaW5lIFNFVFBPV0VS CTB4YjEKKyNkZWZpbmUgU0VURElTUAkJMHhiMgorI2RlZmluZSBTRVRDWUMJCTB4YjQKKyNkZWZp bmUgU0VUVkNPTQkJMHhiNgorI2RlZmluZSBTRVRFWFRDCQkweGI5CisjZGVmaW5lIFNFVE1JUEkJ CTB4YmEKKyNkZWZpbmUgU0VUUEFORUwJMHhjYworI2RlZmluZSBTRVRHSVAJCTB4ZDUKKyNkZWZp bmUgU0VUR0FNTUEJMHhlMAorCisjZGVmaW5lIEhYODM2OUFfTUlOX0JSSUdIVE5FU1MJMHgwMAor I2RlZmluZSBIWDgzNjlBX01BWF9CUklHSFRORVNTCTB4ZmYKKworZW51bSBoeDgzNjlhX21wdV9p bnRlcmZhY2UgeworCUhYODM2OUFfREJJX1RZUEVfQV84QklULAorCUhYODM2OUFfREJJX1RZUEVf QV85QklULAorCUhYODM2OUFfREJJX1RZUEVfQV8xNkJJVCwKKwlIWDgzNjlBX0RCSV9UWVBFX0Ff MThCSVQsCisJSFg4MzY5QV9EQklfVFlQRV9CXzhCSVQsCisJSFg4MzY5QV9EQklfVFlQRV9CXzlC SVQsCisJSFg4MzY5QV9EQklfVFlQRV9CXzE2QklULAorCUhYODM2OUFfREJJX1RZUEVfQl8xOEJJ VCwKKwlIWDgzNjlBX0RTSV9DTURfTU9ERSwKKwlIWDgzNjlBX0RCSV9UWVBFX0JfMjRCSVQsCisJ SFg4MzY5QV9EU0lfVklERU9fTU9ERSwKKwlIWDgzNjlBX01EREksCisJSFg4MzY5QV9EUElfREJJ X1RZUEVfQ19PUFQxLAorCUhYODM2OUFfRFBJX0RCSV9UWVBFX0NfT1BUMiwKKwlIWDgzNjlBX0RQ SV9EQklfVFlQRV9DX09QVDMKK307CisKK2VudW0gaHg4MzY5YV9yZXNvbHV0aW9uIHsKKwlIWDgz NjlBX1JFU180ODBfODY0LAorCUhYODM2OUFfUkVTXzQ4MF84NTQsCisJSFg4MzY5QV9SRVNfNDgw XzgwMCwKKwlIWDgzNjlBX1JFU180ODBfNjQwLAorCUhYODM2OUFfUkVTXzM2MF82NDAsCisJSFg4 MzY5QV9SRVNfNDgwXzcyMCwKK307CisKK3N0cnVjdCBoeDgzNjlhX3BhbmVsX2Rlc2MgeworCWNv bnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCisJLyogbXMgKi8KKwl1bnNpZ25l ZCBpbnQgcG93ZXJfb25fZGVsYXk7CisJdW5zaWduZWQgaW50IHJlc2V0X2RlbGF5OworCisJdW5z aWduZWQgaW50IGRzaV9sYW5lczsKK307CisKK3N0cnVjdCBoeDgzNjlhIHsKKwlzdHJ1Y3QgZGV2 aWNlICpkZXY7CisJc3RydWN0IGRybV9wYW5lbCBwYW5lbDsKKworCWNvbnN0IHN0cnVjdCBoeDgz NjlhX3BhbmVsX2Rlc2MgKnBkOworCisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgc3VwcGxp ZXNbNV07CisJc3RydWN0IGdwaW9fZGVzYyAqcmVzZXRfZ3BpbzsKKwlzdHJ1Y3QgZ3Bpb19kZXNj ICpic19ncGlvWzRdOworCXU4IHJlc19zZWw7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBo eDgzNjlhICpwYW5lbF90b19oeDgzNjlhKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKQoreworCXJl dHVybiBjb250YWluZXJfb2YocGFuZWwsIHN0cnVjdCBoeDgzNjlhLCBwYW5lbCk7Cit9CisKK3N0 YXRpYyBpbnQgaHg4MzY5YV9kY3Nfd3JpdGUoc3RydWN0IGh4ODM2OWEgKmN0eCwgY29uc3QgY2hh ciAqZnVuYywKKwkJCSAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1 Y3QgbWlwaV9kc2lfZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoY3R4LT5kZXYpOwor CXNzaXplX3QgcmV0OworCisJcmV0ID0gbWlwaV9kc2lfZGNzX3dyaXRlX2J1ZmZlcihkc2ksIGRh dGEsIGxlbik7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoY3R4LT5kZXYsICIlcyBmYWlsZWQ6 ICVkXG4iLCBmdW5jLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgaHg4MzY5YV9k Y3Nfd3JpdGVfc2VxKGN0eCwgc2VxLi4uKSBcCisoeyBcCisJY29uc3QgdTggZFtdID0geyBzZXEg fTsgXAorCUJVSUxEX0JVR19PTl9NU0coQVJSQVlfU0laRShkKSA+IDY0LCBcCisJCQkgIkRDUyBz ZXF1ZW5jZSB0b28gYmlnIGZvciBzdGFjayIpOyBcCisJaHg4MzY5YV9kY3Nfd3JpdGUoY3R4LCBf X2Z1bmNfXywgZCwgQVJSQVlfU0laRShkKSk7IFwKK30pCisKKyNkZWZpbmUgaHg4MzY5YV9kY3Nf d3JpdGVfc2VxX3N0YXRpYyhjdHgsIHNlcS4uLikgXAorKHsgXAorCXN0YXRpYyBjb25zdCB1OCBk W10gPSB7IHNlcSB9OyBcCisJaHg4MzY5YV9kY3Nfd3JpdGUoY3R4LCBfX2Z1bmNfXywgZCwgQVJS QVlfU0laRShkKSk7IFwKK30pCisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfc2V0X2Rpc3BsYXlf cmVsYXRlZF9yZWdpc3RlcihzdHJ1Y3QgaHg4MzY5YSAqY3R4KQoreworCXU4IHNlY19wID0gKGN0 eC0+cmVzX3NlbCA8PCA0KSB8IDB4MDM7CisKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2Vx KGN0eCwgU0VURElTUCwgMHgwMCwgc2VjX3AsIDB4MDMsCisJCQkgICAweDAzLCAweDcwLCAweDAw LCAweGZmLCAweDAwLCAweDAwLCAweDAwLAorCQkJICAgMHgwMCwgMHgwMywgMHgwMywgMHgwMCwg MHgwMSk7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfc2V0X2Rpc3BsYXlfd2F2ZWZvcm1f Y3ljbGUoc3RydWN0IGh4ODM2OWEgKmN0eCkKK3sKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVf c2VxX3N0YXRpYyhjdHgsIFNFVENZQywgMHgwMCwgMHgxZCwKKwkJCQkJMHg1ZiwgMHgwZSwgMHgw Nik7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfc2V0X2dpcChzdHJ1Y3QgaHg4MzY5YSAq Y3R4KQoreworCXJldHVybiBoeDgzNjlhX2Rjc193cml0ZV9zZXFfc3RhdGljKGN0eCwgU0VUR0lQ LCAweDAwLCAweDA0LAorCQkJCSAweDAzLCAweDAwLCAweDAxLCAweDA1LCAweDFjLCAweDcwLAor CQkJCSAweDAxLCAweDAzLCAweDAwLCAweDAwLCAweDQwLCAweDA2LAorCQkJCSAweDUxLCAweDA3 LCAweDAwLCAweDAwLCAweDQxLCAweDA2LAorCQkJCSAweDUwLCAweDA3LCAweDA3LCAweDBmLCAw eDA0KTsKK30KKworc3RhdGljIGludCBoeDgzNjlhX2RzaV9zZXRfcG93ZXIoc3RydWN0IGh4ODM2 OWEgKmN0eCkKK3sKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIFNF VFBPV0VSLCAweDAxLCAweDAwLAorCQkJCSAgIDB4MzQsIDB4MDYsIDB4MDAsIDB4MGYsIDB4MGYs IDB4MmEsCisJCQkJICAgMHgzMiwgMHgzZiwgMHgzZiwgMHgwNywgMHgzYSwgMHgwMSwKKwkJCQkg ICAweGU2LCAweGU2LCAweGU2LCAweGU2LCAweGU2KTsKK30KKworc3RhdGljIGludCBoeDgzNjlh X2RzaV9zZXRfdmNvbV92b2x0YWdlKHN0cnVjdCBoeDgzNjlhICpjdHgpCit7CisJcmV0dXJuIGh4 ODM2OWFfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCBTRVRWQ09NLCAweDU2LCAweDU2KTsKK30K Kworc3RhdGljIGludCBoeDgzNjlhX2RzaV9zZXRfcGFuZWwoc3RydWN0IGh4ODM2OWEgKmN0eCkK K3sKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIFNFVFBBTkVMLCAw eDAyKTsKK30KKworc3RhdGljIGludCBoeDgzNjlhX2RzaV9zZXRfZ2FtbWFfY3VydmUoc3RydWN0 IGh4ODM2OWEgKmN0eCkKK3sKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhj dHgsIFNFVEdBTU1BLCAweDAwLCAweDFkLAorCQkJCSAgIDB4MjIsIDB4MzgsIDB4M2QsIDB4M2Ys IDB4MmUsIDB4NGEsCisJCQkJICAgMHgwNiwgMHgwZCwgMHgwZiwgMHgxMywgMHgxNSwgMHgxMywK KwkJCQkgICAweDE2LCAweDEwLCAweDE5LCAweDAwLCAweDFkLCAweDIyLAorCQkJCSAgIDB4Mzgs IDB4M2QsIDB4M2YsIDB4MmUsIDB4NGEsIDB4MDYsCisJCQkJICAgMHgwZCwgMHgwZiwgMHgxMywg MHgxNSwgMHgxMywgMHgxNiwKKwkJCQkgICAweDEwLCAweDE5KTsKK30KKworc3RhdGljIGludCBo eDgzNjlhX2RzaV9zZXRfbWlwaShzdHJ1Y3QgaHg4MzY5YSAqY3R4KQoreworCXU4IGVsZXZlbnRo X3AgPSBjdHgtPnBkLT5kc2lfbGFuZXMgPT0gMiA/IDB4MTEgOiAweDEwOworCisJcmV0dXJuIGh4 ODM2OWFfZGNzX3dyaXRlX3NlcShjdHgsIFNFVE1JUEksIDB4MDAsIDB4YTAsIDB4YzYsCisJCQkJ IDB4MDAsIDB4MGEsIDB4MDAsIDB4MTAsIDB4MzAsIDB4NmYsCisJCQkJIDB4MDIsIGVsZXZlbnRo X3AsIDB4MTgsIDB4NDApOworfQorCitzdGF0aWMgaW50IGh4ODM2OWFfZHNpX3NldF9pbnRlcmZh Y2VfcGl4ZWxfZm9tYXQoc3RydWN0IGh4ODM2OWEgKmN0eCkKK3sKKwlzdHJ1Y3QgbWlwaV9kc2lf ZGV2aWNlICpkc2kgPSB0b19taXBpX2RzaV9kZXZpY2UoY3R4LT5kZXYpOworCXU4IGZvcm1hdDsK KwlpbnQgcmV0OworCisJc3dpdGNoIChkc2ktPmZvcm1hdCkgeworCWNhc2UgTUlQSV9EU0lfRk1U X1JHQjg4ODoKKwljYXNlIE1JUElfRFNJX0ZNVF9SR0I2NjY6CisJCWZvcm1hdCA9IDB4Nzc7CisJ CWJyZWFrOworCWNhc2UgTUlQSV9EU0lfRk1UX1JHQjU2NToKKwkJZm9ybWF0ID0gMHg1NTsKKwkJ YnJlYWs7CisJY2FzZSBNSVBJX0RTSV9GTVRfUkdCNjY2X1BBQ0tFRDoKKwkJZm9ybWF0ID0gMHg2 NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihjdHgtPmRldiwgInVuc3VwcG9ydGVk IERTSSBwaXhlbCBmb3JtYXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBt aXBpX2RzaV9kY3Nfc2V0X3BpeGVsX2Zvcm1hdChkc2ksIGZvcm1hdCk7CisJaWYgKHJldCA8IDAp CisJCWRldl9lcnIoY3R4LT5kZXYsICIlcyBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGh4ODM2OWFfZHNpX3NldF9jb2x1bW5fYWRk cmVzcyhzdHJ1Y3QgaHg4MzY5YSAqY3R4KQoreworCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRz aSA9IHRvX21pcGlfZHNpX2RldmljZShjdHgtPmRldik7CisJY29uc3Qgc3RydWN0IGRybV9kaXNw bGF5X21vZGUgKm1vZGUgPSBjdHgtPnBkLT5tb2RlOworCWludCByZXQ7CisKKwlyZXQgPSBtaXBp X2RzaV9kY3Nfc2V0X2NvbHVtbl9hZGRyZXNzKGRzaSwgMCwgbW9kZS0+aGRpc3BsYXkgLSAxKTsK KwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihjdHgtPmRldiwgIiVzIGZhaWxlZDogJWRcbiIsIF9f ZnVuY19fLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lf c2V0X3BhZ2VfYWRkcmVzcyhzdHJ1Y3QgaHg4MzY5YSAqY3R4KQoreworCXN0cnVjdCBtaXBpX2Rz aV9kZXZpY2UgKmRzaSA9IHRvX21pcGlfZHNpX2RldmljZShjdHgtPmRldik7CisJY29uc3Qgc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBjdHgtPnBkLT5tb2RlOworCWludCByZXQ7CisK KwlyZXQgPSBtaXBpX2RzaV9kY3Nfc2V0X3BhZ2VfYWRkcmVzcyhkc2ksIDAsIG1vZGUtPnZkaXNw bGF5IC0gMSk7CisJaWYgKHJldCA8IDApCisJCWRldl9lcnIoY3R4LT5kZXYsICIlcyBmYWlsZWQ6 ICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGh4 ODM2OWFfZHNpX3dyaXRlX2Rpc3BsYXlfYnJpZ2h0bmVzcyhzdHJ1Y3QgaHg4MzY5YSAqY3R4LAor CQkJCQkJdTggYnJpZ2h0bmVzcykKK3sKKwlyZXR1cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2VxKGN0 eCwgV1JESVNCViwgYnJpZ2h0bmVzcyk7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfd3Jp dGVfY2FiYyhzdHJ1Y3QgaHg4MzY5YSAqY3R4KQoreworCXJldHVybiBoeDgzNjlhX2Rjc193cml0 ZV9zZXFfc3RhdGljKGN0eCwgV1JDQUJDLCAweDAxKTsKK30KKworc3RhdGljIGludCBoeDgzNjlh X2RzaV93cml0ZV9jb250cm9sX2Rpc3BsYXkoc3RydWN0IGh4ODM2OWEgKmN0eCkKK3sKKwlyZXR1 cm4gaHg4MzY5YV9kY3Nfd3JpdGVfc2VxX3N0YXRpYyhjdHgsIFdSQ1RSTEQsIDB4MjQpOworfQor CitzdGF0aWMgaW50IGh4ODM2OWFfZHNpX3BhbmVsX2luaXQoc3RydWN0IGh4ODM2OWEgKmN0eCkK K3sKKwlpbnQgKCpmdW5jc1tdKShzdHJ1Y3QgaHg4MzY5YSAqY3R4KSA9IHsKKwkJaHg4MzY5YV9k c2lfc2V0X2Rpc3BsYXlfcmVsYXRlZF9yZWdpc3RlciwKKwkJaHg4MzY5YV9kc2lfc2V0X2Rpc3Bs YXlfd2F2ZWZvcm1fY3ljbGUsCisJCWh4ODM2OWFfZHNpX3NldF9naXAsCisJCWh4ODM2OWFfZHNp X3NldF9wb3dlciwKKwkJaHg4MzY5YV9kc2lfc2V0X3Zjb21fdm9sdGFnZSwKKwkJaHg4MzY5YV9k c2lfc2V0X3BhbmVsLAorCQloeDgzNjlhX2RzaV9zZXRfZ2FtbWFfY3VydmUsCisJCWh4ODM2OWFf ZHNpX3NldF9taXBpLAorCQloeDgzNjlhX2RzaV9zZXRfaW50ZXJmYWNlX3BpeGVsX2ZvbWF0LAor CQloeDgzNjlhX2RzaV9zZXRfY29sdW1uX2FkZHJlc3MsCisJCWh4ODM2OWFfZHNpX3NldF9wYWdl X2FkZHJlc3MsCisJCWh4ODM2OWFfZHNpX3dyaXRlX2NhYmMsCisJCWh4ODM2OWFfZHNpX3dyaXRl X2NvbnRyb2xfZGlzcGxheSwKKwl9OworCWludCByZXQsIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwg QVJSQVlfU0laRShmdW5jcyk7IGkrKykgeworCQlyZXQgPSBmdW5jc1tpXShjdHgpOworCQlpZiAo cmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHg4 MzY5YV9kc2lfc2V0X2V4dGVuc2lvbl9jb21tYW5kKHN0cnVjdCBoeDgzNjlhICpjdHgpCit7CisJ cmV0dXJuIGh4ODM2OWFfZGNzX3dyaXRlX3NlcV9zdGF0aWMoY3R4LCBTRVRFWFRDLCAweGZmLCAw eDgzLCAweDY5KTsKK30KKworc3RhdGljIGludCBoeDgzNjlhX2RzaV9zZXRfbWF4aW11bV9yZXR1 cm5fcGFja2V0X3NpemUoc3RydWN0IGh4ODM2OWEgKmN0eCwKKwkJCQkJCSAgICAgIHUxNiBzaXpl KQoreworCXN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSA9IHRvX21pcGlfZHNpX2RldmljZShj dHgtPmRldik7CisJaW50IHJldDsKKworCXJldCA9IG1pcGlfZHNpX3NldF9tYXhpbXVtX3JldHVy bl9wYWNrZXRfc2l6ZShkc2ksIHNpemUpOworCWlmIChyZXQgPCAwKQorCQlkZXZfZXJyKGN0eC0+ ZGV2LAorCQkJImVycm9yICVkIHNldHRpbmcgbWF4aW11bSByZXR1cm4gcGFja2V0IHNpemUgdG8g JWRcbiIsCisJCQlyZXQsIHNpemUpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHg4 MzY5YV9kc2lfc2V0X3NlcXVlbmNlKHN0cnVjdCBoeDgzNjlhICpjdHgpCit7CisJc3RydWN0IG1p cGlfZHNpX2RldmljZSAqZHNpID0gdG9fbWlwaV9kc2lfZGV2aWNlKGN0eC0+ZGV2KTsKKwlpbnQg cmV0OworCisJcmV0ID0gaHg4MzY5YV9kc2lfc2V0X2V4dGVuc2lvbl9jb21tYW5kKGN0eCk7CisJ aWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gaHg4MzY5YV9kc2lfc2V0X21heGlt dW1fcmV0dXJuX3BhY2tldF9zaXplKGN0eCwgNCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0 OworCisJcmV0ID0gaHg4MzY5YV9kc2lfcGFuZWxfaW5pdChjdHgpOworCWlmIChyZXQgPCAwKQor CQlnb3RvIG91dDsKKworCXJldCA9IG1pcGlfZHNpX2Rjc19leGl0X3NsZWVwX21vZGUoZHNpKTsK KwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAiZmFpbGVkIHRvIGV4aXQgc2xl ZXAgbW9kZTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IG1pcGlfZHNp X2Rjc19zZXRfZGlzcGxheV9vbihkc2kpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoY3R4 LT5kZXYsICJmYWlsZWQgdG8gc2V0IGRpc3BsYXkgb246ICVkXG4iLCByZXQpOworCQlnb3RvIG91 dDsKKwl9CisKKwkvKgorCSAqIEl0J3MgbmVjZXNzYXJ5IHRvIHdhaXQgMTIwbXNlYyBhZnRlciBz ZW5kaW5nIHRoZSBTbGVlcCBPdXQKKwkgKiBjb21tYW5kIGJlZm9yZSBTbGVlcCBJbiBjb21tYW5k IGNhbiBiZSBzZW50LCBhY2NvcmRpbmcgdG8KKwkgKiB0aGUgSFg4MzY5QSBkYXRhIHNoZWV0Lgor CSAqLworCW1zbGVlcCgxMjApOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQg aHg4MzY5YV9kc2lfZGlzYWJsZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3Qg aHg4MzY5YSAqY3R4ID0gcGFuZWxfdG9faHg4MzY5YShwYW5lbCk7CisKKwlyZXR1cm4gaHg4MzY5 YV9kc2lfd3JpdGVfZGlzcGxheV9icmlnaHRuZXNzKGN0eCwKKwkJCQkJCUhYODM2OUFfTUlOX0JS SUdIVE5FU1MpOworfQorCitzdGF0aWMgaW50IGh4ODM2OWFfZHNpX3VucHJlcGFyZShzdHJ1Y3Qg ZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3QgaHg4MzY5YSAqY3R4ID0gcGFuZWxfdG9faHg4 MzY5YShwYW5lbCk7CisJc3RydWN0IG1pcGlfZHNpX2RldmljZSAqZHNpID0gdG9fbWlwaV9kc2lf ZGV2aWNlKGN0eC0+ZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gbWlwaV9kc2lfZGNzX2VudGVy X3NsZWVwX21vZGUoZHNpKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKGN0eC0+ZGV2LCAi ZmFpbGVkIHRvIGVudGVyIHNsZWVwIG1vZGU6ICVkXG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9 CisKKwlyZXQgPSBtaXBpX2RzaV9kY3Nfc2V0X2Rpc3BsYXlfb2ZmKGRzaSk7CisJaWYgKHJldCA8 IDApIHsKKwkJZGV2X2VycihjdHgtPmRldiwgImZhaWxlZCB0byBzZXQgZGlzcGxheSBvZmY6ICVk XG4iLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoaXMgaXMgdG8gYWxsb3cg dGltZSBmb3IgdGhlIHN1cHBseSB2b2x0YWdlcyBhbmQgY2xvY2sKKwkgKiBjaXJjdWl0cyB0byBz dGFibGl6ZSwgYWNjb3JkaW5nIHRvIHRoZSBIWDgzNjlBIGRhdGEgc2hlZXQuCisJICovCisJbXNs ZWVwKDUpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lf cHJlcGFyZShzdHJ1Y3QgZHJtX3BhbmVsICpwYW5lbCkKK3sKKwlzdHJ1Y3QgaHg4MzY5YSAqY3R4 ID0gcGFuZWxfdG9faHg4MzY5YShwYW5lbCk7CisKKwlyZXR1cm4gaHg4MzY5YV9kc2lfc2V0X3Nl cXVlbmNlKGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfZW5hYmxlKHN0cnVjdCBk cm1fcGFuZWwgKnBhbmVsKQoreworCXN0cnVjdCBoeDgzNjlhICpjdHggPSBwYW5lbF90b19oeDgz NjlhKHBhbmVsKTsKKworCXJldHVybiBoeDgzNjlhX2RzaV93cml0ZV9kaXNwbGF5X2JyaWdodG5l c3MoY3R4LAorCQkJCQkJSFg4MzY5QV9NQVhfQlJJR0hUTkVTUyk7Cit9CisKK3N0YXRpYyBpbnQg aHg4MzY5YV9nZXRfbW9kZXMoc3RydWN0IGRybV9wYW5lbCAqcGFuZWwpCit7CisJc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm5lY3RvciA9IHBhbmVsLT5jb25uZWN0b3I7CisJc3RydWN0IGRybV9k ZXZpY2UgKmRybSA9IHBhbmVsLT5kcm07CisJc3RydWN0IGh4ODM2OWEgKmN0eCA9IHBhbmVsX3Rv X2h4ODM2OWEocGFuZWwpOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCWNvbnN0 IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptID0gY3R4LT5wZC0+bW9kZTsKKworCW1vZGUgPSBk cm1fbW9kZV9kdXBsaWNhdGUoZHJtLCBtKTsKKwlpZiAoIW1vZGUpIHsKKwkJZGV2X2Vycihkcm0t PmRldiwgImZhaWxlZCB0byBhZGQgbW9kZSAldXgldUAldVxuIiwKKwkJCW0tPmhkaXNwbGF5LCBt LT52ZGlzcGxheSwgbS0+dnJlZnJlc2gpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkcm1fbW9kZV9z ZXRfbmFtZShtb2RlKTsKKwltb2RlLT50eXBlID0gRFJNX01PREVfVFlQRV9EUklWRVIgfCBEUk1f TU9ERV9UWVBFX1BSRUZFUlJFRDsKKworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLmJwYyA9IDg7 CisJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ud2lkdGhfbW0gPSBtb2RlLT53aWR0aF9tbTsKKwlj b25uZWN0b3ItPmRpc3BsYXlfaW5mby5oZWlnaHRfbW0gPSBtb2RlLT5oZWlnaHRfbW07CisKKwlk cm1fbW9kZV9wcm9iZWRfYWRkKGNvbm5lY3RvciwgbW9kZSk7CisKKwlyZXR1cm4gMTsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fcGFuZWxfZnVuY3MgaHg4MzY5YV9kc2lfZHJtX2Z1bmNz ID0geworCS5kaXNhYmxlID0gaHg4MzY5YV9kc2lfZGlzYWJsZSwKKwkudW5wcmVwYXJlID0gaHg4 MzY5YV9kc2lfdW5wcmVwYXJlLAorCS5wcmVwYXJlID0gaHg4MzY5YV9kc2lfcHJlcGFyZSwKKwku ZW5hYmxlID0gaHg4MzY5YV9kc2lfZW5hYmxlLAorCS5nZXRfbW9kZXMgPSBoeDgzNjlhX2dldF9t b2RlcywKK307CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9wb3dlcl9vbihzdHJ1Y3QgaHg4MzY5YSAq Y3R4KQoreworCWludCByZXQ7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoQVJSQVlf U0laRShjdHgtPnN1cHBsaWVzKSwgY3R4LT5zdXBwbGllcyk7CisJaWYgKHJldCA8IDApCisJCXJl dHVybiByZXQ7CisKKwltc2xlZXAoY3R4LT5wZC0+cG93ZXJfb25fZGVsYXkpOworCisJZ3Bpb2Rf c2V0X3ZhbHVlKGN0eC0+cmVzZXRfZ3BpbywgMSk7CisJdXNsZWVwX3JhbmdlKDUwLCA2MCk7CisJ Z3Bpb2Rfc2V0X3ZhbHVlKGN0eC0+cmVzZXRfZ3BpbywgMCk7CisKKwltc2xlZXAoY3R4LT5wZC0+ cmVzZXRfZGVsYXkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9wb3dl cl9vZmYoc3RydWN0IGh4ODM2OWEgKmN0eCkKK3sKKwlyZXR1cm4gcmVndWxhdG9yX2J1bGtfZGlz YWJsZShBUlJBWV9TSVpFKGN0eC0+c3VwcGxpZXMpLCBjdHgtPnN1cHBsaWVzKTsKK30KKworc3Rh dGljIHZvaWQgaHg4MzY5YV92bV90b19yZXNfc2VsKHN0cnVjdCBoeDgzNjlhICpjdHgpCit7CisJ Y29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUgPSBjdHgtPnBkLT5tb2RlOworCisJ c3dpdGNoIChtb2RlLT5oZGlzcGxheSkgeworCWNhc2UgNDgwOgorCQlzd2l0Y2ggKG1vZGUtPnZk aXNwbGF5KSB7CisJCWNhc2UgODY0OgorCQkJY3R4LT5yZXNfc2VsID0gSFg4MzY5QV9SRVNfNDgw Xzg2NDsKKwkJCWJyZWFrOworCQljYXNlIDg1NDoKKwkJCWN0eC0+cmVzX3NlbCA9IEhYODM2OUFf UkVTXzQ4MF84NTQ7CisJCQlicmVhazsKKwkJY2FzZSA4MDA6CisJCQljdHgtPnJlc19zZWwgPSBI WDgzNjlBX1JFU180ODBfODAwOworCQkJYnJlYWs7CisJCWNhc2UgNjQwOgorCQkJY3R4LT5yZXNf c2VsID0gSFg4MzY5QV9SRVNfNDgwXzY0MDsKKwkJCWJyZWFrOworCQljYXNlIDcyMDoKKwkJCWN0 eC0+cmVzX3NlbCA9IEhYODM2OUFfUkVTXzQ4MF83MjA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoK KwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgMzYwOgorCQlpZiAobW9kZS0+dmRpc3Bs YXkgPT0gNjQwKQorCQkJY3R4LT5yZXNfc2VsID0gSFg4MzY5QV9SRVNfMzYwXzY0MDsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgdHJ1bHlfdGZ0NDgwODAwXzE2X2VfbW9kZSA9IHsKKwkuY2xvY2sgPSAy NjQwMCwKKwkuaGRpc3BsYXkgPSA0ODAsCisJLmhzeW5jX3N0YXJ0ID0gNDgwICsgOCwKKwkuaHN5 bmNfZW5kID0gNDgwICsgOCArIDgsCisJLmh0b3RhbCA9IDQ4MCArIDggKyA4ICsgOCwKKwkudmRp c3BsYXkgPSA4MDAsCisJLnZzeW5jX3N0YXJ0ID0gODAwICsgNiwKKwkudnN5bmNfZW5kID0gODAw ICsgNiArIDYsCisJLnZ0b3RhbCA9IDgwMCArIDYgKyA2ICsgNiwKKwkudnJlZnJlc2ggPSA2MCwK Kwkud2lkdGhfbW0gPSA0NSwKKwkuaGVpZ2h0X21tID0gNzYsCit9OworCitzdGF0aWMgY29uc3Qg c3RydWN0IGh4ODM2OWFfcGFuZWxfZGVzYyB0cnVseV90ZnQ0ODA4MDBfMTZfZV9kc2kgPSB7CisJ Lm1vZGUgPSAmdHJ1bHlfdGZ0NDgwODAwXzE2X2VfbW9kZSwKKwkucG93ZXJfb25fZGVsYXkgPSAx MCwKKwkucmVzZXRfZGVsYXkgPSAxMCwKKwkuZHNpX2xhbmVzID0gMiwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGh4ODM2OWFfZHNpX29mX21hdGNoW10gPSB7CisJewor CQkuY29tcGF0aWJsZSA9ICJ0cnVseSx0ZnQ0ODA4MDAtMTYtZS1kc2kiLAorCQkuZGF0YSA9ICZ0 cnVseV90ZnQ0ODA4MDBfMTZfZV9kc2ksCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0sCit9 OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaHg4MzY5YV9kc2lfb2ZfbWF0Y2gpOworCitzdGF0 aWMgaW50IGh4ODM2OWFfZHNpX3Byb2JlKHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKK3sK KwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmZHNpLT5kZXY7CisJY29uc3Qgc3RydWN0IG9mX2Rldmlj ZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKGh4ODM2OWFfZHNpX29mX21hdGNoLCBk ZXYpOworCXN0cnVjdCBoeDgzNjlhICpjdHg7CisJaW50IHJldCwgaTsKKworCWN0eCA9IGRldm1f a3phbGxvYyhkZXYsIHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjdHgpCisJCXJl dHVybiAtRU5PTUVNOworCisJY3R4LT5kZXYgPSBkZXY7CisKKwlpZiAob2ZfaWQpIHsKKwkJY3R4 LT5wZCA9IG9mX2lkLT5kYXRhOworCX0gZWxzZSB7CisJCWRldl9lcnIoZGV2LCAiY2Fubm90IGZp bmQgY29tcGF0aWJsZSBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwloeDgz NjlhX3ZtX3RvX3Jlc19zZWwoY3R4KTsKKworCWN0eC0+c3VwcGxpZXNbMF0uc3VwcGx5ID0gInZk ZDEiOworCWN0eC0+c3VwcGxpZXNbMV0uc3VwcGx5ID0gInZkZDIiOworCWN0eC0+c3VwcGxpZXNb Ml0uc3VwcGx5ID0gInZkZDMiOworCWN0eC0+c3VwcGxpZXNbM10uc3VwcGx5ID0gImRzaS12Y2Mi OworCWN0eC0+c3VwcGxpZXNbNF0uc3VwcGx5ID0gInZwcCI7CisJcmV0ID0gZGV2bV9yZWd1bGF0 b3JfYnVsa19nZXQoZGV2LCBBUlJBWV9TSVpFKGN0eC0+c3VwcGxpZXMpLAorCQkJCSAgICAgIGN0 eC0+c3VwcGxpZXMpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9pbmZvKGRldiwgImZhaWxlZCB0 byBnZXQgcmVndWxhdG9yczogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJY3R4 LT5yZXNldF9ncGlvID0gZGV2bV9ncGlvZF9nZXQoZGV2LCAicmVzZXQiLCBHUElPRF9PVVRfTE9X KTsKKwlpZiAoSVNfRVJSKGN0eC0+cmVzZXRfZ3BpbykpIHsKKwkJZGV2X2luZm8oZGV2LCAiY2Fu bm90IGdldCByZXNldC1ncGlvcyAlbGRcbiIsCisJCQkgUFRSX0VSUihjdHgtPnJlc2V0X2dwaW8p KTsKKwkJcmV0dXJuIFBUUl9FUlIoY3R4LT5yZXNldF9ncGlvKTsKKwl9CisKKwlmb3IgKGkgPSAw OyBpIDwgNDsgaSsrKSB7CisJCWN0eC0+YnNfZ3Bpb1tpXSA9IGRldm1fZ3Bpb2RfZ2V0X2luZGV4 X29wdGlvbmFsKGRldiwgImJzIiwgaSwKKwkJCQkJCQkJR1BJT0RfT1VUX0hJR0gpOworCQlpZiAo IUlTX0VSUl9PUl9OVUxMKGN0eC0+YnNfZ3Bpb1tpXSkpIHsKKwkJCWRldl9kYmcoZGV2LCAiYnMl ZC1ncGlvIGlzIGNvbmZpZ3VyZWRcbiIsIGkpOworCQl9IGVsc2UgaWYgKElTX0VSUihjdHgtPmJz X2dwaW9baV0pKSB7CisJCQlkZXZfaW5mbyhkZXYsICJmYWlsZWQgdG8gZ2V0IGJzJWQtZ3Bpb1xu IiwgaSk7CisJCQlyZXR1cm4gUFRSX0VSUihjdHgtPmJzX2dwaW9baV0pOworCQl9CisJfQorCisJ cmV0ID0gaHg4MzY5YV9wb3dlcl9vbihjdHgpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIo ZGV2LCAiY2Fubm90IHBvd2VyIG9uXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlkcm1fcGFu ZWxfaW5pdCgmY3R4LT5wYW5lbCk7CisJY3R4LT5wYW5lbC5kZXYgPSBkZXY7CisJY3R4LT5wYW5l bC5mdW5jcyA9ICZoeDgzNjlhX2RzaV9kcm1fZnVuY3M7CisKKwlyZXQgPSBkcm1fcGFuZWxfYWRk KCZjdHgtPnBhbmVsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW1pcGlfZHNp X3NldF9kcnZkYXRhKGRzaSwgY3R4KTsKKworCWRzaS0+bGFuZXMgPSBjdHgtPnBkLT5kc2lfbGFu ZXM7CisJZHNpLT5mb3JtYXQgPSBNSVBJX0RTSV9GTVRfUkdCODg4OworCWRzaS0+bW9kZV9mbGFn cyA9IE1JUElfRFNJX01PREVfVklERU8gfAorCQkJICBNSVBJX0RTSV9NT0RFX1ZJREVPX0JVUlNU IHwKKwkJCSAgTUlQSV9EU0lfTU9ERV9WSURFT19TWU5DX1BVTFNFOworCXJldCA9IG1pcGlfZHNp X2F0dGFjaChkc2kpOworCWlmIChyZXQgPCAwKQorCQlkcm1fcGFuZWxfcmVtb3ZlKCZjdHgtPnBh bmVsKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaHg4MzY5YV9kc2lfcmVtb3Zl KHN0cnVjdCBtaXBpX2RzaV9kZXZpY2UgKmRzaSkKK3sKKwlzdHJ1Y3QgaHg4MzY5YSAqY3R4ID0g bWlwaV9kc2lfZ2V0X2RydmRhdGEoZHNpKTsKKworCW1pcGlfZHNpX2RldGFjaChkc2kpOworCWRy bV9wYW5lbF9yZW1vdmUoJmN0eC0+cGFuZWwpOworCXJldHVybiBoeDgzNjlhX3Bvd2VyX29mZihj dHgpOworfQorCitzdGF0aWMgc3RydWN0IG1pcGlfZHNpX2RyaXZlciBoeDgzNjlhX2RzaV9kcml2 ZXIgPSB7CisJLnByb2JlID0gaHg4MzY5YV9kc2lfcHJvYmUsCisJLnJlbW92ZSA9IGh4ODM2OWFf ZHNpX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJwYW5lbC1oeDgzNjlhLWRzaSIs CisJCS5vZl9tYXRjaF90YWJsZSA9IGh4ODM2OWFfZHNpX29mX21hdGNoLAorCX0sCit9OworbW9k dWxlX21pcGlfZHNpX2RyaXZlcihoeDgzNjlhX2RzaV9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJ UFRJT04oIkhpbWF4IEhYODM2OUEgcGFuZWwgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJMaXUg WWluZyA8WWluZy5MaXVAZnJlZXNjYWxlLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIi KTsKLS0gCjIuMS4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZl bAo=