From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 03/17] drm/amdgpu: add graphic memory controller implementation for si v5 Date: Sat, 14 May 2016 15:26:15 -0400 Message-ID: <1463253989-28924-4-git-send-email-alexander.deucher@amd.com> References: <1463253989-28924-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-x244.google.com (mail-qg0-x244.google.com [IPv6:2607:f8b0:400d:c04::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 7CBFA6E2DA for ; Sat, 14 May 2016 19:26:39 +0000 (UTC) Received: by mail-qg0-x244.google.com with SMTP id e35so10623409qge.1 for ; Sat, 14 May 2016 12:26:39 -0700 (PDT) In-Reply-To: <1463253989-28924-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: Alex Deucher , Ken Wang List-Id: dri-devel@lists.freedesktop.org RnJvbTogS2VuIFdhbmcgPFFpbmdxaW5nLldhbmdAYW1kLmNvbT4KCnY0OiByZWJhc2UgZml4dXBz CnY1OiByZWJhc2UgZml4dXBzCgpTaWduZWQtb2ZmLWJ5OiBLZW4gV2FuZyA8UWluZ3FpbmcuV2Fu Z0BhbWQuY29tPgpTaWduZWQtb2ZmLWJ5OiBBbGV4IERldWNoZXIgPGFsZXhhbmRlci5kZXVjaGVy QGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvZ21jX3Y2XzAuYyB8IDEw NzcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9nbWNfdjZfMC5oIHwgICAzNiArKwogMiBmaWxlcyBjaGFuZ2VkLCAxMTEzIGluc2Vy dGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9n bWNfdjZfMC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv Z21jX3Y2XzAuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192 Nl8wLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nbWNfdjZfMC5jCm5ldyBmaWxlIG1v ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTAwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9nbWNfdjZfMC5jCkBAIC0wLDAgKzEsMTA3NyBAQAorCisv KgorICogQ29weXJpZ2h0IDIwMTQgQWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAq IFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVy c29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUg U29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlv bgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRp c3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3 YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1 cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Cisg KgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3Rp Y2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9y dGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAi QVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBM SUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNI QU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05J TkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIo UykgT1IgQVVUSE9SKFMpIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBP VEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9S IE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNP RlRXQVJFLgorICoKKyAqLworI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSAi ZHJtUC5oIgorI2luY2x1ZGUgImFtZGdwdS5oIgorI2luY2x1ZGUgImdtY192Nl8wLmgiCisjaW5j bHVkZSAiYW1kZ3B1X3Vjb2RlLmgiCisjaW5jbHVkZSAic2kvc2lkLmgiCisKK3N0YXRpYyB2b2lk IGdtY192Nl8wX3NldF9nYXJ0X2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0 YXRpYyB2b2lkIGdtY192Nl8wX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYpOworCitNT0RVTEVfRklSTVdBUkUoInJhZGVvbi90YWhpdGlfbWMuYmluIik7CitNT0RVTEVf RklSTVdBUkUoInJhZGVvbi9waXRjYWlybl9tYy5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRSgicmFk ZW9uL3ZlcmRlX21jLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJyYWRlb24vb2xhbmRfbWMuYmlu Iik7CisKK2ludCBnbWNfdjZfMF9tY193YWl0X2Zvcl9pZGxlKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2KQoreworCXVuc2lnbmVkIGk7CisJdTMyIHRtcDsKKworCWZvciAoaSA9IDA7IGkgPCBh ZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQl0bXAgPSBSUkVHMzIoU1JCTV9TVEFUVVMpICYg MHgxRjAwOworCQlpZiAoIXRtcCkKKwkJCXJldHVybiAwOworCQl1ZGVsYXkoMSk7CisJfQorCXJl dHVybiAtMTsKK30KKworc3RhdGljIGNvbnN0IHUzMiBjcnRjX29mZnNldHNbNl0gPQoreworCVNJ X0NSVEMwX1JFR0lTVEVSX09GRlNFVCwKKwlTSV9DUlRDMV9SRUdJU1RFUl9PRkZTRVQsCisJU0lf Q1JUQzJfUkVHSVNURVJfT0ZGU0VULAorCVNJX0NSVEMzX1JFR0lTVEVSX09GRlNFVCwKKwlTSV9D UlRDNF9SRUdJU1RFUl9PRkZTRVQsCisJU0lfQ1JUQzVfUkVHSVNURVJfT0ZGU0VUCit9OworCit2 b2lkIGdtY192Nl8wX21jX3N0b3Aoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCSAgICAg IHN0cnVjdCBhbWRncHVfbW9kZV9tY19zYXZlICpzYXZlKQoreworCXUzMiBibGFja291dDsKKwor CWlmIChhZGV2LT5tb2RlX2luZm8ubnVtX2NydGMpCisJCWFtZGdwdV9kaXNwbGF5X3N0b3BfbWNf YWNjZXNzKGFkZXYsIHNhdmUpOworCisJYW1kZ3B1X2FzaWNfd2FpdF9mb3JfbWNfaWRsZShhZGV2 KTsKKworCWJsYWNrb3V0ID0gUlJFRzMyKE1DX1NIQVJFRF9CTEFDS09VVF9DTlRMKTsKKwlpZiAo UkVHX0dFVF9GSUVMRChibGFja291dCwgbW1NQ19TSEFSRURfQkxBQ0tPVVRfQ05UTCwgeHhCTEFD S09VVF9NT0RFKSAhPSAxKSB7CisJCS8qIEJsb2NrIENQVSBhY2Nlc3MgKi8KKwkJV1JFRzMyKEJJ Rl9GQl9FTiwgMCk7CisJCS8qIGJsYWNrb3V0IHRoZSBNQyAqLworCQlibGFja291dCA9IFJFR19T RVRfRklFTEQoYmxhY2tvdXQsCisJCQkJCSBtbU1DX1NIQVJFRF9CTEFDS09VVF9DTlRMLCB4eEJM QUNLT1VUX01PREUsIDApOworCQlXUkVHMzIoTUNfU0hBUkVEX0JMQUNLT1VUX0NOVEwsIGJsYWNr b3V0IHwgMSk7CisJfQorCS8qIHdhaXQgZm9yIHRoZSBNQyB0byBzZXR0bGUgKi8KKwl1ZGVsYXko MTAwKTsKKworfQorCit2b2lkIGdtY192Nl8wX21jX3Jlc3VtZShzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldiwKKwkJCXN0cnVjdCBhbWRncHVfbW9kZV9tY19zYXZlICpzYXZlKQoreworCXUzMiB0 bXA7CisKKwkvKiB1bmJsYWNrb3V0IHRoZSBNQyAqLworCXRtcCA9IFJSRUczMihNQ19TSEFSRURf QkxBQ0tPVVRfQ05UTCk7CisJdG1wID0gUkVHX1NFVF9GSUVMRCh0bXAsIG1tTUNfU0hBUkVEX0JM QUNLT1VUX0NOVEwsIHh4QkxBQ0tPVVRfTU9ERSwgMCk7CisJV1JFRzMyKE1DX1NIQVJFRF9CTEFD S09VVF9DTlRMLCB0bXApOworCS8qIGFsbG93IENQVSBhY2Nlc3MgKi8KKwl0bXAgPSBSRUdfU0VU X0ZJRUxEKDAsIG1tQklGX0ZCX0VOLCB4eEZCX1JFQURfRU4sIDEpOworCXRtcCA9IFJFR19TRVRf RklFTEQodG1wLCBtbUJJRl9GQl9FTiwgeHhGQl9XUklURV9FTiwgMSk7CisJV1JFRzMyKEJJRl9G Ql9FTiwgdG1wKTsKKworCWlmIChhZGV2LT5tb2RlX2luZm8ubnVtX2NydGMpCisJCWFtZGdwdV9k aXNwbGF5X3Jlc3VtZV9tY19hY2Nlc3MoYWRldiwgc2F2ZSk7CisKK30KKworc3RhdGljIGludCBn bWNfdjZfMF9pbml0X21pY3JvY29kZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sKKwlj b25zdCBjaGFyICpjaGlwX25hbWU7CisJY2hhciBmd19uYW1lWzMwXTsKKwlpbnQgZXJyOworCisJ RFJNX0RFQlVHKCJcbiIpOworCisJc3dpdGNoIChhZGV2LT5hc2ljX3R5cGUpIHsKKwljYXNlIENI SVBfVEFISVRJOgorCQljaGlwX25hbWUgPSAidGFoaXRpIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQ X1BJVENBSVJOOgorCQljaGlwX25hbWUgPSAicGl0Y2Fpcm4iOworCQlicmVhazsKKwljYXNlIENI SVBfVkVSREU6CisJCWNoaXBfbmFtZSA9ICJ2ZXJkZSI7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9P TEFORDoKKwkJY2hpcF9uYW1lID0gIm9sYW5kIjsKKwkJYnJlYWs7CisJY2FzZSBDSElQX0hBSU5B TjoKKwkJY2hpcF9uYW1lID0gImhhaW5hbiI7CisJCWJyZWFrOworCWRlZmF1bHQ6IEJVRygpOwor CX0KKworCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19uYW1lKSwgInJhZGVvbi8lc19tYy5i aW4iLCBjaGlwX25hbWUpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmFkZXYtPm1jLmZ3LCBm d19uYW1lLCBhZGV2LT5kZXYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gYW1k Z3B1X3Vjb2RlX3ZhbGlkYXRlKGFkZXYtPm1jLmZ3KTsKKworb3V0OgorCWlmIChlcnIpIHsKKwkJ cHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICAic2lfbWM6IEZhaWxlZCB0byBsb2FkIGZpcm13YXJl IFwiJXNcIlxuIiwKKwkJICAgICAgIGZ3X25hbWUpOworCQlyZWxlYXNlX2Zpcm13YXJlKGFkZXYt Pm1jLmZ3KTsKKwkJYWRldi0+bWMuZncgPSBOVUxMOworCX0KKwlyZXR1cm4gZXJyOworfQorCitz dGF0aWMgaW50IGdtY192Nl8wX21jX2xvYWRfbWljcm9jb2RlKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2KQoreworCWNvbnN0IF9fbGUzMiAqbmV3X2Z3X2RhdGEgPSBOVUxMOworCXUzMiBydW5u aW5nOworCWNvbnN0IF9fbGUzMiAqbmV3X2lvX21jX3JlZ3MgPSBOVUxMOworCWludCBpLCByZWdz X3NpemUsIHVjb2RlX3NpemU7CisJY29uc3Qgc3RydWN0IG1jX2Zpcm13YXJlX2hlYWRlcl92MV8w ICpoZHI7CisKKwlpZiAoIWFkZXYtPm1jLmZ3KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhkciA9 IChjb25zdCBzdHJ1Y3QgbWNfZmlybXdhcmVfaGVhZGVyX3YxXzAgKilhZGV2LT5tYy5mdy0+ZGF0 YTsKKworCWFtZGdwdV91Y29kZV9wcmludF9tY19oZHIoJmhkci0+aGVhZGVyKTsKKwlyZWdzX3Np emUgPSBsZTMyX3RvX2NwdShoZHItPmlvX2RlYnVnX3NpemVfYnl0ZXMpIC8gKDQgKiAyKTsKKwlu ZXdfaW9fbWNfcmVncyA9IChjb25zdCBfX2xlMzIgKikKKwkJKGFkZXYtPm1jLmZ3LT5kYXRhICsg bGUzMl90b19jcHUoaGRyLT5pb19kZWJ1Z19hcnJheV9vZmZzZXRfYnl0ZXMpKTsKKwl1Y29kZV9z aXplID0gbGUzMl90b19jcHUoaGRyLT5oZWFkZXIudWNvZGVfc2l6ZV9ieXRlcykgLyA0OworCW5l d19md19kYXRhID0gKGNvbnN0IF9fbGUzMiAqKQorCQkoYWRldi0+bWMuZnctPmRhdGEgKyBsZTMy X3RvX2NwdShoZHItPmhlYWRlci51Y29kZV9hcnJheV9vZmZzZXRfYnl0ZXMpKTsKKworCXJ1bm5p bmcgPSBSUkVHMzIoTUNfU0VRX1NVUF9DTlRMKSAmIFJVTl9NQVNLOworCisJaWYgKHJ1bm5pbmcg PT0gMCkgeworCisJCS8qIHJlc2V0IHRoZSBlbmdpbmUgYW5kIHNldCB0byB3cml0YWJsZSAqLwor CQlXUkVHMzIoTUNfU0VRX1NVUF9DTlRMLCAweDAwMDAwMDA4KTsKKwkJV1JFRzMyKE1DX1NFUV9T VVBfQ05UTCwgMHgwMDAwMDAxMCk7CisKKwkJLyogbG9hZCBtYyBpbyByZWdzICovCisJCWZvciAo aSA9IDA7IGkgPCByZWdzX3NpemU7IGkrKykgeworCQkJV1JFRzMyKE1DX1NFUV9JT19ERUJVR19J TkRFWCwgbGUzMl90b19jcHVwKG5ld19pb19tY19yZWdzKyspKTsKKwkJCVdSRUczMihNQ19TRVFf SU9fREVCVUdfREFUQSwgbGUzMl90b19jcHVwKG5ld19pb19tY19yZWdzKyspKTsKKwkJfQorCQkv KiBsb2FkIHRoZSBNQyB1Y29kZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgdWNvZGVfc2l6ZTsgaSsr KSB7CisJCQlXUkVHMzIoTUNfU0VRX1NVUF9QR00sIGxlMzJfdG9fY3B1cChuZXdfZndfZGF0YSsr KSk7CisJCX0KKworCQkvKiBwdXQgdGhlIGVuZ2luZSBiYWNrIGludG8gdGhlIGFjdGl2ZSBzdGF0 ZSAqLworCQlXUkVHMzIoTUNfU0VRX1NVUF9DTlRMLCAweDAwMDAwMDA4KTsKKwkJV1JFRzMyKE1D X1NFUV9TVVBfQ05UTCwgMHgwMDAwMDAwNCk7CisJCVdSRUczMihNQ19TRVFfU1VQX0NOVEwsIDB4 MDAwMDAwMDEpOworCisJCS8qIHdhaXQgZm9yIHRyYWluaW5nIHRvIGNvbXBsZXRlICovCisJCWZv ciAoaSA9IDA7IGkgPCBhZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQkJaWYgKFJSRUczMihN Q19TRVFfVFJBSU5fV0FLRVVQX0NOVEwpICYgVFJBSU5fRE9ORV9EMCkKKwkJCQlicmVhazsKKwkJ CXVkZWxheSgxKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBp KyspIHsKKwkJCWlmIChSUkVHMzIoTUNfU0VRX1RSQUlOX1dBS0VVUF9DTlRMKSAmIFRSQUlOX0RP TkVfRDEpCisJCQkJYnJlYWs7CisJCQl1ZGVsYXkoMSk7CisJCX0KKworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBnbWNfdjZfMF92cmFtX2d0dF9sb2NhdGlvbihzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKKwkJCQkgICAgICAgc3RydWN0IGFtZGdwdV9tYyAqbWMpCit7CisJ aWYgKG1jLT5tY192cmFtX3NpemUgPiAweEZGQzAwMDAwMDBVTEwpIHsKKwkJZGV2X3dhcm4oYWRl di0+ZGV2LCAibGltaXRpbmcgVlJBTVxuIik7CisJCW1jLT5yZWFsX3ZyYW1fc2l6ZSA9IDB4RkZD MDAwMDAwMFVMTDsKKwkJbWMtPm1jX3ZyYW1fc2l6ZSA9IDB4RkZDMDAwMDAwMFVMTDsKKwl9CisJ YW1kZ3B1X3ZyYW1fbG9jYXRpb24oYWRldiwgJmFkZXYtPm1jLCAwKTsKKwlhZGV2LT5tYy5ndHRf YmFzZV9hbGlnbiA9IDA7CisJYW1kZ3B1X2d0dF9sb2NhdGlvbihhZGV2LCBtYyk7Cit9CisKK3N0 YXRpYyB2b2lkIGdtY192Nl8wX21jX3Byb2dyYW0oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYp Cit7CisJc3RydWN0IGFtZGdwdV9tb2RlX21jX3NhdmUgc2F2ZTsKKwl1MzIgdG1wOworCWludCBp LCBqOworCisJLyogSW5pdGlhbGl6ZSBIRFAgKi8KKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IDMy OyBpKyssIGogKz0gMHg2KSB7CisJCVdSRUczMigoMHhiMDUgKyBqKSwgMHgwMDAwMDAwMCk7CisJ CVdSRUczMigoMHhiMDYgKyBqKSwgMHgwMDAwMDAwMCk7CisJCVdSRUczMigoMHhiMDcgKyBqKSwg MHgwMDAwMDAwMCk7CisJCVdSRUczMigoMHhiMDggKyBqKSwgMHgwMDAwMDAwMCk7CisJCVdSRUcz MigoMHhiMDkgKyBqKSwgMHgwMDAwMDAwMCk7CisJfQorCVdSRUczMihIRFBfUkVHX0NPSEVSRU5D WV9GTFVTSF9DTlRMLCAwKTsKKworCWdtY192Nl8wX21jX3N0b3AoYWRldiwgJnNhdmUpOworCisJ aWYgKGFtZGdwdV9hc2ljX3dhaXRfZm9yX21jX2lkbGUoYWRldikpIHsKKwkJZGV2X3dhcm4oYWRl di0+ZGV2LCAiV2FpdCBmb3IgTUMgaWRsZSB0aW1lZG91dCAhXG4iKTsKKwl9CisKKwlXUkVHMzIo VkdBX0hEUF9DT05UUk9MLCBWR0FfTUVNT1JZX0RJU0FCTEUpOworCS8qIFVwZGF0ZSBjb25maWd1 cmF0aW9uICovCisJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVSVFVSRV9MT1dfQUREUiwKKwkgICAg ICAgYWRldi0+bWMudnJhbV9zdGFydCA+PiAxMik7CisJV1JFRzMyKE1DX1ZNX1NZU1RFTV9BUEVS VFVSRV9ISUdIX0FERFIsCisJICAgICAgIGFkZXYtPm1jLnZyYW1fZW5kID4+IDEyKTsKKwlXUkVH MzIoTUNfVk1fU1lTVEVNX0FQRVJUVVJFX0RFRkFVTFRfQUREUiwKKwkgICAgICAgYWRldi0+dnJh bV9zY3JhdGNoLmdwdV9hZGRyID4+IDEyKTsKKwl0bXAgPSAoKGFkZXYtPm1jLnZyYW1fZW5kID4+ IDI0KSAmIDB4RkZGRikgPDwgMTY7CisJdG1wIHw9ICgoYWRldi0+bWMudnJhbV9zdGFydCA+PiAy NCkgJiAweEZGRkYpOworCVdSRUczMihNQ19WTV9GQl9MT0NBVElPTiwgdG1wKTsKKwkvKiBYWFgg ZG91YmxlIGNoZWNrIHRoZXNlISAqLworCVdSRUczMihIRFBfTk9OU1VSRkFDRV9CQVNFLCAoYWRl di0+bWMudnJhbV9zdGFydCA+PiA4KSk7CisJV1JFRzMyKEhEUF9OT05TVVJGQUNFX0lORk8sICgy IDw8IDcpIHwgKDEgPDwgMzApKTsKKwlXUkVHMzIoSERQX05PTlNVUkZBQ0VfU0laRSwgMHgzRkZG RkZGRik7CisJV1JFRzMyKE1DX1ZNX0FHUF9CQVNFLCAwKTsKKwlXUkVHMzIoTUNfVk1fQUdQX1RP UCwgMHgwRkZGRkZGRik7CisJV1JFRzMyKE1DX1ZNX0FHUF9CT1QsIDB4MEZGRkZGRkYpOworCisJ aWYgKGFtZGdwdV9hc2ljX3dhaXRfZm9yX21jX2lkbGUoYWRldikpIHsKKwkJZGV2X3dhcm4oYWRl di0+ZGV2LCAiV2FpdCBmb3IgTUMgaWRsZSB0aW1lZG91dCAhXG4iKTsKKwl9CisJZ21jX3Y2XzBf bWNfcmVzdW1lKGFkZXYsICZzYXZlKTsKKwlhbWRncHVfZGlzcGxheV9zZXRfdmdhX3JlbmRlcl9z dGF0ZShhZGV2LCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBfbWNfaW5pdChzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKK3sKKworCXUzMiB0bXA7CisJaW50IGNoYW5zaXplLCBu dW1jaGFuOworCisJdG1wID0gUlJFRzMyKE1DX0FSQl9SQU1DRkcpOworCWlmICh0bXAgJiBDSEFO U0laRV9PVkVSUklERSkgeworCQljaGFuc2l6ZSA9IDE2OworCX0gZWxzZSBpZiAodG1wICYgQ0hB TlNJWkVfTUFTSykgeworCQljaGFuc2l6ZSA9IDY0OworCX0gZWxzZSB7CisJCWNoYW5zaXplID0g MzI7CisJfQorCXRtcCA9IFJSRUczMihNQ19TSEFSRURfQ0hNQVApOworCXN3aXRjaCAoKHRtcCAm IE5PT0ZDSEFOX01BU0spID4+IE5PT0ZDSEFOX1NISUZUKSB7CisJY2FzZSAwOgorCWRlZmF1bHQ6 CisJCW51bWNoYW4gPSAxOworCQlicmVhazsKKwljYXNlIDE6CisJCW51bWNoYW4gPSAyOworCQli cmVhazsKKwljYXNlIDI6CisJCW51bWNoYW4gPSA0OworCQlicmVhazsKKwljYXNlIDM6CisJCW51 bWNoYW4gPSA4OworCQlicmVhazsKKwljYXNlIDQ6CisJCW51bWNoYW4gPSAzOworCQlicmVhazsK KwljYXNlIDU6CisJCW51bWNoYW4gPSA2OworCQlicmVhazsKKwljYXNlIDY6CisJCW51bWNoYW4g PSAxMDsKKwkJYnJlYWs7CisJY2FzZSA3OgorCQludW1jaGFuID0gMTI7CisJCWJyZWFrOworCWNh c2UgODoKKwkJbnVtY2hhbiA9IDE2OworCQlicmVhazsKKwl9CisJYWRldi0+bWMudnJhbV93aWR0 aCA9IG51bWNoYW4gKiBjaGFuc2l6ZTsKKwkvKiBDb3VsZCBhcGVyIHNpemUgcmVwb3J0IDAgPyAq LworCWFkZXYtPm1jLmFwZXJfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChhZGV2LT5wZGV2LCAw KTsKKwlhZGV2LT5tYy5hcGVyX3NpemUgPSBwY2lfcmVzb3VyY2VfbGVuKGFkZXYtPnBkZXYsIDAp OworCS8qIHNpemUgaW4gTUIgb24gc2kgKi8KKwlhZGV2LT5tYy5tY192cmFtX3NpemUgPSBSUkVH MzIoQ09ORklHX01FTVNJWkUpICogMTAyNFVMTCAqIDEwMjRVTEw7CisJYWRldi0+bWMucmVhbF92 cmFtX3NpemUgPSBSUkVHMzIoQ09ORklHX01FTVNJWkUpICogMTAyNFVMTCAqIDEwMjRVTEw7CisJ YWRldi0+bWMudmlzaWJsZV92cmFtX3NpemUgPSBhZGV2LT5tYy5hcGVyX3NpemU7CisKKwkvKiB1 bmxlc3MgdGhlIHVzZXIgaGFkIG92ZXJyaWRkZW4gaXQsIHNldCB0aGUgZ2FydAorCSAqIHNpemUg ZXF1YWwgdG8gdGhlIDEwMjQgb3IgdnJhbSwgd2hpY2hldmVyIGlzIGxhcmdlci4KKwkgKi8KKwlp ZiAoYW1kZ3B1X2dhcnRfc2l6ZSA9PSAtMSkKKwkJYWRldi0+bWMuZ3R0X3NpemUgPSBtYXgoKDEw MjRVTEwgPDwgMjApLCBhZGV2LT5tYy5tY192cmFtX3NpemUpOworCWVsc2UKKwkJYWRldi0+bWMu Z3R0X3NpemUgPSAodWludDY0X3QpYW1kZ3B1X2dhcnRfc2l6ZSA8PCAyMDsKKworCWdtY192Nl8w X3ZyYW1fZ3R0X2xvY2F0aW9uKGFkZXYsICZhZGV2LT5tYyk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgZ21jX3Y2XzBfZ2FydF9mbHVzaF9ncHVfdGxiKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2LAorCQkJCQl1aW50MzJfdCB2bWlkKQoreworCVdSRUczMihIRFBfTUVNX0NPSEVS RU5DWV9GTFVTSF9DTlRMLCAwKTsKKworCVdSRUczMihWTV9JTlZBTElEQVRFX1JFUVVFU1QsIDEg PDwgdm1pZCk7Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBfZ2FydF9zZXRfcHRlX3BkZShzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkgICAgIHZvaWQgKmNwdV9wdF9hZGRyLAorCQkJ CSAgICAgdWludDMyX3QgZ3B1X3BhZ2VfaWR4LAorCQkJCSAgICAgdWludDY0X3QgYWRkciwKKwkJ CQkgICAgIHVpbnQzMl90IGZsYWdzKQoreworCXZvaWQgX19pb21lbSAqcHRyID0gKHZvaWQgKilj cHVfcHRfYWRkcjsKKwl1aW50NjRfdCB2YWx1ZTsKKworCXZhbHVlID0gYWRkciAmIDB4RkZGRkZG RkZGRkZGRjAwMFVMTDsKKwl2YWx1ZSB8PSBmbGFnczsKKwl3cml0ZXEodmFsdWUsIHB0ciArIChn cHVfcGFnZV9pZHggKiA4KSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ21jX3Y2 XzBfc2V0X2ZhdWx0X2VuYWJsZV9kZWZhdWx0KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAor CQkJCQkgICAgICBib29sIHZhbHVlKQoreworCXUzMiB0bXA7CisKKwl0bXAgPSBSUkVHMzIoVk1f Q09OVEVYVDFfQ05UTCk7CisJdG1wID0gUkVHX1NFVF9GSUVMRCh0bXAsIG1tVk1fQ09OVEVYVDFf Q05UTCwKKwkJCSAgICB4eFJBTkdFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQsIHZh bHVlKTsKKwl0bXAgPSBSRUdfU0VUX0ZJRUxEKHRtcCwgbW1WTV9DT05URVhUMV9DTlRMLAorCQkJ ICAgIHh4RFVNTVlfUEFHRV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxULCB2YWx1ZSk7 CisJdG1wID0gUkVHX1NFVF9GSUVMRCh0bXAsIG1tVk1fQ09OVEVYVDFfQ05UTCwKKwkJCSAgICB4 eFBERTBfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfREVGQVVMVCwgdmFsdWUpOworCXRtcCA9IFJF R19TRVRfRklFTEQodG1wLCBtbVZNX0NPTlRFWFQxX0NOVEwsCisJCQkgICAgeHhWQUxJRF9QUk9U RUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxULCB2YWx1ZSk7CisJdG1wID0gUkVHX1NFVF9GSUVM RCh0bXAsIG1tVk1fQ09OVEVYVDFfQ05UTCwKKwkJCSAgICB4eFJFQURfUFJPVEVDVElPTl9GQVVM VF9FTkFCTEVfREVGQVVMVCwgdmFsdWUpOworCXRtcCA9IFJFR19TRVRfRklFTEQodG1wLCBtbVZN X0NPTlRFWFQxX0NOVEwsCisJCQkgICAgeHhXUklURV9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9E RUZBVUxULCB2YWx1ZSk7CisJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIHRtcCk7Cit9CisKK3N0 YXRpYyBpbnQgZ21jX3Y2XzBfZ2FydF9lbmFibGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYp Cit7CisJaW50IHIsIGk7CisKKwlpZiAoYWRldi0+Z2FydC5yb2JqID09IE5VTEwpIHsKKwkJZGV2 X2VycihhZGV2LT5kZXYsICJObyBWUkFNIG9iamVjdCBmb3IgUENJRSBHQVJULlxuIik7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKwlyID0gYW1kZ3B1X2dhcnRfdGFibGVfdnJhbV9waW4oYWRldik7 CisJaWYgKHIpCisJCXJldHVybiByOworCS8qIFNldHVwIFRMQiBjb250cm9sICovCisJV1JFRzMy KE1DX1ZNX01YX0wxX1RMQl9DTlRMLAorCSAgICAgICAoMHhBIDw8IDcpIHwKKwkgICAgICAgRU5B QkxFX0wxX1RMQiB8CisJICAgICAgIEVOQUJMRV9MMV9GUkFHTUVOVF9QUk9DRVNTSU5HIHwKKwkg ICAgICAgU1lTVEVNX0FDQ0VTU19NT0RFX05PVF9JTl9TWVMgfAorCSAgICAgICBFTkFCTEVfQURW QU5DRURfRFJJVkVSX01PREVMIHwKKwkgICAgICAgU1lTVEVNX0FQRVJUVVJFX1VOTUFQUEVEX0FD Q0VTU19QQVNTX1RIUlUpOworCS8qIFNldHVwIEwyIGNhY2hlICovCisJV1JFRzMyKFZNX0wyX0NO VEwsIEVOQUJMRV9MMl9DQUNIRSB8CisJICAgICAgIEVOQUJMRV9MMl9GUkFHTUVOVF9QUk9DRVNT SU5HIHwKKwkgICAgICAgRU5BQkxFX0wyX1BURV9DQUNIRV9MUlVfVVBEQVRFX0JZX1dSSVRFIHwK KwkgICAgICAgRU5BQkxFX0wyX1BERTBfQ0FDSEVfTFJVX1VQREFURV9CWV9XUklURSB8CisJICAg ICAgIEVGRkVDVElWRV9MMl9RVUVVRV9TSVpFKDcpIHwKKwkgICAgICAgQ09OVEVYVDFfSURFTlRJ VFlfQUNDRVNTX01PREUoMSkpOworCVdSRUczMihWTV9MMl9DTlRMMiwgSU5WQUxJREFURV9BTExf TDFfVExCUyB8IElOVkFMSURBVEVfTDJfQ0FDSEUpOworCVdSRUczMihWTV9MMl9DTlRMMywgTDJf Q0FDSEVfQklHS19BU1NPQ0lBVElWSVRZIHwKKwkgICAgICAgQkFOS19TRUxFQ1QoNCkgfAorCSAg ICAgICBMMl9DQUNIRV9CSUdLX0ZSQUdNRU5UX1NJWkUoNCkpOworCS8qIHNldHVwIGNvbnRleHQw ICovCisJV1JFRzMyKFZNX0NPTlRFWFQwX1BBR0VfVEFCTEVfU1RBUlRfQUREUiwgYWRldi0+bWMu Z3R0X3N0YXJ0ID4+IDEyKTsKKwlXUkVHMzIoVk1fQ09OVEVYVDBfUEFHRV9UQUJMRV9FTkRfQURE UiwgYWRldi0+bWMuZ3R0X2VuZCA+PiAxMik7CisJV1JFRzMyKFZNX0NPTlRFWFQwX1BBR0VfVEFC TEVfQkFTRV9BRERSLCBhZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPj4gMTIpOworCVdSRUczMihWTV9D T05URVhUMF9QUk9URUNUSU9OX0ZBVUxUX0RFRkFVTFRfQUREUiwKKwkJCSh1MzIpKGFkZXYtPmR1 bW15X3BhZ2UuYWRkciA+PiAxMikpOworCVdSRUczMihWTV9DT05URVhUMF9DTlRMMiwgMCk7CisJ V1JFRzMyKFZNX0NPTlRFWFQwX0NOVEwsIChFTkFCTEVfQ09OVEVYVCB8IFBBR0VfVEFCTEVfREVQ VEgoMCkgfAorCQkJCSAgUkFOR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfREVGQVVMVCkpOwor CisJV1JFRzMyKDB4NTc1LCAwKTsKKwlXUkVHMzIoMHg1NzYsIDApOworCVdSRUczMigweDU3Nywg MCk7CisKKwkvKiBlbXB0eSBjb250ZXh0MS0xNSAqLworCS8qIHNldCB2bSBzaXplLCBtdXN0IGJl IGEgbXVsdGlwbGUgb2YgNCAqLworCVdSRUczMihWTV9DT05URVhUMV9QQUdFX1RBQkxFX1NUQVJU X0FERFIsIDApOworCVdSRUczMihWTV9DT05URVhUMV9QQUdFX1RBQkxFX0VORF9BRERSLCBhZGV2 LT52bV9tYW5hZ2VyLm1heF9wZm4gLSAxKTsKKwkvKiBBc3NpZ24gdGhlIHB0IGJhc2UgdG8gc29t ZXRoaW5nIHZhbGlkIGZvciBub3c7IHRoZSBwdHMgdXNlZCBmb3IKKwkgKiB0aGUgVk1zIGFyZSBk ZXRlcm1pbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBhbmQgc2V0dXAgYW5kIGFzc2lnbmVkCisJICog b24gdGhlIGZseSBpbiB0aGUgdm0gcGFydCBvZiByYWRlb25fZ2FydC5jCisJICovCisJZm9yIChp ID0gMTsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKGkgPCA4KQorCQkJV1JFRzMyKFZNX0NPTlRFWFQw X1BBR0VfVEFCTEVfQkFTRV9BRERSICsgaSwKKwkJCSAgICAgICBhZGV2LT5nYXJ0LnRhYmxlX2Fk ZHIgPj4gMTIpOworCQllbHNlCisJCQlXUkVHMzIoVk1fQ09OVEVYVDhfUEFHRV9UQUJMRV9CQVNF X0FERFIgKyBpIC0gOCwKKwkJCSAgICAgICBhZGV2LT5nYXJ0LnRhYmxlX2FkZHIgPj4gMTIpOwor CX0KKworCS8qIGVuYWJsZSBjb250ZXh0MS0xNSAqLworCVdSRUczMihWTV9DT05URVhUMV9QUk9U RUNUSU9OX0ZBVUxUX0RFRkFVTFRfQUREUiwKKwkgICAgICAgKHUzMikoYWRldi0+ZHVtbXlfcGFn ZS5hZGRyID4+IDEyKSk7CisJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwyLCA0KTsKKwlXUkVHMzIo Vk1fQ09OVEVYVDFfQ05UTCwgRU5BQkxFX0NPTlRFWFQgfCBQQUdFX1RBQkxFX0RFUFRIKDEpIHwK KwkJCQlQQUdFX1RBQkxFX0JMT0NLX1NJWkUoYW1kZ3B1X3ZtX2Jsb2NrX3NpemUgLSA5KSB8CisJ CQkJUkFOR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfSU5URVJSVVBUIHwKKwkJCQlSQU5HRV9Q Uk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUIHwKKwkJCQlEVU1NWV9QQUdFX1BST1RFQ1RJ T05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVCB8CisJCQkJRFVNTVlfUEFHRV9QUk9URUNUSU9OX0ZB VUxUX0VOQUJMRV9ERUZBVUxUIHwKKwkJCQlQREUwX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lO VEVSUlVQVCB8CisJCQkJUERFMF9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9ERUZBVUxUIHwKKwkJ CQlWQUxJRF9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9JTlRFUlJVUFQgfAorCQkJCVZBTElEX1BS T1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RFRkFVTFQgfAorCQkJCVJFQURfUFJPVEVDVElPTl9GQVVM VF9FTkFCTEVfSU5URVJSVVBUIHwKKwkJCQlSRUFEX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0RF RkFVTFQgfAorCQkJCVdSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVCB8CisJ CQkJV1JJVEVfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfREVGQVVMVCk7CisKKwlnbWNfdjZfMF9n YXJ0X2ZsdXNoX2dwdV90bGIoYWRldiwgMCk7CisJRFJNX0lORk8oIlBDSUUgR0FSVCBvZiAldU0g ZW5hYmxlZCAodGFibGUgYXQgMHglMDE2bGxYKS5cbiIsCisJCSAodW5zaWduZWQpKGFkZXYtPm1j Lmd0dF9zaXplID4+IDIwKSwKKwkJICh1bnNpZ25lZCBsb25nIGxvbmcpYWRldi0+Z2FydC50YWJs ZV9hZGRyKTsKKwlhZGV2LT5nYXJ0LnJlYWR5ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBnbWNfdjZfMF9nYXJ0X2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7 CisJaW50IHI7CisKKwlpZiAoYWRldi0+Z2FydC5yb2JqKSB7CisJCVdBUk4oMSwgImdtY192Nl8w IFBDSUUgR0FSVCBhbHJlYWR5IGluaXRpYWxpemVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXIg PSBhbWRncHVfZ2FydF9pbml0KGFkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwlhZGV2LT5n YXJ0LnRhYmxlX3NpemUgPSBhZGV2LT5nYXJ0Lm51bV9ncHVfcGFnZXMgKiA4OworCXJldHVybiBh bWRncHVfZ2FydF90YWJsZV92cmFtX2FsbG9jKGFkZXYpOworfQorCitzdGF0aWMgdm9pZCBnbWNf djZfMF9nYXJ0X2Rpc2FibGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJLyp1bnNp Z25lZCBpOworCisJZm9yIChpID0gMTsgaSA8IDE2OyArK2kpIHsKKwkJdWludDMyX3QgcmVnOwor CQlpZiAoaSA8IDgpCisJCQlyZWcgPSBWTV9DT05URVhUMF9QQUdFX1RBQkxFX0JBU0VfQUREUiAr IGkgOworCQllbHNlCisJCQlyZWcgPSBWTV9DT05URVhUOF9QQUdFX1RBQkxFX0JBU0VfQUREUiAr IChpIC0gOCk7CisJCWFkZXYtPnZtX21hbmFnZXIuc2F2ZWRfdGFibGVfYWRkcltpXSA9IFJSRUcz MihyZWcpOworCX0qLworCisJLyogRGlzYWJsZSBhbGwgdGFibGVzICovCisJV1JFRzMyKFZNX0NP TlRFWFQwX0NOVEwsIDApOworCVdSRUczMihWTV9DT05URVhUMV9DTlRMLCAwKTsKKwkvKiBTZXR1 cCBUTEIgY29udHJvbCAqLworCVdSRUczMihNQ19WTV9NWF9MMV9UTEJfQ05UTCwgU1lTVEVNX0FD Q0VTU19NT0RFX05PVF9JTl9TWVMgfAorCSAgICAgICBTWVNURU1fQVBFUlRVUkVfVU5NQVBQRURf QUNDRVNTX1BBU1NfVEhSVSk7CisJLyogU2V0dXAgTDIgY2FjaGUgKi8KKwlXUkVHMzIoVk1fTDJf Q05UTCwgRU5BQkxFX0wyX1BURV9DQUNIRV9MUlVfVVBEQVRFX0JZX1dSSVRFIHwKKwkgICAgICAg RU5BQkxFX0wyX1BERTBfQ0FDSEVfTFJVX1VQREFURV9CWV9XUklURSB8CisJICAgICAgIEVGRkVD VElWRV9MMl9RVUVVRV9TSVpFKDcpIHwKKwkgICAgICAgQ09OVEVYVDFfSURFTlRJVFlfQUNDRVNT X01PREUoMSkpOworCVdSRUczMihWTV9MMl9DTlRMMiwgMCk7CisJV1JFRzMyKFZNX0wyX0NOVEwz LCBMMl9DQUNIRV9CSUdLX0FTU09DSUFUSVZJVFkgfAorCSAgICAgICBMMl9DQUNIRV9CSUdLX0ZS QUdNRU5UX1NJWkUoMCkpOworCWFtZGdwdV9nYXJ0X3RhYmxlX3ZyYW1fdW5waW4oYWRldik7Cit9 CisKK3N0YXRpYyB2b2lkIGdtY192Nl8wX2dhcnRfZmluaShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldikKK3sKKwlhbWRncHVfZ2FydF90YWJsZV92cmFtX2ZyZWUoYWRldik7CisJYW1kZ3B1X2dh cnRfZmluaShhZGV2KTsKK30KKworc3RhdGljIGludCBnbWNfdjZfMF92bV9pbml0KHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2KQoreworCS8qCisJICogbnVtYmVyIG9mIFZNcworCSAqIFZNSUQg MCBpcyByZXNlcnZlZCBmb3IgU3lzdGVtCisJICogYW1kZ3B1IGdyYXBoaWNzL2NvbXB1dGUgd2ls bCB1c2UgVk1JRHMgMS03CisJICogYW1ka2ZkIHdpbGwgdXNlIFZNSURzIDgtMTUKKwkgKi8KKwlh ZGV2LT52bV9tYW5hZ2VyLm51bV9pZHMgPSBBTURHUFVfTlVNX09GX1ZNSURTOworCWFtZGdwdV92 bV9tYW5hZ2VyX2luaXQoYWRldik7CisKKwkvKiBiYXNlIG9mZnNldCBvZiB2cmFtIHBhZ2VzICov CisJaWYgKGFkZXYtPmZsYWdzICYgQU1EX0lTX0FQVSkgeworCQl1NjQgdG1wID0gUlJFRzMyKE1D X1ZNX0ZCX09GRlNFVCk7CisJCXRtcCA8PD0gMjI7CisJCWFkZXYtPnZtX21hbmFnZXIudnJhbV9i YXNlX29mZnNldCA9IHRtcDsKKwl9IGVsc2UKKwkJYWRldi0+dm1fbWFuYWdlci52cmFtX2Jhc2Vf b2Zmc2V0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnbWNfdjZfMF92bV9m aW5pKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQoreworfQorCitzdGF0aWMgdm9pZCBnbWNf djZfMF92bV9kZWNvZGVfZmF1bHQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJICAg ICB1MzIgc3RhdHVzLCB1MzIgYWRkciwgdTMyIG1jX2NsaWVudCkKK3sKKwl1MzIgbWNfaWQ7CisJ dTMyIHZtaWQgPSBSRUdfR0VUX0ZJRUxEKHN0YXR1cywgbW1WTV9DT05URVhUMV9QUk9URUNUSU9O X0ZBVUxUX1NUQVRVUywgeHhWTUlEKTsKKwl1MzIgcHJvdGVjdGlvbnMgPSBSRUdfR0VUX0ZJRUxE KHN0YXR1cywgbW1WTV9DT05URVhUMV9QUk9URUNUSU9OX0ZBVUxUX1NUQVRVUywKKwkJCQkJeHhQ Uk9URUNUSU9OUyk7CisJY2hhciBibG9ja1s1XSA9IHsgbWNfY2xpZW50ID4+IDI0LCAobWNfY2xp ZW50ID4+IDE2KSAmIDB4ZmYsCisJCShtY19jbGllbnQgPj4gOCkgJiAweGZmLCBtY19jbGllbnQg JiAweGZmLCAwIH07CisKKwltY19pZCA9IFJFR19HRVRfRklFTEQoc3RhdHVzLCBtbVZNX0NPTlRF WFQxX1BST1RFQ1RJT05fRkFVTFRfU1RBVFVTLAorCQkJICAgICAgeHhNRU1PUllfQ0xJRU5UX0lE KTsKKworCXByaW50aygiVk0gZmF1bHQgKDB4JTAyeCwgdm1pZCAlZCkgYXQgcGFnZSAldSwgJXMg ZnJvbSAnJXMnICgweCUwOHgpICglZClcbiIsCisJICAgICAgIHByb3RlY3Rpb25zLCB2bWlkLCBh ZGRyLAorCSAgICAgICBSRUdfR0VUX0ZJRUxEKHN0YXR1cywgbW1WTV9DT05URVhUMV9QUk9URUNU SU9OX0ZBVUxUX1NUQVRVUywKKwkJCSAgICAgeHhNRU1PUllfQ0xJRU5UX1JXKSA/CisJICAgICAg ICJ3cml0ZSIgOiAicmVhZCIsIGJsb2NrLCBtY19jbGllbnQsIG1jX2lkKTsKK30KKworLyoKK3N0 YXRpYyBjb25zdCB1MzIgbWNfY2dfcmVnaXN0ZXJzW10gPSB7CisJTUNfSFVCX01JU0NfSFVCX0NH LAorCU1DX0hVQl9NSVNDX1NJUF9DRywKKwlNQ19IVUJfTUlTQ19WTV9DRywKKwlNQ19YUEJfQ0xL X0dBVCwKKwlBVENfTUlTQ19DRywKKwlNQ19DSVRGX01JU0NfV1JfQ0csCisJTUNfQ0lURl9NSVND X1JEX0NHLAorCU1DX0NJVEZfTUlTQ19WTV9DRywKKwlWTV9MMl9DRywKK307CisKK3N0YXRpYyBj b25zdCB1MzIgbWNfY2dfbHNfZW5bXSA9IHsKKwlNQ19IVUJfTUlTQ19IVUJfQ0dfX01FTV9MU19F TkFCTEVfTUFTSywKKwlNQ19IVUJfTUlTQ19TSVBfQ0dfX01FTV9MU19FTkFCTEVfTUFTSywKKwlN Q19IVUJfTUlTQ19WTV9DR19fTUVNX0xTX0VOQUJMRV9NQVNLLAorCU1DX1hQQl9DTEtfR0FUX19N RU1fTFNfRU5BQkxFX01BU0ssCisJQVRDX01JU0NfQ0dfX01FTV9MU19FTkFCTEVfTUFTSywKKwlN Q19DSVRGX01JU0NfV1JfQ0dfX01FTV9MU19FTkFCTEVfTUFTSywKKwlNQ19DSVRGX01JU0NfUkRf Q0dfX01FTV9MU19FTkFCTEVfTUFTSywKKwlNQ19DSVRGX01JU0NfVk1fQ0dfX01FTV9MU19FTkFC TEVfTUFTSywKKwlWTV9MMl9DR19fTUVNX0xTX0VOQUJMRV9NQVNLLAorfTsKKworc3RhdGljIGNv bnN0IHUzMiBtY19jZ19lbltdID0geworCU1DX0hVQl9NSVNDX0hVQl9DR19fRU5BQkxFX01BU0ss CisJTUNfSFVCX01JU0NfU0lQX0NHX19FTkFCTEVfTUFTSywKKwlNQ19IVUJfTUlTQ19WTV9DR19f RU5BQkxFX01BU0ssCisJTUNfWFBCX0NMS19HQVRfX0VOQUJMRV9NQVNLLAorCUFUQ19NSVNDX0NH X19FTkFCTEVfTUFTSywKKwlNQ19DSVRGX01JU0NfV1JfQ0dfX0VOQUJMRV9NQVNLLAorCU1DX0NJ VEZfTUlTQ19SRF9DR19fRU5BQkxFX01BU0ssCisJTUNfQ0lURl9NSVNDX1ZNX0NHX19FTkFCTEVf TUFTSywKKwlWTV9MMl9DR19fRU5BQkxFX01BU0ssCit9OworCitzdGF0aWMgdm9pZCBnbWNfdjZf MF9lbmFibGVfbWNfbHMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJICBib29sIGVu YWJsZSkKK3sKKwlpbnQgaTsKKwl1MzIgb3JpZywgZGF0YTsKKworCWZvciAoaSA9IDA7IGkgPCBB UlJBWV9TSVpFKG1jX2NnX3JlZ2lzdGVycyk7IGkrKykgeworCQlvcmlnID0gZGF0YSA9IFJSRUcz MihtY19jZ19yZWdpc3RlcnNbaV0pOworCQlpZiAoZW5hYmxlICYmIChhZGV2LT5jZ19mbGFncyAm IEFNREdQVV9DR19TVVBQT1JUX01DX0xTKSkKKwkJCWRhdGEgfD0gbWNfY2dfbHNfZW5baV07CisJ CWVsc2UKKwkJCWRhdGEgJj0gfm1jX2NnX2xzX2VuW2ldOworCQlpZiAoZGF0YSAhPSBvcmlnKQor CQkJV1JFRzMyKG1jX2NnX3JlZ2lzdGVyc1tpXSwgZGF0YSk7CisJfQorfQorCitzdGF0aWMgdm9p ZCBnbWNfdjZfMF9lbmFibGVfbWNfbWdjZyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJ CQkgICAgYm9vbCBlbmFibGUpCit7CisJaW50IGk7CisJdTMyIG9yaWcsIGRhdGE7CisKKwlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShtY19jZ19yZWdpc3RlcnMpOyBpKyspIHsKKwkJb3JpZyA9 IGRhdGEgPSBSUkVHMzIobWNfY2dfcmVnaXN0ZXJzW2ldKTsKKwkJaWYgKGVuYWJsZSAmJiAoYWRl di0+Y2dfZmxhZ3MgJiBBTURHUFVfQ0dfU1VQUE9SVF9NQ19NR0NHKSkKKwkJCWRhdGEgfD0gbWNf Y2dfZW5baV07CisJCWVsc2UKKwkJCWRhdGEgJj0gfm1jX2NnX2VuW2ldOworCQlpZiAoZGF0YSAh PSBvcmlnKQorCQkJV1JFRzMyKG1jX2NnX3JlZ2lzdGVyc1tpXSwgZGF0YSk7CisJfQorfQorCitz dGF0aWMgdm9pZCBnbWNfdjZfMF9lbmFibGVfYmlmX21nbHMoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYsCisJCQkJICAgICBib29sIGVuYWJsZSkKK3sKKwl1MzIgb3JpZywgZGF0YTsKKworCW9y aWcgPSBkYXRhID0gUlJFRzMyX1BDSUUoaXhQQ0lFX0NOVEwyKTsKKworCWlmIChlbmFibGUgJiYg KGFkZXYtPmNnX2ZsYWdzICYgQU1ER1BVX0NHX1NVUFBPUlRfQklGX0xTKSkgeworCQlkYXRhID0g UkVHX1NFVF9GSUVMRChkYXRhLCBQQ0lFX0NOVEwyLCBTTFZfTUVNX0xTX0VOLCAxKTsKKwkJZGF0 YSA9IFJFR19TRVRfRklFTEQoZGF0YSwgUENJRV9DTlRMMiwgTVNUX01FTV9MU19FTiwgMSk7CisJ CWRhdGEgPSBSRUdfU0VUX0ZJRUxEKGRhdGEsIFBDSUVfQ05UTDIsIFJFUExBWV9NRU1fTFNfRU4s IDEpOworCQlkYXRhID0gUkVHX1NFVF9GSUVMRChkYXRhLCBQQ0lFX0NOVEwyLCBTTFZfTUVNX0FH R1JFU1NJVkVfTFNfRU4sIDEpOworCX0gZWxzZSB7CisJCWRhdGEgPSBSRUdfU0VUX0ZJRUxEKGRh dGEsIFBDSUVfQ05UTDIsIFNMVl9NRU1fTFNfRU4sIDApOworCQlkYXRhID0gUkVHX1NFVF9GSUVM RChkYXRhLCBQQ0lFX0NOVEwyLCBNU1RfTUVNX0xTX0VOLCAwKTsKKwkJZGF0YSA9IFJFR19TRVRf RklFTEQoZGF0YSwgUENJRV9DTlRMMiwgUkVQTEFZX01FTV9MU19FTiwgMCk7CisJCWRhdGEgPSBS RUdfU0VUX0ZJRUxEKGRhdGEsIFBDSUVfQ05UTDIsIFNMVl9NRU1fQUdHUkVTU0lWRV9MU19FTiwg MCk7CisJfQorCisJaWYgKG9yaWcgIT0gZGF0YSkKKwkJV1JFRzMyX1BDSUUoaXhQQ0lFX0NOVEwy LCBkYXRhKTsKK30KKworc3RhdGljIHZvaWQgZ21jX3Y2XzBfZW5hYmxlX2hkcF9tZ2NnKHN0cnVj dCBhbWRncHVfZGV2aWNlICphZGV2LAorCQkJCSAgICAgYm9vbCBlbmFibGUpCit7CisJdTMyIG9y aWcsIGRhdGE7CisKKwlvcmlnID0gZGF0YSA9IFJSRUczMihIRFBfSE9TVF9QQVRIX0NOVEwpOwor CisJaWYgKGVuYWJsZSAmJiAoYWRldi0+Y2dfZmxhZ3MgJiBBTURHUFVfQ0dfU1VQUE9SVF9IRFBf TUdDRykpCisJCWRhdGEgPSBSRUdfU0VUX0ZJRUxEKGRhdGEsIEhEUF9IT1NUX1BBVEhfQ05UTCwg Q0xPQ0tfR0FUSU5HX0RJUywgMCk7CisJZWxzZQorCQlkYXRhID0gUkVHX1NFVF9GSUVMRChkYXRh LCBIRFBfSE9TVF9QQVRIX0NOVEwsIENMT0NLX0dBVElOR19ESVMsIDEpOworCisJaWYgKG9yaWcg IT0gZGF0YSkKKwkJV1JFRzMyKEhEUF9IT1NUX1BBVEhfQ05UTCwgZGF0YSk7Cit9CisKK3N0YXRp YyB2b2lkIGdtY192Nl8wX2VuYWJsZV9oZHBfbHMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYs CisJCQkJICAgYm9vbCBlbmFibGUpCit7CisJdTMyIG9yaWcsIGRhdGE7CisKKwlvcmlnID0gZGF0 YSA9IFJSRUczMihIRFBfTUVNX1BPV0VSX0xTKTsKKworCWlmIChlbmFibGUgJiYgKGFkZXYtPmNn X2ZsYWdzICYgQU1ER1BVX0NHX1NVUFBPUlRfSERQX0xTKSkKKwkJZGF0YSA9IFJFR19TRVRfRklF TEQoZGF0YSwgSERQX01FTV9QT1dFUl9MUywgTFNfRU5BQkxFLCAxKTsKKwllbHNlCisJCWRhdGEg PSBSRUdfU0VUX0ZJRUxEKGRhdGEsIEhEUF9NRU1fUE9XRVJfTFMsIExTX0VOQUJMRSwgMCk7CisK KwlpZiAob3JpZyAhPSBkYXRhKQorCQlXUkVHMzIoSERQX01FTV9QT1dFUl9MUywgZGF0YSk7Cit9 CisqLworCitzdGF0aWMgaW50IGdtY192Nl8wX2NvbnZlcnRfdnJhbV90eXBlKGludCBtY19zZXFf dnJhbV90eXBlKQoreworCXN3aXRjaCAobWNfc2VxX3ZyYW1fdHlwZSkgeworCWNhc2UgTUNfU0VR X01JU0MwX19NVF9fR0REUjE6CisJCXJldHVybiBBTURHUFVfVlJBTV9UWVBFX0dERFIxOworCWNh c2UgTUNfU0VRX01JU0MwX19NVF9fRERSMjoKKwkJcmV0dXJuIEFNREdQVV9WUkFNX1RZUEVfRERS MjsKKwljYXNlIE1DX1NFUV9NSVNDMF9fTVRfX0dERFIzOgorCQlyZXR1cm4gQU1ER1BVX1ZSQU1f VFlQRV9HRERSMzsKKwljYXNlIE1DX1NFUV9NSVNDMF9fTVRfX0dERFI0OgorCQlyZXR1cm4gQU1E R1BVX1ZSQU1fVFlQRV9HRERSNDsKKwljYXNlIE1DX1NFUV9NSVNDMF9fTVRfX0dERFI1OgorCQly ZXR1cm4gQU1ER1BVX1ZSQU1fVFlQRV9HRERSNTsKKwljYXNlIE1DX1NFUV9NSVNDMF9fTVRfX0RE UjM6CisJCXJldHVybiBBTURHUFVfVlJBTV9UWVBFX0REUjM7CisJZGVmYXVsdDoKKwkJcmV0dXJu IEFNREdQVV9WUkFNX1RZUEVfVU5LTk9XTjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBf ZWFybHlfaW5pdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYg PSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7CisKKwlnbWNfdjZfMF9zZXRfZ2FydF9m dW5jcyhhZGV2KTsKKwlnbWNfdjZfMF9zZXRfaXJxX2Z1bmNzKGFkZXYpOworCisJaWYgKGFkZXYt PmZsYWdzICYgQU1EX0lTX0FQVSkgeworCQlhZGV2LT5tYy52cmFtX3R5cGUgPSBBTURHUFVfVlJB TV9UWVBFX1VOS05PV047CisJfSBlbHNlIHsKKwkJdTMyIHRtcCA9IFJSRUczMihNQ19TRVFfTUlT QzApOworCQl0bXAgJj0gTUNfU0VRX01JU0MwX19NVF9fTUFTSzsKKwkJYWRldi0+bWMudnJhbV90 eXBlID0gZ21jX3Y2XzBfY29udmVydF92cmFtX3R5cGUodG1wKTsKKwl9CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBnbWNfdjZfMF9sYXRlX2luaXQodm9pZCAqaGFuZGxlKQoreworCXN0 cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxl OworCisJcmV0dXJuIGFtZGdwdV9pcnFfZ2V0KGFkZXYsICZhZGV2LT5tYy52bV9mYXVsdCwgMCk7 Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBfc3dfaW5pdCh2b2lkICpoYW5kbGUpCit7CisJaW50 IHI7CisJaW50IGRtYV9iaXRzOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVj dCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJciA9IGFtZGdwdV9pcnFfYWRkX2lkKGFkZXYs IDE0NiwgJmFkZXYtPm1jLnZtX2ZhdWx0KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyID0g YW1kZ3B1X2lycV9hZGRfaWQoYWRldiwgMTQ3LCAmYWRldi0+bWMudm1fZmF1bHQpOworCWlmIChy KQorCQlyZXR1cm4gcjsKKworCWFkZXYtPnZtX21hbmFnZXIubWF4X3BmbiA9IGFtZGdwdV92bV9z aXplIDw8IDE4OworCisJYWRldi0+bWMubWNfbWFzayA9IDB4ZmZmZmZmZmZmZlVMTDsKKworCWFk ZXYtPm5lZWRfZG1hMzIgPSBmYWxzZTsKKwlkbWFfYml0cyA9IGFkZXYtPm5lZWRfZG1hMzIgPyAz MiA6IDQwOworCXIgPSBwY2lfc2V0X2RtYV9tYXNrKGFkZXYtPnBkZXYsIERNQV9CSVRfTUFTSyhk bWFfYml0cykpOworCWlmIChyKSB7CisJCWFkZXYtPm5lZWRfZG1hMzIgPSB0cnVlOworCQlkbWFf Yml0cyA9IDMyOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbWRncHU6IE5vIHN1aXRhYmxlIERN QSBhdmFpbGFibGUuXG4iKTsKKwl9CisJciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhh ZGV2LT5wZGV2LCBETUFfQklUX01BU0soZG1hX2JpdHMpKTsKKwlpZiAocikgeworCQlwY2lfc2V0 X2NvbnNpc3RlbnRfZG1hX21hc2soYWRldi0+cGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCXBy aW50ayhLRVJOX1dBUk5JTkcgImFtZGdwdTogTm8gY29oZXJlbnQgRE1BIGF2YWlsYWJsZS5cbiIp OworCX0KKworCXIgPSBnbWNfdjZfMF9pbml0X21pY3JvY29kZShhZGV2KTsKKwlpZiAocikgewor CQlEUk1fRVJST1IoIkZhaWxlZCB0byBsb2FkIG1jIGZpcm13YXJlIVxuIik7CisJCXJldHVybiBy OworCX0KKworCXIgPSBnbWNfdjZfMF9tY19pbml0KGFkZXYpOworCWlmIChyKQorCQlyZXR1cm4g cjsKKworCXIgPSBhbWRncHVfYm9faW5pdChhZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisK KwlyID0gZ21jX3Y2XzBfZ2FydF9pbml0KGFkZXYpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKwor CWlmICghYWRldi0+dm1fbWFuYWdlci5lbmFibGVkKSB7CisJCXIgPSBnbWNfdjZfMF92bV9pbml0 KGFkZXYpOworCQlpZiAocikgeworCQkJZGV2X2VycihhZGV2LT5kZXYsICJ2bSBtYW5hZ2VyIGlu aXRpYWxpemF0aW9uIGZhaWxlZCAoJWQpLlxuIiwgcik7CisJCQlyZXR1cm4gcjsKKwkJfQorCQlh ZGV2LT52bV9tYW5hZ2VyLmVuYWJsZWQgPSB0cnVlOworCX0KKworCXJldHVybiByOworfQorCitz dGF0aWMgaW50IGdtY192Nl8wX3N3X2Zpbmkodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJaWYg KGFkZXYtPnZtX21hbmFnZXIuZW5hYmxlZCkgeworCQlnbWNfdjZfMF92bV9maW5pKGFkZXYpOwor CQlhZGV2LT52bV9tYW5hZ2VyLmVuYWJsZWQgPSBmYWxzZTsKKwl9CisJZ21jX3Y2XzBfZ2FydF9m aW5pKGFkZXYpOworCWFtZGdwdV9nZW1fZm9yY2VfcmVsZWFzZShhZGV2KTsKKwlhbWRncHVfYm9f ZmluaShhZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdtY192Nl8wX2h3X2lu aXQodm9pZCAqaGFuZGxlKQoreworCWludCByOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJZ21jX3Y2XzBfbWNfcHJvZ3Jh bShhZGV2KTsKKworCWlmICghKGFkZXYtPmZsYWdzICYgQU1EX0lTX0FQVSkpIHsKKwkJciA9IGdt Y192Nl8wX21jX2xvYWRfbWljcm9jb2RlKGFkZXYpOworCQlpZiAocikgeworCQkJRFJNX0VSUk9S KCJGYWlsZWQgdG8gbG9hZCBNQyBmaXJtd2FyZSFcbiIpOworCQkJcmV0dXJuIHI7CisJCX0KKwl9 CisKKwlyID0gZ21jX3Y2XzBfZ2FydF9lbmFibGUoYWRldik7CisJaWYgKHIpCisJCXJldHVybiBy OworCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBfaHdfZmluaSh2b2lkICpo YW5kbGUpCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9k ZXZpY2UgKiloYW5kbGU7CisKKwlhbWRncHVfaXJxX3B1dChhZGV2LCAmYWRldi0+bWMudm1fZmF1 bHQsIDApOworCWdtY192Nl8wX2dhcnRfZGlzYWJsZShhZGV2KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGdtY192Nl8wX3N1c3BlbmQodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJ aWYgKGFkZXYtPnZtX21hbmFnZXIuZW5hYmxlZCkgeworCQlnbWNfdjZfMF92bV9maW5pKGFkZXYp OworCQlhZGV2LT52bV9tYW5hZ2VyLmVuYWJsZWQgPSBmYWxzZTsKKwl9CisJZ21jX3Y2XzBfaHdf ZmluaShhZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdtY192Nl8wX3Jlc3Vt ZSh2b2lkICpoYW5kbGUpCit7CisJaW50IHI7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYg PSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7CisKKwlyID0gZ21jX3Y2XzBfaHdfaW5p dChhZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZiAoIWFkZXYtPnZtX21hbmFnZXIu ZW5hYmxlZCkgeworCQlyID0gZ21jX3Y2XzBfdm1faW5pdChhZGV2KTsKKwkJaWYgKHIpIHsKKwkJ CWRldl9lcnIoYWRldi0+ZGV2LCAidm0gbWFuYWdlciBpbml0aWFsaXphdGlvbiBmYWlsZWQgKCVk KS5cbiIsIHIpOworCQkJcmV0dXJuIHI7CisJCX0KKwkJYWRldi0+dm1fbWFuYWdlci5lbmFibGVk ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGJvb2wgZ21jX3Y2XzBfaXNf aWRsZSh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3Ry dWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7CisJdTMyIHRtcCA9IFJSRUczMihTUkJNX1NUQVRV Uyk7CisKKwlpZiAodG1wICYgKFNSQk1fU1RBVFVTX19NQ0JfQlVTWV9NQVNLIHwgU1JCTV9TVEFU VVNfX01DQl9OT05fRElTUExBWV9CVVNZX01BU0sgfAorCQkgICBTUkJNX1NUQVRVU19fTUNDX0JV U1lfTUFTSyB8IFNSQk1fU1RBVFVTX19NQ0RfQlVTWV9NQVNLIHwgU1JCTV9TVEFUVVNfX1ZNQ19C VVNZX01BU0spKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGlj IGludCBnbWNfdjZfMF93YWl0X2Zvcl9pZGxlKHZvaWQgKmhhbmRsZSkKK3sKKwl1bnNpZ25lZCBp OworCXUzMiB0bXA7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdw dV9kZXZpY2UgKiloYW5kbGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0 OyBpKyspIHsKKwkJdG1wID0gUlJFRzMyKFNSQk1fU1RBVFVTKSAmIChTUkJNX1NUQVRVU19fTUNC X0JVU1lfTUFTSyB8CisJCQkJCSAgICAgICBTUkJNX1NUQVRVU19fTUNCX05PTl9ESVNQTEFZX0JV U1lfTUFTSyB8CisJCQkJCSAgICAgICBTUkJNX1NUQVRVU19fTUNDX0JVU1lfTUFTSyB8CisJCQkJ CSAgICAgICBTUkJNX1NUQVRVU19fTUNEX0JVU1lfTUFTSyB8CisJCQkJCSAgICAgICBTUkJNX1NU QVRVU19fVk1DX0JVU1lfTUFTSyk7CisJCWlmICghdG1wKQorCQkJcmV0dXJuIDA7CisJCXVkZWxh eSgxKTsKKwl9CisJcmV0dXJuIC1FVElNRURPVVQ7CisKK30KKworc3RhdGljIGludCBnbWNfdjZf MF9zb2Z0X3Jlc2V0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKKwlzdHJ1Y3QgYW1kZ3B1X21vZGVf bWNfc2F2ZSBzYXZlOworCXUzMiBzcmJtX3NvZnRfcmVzZXQgPSAwOworCXUzMiB0bXAgPSBSUkVH MzIoU1JCTV9TVEFUVVMpOworCisJaWYgKHRtcCAmIFNSQk1fU1RBVFVTX19WTUNfQlVTWV9NQVNL KQorCQlzcmJtX3NvZnRfcmVzZXQgPSBSRUdfU0VUX0ZJRUxEKHNyYm1fc29mdF9yZXNldCwKKwkJ CQkJCW1tU1JCTV9TT0ZUX1JFU0VULCB4eFNPRlRfUkVTRVRfVk1DLCAxKTsKKworCWlmICh0bXAg JiAoU1JCTV9TVEFUVVNfX01DQl9CVVNZX01BU0sgfCBTUkJNX1NUQVRVU19fTUNCX05PTl9ESVNQ TEFZX0JVU1lfTUFTSyB8CisJCSAgIFNSQk1fU1RBVFVTX19NQ0NfQlVTWV9NQVNLIHwgU1JCTV9T VEFUVVNfX01DRF9CVVNZX01BU0spKSB7CisJCWlmICghKGFkZXYtPmZsYWdzICYgQU1EX0lTX0FQ VSkpCisJCQlzcmJtX3NvZnRfcmVzZXQgPSBSRUdfU0VUX0ZJRUxEKHNyYm1fc29mdF9yZXNldCwK KwkJCQkJCQltbVNSQk1fU09GVF9SRVNFVCwgeHhTT0ZUX1JFU0VUX01DLCAxKTsKKwl9CisKKwlp ZiAoc3JibV9zb2Z0X3Jlc2V0KSB7CisJCWdtY192Nl8wX21jX3N0b3AoYWRldiwgJnNhdmUpOwor CQlpZiAoZ21jX3Y2XzBfd2FpdF9mb3JfaWRsZShhZGV2KSkgeworCQkJZGV2X3dhcm4oYWRldi0+ ZGV2LCAiV2FpdCBmb3IgR01DIGlkbGUgdGltZWQgb3V0ICFcbiIpOworCQl9CisKKworCQl0bXAg PSBSUkVHMzIoU1JCTV9TT0ZUX1JFU0VUKTsKKwkJdG1wIHw9IHNyYm1fc29mdF9yZXNldDsKKwkJ ZGV2X2luZm8oYWRldi0+ZGV2LCAiU1JCTV9TT0ZUX1JFU0VUPTB4JTA4WFxuIiwgdG1wKTsKKwkJ V1JFRzMyKFNSQk1fU09GVF9SRVNFVCwgdG1wKTsKKwkJdG1wID0gUlJFRzMyKFNSQk1fU09GVF9S RVNFVCk7CisKKwkJdWRlbGF5KDUwKTsKKworCQl0bXAgJj0gfnNyYm1fc29mdF9yZXNldDsKKwkJ V1JFRzMyKFNSQk1fU09GVF9SRVNFVCwgdG1wKTsKKwkJdG1wID0gUlJFRzMyKFNSQk1fU09GVF9S RVNFVCk7CisKKwkJdWRlbGF5KDUwKTsKKworCQlnbWNfdjZfMF9tY19yZXN1bWUoYWRldiwgJnNh dmUpOworCQl1ZGVsYXkoNTApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdt Y192Nl8wX3ZtX2ZhdWx0X2ludGVycnVwdF9zdGF0ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diwKKwkJCQkJICAgICBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmMgKnNyYywKKwkJCQkJICAgICB1bnNp Z25lZCB0eXBlLAorCQkJCQkgICAgIGVudW0gYW1kZ3B1X2ludGVycnVwdF9zdGF0ZSBzdGF0ZSkK K3sKKwl1MzIgdG1wOworCXUzMiBiaXRzID0gKFZNX0NPTlRFWFQxX0NOVExfX1JBTkdFX1BST1RF Q1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVF9NQVNLIHwKKwkJICAgIFZNX0NPTlRFWFQxX0NO VExfX0RVTU1ZX1BBR0VfUFJPVEVDVElPTl9GQVVMVF9FTkFCTEVfSU5URVJSVVBUX01BU0sgfAor CQkgICAgVk1fQ09OVEVYVDFfQ05UTF9fUERFMF9QUk9URUNUSU9OX0ZBVUxUX0VOQUJMRV9JTlRF UlJVUFRfTUFTSyB8CisJCSAgICBWTV9DT05URVhUMV9DTlRMX19WQUxJRF9QUk9URUNUSU9OX0ZB VUxUX0VOQUJMRV9JTlRFUlJVUFRfTUFTSyB8CisJCSAgICBWTV9DT05URVhUMV9DTlRMX19SRUFE X1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVF9NQVNLIHwKKwkJICAgIFZNX0NPTlRF WFQxX0NOVExfX1dSSVRFX1BST1RFQ1RJT05fRkFVTFRfRU5BQkxFX0lOVEVSUlVQVF9NQVNLKTsK KworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEFNREdQVV9JUlFfU1RBVEVfRElTQUJMRToKKwkJ dG1wID0gUlJFRzMyKFZNX0NPTlRFWFQwX0NOVEwpOworCQl0bXAgJj0gfmJpdHM7CisJCVdSRUcz MihWTV9DT05URVhUMF9DTlRMLCB0bXApOworCQl0bXAgPSBSUkVHMzIoVk1fQ09OVEVYVDFfQ05U TCk7CisJCXRtcCAmPSB+Yml0czsKKwkJV1JFRzMyKFZNX0NPTlRFWFQxX0NOVEwsIHRtcCk7CisJ CWJyZWFrOworCWNhc2UgQU1ER1BVX0lSUV9TVEFURV9FTkFCTEU6CisJCXRtcCA9IFJSRUczMihW TV9DT05URVhUMF9DTlRMKTsKKwkJdG1wIHw9IGJpdHM7CisJCVdSRUczMihWTV9DT05URVhUMF9D TlRMLCB0bXApOworCQl0bXAgPSBSUkVHMzIoVk1fQ09OVEVYVDFfQ05UTCk7CisJCXRtcCB8PSBi aXRzOworCQlXUkVHMzIoVk1fQ09OVEVYVDFfQ05UTCwgdG1wKTsKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ21jX3Y2XzBf cHJvY2Vzc19pbnRlcnJ1cHQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJCQkJICAgICAg c3RydWN0IGFtZGdwdV9pcnFfc3JjICpzb3VyY2UsCisJCQkJICAgICAgc3RydWN0IGFtZGdwdV9p dl9lbnRyeSAqZW50cnkpCit7CisJdTMyIGFkZHIsIHN0YXR1czsKKworCWFkZHIgPSBSUkVHMzIo Vk1fQ09OVEVYVDFfUFJPVEVDVElPTl9GQVVMVF9BRERSKTsKKwlzdGF0dXMgPSBSUkVHMzIoVk1f Q09OVEVYVDFfUFJPVEVDVElPTl9GQVVMVF9TVEFUVVMpOworCVdSRUczMl9QKFZNX0NPTlRFWFQx X0NOVEwyLCAxLCB+MSk7CisKKwlpZiAoIWFkZHIgJiYgIXN0YXR1cykKKwkJcmV0dXJuIDA7CisK KwlpZiAoYW1kZ3B1X3ZtX2ZhdWx0X3N0b3AgPT0gQU1ER1BVX1ZNX0ZBVUxUX1NUT1BfRklSU1Qp CisJCWdtY192Nl8wX3NldF9mYXVsdF9lbmFibGVfZGVmYXVsdChhZGV2LCBmYWxzZSk7CisKKwlk ZXZfZXJyKGFkZXYtPmRldiwgIkdQVSBmYXVsdCBkZXRlY3RlZDogJWQgMHglMDh4XG4iLAorCQll bnRyeS0+c3JjX2lkLCBlbnRyeS0+c3JjX2RhdGEpOworCWRldl9lcnIoYWRldi0+ZGV2LCAiICBW TV9DT05URVhUMV9QUk9URUNUSU9OX0ZBVUxUX0FERFIgICAweCUwOFhcbiIsCisJCWFkZHIpOwor CWRldl9lcnIoYWRldi0+ZGV2LCAiICBWTV9DT05URVhUMV9QUk9URUNUSU9OX0ZBVUxUX1NUQVRV UyAweCUwOFhcbiIsCisJCXN0YXR1cyk7CisJZ21jX3Y2XzBfdm1fZGVjb2RlX2ZhdWx0KGFkZXYs IHN0YXR1cywgYWRkciwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbWNfdjZf MF9zZXRfY2xvY2tnYXRpbmdfc3RhdGUodm9pZCAqaGFuZGxlLAorCQkJCQkgIGVudW0gYW1kX2Ns b2NrZ2F0aW5nX3N0YXRlIHN0YXRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdt Y192Nl8wX3NldF9wb3dlcmdhdGluZ19zdGF0ZSh2b2lkICpoYW5kbGUsCisJCQkJCSAgZW51bSBh bWRfcG93ZXJnYXRpbmdfc3RhdGUgc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK2NvbnN0IHN0 cnVjdCBhbWRfaXBfZnVuY3MgZ21jX3Y2XzBfaXBfZnVuY3MgPSB7CisJLm5hbWUgPSAiZ21jX3Y2 XzAiLAorCS5lYXJseV9pbml0ID0gZ21jX3Y2XzBfZWFybHlfaW5pdCwKKwkubGF0ZV9pbml0ID0g Z21jX3Y2XzBfbGF0ZV9pbml0LAorCS5zd19pbml0ID0gZ21jX3Y2XzBfc3dfaW5pdCwKKwkuc3df ZmluaSA9IGdtY192Nl8wX3N3X2ZpbmksCisJLmh3X2luaXQgPSBnbWNfdjZfMF9od19pbml0LAor CS5od19maW5pID0gZ21jX3Y2XzBfaHdfZmluaSwKKwkuc3VzcGVuZCA9IGdtY192Nl8wX3N1c3Bl bmQsCisJLnJlc3VtZSA9IGdtY192Nl8wX3Jlc3VtZSwKKwkuaXNfaWRsZSA9IGdtY192Nl8wX2lz X2lkbGUsCisJLndhaXRfZm9yX2lkbGUgPSBnbWNfdjZfMF93YWl0X2Zvcl9pZGxlLAorCS5zb2Z0 X3Jlc2V0ID0gZ21jX3Y2XzBfc29mdF9yZXNldCwKKwkuc2V0X2Nsb2NrZ2F0aW5nX3N0YXRlID0g Z21jX3Y2XzBfc2V0X2Nsb2NrZ2F0aW5nX3N0YXRlLAorCS5zZXRfcG93ZXJnYXRpbmdfc3RhdGUg PSBnbWNfdjZfMF9zZXRfcG93ZXJnYXRpbmdfc3RhdGUsCit9OworCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGFtZGdwdV9nYXJ0X2Z1bmNzIGdtY192Nl8wX2dhcnRfZnVuY3MgPSB7CisJLmZsdXNoX2dw dV90bGIgPSBnbWNfdjZfMF9nYXJ0X2ZsdXNoX2dwdV90bGIsCisJLnNldF9wdGVfcGRlID0gZ21j X3Y2XzBfZ2FydF9zZXRfcHRlX3BkZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYW1kZ3B1 X2lycV9zcmNfZnVuY3MgZ21jX3Y2XzBfaXJxX2Z1bmNzID0geworCS5zZXQgPSBnbWNfdjZfMF92 bV9mYXVsdF9pbnRlcnJ1cHRfc3RhdGUsCisJLnByb2Nlc3MgPSBnbWNfdjZfMF9wcm9jZXNzX2lu dGVycnVwdCwKK307CisKK3N0YXRpYyB2b2lkIGdtY192Nl8wX3NldF9nYXJ0X2Z1bmNzKHN0cnVj dCBhbWRncHVfZGV2aWNlICphZGV2KQoreworCWlmIChhZGV2LT5nYXJ0LmdhcnRfZnVuY3MgPT0g TlVMTCkKKwkJYWRldi0+Z2FydC5nYXJ0X2Z1bmNzID0gJmdtY192Nl8wX2dhcnRfZnVuY3M7Cit9 CisKK3N0YXRpYyB2b2lkIGdtY192Nl8wX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYpCit7CisJYWRldi0+bWMudm1fZmF1bHQubnVtX3R5cGVzID0gMTsKKwlhZGV2LT5t Yy52bV9mYXVsdC5mdW5jcyA9ICZnbWNfdjZfMF9pcnFfZnVuY3M7Cit9CisKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2dtY192Nl8wLmggYi9kcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9nbWNfdjZfMC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmU2Zjc4YjMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9n bWNfdjZfMC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZhbmNl ZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICog YWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgor ICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0Yg QU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlU RUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNI QUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZP UiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBB TiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9N LCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9S CisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgorICovCisKKyNpZm5kZWYg X19HTUNfVjZfMF9IX18KKyNkZWZpbmUgX19HTUNfVjZfMF9IX18KKworZXh0ZXJuIGNvbnN0IHN0 cnVjdCBhbWRfaXBfZnVuY3MgZ21jX3Y2XzBfaXBfZnVuY3M7CisKKy8qIFhYWCB0aGVzZSBzaG91 bGRuJ3QgYmUgZXhwb3J0ZWQgKi8KK3ZvaWQgZ21jX3Y2XzBfbWNfc3RvcChzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwKKwkJICAgICAgc3RydWN0IGFtZGdwdV9tb2RlX21jX3NhdmUgKnNhdmUp Owordm9pZCBnbWNfdjZfMF9tY19yZXN1bWUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCisJ CQlzdHJ1Y3QgYW1kZ3B1X21vZGVfbWNfc2F2ZSAqc2F2ZSk7CitpbnQgZ21jX3Y2XzBfbWNfd2Fp dF9mb3JfaWRsZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7CisKKyNlbmRpZgotLSAKMi41 LjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1k ZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=