From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 20/51] drm/amd/powerplay: Add Tonga SMU support Date: Thu, 12 Nov 2015 01:18:10 -0500 Message-ID: <1447309121-2480-21-git-send-email-alexander.deucher@amd.com> References: <1447309121-2480-1-git-send-email-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-f51.google.com (mail-qg0-f51.google.com [209.85.192.51]) by gabe.freedesktop.org (Postfix) with ESMTPS id 47D577A093 for ; Wed, 11 Nov 2015 22:19:12 -0800 (PST) Received: by qgad10 with SMTP id d10so40911201qga.3 for ; Wed, 11 Nov 2015 22:19:11 -0800 (PST) In-Reply-To: <1447309121-2480-1-git-send-email-alexander.deucher@amd.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: Young Yang List-Id: dri-devel@lists.freedesktop.org RnJvbTogSmFtbXkgWmhvdSA8SmFtbXkuWmhvdUBhbWQuY29tPgoKVGhlIFNNVSBtYW5hZ2VyIGhh bmRsZXMgZmlybXdhcmUgbG9hZGluZyBmb3Igb3RoZXIgSVAKYmxvY2tzIChHRlgsIFNETUEsIGV0 Yy4pLiAgVGhpcyBpbXBsZW1lbnRzIGl0IGZvciBUb25nYS4KCnYzOiBkZWxldGUgcGVjaSBzdWIt bW9kdWxlCnYyOiB1c2UgY2dzIGludGVyZmFjZSBkaXJlY3RseQoKU2lnbmVkLW9mZi1ieTogWW91 bmcgWWFuZyA8WW91bmcuWWFuZ0BhbWQuY29tPgpTaWduZWQtb2ZmLWJ5OiBKYW1teSBaaG91IDxK YW1teS5aaG91QGFtZC5jb20+ClJldmlld2VkLWJ5OiBBbGV4IERldWNoZXIgPGFsZXhhbmRlci5k ZXVjaGVyQGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvaW5jL3Bw X2RlYnVnLmggICAgICAgfCAgNDAgKwogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211 bWdyL01ha2VmaWxlICAgICAgfCAgIDIgKy0KIGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5 L3NtdW1nci9zbXVtZ3IuYyAgICAgIHwgICA5ICstCiAuLi4vZ3B1L2RybS9hbWQvcG93ZXJwbGF5 L3NtdW1nci90b25nYV9zbXVtZ3IuYyAgICB8IDgxOSArKysrKysrKysrKysrKysrKysrKysKIC4u Li9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL3RvbmdhX3NtdW1nci5oICAgIHwgIDUzICsr CiA1IGZpbGVzIGNoYW5nZWQsIDkyMSBpbnNlcnRpb25zKCspLCAyIGRlbGV0aW9ucygtKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L2luYy9wcF9kZWJ1 Zy5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211 bWdyL3RvbmdhX3NtdW1nci5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvc211bWdyL3RvbmdhX3NtdW1nci5oCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL2FtZC9wb3dlcnBsYXkvaW5jL3BwX2RlYnVnLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1k L3Bvd2VycGxheS9pbmMvcHBfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi42NWVmNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dl cnBsYXkvaW5jL3BwX2RlYnVnLmgKQEAgLTAsMCArMSw0MCBAQAorCisvKgorICogQ29weXJpZ2h0 IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5j bHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNv ZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VU IFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcg QlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAq IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJ TiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMp IEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAq IEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUg T1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAq LworI2lmbmRlZiBQUF9ERUJVR19ICisjZGVmaW5lIFBQX0RFQlVHX0gKKworI2luY2x1ZGUgPGxp bnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgv c2xhYi5oPgorCisjZGVmaW5lIFBQX0FTU0VSVF9XSVRIX0NPREUoY29uZCwgbXNnLCBjb2RlKQlc CisJZG8gewkJCQkJXAorCQlpZiAoIShjb25kKSkgewkJCVwKKwkJCXByaW50ayhtc2cpOwlcCisJ CQljb2RlOwkJCVwKKwkJfQkJCQlcCisJfSB3aGlsZSAoMCkKKworI2VuZGlmCisKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9NYWtlZmlsZSBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9NYWtlZmlsZQppbmRleCA5MjE5OTQwLi4w ZTMzNDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3Iv TWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL01ha2Vm aWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlICdzbXUgbWFuYWdlcicgc3Vi LWNvbXBvbmVudCBvZiBwb3dlcnBsYXkuCiAjIEl0IHByb3ZpZGVzIHRoZSBzbXUgbWFuYWdlbWVu dCBzZXJ2aWNlcyBmb3IgdGhlIGRyaXZlci4KIAotU01VX01HUiA9IHNtdW1nci5vIGN6X3NtdW1n ci5vCitTTVVfTUdSID0gc211bWdyLm8gY3pfc211bWdyLm8gdG9uZ2Ffc211bWdyLm8KIAogQU1E X1BQX1NNVU1HUiA9ICQoYWRkcHJlZml4ICQoQU1EX1BQX1BBVEgpL3NtdW1nci8sJChTTVVfTUdS KSkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL3Nt dW1nci5jIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL3NtdW1nci5jCmlu ZGV4IDlmZjVkMzMuLmEzODZjYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93 ZXJwbGF5L3NtdW1nci9zbXVtZ3IuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxh eS9zbXVtZ3Ivc211bWdyLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJjZ3NfY29tbW9u LmgiCiAjaW5jbHVkZSAibGludXgvZGVsYXkuaCIKICNpbmNsdWRlICJjel9zbXVtZ3IuaCIKKyNp bmNsdWRlICJ0b25nYV9zbXVtZ3IuaCIKIAogaW50IHNtdW1faW5pdChzdHJ1Y3QgYW1kX3BwX2lu aXQgKnBwX2luaXQsIHN0cnVjdCBwcF9pbnN0YW5jZSAqaGFuZGxlKQogewpAQCAtNTMsNyArNTQs MTMgQEAgaW50IHNtdW1faW5pdChzdHJ1Y3QgYW1kX3BwX2luaXQgKnBwX2luaXQsIHN0cnVjdCBw cF9pbnN0YW5jZSAqaGFuZGxlKQogCQljel9zbXVtX2luaXQoc211bWdyKTsKIAkJYnJlYWs7CiAJ Y2FzZSBBTURfRkFNSUxZX1ZJOgotCQkvKiBUT0RPICovCisJCXN3aXRjaCAoc211bWdyLT5jaGlw X2lkKSB7CisJCWNhc2UgQ0hJUF9UT05HQToKKwkJCXRvbmdhX3NtdW1faW5pdChzbXVtZ3IpOwor CQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCQlicmVhazsK IAlkZWZhdWx0OgogCQlrZnJlZShzbXVtZ3IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJt L2FtZC9wb3dlcnBsYXkvc211bWdyL3RvbmdhX3NtdW1nci5jIGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvc211bWdyL3RvbmdhX3NtdW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAuLjYyZmY3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0v YW1kL3Bvd2VycGxheS9zbXVtZ3IvdG9uZ2Ffc211bWdyLmMKQEAgLTAsMCArMSw4MTkgQEAKKy8q CisgKiBDb3B5cmlnaHQgMjAxNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICog UGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz b24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u CisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVy bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAq CisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0 aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJB UyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJ RUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklO RlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihT KSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9U SEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Ig T1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRI IFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09G VFdBUkUuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51 eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZ2Zw Lmg+CisKKyNpbmNsdWRlICJzbXVtZ3IuaCIKKyNpbmNsdWRlICJ0b25nYV9zbXVtZ3IuaCIKKyNp bmNsdWRlICJwcF9kZWJ1Zy5oIgorI2luY2x1ZGUgInNtdV91Y29kZV94ZmVyX3ZpLmgiCisjaW5j bHVkZSAidG9uZ2FfcHBzbWMuaCIKKyNpbmNsdWRlICJzbXUvc211XzdfMV8yX2QuaCIKKyNpbmNs dWRlICJzbXUvc211XzdfMV8yX3NoX21hc2suaCIKKyNpbmNsdWRlICJjZ3NfY29tbW9uLmgiCisK KyNkZWZpbmUgVE9OR0FfU01DX1NJWkUJCQkweDIwMDAwCisjZGVmaW5lIEJVRkZFUl9TSVpFCQkJ ODAwMDAKKyNkZWZpbmUgTUFYX1NUUklOR19TSVpFCQkJMTUKKyNkZWZpbmUgQlVGRkVSX1NJWkVU V08gICAgICAgICAgICAgIDEzMTA3MiAvKjEyOCAqMTAyNCovCisKKy8qKgorKiBTZXQgdGhlIGFk ZHJlc3MgZm9yIHJlYWRpbmcvd3JpdGluZyB0aGUgU01DIFNSQU0gc3BhY2UuCisqIEBwYXJhbSAg ICBzbXVtZ3IgIHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4K KyogQHBhcmFtICAgIHNtY0FkZHJlc3MgdGhlIGFkZHJlc3MgaW4gdGhlIFNNQyBSQU0gdG8gYWNj ZXNzLgorKi8KK3N0YXRpYyBpbnQgdG9uZ2Ffc2V0X3NtY19zcmFtX2FkZHJlc3Moc3RydWN0IHBw X3NtdW1nciAqc211bWdyLAorCQkJCXVpbnQzMl90IHNtY0FkZHJlc3MsIHVpbnQzMl90IGxpbWl0 KQoreworCWlmIChzbXVtZ3IgPT0gTlVMTCB8fCBzbXVtZ3ItPmRldmljZSA9PSBOVUxMKQorCQly ZXR1cm4gLUVJTlZBTDsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgwID09ICgzICYgc21jQWRkcmVz cykpLAorCQkiU01DIGFkZHJlc3MgbXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4iLAorCQlyZXR1cm4g LTE7KTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoKGxpbWl0ID4gKHNtY0FkZHJlc3MgKyAzKSks CisJCSJTTUMgYWRkcmVzcyBpcyBiZXlvbmQgdGhlIFNNQyBSQU0gYXJlYS4iLAorCQlyZXR1cm4g LTE7KTsKKworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1TTUNfSU5EX0lO REVYXzAsIHNtY0FkZHJlc3MpOworCVNNVU1fV1JJVEVfRklFTEQoc211bWdyLT5kZXZpY2UsIFNN Q19JTkRfQUNDRVNTX0NOVEwsIEFVVE9fSU5DUkVNRU5UX0lORF8xMSwgMCk7CisKKwlyZXR1cm4g MDsKK30KKworLyoqCisqIENvcHkgYnl0ZXMgZnJvbSBhbiBhcnJheSBpbnRvIHRoZSBTTUMgUkFN IHNwYWNlLgorKgorKiBAcGFyYW0gICAgc211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJw bGF5IFNNVSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgc21jU3RhcnRBZGRyZXNzIHRoZSBzdGFydCBh ZGRyZXNzIGluIHRoZSBTTUMgUkFNIHRvIGNvcHkgYnl0ZXMgdG8uCisqIEBwYXJhbSAgICBzcmMg dGhlIGJ5dGUgYXJyYXkgdG8gY29weSB0aGUgYnl0ZXMgZnJvbS4KKyogQHBhcmFtICAgIGJ5dGVD b3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisqLworaW50IHRvbmdhX2NvcHlfYnl0 ZXNfdG9fc21jKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwKKwkJdWludDMyX3Qgc21jU3RhcnRB ZGRyZXNzLCBjb25zdCB1aW50OF90ICpzcmMsCisJCXVpbnQzMl90IGJ5dGVDb3VudCwgdWludDMy X3QgbGltaXQpCit7CisJdWludDMyX3QgYWRkcjsKKwl1aW50MzJfdCBkYXRhLCBvcmlnX2RhdGE7 CisJaW50IHJlc3VsdCA9IDA7CisJdWludDMyX3QgZXh0cmFfc2hpZnQ7CisKKwlpZiAoc211bWdy ID09IE5VTEwgfHwgc211bWdyLT5kZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgoMCA9PSAoMyAmIHNtY1N0YXJ0QWRkcmVzcykpLAorCQkiU01D IGFkZHJlc3MgbXVzdCBiZSA0IGJ5dGUgYWxpZ25lZC4iLAorCQlyZXR1cm4gMDspOworCisJUFBf QVNTRVJUX1dJVEhfQ09ERSgobGltaXQgPiAoc21jU3RhcnRBZGRyZXNzICsgYnl0ZUNvdW50KSks CisJCSJTTUMgYWRkcmVzcyBpcyBiZXlvbmQgdGhlIFNNQyBSQU0gYXJlYS4iLAorCQlyZXR1cm4g MDspOworCisJYWRkciA9IHNtY1N0YXJ0QWRkcmVzczsKKworCXdoaWxlIChieXRlQ291bnQgPj0g NCkgeworCQkvKgorCQkgKiBCeXRlcyBhcmUgd3JpdHRlbiBpbnRvIHRoZQorCQkgKiBTTUMgYWRk cmVzcyBzcGFjZSB3aXRoIHRoZSBNU0IgZmlyc3QKKwkJICovCisJCWRhdGEgPSAoc3JjWzBdIDw8 IDI0KSArIChzcmNbMV0gPDwgMTYpICsgKHNyY1syXSA8PCA4KSArIHNyY1szXTsKKworCQlyZXN1 bHQgPSB0b25nYV9zZXRfc21jX3NyYW1fYWRkcmVzcyhzbXVtZ3IsIGFkZHIsIGxpbWl0KTsKKwor CQlpZiAocmVzdWx0KQorCQkJZ290byBvdXQ7CisKKwkJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1n ci0+ZGV2aWNlLCBtbVNNQ19JTkRfREFUQV8wLCBkYXRhKTsKKworCQlzcmMgKz0gNDsKKwkJYnl0 ZUNvdW50IC09IDQ7CisJCWFkZHIgKz0gNDsKKwl9CisKKwlpZiAoMCAhPSBieXRlQ291bnQpIHsK KwkJLyogTm93IHdyaXRlIG9kZCBieXRlcyBsZWZ0LCBkbyBhIHJlYWQgbW9kaWZ5IHdyaXRlIGN5 Y2xlICovCisJCWRhdGEgPSAwOworCisJCXJlc3VsdCA9IHRvbmdhX3NldF9zbWNfc3JhbV9hZGRy ZXNzKHNtdW1nciwgYWRkciwgbGltaXQpOworCQlpZiAocmVzdWx0KQorCQkJZ290byBvdXQ7CisK KwkJb3JpZ19kYXRhID0gY2dzX3JlYWRfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsCisJCQkJCQkJ bW1TTUNfSU5EX0RBVEFfMCk7CisJCWV4dHJhX3NoaWZ0ID0gOCAqICg0IC0gYnl0ZUNvdW50KTsK KworCQl3aGlsZSAoYnl0ZUNvdW50ID4gMCkgeworCQkJZGF0YSA9IChkYXRhIDw8IDgpICsgKnNy YysrOworCQkJYnl0ZUNvdW50LS07CisJCX0KKworCQlkYXRhIDw8PSBleHRyYV9zaGlmdDsKKwkJ ZGF0YSB8PSAob3JpZ19kYXRhICYgfigofjBVTCkgPDwgZXh0cmFfc2hpZnQpKTsKKworCQlyZXN1 bHQgPSB0b25nYV9zZXRfc21jX3NyYW1fYWRkcmVzcyhzbXVtZ3IsIGFkZHIsIGxpbWl0KTsKKwkJ aWYgKHJlc3VsdCkKKwkJCWdvdG8gb3V0OworCisJCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3It PmRldmljZSwgbW1TTUNfSU5EX0RBVEFfMCwgZGF0YSk7CisJfQorCitvdXQ6CisJcmV0dXJuIHJl c3VsdDsKK30KKworCitpbnQgdG9uZ2FfcHJvZ3JhbV9qdW1wX29uX3N0YXJ0KHN0cnVjdCBwcF9z bXVtZ3IgKnNtdW1ncikKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBwRGF0YVtdID0geyAweEUw LCAweDAwLCAweDgwLCAweDQwIH07CisKKwl0b25nYV9jb3B5X2J5dGVzX3RvX3NtYyhzbXVtZ3Is IDB4MCwgcERhdGEsIDQsIHNpemVvZihwRGF0YSkrMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoq CisqIFJldHVybiBpZiB0aGUgU01DIGlzIGN1cnJlbnRseSBydW5uaW5nLgorKgorKiBAcGFyYW0g ICAgc211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIu CisqLworc3RhdGljIGludCB0b25nYV9pc19zbWNfcmFtX3J1bm5pbmcoc3RydWN0IHBwX3NtdW1n ciAqc211bWdyKQoreworCXJldHVybiAoKDAgPT0gU01VTV9SRUFEX1ZGUEZfSU5ESVJFQ1RfRklF TEQoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJCVNNQ19TWVNDT05fQ0xP Q0tfQ05UTF8wLCBja19kaXNhYmxlKSkKKwkJCSYmICgweDIwMTAwIDw9IGNnc19yZWFkX2luZF9y ZWdpc3RlcihzbXVtZ3ItPmRldmljZSwKKwkJCQkJQ0dTX0lORF9SRUdfX1NNQywgaXhTTUNfUENf QykpKTsKK30KKworc3RhdGljIGludCB0b25nYV9zZW5kX21zZ190b19zbWNfb2Zmc2V0KHN0cnVj dCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlpZiAoc211bWdyID09IE5VTEwgfHwgc211bWdyLT5k ZXZpY2UgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlTTVVNX1dBSVRfRklFTERfVU5F UVVBTChzbXVtZ3IsIFNNQ19SRVNQXzAsIFNNQ19SRVNQLCAwKTsKKworCWNnc193cml0ZV9yZWdp c3RlcihzbXVtZ3ItPmRldmljZSwgbW1TTUNfTVNHX0FSR18wLCAweDIwMDAwKTsKKwljZ3Nfd3Jp dGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX01FU1NBR0VfMCwgUFBTTUNfTVNHX1Rl c3QpOworCisJU01VTV9XQUlUX0ZJRUxEX1VORVFVQUwoc211bWdyLCBTTUNfUkVTUF8wLCBTTUNf UkVTUCwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisqIFNlbmQgYSBtZXNzYWdlIHRvIHRo ZSBTTUMsIGFuZCB3YWl0IGZvciBpdHMgcmVzcG9uc2UuCisqCisqIEBwYXJhbSAgICBzbXVtZ3Ig IHRoZSBhZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyogQHBhcmFt ICAgIG1zZyB0aGUgbWVzc2FnZSB0byBzZW5kLgorKiBAcmV0dXJuICAgVGhlIHJlc3BvbnNlIHRo YXQgY2FtZSBmcm9tIHRoZSBTTUMuCisqLworc3RhdGljIGludCB0b25nYV9zZW5kX21zZ190b19z bWMoc3RydWN0IHBwX3NtdW1nciAqc211bWdyLCB1aW50MTZfdCBtc2cpCit7CisJaWYgKHNtdW1n ciA9PSBOVUxMIHx8IHNtdW1nci0+ZGV2aWNlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOwor CisJaWYgKCF0b25nYV9pc19zbWNfcmFtX3J1bm5pbmcoc211bWdyKSkKKwkJcmV0dXJuIC0xOwor CisJU01VTV9XQUlUX0ZJRUxEX1VORVFVQUwoc211bWdyLCBTTUNfUkVTUF8wLCBTTUNfUkVTUCwg MCk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJMSA9PSBTTVVNX1JFQURfRklFTEQoc211bWdy LT5kZXZpY2UsIFNNQ19SRVNQXzAsIFNNQ19SRVNQKSwKKwkJIkZhaWxlZCB0byBzZW5kIFByZXZp b3VzIE1lc3NhZ2UuIiwKKwkJcmV0dXJuIDEpOworCisJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1n ci0+ZGV2aWNlLCBtbVNNQ19NRVNTQUdFXzAsIG1zZyk7CisKKwlTTVVNX1dBSVRfRklFTERfVU5F UVVBTChzbXVtZ3IsIFNNQ19SRVNQXzAsIFNNQ19SRVNQLCAwKTsKKwlQUF9BU1NFUlRfV0lUSF9D T0RFKAorCQkxID09IFNNVU1fUkVBRF9GSUVMRChzbXVtZ3ItPmRldmljZSwgU01DX1JFU1BfMCwg U01DX1JFU1ApLAorCQkiRmFpbGVkIHRvIHNlbmQgTWVzc2FnZS4iLAorCQlyZXR1cm4gMSk7CisK KwlyZXR1cm4gMDsKK30KKworLyoKKyogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFNNQywgYW5kIGRv IG5vdCB3YWl0IGZvciBpdHMgcmVzcG9uc2UuCisqCisqIEBwYXJhbSAgICBzbXVtZ3IgIHRoZSBh ZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyogQHBhcmFtICAgIG1z ZyB0aGUgbWVzc2FnZSB0byBzZW5kLgorKiBAcmV0dXJuICAgVGhlIHJlc3BvbnNlIHRoYXQgY2Ft ZSBmcm9tIHRoZSBTTUMuCisqLworc3RhdGljIGludCB0b25nYV9zZW5kX21zZ190b19zbWNfd2l0 aG91dF93YWl0aW5nCisJCQkJKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwgdWludDE2X3QgbXNn KQoreworCWlmIChzbXVtZ3IgPT0gTlVMTCB8fCBzbXVtZ3ItPmRldmljZSA9PSBOVUxMKQorCQly ZXR1cm4gLUVJTlZBTDsKKworCVNNVU1fV0FJVF9GSUVMRF9VTkVRVUFMKHNtdW1nciwgU01DX1JF U1BfMCwgU01DX1JFU1AsIDApOworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCTEgPT0gU01VTV9S RUFEX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBTTUNfUkVTUF8wLCBTTUNfUkVTUCksCisJCSJGYWls ZWQgdG8gc2VuZCBQcmV2aW91cyBNZXNzYWdlLiIsCisJCXJldHVybiAwKTsKKwljZ3Nfd3JpdGVf cmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX01FU1NBR0VfMCwgbXNnKTsKKworCXJldHVy biAwOworfQorCisvKgorKiBTZW5kIGEgbWVzc2FnZSB0byB0aGUgU01DIHdpdGggcGFyYW1ldGVy CisqCisqIEBwYXJhbSAgICBzbXVtZ3I6ICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhh cmR3YXJlIG1hbmFnZXIuCisqIEBwYXJhbSAgICBtc2c6IHRoZSBtZXNzYWdlIHRvIHNlbmQuCisq IEBwYXJhbSAgICBwYXJhbWV0ZXI6IHRoZSBwYXJhbWV0ZXIgdG8gc2VuZAorKiBAcmV0dXJuICAg VGhlIHJlc3BvbnNlIHRoYXQgY2FtZSBmcm9tIHRoZSBTTUMuCisqLworc3RhdGljIGludCB0b25n YV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoc3RydWN0IHBwX3NtdW1nciAqc211bWdy LAorCQkJCXVpbnQxNl90IG1zZywgdWludDMyX3QgcGFyYW1ldGVyKQoreworCWlmIChzbXVtZ3Ig PT0gTlVMTCB8fCBzbXVtZ3ItPmRldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CWlmICghdG9uZ2FfaXNfc21jX3JhbV9ydW5uaW5nKHNtdW1ncikpCisJCXJldHVybiBQUFNNQ19S ZXN1bHRfRmFpbGVkOworCisJU01VTV9XQUlUX0ZJRUxEX1VORVFVQUwoc211bWdyLCBTTUNfUkVT UF8wLCBTTUNfUkVTUCwgMCk7CisJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBt bVNNQ19NU0dfQVJHXzAsIHBhcmFtZXRlcik7CisKKwlyZXR1cm4gdG9uZ2Ffc2VuZF9tc2dfdG9f c21jKHNtdW1nciwgbXNnKTsKK30KKworLyoKKyogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFNNQyB3 aXRoIHBhcmFtZXRlciwgZG8gbm90IHdhaXQgZm9yIHJlc3BvbnNlCisqCisqIEBwYXJhbSAgICBz bXVtZ3I6ICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisq IEBwYXJhbSAgICBtc2c6IHRoZSBtZXNzYWdlIHRvIHNlbmQuCisqIEBwYXJhbSAgICBwYXJhbWV0 ZXI6IHRoZSBwYXJhbWV0ZXIgdG8gc2VuZAorKiBAcmV0dXJuICAgVGhlIHJlc3BvbnNlIHRoYXQg Y2FtZSBmcm9tIHRoZSBTTUMuCisqLworc3RhdGljIGludCB0b25nYV9zZW5kX21zZ190b19zbWNf d2l0aF9wYXJhbWV0ZXJfd2l0aG91dF93YWl0aW5nKAorCQkJc3RydWN0IHBwX3NtdW1nciAqc211 bWdyLAorCQkJdWludDE2X3QgbXNnLCB1aW50MzJfdCBwYXJhbWV0ZXIpCit7CisJaWYgKHNtdW1n ciA9PSBOVUxMIHx8IHNtdW1nci0+ZGV2aWNlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOwor CisJU01VTV9XQUlUX0ZJRUxEX1VORVFVQUwoc211bWdyLCBTTUNfUkVTUF8wLCBTTUNfUkVTUCwg MCk7CisKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX01TR19BUkdf MCwgcGFyYW1ldGVyKTsKKworCXJldHVybiB0b25nYV9zZW5kX21zZ190b19zbWNfd2l0aG91dF93 YWl0aW5nKHNtdW1nciwgbXNnKTsKK30KKworLyoKKyAqIFJlYWQgYSAzMmJpdCB2YWx1ZSBmcm9t IHRoZSBTTUMgU1JBTSBzcGFjZS4KKyAqIEFMTCBQQVJBTUVURVJTIEFSRSBJTiBIT1NUIEJZVEUg T1JERVIuCisgKiBAcGFyYW0gICAgc211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5 IGhhcmR3YXJlIG1hbmFnZXIuCisgKiBAcGFyYW0gICAgc21jQWRkcmVzcyB0aGUgYWRkcmVzcyBp biB0aGUgU01DIFJBTSB0byBhY2Nlc3MuCisgKiBAcGFyYW0gICAgdmFsdWUgYW5kIG91dHB1dCBw YXJhbWV0ZXIgZm9yIHRoZSBkYXRhIHJlYWQgZnJvbSB0aGUgU01DIFNSQU0uCisgKi8KK2ludCB0 b25nYV9yZWFkX3NtY19zcmFtX2R3b3JkKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwKKwkJCQkJ dWludDMyX3Qgc21jQWRkcmVzcywgdWludDMyX3QgKnZhbHVlLAorCQkJCQl1aW50MzJfdCBsaW1p dCkKK3sKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0gdG9uZ2Ffc2V0X3NtY19zcmFtX2FkZHJl c3Moc211bWdyLCBzbWNBZGRyZXNzLCBsaW1pdCk7CisKKwlpZiAoMCAhPSByZXN1bHQpCisJCXJl dHVybiByZXN1bHQ7CisKKwkqdmFsdWUgPSBjZ3NfcmVhZF9yZWdpc3RlcihzbXVtZ3ItPmRldmlj ZSwgbW1TTUNfSU5EX0RBVEFfMCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdyaXRlIGEg MzJiaXQgdmFsdWUgdG8gdGhlIFNNQyBTUkFNIHNwYWNlLgorICogQUxMIFBBUkFNRVRFUlMgQVJF IElOIEhPU1QgQllURSBPUkRFUi4KKyAqIEBwYXJhbSAgICBzbXVtZ3IgIHRoZSBhZGRyZXNzIG9m IHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICBzbWNBZGRyZXNz IHRoZSBhZGRyZXNzIGluIHRoZSBTTUMgUkFNIHRvIGFjY2Vzcy4KKyAqIEBwYXJhbSAgICB2YWx1 ZSB0byB3cml0ZSB0byB0aGUgU01DIFNSQU0uCisgKi8KK2ludCB0b25nYV93cml0ZV9zbWNfc3Jh bV9kd29yZChzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IsCisJCQkJCXVpbnQzMl90IHNtY0FkZHJl c3MsIHVpbnQzMl90IHZhbHVlLAorCQkJCQl1aW50MzJfdCBsaW1pdCkKK3sKKwlpbnQgcmVzdWx0 OworCisJcmVzdWx0ID0gdG9uZ2Ffc2V0X3NtY19zcmFtX2FkZHJlc3Moc211bWdyLCBzbWNBZGRy ZXNzLCBsaW1pdCk7CisKKwlpZiAoMCAhPSByZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwlj Z3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX0lORF9EQVRBXzAsIHZhbHVl KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX3NtdV9maW5pKHN0cnVjdCBw cF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlpZiAoc211bWdyLT5iYWNrZW5kICE9IE5VTEwpIHsKKwkJ a2ZyZWUoc211bWdyLT5iYWNrZW5kKTsKKwkJc211bWdyLT5iYWNrZW5kID0gTlVMTDsKKwl9CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIGNnc191Y29kZV9pZCB0b25nYV9jb252ZXJ0X2Z3 X3R5cGVfdG9fY2dzKHVpbnQzMl90IGZ3X3R5cGUpCit7CisJZW51bSBjZ3NfdWNvZGVfaWQgcmVz dWx0ID0gQ0dTX1VDT0RFX0lEX01BWElNVU07CisKKwlzd2l0Y2ggKGZ3X3R5cGUpIHsKKwljYXNl IFVDT0RFX0lEX1NNVToKKwkJcmVzdWx0ID0gQ0dTX1VDT0RFX0lEX1NNVTsKKwkJYnJlYWs7CisJ Y2FzZSBVQ09ERV9JRF9TRE1BMDoKKwkJcmVzdWx0ID0gQ0dTX1VDT0RFX0lEX1NETUEwOworCQli cmVhazsKKwljYXNlIFVDT0RFX0lEX1NETUExOgorCQlyZXN1bHQgPSBDR1NfVUNPREVfSURfU0RN QTE7CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfQ1BfQ0U6CisJCXJlc3VsdCA9IENHU19VQ09E RV9JRF9DUF9DRTsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9DUF9QRlA6CisJCXJlc3VsdCA9 IENHU19VQ09ERV9JRF9DUF9QRlA7CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfQ1BfTUU6CisJ CXJlc3VsdCA9IENHU19VQ09ERV9JRF9DUF9NRTsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9D UF9NRUM6CisJCXJlc3VsdCA9IENHU19VQ09ERV9JRF9DUF9NRUM7CisJCWJyZWFrOworCWNhc2Ug VUNPREVfSURfQ1BfTUVDX0pUMToKKwkJcmVzdWx0ID0gQ0dTX1VDT0RFX0lEX0NQX01FQ19KVDE7 CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfQ1BfTUVDX0pUMjoKKwkJcmVzdWx0ID0gQ0dTX1VD T0RFX0lEX0NQX01FQ19KVDI7CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfUkxDX0c6CisJCXJl c3VsdCA9IENHU19VQ09ERV9JRF9STENfRzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7 CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBDb252ZXJ0IHRoZSBQUElSSSBm aXJtd2FyZSB0eXBlIHRvIFNNVSB0eXBlIG1hc2suCisgKiBGb3IgTUVDLCB3ZSBuZWVkIHRvIGNo ZWNrIGFsbCBNRUMgcmVsYXRlZCB0eXBlCisqLworc3RhdGljIHVpbnQxNl90IHRvbmdhX2dldF9t YXNrX2Zvcl9maXJtd2FyZV90eXBlKHVpbnQxNl90IGZpcm13YXJlVHlwZSkKK3sKKwl1aW50MTZf dCByZXN1bHQgPSAwOworCisJc3dpdGNoIChmaXJtd2FyZVR5cGUpIHsKKwljYXNlIFVDT0RFX0lE X1NETUEwOgorCQlyZXN1bHQgPSBVQ09ERV9JRF9TRE1BMF9NQVNLOworCQlicmVhazsKKwljYXNl IFVDT0RFX0lEX1NETUExOgorCQlyZXN1bHQgPSBVQ09ERV9JRF9TRE1BMV9NQVNLOworCQlicmVh azsKKwljYXNlIFVDT0RFX0lEX0NQX0NFOgorCQlyZXN1bHQgPSBVQ09ERV9JRF9DUF9DRV9NQVNL OworCQlicmVhazsKKwljYXNlIFVDT0RFX0lEX0NQX1BGUDoKKwkJcmVzdWx0ID0gVUNPREVfSURf Q1BfUEZQX01BU0s7CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfQ1BfTUU6CisJCXJlc3VsdCA9 IFVDT0RFX0lEX0NQX01FX01BU0s7CisJCWJyZWFrOworCWNhc2UgVUNPREVfSURfQ1BfTUVDOgor CWNhc2UgVUNPREVfSURfQ1BfTUVDX0pUMToKKwljYXNlIFVDT0RFX0lEX0NQX01FQ19KVDI6CisJ CXJlc3VsdCA9IFVDT0RFX0lEX0NQX01FQ19NQVNLOworCQlicmVhazsKKwljYXNlIFVDT0RFX0lE X1JMQ19HOgorCQlyZXN1bHQgPSBVQ09ERV9JRF9STENfR19NQVNLOworCQlicmVhazsKKwlkZWZh dWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIENoZWNr IGlmIHRoZSBGVyBoYXMgYmVlbiBsb2FkZWQsCisgKiBTTVUgd2lsbCBub3QgcmV0dXJuIGlmIGxv YWRpbmcgaGFzIG5vdCBmaW5pc2hlZC4KKyovCitzdGF0aWMgaW50IHRvbmdhX2NoZWNrX2Z3X2xv YWRfZmluaXNoKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwgdWludDMyX3QgZndUeXBlKQorewor CXVpbnQxNl90IGZ3TWFzayA9IHRvbmdhX2dldF9tYXNrX2Zvcl9maXJtd2FyZV90eXBlKGZ3VHlw ZSk7CisKKwlpZiAoMCAhPSBTTVVNX1dBSVRfVkZQRl9JTkRJUkVDVF9SRUdJU1RFUihzbXVtZ3Is IFNNQ19JTkQsCisJCQkJU09GVF9SRUdJU1RFUlNfVEFCTEVfMjgsIGZ3TWFzaywgZndNYXNrKSkg eworCQlwcmludGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0gY2hlY2sgZmlybXdhcmUgbG9hZGlu ZyBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor LyogUG9wdWxhdGUgb25lIGZpcm13YXJlIGltYWdlIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSAqLwor c3RhdGljIGludCB0b25nYV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkoc3RydWN0IHBw X3NtdW1nciAqc211bWdyLAorCQkJCXVpbnQxNl90IGZpcm13YXJlX3R5cGUsCisJCQkJc3RydWN0 IFNNVV9FbnRyeSAqcGVudHJ5KQoreworCWludCByZXN1bHQ7CisJc3RydWN0IGNnc19maXJtd2Fy ZV9pbmZvIGluZm8gPSB7MH07CisKKwlyZXN1bHQgPSBjZ3NfZ2V0X2Zpcm13YXJlX2luZm8oCisJ CQkJc211bWdyLT5kZXZpY2UsCisJCQkJdG9uZ2FfY29udmVydF9md190eXBlX3RvX2NncyhmaXJt d2FyZV90eXBlKSwKKwkJCQkmaW5mbyk7CisKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJcGVudHJ5 LT52ZXJzaW9uID0gMDsKKwkJcGVudHJ5LT5pZCA9ICh1aW50MTZfdClmaXJtd2FyZV90eXBlOwor CQlwZW50cnktPmltYWdlX2FkZHJfaGlnaCA9IHNtdV91cHBlcl8zMl9iaXRzKGluZm8ubWNfYWRk cik7CisJCXBlbnRyeS0+aW1hZ2VfYWRkcl9sb3cgPSBzbXVfbG93ZXJfMzJfYml0cyhpbmZvLm1j X2FkZHIpOworCQlwZW50cnktPm1ldGFfZGF0YV9hZGRyX2hpZ2ggPSAwOworCQlwZW50cnktPm1l dGFfZGF0YV9hZGRyX2xvdyA9IDA7CisJCXBlbnRyeS0+ZGF0YV9zaXplX2J5dGUgPSBpbmZvLmlt YWdlX3NpemU7CisJCXBlbnRyeS0+bnVtX3JlZ2lzdGVyX2VudHJpZXMgPSAwOworCisJCWlmIChm aXJtd2FyZV90eXBlID09IFVDT0RFX0lEX1JMQ19HKQorCQkJcGVudHJ5LT5mbGFncyA9IDE7CisJ CWVsc2UKKwkJCXBlbnRyeS0+ZmxhZ3MgPSAwOworCX0gZWxzZSB7CisJCXJldHVybiByZXN1bHQ7 CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB0b25nYV9yZXF1ZXN0X3Nt dV9yZWxvYWRfZncoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCXN0cnVjdCB0b25nYV9z bXVtZ3IgKnRvbmdhX3NtdSA9CisJCShzdHJ1Y3QgdG9uZ2Ffc211bWdyICopKHNtdW1nci0+YmFj a2VuZCk7CisJdWludDE2X3QgZndfdG9fbG9hZDsKKwlpbnQgcmVzdWx0ID0gMDsKKwlzdHJ1Y3Qg U01VX0RSQU1EYXRhX1RPQyAqdG9jOworCS8qKgorCSAqIEZpcnN0IHRpbWUgdGhpcyBnZXRzIGNh bGxlZCBkdXJpbmcgU211TWdyIGluaXQsCisJICogd2UgaGF2ZW4ndCBwcm9jZXNzZWQgU01VIGhl YWRlciBmaWxlIHlldCwKKwkgKiBzbyBTb2Z0IFJlZ2lzdGVyIFN0YXJ0IG9mZnNldCBpcyB1bmtu b3duLgorCSAqIEhvd2V2ZXIsIGZvciB0aGlzIGNhc2UsIFVjb2RlTG9hZFN0YXR1cyBpcyBhbHJl YWR5IDAsCisJICogc28gd2UgY2FuIHNraXAgdGhpcyBpZiB0aGUgU29mdCBSZWdpc3RlcnMgU3Rh cnQgb2Zmc2V0IGlzIDAuCisJICovCisJY2dzX3dyaXRlX2luZF9yZWdpc3RlcihzbXVtZ3ItPmRl dmljZSwKKwkJQ0dTX0lORF9SRUdfX1NNQywgaXhTT0ZUX1JFR0lTVEVSU19UQUJMRV8yOCwgMCk7 CisKKwl0b25nYV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoc211bWdyLAorCQlQUFNN Q19NU0dfU01VX0RSQU1fQUREUl9ISSwKKwkJdG9uZ2Ffc211LT5zbXVfYnVmZmVyLm1jX2FkZHJf aGlnaCk7CisJdG9uZ2Ffc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKHNtdW1nciwKKwkJ UFBTTUNfTVNHX1NNVV9EUkFNX0FERFJfTE8sCisJCXRvbmdhX3NtdS0+c211X2J1ZmZlci5tY19h ZGRyX2xvdyk7CisKKwl0b2MgPSAoc3RydWN0IFNNVV9EUkFNRGF0YV9UT0MgKil0b25nYV9zbXUt PnBIZWFkZXI7CisJdG9jLT5udW1fZW50cmllcyA9IDA7CisJdG9jLT5zdHJ1Y3R1cmVfdmVyc2lv biA9IDE7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkwID09IHRvbmdhX3BvcHVsYXRlX3Np bmdsZV9maXJtd2FyZV9lbnRyeShzbXVtZ3IsCisJCVVDT0RFX0lEX1JMQ19HLAorCQkmdG9jLT5l bnRyeVt0b2MtPm51bV9lbnRyaWVzKytdKSwKKwkJIkZhaWxlZCB0byBHZXQgRmlybXdhcmUgRW50 cnkuXG4iLAorCQlyZXR1cm4gLTEpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCTAgPT0gdG9u Z2FfcG9wdWxhdGVfc2luZ2xlX2Zpcm13YXJlX2VudHJ5KHNtdW1nciwKKwkJVUNPREVfSURfQ1Bf Q0UsCisJCSZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10pLAorCQkiRmFpbGVkIHRvIEdl dCBGaXJtd2FyZSBFbnRyeS5cbiIsCisJCXJldHVybiAtMSk7CisJUFBfQVNTRVJUX1dJVEhfQ09E RSgKKwkJMCA9PSB0b25nYV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkKKwkJKHNtdW1n ciwgVUNPREVfSURfQ1BfUEZQLCAmdG9jLT5lbnRyeVt0b2MtPm51bV9lbnRyaWVzKytdKSwKKwkJ IkZhaWxlZCB0byBHZXQgRmlybXdhcmUgRW50cnkuXG4iLCByZXR1cm4gLTEpOworCVBQX0FTU0VS VF9XSVRIX0NPREUoCisJCTAgPT0gdG9uZ2FfcG9wdWxhdGVfc2luZ2xlX2Zpcm13YXJlX2VudHJ5 CisJCShzbXVtZ3IsIFVDT0RFX0lEX0NQX01FLCAmdG9jLT5lbnRyeVt0b2MtPm51bV9lbnRyaWVz KytdKSwKKwkJIkZhaWxlZCB0byBHZXQgRmlybXdhcmUgRW50cnkuXG4iLCByZXR1cm4gLTEpOwor CVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCTAgPT0gdG9uZ2FfcG9wdWxhdGVfc2luZ2xlX2Zpcm13 YXJlX2VudHJ5CisJCShzbXVtZ3IsIFVDT0RFX0lEX0NQX01FQywgJnRvYy0+ZW50cnlbdG9jLT5u dW1fZW50cmllcysrXSksCisJCSJGYWlsZWQgdG8gR2V0IEZpcm13YXJlIEVudHJ5LlxuIiwgcmV0 dXJuIC0xKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkwID09IHRvbmdhX3BvcHVsYXRlX3Np bmdsZV9maXJtd2FyZV9lbnRyeQorCQkoc211bWdyLCBVQ09ERV9JRF9DUF9NRUNfSlQxLCAmdG9j LT5lbnRyeVt0b2MtPm51bV9lbnRyaWVzKytdKSwKKwkJIkZhaWxlZCB0byBHZXQgRmlybXdhcmUg RW50cnkuXG4iLCByZXR1cm4gLTEpOworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCTAgPT0gdG9u Z2FfcG9wdWxhdGVfc2luZ2xlX2Zpcm13YXJlX2VudHJ5CisJCShzbXVtZ3IsIFVDT0RFX0lEX0NQ X01FQ19KVDIsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10pLAorCQkiRmFpbGVkIHRv IEdldCBGaXJtd2FyZSBFbnRyeS5cbiIsIHJldHVybiAtMSk7CisJUFBfQVNTRVJUX1dJVEhfQ09E RSgKKwkJMCA9PSB0b25nYV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkKKwkJKHNtdW1n ciwgVUNPREVfSURfU0RNQTAsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10pLAorCQki RmFpbGVkIHRvIEdldCBGaXJtd2FyZSBFbnRyeS5cbiIsIHJldHVybiAtMSk7CisJUFBfQVNTRVJU X1dJVEhfQ09ERSgKKwkJMCA9PSB0b25nYV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkK KwkJKHNtdW1nciwgVUNPREVfSURfU0RNQTEsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMr K10pLAorCQkiRmFpbGVkIHRvIEdldCBGaXJtd2FyZSBFbnRyeS5cbiIsIHJldHVybiAtMSk7CisK Kwl0b25nYV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoc211bWdyLAorCQlQUFNNQ19N U0dfRFJWX0RSQU1fQUREUl9ISSwKKwkJdG9uZ2Ffc211LT5oZWFkZXJfYnVmZmVyLm1jX2FkZHJf aGlnaCk7CisJdG9uZ2Ffc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKHNtdW1nciwKKwkJ UFBTTUNfTVNHX0RSVl9EUkFNX0FERFJfTE8sCisJCXRvbmdhX3NtdS0+aGVhZGVyX2J1ZmZlci5t Y19hZGRyX2xvdyk7CisKKwlmd190b19sb2FkID0gVUNPREVfSURfUkxDX0dfTUFTSworCQkJKyBV Q09ERV9JRF9TRE1BMF9NQVNLCisJCQkrIFVDT0RFX0lEX1NETUExX01BU0sKKwkJCSsgVUNPREVf SURfQ1BfQ0VfTUFTSworCQkJKyBVQ09ERV9JRF9DUF9NRV9NQVNLCisJCQkrIFVDT0RFX0lEX0NQ X1BGUF9NQVNLCisJCQkrIFVDT0RFX0lEX0NQX01FQ19NQVNLOworCisJUFBfQVNTRVJUX1dJVEhf Q09ERSgKKwkJMCA9PSB0b25nYV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXJfd2l0aG91 dF93YWl0aW5nKAorCQlzbXVtZ3IsIFBQU01DX01TR19Mb2FkVWNvZGVzLCBmd190b19sb2FkKSwK KwkJIkZhaWwgdG8gUmVxdWVzdCBTTVUgTG9hZCB1Q29kZSIsIHJldHVybiAwKTsKKworCXJldHVy biByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2FfcmVxdWVzdF9zbXVfbG9hZF9zcGVjaWZp Y19mdyhzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IsCisJCQkJdWludDMyX3QgZmlybXdhcmVUeXBl KQoreworCXJldHVybiAwOworfQorCisvKioKKyAqIFVwbG9hZCB0aGUgU01DIGZpcm13YXJlIHRv IHRoZSBTTUMgbWljcm9jb250cm9sbGVyLgorICoKKyAqIEBwYXJhbSAgICBzbXVtZ3IgIHRoZSBh ZGRyZXNzIG9mIHRoZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICBw RmlybXdhcmUgdGhlIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIHZhcmlvdXMgc2VjdGlv bnMgb2YgdGhlIGZpcm13YXJlLgorICovCitzdGF0aWMgaW50IHRvbmdhX3NtdV91cGxvYWRfZmly bXdhcmVfaW1hZ2Uoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCWNvbnN0IHVpbnQ4X3Qg KnNyYzsKKwl1aW50MzJfdCBieXRlX2NvdW50OworCXVpbnQzMl90ICpkYXRhOworCXN0cnVjdCBj Z3NfZmlybXdhcmVfaW5mbyBpbmZvID0gezB9OworCisJaWYgKHNtdW1nciA9PSBOVUxMIHx8IHNt dW1nci0+ZGV2aWNlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJY2dzX2dldF9maXJt d2FyZV9pbmZvKHNtdW1nci0+ZGV2aWNlLAorCQl0b25nYV9jb252ZXJ0X2Z3X3R5cGVfdG9fY2dz KFVDT0RFX0lEX1NNVSksICZpbmZvKTsKKworCWlmIChpbmZvLmltYWdlX3NpemUgJiAzKSB7CisJ CXByaW50ayhLRVJOX0VSUiAiWyBwb3dlcnBsYXkgXSBTTUMgdWNvZGUgaXMgbm90IDQgYnl0ZXMg YWxpZ25lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChpbmZvLmltYWdlX3Np emUgPiBUT05HQV9TTUNfU0laRSkgeworCQlwcmludGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0g U01DIGFkZHJlc3MgaXMgYmV5b25kIHRoZSBTTUMgUkFNIGFyZWFcbiIpOworCQlyZXR1cm4gLUVJ TlZBTDsKKwl9CisKKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX0lO RF9JTkRFWF8wLCAweDIwMDAwKTsKKwlTTVVNX1dSSVRFX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBT TUNfSU5EX0FDQ0VTU19DTlRMLCBBVVRPX0lOQ1JFTUVOVF9JTkRfMCwgMSk7CisKKwlieXRlX2Nv dW50ID0gaW5mby5pbWFnZV9zaXplOworCXNyYyA9IChjb25zdCB1aW50OF90ICopaW5mby5rcHRy OworCisJZGF0YSA9ICh1aW50MzJfdCAqKXNyYzsKKwlmb3IgKDsgYnl0ZV9jb3VudCA+PSA0OyBk YXRhKyssIGJ5dGVfY291bnQgLT0gNCkKKwkJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1nci0+ZGV2 aWNlLCBtbVNNQ19JTkRfREFUQV8wLCBkYXRhWzBdKTsKKworCVNNVU1fV1JJVEVfRklFTEQoc211 bWdyLT5kZXZpY2UsIFNNQ19JTkRfQUNDRVNTX0NOVEwsIEFVVE9fSU5DUkVNRU5UX0lORF8wLCAw KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRvbmdhX3N0YXJ0X2luX3Byb3RlY3Rp b25fbW9kZShzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJaW50IHJlc3VsdDsKKworCS8q IEFzc2VydCByZXNldCAqLworCVNNVU1fV1JJVEVfVkZQRl9JTkRJUkVDVF9GSUVMRChzbXVtZ3It PmRldmljZSwgQ0dTX0lORF9SRUdfX1NNQywKKwkJU01DX1NZU0NPTl9SRVNFVF9DTlRMLCByc3Rf cmVnLCAxKTsKKworCXJlc3VsdCA9IHRvbmdhX3NtdV91cGxvYWRfZmlybXdhcmVfaW1hZ2Uoc211 bWdyKTsKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gcmVzdWx0OworCisJLyogQ2xlYXIgc3RhdHVz ICovCisJY2dzX3dyaXRlX2luZF9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdf X1NNQywKKwkJaXhTTVVfU1RBVFVTLCAwKTsKKworCS8qIEVuYWJsZSBjbG9jayAqLworCVNNVU1f V1JJVEVfVkZQRl9JTkRJUkVDVF9GSUVMRChzbXVtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdfX1NN QywKKwkJU01DX1NZU0NPTl9DTE9DS19DTlRMXzAsIGNrX2Rpc2FibGUsIDApOworCisJLyogRGUt YXNzZXJ0IHJlc2V0ICovCisJU01VTV9XUklURV9WRlBGX0lORElSRUNUX0ZJRUxEKHNtdW1nci0+ ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQlTTUNfU1lTQ09OX1JFU0VUX0NOVEwsIHJzdF9y ZWcsIDApOworCisJLyogU2V0IFNNVSBBdXRvIFN0YXJ0ICovCisJU01VTV9XUklURV9WRlBGX0lO RElSRUNUX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQlTTVVfSU5Q VVRfREFUQSwgQVVUT19TVEFSVCwgMSk7CisKKwkvKiBDbGVhciBmaXJtd2FyZSBpbnRlcnJ1cHQg ZW5hYmxlIGZsYWcgKi8KKwljZ3Nfd3JpdGVfaW5kX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBD R1NfSU5EX1JFR19fU01DLAorCQlpeEZJUk1XQVJFX0ZMQUdTLCAwKTsKKworCVNNVU1fV0FJVF9W RlBGX0lORElSRUNUX0ZJRUxEKHNtdW1nciwgU01DX0lORCwKKwkJUkNVX1VDX0VWRU5UUywgSU5U RVJSVVBUU19FTkFCTEVELCAxKTsKKworCS8qKgorCSAqIENhbGwgVGVzdCBTTVUgbWVzc2FnZSB3 aXRoIDB4MjAwMDAgb2Zmc2V0IHRvIHRyaWdnZXIgU01VIHN0YXJ0CisJICovCisJdG9uZ2Ffc2Vu ZF9tc2dfdG9fc21jX29mZnNldChzbXVtZ3IpOworCisJLyogV2FpdCBmb3IgZG9uZSBiaXQgdG8g YmUgc2V0ICovCisJU01VTV9XQUlUX1ZGUEZfSU5ESVJFQ1RfRklFTERfVU5FUVVBTChzbXVtZ3Is IFNNQ19JTkQsCisJCVNNVV9TVEFUVVMsIFNNVV9ET05FLCAwKTsKKworCS8qIENoZWNrIHBhc3Mv ZmFpbGVkIGluZGljYXRvciAqLworCWlmICgxICE9IFNNVU1fUkVBRF9WRlBGX0lORElSRUNUX0ZJ RUxEKHNtdW1nci0+ZGV2aWNlLAorCQkJCUNHU19JTkRfUkVHX19TTUMsIFNNVV9TVEFUVVMsIFNN VV9QQVNTKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlsgcG93ZXJwbGF5IF0gU01VIEZpcm13YXJl IHN0YXJ0IGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIFdhaXQgZm9y IGZpcm13YXJlIHRvIGluaXRpYWxpemUgKi8KKwlTTVVNX1dBSVRfVkZQRl9JTkRJUkVDVF9GSUVM RChzbXVtZ3IsIFNNQ19JTkQsCisJCUZJUk1XQVJFX0ZMQUdTLCBJTlRFUlJVUFRTX0VOQUJMRUQs IDEpOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCB0b25nYV9zdGFydF9pbl9ub25f cHJvdGVjdGlvbl9tb2RlKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlpbnQgcmVzdWx0 ID0gMDsKKworCS8qIHdhaXQgZm9yIHNtYyBib290IHVwICovCisJU01VTV9XQUlUX1ZGUEZfSU5E SVJFQ1RfRklFTERfVU5FUVVBTChzbXVtZ3IsIFNNQ19JTkQsCisJCVJDVV9VQ19FVkVOVFMsIGJv b3Rfc2VxX2RvbmUsIDApOworCisJLypDbGVhciBmaXJtd2FyZSBpbnRlcnJ1cHQgZW5hYmxlIGZs YWcqLworCWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVH X19TTUMsCisJCWl4RklSTVdBUkVfRkxBR1MsIDApOworCisKKwlTTVVNX1dSSVRFX1ZGUEZfSU5E SVJFQ1RfRklFTEQoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCVNNQ19TWVND T05fUkVTRVRfQ05UTCwgcnN0X3JlZywgMSk7CisKKwlyZXN1bHQgPSB0b25nYV9zbXVfdXBsb2Fk X2Zpcm13YXJlX2ltYWdlKHNtdW1ncik7CisKKwlpZiAocmVzdWx0ICE9IDApCisJCXJldHVybiBy ZXN1bHQ7CisKKwkvKiBTZXQgc21jIGluc3RydWN0IHN0YXJ0IHBvaW50IGF0IDB4MCAqLworCXRv bmdhX3Byb2dyYW1fanVtcF9vbl9zdGFydChzbXVtZ3IpOworCisKKwlTTVVNX1dSSVRFX1ZGUEZf SU5ESVJFQ1RfRklFTEQoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCVNNQ19T WVNDT05fQ0xPQ0tfQ05UTF8wLCBja19kaXNhYmxlLCAwKTsKKworCS8qRGUtYXNzZXJ0IHJlc2V0 Ki8KKwlTTVVNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoc211bWdyLT5kZXZpY2UsIENHU19J TkRfUkVHX19TTUMsCisJCVNNQ19TWVNDT05fUkVTRVRfQ05UTCwgcnN0X3JlZywgMCk7CisKKwkv KiBXYWl0IGZvciBmaXJtd2FyZSB0byBpbml0aWFsaXplICovCisJU01VTV9XQUlUX1ZGUEZfSU5E SVJFQ1RfRklFTEQoc211bWdyLCBTTUNfSU5ELAorCQlGSVJNV0FSRV9GTEFHUywgSU5URVJSVVBU U19FTkFCTEVELCAxKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgdG9uZ2Ff c3RhcnRfc211KHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlpbnQgcmVzdWx0OworCisJ LyogT25seSBzdGFydCBTTUMgaWYgU01DIFJBTSBpcyBub3QgcnVubmluZyAqLworCWlmICghdG9u Z2FfaXNfc21jX3JhbV9ydW5uaW5nKHNtdW1ncikpIHsKKwkJLypDaGVjayBpZiBTTVUgaXMgcnVu bmluZyBpbiBwcm90ZWN0ZWQgbW9kZSovCisJCWlmICgwID09IFNNVU1fUkVBRF9WRlBGX0lORElS RUNUX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJCQlTTVVfRklS TVdBUkUsIFNNVV9NT0RFKSkgeworCQkJcmVzdWx0ID0gdG9uZ2Ffc3RhcnRfaW5fbm9uX3Byb3Rl Y3Rpb25fbW9kZShzbXVtZ3IpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlyZXR1cm4gcmVzdWx0Owor CQl9IGVsc2UgeworCQkJcmVzdWx0ID0gdG9uZ2Ffc3RhcnRfaW5fcHJvdGVjdGlvbl9tb2RlKHNt dW1ncik7CisJCQlpZiAocmVzdWx0KQorCQkJCXJldHVybiByZXN1bHQ7CisJCX0KKwl9CisKKwly ZXN1bHQgPSB0b25nYV9yZXF1ZXN0X3NtdV9yZWxvYWRfZncoc211bWdyKTsKKworCXJldHVybiBy ZXN1bHQ7Cit9CisKKy8qKgorICogV3JpdGUgYSAzMmJpdCB2YWx1ZSB0byB0aGUgU01DIFNSQU0g c3BhY2UuCisgKiBBTEwgUEFSQU1FVEVSUyBBUkUgSU4gSE9TVCBCWVRFIE9SREVSLgorICogQHBh cmFtICAgIHNtdW1nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5h Z2VyLgorICogQHBhcmFtICAgIHNtY0FkZHJlc3MgdGhlIGFkZHJlc3MgaW4gdGhlIFNNQyBSQU0g dG8gYWNjZXNzLgorICogQHBhcmFtICAgIHZhbHVlIHRvIHdyaXRlIHRvIHRoZSBTTUMgU1JBTS4K KyAqLworc3RhdGljIGludCB0b25nYV9zbXVfaW5pdChzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3Ip Cit7CisJc3RydWN0IHRvbmdhX3NtdW1nciAqdG9uZ2Ffc211OworCXVpbnQ4X3QgKmludGVybmFs X2J1ZjsKKwl1aW50NjRfdCBtY19hZGRyID0gMDsKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGJh Y2tlbmQgcHJpdmF0ZSBkYXRhICovCisJdG9uZ2Ffc211ID0gKHN0cnVjdCB0b25nYV9zbXVtZ3Ig Kikoc211bWdyLT5iYWNrZW5kKTsKKwl0b25nYV9zbXUtPmhlYWRlcl9idWZmZXIuZGF0YV9zaXpl ID0KKwkJKChzaXplb2Yoc3RydWN0IFNNVV9EUkFNRGF0YV9UT0MpIC8gNDA5NikgKyAxKSAqIDQw OTY7CisJdG9uZ2Ffc211LT5zbXVfYnVmZmVyLmRhdGFfc2l6ZSA9IDIwMCo0MDk2OworCisJc211 X2FsbG9jYXRlX21lbW9yeShzbXVtZ3ItPmRldmljZSwKKwkJdG9uZ2Ffc211LT5oZWFkZXJfYnVm ZmVyLmRhdGFfc2l6ZSwKKwkJQ0dTX0dQVV9NRU1fVFlQRV9fVklTSUJMRV9DT05USUdfRkIsCisJ CVBBR0VfU0laRSwKKwkJJm1jX2FkZHIsCisJCSZ0b25nYV9zbXUtPmhlYWRlcl9idWZmZXIua2Fk ZHIsCisJCSZ0b25nYV9zbXUtPmhlYWRlcl9idWZmZXIuaGFuZGxlKTsKKworCXRvbmdhX3NtdS0+ cEhlYWRlciA9IHRvbmdhX3NtdS0+aGVhZGVyX2J1ZmZlci5rYWRkcjsKKwl0b25nYV9zbXUtPmhl YWRlcl9idWZmZXIubWNfYWRkcl9oaWdoID0gc211X3VwcGVyXzMyX2JpdHMobWNfYWRkcik7CisJ dG9uZ2Ffc211LT5oZWFkZXJfYnVmZmVyLm1jX2FkZHJfbG93ID0gc211X2xvd2VyXzMyX2JpdHMo bWNfYWRkcik7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKChOVUxMICE9IHRvbmdhX3NtdS0+cEhl YWRlciksCisJCSJPdXQgb2YgbWVtb3J5LiIsCisJCWtmcmVlKHNtdW1nci0+YmFja2VuZCk7CisJ CWNnc19mcmVlX2dwdV9tZW0oc211bWdyLT5kZXZpY2UsCisJCShjZ3NfaGFuZGxlX3QpdG9uZ2Ff c211LT5oZWFkZXJfYnVmZmVyLmhhbmRsZSk7CisJCXJldHVybiAtMSk7CisKKwlzbXVfYWxsb2Nh dGVfbWVtb3J5KHNtdW1nci0+ZGV2aWNlLAorCQl0b25nYV9zbXUtPnNtdV9idWZmZXIuZGF0YV9z aXplLAorCQlDR1NfR1BVX01FTV9UWVBFX19WSVNJQkxFX0NPTlRJR19GQiwKKwkJUEFHRV9TSVpF LAorCQkmbWNfYWRkciwKKwkJJnRvbmdhX3NtdS0+c211X2J1ZmZlci5rYWRkciwKKwkJJnRvbmdh X3NtdS0+c211X2J1ZmZlci5oYW5kbGUpOworCisJaW50ZXJuYWxfYnVmID0gdG9uZ2Ffc211LT5z bXVfYnVmZmVyLmthZGRyOworCXRvbmdhX3NtdS0+c211X2J1ZmZlci5tY19hZGRyX2hpZ2ggPSBz bXVfdXBwZXJfMzJfYml0cyhtY19hZGRyKTsKKwl0b25nYV9zbXUtPnNtdV9idWZmZXIubWNfYWRk cl9sb3cgPSBzbXVfbG93ZXJfMzJfYml0cyhtY19hZGRyKTsKKworCVBQX0FTU0VSVF9XSVRIX0NP REUoKE5VTEwgIT0gaW50ZXJuYWxfYnVmKSwKKwkJIk91dCBvZiBtZW1vcnkuIiwKKwkJa2ZyZWUo c211bWdyLT5iYWNrZW5kKTsKKwkJY2dzX2ZyZWVfZ3B1X21lbShzbXVtZ3ItPmRldmljZSwKKwkJ KGNnc19oYW5kbGVfdCl0b25nYV9zbXUtPnNtdV9idWZmZXIuaGFuZGxlKTsKKwkJcmV0dXJuIC0x Oyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcF9zbXVtZ3JfZnVu YyB0b25nYV9zbXVfZnVuY3MgPSB7CisJLnNtdV9pbml0ID0gJnRvbmdhX3NtdV9pbml0LAorCS5z bXVfZmluaSA9ICZ0b25nYV9zbXVfZmluaSwKKwkuc3RhcnRfc211ID0gJnRvbmdhX3N0YXJ0X3Nt dSwKKwkuY2hlY2tfZndfbG9hZF9maW5pc2ggPSAmdG9uZ2FfY2hlY2tfZndfbG9hZF9maW5pc2gs CisJLnJlcXVlc3Rfc211X2xvYWRfZncgPSAmdG9uZ2FfcmVxdWVzdF9zbXVfcmVsb2FkX2Z3LAor CS5yZXF1ZXN0X3NtdV9sb2FkX3NwZWNpZmljX2Z3ID0gJnRvbmdhX3JlcXVlc3Rfc211X2xvYWRf c3BlY2lmaWNfZncsCisJLnNlbmRfbXNnX3RvX3NtYyA9ICZ0b25nYV9zZW5kX21zZ190b19zbWMs CisJLnNlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlciA9ICZ0b25nYV9zZW5kX21zZ190b19z bWNfd2l0aF9wYXJhbWV0ZXIsCisJLmRvd25sb2FkX3BwdGFibGVfc2V0dGluZ3MgPSBOVUxMLAor CS51cGxvYWRfcHB0YWJsZV9zZXR0aW5ncyA9IE5VTEwsCit9OworCitpbnQgdG9uZ2Ffc211bV9p bml0KHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlzdHJ1Y3QgdG9uZ2Ffc211bWdyICp0 b25nYV9zbXUgPSBOVUxMOworCisJdG9uZ2Ffc211ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRv bmdhX3NtdW1nciksIEdGUF9LRVJORUwpOworCisJaWYgKHRvbmdhX3NtdSA9PSBOVUxMKQorCQly ZXR1cm4gLTE7CisKKwlzbXVtZ3ItPmJhY2tlbmQgPSB0b25nYV9zbXU7CisJc211bWdyLT5zbXVt Z3JfZnVuY3MgPSAmdG9uZ2Ffc211X2Z1bmNzOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQg YS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvdG9uZ2Ffc211bWdyLmggYi9k cml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvdG9uZ2Ffc211bWdyLmgKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjNzg4ZAotLS0gL2Rldi9udWxsCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci90b25nYV9zbXVtZ3IuaApAQCAt MCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgQWR2YW5jZWQgTWljcm8gRGV2aWNl cywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hh cmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUg YW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICog dG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdp dGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVy Z2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3Bp ZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAq IFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5n IGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMg cGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Ig c3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FS RSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBS RVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENP UFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBE QU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENP TlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElO IENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVB TElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaWZuZGVmIF9UT05HQV9TTVVNR1Jf SF8KKyNkZWZpbmUgX1RPTkdBX1NNVU1HUl9IXworCitzdHJ1Y3QgdG9uZ2FfYnVmZmVyX2VudHJ5 IHsKKwl1aW50MzJfdCBkYXRhX3NpemU7CisJdWludDMyX3QgbWNfYWRkcl9sb3c7CisJdWludDMy X3QgbWNfYWRkcl9oaWdoOworCXZvaWQgKmthZGRyOworCXVuc2lnbmVkIGxvbmcgIGhhbmRsZTsK K307CisKK3N0cnVjdCB0b25nYV9zbXVtZ3IgeworCXVpbnQ4X3QgKnBIZWFkZXI7CisJdWludDhf dCAqcE1lY0ltYWdlOworCXVpbnQzMl90IHVsU29mdFJlZ3NTdGFydDsKKworCXN0cnVjdCB0b25n YV9idWZmZXJfZW50cnkgaGVhZGVyX2J1ZmZlcjsKKwlzdHJ1Y3QgdG9uZ2FfYnVmZmVyX2VudHJ5 IHNtdV9idWZmZXI7Cit9OworCitleHRlcm4gaW50IHRvbmdhX3NtdW1faW5pdChzdHJ1Y3QgcHBf c211bWdyICpzbXVtZ3IpOworZXh0ZXJuIGludCB0b25nYV9jb3B5X2J5dGVzX3RvX3NtYyhzdHJ1 Y3QgcHBfc211bWdyICpzbXVtZ3IsCisJCXVpbnQzMl90IHNtY1N0YXJ0QWRkcmVzcywgY29uc3Qg dWludDhfdCAqc3JjLAorCQl1aW50MzJfdCBieXRlQ291bnQsIHVpbnQzMl90IGxpbWl0KTsKK2V4 dGVybiBpbnQgdG9uZ2FfcmVhZF9zbWNfc3JhbV9kd29yZChzdHJ1Y3QgcHBfc211bWdyICpzbXVt Z3IsIHVpbnQzMl90IHNtY0FkZHJlc3MsCisJCXVpbnQzMl90ICp2YWx1ZSwgdWludDMyX3QgbGlt aXQpOworZXh0ZXJuIGludCB0b25nYV93cml0ZV9zbWNfc3JhbV9kd29yZChzdHJ1Y3QgcHBfc211 bWdyICpzbXVtZ3IsIHVpbnQzMl90IHNtY0FkZHJlc3MsCisJCXVpbnQzMl90IHZhbHVlLCB1aW50 MzJfdCBsaW1pdCk7CisKKyNlbmRpZgotLSAKMS44LjMuMQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK