From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Noralf=20Tr=C3=B8nnes?= Subject: [RFC 3/5] drm/tinydrm/lcdreg: Add SPI support Date: Wed, 16 Mar 2016 14:34:17 +0100 Message-ID: <1458135259-31050-4-git-send-email-noralf@tronnes.org> References: <1458135259-31050-1-git-send-email-noralf@tronnes.org> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from asav22.altibox.net (asav22.altibox.net [109.247.116.9]) by gabe.freedesktop.org (Postfix) with ESMTPS id D9A3A6E92C for ; Wed, 16 Mar 2016 13:40:55 +0000 (UTC) In-Reply-To: <1458135259-31050-1-git-send-email-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 Cc: thomas.petazzoni@free-electrons.com List-Id: dri-devel@lists.freedesktop.org QWRkIFNQSSBidXMgc3VwcG9ydCB0byBsY2RyZWcuClN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgcHJv dG9jb2xzOgotIE1JUEkgREJJIHR5cGUgQyBpbnRlcmZhY2Ugb3B0aW9uIDEgKDMtd2lyZSkgYW5k IG9wdGlvbiAzICg0LXdpcmUpLgotIE9wdGlvbiAzIGFsc28gZml0cyBzb21lIGNvbnRyb2xsZXJz IHdoZXJlIGFsbCByZWdpc3RlcnMgYXJlIDE2LWJpdC4KLSA4LzE2LWJpdCByZWdpc3RlciB0cmFu c2ZlcnMgdGhhdCBuZWVkIHRvIHN0YXJ0IHdpdGggYSBzcGVjaWFsIHN0YXJ0Ynl0ZS4KCkl0IGFs c28gc3VwcG9ydHMgZW11bGF0aW9uIGZvciAxNiBhbmQgOS1iaXQgd29yZHMgaWYgdGhlIFNQSSBj b250cm9sbGVyCmRvZXNuJ3Qgc3VwcG9ydCBpdC4KClNpZ25lZC1vZmYtYnk6IE5vcmFsZiBUcsO4 bm5lcyA8bm9yYWxmQHRyb25uZXMub3JnPgotLS0KIGRyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2xj ZHJlZy9LY29uZmlnICAgICAgfCAgIDUgKwogZHJpdmVycy9ncHUvZHJtL3Rpbnlkcm0vbGNkcmVn L01ha2VmaWxlICAgICB8ICAgMiArCiBkcml2ZXJzL2dwdS9kcm0vdGlueWRybS9sY2RyZWcvbGNk cmVnLXNwaS5jIHwgNzIwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvZHJt L3Rpbnlkcm0vbGNkcmVnLXNwaS5oICAgICAgICAgICAgfCAgNjMgKysrCiA0IGZpbGVzIGNoYW5n ZWQsIDc5MCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJt L3Rpbnlkcm0vbGNkcmVnL2xjZHJlZy1zcGkuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUv ZHJtL3Rpbnlkcm0vbGNkcmVnLXNwaS5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Rp bnlkcm0vbGNkcmVnL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9sY2RyZWcvS2Nv bmZpZwppbmRleCA0MTM4M2IxLi5hZGU0NjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0v dGlueWRybS9sY2RyZWcvS2NvbmZpZworKysgYi9kcml2ZXJzL2dwdS9kcm0vdGlueWRybS9sY2Ry ZWcvS2NvbmZpZwpAQCAtMSwzICsxLDggQEAKIGNvbmZpZyBMQ0RSRUcKIAl0cmlzdGF0ZQogCWRl cGVuZHMgb24gR1BJT0xJQiB8fCBDT01QSUxFX1RFU1QKKworY29uZmlnIExDRFJFR19TUEkKKwl0 cmlzdGF0ZQorCWRlcGVuZHMgb24gU1BJCisJc2VsZWN0IExDRFJFRwpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3Rpbnlkcm0vbGNkcmVnL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3Rp bnlkcm0vbGNkcmVnL01ha2VmaWxlCmluZGV4IGM5ZWE3NzQuLjRlMTQ1NzEgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2xjZHJlZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dw dS9kcm0vdGlueWRybS9sY2RyZWcvTWFrZWZpbGUKQEAgLTEsMyArMSw1IEBACiBvYmotJChDT05G SUdfTENEUkVHKSAgICAgICAgICAgICAgICAgICArPSBsY2RyZWcubwogbGNkcmVnLXkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKz0gbGNkcmVnLWNvcmUubwogbGNkcmVnLSQoQ09ORklH X0RFQlVHX0ZTKSAgICAgICAgICAgICAgKz0gbGNkcmVnLWRlYnVnZnMubworCitvYmotJChDT05G SUdfTENEUkVHX1NQSSkgICAgICAgICAgICAgICArPSBsY2RyZWctc3BpLm8KZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS90aW55ZHJtL2xjZHJlZy9sY2RyZWctc3BpLmMgYi9kcml2ZXJzL2dw dS9kcm0vdGlueWRybS9sY2RyZWcvbGNkcmVnLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjVlOWQ4ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJt L3Rpbnlkcm0vbGNkcmVnL2xjZHJlZy1zcGkuYwpAQCAtMCwwICsxLDcyMCBAQAorLy8jZGVmaW5l IFZFUkJPU0VfREVCVUcKKy8vI2RlZmluZSBERUJVRworLyoKKyAqIENvcHlyaWdodCAoQykgMjAx NiBOb3JhbGYgVHLDuG5uZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAq IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisK KyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisjaW5jbHVkZSA8ZHJtL3Rpbnlkcm0vbGNkcmVn LXNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNl Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlv Lmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2tl cm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+ CisjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgorCitzdGF0aWMgdW5zaWduZWQgdHhsZW47Citt b2R1bGVfcGFyYW0odHhsZW4sIHVpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh0eGxlbiwgIlRy YW5zbWl0IGNodW5rIGxlbmd0aCIpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBicHdtOworbW9k dWxlX3BhcmFtKGJwd20sIHVsb25nLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYnB3bSwgIk92ZXJy aWRlIFNQSSBtYXN0ZXIgYml0c19wZXJfd29yZF9tYXNrIik7CisKK3N0cnVjdCBsY2RyZWdfc3Bp IHsKKwlzdHJ1Y3QgbGNkcmVnIHJlZzsKKwllbnVtIGxjZHJlZ19zcGlfbW9kZSBtb2RlOwordW5z aWduZWQgdHhidWZsZW47CisJdm9pZCAqdHhidWZfZGM7CisJdW5zaWduZWQgaWQ7CisJdTMyIHF1 aXJrczsKKwl1OCAoKnN0YXJ0Ynl0ZSkoc3RydWN0IGxjZHJlZyAqcmVnLCBzdHJ1Y3QgbGNkcmVn X3RyYW5zZmVyICp0ciwKKwkJCWJvb2wgcmVhZCk7CisJc3RydWN0IGdwaW9fZGVzYyAqZGM7CisJ c3RydWN0IGdwaW9fZGVzYyAqcmVzZXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsY2Ry ZWdfc3BpICp0b19sY2RyZWdfc3BpKHN0cnVjdCBsY2RyZWcgKnJlZykKK3sKKwlyZXR1cm4gcmVn ID8gY29udGFpbmVyX29mKHJlZywgc3RydWN0IGxjZHJlZ19zcGksIHJlZykgOiBOVUxMOworfQor CisjaWZkZWYgVkVSQk9TRV9ERUJVRworc3RhdGljIHZvaWQgbGNkcmVnX3ZkYmdfZHVtcF9zcGko Y29uc3Qgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc3BpX21lc3NhZ2UgKm0sIHU4ICpzdGFy dGJ5dGUpCit7CisJc3RydWN0IHNwaV90cmFuc2ZlciAqdG1wOworCXN0cnVjdCBsaXN0X2hlYWQg KnBvczsKKwlpbnQgaSA9IDA7CisKKwlpZiAoc3RhcnRieXRlKQorCQlkZXZfZGJnKGRldiwgInNw aV9tZXNzYWdlOiBzdGFydGJ5dGU9MHglMDJYXG4iLCBzdGFydGJ5dGVbMF0pOworCWVsc2UKKwkJ ZGV2X2RiZyhkZXYsICJzcGlfbWVzc2FnZTpcbiIpOworCisJbGlzdF9mb3JfZWFjaChwb3MsICZt LT50cmFuc2ZlcnMpIHsKKwkJdG1wID0gbGlzdF9lbnRyeShwb3MsIHN0cnVjdCBzcGlfdHJhbnNm ZXIsIHRyYW5zZmVyX2xpc3QpOworCQlpZiAodG1wLT50eF9idWYpCisJCQlwcl9kZWJ1ZygiICAg IHRyJWk6IGJwdz0laSwgbGVuPSV1LCB0eF9idWYoJXApPVslKnBoXVxuIiwgaSwgdG1wLT5iaXRz X3Blcl93b3JkLCB0bXAtPmxlbiwgdG1wLT50eF9idWYsIHRtcC0+bGVuID4gNjQgPyA2NCA6IHRt cC0+bGVuLCB0bXAtPnR4X2J1Zik7CisJCWlmICh0bXAtPnJ4X2J1ZikKKwkJCXByX2RlYnVnKCIg ICAgdHIlaTogYnB3PSVpLCBsZW49JXUsIHJ4X2J1ZiglcCk9WyUqcGhdXG4iLCBpLCB0bXAtPmJp dHNfcGVyX3dvcmQsIHRtcC0+bGVuLCB0bXAtPnJ4X2J1ZiwgdG1wLT5sZW4gPiA2NCA/IDY0IDog dG1wLT5sZW4sIHRtcC0+cnhfYnVmKTsKKwkJaSsrOworCX0KK30KKyNlbHNlCitzdGF0aWMgdm9p ZCBsY2RyZWdfdmRiZ19kdW1wX3NwaShjb25zdCBzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBz cGlfbWVzc2FnZSAqbSwgdTggKnN0YXJ0Ynl0ZSkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgaW50 IGxjZHJlZ19zcGlfZG9fdHJhbnNmZXIoc3RydWN0IGxjZHJlZyAqcmVnLAorCQkJCSAgc3RydWN0 IGxjZHJlZ190cmFuc2ZlciAqdHJhbnNmZXIpCit7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNkZXYg PSB0b19zcGlfZGV2aWNlKHJlZy0+ZGV2KTsKKwlzdHJ1Y3QgbGNkcmVnX3NwaSAqc3BpID0gdG9f bGNkcmVnX3NwaShyZWcpOworCXZvaWQgKmJ1ZiA9IHRyYW5zZmVyLT5idWY7CisJc2l6ZV90IGxl biA9IHRyYW5zZmVyLT5jb3VudCAqIGxjZHJlZ19ieXRlc19wZXJfd29yZCh0cmFuc2Zlci0+d2lk dGgpOworCXNpemVfdCBtYXggPSB0eGxlbiA/IDogc2Rldi0+bWFzdGVyLT5tYXhfZG1hX2xlbjsK KwlzaXplX3Qgcm9vbV9sZWZ0X2luX3BhZ2UgPSBQQUdFX1NJWkUgLSBvZmZzZXRfaW5fcGFnZShi dWYpOworCXNpemVfdCBjaHVuayA9IG1pbl90KHNpemVfdCwgbGVuLCBtYXgpOworCXN0cnVjdCBz cGlfbWVzc2FnZSBtOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgKnRyOworCXU4ICpzdGFydGJ1ZiA9 IE5VTEw7CisJaW50IHJldCwgaTsKKworCWRldl9kYmcocmVnLT5kZXYsICIlczogaW5kZXg9JXUs IGNvdW50PSV1LCB3aWR0aD0ldVxuIiwKKwkJX19mdW5jX18sIHRyYW5zZmVyLT5pbmRleCwgdHJh bnNmZXItPmNvdW50LCB0cmFuc2Zlci0+d2lkdGgpOworCWxjZHJlZ19kYmdfdHJhbnNmZXJfYnVm KHRyYW5zZmVyKTsKKworCXRyID0ga3phbGxvYygyICogc2l6ZW9mKCp0ciksIEdGUF9LRVJORUwp OworCWlmICghdHIpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogc2xvdyBkb3duIGNvbW1hbmRz PyAqLworCWlmICghdHJhbnNmZXItPmluZGV4ICYmIChzcGktPnF1aXJrcyAmIExDRFJFR19TTE9X X0lOREVYMF9XUklURSkpCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCQl0cltpXS5zcGVl ZF9oeiA9IG1pbl90KHUzMiwgMjAwMDAwMCwKKwkJCQkJICAgICAgIHNkZXYtPm1heF9zcGVlZF9o eiAvIDIpOworCisJaWYgKHNwaS0+bW9kZSA9PSBMQ0RSRUdfU1BJX1NUQVJUQllURSkgeworCQlz dGFydGJ1ZiA9IGttYWxsb2MoMSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc3RhcnRidWYpIHsKKwkJ CXJldCA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQorCQkqc3RhcnRidWYgPSBzcGktPnN0 YXJ0Ynl0ZShyZWcsIHRyYW5zZmVyLCBmYWxzZSk7CisJfQorCisJLyoKKwkgKiB0cmFuc2Zlci0+ YnVmIGNhbiBiZSB1bmFsaWduZWQgdG8gdGhlIHBhZ2UgYm91bmRhcnkgZm9yIHBhcnRpYWwKKwkg KiB1cGRhdGVzIHdoZW4gdmlkZW9tZW0gaXMgc2VudCBkaXJlY3RseSAobm8gYnVmZmVyaW5nKS4K KwkgKiBTcGkgY29yZSBjYW4gc2cgbWFwIHRoZSBidWZmZXIgZm9yIGRtYSBhbmQgcmVsaWVzIG9u IHZtYWxsb2MnZWQKKwkgKiBtZW1vcnkgdG8gYmUgcGFnZSBhbGlnbmVkLgorCSAqLworLy9wcl9k ZWJ1ZygiJXM6IFBBR0VfQUxJR05FRD0lZCwgbGVuID4gcm9vbV9sZWZ0X2luX3BhZ2U9ICVkID4g JWQgPSAlZCwgY2h1bms9JXp1XG4iLCBfX2Z1bmNfXywgUEFHRV9BTElHTkVEKGJ1ZiksIGxlbiwg cm9vbV9sZWZ0X2luX3BhZ2UsIGxlbiA+IHJvb21fbGVmdF9pbl9wYWdlLCBjaHVuayk7CisJaWYg KCFQQUdFX0FMSUdORUQoYnVmKSAmJiBsZW4gPiByb29tX2xlZnRfaW5fcGFnZSkgeworLy9zaXpl X3QgY2h1bmswID0gY2h1bms7CisKKwkJaWYgKGNodW5rID49IHJvb21fbGVmdF9pbl9wYWdlKSB7 CisJCQljaHVuayA9IHJvb21fbGVmdF9pbl9wYWdlOworLy9wcl9kZWJ1ZygiJXM6IGNodW5rOiAl enUgLT4gJXp1LCByb29tX2xlZnRfaW5fcGFnZT0lenVcblxuIiwgX19mdW5jX18sIGNodW5rMCwg Y2h1bmssIHJvb21fbGVmdF9pbl9wYWdlKTsKKwkJfSBlbHNlIHsKKwkJCWNodW5rID0gcm9vbV9s ZWZ0X2luX3BhZ2UgJSBjaHVuayA/IDogY2h1bms7CisvL3ByX2RlYnVnKCIlczogY2h1bms6ICV6 dSAtPiAlenUsIHJvb21fbGVmdF9pbl9wYWdlPSV6dSwgcm9vbV9sZWZ0X2luX3BhZ2UgJSUgY2h1 bms9JXp1XG5cbiIsIF9fZnVuY19fLCBjaHVuazAsIGNodW5rLCByb29tX2xlZnRfaW5fcGFnZSwg cm9vbV9sZWZ0X2luX3BhZ2UgJSBjaHVuayk7CisJCX0KKwl9CisKKwlkbyB7CisJCWkgPSAwOwor CQlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKworCQlpZiAoc3BpLT5tb2RlID09IExDRFJFR19TUElf U1RBUlRCWVRFKSB7CisJCQl0cltpXS50eF9idWYgPSBzdGFydGJ1ZjsKKwkJCXRyW2ldLmxlbiA9 IDE7CisJCQl0cltpXS5iaXRzX3Blcl93b3JkID0gODsKKwkJCXNwaV9tZXNzYWdlX2FkZF90YWls KCZ0cltpKytdLCAmbSk7CisJCX0KKworCQl0cltpXS50eF9idWYgPSBidWY7CisJCXRyW2ldLmxl biA9IGNodW5rOworCQl0cltpXS5iaXRzX3Blcl93b3JkID0gdHJhbnNmZXItPndpZHRoOworCQli dWYgKz0gY2h1bms7CisJCWxlbiAtPSBjaHVuazsKKwkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRy W2ldLCAmbSk7CisKKwkJbGNkcmVnX3ZkYmdfZHVtcF9zcGkoJnNkZXYtPmRldiwgJm0sIHN0YXJ0 YnVmKTsKKwkJcmV0ID0gc3BpX3N5bmMoc2RldiwgJm0pOworCQlpZiAocmV0KQorCQkJZ290byBv dXQ7CisKKwkJY2h1bmsgPSBtaW5fdChzaXplX3QsIGxlbiwgbWF4KTsKKwl9IHdoaWxlIChsZW4p OworCitvdXQ6CisJa2ZyZWUodHIpOworCWtmcmVlKHN0YXJ0YnVmKTsKKworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgbGNkcmVnX3NwaV90cmFuc2Zlcl9lbXVsYXRlOShzdHJ1Y3QgbGNk cmVnICpyZWcsCisJCQkJCXN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgKnRyYW5zZmVyKQoreworCXN0 cnVjdCBsY2RyZWdfc3BpICpzcGkgPSB0b19sY2RyZWdfc3BpKHJlZyk7CisJc3RydWN0IGxjZHJl Z190cmFuc2ZlciB0ciA9IHsKKwkJLmluZGV4ID0gdHJhbnNmZXItPmluZGV4LAorCQkud2lkdGgg PSA4LAorCQkuY291bnQgPSB0cmFuc2Zlci0+Y291bnQsCisJfTsKKwl1MTYgKnNyYyA9IHRyYW5z ZmVyLT5idWY7CisJdW5zaWduZWQgYWRkZWQgPSAwOworCWludCBpLCByZXQ7CisJdTggKmRzdDsK KworCWlmICh0cmFuc2Zlci0+Y291bnQgJSA4KSB7CisJCWRldl9lcnJfb25jZShyZWctPmRldiwK KwkJCSAgICAgInRyYW5zZmVyLT5jb3VudD0ldSBtdXN0IGJlIGRpdmlzaWJsZSBieSA4XG4iLAor CQkJICAgICB0cmFuc2Zlci0+Y291bnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkc3Qg PSBremFsbG9jKHNwaS0+dHhidWZsZW4sIEdGUF9LRVJORUwpOworCWlmICghZHN0KQorCQlyZXR1 cm4gLUVOT01FTTsKKworCXRyLmJ1ZiA9IGRzdDsKKworCWZvciAoaSA9IDA7IGkgPCB0cmFuc2Zl ci0+Y291bnQ7IGkgKz0gOCkgeworCQl1NjQgdG1wID0gMDsKKwkJaW50IGosIGJpdHMgPSA2MzsK KworCQlmb3IgKGogPSAwOyBqIDwgNzsgaisrKSB7CisJCQl1NjQgYml0OSA9ICgqc3JjICYgMHgx MDApID8gMSA6IDA7CisJCQl1NjQgdmFsID0gKnNyYysrICYgMHhGRjsKKworCQkJdG1wIHw9IGJp dDkgPDwgYml0czsKKwkJCWJpdHMgLT0gODsKKwkJCXRtcCB8PSB2YWwgPDwgYml0cy0tOworCQl9 CisJCXRtcCB8PSAoKCpzcmMgJiAweDEwMCkgPyAxIDogMCk7CisJCSoodTY0ICopZHN0ID0gY3B1 X3RvX2JlNjQodG1wKTsKKwkJZHN0ICs9IDg7CisJCSpkc3QrKyA9ICpzcmMrKyAmIDB4RkY7CisJ CWFkZGVkKys7CisJfQorCXRyLmNvdW50ICs9IGFkZGVkOworCXJldCA9IGxjZHJlZ19zcGlfZG9f dHJhbnNmZXIocmVnLCAmdHIpOworCWtmcmVlKHRyLmJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgaW50IGxjZHJlZ19zcGlfdHJhbnNmZXJfZW11bGF0ZTE2KHN0cnVjdCBsY2RyZWcg KnJlZywKKwkJCQkJIHN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgKnRyYW5zZmVyKQoreworCXN0cnVj dCBsY2RyZWdfc3BpICpzcGkgPSB0b19sY2RyZWdfc3BpKHJlZyk7CisJdW5zaWduZWQgdG9fY29w eSwgcmVtYWluID0gdHJhbnNmZXItPmNvdW50OworCXN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgdHIg PSB7CisJCS5pbmRleCA9IHRyYW5zZmVyLT5pbmRleCwKKwkJLndpZHRoID0gOCwKKwl9OworCXUx NiAqZGF0YTE2ID0gdHJhbnNmZXItPmJ1ZjsKKwl1MTYgKnR4YnVmMTY7CisJaW50IGksIHJldCA9 IDA7CisKKwl0eGJ1ZjE2ID0ga3phbGxvYyhzcGktPnR4YnVmbGVuLCBHRlBfS0VSTkVMKTsKKwlp ZiAoIXR4YnVmMTYpCisJCXJldHVybiAtRU5PTUVNOworCisJdHIuYnVmID0gdHhidWYxNjsKKwor CXdoaWxlIChyZW1haW4pIHsKKwkJdG9fY29weSA9IG1pbihyZW1haW4sIHNwaS0+dHhidWZsZW4g LyAyKTsKKwkJZGV2X2RiZyhyZWctPmRldiwgIiAgICB0b19jb3B5PSV6dSwgcmVtYWluPSV6dVxu IiwKKwkJCQkJdG9fY29weSwgcmVtYWluIC0gdG9fY29weSk7CisKKwkJZm9yIChpID0gMDsgaSA8 IHRvX2NvcHk7IGkrKykKKwkJCXR4YnVmMTZbaV0gPSBzd2FiMTYoZGF0YTE2W2ldKTsKKworCQlk YXRhMTYgPSBkYXRhMTYgKyB0b19jb3B5OworCQl0ci5jb3VudCA9IHRvX2NvcHkgKiAyOworCQly ZXQgPSBsY2RyZWdfc3BpX2RvX3RyYW5zZmVyKHJlZywgJnRyKTsKKwkJaWYgKHJldCA8IDApCisJ CQlnb3RvIG91dDsKKwkJcmVtYWluIC09IHRvX2NvcHk7CisJfQorCitvdXQ6CisJa2ZyZWUodHIu YnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGNkcmVnX3NwaV90cmFuc2Zl cihzdHJ1Y3QgbGNkcmVnICpyZWcsCisJCQkgICAgICAgc3RydWN0IGxjZHJlZ190cmFuc2ZlciAq dHJhbnNmZXIpCit7CisJc3RydWN0IGxjZHJlZ19zcGkgKnNwaSA9IHRvX2xjZHJlZ19zcGkocmVn KTsKKwlib29sIG1hY2hfbGl0dGxlX2VuZGlhbjsKKworI2lmZGVmIF9fTElUVExFX0VORElBTgor CW1hY2hfbGl0dGxlX2VuZGlhbiA9IHRydWU7CisjZW5kaWYKKwlpZiAoc3BpLT5kYykKKwkJZ3Bp b2Rfc2V0X3ZhbHVlX2NhbnNsZWVwKHNwaS0+ZGMsIHRyYW5zZmVyLT5pbmRleCk7CisKKwlpZiAo bGNkcmVnX2Jwd19zdXBwb3J0ZWQocmVnLCB0cmFuc2Zlci0+d2lkdGgpKQorCQlyZXR1cm4gbGNk cmVnX3NwaV9kb190cmFuc2ZlcihyZWcsIHRyYW5zZmVyKTsKKworCWlmICh0cmFuc2Zlci0+d2lk dGggPT0gOSkKKwkJcmV0dXJuIGxjZHJlZ19zcGlfdHJhbnNmZXJfZW11bGF0ZTkocmVnLCB0cmFu c2Zlcik7CisKKwlpZiAoKG1hY2hfbGl0dGxlX2VuZGlhbiA9PSByZWctPmxpdHRsZV9lbmRpYW4p ICYmCisJICAgICh0cmFuc2Zlci0+d2lkdGggJSA4ID09IDApKSB7CisJCS8qIHRoZSBieXRlIG9y ZGVyIG1hdGNoZXMgKi8KKwkJdHJhbnNmZXItPmNvdW50ICo9IHRyYW5zZmVyLT53aWR0aCAvIDg7 CisJCXRyYW5zZmVyLT53aWR0aCA9IDg7CisJCXJldHVybiBsY2RyZWdfc3BpX2RvX3RyYW5zZmVy KHJlZywgdHJhbnNmZXIpOworCX0KKworCWlmIChtYWNoX2xpdHRsZV9lbmRpYW4gIT0gcmVnLT5s aXR0bGVfZW5kaWFuICYmIHRyYW5zZmVyLT53aWR0aCA9PSAxNikKKwkJcmV0dXJuIGxjZHJlZ19z cGlfdHJhbnNmZXJfZW11bGF0ZTE2KHJlZywgdHJhbnNmZXIpOworCisJZGV2X2Vycl9vbmNlKHJl Zy0+ZGV2LCAid2lkdGg9JXUgaXMgbm90IHN1cHBvcnRlZCAoJXU6JXUpXG4iLAorCQkgICAgIHRy YW5zZmVyLT53aWR0aCwgbWFjaF9saXR0bGVfZW5kaWFuLCByZWctPmxpdHRsZV9lbmRpYW4pOwor CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbGNkcmVnX3NwaV93cml0ZV85Yml0 X2RjKHN0cnVjdCBsY2RyZWcgKnJlZywKKwkJCQkgICAgc3RydWN0IGxjZHJlZ190cmFuc2ZlciAq dHJhbnNmZXIpCit7CisJc3RydWN0IGxjZHJlZ19zcGkgKnNwaSA9IHRvX2xjZHJlZ19zcGkocmVn KTsKKwlzdHJ1Y3QgbGNkcmVnX3RyYW5zZmVyIHRyID0geworCQkuaW5kZXggPSB0cmFuc2Zlci0+ aW5kZXgsCisJfTsKKwl1OCAqZGF0YTggPSB0cmFuc2Zlci0+YnVmOworCXUxNiAqZGF0YTE2ID0g dHJhbnNmZXItPmJ1ZjsKKwl1bnNpZ25lZCB3aWR0aDsKKwl1MTYgKnR4YnVmMTY7CisJdW5zaWdu ZWQgcmVtYWluOworCXVuc2lnbmVkIHR4X2FycmF5X3NpemU7CisJdW5zaWduZWQgdG9fY29weTsK KwlpbnQgcGFkLCBpLCByZXQ7CisKK3dpZHRoID0gdHJhbnNmZXItPndpZHRoOworCisJaWYgKHdp ZHRoICE9IDggJiYgd2lkdGggIT0gMTYpIHsKKwkJZGV2X2VycihyZWctPmRldiwgInRyYW5zZmVy IHdpZHRoICV1IGlzIG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJCQkJCXdpZHRoKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaWYgKCFzcGktPnR4YnVmX2RjKSB7CisJCXNwaS0+dHhidWZfZGMg PSBkZXZtX2t6YWxsb2MocmVnLT5kZXYsIHNwaS0+dHhidWZsZW4sCisJCQkJCQkJR0ZQX0tFUk5F TCk7CisJCWlmICghc3BpLT50eGJ1Zl9kYykKKwkJCXJldHVybiAtRU5PTUVNOworCQlkZXZfaW5m byhyZWctPmRldiwgImFsbG9jYXRlZCAldSBLaUIgOS1iaXQgZGMgYnVmZmVyXG4iLAorCQkJCQkJ c3BpLT50eGJ1ZmxlbiAvIDEwMjQpOworCX0KKworCXRyLmJ1ZiA9IHNwaS0+dHhidWZfZGM7CisJ dHhidWYxNiA9IHNwaS0+dHhidWZfZGM7CisJcmVtYWluID0gdHJhbnNmZXItPmNvdW50OworCWlm ICh3aWR0aCA9PSA4KQorCQl0eF9hcnJheV9zaXplID0gc3BpLT50eGJ1ZmxlbiAvIDI7CisJZWxz ZQorCQl0eF9hcnJheV9zaXplID0gc3BpLT50eGJ1ZmxlbiAvIDQ7CisKKwkvKiBJZiB3ZSdyZSBl bXVsYXRpbmcgOS1iaXQsIHRoZSBidWZmZXIgaGFzIHRvIGJlIGRpdmlzaWJsZSBieSA4LgorCSAg IFBhZCB3aXRoIG5vLW9wcyBpZiBuZWNlc3NhcnkgKGFzc3VtaW5nIGhlcmUgdGhhdCB6ZXJvIGlz IGEgbm8tb3ApCisJICAgRklYOiBJZiB2aWRlbyBidWYgaXNuJ3QgZGl2aXNpYmxlIGJ5IDgsIGl0 IHdpbGwgYnJlYWsuCisJICovCisJaWYgKCFsY2RyZWdfYnB3X3N1cHBvcnRlZChyZWcsIDkpICYm IHdpZHRoID09IDggJiYKKwkJCQkJCXJlbWFpbiA8IHR4X2FycmF5X3NpemUpIHsKKwkJcGFkID0g KHRyYW5zZmVyLT5jb3VudCAlIDgpID8gOCAtICh0cmFuc2Zlci0+Y291bnQgJSA4KSA6IDA7CisJ CWlmICh0cmFuc2Zlci0+aW5kZXggPT0gMCkKKwkJCWZvciAoaSA9IDA7IGkgPCBwYWQ7IGkrKykK KwkJCQkqdHhidWYxNisrID0gMHgwMDA7CisJCWZvciAoaSA9IDA7IGkgPCByZW1haW47IGkrKykg eworCQkJKnR4YnVmMTYgPSAqZGF0YTgrKzsKKwkJCWlmICh0cmFuc2Zlci0+aW5kZXgpCisJCQkJ KnR4YnVmMTYrKyB8PSAweDAxMDA7CisJCX0KKwkJaWYgKHRyYW5zZmVyLT5pbmRleCA9PSAxKQor CQkJZm9yIChpID0gMDsgaSA8IHBhZDsgaSsrKQorCQkJCSp0eGJ1ZjE2KysgPSAweDAwMDsKKwkJ dHIud2lkdGggPSA5OworCQl0ci5jb3VudCA9IHBhZCArIHJlbWFpbjsKKwkJcmV0dXJuIGxjZHJl Z19zcGlfdHJhbnNmZXIocmVnLCAmdHIpOworCX0KKworCXdoaWxlIChyZW1haW4pIHsKKwkJdG9f Y29weSA9IHJlbWFpbiA+IHR4X2FycmF5X3NpemUgPyB0eF9hcnJheV9zaXplIDogcmVtYWluOwor CQlyZW1haW4gLT0gdG9fY29weTsKKwkJZGV2X2RiZyhyZWctPmRldiwgIiAgICB0b19jb3B5PSV6 dSwgcmVtYWluPSV6dVxuIiwKKwkJCQkJdG9fY29weSwgcmVtYWluKTsKKworCQlpZiAod2lkdGgg PT0gOCkgeworCQkJZm9yIChpID0gMDsgaSA8IHRvX2NvcHk7IGkrKykgeworCQkJCXR4YnVmMTZb aV0gPSAqZGF0YTgrKzsKKwkJCQlpZiAodHJhbnNmZXItPmluZGV4KQorCQkJCQl0eGJ1ZjE2W2ld IHw9IDB4MDEwMDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWZvciAoaSA9IDA7IGkgPCAodG9fY29w eSAqIDIpOyBpICs9IDIpIHsKKwkJCQl0eGJ1ZjE2W2ldICAgICA9ICpkYXRhMTYgPj4gODsKKwkJ CQl0eGJ1ZjE2W2kgKyAxXSA9ICpkYXRhMTYrKyAmIDB4RkY7CisJCQkJaWYgKHRyYW5zZmVyLT5p bmRleCkgeworCQkJCQl0eGJ1ZjE2W2ldICAgICB8PSAweDAxMDA7CisJCQkJCXR4YnVmMTZbaSAr IDFdIHw9IDB4MDEwMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJdHIuYnVmID0gc3BpLT50eGJ1Zl9k YzsKKwkJdHIud2lkdGggPSA5OworCQl0ci5jb3VudCA9IHRvX2NvcHkgKiAyOworCQlyZXQgPSBs Y2RyZWdfc3BpX3RyYW5zZmVyKHJlZywgJnRyKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4g cmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGxjZHJlZ19zcGlfd3JpdGUo c3RydWN0IGxjZHJlZyAqcmVnLCB1bnNpZ25lZCByZWduciwKKwkJCSAgICBzdHJ1Y3QgbGNkcmVn X3RyYW5zZmVyICp0cmFuc2ZlcikKK3sKKwlzdHJ1Y3QgbGNkcmVnX3NwaSAqc3BpID0gdG9fbGNk cmVnX3NwaShyZWcpOworCXN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgdHIgPSB7CisJCS53aWR0aCA9 IHJlZy0+ZGVmX3dpZHRoLAorCQkuY291bnQgPSAxLAorCX07CisJaW50IHJldDsKKworCXRyLmJ1 ZiA9IGttYWxsb2Moc2l6ZW9mKHUzMiksIEdGUF9LRVJORUwpOworCWlmICghdHIuYnVmKQorCQly ZXR1cm4gLUVOT01FTTsKKworCWlmIChyZWctPmRlZl93aWR0aCA8PSA4KQorCQkoKHU4ICopdHIu YnVmKVswXSA9IHJlZ25yOworCWVsc2UKKwkJKCh1MTYgKil0ci5idWYpWzBdID0gcmVnbnI7CisK KwlpZiAoc3BpLT5tb2RlID09IExDRFJFR19TUElfM1dJUkUpCisJCXJldCA9IGxjZHJlZ19zcGlf d3JpdGVfOWJpdF9kYyhyZWcsICZ0cik7CisJZWxzZQorCQlyZXQgPSBsY2RyZWdfc3BpX3RyYW5z ZmVyKHJlZywgJnRyKTsKKwlrZnJlZSh0ci5idWYpOworCWlmIChyZXQgfHwgIXRyYW5zZmVyIHx8 ICF0cmFuc2Zlci0+Y291bnQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIXRyYW5zZmVyLT53aWR0 aCkKKwkJdHJhbnNmZXItPndpZHRoID0gcmVnLT5kZWZfd2lkdGg7CisJaWYgKHNwaS0+bW9kZSA9 PSBMQ0RSRUdfU1BJXzNXSVJFKQorCQlyZXQgPSBsY2RyZWdfc3BpX3dyaXRlXzliaXRfZGMocmVn LCB0cmFuc2Zlcik7CisJZWxzZQorCQlyZXQgPSBsY2RyZWdfc3BpX3RyYW5zZmVyKHJlZywgdHJh bnNmZXIpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAgIDxDTUQ+IDxETT4gPFBBPgorICAg Q01EID0gQ29tbWFuZAorICAgRE0gPSBEdW1teSByZWFkCisgICBQQSA9IFBhcmFtZXRlciBvciBk aXNwbGF5IGRhdGEKKworICAgU1Q3NzM1UiByZWFkOgorICAgICBQYXJhbGxlbDogPENNRD4gPERN PiA8UEE+CisgICAgIFNQSTogOC1iaXQgcGxhaW4sIDI0LSBhbmQgMzItYml0IG5lZWRzIDEgZHVt bXkgY2xvY2sgY3ljbGUKKworICAgSUxJOTMyMDoKKyAgICAgUGFyYWxsZWw6IG5vIGR1bW15IHJl YWQsIHBhZ2UgNTEgaW4gZGF0YXNoZWV0CisgICAgIFNQSSAoc3RhcnRieXRlKTogT25lIGJ5dGUg b2YgaW52YWxpZCBkdW1teSBkYXRhIHJlYWQgYWZ0ZXIgdGhlIHN0YXJ0IGJ5dGUuCisKKyAgIElM STkzNDA6CisgICAgIFBhcmFsbGVsOiBubyBpbmZvIGFib3V0IGR1bW15IHJlYWQKKyAgICAgU1BJ OiBzYW1lIGFzIFNUNzczNVIKKworICAgSUxJOTM0MToKKyAgICAgUGFyYWxsZWw6IG5vIGluZm8g YWJvdXQgZHVtbXkgcmVhZAorICAgICBTUEk6IHNhbWUgYXMgU1Q3NzM1UgorCisgICBTU0QxMjg5 OgorICAgICBQYXJhbGxlbDogMSBkdW1teSByZWFkCisKKyAqLworCitzdGF0aWMgaW50IGxjZHJl Z19zcGlfcmVhZF9zdGFydGJ5dGUoc3RydWN0IGxjZHJlZyAqcmVnLCB1bnNpZ25lZCByZWduciwK KwkJCQkgICAgIHN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgKnRyYW5zZmVyKQoreworCXN0cnVjdCBz cGlfZGV2aWNlICpzZGV2ID0gdG9fc3BpX2RldmljZShyZWctPmRldik7CisJc3RydWN0IGxjZHJl Z19zcGkgKnNwaSA9IHRvX2xjZHJlZ19zcGkocmVnKTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsK KwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRydHggPSB7CisJCS5zcGVlZF9oeiA9IG1pbl90KHUzMiwg MjAwMDAwMCwgc2Rldi0+bWF4X3NwZWVkX2h6IC8gMiksCisJCS5iaXRzX3Blcl93b3JkID0gOCwK KwkJLmxlbiA9IDEsCisJfTsKKwlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRycnggPSB7CisJCS5zcGVl ZF9oeiA9IHRydHguc3BlZWRfaHosCisJCS5iaXRzX3Blcl93b3JkID0gOCwKKwkJLmxlbiA9ICh0 cmFuc2Zlci0+Y291bnQgKiAyKSArIDEsCisJfTsKKwl1OCAqdHhidWYsICpyeGJ1ZjsKKwlpbnQg aSwgcmV0OworCisJaWYgKCFyZWctPnJlYWRhYmxlKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCWlm ICghdHJhbnNmZXIgfHwgIXRyYW5zZmVyLT5jb3VudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0 cmFuc2Zlci0+d2lkdGggPSB0cmFuc2Zlci0+d2lkdGggPyA6IHJlZy0+ZGVmX3dpZHRoOworCWlm IChXQVJOX09OKHRyYW5zZmVyLT53aWR0aCAhPSAxNikpCisJCXJldHVybiAtRUlOVkFMOworCisJ cmV0ID0gbGNkcmVnX3dyaXRlcmVnKHJlZywgcmVnbnIpOworCWlmIChyZXQpCisJCXJldHVybiBy ZXQ7CisKKwl0eGJ1ZiA9IGt6YWxsb2MoMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eGJ1ZikKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwlyeGJ1ZiA9IGt6YWxsb2ModHJyeC5sZW4sIEdGUF9LRVJORUwp OworCWlmICghcnhidWYpIHsKKwkJa2ZyZWUodHhidWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9 CisKKwkqdHhidWYgPSBzcGktPnN0YXJ0Ynl0ZShyZWcsIHRyYW5zZmVyLCB0cnVlKTsKKworCXRy dHgudHhfYnVmID0gdHhidWY7CisJdHJyeC5yeF9idWYgPSByeGJ1ZjsKKwlzcGlfbWVzc2FnZV9p bml0KCZtKTsKKwlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdHJ0eCwgJm0pOworCXNwaV9tZXNzYWdl X2FkZF90YWlsKCZ0cnJ4LCAmbSk7CisJcmV0ID0gc3BpX3N5bmMoc2RldiwgJm0pOworCWxjZHJl Z192ZGJnX2R1bXBfc3BpKCZzZGV2LT5kZXYsICZtLCB0eGJ1Zik7CisJa2ZyZWUodHhidWYpOwor CWlmIChyZXQpIHsKKwkJa2ZyZWUocnhidWYpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJ4YnVm Kys7CisJZm9yIChpID0gMDsgaSA8IHRyYW5zZmVyLT5jb3VudDsgaSsrKSB7CisJCSgodTE2ICop dHJhbnNmZXItPmJ1ZilbaV0gPSBnZXRfdW5hbGlnbmVkX2JlMTYocnhidWYpOworCQlyeGJ1ZiAr PSAyOworCX0KKwlrZnJlZSh0cnJ4LnJ4X2J1Zik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBsY2RyZWdfc3BpX3JlYWQoc3RydWN0IGxjZHJlZyAqcmVnLCB1bnNpZ25lZCByZWduciwK KwkJCSAgIHN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgKnRyYW5zZmVyKQoreworCXN0cnVjdCBsY2Ry ZWdfc3BpICpzcGkgPSB0b19sY2RyZWdfc3BpKHJlZyk7CisJc3RydWN0IHNwaV9kZXZpY2UgKnNk ZXYgPSB0b19zcGlfZGV2aWNlKHJlZy0+ZGV2KTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwlz dHJ1Y3Qgc3BpX3RyYW5zZmVyIHRydHggPSB7CisJCS5zcGVlZF9oeiA9IG1pbl90KHUzMiwgMjAw MDAwMCwgc2Rldi0+bWF4X3NwZWVkX2h6IC8gMiksCisJCS5iaXRzX3Blcl93b3JkID0gcmVnLT5k ZWZfd2lkdGgsCisJCS5sZW4gPSAxLAorCX07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0cnJ4ID0g eworCQkuc3BlZWRfaHogPSB0cnR4LnNwZWVkX2h6LAorCQkucnhfYnVmID0gdHJhbnNmZXItPmJ1 ZiwKKwkJLmxlbiA9IHRyYW5zZmVyLT5jb3VudCwKKwl9OworCXZvaWQgKnR4YnVmID0gTlVMTDsK KwlpbnQgaSwgcmV0OworCisJdHJhbnNmZXItPndpZHRoID0gdHJhbnNmZXItPndpZHRoID8gOiBy ZWctPmRlZl93aWR0aDsKKwlpZiAoV0FSTl9PTih0cmFuc2Zlci0+d2lkdGggIT0gcmVnLT5kZWZf d2lkdGggfHwgIXRyYW5zZmVyLT5jb3VudCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFy ZWctPnJlYWRhYmxlKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCXR4YnVmID0ga3phbGxvYygxNiwg R0ZQX0tFUk5FTCk7CisJaWYgKCF0eGJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGlfbWVz c2FnZV9pbml0KCZtKTsKKwl0cnR4LnR4X2J1ZiA9IHR4YnVmOworCXRycnguYml0c19wZXJfd29y ZCA9IHRyYW5zZmVyLT53aWR0aDsKKworCWlmIChzcGktPm1vZGUgPT0gTENEUkVHX1NQSV80V0lS RSkgeworCQlpZiAodHJ0eC5iaXRzX3Blcl93b3JkID09IDgpIHsKKwkJCSoodTggKil0eGJ1ZiA9 IHJlZ25yOworCQl9IGVsc2UgaWYgKHRydHguYml0c19wZXJfd29yZCA9PSAxNikgeworCQkJaWYg KGxjZHJlZ19icHdfc3VwcG9ydGVkKHJlZywgdHJ0eC5iaXRzX3Blcl93b3JkKSkgeworCQkJCSoo dTE2ICopdHhidWYgPSByZWducjsKKwkJCX0gZWxzZSB7CisJCQkJKih1MTYgKil0eGJ1ZiA9IGNw dV90b19iZTE2KHJlZ25yKTsKKwkJCQl0cnR4LmJpdHNfcGVyX3dvcmQgPSA4OworCQkJCXRydHgu bGVuID0gMjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWdw aW9kX3NldF92YWx1ZV9jYW5zbGVlcChzcGktPmRjLCAwKTsKKwl9IGVsc2UgaWYgKHNwaS0+bW9k ZSA9PSBMQ0RSRUdfU1BJXzNXSVJFKSB7CisJCWlmIChsY2RyZWdfYnB3X3N1cHBvcnRlZChyZWcs IDkpKSB7CisJCQl0cnR4LmJpdHNfcGVyX3dvcmQgPSA5OworCQkJKih1MTYgKil0eGJ1ZiA9IHJl Z25yOyAvKiBkYz0wICovCisJCX0gZWxzZSB7CisJCQkvKiA4eCA5LWJpdCB3b3JkcywgcGFkIHdp dGggbGVhZGluZyB6ZXJvZXMgKG5vLW9wcykgKi8KKwkJCSgodTggKil0eGJ1ZilbOF0gPSByZWdu cjsKKwkJfQorCX0gZWxzZSB7CisJCWtmcmVlKHR4YnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0cnR4LCAmbSk7CisKKwlpZiAoc3BpLT5tb2RlID09 IExDRFJFR19TUElfNFdJUkUgJiYgdHJhbnNmZXItPmluZGV4ICYmCisJICAgICEoc3BpLT5xdWly a3MgJiBMQ0RSRUdfSU5ERVgwX09OX1JFQUQpKSB7CisJCXRydHguY3NfY2hhbmdlID0gMTsgLyog bm90IGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwkJbGNkcmVnX3ZkYmdfZHVtcF9zcGkoJnNkZXYtPmRl diwgJm0sIE5VTEwpOworCQlyZXQgPSBzcGlfc3luYyhzZGV2LCAmbSk7CisJCWlmIChyZXQpIHsK KwkJCWtmcmVlKHR4YnVmKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJZ3Bpb2Rfc2V0X3ZhbHVl X2NhbnNsZWVwKHNwaS0+ZGMsIDEpOworCQlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKwl9CisKKwlz cGlfbWVzc2FnZV9hZGRfdGFpbCgmdHJyeCwgJm0pOworCXJldCA9IHNwaV9zeW5jKHNkZXYsICZt KTsKKwlsY2RyZWdfdmRiZ19kdW1wX3NwaSgmc2Rldi0+ZGV2LCAmbSwgTlVMTCk7CisJa2ZyZWUo dHhidWYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWxjZHJlZ19icHdfc3Vw cG9ydGVkKHJlZywgdHJyeC5iaXRzX3Blcl93b3JkKSAmJgorCQkJCQkJKHRycnguYml0c19wZXJf d29yZCA9PSAxNikpCisJCWZvciAoaSA9IDA7IGkgPCB0cmFuc2Zlci0+Y291bnQ7IGkrKykKKwkJ CSgodTE2ICopdHJhbnNmZXItPmJ1ZilbaV0gPSBiZTE2X3RvX2NwdSgoKHUxNiAqKXRyYW5zZmVy LT5idWYpW2ldKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsY2RyZWdfc3BpX3Jl c2V0KHN0cnVjdCBsY2RyZWcgKnJlZykKK3sKKwlzdHJ1Y3QgbGNkcmVnX3NwaSAqc3BpID0gdG9f bGNkcmVnX3NwaShyZWcpOworCisJaWYgKCFzcGktPnJlc2V0KQorCQlyZXR1cm47CisKKwlkZXZf aW5mbyhyZWctPmRldiwgIiVzKClcbiIsIF9fZnVuY19fKTsKKwlncGlvZF9zZXRfdmFsdWVfY2Fu c2xlZXAoc3BpLT5yZXNldCwgMCk7CisJbXNsZWVwKDIwKTsKKwlncGlvZF9zZXRfdmFsdWVfY2Fu c2xlZXAoc3BpLT5yZXNldCwgMSk7CisJbXNsZWVwKDEyMCk7Cit9CisKKy8qIERlZmF1bHQgc3Rh cnRieXRlIGltcGxlbWVudGF0aW9uOiB8IDAgfCAxIHwgMSB8IDEgfCAwIHwgSUQgfCBSUyB8IFJX IHwgKi8KK3N0YXRpYyB1OCBsY2RyZWdfc3BpX3N0YXJ0Ynl0ZShzdHJ1Y3QgbGNkcmVnICpyZWcs IHN0cnVjdCBsY2RyZWdfdHJhbnNmZXIgKnRyLAorCQkJICAgICAgIGJvb2wgcmVhZCkKK3sKKwlz dHJ1Y3QgbGNkcmVnX3NwaSAqc3BpID0gdG9fbGNkcmVnX3NwaShyZWcpOworCisJcmV0dXJuIDB4 NzAgfCAoISFzcGktPmlkIDw8IDIpIHwgKCEhdHItPmluZGV4IDw8IDEpIHwgcmVhZDsKK30KKwor c3RydWN0IGxjZHJlZyAqZGV2bV9sY2RyZWdfc3BpX2luaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNk ZXYsCisJCQkJICAgIGNvbnN0IHN0cnVjdCBsY2RyZWdfc3BpX2NvbmZpZyAqY29uZmlnKQorewor CWNoYXIgKmRjX25hbWUgPSBjb25maWctPmRjX25hbWUgPyA6ICJkYyI7CisJc3RydWN0IGRldmlj ZSAqZGV2ID0gJnNkZXYtPmRldjsKKwlzdHJ1Y3QgbGNkcmVnX3NwaSAqc3BpOworCXN0cnVjdCBs Y2RyZWcgKnJlZzsKKworCWlmICh0eGxlbikgeworCQlpZiAodHhsZW4gPCBQQUdFX1NJWkUpIHsK KwkJCXR4bGVuID0gcm91bmRkb3duX3Bvd19vZl90d28odHhsZW4pOworCQkJaWYgKHR4bGVuIDwg NjQpCisJCQkJdHhsZW4gPSA2NDsKKwkJfSBlbHNlIHsKKwkJCXR4bGVuICY9IFBBR0VfTUFTSzsK KwkJfQorCX0KK2Rldl9pbmZvKGRldiwgInR4bGVuOiAldVxuIiwgdHhsZW4pOworCisJc3BpID0g ZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCpzcGkpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNwaSkK KwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZWcgPSAmc3BpLT5yZWc7CisJaWYgKGJw d20pIHsKKwkJcmVnLT5iaXRzX3Blcl93b3JkX21hc2sgPSBicHdtOworCX0gZWxzZSB7CisJCWlm IChzZGV2LT5tYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzaykKKwkJCXJlZy0+Yml0c19wZXJfd29y ZF9tYXNrID0gc2Rldi0+bWFzdGVyLT5iaXRzX3Blcl93b3JkX21hc2s7CisJCWVsc2UKKwkJCXJl Zy0+Yml0c19wZXJfd29yZF9tYXNrID0gU1BJX0JQV19NQVNLKDgpOworCX0KKwlkZXZfZGJnKGRl diwgImJpdHNfcGVyX3dvcmRfbWFzazogMHglMDh4IiwgcmVnLT5iaXRzX3Blcl93b3JkX21hc2sp OworCisJcmVnLT5kZWZfd2lkdGggPSBjb25maWctPmRlZl93aWR0aDsKKwlyZWctPnJlYWRhYmxl ID0gY29uZmlnLT5yZWFkYWJsZTsKKwlyZWctPnJlc2V0ID0gbGNkcmVnX3NwaV9yZXNldDsKKwly ZWctPndyaXRlID0gbGNkcmVnX3NwaV93cml0ZTsKKwlyZWctPnJlYWQgPSBsY2RyZWdfc3BpX3Jl YWQ7CisKKwlzcGktPm1vZGUgPSBjb25maWctPm1vZGU7CisJc3BpLT5xdWlya3MgPSBjb25maWct PnF1aXJrczsKKwlzcGktPmlkID0gY29uZmlnLT5pZDsKKwlpZiAoIXNwaS0+dHhidWZsZW4pCisJ CXNwaS0+dHhidWZsZW4gPSBQQUdFX1NJWkU7CisKKwlzd2l0Y2ggKHNwaS0+bW9kZSkgeworCWNh c2UgTENEUkVHX1NQSV80V0lSRToKKwkJc3BpLT5kYyA9IGRldm1fZ3Bpb2RfZ2V0KGRldiwgZGNf bmFtZSwgR1BJT0RfT1VUX0xPVyk7CisJCWlmIChJU19FUlIoc3BpLT5kYykpIHsKKwkJCWRldl9l cnIoZGV2LCAiRmFpbGVkIHRvIGdldCBncGlvICclcydcbiIsIGRjX25hbWUpOworCQkJcmV0dXJu IEVSUl9DQVNUKHNwaS0+ZGMpOworCQl9CisJCWJyZWFrOworCWNhc2UgTENEUkVHX1NQSV8zV0lS RToKKwkJYnJlYWs7CisJY2FzZSBMQ0RSRUdfU1BJX1NUQVJUQllURToKKwkJcmVnLT5yZWFkID0g bGNkcmVnX3NwaV9yZWFkX3N0YXJ0Ynl0ZTsKKwkJc3BpLT5zdGFydGJ5dGUgPSBjb25maWctPnN0 YXJ0Ynl0ZSA/IDogbGNkcmVnX3NwaV9zdGFydGJ5dGU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ CWRldl9lcnIoZGV2LCAiTW9kZSBpcyBub3Qgc3VwcG9ydGVkOiAldVxuIiwgc3BpLT5tb2RlKTsK KwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJc3BpLT5yZXNldCA9IGRldm1fZ3Bp b2RfZ2V0X29wdGlvbmFsKGRldiwgInJlc2V0IiwgR1BJT0RfT1VUX0hJR0gpOworCWlmIChJU19F UlIoc3BpLT5yZXNldCkpIHsKKwkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gZ2V0IGdwaW8gJ3Jl c2V0J1xuIik7CisJCXJldHVybiBFUlJfQ0FTVChzcGktPnJlc2V0KTsKKwl9CisKKwlwcl9kZWJ1 Zygic3BpLT5yZWcuZGVmX3dpZHRoOiAldVxuIiwgcmVnLT5kZWZfd2lkdGgpOworCWlmIChzcGkt PnJlc2V0KQorCQlwcl9kZWJ1Zygic3BpLT5yZXNldDogJWlcbiIsIGRlc2NfdG9fZ3BpbyhzcGkt PnJlc2V0KSk7CisJaWYgKHNwaS0+ZGMpCisJCXByX2RlYnVnKCJzcGktPmRjOiAlaVxuIiwgZGVz Y190b19ncGlvKHNwaS0+ZGMpKTsKKwlwcl9kZWJ1Zygic3BpLT5tb2RlOiAldVxuIiwgc3BpLT5t b2RlKTsKKworCXJldHVybiBkZXZtX2xjZHJlZ19pbml0KGRldiwgcmVnKTsKK30KK0VYUE9SVF9T WU1CT0xfR1BMKGRldm1fbGNkcmVnX3NwaV9pbml0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIp OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vdGlueWRybS9sY2RyZWctc3BpLmggYi9pbmNsdWRl L2RybS90aW55ZHJtL2xjZHJlZy1zcGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi5iYTVkNDkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0vdGlueWRybS9sY2Ry ZWctc3BpLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBOb3Jh bGYgVHLDuG5uZXMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9m IHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us IG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5k ZWYgX19MSU5VWF9MQ0RSRUdfU1BJX0gKKyNkZWZpbmUgX19MSU5VWF9MQ0RSRUdfU1BJX0gKKwor I2luY2x1ZGUgPGRybS90aW55ZHJtL2xjZHJlZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGku aD4KKworLyoqCisgKiBlbnVtIGxjZHJlZ19zcGlfbW9kZSAtIFNQSSBpbnRlcmZhY2UgbW9kZQor ICogQExDRFJFR19TUElfNFdJUkU6IDgtYml0ICsgRC9DWCBsaW5lLCBNSVBJIERCSSBUeXBlIEMg b3B0aW9uIDMKKyAqIEBMQ0RSRUdfU1BJXzNXSVJFOiA5LWJpdCBpbmMuIEQvQ1ggYml0LCBNSVBJ IERCSSBUeXBlIEMgb3B0aW9uIDEKKyAqIEBMQ0RSRUdfU1BJX1NUQVJUQllURTogU3RhcnRieXRl IGhlYWRlciBvbiBldmVyeSB0cmFuc2FjdGlvbiAobm9uIE1JUEkpCisgKi8KK2VudW0gbGNkcmVn X3NwaV9tb2RlIHsKKwlMQ0RSRUdfU1BJX05PTU9ERSA9IDAsCisJTENEUkVHX1NQSV80V0lSRSwK KwlMQ0RSRUdfU1BJXzNXSVJFLAorCUxDRFJFR19TUElfU1RBUlRCWVRFLAorfTsKKworLyoqCisg KiBzdHJ1Y3QgbGNkcmVnX3NwaV9jb25maWcgLSBTUEkgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24K KyAqIEBtb2RlOiBSZWdpc3RlciBpbnRlcmZhY2UgbW9kZQorICogQGRlZl93aWR0aDogRGVmYXVs dCByZWdpc3RlciB3aWR0aAorICogQHJlYWRhYmxlOiBJcyB0aGUgcmVnaXN0ZXIgcmVhZGFibGUs IG5vdCBhbGwgZGlzcGxheXMgaGF2ZSBNSVNPIHdpcmVkLgorICogQGlkOiBEaXNwbGF5IGlkIHVz ZWQgd2l0aCBMQ0RSRUdfU1BJX1NUQVJUQllURQorICogQGRjX25hbWU6IEluZGV4IHBpbiBuYW1l LCB1c3VhbGx5IGRjLCBycyBvciBkaSAoZGVmYXVsdCBpcyAnZGMnKS4KKyAqIEBxdWlya3M6IERl dmlhdGlvbnMgZnJvbSB0aGUgTUlQSSBEQkkgc3RhbmRhcmQKKyAqIEBzdGFydGJ5dGU6IFVzZWQg d2l0aCBMQ0RSRUdfU1BJX1NUQVJUQllURSB0byBnZXQgdGhlIHN0YXJ0Ynl0ZQorICogICAgICAg ICAgICAgKGRlZmF1bHQgaXMgbGNkcmVnX3NwaV9zdGFydGJ5dGUpLgorICovCitzdHJ1Y3QgbGNk cmVnX3NwaV9jb25maWcgeworCWVudW0gbGNkcmVnX3NwaV9tb2RlIG1vZGU7CisJdW5zaWduZWQg ZGVmX3dpZHRoOworCWJvb2wgcmVhZGFibGU7CisJdTMyIGlkOworCWNoYXIgKmRjX25hbWU7CisJ dTMyIHF1aXJrczsKKy8qIHNsb3dkb3duIGNvbW1hbmQgKGluZGV4PTApICovCisjZGVmaW5lIExD RFJFR19TTE9XX0lOREVYMF9XUklURQlCSVQoMCkKKy8qCisgKiBUaGUgTUlQSSBEQkkgc3BlYyBz dGF0ZXMgdGhhdCBEL0Mgc2hvdWxkIGJlIEhJR0ggZHVyaW5nIHJlZ2lzdGVyIHJlYWRpbmcuCisg KiBIb3dldmVyLCBub3QgYWxsIFNQSSBtYXN0ZXIgZHJpdmVycyBzdXBwb3J0IGNzX2NoYW5nZSBv biBsYXN0IHRyYW5zZmVyIGFuZAorICogdGhlcmUgYXJlIExDRCBjb250cm9sbGVycyB0aGF0IGln bm9yZSBEL0Mgb24gcmVhZC4KKyAqLworI2RlZmluZSBMQ0RSRUdfSU5ERVgwX09OX1JFQUQJCUJJ VCgxKQorCisJdTggKCpzdGFydGJ5dGUpKHN0cnVjdCBsY2RyZWcgKnJlZywgc3RydWN0IGxjZHJl Z190cmFuc2ZlciAqdHIsCisJCQlib29sIHJlYWQpOworfTsKKworc3RydWN0IGxjZHJlZyAqZGV2 bV9sY2RyZWdfc3BpX2luaXQoc3RydWN0IHNwaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgIGNvbnN0 IHN0cnVjdCBsY2RyZWdfc3BpX2NvbmZpZyAqY29uZmlnKTsKKworI2VuZGlmIC8qIF9fTElOVVhf TENEUkVHX1NQSV9IICovCi0tIAoyLjIuMgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVsCg==