From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [PATCH v3 3/7] drm/tinydrm: Add MIPI DBI support Date: Tue, 31 Jan 2017 17:03:15 +0100 Message-ID: <20170131160319.9695-4-noralf@tronnes.org> References: <20170131160319.9695-1-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20170131160319.9695-1-noralf@tronnes.org> 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, devicetree@vger.kernel.org Cc: thomas.petazzoni@free-electrons.com, linux-kernel@vger.kernel.org List-Id: devicetree@vger.kernel.org QWRkIHN1cHBvcnQgZm9yIE1JUEkgREJJIGNvbXBhdGlibGUgY29udHJvbGxlcnMuCkludGVyZmFj ZSB0eXBlIEMgb3B0aW9uIDEgYW5kIDMgYXJlIHN1cHBvcnRlZCAoU1BJKS4KClNpZ25lZC1vZmYt Ynk6IE5vcmFsZiBUcsO4bm5lcyA8bm9yYWxmQHRyb25uZXMub3JnPgotLS0KIERvY3VtZW50YXRp b24vZ3B1L3Rpbnlkcm0ucnN0ICAgICAgfCAgIDEyICsKIGRyaXZlcnMvZ3B1L2RybS90aW55ZHJt L0tjb25maWcgICAgfCAgICAzICsKIGRyaXZlcnMvZ3B1L2RybS90aW55ZHJtL01ha2VmaWxlICAg fCAgICAzICsKIGRyaXZlcnMvZ3B1L2RybS90aW55ZHJtL21pcGktZGJpLmMgfCAxMDA1ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogaW5jbHVkZS9kcm0vdGlueWRybS9taXBp LWRiaS5oICAgICB8ICAxMDcgKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAxMTMwIGluc2VydGlvbnMo KykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9taXBpLWRiaS5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kcm0vdGlueWRybS9taXBpLWRiaS5oCgpkaWZm IC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ncHUvdGlueWRybS5yc3QgYi9Eb2N1bWVudGF0aW9uL2dw dS90aW55ZHJtLnJzdAppbmRleCBmYjI1NmQyLi5hOTEzNjQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVu dGF0aW9uL2dwdS90aW55ZHJtLnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2dwdS90aW55ZHJtLnJz dApAQCAtMjgsMyArMjgsMTUgQEAgQWRkaXRpb25hbCBoZWxwZXJzCiAKIC4uIGtlcm5lbC1kb2M6 OiBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9jb3JlL3Rpbnlkcm0taGVscGVycy5jCiAgICA6ZXhw b3J0OgorCitNSVBJIERCSSBDb21wYXRpYmxlIENvbnRyb2xsZXJzCis9PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09CisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2dwdS9kcm0vdGlueWRy bS9taXBpLWRiaS5jCisgICA6ZG9jOiBvdmVydmlldworCisuLiBrZXJuZWwtZG9jOjogaW5jbHVk ZS9kcm0vdGlueWRybS9taXBpLWRiaS5oCisgICA6aW50ZXJuYWw6CisKKy4uIGtlcm5lbC1kb2M6 OiBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9taXBpLWRiaS5jCisgICA6ZXhwb3J0OgpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vS2NvbmZpZyBiL2RyaXZlcnMvZ3B1L2RybS90 aW55ZHJtL0tjb25maWcKaW5kZXggZmZiODczZi4uMTI4ZDJmMyAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL3Rpbnlkcm0vS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9L Y29uZmlnCkBAIC02LDMgKzYsNiBAQCBtZW51Y29uZmlnIERSTV9USU5ZRFJNCiAJaGVscAogCSAg Q2hvb3NlIHRoaXMgb3B0aW9uIGlmIHlvdSBoYXZlIGEgdGlueWRybSBzdXBwb3J0ZWQgZGlzcGxh eS4KIAkgIElmIE0gaXMgc2VsZWN0ZWQgdGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB0aW55ZHJt LgorCitjb25maWcgVElOWURSTV9NSVBJX0RCSQorCXRyaXN0YXRlCmRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vdGlueWRybS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL01h a2VmaWxlCmluZGV4IDc0NzZlZDEuLmZlNWQ0YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS90aW55ZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL01ha2VmaWxl CkBAIC0xICsxLDQgQEAKIG9iai0kKENPTkZJR19EUk1fVElOWURSTSkJCSs9IGNvcmUvCisKKyMg Q29udHJvbGxlcnMKK29iai0kKENPTkZJR19USU5ZRFJNX01JUElfREJJKQkJKz0gbWlwaS1kYmku bwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vbWlwaS1kYmkuYyBiL2RyaXZl cnMvZ3B1L2RybS90aW55ZHJtL21pcGktZGJpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uNWRlZDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS90aW55 ZHJtL21pcGktZGJpLmMKQEAgLTAsMCArMSwxMDA1IEBACisvKgorICogTUlQSSBEaXNwbGF5IEJ1 cyBJbnRlcmZhY2UgKERCSSkgTENEIGNvbnRyb2xsZXIgc3VwcG9ydAorICoKKyAqIENvcHlyaWdo dCAyMDE2IE5vcmFsZiBUcsO4bm5lcworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg Ki8KKworI2luY2x1ZGUgPGRybS90aW55ZHJtL21pcGktZGJpLmg+CisjaW5jbHVkZSA8ZHJtL3Rp bnlkcm0vdGlueWRybS1oZWxwZXJzLmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L2RtYS1idWYuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+ CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2Nv bnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorI2luY2x1ZGUgPHZpZGVvL21p cGlfZGlzcGxheS5oPgorCisjZGVmaW5lIE1JUElfREJJX01BWF9TUElfUkVBRF9TUEVFRCAyMDAw MDAwIC8qIDJNSHogKi8KKworI2RlZmluZSBEQ1NfUE9XRVJfTU9ERV9ESVNQTEFZCQkJQklUKDIp CisjZGVmaW5lIERDU19QT1dFUl9NT0RFX0RJU1BMQVlfTk9STUFMX01PREUJQklUKDMpCisjZGVm aW5lIERDU19QT1dFUl9NT0RFX1NMRUVQX01PREUJCUJJVCg0KQorI2RlZmluZSBEQ1NfUE9XRVJf TU9ERV9QQVJUSUFMX01PREUJCUJJVCg1KQorI2RlZmluZSBEQ1NfUE9XRVJfTU9ERV9JRExFX01P REUJCUJJVCg2KQorI2RlZmluZSBEQ1NfUE9XRVJfTU9ERV9SRVNFUlZFRF9NQVNLCQkoQklUKDAp IHwgQklUKDEpIHwgQklUKDcpKQorCisvKioKKyAqIERPQzogb3ZlcnZpZXcKKyAqCisgKiBUaGlz IGxpYnJhcnkgcHJvdmlkZXMgaGVscGVycyBmb3IgTUlQSSBEaXNwbGF5IEJ1cyBJbnRlcmZhY2Ug KERCSSkKKyAqIGNvbXBhdGlibGUgZGlzcGxheSBjb250cm9sbGVycy4KKyAqCisgKiBNYW55IGNv bnRyb2xsZXJzIGZvciB0aW55IGxjZCBkaXNwbGF5cyBhcmUgTUlQSSBjb21wbGlhbnQgYW5kIGNh biB1c2UgdGhpcworICogbGlicmFyeS4gSWYgYSBjb250cm9sbGVyIHVzZXMgcmVnaXN0ZXJzIDB4 MkEgYW5kIDB4MkIgdG8gc2V0IHRoZSBhcmVhIHRvCisgKiB1cGRhdGUgYW5kIHVzZXMgcmVnaXN0 ZXIgMHgyQyB0byB3cml0ZSB0byBmcmFtZSBtZW1vcnksIGl0IGlzIG1vc3QgbGlrZWx5CisgKiBN SVBJIGNvbXBsaWFudC4KKyAqCisgKiBPbmx5IE1JUEkgVHlwZSAxIGRpc3BsYXlzIGFyZSBzdXBw b3J0ZWQgc2luY2UgYSBmdWxsIGZyYW1lIG1lbW9yeSBpcyBuZWVkZWQuCisgKgorICogVGhlcmUg YXJlIDMgTUlQSSBEQkkgaW1wbGVtZW50YXRpb24gdHlwZXM6CisgKgorICogQS4gTW90b3JvbGEg NjgwMCB0eXBlIHBhcmFsbGVsIGJ1cworICoKKyAqIEIuIEludGVsIDgwODAgdHlwZSBwYXJhbGxl bCBidXMKKyAqCisgKiBDLiBTUEkgdHlwZSB3aXRoIDMgb3B0aW9uczoKKyAqCisgKiAgICAxLiA5 LWJpdCB3aXRoIHRoZSBEYXRhL0NvbW1hbmQgc2lnbmFsIGFzIHRoZSBuaW50aCBiaXQKKyAqICAg IDIuIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGl0J3Mgc2VudCBhcyAxNiBiaXRzCisgKiAgICAzLiA4 LWJpdCB3aXRoIHRoZSBEYXRhL0NvbW1hbmQgc2lnbmFsIGFzIGEgc2VwYXJhdGUgRC9DWCBwaW4K KyAqCisgKiBDdXJyZW50bHkgbWlwaV9kYmkgb25seSBzdXBwb3J0cyBUeXBlIEMgb3B0aW9ucyAx IGFuZCAzIHdpdGgKKyAqIG1pcGlfZGJpX3NwaV9pbml0KCkuCisgKi8KKworI2RlZmluZSBNSVBJ X0RCSV9ERUJVR19DT01NQU5EKGNtZCwgZGF0YSwgbGVuKSBcCisoeyBcCisJaWYgKCFsZW4pIFwK KwkJRFJNX0RFQlVHX0RSSVZFUigiY21kPSUwMnhcbiIsIGNtZCk7IFwKKwllbHNlIGlmIChsZW4g PD0gMzIpIFwKKwkJRFJNX0RFQlVHX0RSSVZFUigiY21kPSUwMngsIHBhcj0lKnBoXG4iLCBjbWQs IGxlbiwgZGF0YSk7IFwKKwllbHNlIFwKKwkJRFJNX0RFQlVHX0RSSVZFUigiY21kPSUwMngsIGxl bj0lenVcbiIsIGNtZCwgbGVuKTsgXAorfSkKKworc3RhdGljIGNvbnN0IHU4IG1pcGlfZGJpX2Rj c19yZWFkX2NvbW1hbmRzW10gPSB7CisJTUlQSV9EQ1NfR0VUX0RJU1BMQVlfSUQsCisJTUlQSV9E Q1NfR0VUX1JFRF9DSEFOTkVMLAorCU1JUElfRENTX0dFVF9HUkVFTl9DSEFOTkVMLAorCU1JUElf RENTX0dFVF9CTFVFX0NIQU5ORUwsCisJTUlQSV9EQ1NfR0VUX0RJU1BMQVlfU1RBVFVTLAorCU1J UElfRENTX0dFVF9QT1dFUl9NT0RFLAorCU1JUElfRENTX0dFVF9BRERSRVNTX01PREUsCisJTUlQ SV9EQ1NfR0VUX1BJWEVMX0ZPUk1BVCwKKwlNSVBJX0RDU19HRVRfRElTUExBWV9NT0RFLAorCU1J UElfRENTX0dFVF9TSUdOQUxfTU9ERSwKKwlNSVBJX0RDU19HRVRfRElBR05PU1RJQ19SRVNVTFQs CisJTUlQSV9EQ1NfUkVBRF9NRU1PUllfU1RBUlQsCisJTUlQSV9EQ1NfUkVBRF9NRU1PUllfQ09O VElOVUUsCisJTUlQSV9EQ1NfR0VUX1NDQU5MSU5FLAorCU1JUElfRENTX0dFVF9ESVNQTEFZX0JS SUdIVE5FU1MsCisJTUlQSV9EQ1NfR0VUX0NPTlRST0xfRElTUExBWSwKKwlNSVBJX0RDU19HRVRf UE9XRVJfU0FWRSwKKwlNSVBJX0RDU19HRVRfQ0FCQ19NSU5fQlJJR0hUTkVTUywKKwlNSVBJX0RD U19SRUFEX0REQl9TVEFSVCwKKwlNSVBJX0RDU19SRUFEX0REQl9DT05USU5VRSwKKwkwLCAvKiBz ZW50aW5lbCAqLworfTsKKworc3RhdGljIGJvb2wgbWlwaV9kYmlfY29tbWFuZF9pc19yZWFkKHN0 cnVjdCBtaXBpX2RiaSAqbWlwaSwgdTggY21kKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYg KCFtaXBpLT5yZWFkX2NvbW1hbmRzKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGkgPSAwOyBp IDwgMHhmZjsgaSsrKSB7CisJCWlmICghbWlwaS0+cmVhZF9jb21tYW5kc1tpXSkKKwkJCXJldHVy biBmYWxzZTsKKwkJaWYgKGNtZCA9PSBtaXBpLT5yZWFkX2NvbW1hbmRzW2ldKQorCQkJcmV0dXJu IHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKioKKyAqIG1pcGlfZGJpX2NvbW1h bmRfcmVhZCAtIE1JUEkgRENTIHJlYWQgY29tbWFuZAorICogQG1pcGk6IE1JUEkgc3RydWN0dXJl CisgKiBAY21kOiBDb21tYW5kCisgKiBAdmFsOiBWYWx1ZSByZWFkCisgKgorICogU2VuZCBNSVBJ IERDUyByZWFkIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCisgKgorICogUmV0dXJuczoKKyAq IFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitp bnQgbWlwaV9kYmlfY29tbWFuZF9yZWFkKHN0cnVjdCBtaXBpX2RiaSAqbWlwaSwgdTggY21kLCB1 OCAqdmFsKQoreworCWlmICghbWlwaS0+cmVhZF9jb21tYW5kcykKKwkJcmV0dXJuIC1FQUNDRVM7 CisKKwlpZiAoIW1pcGlfZGJpX2NvbW1hbmRfaXNfcmVhZChtaXBpLCBjbWQpKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCXJldHVybiBtaXBpX2RiaV9jb21tYW5kX2J1ZihtaXBpLCBjbWQsIHZhbCwg MSk7Cit9CitFWFBPUlRfU1lNQk9MKG1pcGlfZGJpX2NvbW1hbmRfcmVhZCk7CisKKy8qKgorICog bWlwaV9kYmlfY29tbWFuZF9idWYgLSBNSVBJIERDUyBjb21tYW5kIHdpdGggcGFyYW1ldGVyKHMp IGluIGFuIGFycmF5CisgKiBAbWlwaTogTUlQSSBzdHJ1Y3R1cmUKKyAqIEBjbWQ6IENvbW1hbmQK KyAqIEBkYXRhOiBQYXJhbWV0ZXIgYnVmZmVyCisgKiBAbGVuOiBCdWZmZXIgbGVuZ3RoCisgKgor ICogUmV0dXJuczoKKyAqIFplcm8gb24gc3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBm YWlsdXJlLgorICovCitpbnQgbWlwaV9kYmlfY29tbWFuZF9idWYoc3RydWN0IG1pcGlfZGJpICpt aXBpLCB1OCBjbWQsIHU4ICpkYXRhLCBzaXplX3QgbGVuKQoreworCWludCByZXQ7CisKKwltdXRl eF9sb2NrKCZtaXBpLT5jbWRsb2NrKTsKKwlyZXQgPSBtaXBpLT5jb21tYW5kKG1pcGksIGNtZCwg ZGF0YSwgbGVuKTsKKwltdXRleF91bmxvY2soJm1pcGktPmNtZGxvY2spOworCisJcmV0dXJuIHJl dDsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kYmlfY29tbWFuZF9idWYpOworCitzdGF0aWMgaW50 IG1pcGlfZGJpX2J1Zl9jb3B5KHZvaWQgKmRzdCwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIs CisJCQkJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXAsIGJvb2wgc3dhcCkKK3sKKwlzdHJ1Y3Qg ZHJtX2dlbV9jbWFfb2JqZWN0ICpjbWFfb2JqID0gZHJtX2ZiX2NtYV9nZXRfZ2VtX29iaihmYiwg MCk7CisJc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqaW1wb3J0X2F0dGFjaCA9IGNtYV9vYmot PmJhc2UuaW1wb3J0X2F0dGFjaDsKKwlzdHJ1Y3QgZHJtX2Zvcm1hdF9uYW1lX2J1ZiBmb3JtYXRf bmFtZTsKKwl2b2lkICpzcmMgPSBjbWFfb2JqLT52YWRkcjsKKwlpbnQgcmV0ID0gMDsKKworCWlm IChpbXBvcnRfYXR0YWNoKSB7CisJCXJldCA9IGRtYV9idWZfYmVnaW5fY3B1X2FjY2VzcyhpbXBv cnRfYXR0YWNoLT5kbWFidWYsCisJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOworCQlpZiAo cmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzd2l0Y2ggKGZiLT5mb3JtYXQtPmZvcm1hdCkg eworCWNhc2UgRFJNX0ZPUk1BVF9SR0I1NjU6CisJCWlmIChzd2FwKQorCQkJdGlueWRybV9zd2Fi MTYoZHN0LCBzcmMsIGZiLCBjbGlwKTsKKwkJZWxzZQorCQkJdGlueWRybV9tZW1jcHkoZHN0LCBz cmMsIGZiLCBjbGlwKTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fRk9STUFUX1hSR0I4ODg4OgorCQl0 aW55ZHJtX3hyZ2I4ODg4X3RvX3JnYjU2NShkc3QsIHNyYywgZmIsIGNsaXAsIHN3YXApOworCQli cmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyX29uY2UoZmItPmRldi0+ZGV2LCAiRm9ybWF0IGlz IG5vdCBzdXBwb3J0ZWQ6ICVzXG4iLAorCQkJICAgICBkcm1fZ2V0X2Zvcm1hdF9uYW1lKGZiLT5m b3JtYXQtPmZvcm1hdCwKKwkJCQkJCSAmZm9ybWF0X25hbWUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJaWYgKGltcG9ydF9hdHRhY2gpCisJCXJldCA9IGRtYV9idWZfZW5kX2NwdV9hY2Nl c3MoaW1wb3J0X2F0dGFjaC0+ZG1hYnVmLAorCQkJCQkgICAgIERNQV9GUk9NX0RFVklDRSk7CisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtaXBpX2RiaV9mYl9kaXJ0eShzdHJ1Y3QgZHJt X2ZyYW1lYnVmZmVyICpmYiwKKwkJCSAgICAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJ CQkgICAgIHVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IGNvbG9yLAorCQkJICAgICBz dHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHMsCisJCQkgICAgIHVuc2lnbmVkIGludCBudW1fY2xp cHMpCit7CisJc3RydWN0IGRybV9nZW1fY21hX29iamVjdCAqY21hX29iaiA9IGRybV9mYl9jbWFf Z2V0X2dlbV9vYmooZmIsIDApOworCXN0cnVjdCB0aW55ZHJtX2RldmljZSAqdGRldiA9IGZiLT5k ZXYtPmRldl9wcml2YXRlOworCXN0cnVjdCBtaXBpX2RiaSAqbWlwaSA9IG1pcGlfZGJpX2Zyb21f dGlueWRybSh0ZGV2KTsKKwlib29sIHN3YXAgPSBtaXBpLT5zd2FwX2J5dGVzOworCXN0cnVjdCBk cm1fY2xpcF9yZWN0IGNsaXA7CisJaW50IHJldCA9IDA7CisJYm9vbCBmdWxsOworCXZvaWQgKnRy OworCisJbXV0ZXhfbG9jaygmdGRldi0+ZGlydHlfbG9jayk7CisKKwlpZiAoIW1pcGktPmVuYWJs ZWQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCS8qIGZiZGV2IGNhbiBmbHVzaCBldmVuIHdoZW4g d2UncmUgbm90IGludGVyZXN0ZWQgKi8KKwlpZiAodGRldi0+cGlwZS5wbGFuZS5mYiAhPSBmYikK KwkJZ290byBvdXRfdW5sb2NrOworCisJZnVsbCA9IHRpbnlkcm1fbWVyZ2VfY2xpcHMoJmNsaXAs IGNsaXBzLCBudW1fY2xpcHMsIGZsYWdzLAorCQkJCSAgIGZiLT53aWR0aCwgZmItPmhlaWdodCk7 CisKKwlEUk1fREVCVUcoIkZsdXNoaW5nIFtGQjolZF0geDE9JXUsIHgyPSV1LCB5MT0ldSwgeTI9 JXVcbiIsIGZiLT5iYXNlLmlkLAorCQkgIGNsaXAueDEsIGNsaXAueDIsIGNsaXAueTEsIGNsaXAu eTIpOworCisJaWYgKCFtaXBpLT5kYyB8fCAhZnVsbCB8fCBzd2FwIHx8CisJICAgIGZiLT5mb3Jt YXQtPmZvcm1hdCA9PSBEUk1fRk9STUFUX1hSR0I4ODg4KSB7CisJCXRyID0gbWlwaS0+dHhfYnVm OworCQlyZXQgPSBtaXBpX2RiaV9idWZfY29weShtaXBpLT50eF9idWYsIGZiLCAmY2xpcCwgc3dh cCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dF91bmxvY2s7CisJfSBlbHNlIHsKKwkJdHIgPSBj bWFfb2JqLT52YWRkcjsKKwl9CisKKwltaXBpX2RiaV9jb21tYW5kKG1pcGksIE1JUElfRENTX1NF VF9DT0xVTU5fQUREUkVTUywKKwkJCSAoY2xpcC54MSA+PiA4KSAmIDB4RkYsIGNsaXAueDEgJiAw eEZGLAorCQkJIChjbGlwLngyID4+IDgpICYgMHhGRiwgKGNsaXAueDIgLSAxKSAmIDB4RkYpOwor CW1pcGlfZGJpX2NvbW1hbmQobWlwaSwgTUlQSV9EQ1NfU0VUX1BBR0VfQUREUkVTUywKKwkJCSAo Y2xpcC55MSA+PiA4KSAmIDB4RkYsIGNsaXAueTEgJiAweEZGLAorCQkJIChjbGlwLnkyID4+IDgp ICYgMHhGRiwgKGNsaXAueTIgLSAxKSAmIDB4RkYpOworCisJcmV0ID0gbWlwaV9kYmlfY29tbWFu ZF9idWYobWlwaSwgTUlQSV9EQ1NfV1JJVEVfTUVNT1JZX1NUQVJULCB0ciwKKwkJCQkoY2xpcC54 MiAtIGNsaXAueDEpICogKGNsaXAueTIgLSBjbGlwLnkxKSAqIDIpOworCitvdXRfdW5sb2NrOgor CW11dGV4X3VubG9jaygmdGRldi0+ZGlydHlfbG9jayk7CisKKwlpZiAocmV0KQorCQlkZXZfZXJy X29uY2UoZmItPmRldi0+ZGV2LCAiRmFpbGVkIHRvIHVwZGF0ZSBkaXNwbGF5ICVkXG4iLAorCQkJ ICAgICByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1f ZnJhbWVidWZmZXJfZnVuY3MgbWlwaV9kYmlfZmJfZnVuY3MgPSB7CisJLmRlc3Ryb3kJPSBkcm1f ZmJfY21hX2Rlc3Ryb3ksCisJLmNyZWF0ZV9oYW5kbGUJPSBkcm1fZmJfY21hX2NyZWF0ZV9oYW5k bGUsCisJLmRpcnR5CQk9IG1pcGlfZGJpX2ZiX2RpcnR5LAorfTsKKworLyoqCisgKiBtaXBpX2Ri aV9waXBlX2VuYWJsZSAtIE1JUEkgREJJIHBpcGUgZW5hYmxlIGhlbHBlcgorICogQHBpcGU6IERp c3BsYXkgcGlwZQorICogQGNydGNfc3RhdGU6IENSVEMgc3RhdGUKKyAqCisgKiBUaGlzIGZ1bmN0 aW9uIGVuYWJsZXMgYmFja2xpZ2h0LiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBhcyB0aGVpcgorICog JmRybV9zaW1wbGVfZGlzcGxheV9waXBlX2Z1bmNzLT5lbmFibGUgY2FsbGJhY2suCisgKi8KK3Zv aWQgbWlwaV9kYmlfcGlwZV9lbmFibGUoc3RydWN0IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpw aXBlLAorCQkJICBzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUpCit7CisJc3RydWN0 IHRpbnlkcm1fZGV2aWNlICp0ZGV2ID0gcGlwZV90b190aW55ZHJtKHBpcGUpOworCXN0cnVjdCBt aXBpX2RiaSAqbWlwaSA9IG1pcGlfZGJpX2Zyb21fdGlueWRybSh0ZGV2KTsKKwlzdHJ1Y3QgZHJt X2ZyYW1lYnVmZmVyICpmYiA9IHBpcGUtPnBsYW5lLmZiOworCisJRFJNX0RFQlVHX0tNUygiXG4i KTsKKworCW1pcGktPmVuYWJsZWQgPSB0cnVlOworCWlmIChmYikKKwkJZmItPmZ1bmNzLT5kaXJ0 eShmYiwgTlVMTCwgMCwgMCwgTlVMTCwgMCk7CisKKwl0aW55ZHJtX2VuYWJsZV9iYWNrbGlnaHQo bWlwaS0+YmFja2xpZ2h0KTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kYmlfcGlwZV9lbmFibGUp OworCitzdGF0aWMgdm9pZCBtaXBpX2RiaV9ibGFuayhzdHJ1Y3QgbWlwaV9kYmkgKm1pcGkpCit7 CisJc3RydWN0IGRybV9kZXZpY2UgKmRybSA9IG1pcGktPnRpbnlkcm0uZHJtOworCXUxNiBoZWln aHQgPSBkcm0tPm1vZGVfY29uZmlnLm1pbl9oZWlnaHQ7CisJdTE2IHdpZHRoID0gZHJtLT5tb2Rl X2NvbmZpZy5taW5fd2lkdGg7CisJc2l6ZV90IGxlbiA9IHdpZHRoICogaGVpZ2h0ICogMjsKKwor CW1lbXNldChtaXBpLT50eF9idWYsIDAsIGxlbik7CisKKwltaXBpX2RiaV9jb21tYW5kKG1pcGks IE1JUElfRENTX1NFVF9DT0xVTU5fQUREUkVTUywgMCwgMCwKKwkJCSAod2lkdGggPj4gOCkgJiAw eEZGLCAod2lkdGggLSAxKSAmIDB4RkYpOworCW1pcGlfZGJpX2NvbW1hbmQobWlwaSwgTUlQSV9E Q1NfU0VUX1BBR0VfQUREUkVTUywgMCwgMCwKKwkJCSAoaGVpZ2h0ID4+IDgpICYgMHhGRiwgKGhl aWdodCAtIDEpICYgMHhGRik7CisJbWlwaV9kYmlfY29tbWFuZF9idWYobWlwaSwgTUlQSV9EQ1Nf V1JJVEVfTUVNT1JZX1NUQVJULAorCQkJICAgICAodTggKiltaXBpLT50eF9idWYsIGxlbik7Cit9 CisKKy8qKgorICogbWlwaV9kYmlfcGlwZV9kaXNhYmxlIC0gTUlQSSBEQkkgcGlwZSBkaXNhYmxl IGhlbHBlcgorICogQHBpcGU6IERpc3BsYXkgcGlwZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gZGlz YWJsZXMgYmFja2xpZ2h0IGlmIHByZXNlbnQgb3IgaWYgbm90IHRoZQorICogZGlzcGxheSBtZW1v cnkgaXMgYmxhbmtlZC4gRHJpdmVycyBjYW4gdXNlIHRoaXMgYXMgdGhlaXIKKyAqICZkcm1fc2lt cGxlX2Rpc3BsYXlfcGlwZV9mdW5jcy0+ZGlzYWJsZSBjYWxsYmFjay4KKyAqLwordm9pZCBtaXBp X2RiaV9waXBlX2Rpc2FibGUoc3RydWN0IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpwaXBlKQor eworCXN0cnVjdCB0aW55ZHJtX2RldmljZSAqdGRldiA9IHBpcGVfdG9fdGlueWRybShwaXBlKTsK KwlzdHJ1Y3QgbWlwaV9kYmkgKm1pcGkgPSBtaXBpX2RiaV9mcm9tX3Rpbnlkcm0odGRldik7CisK KwlEUk1fREVCVUdfS01TKCJcbiIpOworCisJbWlwaS0+ZW5hYmxlZCA9IGZhbHNlOworCisJaWYg KG1pcGktPmJhY2tsaWdodCkKKwkJdGlueWRybV9kaXNhYmxlX2JhY2tsaWdodChtaXBpLT5iYWNr bGlnaHQpOworCWVsc2UKKwkJbWlwaV9kYmlfYmxhbmsobWlwaSk7Cit9CitFWFBPUlRfU1lNQk9M KG1pcGlfZGJpX3BpcGVfZGlzYWJsZSk7CisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBtaXBpX2Ri aV9mb3JtYXRzW10gPSB7CisJRFJNX0ZPUk1BVF9SR0I1NjUsCisJRFJNX0ZPUk1BVF9YUkdCODg4 OCwKK307CisKKy8qKgorICogbWlwaV9kYmlfaW5pdCAtIE1JUEkgREJJIGluaXRpYWxpemF0aW9u CisgKiBAZGV2OiBQYXJlbnQgZGV2aWNlCisgKiBAbWlwaTogJm1pcGlfZGJpIHN0cnVjdHVyZSB0 byBpbml0aWFsaXplCisgKiBAcGlwZV9mdW5jczogRGlzcGxheSBwaXBlIGZ1bmN0aW9ucworICog QGRyaXZlcjogRFJNIGRyaXZlcgorICogQG1vZGU6IERpc3BsYXkgbW9kZQorICogQHJvdGF0aW9u OiBJbml0aWFsIHJvdGF0aW9uIGluIGRlZ3JlZXMgQ291bnRlciBDbG9jayBXaXNlCisgKgorICog VGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBhICZtaXBpX2RiaSBzdHJ1Y3R1cmUgYW5kIGl0J3Mg dW5kZXJseWluZworICogQHRpbnlkcm1fZGV2aWNlLiBJdCBhbHNvIHNldHMgdXAgdGhlIGRpc3Bs YXkgcGlwZWxpbmUuCisgKgorICogU3VwcG9ydGVkIGZvcm1hdHM6IE5hdGl2ZSBSR0I1NjUgYW5k IGVtdWxhdGVkIFhSR0I4ODg4LgorICoKKyAqIE9iamVjdHMgY3JlYXRlZCBieSB0aGlzIGZ1bmN0 aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBmcmVlZCBvbiBkcml2ZXIKKyAqIGRldGFjaCAoZGV2 cmVzKS4KKyAqCisgKiBSZXR1cm5zOgorICogWmVybyBvbiBzdWNjZXNzLCBuZWdhdGl2ZSBlcnJv ciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK2ludCBtaXBpX2RiaV9pbml0KHN0cnVjdCBkZXZpY2Ug KmRldiwgc3RydWN0IG1pcGlfZGJpICptaXBpLAorCQkgIGNvbnN0IHN0cnVjdCBkcm1fc2ltcGxl X2Rpc3BsYXlfcGlwZV9mdW5jcyAqcGlwZV9mdW5jcywKKwkJICBzdHJ1Y3QgZHJtX2RyaXZlciAq ZHJpdmVyLAorCQkgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLCB1bnNpZ25l ZCBpbnQgcm90YXRpb24pCit7CisJc2l6ZV90IGJ1ZnNpemUgPSBtb2RlLT52ZGlzcGxheSAqIG1v ZGUtPmhkaXNwbGF5ICogc2l6ZW9mKHUxNik7CisJc3RydWN0IHRpbnlkcm1fZGV2aWNlICp0ZGV2 ID0gJm1pcGktPnRpbnlkcm07CisJaW50IHJldDsKKworCWlmICghbWlwaS0+Y29tbWFuZCkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9pbml0KCZtaXBpLT5jbWRsb2NrKTsKKworCW1pcGkt PnR4X2J1ZiA9IGRldm1fa21hbGxvYyhkZXYsIGJ1ZnNpemUsIEdGUF9LRVJORUwpOworCWlmICgh bWlwaS0+dHhfYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldCA9IGRldm1fdGlueWRybV9p bml0KGRldiwgdGRldiwgJm1pcGlfZGJpX2ZiX2Z1bmNzLCBkcml2ZXIpOworCWlmIChyZXQpCisJ CXJldHVybiByZXQ7CisKKwkvKiBUT0RPOiBNYXliZSBhZGQgRFJNX01PREVfQ09OTkVDVE9SX1NQ SSAqLworCXJldCA9IHRpbnlkcm1fZGlzcGxheV9waXBlX2luaXQodGRldiwgcGlwZV9mdW5jcywK KwkJCQkJRFJNX01PREVfQ09OTkVDVE9SX1ZJUlRVQUwsCisJCQkJCW1pcGlfZGJpX2Zvcm1hdHMs CisJCQkJCUFSUkFZX1NJWkUobWlwaV9kYmlfZm9ybWF0cyksIG1vZGUsCisJCQkJCXJvdGF0aW9u KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJdGRldi0+ZHJtLT5tb2RlX2NvbmZpZy5w cmVmZXJyZWRfZGVwdGggPSAxNjsKKwltaXBpLT5yb3RhdGlvbiA9IHJvdGF0aW9uOworCisJZHJt X21vZGVfY29uZmlnX3Jlc2V0KHRkZXYtPmRybSk7CisKKwlEUk1fREVCVUdfS01TKCJwcmVmZXJy ZWRfZGVwdGg9JXUsIHJvdGF0aW9uID0gJXVcbiIsCisJCSAgICAgIHRkZXYtPmRybS0+bW9kZV9j b25maWcucHJlZmVycmVkX2RlcHRoLCByb3RhdGlvbik7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9S VF9TWU1CT0wobWlwaV9kYmlfaW5pdCk7CisKKy8qKgorICogbWlwaV9kYmlfaHdfcmVzZXQgLSBI YXJkd2FyZSByZXNldCBvZiBjb250cm9sbGVyCisgKiBAbWlwaTogTUlQSSBEQkkgc3RydWN0dXJl CisgKgorICogUmVzZXQgY29udHJvbGxlciBpZiB0aGUgJm1pcGlfZGJpLT5yZXNldCBncGlvIGlz IHNldC4KKyAqLwordm9pZCBtaXBpX2RiaV9od19yZXNldChzdHJ1Y3QgbWlwaV9kYmkgKm1pcGkp Cit7CisJaWYgKCFtaXBpLT5yZXNldCkKKwkJcmV0dXJuOworCisJZ3Bpb2Rfc2V0X3ZhbHVlX2Nh bnNsZWVwKG1pcGktPnJlc2V0LCAwKTsKKwltc2xlZXAoMjApOworCWdwaW9kX3NldF92YWx1ZV9j YW5zbGVlcChtaXBpLT5yZXNldCwgMSk7CisJbXNsZWVwKDEyMCk7Cit9CitFWFBPUlRfU1lNQk9M KG1pcGlfZGJpX2h3X3Jlc2V0KTsKKworLyoqCisgKiBtaXBpX2RiaV9kaXNwbGF5X2lzX29uIC0g Q2hlY2sgaWYgZGlzcGxheSBpcyBvbgorICogQG1pcGk6IE1JUEkgREJJIHN0cnVjdHVyZQorICoK KyAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBQb3dlciBNb2RlIHJlZ2lzdGVyIChpZiByZWFk YWJsZSkgdG8gc2VlIGlmCisgKiBkaXNwbGF5IG91dHB1dCBpcyB0dXJuZWQgb24uIFRoaXMgY2Fu IGJlIHVzZWQgdG8gc2VlIGlmIHRoZSBib290bG9hZGVyCisgKiBoYXMgYWxyZWFkeSB0dXJuZWQg b24gdGhlIGRpc3BsYXkgYXZvaWRpbmcgZmxpY2tlciB3aGVuIHRoZSBwaXBlbGluZSBpcworICog ZW5hYmxlZC4KKyAqCisgKiBSZXR1cm5zOgorICogdHJ1ZSBpZiB0aGUgZGlzcGxheSBjYW4gYmUg dmVyaWZpZWQgdG8gYmUgb24sIGZhbHNlIG90aGVyd2lzZS4KKyAqLworYm9vbCBtaXBpX2RiaV9k aXNwbGF5X2lzX29uKHN0cnVjdCBtaXBpX2RiaSAqbWlwaSkKK3sKKwl1OCB2YWw7CisKKwlpZiAo bWlwaV9kYmlfY29tbWFuZF9yZWFkKG1pcGksIE1JUElfRENTX0dFVF9QT1dFUl9NT0RFLCAmdmFs KSkKKwkJcmV0dXJuIGZhbHNlOworCisJdmFsICY9IH5EQ1NfUE9XRVJfTU9ERV9SRVNFUlZFRF9N QVNLOworCisJaWYgKHZhbCAhPSAoRENTX1BPV0VSX01PREVfRElTUExBWSB8CisJICAgIERDU19Q T1dFUl9NT0RFX0RJU1BMQVlfTk9STUFMX01PREUgfCBEQ1NfUE9XRVJfTU9ERV9TTEVFUF9NT0RF KSkKKwkJcmV0dXJuIGZhbHNlOworCisJRFJNX0RFQlVHX0RSSVZFUigiRGlzcGxheSBpcyBPTlxu Iik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0wobWlwaV9kYmlfZGlzcGxheV9p c19vbik7CisKKyNpZmRlZiBDT05GSUdfU1BJCisKKy8qCisgKiBNYW55IGNvbnRyb2xsZXJzIGhh dmUgYSBtYXggc3BlZWQgb2YgMTBNSHosIGJ1dCBjYW4gYmUgcHVzaGVkIHdheSBiZXlvbmQKKyAq IHRoYXQuIEluY3JlYXNlIHJlbGlhYmlsaXR5IGJ5IHJ1bm5pbmcgcGl4ZWwgZGF0YSBhdCBtYXgg c3BlZWQgYW5kIHRoZSByZXN0CisgKiBhdCAxME1IeiwgcHJldmVudGluZyB0cmFuc2ZlciBnbGl0 Y2hlcyBmcm9tIG1lc3NpbmcgdXAgdGhlIGluaXQgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyB1MzIg bWlwaV9kYmlfc3BpX2NtZF9tYXhfc3BlZWQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc2l6ZV90 IGxlbikKK3sKKwlpZiAobGVuID4gNjQpCisJCXJldHVybiAwOyAvKiB1c2UgZGVmYXVsdCAqLwor CisJcmV0dXJuIG1pbl90KHUzMiwgMTAwMDAwMDAsIHNwaS0+bWF4X3NwZWVkX2h6KTsKK30KKwor LyoKKyAqIE1JUEkgREJJIFR5cGUgQyBPcHRpb24gMQorICoKKyAqIElmIHRoZSBTUEkgY29udHJv bGxlciBkb2Vzbid0IGhhdmUgOSBiaXRzIHBlciB3b3JkIHN1cHBvcnQsCisgKiB1c2UgYmxvY2tz IG9mIDkgYnl0ZXMgdG8gc2VuZCA4eCA5LWJpdCB3b3JkcyB1c2luZyBhIDgtYml0IFNQSSB0cmFu c2Zlci4KKyAqIFBhZCBwYXJ0aWFsIGJsb2NrcyB3aXRoIE1JUElfRENTX05PUCAoemVybykuCisg KiBUaGlzIGlzIGhvdyB0aGUgRC9DIGJpdCAoeCkgaXMgYWRkZWQ6CisgKiAgICAgeDc2NTQzMjEK KyAqICAgICAweDc2NTQzMgorICogICAgIDEweDc2NTQzCisgKiAgICAgMjEweDc2NTQKKyAqICAg ICAzMjEweDc2NQorICogICAgIDQzMjEweDc2CisgKiAgICAgNTQzMjEweDcKKyAqICAgICA2NTQz MjEweAorICogICAgIDc2NTQzMjEwCisgKi8KKworc3RhdGljIGludCBtaXBpX2RiaV9zcGkxZV90 cmFuc2ZlcihzdHJ1Y3QgbWlwaV9kYmkgKm1pcGksIGludCBkYywKKwkJCQkgICBjb25zdCB2b2lk ICpidWYsIHNpemVfdCBsZW4sCisJCQkJICAgdW5zaWduZWQgaW50IGJwdykKK3sKKwlib29sIHN3 YXBfYnl0ZXMgPSAoYnB3ID09IDE2ICYmIHRpbnlkcm1fbWFjaGluZV9saXR0bGVfZW5kaWFuKCkp OworCXNpemVfdCBjaHVuaywgbWF4X2NodW5rID0gbWlwaS0+dHhfYnVmOV9sZW47CisJc3RydWN0 IHNwaV9kZXZpY2UgKnNwaSA9IG1pcGktPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRyID0g eworCQkudHhfYnVmID0gbWlwaS0+dHhfYnVmOSwKKwkJLmJpdHNfcGVyX3dvcmQgPSA4LAorCX07 CisJc3RydWN0IHNwaV9tZXNzYWdlIG07CisJY29uc3QgdTggKnNyYyA9IGJ1ZjsKKwlpbnQgaSwg cmV0OworCXU4ICpkc3Q7CisKKwlpZiAoZHJtX2RlYnVnICYgRFJNX1VUX0RSSVZFUikKKwkJcHJf ZGVidWcoIltkcm06JXNdIGRjPSVkLCBtYXhfY2h1bms9JXp1LCB0cmFuc2ZlcnM6XG4iLAorCQkJ IF9fZnVuY19fLCBkYywgbWF4X2NodW5rKTsKKworCXRyLnNwZWVkX2h6ID0gbWlwaV9kYmlfc3Bp X2NtZF9tYXhfc3BlZWQoc3BpLCBsZW4pOworCXNwaV9tZXNzYWdlX2luaXRfd2l0aF90cmFuc2Zl cnMoJm0sICZ0ciwgMSk7CisKKwlpZiAoIWRjKSB7CisJCWlmIChXQVJOX09OX09OQ0UobGVuICE9 IDEpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogQ29tbWFuZDogcGFkIG5vLW9wJ3MgKHpl cm9lcykgYXQgYmVnaW5uaW5nIG9mIGJsb2NrICovCisJCWRzdCA9IG1pcGktPnR4X2J1Zjk7CisJ CW1lbXNldChkc3QsIDAsIDkpOworCQlkc3RbOF0gPSAqc3JjOworCQl0ci5sZW4gPSA5OworCisJ CXRpbnlkcm1fZGJnX3NwaV9tZXNzYWdlKHNwaSwgJm0pOworCisJCXJldHVybiBzcGlfc3luYyhz cGksICZtKTsKKwl9CisKKwkvKiBtYXggd2l0aCByb29tIGZvciBhZGRpbmcgb25lIGJpdCBwZXIg Ynl0ZSAqLworCW1heF9jaHVuayA9IG1heF9jaHVuayAvIDkgKiA4OworCS8qIGJ1dCBubyBiaWdn ZXIgdGhhbiBsZW4gKi8KKwltYXhfY2h1bmsgPSBtaW4obWF4X2NodW5rLCBsZW4pOworCS8qIDgg Ynl0ZSBibG9ja3MgKi8KKwltYXhfY2h1bmsgPSBtYXhfdChzaXplX3QsIDgsIG1heF9jaHVuayAm IH4weDcpOworCisJd2hpbGUgKGxlbikgeworCQlzaXplX3QgYWRkZWQgPSAwOworCisJCWNodW5r ID0gbWluKGxlbiwgbWF4X2NodW5rKTsKKwkJbGVuIC09IGNodW5rOworCQlkc3QgPSBtaXBpLT50 eF9idWY5OworCisJCWlmIChjaHVuayA8IDgpIHsKKwkJCXU4IHZhbCwgY2FycnkgPSAwOworCisJ CQkvKiBEYXRhOiBwYWQgbm8tb3AncyAoemVyb2VzKSBhdCBlbmQgb2YgYmxvY2sgKi8KKwkJCW1l bXNldChkc3QsIDAsIDkpOworCisJCQlpZiAoc3dhcF9ieXRlcykgeworCQkJCWZvciAoaSA9IDE7 IGkgPCAoY2h1bmsgKyAxKTsgaSsrKSB7CisJCQkJCXZhbCA9IHNyY1sxXTsKKwkJCQkJKmRzdCsr ID0gY2FycnkgfCBCSVQoOCAtIGkpIHwgKHZhbCA+PiBpKTsKKwkJCQkJY2FycnkgPSB2YWwgPDwg KDggLSBpKTsKKwkJCQkJaSsrOworCQkJCQl2YWwgPSBzcmNbMF07CisJCQkJCSpkc3QrKyA9IGNh cnJ5IHwgQklUKDggLSBpKSB8ICh2YWwgPj4gaSk7CisJCQkJCWNhcnJ5ID0gdmFsIDw8ICg4IC0g aSk7CisJCQkJCXNyYyArPSAyOworCQkJCX0KKwkJCQkqZHN0KysgPSBjYXJyeTsKKwkJCX0gZWxz ZSB7CisJCQkJZm9yIChpID0gMTsgaSA8IChjaHVuayArIDEpOyBpKyspIHsKKwkJCQkJdmFsID0g KnNyYysrOworCQkJCQkqZHN0KysgPSBjYXJyeSB8IEJJVCg4IC0gaSkgfCAodmFsID4+IGkpOwor CQkJCQljYXJyeSA9IHZhbCA8PCAoOCAtIGkpOworCQkJCX0KKwkJCQkqZHN0KysgPSBjYXJyeTsK KwkJCX0KKworCQkJY2h1bmsgPSA4OworCQkJYWRkZWQgPSAxOworCQl9IGVsc2UgeworCQkJZm9y IChpID0gMDsgaSA8IGNodW5rOyBpICs9IDgpIHsKKwkJCQlpZiAoc3dhcF9ieXRlcykgeworCQkJ CQkqZHN0KysgPSAgICAgICAgICAgICAgICAgQklUKDcpIHwgKHNyY1sxXSA+PiAxKTsKKwkJCQkJ KmRzdCsrID0gKHNyY1sxXSA8PCA3KSB8IEJJVCg2KSB8IChzcmNbMF0gPj4gMik7CisJCQkJCSpk c3QrKyA9IChzcmNbMF0gPDwgNikgfCBCSVQoNSkgfCAoc3JjWzNdID4+IDMpOworCQkJCQkqZHN0 KysgPSAoc3JjWzNdIDw8IDUpIHwgQklUKDQpIHwgKHNyY1syXSA+PiA0KTsKKwkJCQkJKmRzdCsr ID0gKHNyY1syXSA8PCA0KSB8IEJJVCgzKSB8IChzcmNbNV0gPj4gNSk7CisJCQkJCSpkc3QrKyA9 IChzcmNbNV0gPDwgMykgfCBCSVQoMikgfCAoc3JjWzRdID4+IDYpOworCQkJCQkqZHN0KysgPSAo c3JjWzRdIDw8IDIpIHwgQklUKDEpIHwgKHNyY1s3XSA+PiA3KTsKKwkJCQkJKmRzdCsrID0gKHNy Y1s3XSA8PCAxKSB8IEJJVCgwKTsKKwkJCQkJKmRzdCsrID0gc3JjWzZdOworCQkJCX0gZWxzZSB7 CisJCQkJCSpkc3QrKyA9ICAgICAgICAgICAgICAgICBCSVQoNykgfCAoc3JjWzBdID4+IDEpOwor CQkJCQkqZHN0KysgPSAoc3JjWzBdIDw8IDcpIHwgQklUKDYpIHwgKHNyY1sxXSA+PiAyKTsKKwkJ CQkJKmRzdCsrID0gKHNyY1sxXSA8PCA2KSB8IEJJVCg1KSB8IChzcmNbMl0gPj4gMyk7CisJCQkJ CSpkc3QrKyA9IChzcmNbMl0gPDwgNSkgfCBCSVQoNCkgfCAoc3JjWzNdID4+IDQpOworCQkJCQkq ZHN0KysgPSAoc3JjWzNdIDw8IDQpIHwgQklUKDMpIHwgKHNyY1s0XSA+PiA1KTsKKwkJCQkJKmRz dCsrID0gKHNyY1s0XSA8PCAzKSB8IEJJVCgyKSB8IChzcmNbNV0gPj4gNik7CisJCQkJCSpkc3Qr KyA9IChzcmNbNV0gPDwgMikgfCBCSVQoMSkgfCAoc3JjWzZdID4+IDcpOworCQkJCQkqZHN0Kysg PSAoc3JjWzZdIDw8IDEpIHwgQklUKDApOworCQkJCQkqZHN0KysgPSBzcmNbN107CisJCQkJfQor CisJCQkJc3JjICs9IDg7CisJCQkJYWRkZWQrKzsKKwkJCX0KKwkJfQorCisJCXRyLmxlbiA9IGNo dW5rICsgYWRkZWQ7CisKKwkJdGlueWRybV9kYmdfc3BpX21lc3NhZ2Uoc3BpLCAmbSk7CisJCXJl dCA9IHNwaV9zeW5jKHNwaSwgJm0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9Owor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWlwaV9kYmlfc3BpMV90cmFuc2ZlcihzdHJ1 Y3QgbWlwaV9kYmkgKm1pcGksIGludCBkYywKKwkJCQkgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90 IGxlbiwKKwkJCQkgIHVuc2lnbmVkIGludCBicHcpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNw aSA9IG1pcGktPnNwaTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRyID0geworCQkuYml0c19wZXJf d29yZCA9IDksCisJfTsKKwljb25zdCB1MTYgKnNyYzE2ID0gYnVmOworCWNvbnN0IHU4ICpzcmM4 ID0gYnVmOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCXNpemVfdCBtYXhfY2h1bms7CisJdTE2 ICpkc3QxNjsKKwlpbnQgcmV0OworCisJaWYgKCF0aW55ZHJtX3NwaV9icHdfc3VwcG9ydGVkKHNw aSwgOSkpCisJCXJldHVybiBtaXBpX2RiaV9zcGkxZV90cmFuc2ZlcihtaXBpLCBkYywgYnVmLCBs ZW4sIGJwdyk7CisKKwl0ci5zcGVlZF9oeiA9IG1pcGlfZGJpX3NwaV9jbWRfbWF4X3NwZWVkKHNw aSwgbGVuKTsKKwltYXhfY2h1bmsgPSBtaXBpLT50eF9idWY5X2xlbjsKKwlkc3QxNiA9IG1pcGkt PnR4X2J1Zjk7CisKKwlpZiAoZHJtX2RlYnVnICYgRFJNX1VUX0RSSVZFUikKKwkJcHJfZGVidWco Iltkcm06JXNdIGRjPSVkLCBtYXhfY2h1bms9JXp1LCB0cmFuc2ZlcnM6XG4iLAorCQkJIF9fZnVu Y19fLCBkYywgbWF4X2NodW5rKTsKKworCW1heF9jaHVuayA9IG1pbihtYXhfY2h1bmsgLyAyLCBs ZW4pOworCisJc3BpX21lc3NhZ2VfaW5pdF93aXRoX3RyYW5zZmVycygmbSwgJnRyLCAxKTsKKwl0 ci50eF9idWYgPSBkc3QxNjsKKworCXdoaWxlIChsZW4pIHsKKwkJc2l6ZV90IGNodW5rID0gbWlu KGxlbiwgbWF4X2NodW5rKTsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJaWYgKGJwdyA9PSAxNiAm JiB0aW55ZHJtX21hY2hpbmVfbGl0dGxlX2VuZGlhbigpKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwg KGNodW5rICogMik7IGkgKz0gMikgeworCQkJCWRzdDE2W2ldICAgICA9ICpzcmMxNiA+PiA4Owor CQkJCWRzdDE2W2kgKyAxXSA9ICpzcmMxNisrICYgMHhGRjsKKwkJCQlpZiAoZGMpIHsKKwkJCQkJ ZHN0MTZbaV0gICAgIHw9IDB4MDEwMDsKKwkJCQkJZHN0MTZbaSArIDFdIHw9IDB4MDEwMDsKKwkJ CQl9CisJCQl9CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgY2h1bms7IGkrKykgewor CQkJCWRzdDE2W2ldID0gKnNyYzgrKzsKKwkJCQlpZiAoZGMpCisJCQkJCWRzdDE2W2ldIHw9IDB4 MDEwMDsKKwkJCX0KKwkJfQorCisJCXRyLmxlbiA9IGNodW5rOworCQlsZW4gLT0gY2h1bms7CisK KwkJdGlueWRybV9kYmdfc3BpX21lc3NhZ2Uoc3BpLCAmbSk7CisJCXJldCA9IHNwaV9zeW5jKHNw aSwgJm0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9OworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbnQgbWlwaV9kYmlfdHlwZWMxX2NvbW1hbmQoc3RydWN0IG1pcGlfZGJpICpt aXBpLCB1OCBjbWQsCisJCQkJICAgdTggKnBhcmFtZXRlcnMsIHNpemVfdCBudW0pCit7CisJdW5z aWduZWQgaW50IGJwdyA9IChjbWQgPT0gTUlQSV9EQ1NfV1JJVEVfTUVNT1JZX1NUQVJUKSA/IDE2 IDogODsKKwlpbnQgcmV0OworCisJaWYgKG1pcGlfZGJpX2NvbW1hbmRfaXNfcmVhZChtaXBpLCBj bWQpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJTUlQSV9EQklfREVCVUdfQ09NTUFORChjbWQs IHBhcmFtZXRlcnMsIG51bSk7CisKKwlyZXQgPSBtaXBpX2RiaV9zcGkxX3RyYW5zZmVyKG1pcGks IDAsICZjbWQsIDEsIDgpOworCWlmIChyZXQgfHwgIW51bSkKKwkJcmV0dXJuIHJldDsKKworCXJl dHVybiBtaXBpX2RiaV9zcGkxX3RyYW5zZmVyKG1pcGksIDEsIHBhcmFtZXRlcnMsIG51bSwgYnB3 KTsKK30KKworLyogTUlQSSBEQkkgVHlwZSBDIE9wdGlvbiAzICovCisKK3N0YXRpYyBpbnQgbWlw aV9kYmlfdHlwZWMzX2NvbW1hbmRfcmVhZChzdHJ1Y3QgbWlwaV9kYmkgKm1pcGksIHU4IGNtZCwK KwkJCQkJdTggKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9 IG1pcGktPnNwaTsKKwl1MzIgc3BlZWRfaHogPSBtaW5fdCh1MzIsIE1JUElfREJJX01BWF9TUElf UkVBRF9TUEVFRCwKKwkJCSAgICAgc3BpLT5tYXhfc3BlZWRfaHogLyAyKTsKKwlzdHJ1Y3Qgc3Bp X3RyYW5zZmVyIHRyWzJdID0geworCQl7CisJCQkuc3BlZWRfaHogPSBzcGVlZF9oeiwKKwkJCS50 eF9idWYgPSAmY21kLAorCQkJLmxlbiA9IDEsCisJCX0sIHsKKwkJCS5zcGVlZF9oeiA9IHNwZWVk X2h6LAorCQkJLmxlbiA9IGxlbiwKKwkJfSwKKwl9OworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwor CXU4ICpidWY7CisJaW50IHJldDsKKworCWlmICghbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CS8qCisJICogU3VwcG9ydCBub24tc3RhbmRhcmQgMjQtYml0IGFuZCAzMi1iaXQgTm9raWEgcmVh ZCBjb21tYW5kcyB3aGljaAorCSAqIHN0YXJ0IHdpdGggYSBkdW1teSBjbG9jaywgc28gd2UgbmVl ZCB0byByZWFkIGFuIGV4dHJhIGJ5dGUuCisJICovCisJaWYgKGNtZCA9PSBNSVBJX0RDU19HRVRf RElTUExBWV9JRCB8fAorCSAgICBjbWQgPT0gTUlQSV9EQ1NfR0VUX0RJU1BMQVlfU1RBVFVTKSB7 CisJCWlmICghKGxlbiA9PSAzIHx8IGxlbiA9PSA0KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJ CXRyWzFdLmxlbiA9IGxlbiArIDE7CisJfQorCisJYnVmID0ga21hbGxvYyh0clsxXS5sZW4sIEdG UF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRyWzFdLnJ4X2J1 ZiA9IGJ1ZjsKKwlncGlvZF9zZXRfdmFsdWVfY2Fuc2xlZXAobWlwaS0+ZGMsIDApOworCisJc3Bp X21lc3NhZ2VfaW5pdF93aXRoX3RyYW5zZmVycygmbSwgdHIsIEFSUkFZX1NJWkUodHIpKTsKKwly ZXQgPSBzcGlfc3luYyhzcGksICZtKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9mcmVlOworCisJ dGlueWRybV9kYmdfc3BpX21lc3NhZ2Uoc3BpLCAmbSk7CisKKwlpZiAodHJbMV0ubGVuID09IGxl bikgeworCQltZW1jcHkoZGF0YSwgYnVmLCBsZW4pOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGlu dCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWRhdGFbaV0gPSAoYnVmW2ld IDw8IDEpIHwgISEoYnVmW2kgKyAxXSAmIEJJVCg3KSk7CisJfQorCisJTUlQSV9EQklfREVCVUdf Q09NTUFORChjbWQsIGRhdGEsIGxlbik7CisKK2Vycl9mcmVlOgorCWtmcmVlKGJ1Zik7CisKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1pcGlfZGJpX3R5cGVjM19jb21tYW5kKHN0cnVj dCBtaXBpX2RiaSAqbWlwaSwgdTggY21kLAorCQkJCSAgIHU4ICpwYXIsIHNpemVfdCBudW0pCit7 CisJc3RydWN0IHNwaV9kZXZpY2UgKnNwaSA9IG1pcGktPnNwaTsKKwl1bnNpZ25lZCBpbnQgYnB3 ID0gODsKKwl1MzIgc3BlZWRfaHo7CisJaW50IHJldDsKKworCWlmIChtaXBpX2RiaV9jb21tYW5k X2lzX3JlYWQobWlwaSwgY21kKSkKKwkJcmV0dXJuIG1pcGlfZGJpX3R5cGVjM19jb21tYW5kX3Jl YWQobWlwaSwgY21kLCBwYXIsIG51bSk7CisKKwlNSVBJX0RCSV9ERUJVR19DT01NQU5EKGNtZCwg cGFyLCBudW0pOworCisJZ3Bpb2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKG1pcGktPmRjLCAwKTsKKwlz cGVlZF9oeiA9IG1pcGlfZGJpX3NwaV9jbWRfbWF4X3NwZWVkKHNwaSwgMSk7CisJcmV0ID0gdGlu eWRybV9zcGlfdHJhbnNmZXIoc3BpLCBzcGVlZF9oeiwgTlVMTCwgOCwgJmNtZCwgMSk7CisJaWYg KHJldCB8fCAhbnVtKQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNtZCA9PSBNSVBJX0RDU19XUklU RV9NRU1PUllfU1RBUlQgJiYgIW1pcGktPnN3YXBfYnl0ZXMpCisJCWJwdyA9IDE2OworCisJZ3Bp b2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKG1pcGktPmRjLCAxKTsKKwlzcGVlZF9oeiA9IG1pcGlfZGJp X3NwaV9jbWRfbWF4X3NwZWVkKHNwaSwgbnVtKTsKKworCXJldHVybiB0aW55ZHJtX3NwaV90cmFu c2ZlcihzcGksIHNwZWVkX2h6LCBOVUxMLCBicHcsIHBhciwgbnVtKTsKK30KKworLyoqCisgKiBt aXBpX2RiaV9zcGlfaW5pdCAtIEluaXRpYWxpemUgTUlQSSBEQkkgU1BJIGludGVyZmFjZWQgY29u dHJvbGxlcgorICogQHNwaTogU1BJIGRldmljZQorICogQGRjOiBEL0MgZ3BpbyAob3B0aW9uYWwp CisgKiBAbWlwaTogJm1pcGlfZGJpIHN0cnVjdHVyZSB0byBpbml0aWFsaXplCisgKiBAcGlwZV9m dW5jczogRGlzcGxheSBwaXBlIGZ1bmN0aW9ucworICogQGRyaXZlcjogRFJNIGRyaXZlcgorICog QG1vZGU6IERpc3BsYXkgbW9kZQorICogQHJvdGF0aW9uOiBJbml0aWFsIHJvdGF0aW9uIGluIGRl Z3JlZXMgQ291bnRlciBDbG9jayBXaXNlCisgKgorICogVGhpcyBmdW5jdGlvbiBzZXRzICZtaXBp X2RiaS0+Y29tbWFuZCwgZW5hYmxlcyAmbWlwaS0+cmVhZF9jb21tYW5kcyBmb3IgdGhlCisgKiB1 c3VhbCByZWFkIGNvbW1hbmRzIGFuZCBpbml0aWFsaXplcyBAbWlwaSB1c2luZyBtaXBpX2RiaV9p bml0KCkuCisgKgorICogSWYgQGRjIGlzIHNldCwgYSBUeXBlIEMgT3B0aW9uIDMgaW50ZXJmYWNl IGlzIGFzc3VtZWQsIGlmIG5vdAorICogVHlwZSBDIE9wdGlvbiAxLgorICoKKyAqIElmIHRoZSBT UEkgbWFzdGVyIGRyaXZlciBkb2Vzbid0IHN1cHBvcnQgdGhlIG5lY2Vzc2FyeSBiaXRzIHBlciB3 b3JkLAorICogdGhlIGZvbGxvd2luZyB0cmFuc2Zvcm1hdGlvbiBpcyB1c2VkOgorICoKKyAqIC0g OS1iaXQ6IHJlb3JkZXIgYnVmZmVyIGFzIDl4IDgtYml0IHdvcmRzLCBwYWRkZWQgd2l0aCBuby1v cCBjb21tYW5kLgorICogLSAxNi1iaXQ6IGlmIGJpZyBlbmRpYW4gc2VuZCBhcyA4LWJpdCwgaWYg bGl0dGxlIGVuZGlhbiBzd2FwIGJ5dGVzCisgKgorICogUmV0dXJuczoKKyAqIFplcm8gb24gc3Vj Y2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitpbnQgbWlwaV9kYmlf c3BpX2luaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSwgc3RydWN0IG1pcGlfZGJpICptaXBpLAor CQkgICAgICBzdHJ1Y3QgZ3Bpb19kZXNjICpkYywKKwkJICAgICAgY29uc3Qgc3RydWN0IGRybV9z aW1wbGVfZGlzcGxheV9waXBlX2Z1bmNzICpwaXBlX2Z1bmNzLAorCQkgICAgICBzdHJ1Y3QgZHJt X2RyaXZlciAqZHJpdmVyLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZSwKKwkJICAgICAgdW5zaWduZWQgaW50IHJvdGF0aW9uKQoreworCXNpemVfdCB0eF9zaXpl ID0gdGlueWRybV9zcGlfbWF4X3RyYW5zZmVyX3NpemUoc3BpLCAwKTsKKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmc3BpLT5kZXY7CisJaW50IHJldDsKKworCWlmICh0eF9zaXplIDwgMTYpIHsKKwkJ RFJNX0VSUk9SKCJTUEkgdHJhbnNtaXQgYnVmZmVyIHRvbyBzbWFsbDogJXp1XG4iLCB0eF9zaXpl KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBFdmVuIHRob3VnaCBpdCdzIG5v dCB0aGUgU1BJIGRldmljZSB0aGF0IGRvZXMgRE1BICh0aGUgbWFzdGVyIGRvZXMpLAorCSAqIHRo ZSBkbWEgbWFzayBpcyBuZWNlc3NhcnkgZm9yIHRoZSBkbWFfYWxsb2Nfd2MoKSBpbgorCSAqIGRy bV9nZW1fY21hX2NyZWF0ZSgpLiBUaGUgZG1hX2FkZHIgcmV0dXJuZWQgd2lsbCBiZSBhIHBoeXNp Y2FsCisJICogYWRkZHJlc3Mgd2hpY2ggbWlnaHQgYmUgZGlmZmVyZW50IGZyb20gdGhlIGJ1cyBh ZGRyZXNzLCBidXQgdGhpcyBpcworCSAqIG5vdCBhIHByb2JsZW0gc2luY2UgdGhlIGFkZHJlc3Mg d2lsbCBub3QgYmUgdXNlZC4KKwkgKiBUaGUgdmlydHVhbCBhZGRyZXNzIGlzIHVzZWQgaW4gdGhl IHRyYW5zZmVyIGFuZCB0aGUgU1BJIGNvcmUKKwkgKiByZS1tYXBzIGl0IG9uIHRoZSBTUEkgbWFz dGVyIGRldmljZSB1c2luZyB0aGUgRE1BIHN0cmVhbWluZyBBUEkKKwkgKiAoc3BpX21hcF9idWYo KSkuCisJICovCisJaWYgKCFkZXYtPmNvaGVyZW50X2RtYV9tYXNrKSB7CisJCXJldCA9IGRtYV9j b2VyY2VfbWFza19hbmRfY29oZXJlbnQoZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwkJaWYgKHJl dCkgeworCQkJZGV2X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHNldCBkbWEgbWFzayAlZFxuIiwgcmV0 KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwltaXBpLT5zcGkgPSBzcGk7CisJbWlwaS0+ cmVhZF9jb21tYW5kcyA9IG1pcGlfZGJpX2Rjc19yZWFkX2NvbW1hbmRzOworCisJaWYgKGRjKSB7 CisJCW1pcGktPmNvbW1hbmQgPSBtaXBpX2RiaV90eXBlYzNfY29tbWFuZDsKKwkJbWlwaS0+ZGMg PSBkYzsKKwkJaWYgKHRpbnlkcm1fbWFjaGluZV9saXR0bGVfZW5kaWFuKCkgJiYKKwkJICAgICF0 aW55ZHJtX3NwaV9icHdfc3VwcG9ydGVkKHNwaSwgMTYpKQorCQkJbWlwaS0+c3dhcF9ieXRlcyA9 IHRydWU7CisJfSBlbHNlIHsKKwkJbWlwaS0+Y29tbWFuZCA9IG1pcGlfZGJpX3R5cGVjMV9jb21t YW5kOworCQltaXBpLT50eF9idWY5X2xlbiA9IHR4X3NpemU7CisJCW1pcGktPnR4X2J1ZjkgPSBk ZXZtX2ttYWxsb2MoZGV2LCB0eF9zaXplLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtaXBpLT50eF9i dWY5KQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIG1pcGlfZGJpX2luaXQoZGV2 LCBtaXBpLCBwaXBlX2Z1bmNzLCBkcml2ZXIsIG1vZGUsIHJvdGF0aW9uKTsKK30KK0VYUE9SVF9T WU1CT0wobWlwaV9kYmlfc3BpX2luaXQpOworCisjZW5kaWYgLyogQ09ORklHX1NQSSAqLworCisj aWZkZWYgQ09ORklHX0RFQlVHX0ZTCisKK3N0YXRpYyBzc2l6ZV90IG1pcGlfZGJpX2RlYnVnZnNf Y29tbWFuZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgY29uc3QgY2hhciBf X3VzZXIgKnVidWYsCisJCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQorewor CXN0cnVjdCBzZXFfZmlsZSAqbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbWlwaV9k YmkgKm1pcGkgPSBtLT5wcml2YXRlOworCXU4IHZhbCwgY21kLCBwYXJhbWV0ZXJzWzY0XTsKKwlj aGFyICpidWYsICpwb3MsICp0b2tlbjsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJ YnVmID0gbWVtZHVwX3VzZXJfbnVsKHVidWYsIGNvdW50KTsKKwlpZiAoSVNfRVJSKGJ1ZikpCisJ CXJldHVybiBQVFJfRVJSKGJ1Zik7CisKKwkvKiBzdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlICov CisJZm9yIChpID0gY291bnQgLSAxOyBpID4gMDsgaS0tKQorCQlpZiAoaXNzcGFjZShidWZbaV0p KQorCQkJYnVmW2ldID0gJ1wwJzsKKwkJZWxzZQorCQkJYnJlYWs7CisJaSA9IDA7CisJcG9zID0g YnVmOworCXdoaWxlIChwb3MpIHsKKwkJdG9rZW4gPSBzdHJzZXAoJnBvcywgIiAiKTsKKwkJaWYg KCF0b2tlbikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyX2ZyZWU7CisJCX0KKwor CQlyZXQgPSBrc3RydG91OCh0b2tlbiwgMTYsICZ2YWwpOworCQlpZiAocmV0IDwgMCkKKwkJCWdv dG8gZXJyX2ZyZWU7CisKKwkJaWYgKHRva2VuID09IGJ1ZikKKwkJCWNtZCA9IHZhbDsKKwkJZWxz ZQorCQkJcGFyYW1ldGVyc1tpKytdID0gdmFsOworCisJCWlmIChpID09IDY0KSB7CisJCQlyZXQg PSAtRTJCSUc7CisJCQlnb3RvIGVycl9mcmVlOworCQl9CisJfQorCisJcmV0ID0gbWlwaV9kYmlf Y29tbWFuZF9idWYobWlwaSwgY21kLCBwYXJhbWV0ZXJzLCBpKTsKKworZXJyX2ZyZWU6CisJa2Zy ZWUoYnVmKTsKKworCXJldHVybiByZXQgPCAwID8gcmV0IDogY291bnQ7Cit9CisKK3N0YXRpYyBp bnQgbWlwaV9kYmlfZGVidWdmc19jb21tYW5kX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lk ICp1bnVzZWQpCit7CisJc3RydWN0IG1pcGlfZGJpICptaXBpID0gbS0+cHJpdmF0ZTsKKwl1OCBj bWQsIHZhbFs0XTsKKwlzaXplX3QgbGVuLCBpOworCWludCByZXQ7CisKKwlmb3IgKGNtZCA9IDA7 IGNtZCA8IDI1NTsgY21kKyspIHsKKwkJaWYgKCFtaXBpX2RiaV9jb21tYW5kX2lzX3JlYWQobWlw aSwgY21kKSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgTUlQSV9E Q1NfUkVBRF9NRU1PUllfU1RBUlQ6CisJCWNhc2UgTUlQSV9EQ1NfUkVBRF9NRU1PUllfQ09OVElO VUU6CisJCQlsZW4gPSAyOworCQkJYnJlYWs7CisJCWNhc2UgTUlQSV9EQ1NfR0VUX0RJU1BMQVlf SUQ6CisJCQlsZW4gPSAzOworCQkJYnJlYWs7CisJCWNhc2UgTUlQSV9EQ1NfR0VUX0RJU1BMQVlf U1RBVFVTOgorCQkJbGVuID0gNDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbGVuID0gMTsK KwkJCWJyZWFrOworCQl9CisKKwkJc2VxX3ByaW50ZihtLCAiJTAyeDogIiwgY21kKTsKKwkJcmV0 ID0gbWlwaV9kYmlfY29tbWFuZF9idWYobWlwaSwgY21kLCB2YWwsIGxlbik7CisJCWlmIChyZXQp IHsKKwkJCXNlcV9wdXRzKG0sICJYWFxuIik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAo aSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXNlcV9wcmludGYobSwgIiUwMngiLCB2YWxbaV0pOwor CQlzZXFfcHV0cyhtLCAiXG4iKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBt aXBpX2RiaV9kZWJ1Z2ZzX2NvbW1hbmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCQkg c3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIG1pcGlfZGJp X2RlYnVnZnNfY29tbWFuZF9zaG93LAorCQkJICAgaW5vZGUtPmlfcHJpdmF0ZSk7Cit9CisKK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG1pcGlfZGJpX2RlYnVnZnNfY29tbWFu ZF9mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gbWlwaV9kYmlfZGVi dWdmc19jb21tYW5kX29wZW4sCisJLnJlYWQgPSBzZXFfcmVhZCwKKwkubGxzZWVrID0gc2VxX2xz ZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCisJLndyaXRlID0gbWlwaV9kYmlfZGVi dWdmc19jb21tYW5kX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faW5mb19s aXN0IG1pcGlfZGJpX2RlYnVnZnNfbGlzdFtdID0geworCXsgImZiIiwgICBkcm1fZmJfY21hX2Rl YnVnZnNfc2hvdywgMCB9LAorfTsKKworLyoqCisgKiBtaXBpX2RiaV9kZWJ1Z2ZzX2luaXQgLSBD cmVhdGUgZGVidWdmcyBlbnRyaWVzCisgKiBAbWlub3I6IERSTSBtaW5vcgorICoKKyAqIFRoaXMg ZnVuY3Rpb24gY3JlYXRlcyBhICdjb21tYW5kJyBkZWJ1Z2ZzIGZpbGUgZm9yIHNlbmRpbmcgY29t bWFuZHMgdG8gdGhlCisgKiBjb250cm9sbGVyIG9yIGdldHRpbmcgdGhlIHJlYWQgY29tbWFuZCB2 YWx1ZXMuCisgKiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBhcyB0aGVpciAmZHJtX2RyaXZlci0+ZGVi dWdmc19pbml0IGNhbGxiYWNrLgorICoKKyAqIFJldHVybnM6CisgKiBaZXJvIG9uIHN1Y2Nlc3Ms IG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLworaW50IG1pcGlfZGJpX2RlYnVn ZnNfaW5pdChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcikKK3sKKwlzdHJ1Y3QgdGlueWRybV9kZXZp Y2UgKnRkZXYgPSBtaW5vci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwlzdHJ1Y3QgbWlwaV9kYmkgKm1p cGkgPSBtaXBpX2RiaV9mcm9tX3Rpbnlkcm0odGRldik7CisJdW1vZGVfdCBtb2RlID0gU19JRlJF RyB8IFNfSVdVU1I7CisKKwlpZiAobWlwaS0+cmVhZF9jb21tYW5kcykKKwkJbW9kZSB8PSBTX0lS VUdPOworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImNvbW1hbmQiLCBtb2RlLCBtaW5vci0+ZGVidWdm c19yb290LCBtaXBpLAorCQkJICAgICZtaXBpX2RiaV9kZWJ1Z2ZzX2NvbW1hbmRfZm9wcyk7CisK KwlyZXR1cm4gZHJtX2RlYnVnZnNfY3JlYXRlX2ZpbGVzKG1pcGlfZGJpX2RlYnVnZnNfbGlzdCwK KwkJCQkJQVJSQVlfU0laRShtaXBpX2RiaV9kZWJ1Z2ZzX2xpc3QpLAorCQkJCQltaW5vci0+ZGVi dWdmc19yb290LCBtaW5vcik7Cit9CitFWFBPUlRfU1lNQk9MKG1pcGlfZGJpX2RlYnVnZnNfaW5p dCk7CisKKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9pbmNs dWRlL2RybS90aW55ZHJtL21pcGktZGJpLmggYi9pbmNsdWRlL2RybS90aW55ZHJtL21pcGktZGJp LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzN2IxNgotLS0gL2Rldi9u dWxsCisrKyBiL2luY2x1ZGUvZHJtL3Rpbnlkcm0vbWlwaS1kYmkuaApAQCAtMCwwICsxLDEwNyBA QAorLyoKKyAqIE1JUEkgRGlzcGxheSBCdXMgSW50ZXJmYWNlIChEQkkpIExDRCBjb250cm9sbGVy IHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNiBOb3JhbGYgVHLDuG5uZXMKKyAqCisgKiBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9NSVBJX0RCSV9I CisjZGVmaW5lIF9fTElOVVhfTUlQSV9EQklfSAorCisjaW5jbHVkZSA8ZHJtL3Rpbnlkcm0vdGlu eWRybS5oPgorCitzdHJ1Y3Qgc3BpX2RldmljZTsKK3N0cnVjdCBncGlvX2Rlc2M7CitzdHJ1Y3Qg cmVndWxhdG9yOworCisvKioKKyAqIHN0cnVjdCBtaXBpX2RiaSAtIE1JUEkgREJJIGNvbnRyb2xs ZXIKKyAqIEB0aW55ZHJtOiB0aW55ZHJtIGJhc2UKKyAqIEBzcGk6IFNQSSBkZXZpY2UKKyAqIEBl bmFibGVkOiBQaXBlbGluZSBpcyBlbmFibGVkCisgKiBAY21kbG9jazogQ29tbWFuZCBsb2NrCisg KiBAY29tbWFuZDogQnVzIHNwZWNpZmljIGNhbGxiYWNrIGV4ZWN1dGluZyBjb21tYW5kcy4KKyAq IEByZWFkX2NvbW1hbmRzOiBBcnJheSBvZiByZWFkIGNvbW1hbmRzIHRlcm1pbmF0ZWQgYnkgYSB6 ZXJvIGVudHJ5LgorICogICAgICAgICAgICAgICAgIFJlYWRpbmcgaXMgZGlzYWJsZWQgaWYgdGhp cyBpcyBOVUxMLgorICogQGRjOiBPcHRpb25hbCBEL0MgZ3Bpby4KKyAqIEB0eF9idWY6IEJ1ZmZl ciB1c2VkIGZvciB0cmFuc2ZlciAoY29weSBjbGlwIHJlY3QgYXJlYSkKKyAqIEB0eF9idWY5OiBC dWZmZXIgdXNlZCBmb3IgT3B0aW9uIDEgOS1iaXQgY29udmVyc2lvbgorICogQHR4X2J1ZjlfbGVu OiBTaXplIG9mIHR4X2J1ZjkuCisgKiBAc3dhcF9ieXRlczogU3dhcCBieXRlcyBpbiBidWZmZXIg YmVmb3JlIHRyYW5zZmVyCisgKiBAcmVzZXQ6IE9wdGlvbmFsIHJlc2V0IGdwaW8KKyAqIEByb3Rh dGlvbjogaW5pdGlhbCByb3RhdGlvbiBpbiBkZWdyZWVzIENvdW50ZXIgQ2xvY2sgV2lzZQorICog QGJhY2tsaWdodDogYmFja2xpZ2h0IGRldmljZSAob3B0aW9uYWwpCisgKiBAcmVndWxhdG9yOiBw b3dlciByZWd1bGF0b3IgKG9wdGlvbmFsKQorICovCitzdHJ1Y3QgbWlwaV9kYmkgeworCXN0cnVj dCB0aW55ZHJtX2RldmljZSB0aW55ZHJtOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGk7CisJYm9v bCBlbmFibGVkOworCXN0cnVjdCBtdXRleCBjbWRsb2NrOworCWludCAoKmNvbW1hbmQpKHN0cnVj dCBtaXBpX2RiaSAqbWlwaSwgdTggY21kLCB1OCAqcGFyYW0sIHNpemVfdCBudW0pOworCWNvbnN0 IHU4ICpyZWFkX2NvbW1hbmRzOworCXN0cnVjdCBncGlvX2Rlc2MgKmRjOworCXUxNiAqdHhfYnVm OworCXZvaWQgKnR4X2J1Zjk7CisJc2l6ZV90IHR4X2J1ZjlfbGVuOworCWJvb2wgc3dhcF9ieXRl czsKKwlzdHJ1Y3QgZ3Bpb19kZXNjICpyZXNldDsKKwl1bnNpZ25lZCBpbnQgcm90YXRpb247CisJ c3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJhY2tsaWdodDsKKwlzdHJ1Y3QgcmVndWxhdG9yICpy ZWd1bGF0b3I7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBtaXBpX2RiaSAqCittaXBpX2Ri aV9mcm9tX3Rpbnlkcm0oc3RydWN0IHRpbnlkcm1fZGV2aWNlICp0ZGV2KQoreworCXJldHVybiBj b250YWluZXJfb2YodGRldiwgc3RydWN0IG1pcGlfZGJpLCB0aW55ZHJtKTsKK30KKworaW50IG1p cGlfZGJpX3NwaV9pbml0KHN0cnVjdCBzcGlfZGV2aWNlICpzcGksIHN0cnVjdCBtaXBpX2RiaSAq bWlwaSwKKwkJICAgICAgc3RydWN0IGdwaW9fZGVzYyAqZGMsCisJCSAgICAgIGNvbnN0IHN0cnVj dCBkcm1fc2ltcGxlX2Rpc3BsYXlfcGlwZV9mdW5jcyAqcGlwZV9mdW5jcywKKwkJICAgICAgc3Ry dWN0IGRybV9kcml2ZXIgKmRyaXZlciwKKwkJICAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUsCisJCSAgICAgIHVuc2lnbmVkIGludCByb3RhdGlvbik7CitpbnQgbWlwaV9k YmlfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBtaXBpX2RiaSAqbWlwaSwKKwkJICBj b25zdCBzdHJ1Y3QgZHJtX3NpbXBsZV9kaXNwbGF5X3BpcGVfZnVuY3MgKnBpcGVfZnVuY3MsCisJ CSAgc3RydWN0IGRybV9kcml2ZXIgKmRyaXZlciwKKwkJICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZSwgdW5zaWduZWQgaW50IHJvdGF0aW9uKTsKK3ZvaWQgbWlwaV9kYmlfcGlw ZV9lbmFibGUoc3RydWN0IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpwaXBlLAorCQkJICBzdHJ1 Y3QgZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGUpOwordm9pZCBtaXBpX2RiaV9waXBlX2Rpc2Fi bGUoc3RydWN0IGRybV9zaW1wbGVfZGlzcGxheV9waXBlICpwaXBlKTsKK3ZvaWQgbWlwaV9kYmlf aHdfcmVzZXQoc3RydWN0IG1pcGlfZGJpICptaXBpKTsKK2Jvb2wgbWlwaV9kYmlfZGlzcGxheV9p c19vbihzdHJ1Y3QgbWlwaV9kYmkgKm1pcGkpOworCitpbnQgbWlwaV9kYmlfY29tbWFuZF9yZWFk KHN0cnVjdCBtaXBpX2RiaSAqbWlwaSwgdTggY21kLCB1OCAqdmFsKTsKK2ludCBtaXBpX2RiaV9j b21tYW5kX2J1ZihzdHJ1Y3QgbWlwaV9kYmkgKm1pcGksIHU4IGNtZCwgdTggKmRhdGEsIHNpemVf dCBsZW4pOworCisvKioKKyAqIG1pcGlfZGJpX2NvbW1hbmQgLSBNSVBJIERDUyBjb21tYW5kIHdp dGggb3B0aW9uYWwgcGFyYW1ldGVyKHMpCisgKiBAbWlwaTogTUlQSSBzdHJ1Y3R1cmUKKyAqIEBj bWQ6IENvbW1hbmQKKyAqIEBzZXEuLi46IE9wdGlvbmFsIHBhcmFtZXRlcihzKQorICoKKyAqIFNl bmQgTUlQSSBEQ1MgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4gVXNlIG1pcGlfZGJpX2NvbW1h bmRfcmVhZCgpIGZvcgorICogZ2V0L3JlYWQuCisgKgorICogUmV0dXJuczoKKyAqIFplcm8gb24g c3VjY2VzcywgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCisjZGVmaW5lIG1p cGlfZGJpX2NvbW1hbmQobWlwaSwgY21kLCBzZXEuLi4pIFwKKyh7IFwKKwl1OCBkW10gPSB7IHNl cSB9OyBcCisJbWlwaV9kYmlfY29tbWFuZF9idWYobWlwaSwgY21kLCBkLCBBUlJBWV9TSVpFKGQp KTsgXAorfSkKKworI2lmZGVmIENPTkZJR19ERUJVR19GUworaW50IG1pcGlfZGJpX2RlYnVnZnNf aW5pdChzdHJ1Y3QgZHJtX21pbm9yICptaW5vcik7CisjZWxzZQorI2RlZmluZSBtaXBpX2RiaV9k ZWJ1Z2ZzX2luaXQJCU5VTEwKKyNlbmRpZgorCisjZW5kaWYgLyogX19MSU5VWF9NSVBJX0RCSV9I ICovCi0tIAoyLjEwLjIKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1k ZXZlbAo=