From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 08/17] drm/amdgpu: add DMA implementation for si v6 Date: Sat, 14 May 2016 15:26:20 -0400 Message-ID: <1463253989-28924-9-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-x243.google.com (mail-qg0-x243.google.com [IPv6:2607:f8b0:400d:c04::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 84B056E2DA for ; Sat, 14 May 2016 19:26:43 +0000 (UTC) Received: by mail-qg0-x243.google.com with SMTP id 90so10656964qgz.0 for ; Sat, 14 May 2016 12:26:43 -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 RnJvbTogS2VuIFdhbmcgPFFpbmdxaW5nLldhbmdAYW1kLmNvbT4KCnY0OiByZWJhc2UgZml4ZXMK djU6IHVzZSB0aGUgZ2VuZXJpYyBub3AgZmlsbAp2NjogcmViYXNlIGZpeGVzCgpTaWduZWQtb2Zm LWJ5OiBLZW4gV2FuZyA8UWluZ3FpbmcuV2FuZ0BhbWQuY29tPgpTaWduZWQtb2ZmLWJ5OiBBbGV4 IERldWNoZXIgPGFsZXhhbmRlci5kZXVjaGVyQGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJt L2FtZC9hbWRncHUvYW1kZ3B1LmggICAgICAgICAgIHwgICA0ICsKIGRyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L3NpX2RtYS5jICAgICAgICAgICB8IDk2MyArKysrKysrKysrKysrKysrKysrKysr KysrKwogZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvc2lfZG1hLmggICAgICAgICAgIHwgIDI5 ICsKIGRyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9hc2ljX3JlZy9zaS9zaWQuaCB8ICAgMiAr CiA0IGZpbGVzIGNoYW5nZWQsIDk5OCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvc2lfZG1hLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zaV9kbWEuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv YW1kZ3B1LmgKaW5kZXggMzY3ZGJjNC4uZTdiMjhkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2FtZC9hbWRncHUvYW1kZ3B1LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUv YW1kZ3B1LmgKQEAgLTE3MDUsNiArMTcwNSwxMCBAQCBzdHJ1Y3QgYW1kZ3B1X3NkbWFfaW5zdGFu Y2UgewogCiBzdHJ1Y3QgYW1kZ3B1X3NkbWEgewogCXN0cnVjdCBhbWRncHVfc2RtYV9pbnN0YW5j ZSBpbnN0YW5jZVtBTURHUFVfTUFYX1NETUFfSU5TVEFOQ0VTXTsKKyNpZmRlZiBDT05GSUdfRFJN X0FNREdQVV9TSQorCS8vU0kgRE1BIGhhcyBhIGRpZmZlcmVuY2UgdHJhcCBpcnEgbnVtYmVyIGZv ciB0aGUgc2Vjb25kIGVuZ2luZQorCXN0cnVjdCBhbWRncHVfaXJxX3NyYwl0cmFwX2lycV8xOwor I2VuZGlmCiAJc3RydWN0IGFtZGdwdV9pcnFfc3JjCXRyYXBfaXJxOwogCXN0cnVjdCBhbWRncHVf aXJxX3NyYwlpbGxlZ2FsX2luc3RfaXJxOwogCWludAkJCW51bV9pbnN0YW5jZXM7CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zaV9kbWEuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvYW1kZ3B1L3NpX2RtYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu Ljg3M2RkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9z aV9kbWEuYwpAQCAtMCwwICsxLDk2MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IEFkdmFuY2Vk IE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVk LCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0 aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5 LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5k L29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRv IHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8g dGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBh bGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBB TlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hB TEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFVVEhPUihTKSBCRSBMSUFCTEUgRk9S IEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFO IEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsCisgKiBBUklTSU5HIEZST00s IE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IK KyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKiBBdXRob3JzOiBBbGV4 IERldWNoZXIKKyAqLworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSAiYW1kZ3B1Lmgi CisjaW5jbHVkZSAiYW1kZ3B1X3RyYWNlLmgiCisjaW5jbHVkZSAic2kvc2lkLmgiCisKK2NvbnN0 IHUzMiBzZG1hX29mZnNldHNbU0RNQV9NQVhfSU5TVEFOQ0VdID0KK3sKKwlETUEwX1JFR0lTVEVS X09GRlNFVCwKKwlETUExX1JFR0lTVEVSX09GRlNFVAorfTsKKworc3RhdGljIHZvaWQgc2lfZG1h X3NldF9yaW5nX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0YXRpYyB2b2lk IHNpX2RtYV9zZXRfYnVmZmVyX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKK3N0 YXRpYyB2b2lkIHNpX2RtYV9zZXRfdm1fcHRlX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2KTsKK3N0YXRpYyB2b2lkIHNpX2RtYV9zZXRfaXJxX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2KTsKKworc3RhdGljIHVpbnQzMl90IHNpX2RtYV9yaW5nX2dldF9ycHRyKHN0cnVj dCBhbWRncHVfcmluZyAqcmluZykKK3sKKwl1MzIgcnB0cjsKKworCXJwdHIgPSByaW5nLT5hZGV2 LT53Yi53YltyaW5nLT5ycHRyX29mZnMvNF07CisKKwlyZXR1cm4gcnB0cjsKK30KKworc3RhdGlj IHVpbnQzMl90IHNpX2RtYV9yaW5nX2dldF93cHRyKHN0cnVjdCBhbWRncHVfcmluZyAqcmluZykK K3sKKworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gcmluZy0+YWRldjsKKwl1MzIgbWUg PSAocmluZyA9PSAmYWRldi0+c2RtYS5pbnN0YW5jZVswXS5yaW5nKSA/IDAgOiAxOworCisJcmV0 dXJuIChSUkVHMzIoRE1BX1JCX1dQVFIgKyBzZG1hX29mZnNldHNbbWVdKSAmIDB4M2ZmZmMpID4+ IDI7Cit9CisKK3N0YXRpYyB2b2lkIHNpX2RtYV9yaW5nX3NldF93cHRyKHN0cnVjdCBhbWRncHVf cmluZyAqcmluZykKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IHJpbmctPmFkZXY7 CisJdTMyIG1lID0gKHJpbmcgPT0gJmFkZXYtPnNkbWEuaW5zdGFuY2VbMF0ucmluZykgPyAwIDog MTsKKworCVdSRUczMihETUFfUkJfV1BUUiArIHNkbWFfb2Zmc2V0c1ttZV0sIChyaW5nLT53cHRy IDw8IDIpICYgMHgzZmZmYyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpX2RtYV9yaW5nX2VtaXRfaWIo c3RydWN0IGFtZGdwdV9yaW5nICpyaW5nLAorCQkJCXN0cnVjdCBhbWRncHVfaWIgKmliLAorCQkJ CXVuc2lnbmVkIHZtX2lkLCBib29sIGN0eF9zd2l0Y2gpCit7CisJdTMyIG5leHRfcnB0ciA9IHJp bmctPndwdHIgKyA0OworCisJd2hpbGUgKChuZXh0X3JwdHIgJiA3KSAhPSA1KQorCQluZXh0X3Jw dHIrKzsKKwluZXh0X3JwdHIgKz0gMzsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBETUFfUEFD S0VUKERNQV9QQUNLRVRfV1JJVEUsIDAsIDAsIDAsIDEpKTsKKwlhbWRncHVfcmluZ193cml0ZShy aW5nLCByaW5nLT5uZXh0X3JwdHJfZ3B1X2FkZHIgJiAweGZmZmZmZmZjKTsKKwlhbWRncHVfcmlu Z193cml0ZShyaW5nLCB1cHBlcl8zMl9iaXRzKHJpbmctPm5leHRfcnB0cl9ncHVfYWRkcikgJiAw eGZmKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBuZXh0X3JwdHIpOworCisJLyogVGhlIGlu ZGlyZWN0IGJ1ZmZlciBwYWNrZXQgbXVzdCBlbmQgb24gYW4gOCBEVyBib3VuZGFyeSBpbiB0aGUg RE1BIHJpbmcuCisJICogUGFkIGFzIG5lY2Vzc2FyeSB3aXRoIE5PUHMuCisJICovCisJd2hpbGUg KChyaW5nLT53cHRyICYgNykgIT0gNSkKKwkJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgRE1BX1BB Q0tFVChETUFfUEFDS0VUX05PUCwgMCwgMCwgMCwgMCkpOworCWFtZGdwdV9yaW5nX3dyaXRlKHJp bmcsIERNQV9JQl9QQUNLRVQoRE1BX1BBQ0tFVF9JTkRJUkVDVF9CVUZGRVIsIHZtX2lkLCAwKSk7 CisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgKGliLT5ncHVfYWRkciAmIDB4RkZGRkZGRTApKTsK KwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAoaWItPmxlbmd0aF9kdyA8PCAxMikgfCAodXBwZXJf MzJfYml0cyhpYi0+Z3B1X2FkZHIpICYgMHhGRikpOworCit9CisKK3N0YXRpYyB2b2lkIHNpX2Rt YV9yaW5nX2VtaXRfaGRwX2ZsdXNoKHN0cnVjdCBhbWRncHVfcmluZyAqcmluZykKK3sKKwlhbWRn cHVfcmluZ193cml0ZShyaW5nLCBETUFfUEFDS0VUKERNQV9QQUNLRVRfU1JCTV9XUklURSwgMCwg MCwgMCwgMCkpOworCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsICgweGYgPDwgMTYpIHwgKEhEUF9N RU1fQ09IRVJFTkNZX0ZMVVNIX0NOVEwpKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAxKTsK K30KKworc3RhdGljIHZvaWQgc2lfZG1hX3JpbmdfZW1pdF9oZHBfaW52YWxpZGF0ZShzdHJ1Y3Qg YW1kZ3B1X3JpbmcgKnJpbmcpCit7CisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgRE1BX1BBQ0tF VChETUFfUEFDS0VUX1NSQk1fV1JJVEUsIDAsIDAsIDAsIDApKTsKKwlhbWRncHVfcmluZ193cml0 ZShyaW5nLCAoMHhmIDw8IDE2KSB8IChIRFBfREVCVUcwKSk7CisJYW1kZ3B1X3Jpbmdfd3JpdGUo cmluZywgMSk7Cit9CisKKy8qKgorICogc2lfZG1hX3JpbmdfZW1pdF9mZW5jZSAtIGVtaXQgYSBm ZW5jZSBvbiB0aGUgRE1BIHJpbmcKKyAqCisgKiBAcmluZzogYW1kZ3B1IHJpbmcgcG9pbnRlcgor ICogQGZlbmNlOiBhbWRncHUgZmVuY2Ugb2JqZWN0CisgKgorICogQWRkIGEgRE1BIGZlbmNlIHBh Y2tldCB0byB0aGUgcmluZyB0byB3cml0ZQorICogdGhlIGZlbmNlIHNlcSBudW1iZXIgYW5kIERN QSB0cmFwIHBhY2tldCB0byBnZW5lcmF0ZQorICogYW4gaW50ZXJydXB0IGlmIG5lZWRlZCAoVkkp LgorICovCitzdGF0aWMgdm9pZCBzaV9kbWFfcmluZ19lbWl0X2ZlbmNlKHN0cnVjdCBhbWRncHVf cmluZyAqcmluZywgdTY0IGFkZHIsIHU2NCBzZXEsCisJCQkJICAgICAgdW5zaWduZWQgZmxhZ3Mp Cit7CisKKwlib29sIHdyaXRlNjRiaXQgPSBmbGFncyAmIEFNREdQVV9GRU5DRV9GTEFHXzY0QklU OworCS8qIHdyaXRlIHRoZSBmZW5jZSAqLworCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsIERNQV9Q QUNLRVQoRE1BX1BBQ0tFVF9GRU5DRSwgMCwgMCwgMCwgMCkpOworCWFtZGdwdV9yaW5nX3dyaXRl KHJpbmcsIGFkZHIgJiAweGZmZmZmZmZjKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAodXBw ZXJfMzJfYml0cyhhZGRyKSAmIDB4ZmYpKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBzZXEp OworCS8qIG9wdGlvbmFsbHkgd3JpdGUgaGlnaCBiaXRzIGFzIHdlbGwgKi8KKwlpZiAod3JpdGU2 NGJpdCkgeworCQlhZGRyICs9IDQ7CisJCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsIERNQV9QQUNL RVQoRE1BX1BBQ0tFVF9GRU5DRSwgMCwgMCwgMCwgMCkpOworCQlhbWRncHVfcmluZ193cml0ZShy aW5nLCBhZGRyICYgMHhmZmZmZmZmYyk7CisJCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsICh1cHBl cl8zMl9iaXRzKGFkZHIpICYgMHhmZikpOworCQlhbWRncHVfcmluZ193cml0ZShyaW5nLCB1cHBl cl8zMl9iaXRzKHNlcSkpOworCX0KKwkvKiBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgKi8KKwlhbWRn cHVfcmluZ193cml0ZShyaW5nLCBETUFfUEFDS0VUKERNQV9QQUNLRVRfVFJBUCwgMCwgMCwgMCwg MCkpOworfQorCitzdGF0aWMgaW50IHNpX2RtYV9nZnhfcmVzdW1lKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2KQoreworCXN0cnVjdCBhbWRncHVfcmluZyAqcmluZzsKKwl1MzIgcmJfY250bCwg ZG1hX2NudGwsIGliX2NudGwsIHJiX2J1ZnN6LCByZWdfb2Zmc2V0OworCWludCBpLCByOworCXVp bnQ2NF90IHJwdHJfYWRkcjsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJcmluZyA9 ICZhZGV2LT5zZG1hLmluc3RhbmNlW2ldLnJpbmc7CisJCXJlZ19vZmZzZXQgPSBzZG1hX29mZnNl dHNbaV07CisKKwkJV1JFRzMyKERNQV9TRU1fSU5DT01QTEVURV9USU1FUl9DTlRMICsgcmVnX29m ZnNldCwgMCk7CisJCVdSRUczMihETUFfU0VNX1dBSVRfRkFJTF9USU1FUl9DTlRMICsgcmVnX29m ZnNldCwgMCk7CisKKwkJLyogU2V0IHJpbmcgYnVmZmVyIHNpemUgaW4gZHdvcmRzICovCisJCXJi X2J1ZnN6ID0gb3JkZXJfYmFzZV8yKHJpbmctPnJpbmdfc2l6ZSAvIDQpOworCQlyYl9jbnRsID0g cmJfYnVmc3ogPDwgMTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJcmJfY250bCB8PSBETUFfUkJf U1dBUF9FTkFCTEUgfCBETUFfUlBUUl9XUklURUJBQ0tfU1dBUF9FTkFCTEU7CisjZW5kaWYKKwkJ V1JFRzMyKERNQV9SQl9DTlRMICsgcmVnX29mZnNldCwgcmJfY250bCk7CisKKwkJLyogSW5pdGlh bGl6ZSB0aGUgcmluZyBidWZmZXIncyByZWFkIGFuZCB3cml0ZSBwb2ludGVycyAqLworCQlXUkVH MzIoRE1BX1JCX1JQVFIgKyByZWdfb2Zmc2V0LCAwKTsKKwkJV1JFRzMyKERNQV9SQl9XUFRSICsg cmVnX29mZnNldCwgMCk7CisKKwkJcnB0cl9hZGRyID0gYWRldi0+d2IuZ3B1X2FkZHIgKyAocmlu Zy0+cnB0cl9vZmZzICogNCk7CisKKwkJV1JFRzMyKERNQV9SQl9SUFRSX0FERFJfTE8sIGxvd2Vy XzMyX2JpdHMocnB0cl9hZGRyKSk7CisJCVdSRUczMihETUFfUkJfUlBUUl9BRERSX0hJLCB1cHBl cl8zMl9iaXRzKHJwdHJfYWRkcikgJiAweEZGKTsKKworCQlyYl9jbnRsIHw9IERNQV9SUFRSX1dS SVRFQkFDS19FTkFCTEU7CisKKwkJV1JFRzMyKERNQV9SQl9CQVNFICsgcmVnX29mZnNldCwgcmlu Zy0+Z3B1X2FkZHIgPj4gOCk7CisKKwkJLyogZW5hYmxlIERNQSBJQnMgKi8KKwkJaWJfY250bCA9 IERNQV9JQl9FTkFCTEUgfCBDTURfVk1JRF9GT1JDRTsKKyNpZmRlZiBfX0JJR19FTkRJQU4KKwkJ aWJfY250bCB8PSBETUFfSUJfU1dBUF9FTkFCTEU7CisjZW5kaWYKKwkJV1JFRzMyKERNQV9JQl9D TlRMICsgcmVnX29mZnNldCwgaWJfY250bCk7CisKKwkJZG1hX2NudGwgPSBSUkVHMzIoRE1BX0NO VEwgKyByZWdfb2Zmc2V0KTsKKwkJZG1hX2NudGwgJj0gfkNUWEVNUFRZX0lOVF9FTkFCTEU7CisJ CVdSRUczMihETUFfQ05UTCArIHJlZ19vZmZzZXQsIGRtYV9jbnRsKTsKKworCQlyaW5nLT53cHRy ID0gMDsKKwkJV1JFRzMyKERNQV9SQl9XUFRSICsgcmVnX29mZnNldCwgcmluZy0+d3B0ciA8PCAy KTsKKworCQlXUkVHMzIoRE1BX1JCX0NOVEwgKyByZWdfb2Zmc2V0LCByYl9jbnRsIHwgRE1BX1JC X0VOQUJMRSk7CisKKwkJcmluZy0+cmVhZHkgPSB0cnVlOworCisJCXIgPSBhbWRncHVfcmluZ190 ZXN0X3JpbmcocmluZyk7CisJCWlmIChyKSB7CisJCQlyaW5nLT5yZWFkeSA9IGZhbHNlOworCQkJ cmV0dXJuIHI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzaV9kbWFfc3Rh cnQgLSBzZXR1cCBhbmQgc3RhcnQgdGhlIGFzeW5jIGRtYSBlbmdpbmVzCisgKgorICogQGFkZXY6 IGFtZGdwdV9kZXZpY2UgcG9pbnRlcgorICoKKyAqIFNldCB1cCB0aGUgRE1BIGVuZ2luZXMgYW5k IGVuYWJsZSB0aGVtIChWSSkuCisgKiBSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIGVycm9yIGZvciBm YWlsdXJlLgorICovCitzdGF0aWMgaW50IHNpX2RtYV9zdGFydChzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldikKK3sKKwlpbnQgcjsKKworCXIgPSBzaV9kbWFfZ2Z4X3Jlc3VtZShhZGV2KTsKKwor CXJldHVybiByOworfQorCisvKioKKyAqIHNpX2RtYV9yaW5nX3Rlc3RfcmluZyAtIHNpbXBsZSBh c3luYyBkbWEgZW5naW5lIHRlc3QKKyAqCisgKiBAcmluZzogYW1kZ3B1X3Jpbmcgc3RydWN0dXJl IGhvbGRpbmcgcmluZyBpbmZvcm1hdGlvbgorICoKKyAqIFRlc3QgdGhlIERNQSBlbmdpbmUgYnkg d3JpdGluZyB1c2luZyBpdCB0byB3cml0ZSBhbgorICogdmFsdWUgdG8gbWVtb3J5LiAoVkkpLgor ICogUmV0dXJucyAwIGZvciBzdWNjZXNzLCBlcnJvciBmb3IgZmFpbHVyZS4KKyAqLworc3RhdGlj IGludCBzaV9kbWFfcmluZ190ZXN0X3Jpbmcoc3RydWN0IGFtZGdwdV9yaW5nICpyaW5nKQorewor CXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gcmluZy0+YWRldjsKKwl1bnNpZ25lZCBpOwor CXVuc2lnbmVkIGluZGV4OworCWludCByOworCXUzMiB0bXA7CisJdTY0IGdwdV9hZGRyOworCisJ ciA9IGFtZGdwdV93Yl9nZXQoYWRldiwgJmluZGV4KTsKKwlpZiAocikgeworCQlkZXZfZXJyKGFk ZXYtPmRldiwgIiglZCkgZmFpbGVkIHRvIGFsbG9jYXRlIHdiIHNsb3RcbiIsIHIpOworCQlyZXR1 cm4gcjsKKwl9CisKKwlncHVfYWRkciA9IGFkZXYtPndiLmdwdV9hZGRyICsgKGluZGV4ICogNCk7 CisJdG1wID0gMHhDQUZFREVBRDsKKwlhZGV2LT53Yi53YltpbmRleF0gPSBjcHVfdG9fbGUzMih0 bXApOworCisJciA9IGFtZGdwdV9yaW5nX2FsbG9jKHJpbmcsIDQpOworCWlmIChyKSB7CisJCURS TV9FUlJPUigiYW1kZ3B1OiBkbWEgZmFpbGVkIHRvIGxvY2sgcmluZyAlZCAoJWQpLlxuIiwgcmlu Zy0+aWR4LCByKTsKKwkJYW1kZ3B1X3diX2ZyZWUoYWRldiwgaW5kZXgpOworCQlyZXR1cm4gcjsK Kwl9CisKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBETUFfUEFDS0VUKERNQV9QQUNLRVRfV1JJ VEUsIDAsIDAsIDAsIDEpKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBsb3dlcl8zMl9iaXRz KGdwdV9hZGRyKSk7CisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgdXBwZXJfMzJfYml0cyhncHVf YWRkcikgJiAweGZmKTsKKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAweERFQURCRUVGKTsKKwlh bWRncHVfcmluZ19jb21taXQocmluZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190 aW1lb3V0OyBpKyspIHsKKwkJdG1wID0gbGUzMl90b19jcHUoYWRldi0+d2Iud2JbaW5kZXhdKTsK KwkJaWYgKHRtcCA9PSAweERFQURCRUVGKQorCQkJYnJlYWs7CisJCURSTV9VREVMQVkoMSk7CisJ fQorCisJaWYgKGkgPCBhZGV2LT51c2VjX3RpbWVvdXQpIHsKKwkJRFJNX0lORk8oInJpbmcgdGVz dCBvbiAlZCBzdWNjZWVkZWQgaW4gJWQgdXNlY3NcbiIsIHJpbmctPmlkeCwgaSk7CisJfSBlbHNl IHsKKwkJRFJNX0VSUk9SKCJhbWRncHU6IHJpbmcgJWQgdGVzdCBmYWlsZWQgKDB4JTA4WClcbiIs CisJCQkgIHJpbmctPmlkeCwgdG1wKTsKKwkJciA9IC1FSU5WQUw7CisJfQorCWFtZGdwdV93Yl9m cmVlKGFkZXYsIGluZGV4KTsKKworCXJldHVybiByOworfQorCisvKioKKyAqIHNpX2RtYV9yaW5n X3Rlc3RfaWIgLSB0ZXN0IGFuIElCIG9uIHRoZSBETUEgZW5naW5lCisgKgorICogQHJpbmc6IGFt ZGdwdV9yaW5nIHN0cnVjdHVyZSBob2xkaW5nIHJpbmcgaW5mb3JtYXRpb24KKyAqCisgKiBUZXN0 IGEgc2ltcGxlIElCIGluIHRoZSBETUEgcmluZyAoVkkpLgorICogUmV0dXJucyAwIG9uIHN1Y2Nl c3MsIGVycm9yIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgc2lfZG1hX3JpbmdfdGVzdF9p YihzdHJ1Y3QgYW1kZ3B1X3JpbmcgKnJpbmcpCit7CisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYgPSByaW5nLT5hZGV2OworCXN0cnVjdCBhbWRncHVfaWIgaWI7CisJc3RydWN0IGZlbmNlICpm ID0gTlVMTDsKKwl1bnNpZ25lZCBpOworCXVuc2lnbmVkIGluZGV4OworCWludCByOworCXUzMiB0 bXAgPSAwOworCXU2NCBncHVfYWRkcjsKKworCXIgPSBhbWRncHVfd2JfZ2V0KGFkZXYsICZpbmRl eCk7CisJaWYgKHIpIHsKKwkJZGV2X2VycihhZGV2LT5kZXYsICIoJWQpIGZhaWxlZCB0byBhbGxv Y2F0ZSB3YiBzbG90XG4iLCByKTsKKwkJcmV0dXJuIHI7CisJfQorCisJZ3B1X2FkZHIgPSBhZGV2 LT53Yi5ncHVfYWRkciArIChpbmRleCAqIDQpOworCXRtcCA9IDB4Q0FGRURFQUQ7CisJYWRldi0+ d2Iud2JbaW5kZXhdID0gY3B1X3RvX2xlMzIodG1wKTsKKwltZW1zZXQoJmliLCAwLCBzaXplb2Yo aWIpKTsKKwlyID0gYW1kZ3B1X2liX2dldChhZGV2LCBOVUxMLCAyNTYsICZpYik7CisJaWYgKHIp IHsKKwkJRFJNX0VSUk9SKCJhbWRncHU6IGZhaWxlZCB0byBnZXQgaWIgKCVkKS5cbiIsIHIpOwor CQlnb3RvIGVycjA7CisJfQorCisJaWIucHRyWzBdID0gRE1BX1BBQ0tFVChETUFfUEFDS0VUX1dS SVRFLCAwLCAwLCAwLCAxKTsKKwlpYi5wdHJbMV0gPSBsb3dlcl8zMl9iaXRzKGdwdV9hZGRyKTsK KwlpYi5wdHJbMl0gPSB1cHBlcl8zMl9iaXRzKGdwdV9hZGRyKSAmIDB4ZmY7CisJaWIucHRyWzNd ID0gMHhERUFEQkVFRjsKKwlpYi5sZW5ndGhfZHcgPSA0OworCisJciA9IGFtZGdwdV9pYl9zY2hl ZHVsZShyaW5nLCAxLCAmaWIsIE5VTEwsIE5VTEwsICZmKTsKKwlpZiAocikKKwkJZ290byBlcnIx OworCisJciA9IGZlbmNlX3dhaXQoZiwgZmFsc2UpOworCWlmIChyKSB7CisJCURSTV9FUlJPUigi YW1kZ3B1OiBmZW5jZSB3YWl0IGZhaWxlZCAoJWQpLlxuIiwgcik7CisJCWdvdG8gZXJyMTsKKwl9 CisJZm9yIChpID0gMDsgaSA8IGFkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCXRtcCA9IGxl MzJfdG9fY3B1KGFkZXYtPndiLndiW2luZGV4XSk7CisJCWlmICh0bXAgPT0gMHhERUFEQkVFRikK KwkJCWJyZWFrOworCQlEUk1fVURFTEFZKDEpOworCX0KKwlpZiAoaSA8IGFkZXYtPnVzZWNfdGlt ZW91dCkgeworCQlEUk1fSU5GTygiaWIgdGVzdCBvbiByaW5nICVkIHN1Y2NlZWRlZCBpbiAldSB1 c2Vjc1xuIiwKKwkJCSByaW5nLT5pZHgsIGkpOworCQlnb3RvIGVycjE7CisJfSBlbHNlIHsKKwkJ RFJNX0VSUk9SKCJhbWRncHU6IGliIHRlc3QgZmFpbGVkICgweCUwOFgpXG4iLCB0bXApOworCQly ID0gLUVJTlZBTDsKKwl9CisKK2VycjE6CisJZmVuY2VfcHV0KGYpOworCWFtZGdwdV9pYl9mcmVl KGFkZXYsICZpYiwgTlVMTCk7CisJZmVuY2VfcHV0KGYpOworZXJyMDoKKwlhbWRncHVfd2JfZnJl ZShhZGV2LCBpbmRleCk7CisJcmV0dXJuIHI7Cit9CisKKy8qKgorICogc2lfZG1hX3ZtX2NvcHlf cHRlIC0gdXBkYXRlIFBURXMgYnkgY29weWluZyB0aGVtIGZyb20gdGhlIEdBUlQKKyAqCisgKiBA aWI6IGluZGlyZWN0IGJ1ZmZlciB0byBmaWxsIHdpdGggY29tbWFuZHMKKyAqIEBwZTogYWRkciBv ZiB0aGUgcGFnZSBlbnRyeQorICogQHNyYzogc3JjIGFkZHIgdG8gY29weSBmcm9tCisgKiBAY291 bnQ6IG51bWJlciBvZiBwYWdlIGVudHJpZXMgdG8gdXBkYXRlCisgKgorICogVXBkYXRlIFBURXMg YnkgY29weWluZyB0aGVtIGZyb20gdGhlIEdBUlQgdXNpbmcgc0RNQSAoQ0lLKS4KKyAqLworc3Rh dGljIHZvaWQgc2lfZG1hX3ZtX2NvcHlfcHRlKHN0cnVjdCBhbWRncHVfaWIgKmliLAorCQkJCSAg dWludDY0X3QgcGUsIHVpbnQ2NF90IHNyYywKKwkJCQkgIHVuc2lnbmVkIGNvdW50KQoreworCXdo aWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBieXRlcyA9IGNvdW50ICogODsKKwkJaWYgKGJ5dGVz ID4gMHhGRkZGOCkKKwkJCWJ5dGVzID0gMHhGRkZGODsKKworCQlpYi0+cHRyW2liLT5sZW5ndGhf ZHcrK10gPSBETUFfUEFDS0VUKERNQV9QQUNLRVRfQ09QWSwKKwkJCQkJCSAgICAgIDEsIDAsIDAs IGJ5dGVzKTsKKwkJaWItPnB0cltpYi0+bGVuZ3RoX2R3KytdID0gbG93ZXJfMzJfYml0cyhwZSk7 CisJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IGxvd2VyXzMyX2JpdHMoc3JjKTsKKwkJaWIt PnB0cltpYi0+bGVuZ3RoX2R3KytdID0gdXBwZXJfMzJfYml0cyhwZSkgJiAweGZmOworCQlpYi0+ cHRyW2liLT5sZW5ndGhfZHcrK10gPSB1cHBlcl8zMl9iaXRzKHNyYykgJiAweGZmOworCisJCXBl ICs9IGJ5dGVzOworCQlzcmMgKz0gYnl0ZXM7CisJCWNvdW50IC09IGJ5dGVzIC8gODsKKwl9Cit9 CisKKy8qKgorICogc2lfZG1hX3ZtX3dyaXRlX3B0ZSAtIHVwZGF0ZSBQVEVzIGJ5IHdyaXRpbmcg dGhlbSBtYW51YWxseQorICoKKyAqIEBpYjogaW5kaXJlY3QgYnVmZmVyIHRvIGZpbGwgd2l0aCBj b21tYW5kcworICogQHBlOiBhZGRyIG9mIHRoZSBwYWdlIGVudHJ5CisgKiBAYWRkcjogZHN0IGFk ZHIgdG8gd3JpdGUgaW50byBwZQorICogQGNvdW50OiBudW1iZXIgb2YgcGFnZSBlbnRyaWVzIHRv IHVwZGF0ZQorICogQGluY3I6IGluY3JlYXNlIG5leHQgYWRkciBieSBpbmNyIGJ5dGVzCisgKiBA ZmxhZ3M6IGFjY2VzcyBmbGFncworICoKKyAqIFVwZGF0ZSBQVEVzIGJ5IHdyaXRpbmcgdGhlbSBt YW51YWxseSB1c2luZyBzRE1BIChDSUspLgorICovCitzdGF0aWMgdm9pZCBzaV9kbWFfdm1fd3Jp dGVfcHRlKHN0cnVjdCBhbWRncHVfaWIgKmliLAorCQkJCSAgIGNvbnN0IGRtYV9hZGRyX3QgKnBh Z2VzX2FkZHIsIHVpbnQ2NF90IHBlLAorCQkJCSAgIHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGNv dW50LAorCQkJCSAgIHVpbnQzMl90IGluY3IsIHVpbnQzMl90IGZsYWdzKQoreworCXVpbnQ2NF90 IHZhbHVlOworCXVuc2lnbmVkIG5kdzsKKworCXdoaWxlIChjb3VudCkgeworCQluZHcgPSBjb3Vu dCAqIDI7CisJCWlmIChuZHcgPiAweEZGRkZFKQorCQkJbmR3ID0gMHhGRkZGRTsKKworCQkvKiBm b3Igbm9uLXBoeXNpY2FsbHkgY29udGlndW91cyBwYWdlcyAoc3lzdGVtKSAqLworCQlpYi0+cHRy W2liLT5sZW5ndGhfZHcrK10gPSBETUFfUEFDS0VUKERNQV9QQUNLRVRfV1JJVEUsIDAsIDAsIDAs IG5kdyk7CisJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9IHBlOworCQlpYi0+cHRyW2liLT5s ZW5ndGhfZHcrK10gPSB1cHBlcl8zMl9iaXRzKHBlKSAmIDB4ZmY7CisJCWZvciAoOyBuZHcgPiAw OyBuZHcgLT0gMiwgLS1jb3VudCwgcGUgKz0gOCkgeworCQkJaWYgKGZsYWdzICYgQU1ER1BVX1BU RV9TWVNURU0pIHsKKwkJCQl2YWx1ZSA9IGFtZGdwdV92bV9tYXBfZ2FydChwYWdlc19hZGRyLCBh ZGRyKTsKKwkJCX0gZWxzZSBpZiAoZmxhZ3MgJiBBTURHUFVfUFRFX1ZBTElEKSB7CisJCQkJdmFs dWUgPSBhZGRyOworCQkJfSBlbHNlIHsKKwkJCQl2YWx1ZSA9IDA7CisJCQl9CisJCQlhZGRyICs9 IGluY3I7CisJCQl2YWx1ZSB8PSBmbGFnczsKKwkJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9 IHZhbHVlOworCQkJaWItPnB0cltpYi0+bGVuZ3RoX2R3KytdID0gdXBwZXJfMzJfYml0cyh2YWx1 ZSk7CisJCX0KKwl9Cit9CisKKy8qKgorICogc2lfZG1hX3ZtX3NldF9wdGVfcGRlIC0gdXBkYXRl IHRoZSBwYWdlIHRhYmxlcyB1c2luZyBzRE1BCisgKgorICogQGliOiBpbmRpcmVjdCBidWZmZXIg dG8gZmlsbCB3aXRoIGNvbW1hbmRzCisgKiBAcGU6IGFkZHIgb2YgdGhlIHBhZ2UgZW50cnkKKyAq IEBhZGRyOiBkc3QgYWRkciB0byB3cml0ZSBpbnRvIHBlCisgKiBAY291bnQ6IG51bWJlciBvZiBw YWdlIGVudHJpZXMgdG8gdXBkYXRlCisgKiBAaW5jcjogaW5jcmVhc2UgbmV4dCBhZGRyIGJ5IGlu Y3IgYnl0ZXMKKyAqIEBmbGFnczogYWNjZXNzIGZsYWdzCisgKgorICogVXBkYXRlIHRoZSBwYWdl IHRhYmxlcyB1c2luZyBzRE1BIChDSUspLgorICovCitzdGF0aWMgdm9pZCBzaV9kbWFfdm1fc2V0 X3B0ZV9wZGUoc3RydWN0IGFtZGdwdV9pYiAqaWIsCisJCQkJICAgICB1aW50NjRfdCBwZSwKKwkJ CQkgICAgIHVpbnQ2NF90IGFkZHIsIHVuc2lnbmVkIGNvdW50LAorCQkJCSAgICAgdWludDMyX3Qg aW5jciwgdWludDMyX3QgZmxhZ3MpCit7CisJdWludDY0X3QgdmFsdWU7CisJdW5zaWduZWQgbmR3 OworCisJd2hpbGUgKGNvdW50KSB7CisJCW5kdyA9IGNvdW50ICogMjsKKwkJaWYgKG5kdyA+IDB4 RkZGRkUpCisJCQluZHcgPSAweEZGRkZFOworCisJCWlmIChmbGFncyAmIEFNREdQVV9QVEVfVkFM SUQpCisJCQl2YWx1ZSA9IGFkZHI7CisJCWVsc2UKKwkJCXZhbHVlID0gMDsKKworCQkvKiBmb3Ig cGh5c2ljYWxseSBjb250aWd1b3VzIHBhZ2VzICh2cmFtKSAqLworCQlpYi0+cHRyW2liLT5sZW5n dGhfZHcrK10gPSBETUFfUFRFX1BERV9QQUNLRVQobmR3KTsKKwkJaWItPnB0cltpYi0+bGVuZ3Ro X2R3KytdID0gcGU7IC8qIGRzdCBhZGRyICovCisJCWliLT5wdHJbaWItPmxlbmd0aF9kdysrXSA9 IHVwcGVyXzMyX2JpdHMocGUpICYgMHhmZjsKKwkJaWItPnB0cltpYi0+bGVuZ3RoX2R3KytdID0g ZmxhZ3M7IC8qIG1hc2sgKi8KKwkJaWItPnB0cltpYi0+bGVuZ3RoX2R3KytdID0gMDsKKwkJaWIt PnB0cltpYi0+bGVuZ3RoX2R3KytdID0gdmFsdWU7IC8qIHZhbHVlICovCisJCWliLT5wdHJbaWIt Pmxlbmd0aF9kdysrXSA9IHVwcGVyXzMyX2JpdHModmFsdWUpOworCQlpYi0+cHRyW2liLT5sZW5n dGhfZHcrK10gPSBpbmNyOyAvKiBpbmNyZW1lbnQgc2l6ZSAqLworCQlpYi0+cHRyW2liLT5sZW5n dGhfZHcrK10gPSAwOworCQlwZSArPSBuZHcgKiA0OworCQlhZGRyICs9IChuZHcgLyAyKSAqIGlu Y3I7CisJCWNvdW50IC09IG5kdyAvIDI7CisJfQorfQorCisvKioKKyAqIHNpX2RtYV9wYWRfaWIg LSBwYWQgdGhlIElCIHRvIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgZHcKKyAqCisgKiBAaWI6IGlu ZGlyZWN0IGJ1ZmZlciB0byBmaWxsIHdpdGggcGFkZGluZworICoKKyAqLworc3RhdGljIHZvaWQg c2lfZG1hX3JpbmdfcGFkX2liKHN0cnVjdCBhbWRncHVfcmluZyAqcmluZywgc3RydWN0IGFtZGdw dV9pYiAqaWIpCit7CisJd2hpbGUgKGliLT5sZW5ndGhfZHcgJiAweDcpCisJCWliLT5wdHJbaWIt Pmxlbmd0aF9kdysrXSA9IERNQV9QQUNLRVQoRE1BX1BBQ0tFVF9OT1AsIDAsIDAsIDAsIDApOwor fQorCisvKioKKyAqIGNpa19zZG1hX3JpbmdfZW1pdF9waXBlbGluZV9zeW5jIC0gc3luYyB0aGUg cGlwZWxpbmUKKyAqCisgKiBAcmluZzogYW1kZ3B1X3JpbmcgcG9pbnRlcgorICoKKyAqIE1ha2Ug c3VyZSBhbGwgcHJldmlvdXMgb3BlcmF0aW9ucyBhcmUgY29tcGxldGVkIChDSUspLgorICovCitz dGF0aWMgdm9pZCBzaV9kbWFfcmluZ19lbWl0X3BpcGVsaW5lX3N5bmMoc3RydWN0IGFtZGdwdV9y aW5nICpyaW5nKQoreworCXVpbnQzMl90IHNlcSA9IHJpbmctPmZlbmNlX2Rydi5zeW5jX3NlcTsK Kwl1aW50NjRfdCBhZGRyID0gcmluZy0+ZmVuY2VfZHJ2LmdwdV9hZGRyOworCisJLyogd2FpdCBm b3IgaWRsZSAqLworCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsIERNQV9QQUNLRVQoRE1BX1BBQ0tF VF9QT0xMX1JFR19NRU0sIDAsIDAsIDAsIDApIHwKKwkJCSAgKDEgPDwgMjcpKTsgLyogUG9sbCBt ZW1vcnkgKi8KKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCBsb3dlcl8zMl9iaXRzKGFkZHIpKTsK KwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAoMHhmZiA8PCAxNikgfCB1cHBlcl8zMl9iaXRzKGFk ZHIpKTsgLyogcmV0cnksIGFkZHJfaGkgKi8KKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAweGZm ZmZmZmZmKTsgLyogbWFzayAqLworCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsIHNlcSk7IC8qIHZh bHVlICovCisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgKDMgPDwgMjgpIHwgMHgyMCk7IC8qIGZ1 bmMoZXF1YWwpIHwgcG9sbCBpbnRlcnZhbCAqLworfQorCisvKioKKyAqIHNpX2RtYV9yaW5nX2Vt aXRfdm1fZmx1c2ggLSBjaWsgdm0gZmx1c2ggdXNpbmcgc0RNQQorICoKKyAqIEByaW5nOiBhbWRn cHVfcmluZyBwb2ludGVyCisgKiBAdm06IGFtZGdwdV92bSBwb2ludGVyCisgKgorICogVXBkYXRl IHRoZSBwYWdlIHRhYmxlIGJhc2UgYW5kIGZsdXNoIHRoZSBWTSBUTEIKKyAqIHVzaW5nIHNETUEg KFZJKS4KKyAqLworc3RhdGljIHZvaWQgc2lfZG1hX3JpbmdfZW1pdF92bV9mbHVzaChzdHJ1Y3Qg YW1kZ3B1X3JpbmcgKnJpbmcsCisJCQkJICAgICAgdW5zaWduZWQgdm1faWQsIHVpbnQ2NF90IHBk X2FkZHIpCit7CisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgRE1BX1BBQ0tFVChETUFfUEFDS0VU X1NSQk1fV1JJVEUsIDAsIDAsIDAsIDApKTsKKwlpZiAodm1faWQgPCA4KSB7CisJCWFtZGdwdV9y aW5nX3dyaXRlKHJpbmcsICgweGYgPDwgMTYpIHwgKFZNX0NPTlRFWFQwX1BBR0VfVEFCTEVfQkFT RV9BRERSICsgdm1faWQpKTsKKwl9IGVsc2UgeworCQlhbWRncHVfcmluZ193cml0ZShyaW5nLCAo MHhmIDw8IDE2KSB8IChWTV9DT05URVhUOF9QQUdFX1RBQkxFX0JBU0VfQUREUiArICh2bV9pZCAt IDgpKSk7CisJfQorCWFtZGdwdV9yaW5nX3dyaXRlKHJpbmcsIHBkX2FkZHIgPj4gMTIpOworCisJ LyogYml0cyAwLTcgYXJlIHRoZSBWTSBjb250ZXh0czAtNyAqLworCWFtZGdwdV9yaW5nX3dyaXRl KHJpbmcsIERNQV9QQUNLRVQoRE1BX1BBQ0tFVF9TUkJNX1dSSVRFLCAwLCAwLCAwLCAwKSk7CisJ YW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgKDB4ZiA8PCAxNikgfCAoVk1fSU5WQUxJREFURV9SRVFV RVNUKSk7CisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywgMSA8PCB2bV9pZCk7CisKKwkvKiB3YWl0 IGZvciBpbnZhbGlkYXRlIHRvIGNvbXBsZXRlICovCisJYW1kZ3B1X3Jpbmdfd3JpdGUocmluZywg RE1BX1BBQ0tFVChETUFfUEFDS0VUX1BPTExfUkVHX01FTSwgMCwgMCwgMCwgMCkpOworCWFtZGdw dV9yaW5nX3dyaXRlKHJpbmcsIFZNX0lOVkFMSURBVEVfUkVRVUVTVCk7CisJYW1kZ3B1X3Jpbmdf d3JpdGUocmluZywgMHhmZiA8PCAxNik7IC8qIHJldHJ5ICovCisJYW1kZ3B1X3Jpbmdfd3JpdGUo cmluZywgMSA8PCB2bV9pZCk7IC8qIG1hc2sgKi8KKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAw KTsgLyogdmFsdWUgKi8KKwlhbWRncHVfcmluZ193cml0ZShyaW5nLCAoMCA8PCAyOCkgfCAweDIw KTsgLyogZnVuYyhhbHdheXMpIHwgcG9sbCBpbnRlcnZhbCAqLworfQorCitzdGF0aWMgaW50IHNp X2RtYV9lYXJseV9pbml0KHZvaWQgKmhhbmRsZSkKK3sKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKKworCWFkZXYtPnNkbWEubnVt X2luc3RhbmNlcyA9IDI7CisKKwlzaV9kbWFfc2V0X3JpbmdfZnVuY3MoYWRldik7CisJc2lfZG1h X3NldF9idWZmZXJfZnVuY3MoYWRldik7CisJc2lfZG1hX3NldF92bV9wdGVfZnVuY3MoYWRldik7 CisJc2lfZG1hX3NldF9pcnFfZnVuY3MoYWRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBzaV9kbWFfc3dfaW5pdCh2b2lkICpoYW5kbGUpCit7CisJc3RydWN0IGFtZGdwdV9yaW5n ICpyaW5nOworCWludCByLCBpOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVj dCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJLyogRE1BMCB0cmFwIGV2ZW50ICovCisJciA9 IGFtZGdwdV9pcnFfYWRkX2lkKGFkZXYsIDIyNCwgJmFkZXYtPnNkbWEudHJhcF9pcnEpOworCWlm IChyKQorCQlyZXR1cm4gcjsKKworCS8qIERNQTEgdHJhcCBldmVudCAqLworCXIgPSBhbWRncHVf aXJxX2FkZF9pZChhZGV2LCAyNDQsICZhZGV2LT5zZG1hLnRyYXBfaXJxXzEpOworCWlmIChyKQor CQlyZXR1cm4gcjsKKworCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5zZG1hLm51bV9pbnN0YW5jZXM7 IGkrKykgeworCQlyaW5nID0gJmFkZXYtPnNkbWEuaW5zdGFuY2VbaV0ucmluZzsKKwkJcmluZy0+ cmluZ19vYmogPSBOVUxMOworCQlyaW5nLT51c2VfZG9vcmJlbGwgPSBmYWxzZTsKKwkJc3ByaW50 ZihyaW5nLT5uYW1lLCAic2RtYSVkIiwgaSk7CisJCXIgPSBhbWRncHVfcmluZ19pbml0KGFkZXYs IHJpbmcsIDY0ICogMTAyNCwKKwkJCQkgICAgIERNQV9QQUNLRVQoRE1BX1BBQ0tFVF9OT1AsIDAs IDAsIDAsIDApLCAweGYsCisJCQkJICAgICAmYWRldi0+c2RtYS50cmFwX2lycSwKKwkJCQkgICAg IChpID09IDApID8KKwkJCQkgICAgIEFNREdQVV9TRE1BX0lSUV9UUkFQMCA6IEFNREdQVV9TRE1B X0lSUV9UUkFQMSwKKwkJCQkgICAgIEFNREdQVV9SSU5HX1RZUEVfU0RNQSk7CisJCWlmIChyKQor CQkJcmV0dXJuIHI7CisJfQorCisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyBpbnQgc2lfZG1hX3N3 X2Zpbmkodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0 cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8 IGFkZXYtPnNkbWEubnVtX2luc3RhbmNlczsgaSsrKQorCQlhbWRncHVfcmluZ19maW5pKCZhZGV2 LT5zZG1hLmluc3RhbmNlW2ldLnJpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg c2lfZG1hX2h3X2luaXQodm9pZCAqaGFuZGxlKQoreworCWludCByOworCXN0cnVjdCBhbWRncHVf ZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJciA9IHNp X2RtYV9zdGFydChhZGV2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gcjsKK30K Kworc3RhdGljIGludCBzaV9kbWFfaHdfZmluaSh2b2lkICpoYW5kbGUpCit7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgc2lfZG1hX3N1c3BlbmQodm9pZCAqaGFuZGxlKQoreworCXN0cnVj dCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwor CisJcmV0dXJuIHNpX2RtYV9od19maW5pKGFkZXYpOworfQorCitzdGF0aWMgaW50IHNpX2RtYV9y ZXN1bWUodm9pZCAqaGFuZGxlKQoreworCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0 cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJcmV0dXJuIHNpX2RtYV9od19pbml0KGFk ZXYpOworfQorCitzdGF0aWMgYm9vbCBzaV9kbWFfaXNfaWRsZSh2b2lkICpoYW5kbGUpCit7CisJ c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5k bGU7CisJdTMyIHRtcCA9IFJSRUczMihTUkJNX1NUQVRVUzIpOworCisJaWYgKHRtcCAmIChETUFf QlVTWV9NQVNLIHwgRE1BMV9CVVNZX01BU0spKQorCSAgICByZXR1cm4gZmFsc2U7CisKKwlyZXR1 cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBzaV9kbWFfd2FpdF9mb3JfaWRsZSh2b2lkICpoYW5k bGUpCit7CisJdW5zaWduZWQgaTsKKwl1MzIgdG1wOworCXN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOworCisJZm9yIChpID0gMDsgaSA8 IGFkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCXRtcCA9IFJSRUczMihTUkJNX1NUQVRVUzIp ICYgKERNQV9CVVNZX01BU0sgfCBETUExX0JVU1lfTUFTSyk7CisKKwkJaWYgKCF0bXApCisJCQly ZXR1cm4gMDsKKwkJdWRlbGF5KDEpOworCX0KKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KKworc3Rh dGljIGludCBzaV9kbWFfc29mdF9yZXNldCh2b2lkICpoYW5kbGUpCit7CisJRFJNX0lORk8oInNp X2RtYV9zb2Z0X3Jlc2V0IC0tLSBub3QgaW1wbGVtZW50ZWQgISEhISEhIVxuIik7CisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgc2lfZG1hX3NldF90cmFwX2lycV9zdGF0ZShzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKKwkJCQkJc3RydWN0IGFtZGdwdV9pcnFfc3JjICpzcmMsCisJCQkJ CXVuc2lnbmVkIHR5cGUsCisJCQkJCWVudW0gYW1kZ3B1X2ludGVycnVwdF9zdGF0ZSBzdGF0ZSkK K3sKKwl1MzIgc2RtYV9jbnRsOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBTURHUFVfU0RN QV9JUlFfVFJBUDA6CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBBTURHUFVfSVJRX1NUQVRF X0RJU0FCTEU6CisJCQlzZG1hX2NudGwgPSBSUkVHMzIoRE1BX0NOVEwgKyBETUEwX1JFR0lTVEVS X09GRlNFVCk7CisJCQlzZG1hX2NudGwgJj0gflRSQVBfRU5BQkxFOworCQkJV1JFRzMyKERNQV9D TlRMICsgRE1BMF9SRUdJU1RFUl9PRkZTRVQsIHNkbWFfY250bCk7CisJCQlicmVhazsKKwkJY2Fz ZSBBTURHUFVfSVJRX1NUQVRFX0VOQUJMRToKKwkJCXNkbWFfY250bCA9IFJSRUczMihETUFfQ05U TCArIERNQTBfUkVHSVNURVJfT0ZGU0VUKTsKKwkJCXNkbWFfY250bCB8PSBUUkFQX0VOQUJMRTsK KwkJCVdSRUczMihETUFfQ05UTCArIERNQTBfUkVHSVNURVJfT0ZGU0VULCBzZG1hX2NudGwpOwor CQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEFN REdQVV9TRE1BX0lSUV9UUkFQMToKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEFNREdQVV9J UlFfU1RBVEVfRElTQUJMRToKKwkJCXNkbWFfY250bCA9IFJSRUczMihETUFfQ05UTCArIERNQTFf UkVHSVNURVJfT0ZGU0VUKTsKKwkJCXNkbWFfY250bCAmPSB+VFJBUF9FTkFCTEU7CisJCQlXUkVH MzIoRE1BX0NOVEwgKyBETUExX1JFR0lTVEVSX09GRlNFVCwgc2RtYV9jbnRsKTsKKwkJCWJyZWFr OworCQljYXNlIEFNREdQVV9JUlFfU1RBVEVfRU5BQkxFOgorCQkJc2RtYV9jbnRsID0gUlJFRzMy KERNQV9DTlRMICsgRE1BMV9SRUdJU1RFUl9PRkZTRVQpOworCQkJc2RtYV9jbnRsIHw9IFRSQVBf RU5BQkxFOworCQkJV1JFRzMyKERNQV9DTlRMICsgRE1BMV9SRUdJU1RFUl9PRkZTRVQsIHNkbWFf Y250bCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOwor CWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaV9k bWFfcHJvY2Vzc190cmFwX2lycShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkgICAg ICBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmMgKnNvdXJjZSwKKwkJCQkgICAgICBzdHJ1Y3QgYW1kZ3B1 X2l2X2VudHJ5ICplbnRyeSkKK3sKKwl1OCBpbnN0YW5jZV9pZCwgcXVldWVfaWQ7CisKKwlpbnN0 YW5jZV9pZCA9IChlbnRyeS0+cmluZ19pZCAmIDB4MykgPj4gMDsKKwlxdWV1ZV9pZCA9IChlbnRy eS0+cmluZ19pZCAmIDB4YykgPj4gMjsKKworCWFtZGdwdV9mZW5jZV9wcm9jZXNzKCZhZGV2LT5z ZG1hLmluc3RhbmNlWzBdLnJpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2lf ZG1hX3Byb2Nlc3NfdHJhcF9pcnFfMShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKKwkJCQkg ICAgICBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmMgKnNvdXJjZSwKKwkJCQkgICAgICBzdHJ1Y3QgYW1k Z3B1X2l2X2VudHJ5ICplbnRyeSkKK3sKKwl1OCBpbnN0YW5jZV9pZCwgcXVldWVfaWQ7CisKKwlp bnN0YW5jZV9pZCA9IChlbnRyeS0+cmluZ19pZCAmIDB4MykgPj4gMDsKKwlxdWV1ZV9pZCA9IChl bnRyeS0+cmluZ19pZCAmIDB4YykgPj4gMjsKKworCWFtZGdwdV9mZW5jZV9wcm9jZXNzKCZhZGV2 LT5zZG1hLmluc3RhbmNlWzFdLnJpbmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg c2lfZG1hX3Byb2Nlc3NfaWxsZWdhbF9pbnN0X2lycShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diwKKwkJCQkJICAgICAgc3RydWN0IGFtZGdwdV9pcnFfc3JjICpzb3VyY2UsCisJCQkJCSAgICAg IHN0cnVjdCBhbWRncHVfaXZfZW50cnkgKmVudHJ5KQoreworCURSTV9FUlJPUigiSWxsZWdhbCBp bnN0cnVjdGlvbiBpbiBTRE1BIGNvbW1hbmQgc3RyZWFtXG4iKTsKKwlzY2hlZHVsZV93b3JrKCZh ZGV2LT5yZXNldF93b3JrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzaV9kbWFfc2V0 X2Nsb2NrZ2F0aW5nX3N0YXRlKHZvaWQgKmhhbmRsZSwKKwkJCQkJICBlbnVtIGFtZF9jbG9ja2dh dGluZ19zdGF0ZSBzdGF0ZSkKK3sKKwl1MzIgb3JpZywgZGF0YSwgb2Zmc2V0OworCWludCBpOwor CWJvb2wgZW5hYmxlOworCisJc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKiloYW5kbGU7CisKKwllbmFibGUgPSAoc3RhdGUgPT0gQU1EX0NHX1NUQVRF X0dBVEUpID8gdHJ1ZSA6IGZhbHNlOworCisJaWYgKGVuYWJsZSAmJiAoYWRldi0+Y2dfZmxhZ3Mg JiBBTURfQ0dfU1VQUE9SVF9TRE1BX01HQ0cpKSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKysp IHsKKwkJCWlmIChpID09IDApCisJCQkJb2Zmc2V0ID0gRE1BMF9SRUdJU1RFUl9PRkZTRVQ7CisJ CQllbHNlCisJCQkJb2Zmc2V0ID0gRE1BMV9SRUdJU1RFUl9PRkZTRVQ7CisJCQlvcmlnID0gZGF0 YSA9IFJSRUczMihETUFfUE9XRVJfQ05UTCArIG9mZnNldCk7CisJCQlkYXRhICY9IH5NRU1fUE9X RVJfT1ZFUlJJREU7CisJCQlpZiAoZGF0YSAhPSBvcmlnKQorCQkJCVdSRUczMihETUFfUE9XRVJf Q05UTCArIG9mZnNldCwgZGF0YSk7CisJCQlXUkVHMzIoRE1BX0NMS19DVFJMICsgb2Zmc2V0LCAw eDAwMDAwMTAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsK KwkJCWlmIChpID09IDApCisJCQkJb2Zmc2V0ID0gRE1BMF9SRUdJU1RFUl9PRkZTRVQ7CisJCQll bHNlCisJCQkJb2Zmc2V0ID0gRE1BMV9SRUdJU1RFUl9PRkZTRVQ7CisJCQlvcmlnID0gZGF0YSA9 IFJSRUczMihETUFfUE9XRVJfQ05UTCArIG9mZnNldCk7CisJCQlkYXRhIHw9IE1FTV9QT1dFUl9P VkVSUklERTsKKwkJCWlmIChkYXRhICE9IG9yaWcpCisJCQkJV1JFRzMyKERNQV9QT1dFUl9DTlRM ICsgb2Zmc2V0LCBkYXRhKTsKKworCQkJb3JpZyA9IGRhdGEgPSBSUkVHMzIoRE1BX0NMS19DVFJM ICsgb2Zmc2V0KTsKKwkJCWRhdGEgPSAweGZmMDAwMDAwOworCQkJaWYgKGRhdGEgIT0gb3JpZykK KwkJCQlXUkVHMzIoRE1BX0NMS19DVFJMICsgb2Zmc2V0LCBkYXRhKTsKKwkJfQorCX0KKworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IHNpX2RtYV9zZXRfcG93ZXJnYXRpbmdfc3RhdGUodm9p ZCAqaGFuZGxlLAorCQkJCQkgIGVudW0gYW1kX3Bvd2VyZ2F0aW5nX3N0YXRlIHN0YXRlKQorewor CXUzMiB0bXA7CisKKwlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqKWhhbmRsZTsKKworCVdSRUczMihETUFfUEdGU01fV1JJVEUsICAweDAwMDAyMDAw KTsKKwlXUkVHMzIoRE1BX1BHRlNNX0NPTkZJRywgMHgxMDAwMTBmZik7CisKKwlmb3IgKHRtcCA9 IDA7IHRtcCA8IDU7IHRtcCsrKQorCQlXUkVHMzIoRE1BX1BHRlNNX1dSSVRFLCAwKTsKKworCXJl dHVybiAwOworfQorCitjb25zdCBzdHJ1Y3QgYW1kX2lwX2Z1bmNzIHNpX2RtYV9pcF9mdW5jcyA9 IHsKKwkubmFtZSA9ICJzaV9kbWEiLAorCS5lYXJseV9pbml0ID0gc2lfZG1hX2Vhcmx5X2luaXQs CisJLmxhdGVfaW5pdCA9IE5VTEwsCisJLnN3X2luaXQgPSBzaV9kbWFfc3dfaW5pdCwKKwkuc3df ZmluaSA9IHNpX2RtYV9zd19maW5pLAorCS5od19pbml0ID0gc2lfZG1hX2h3X2luaXQsCisJLmh3 X2ZpbmkgPSBzaV9kbWFfaHdfZmluaSwKKwkuc3VzcGVuZCA9IHNpX2RtYV9zdXNwZW5kLAorCS5y ZXN1bWUgPSBzaV9kbWFfcmVzdW1lLAorCS5pc19pZGxlID0gc2lfZG1hX2lzX2lkbGUsCisJLndh aXRfZm9yX2lkbGUgPSBzaV9kbWFfd2FpdF9mb3JfaWRsZSwKKwkuc29mdF9yZXNldCA9IHNpX2Rt YV9zb2Z0X3Jlc2V0LAorCS5zZXRfY2xvY2tnYXRpbmdfc3RhdGUgPSBzaV9kbWFfc2V0X2Nsb2Nr Z2F0aW5nX3N0YXRlLAorCS5zZXRfcG93ZXJnYXRpbmdfc3RhdGUgPSBzaV9kbWFfc2V0X3Bvd2Vy Z2F0aW5nX3N0YXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhbWRncHVfcmluZ19mdW5j cyBzaV9kbWFfcmluZ19mdW5jcyA9IHsKKwkuZ2V0X3JwdHIgPSBzaV9kbWFfcmluZ19nZXRfcnB0 ciwKKwkuZ2V0X3dwdHIgPSBzaV9kbWFfcmluZ19nZXRfd3B0ciwKKwkuc2V0X3dwdHIgPSBzaV9k bWFfcmluZ19zZXRfd3B0ciwKKwkucGFyc2VfY3MgPSBOVUxMLAorCS5lbWl0X2liID0gc2lfZG1h X3JpbmdfZW1pdF9pYiwKKwkuZW1pdF9mZW5jZSA9IHNpX2RtYV9yaW5nX2VtaXRfZmVuY2UsCisJ LmVtaXRfcGlwZWxpbmVfc3luYyA9IHNpX2RtYV9yaW5nX2VtaXRfcGlwZWxpbmVfc3luYywKKwku ZW1pdF92bV9mbHVzaCA9IHNpX2RtYV9yaW5nX2VtaXRfdm1fZmx1c2gsCisJLmVtaXRfaGRwX2Zs dXNoID0gc2lfZG1hX3JpbmdfZW1pdF9oZHBfZmx1c2gsCisJLmVtaXRfaGRwX2ludmFsaWRhdGUg PSBzaV9kbWFfcmluZ19lbWl0X2hkcF9pbnZhbGlkYXRlLAorCS50ZXN0X3JpbmcgPSBzaV9kbWFf cmluZ190ZXN0X3JpbmcsCisJLnRlc3RfaWIgPSBzaV9kbWFfcmluZ190ZXN0X2liLAorCS5pbnNl cnRfbm9wID0gYW1kZ3B1X3JpbmdfaW5zZXJ0X25vcCwKKwkucGFkX2liID0gc2lfZG1hX3Jpbmdf cGFkX2liLAorfTsKKworc3RhdGljIHZvaWQgc2lfZG1hX3NldF9yaW5nX2Z1bmNzKHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGFkZXYt PnNkbWEubnVtX2luc3RhbmNlczsgaSsrKQorCQlhZGV2LT5zZG1hLmluc3RhbmNlW2ldLnJpbmcu ZnVuY3MgPSAmc2lfZG1hX3JpbmdfZnVuY3M7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYW1k Z3B1X2lycV9zcmNfZnVuY3Mgc2lfZG1hX3RyYXBfaXJxX2Z1bmNzID0geworCS5zZXQgPSBzaV9k bWFfc2V0X3RyYXBfaXJxX3N0YXRlLAorCS5wcm9jZXNzID0gc2lfZG1hX3Byb2Nlc3NfdHJhcF9p cnEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZGdwdV9pcnFfc3JjX2Z1bmNzIHNpX2Rt YV90cmFwX2lycV9mdW5jc18xID0geworCS5zZXQgPSBzaV9kbWFfc2V0X3RyYXBfaXJxX3N0YXRl LAorCS5wcm9jZXNzID0gc2lfZG1hX3Byb2Nlc3NfdHJhcF9pcnFfMSwKK307CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgYW1kZ3B1X2lycV9zcmNfZnVuY3Mgc2lfZG1hX2lsbGVnYWxfaW5zdF9pcnFf ZnVuY3MgPSB7CisJLnByb2Nlc3MgPSBzaV9kbWFfcHJvY2Vzc19pbGxlZ2FsX2luc3RfaXJxLAor fTsKKworc3RhdGljIHZvaWQgc2lfZG1hX3NldF9pcnFfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYpCit7CisJYWRldi0+c2RtYS50cmFwX2lycS5udW1fdHlwZXMgPSBBTURHUFVfU0RN QV9JUlFfTEFTVDsKKwlhZGV2LT5zZG1hLnRyYXBfaXJxLmZ1bmNzID0gJnNpX2RtYV90cmFwX2ly cV9mdW5jczsKKwlhZGV2LT5zZG1hLnRyYXBfaXJxXzEuZnVuY3MgPSAmc2lfZG1hX3RyYXBfaXJx X2Z1bmNzXzE7CisJYWRldi0+c2RtYS5pbGxlZ2FsX2luc3RfaXJxLmZ1bmNzID0gJnNpX2RtYV9p bGxlZ2FsX2luc3RfaXJxX2Z1bmNzOworfQorCisvKioKKyAqIHNpX2RtYV9lbWl0X2NvcHlfYnVm ZmVyIC0gY29weSBidWZmZXIgdXNpbmcgdGhlIHNETUEgZW5naW5lCisgKgorICogQHJpbmc6IGFt ZGdwdV9yaW5nIHN0cnVjdHVyZSBob2xkaW5nIHJpbmcgaW5mb3JtYXRpb24KKyAqIEBzcmNfb2Zm c2V0OiBzcmMgR1BVIGFkZHJlc3MKKyAqIEBkc3Rfb2Zmc2V0OiBkc3QgR1BVIGFkZHJlc3MKKyAq IEBieXRlX2NvdW50OiBudW1iZXIgb2YgYnl0ZXMgdG8geGZlcgorICoKKyAqIENvcHkgR1BVIGJ1 ZmZlcnMgdXNpbmcgdGhlIERNQSBlbmdpbmUgKFZJKS4KKyAqIFVzZWQgYnkgdGhlIGFtZGdwdSB0 dG0gaW1wbGVtZW50YXRpb24gdG8gbW92ZSBwYWdlcyBpZgorICogcmVnaXN0ZXJlZCBhcyB0aGUg YXNpYyBjb3B5IGNhbGxiYWNrLgorICovCitzdGF0aWMgdm9pZCBzaV9kbWFfZW1pdF9jb3B5X2J1 ZmZlcihzdHJ1Y3QgYW1kZ3B1X2liICppYiwKKwkJCQkgICAgICAgdWludDY0X3Qgc3JjX29mZnNl dCwKKwkJCQkgICAgICAgdWludDY0X3QgZHN0X29mZnNldCwKKwkJCQkgICAgICAgdWludDMyX3Qg Y291bnQpCit7CisJd2hpbGUgKGNvdW50KSB7CisJCXVuc2lnbmVkIGJ5dGVzID0gY291bnQgKiA4 OworCQlpZiAoYnl0ZXMgPiAweEZGRkY4KQorCQkJYnl0ZXMgPSAweEZGRkY4OworCisJCWliLT5w dHJbaWItPmxlbmd0aF9kdysrXSA9IERNQV9QQUNLRVQoRE1BX1BBQ0tFVF9DT1BZLAorCQkJCQkJ ICAgICAgMSwgMCwgMCwgYnl0ZXMpOworCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBsb3dl cl8zMl9iaXRzKGRzdF9vZmZzZXQpOworCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSBsb3dl cl8zMl9iaXRzKHNyY19vZmZzZXQpOworCQlpYi0+cHRyW2liLT5sZW5ndGhfZHcrK10gPSB1cHBl cl8zMl9iaXRzKGRzdF9vZmZzZXQpICYgMHhmZjsKKwkJaWItPnB0cltpYi0+bGVuZ3RoX2R3Kytd ID0gdXBwZXJfMzJfYml0cyhzcmNfb2Zmc2V0KSAmIDB4ZmY7CisKKwkJZHN0X29mZnNldCArPSBi eXRlczsKKwkJc3JjX29mZnNldCArPSBieXRlczsKKwkJY291bnQgLT0gYnl0ZXMgLyA4OworCX0K KworfQorCisvKioKKyAqIHNpX2RtYV9lbWl0X2ZpbGxfYnVmZmVyIC0gZmlsbCBidWZmZXIgdXNp bmcgdGhlIHNETUEgZW5naW5lCisgKgorICogQHJpbmc6IGFtZGdwdV9yaW5nIHN0cnVjdHVyZSBo b2xkaW5nIHJpbmcgaW5mb3JtYXRpb24KKyAqIEBzcmNfZGF0YTogdmFsdWUgdG8gd3JpdGUgdG8g YnVmZmVyCisgKiBAZHN0X29mZnNldDogZHN0IEdQVSBhZGRyZXNzCisgKiBAYnl0ZV9jb3VudDog bnVtYmVyIG9mIGJ5dGVzIHRvIHhmZXIKKyAqCisgKiBGaWxsIEdQVSBidWZmZXJzIHVzaW5nIHRo ZSBETUEgZW5naW5lIChWSSkuCisgKi8KK3N0YXRpYyB2b2lkIHNpX2RtYV9lbWl0X2ZpbGxfYnVm ZmVyKHN0cnVjdCBhbWRncHVfaWIgKmliLAorCQkJCSAgICAgICB1aW50MzJfdCBzcmNfZGF0YSwK KwkJCQkgICAgICAgdWludDY0X3QgZHN0X29mZnNldCwKKwkJCQkgICAgICAgdWludDMyX3QgYnl0 ZV9jb3VudCkKK3sKKwlEUk1fSU5GTygiZG1hX2VtaXRfZmlsbF9idWZmZXItLS1ub3QgaW1wbGVt ZW50ZWQhISEhISEhXG4iKTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZGdwdV9idWZm ZXJfZnVuY3Mgc2lfZG1hX2J1ZmZlcl9mdW5jcyA9IHsKKwkuY29weV9tYXhfYnl0ZXMgPSAweGZm ZmY4LAorCS5jb3B5X251bV9kdyA9IDcsCisJLmVtaXRfY29weV9idWZmZXIgPSBzaV9kbWFfZW1p dF9jb3B5X2J1ZmZlciwKKworCS5maWxsX21heF9ieXRlcyA9IDAsCisJLmZpbGxfbnVtX2R3ID0g MCwKKwkuZW1pdF9maWxsX2J1ZmZlciA9IHNpX2RtYV9lbWl0X2ZpbGxfYnVmZmVyLAorfTsKKwor c3RhdGljIHZvaWQgc2lfZG1hX3NldF9idWZmZXJfZnVuY3Moc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYpCit7CisJaWYgKGFkZXYtPm1tYW4uYnVmZmVyX2Z1bmNzID09IE5VTEwpIHsKKwkJYWRl di0+bW1hbi5idWZmZXJfZnVuY3MgPSAmc2lfZG1hX2J1ZmZlcl9mdW5jczsKKwkJYWRldi0+bW1h bi5idWZmZXJfZnVuY3NfcmluZyA9ICZhZGV2LT5zZG1hLmluc3RhbmNlWzBdLnJpbmc7CisJfQor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFtZGdwdV92bV9wdGVfZnVuY3Mgc2lfZG1hX3ZtX3B0 ZV9mdW5jcyA9IHsKKwkuY29weV9wdGUgPSBzaV9kbWFfdm1fY29weV9wdGUsCisJLndyaXRlX3B0 ZSA9IHNpX2RtYV92bV93cml0ZV9wdGUsCisJLnNldF9wdGVfcGRlID0gc2lfZG1hX3ZtX3NldF9w dGVfcGRlLAorfTsKKworc3RhdGljIHZvaWQgc2lfZG1hX3NldF92bV9wdGVfZnVuY3Moc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChhZGV2LT52bV9t YW5hZ2VyLnZtX3B0ZV9mdW5jcyA9PSBOVUxMKSB7CisJCWFkZXYtPnZtX21hbmFnZXIudm1fcHRl X2Z1bmNzID0gJnNpX2RtYV92bV9wdGVfZnVuY3M7CisJCWZvciAoaSA9IDA7IGkgPCBhZGV2LT5z ZG1hLm51bV9pbnN0YW5jZXM7IGkrKykKKwkJCWFkZXYtPnZtX21hbmFnZXIudm1fcHRlX3Jpbmdz W2ldID0KKwkJCQkmYWRldi0+c2RtYS5pbnN0YW5jZVtpXS5yaW5nOworCisJCWFkZXYtPnZtX21h bmFnZXIudm1fcHRlX251bV9yaW5ncyA9IGFkZXYtPnNkbWEubnVtX2luc3RhbmNlczsKKwl9Cit9 CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9zaV9kbWEuaCBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvYW1kZ3B1L3NpX2RtYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjNhM2UwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9zaV9kbWEuaApAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUg QWR2YW5jZWQgTWljcm8gRGV2aWNlcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5 IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBj b3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAo dGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0 cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1 c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2Us CisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBl cnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3Vi amVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHly aWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQg aW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJl LgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJB TlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5P VCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBF VkVOVCBTSEFMTAorICogVEhFIENPUFlSSUdIVCBIT0xERVIoUykgT1IgQVVUSE9SKFMpIEJFIExJ QUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJ TkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhF IFVTRSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisj aWZuZGVmIF9fU0lfRE1BX0hfXworI2RlZmluZSBfX1NJX0RNQV9IX18KKworZXh0ZXJuIGNvbnN0 IHN0cnVjdCBhbWRfaXBfZnVuY3Mgc2lfZG1hX2lwX2Z1bmNzOworCisjZW5kaWYKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9hc2ljX3JlZy9zaS9zaWQuaCBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvaW5jbHVkZS9hc2ljX3JlZy9zaS9zaWQuaAppbmRleCAxZThlN2I1Li5m NDc3NGU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2luY2x1ZGUvYXNpY19yZWcv c2kvc2lkLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9pbmNsdWRlL2FzaWNfcmVnL3NpL3Np ZC5oCkBAIC02NDIsNiArNjQyLDggQEAKICNkZWZpbmUJSERQX05PTlNVUkZBQ0VfSU5GTwkJCQkw eEIwMgogI2RlZmluZQlIRFBfTk9OU1VSRkFDRV9TSVpFCQkJCTB4QjAzCiAKKyNkZWZpbmUgSERQ X0RFQlVHMCAgCQkJCQkweEJDQworCiAjZGVmaW5lIEhEUF9BRERSX0NPTkZJRyAgCQkJCTB4QkQy CiAjZGVmaW5lIEhEUF9NSVNDX0NOVEwJCQkJCTB4QkQzCiAjZGVmaW5lIAlIRFBfRkxVU0hfSU5W QUxJREFURV9DQUNIRQkJCSgxIDw8IDApCi0tIAoyLjUuNQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21h aWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==