From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,2/2] usb: misc: xapea00x: perform platform initialization of TPM From: "David R. Bild" Message-Id: <20180504130022.5231-3-david.bild@xaptum.com> Date: Fri, 4 May 2018 08:00:22 -0500 To: Greg Kroah-Hartman , Peter Huewe , Jarkko Sakkinen Cc: linux-usb@vger.kernel.org, linux-integrity@vger.kernel.org, "David R. Bild" List-ID: Tm9ybWFsbHkgdGhlIHN5c3RlbSBwbGF0Zm9ybSAoaS5lLiwgQklPUy9VRUZJIGZvciB4ODYpIGlz IHJlc3BvbnNpYmxlCmZvciBwZXJmb3JtaW5nIGluaXRpYWxpemF0aW9uIG9mIHRoZSBUUE0uICBG b3IgdGhlc2UgbW9kdWxlcywgdGhlIGhvc3QKa2VybmVsIGlzIHRoZSBwbGF0Zm9ybSwgc28gd2Ug cGVyZm9ybSB0aGUgaW5pdGlhbGl6YXRpb24gaW4gdGhlIGRyaXZlcgpiZWZvcmUgcmVnaXN0ZXJp bmcgdGhlIFRQTSB3aXRoIHRoZSBrZXJuZWwgVFBNIHN1YnN5c3RlbS4KClRoZSBpbml0aWFsaXph dGlvbiBjb25zaXN0cyBvZiBpc3N1aW5nIHRoZSBUUE0gc3RhcnR1cCBjb21tYW5kLApydW5uaW5n IHRoZSBUUE0gc2VsZi10ZXN0LCBhbmQgc2V0dGluZyB0aGUgVFBNIHBsYXRmb3JtIGhpZXJhcmNo eQphdXRob3JpemF0aW9uIHRvIGEgcmFuZG9tLCB1bnNhdmVkIHZhbHVlIHNvIHRoYXQgaXQgY2Fu IG5ldmVyIGJlIHVzZWQKYWZ0ZXIgdGhlIGRyaXZlciBoYXMgbG9hZGVkLgoKU2lnbmVkLW9mZi1i eTogRGF2aWQgUi4gQmlsZCA8ZGF2aWQuYmlsZEB4YXB0dW0uY29tPgotLS0KIGRyaXZlcnMvdXNi L21pc2MveGFwZWEwMHgvTWFrZWZpbGUgICAgICAgIHwgICAzICstCiBkcml2ZXJzL3VzYi9taXNj L3hhcGVhMDB4L3hhcGVhMDB4LWNvcmUuYyB8ICAyNSArCiBkcml2ZXJzL3VzYi9taXNjL3hhcGVh MDB4L3hhcGVhMDB4LXRwbS5jICB8IDk1MiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK IDMgZmlsZXMgY2hhbmdlZCwgOTc5IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9taXNjL3hhcGVhMDB4L3hhcGVhMDB4LXRwbS5jCgpk aWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvbWlzYy94YXBlYTAweC9NYWtlZmlsZSBiL2RyaXZlcnMv dXNiL21pc2MveGFwZWEwMHgvTWFrZWZpbGUKaW5kZXggYzRiY2Q3NTI0YzMxLi5hYTNmODgwM2Nk ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MveGFwZWEwMHgvTWFrZWZpbGUKKysrIGIv ZHJpdmVycy91c2IvbWlzYy94YXBlYTAweC9NYWtlZmlsZQpAQCAtNCw0ICs0LDUgQEAKICMKIG9i ai0kKENPTkZJR19VU0JfWEFQRUEwMFgpICs9IHhhcGVhMDB4Lm8KIAoteGFwZWEwMHgteSArPSB4 YXBlYTAweC1jb3JlLm8geGFwZWEwMHgtYnJpZGdlLm8KK3hhcGVhMDB4LXkgKz0geGFwZWEwMHgt Y29yZS5vIHhhcGVhMDB4LWJyaWRnZS5vIHhhcGVhMDB4LXRwbS5vCisKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL21pc2MveGFwZWEwMHgveGFwZWEwMHgtY29yZS5jIGIvZHJpdmVycy91c2IvbWlz Yy94YXBlYTAweC94YXBlYTAweC1jb3JlLmMKaW5kZXggODg1YmNkYTljMDFkLi41M2U4MmY4YjM4 ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL21pc2MveGFwZWEwMHgveGFwZWEwMHgtY29yZS5j CisrKyBiL2RyaXZlcnMvdXNiL21pc2MveGFwZWEwMHgveGFwZWEwMHgtY29yZS5jCkBAIC0yODAs NiArMjgwLDMxIEBAIHN0YXRpYyB2b2lkIHhhcGVhMDB4X3RwbV9wcm9iZShzdHJ1Y3Qgd29ya19z dHJ1Y3QgKndvcmspCiAJc3RydWN0IHNwaV9kZXZpY2UgKnRwbTsKIAlpbnQgcmV0dmFsOwogCisJ bXV0ZXhfbG9jaygmZGV2LT51c2JfbXV0ZXgpOworCWlmICghZGV2LT5pbnRlcmZhY2UpIHsKKwkJ cmV0dmFsID0gLUVOT0RFVjsKKwkJZ290byBvdXQ7CisJfQorCS8qCisJICogVGhpcyBkcml2ZXIg aXMgdGhlICJwbGF0Zm9ybSIgaW4gVFBNIHRlcm1pbm9sb2d5LiBCZWZvcmUKKwkgKiBwYXNzaW5n IGNvbnRyb2wgb2YgdGhlIFRQTSB0byB0aGUgTGludXggVFBNIHN1YnN5c3RlbSwgZG8KKwkgKiB0 aGUgVFBNIGluaXRpYWxpemF0aW9uIG5vcm1hbGx5IGRvbmUgYnkgdGhlIHBsYXRmb3JtIGNvZGUK KwkgKiAoZS5nLiwgQklPUykuCisJICovCisJcmV0dmFsID0geGFwZWEwMHhfdHBtX3BsYXRmb3Jt X2luaXRpYWxpemUoZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmRldi0+aW50ZXJm YWNlLT5kZXYsCisJCQkidW5hYmxlIHRvIGRvIFRQTSBwbGF0Zm9ybSBpbml0aWFsaXphdGlvbjog JWRcbiIsCisJCQlyZXR2YWwpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIE5vdyByZWdp c3RlciB0aGUgVFBNIHdpdGggdGhlIExpbnV4IFRQTSBzdWJzeXN0ZW0uICBUaGlzCisJICogbWF5 IGNhbGwgdGhyb3VnaCB0byB4YXBlYTAweF9zcGlfdHJhbnNmZXJfb25lX21lc3NhZ2UoKSwgc28K KwkgKiBkb24ndCBob2xkIHVzYl9tdXRleCBoZXJlLgorCSAqLworCW11dGV4X3VubG9jaygmZGV2 LT51c2JfbXV0ZXgpOwogCXRwbSA9IHNwaV9uZXdfZGV2aWNlKHNwaV9tYXN0ZXIsICZ0cG1fYm9h cmRfaW5mbyk7CiAJbXV0ZXhfbG9jaygmZGV2LT51c2JfbXV0ZXgpOwogCWlmICghZGV2LT5pbnRl cmZhY2UpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL21pc2MveGFwZWEwMHgveGFwZWEwMHgt dHBtLmMgYi9kcml2ZXJzL3VzYi9taXNjL3hhcGVhMDB4L3hhcGVhMDB4LXRwbS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMjcxNTkwNDNjZTNjCi0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy91c2IvbWlzYy94YXBlYTAweC94YXBlYTAweC10cG0uYwpAQCAtMCww ICsxLDk1MiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICog IERyaXZlciBmb3IgdGhlIFhBUC1FQS0wMHggc2VyaWVzIG9mIHRoZSBYYXB0dW0gRWRnZSBBY2Nl c3MgQ2FyZCwgYQorICogIFRQTSAyLjAtYmFzZWQgaGFyZHdhcmUgbW9kdWxlIGZvciBhdXRoZW50 aWNhdGluZyBJb1QgZGV2aWNlcyBhbmQKKyAqICBnYXRld2F5cy4KKyAqCisgKiAgQ29weXJpZ2h0 IChjKSAyMDE3LTIwMTggWGFwdHVtLCBJbmMuCisgKi8KKworI2luY2x1ZGUgInhhcGVhMDB4Lmgi CisKKyNkZWZpbmUgVFBNX1JFVFJZCQkJNTAKKyNkZWZpbmUgVFBNX1RJTUVPVVQJCQk1ICAgIC8v IG1zZWNzCisjZGVmaW5lIFRQTV9USU1FT1VUX1JBTkdFX1VTCQkzMDAgIC8vIHVzZWNzCisKKyNk ZWZpbmUgVElTX1NIT1JUX1RJTUVPVVQJCTc1MCAgLy8gbXNlY3MKKyNkZWZpbmUgVElTX0xPTkdf VElNRU9VVAkJMjAwMCAvLyBtc2VjcworCisjZGVmaW5lIFRJU19NQVhfQlVGCQkJMTAyNCAvLyBi eXRlCisjZGVmaW5lIFRJU19IRUFERVJfTEVOCQkJMTAgICAvLyBieXRlCisKKyNkZWZpbmUgVFBN Ml9USU1FT1VUX0EJCQk3NTAgIC8vIG1zZWNzCisjZGVmaW5lIFRQTTJfVElNRU9VVF9CCQkJMjAw MCAvLyBtc2VjcworI2RlZmluZSBUUE0yX1RJTUVPVVRfQwkJCTIwMCAgLy8gbXNlY3MKKyNkZWZp bmUgVFBNMl9USU1FT1VUX0QJCQkzMCAgIC8vIG1zZWNzCisKKyNkZWZpbmUgVFBNX0FDQ0VTU18w CQkJMHgwMDAwCisjZGVmaW5lIFRQTV9TVFNfMAkJCTB4MDAxOAorI2RlZmluZSBUUE1fREFUQV9G SUZPXzAJCTB4MDAyNAorCisjZGVmaW5lIFRQTTJfU1RfTk9fU0VTU0lPTlMJCTB4ODAwMQorI2Rl ZmluZSBUUE0yX1NUX1NFU1NJT05TCQkweDgwMDIKKworI2RlZmluZSBUUE0yX0NDX1NUQVJUVVAJ CTB4MDE0NAorI2RlZmluZSBUUE0yX0NDX1NIVVRET1dOCQkweDAxNDUKKyNkZWZpbmUgVFBNMl9D Q19TRUxGX1RFU1QJCTB4MDE0MworI2RlZmluZSBUUE0yX0NDX0dFVF9SQU5ET00JCTB4MDE3Qgor I2RlZmluZSBUUE0yX0NDX0hJRVJBUkNIWV9DSEFOR0VfQVVUSAkweDAxMjkKKyNkZWZpbmUgVFBN Ml9DQ19ESUNUX0FUVEFDS19MT0NLX1JTVAkweDAxMzkKKworI2RlZmluZSBUUE1fUkNfU1VDQ0VT UwkJCTB4MDAwCisjZGVmaW5lIFRQTV9SQ19JTklUSUFMSVpFCQkweDEwMAorCitlbnVtIHRpc19h Y2Nlc3MgeworCVRQTV9BQ0NFU1NfVkFMSUQJCT0gMHg4MCwKKwlUUE1fQUNDRVNTX0FDVElWRV9M T0NBTElUWQk9IDB4MjAsCisJVFBNX0FDQ0VTU19SRVFVRVNUX1BFTkRJTkcJPSAweDA0LAorCVRQ TV9BQ0NFU1NfUkVRVUVTVF9VU0UJCT0gMHgwMgorfTsKKworZW51bSB0aXNfc3RhdHVzIHsKKwlU UE1fU1RTX1ZBTElECQk9IDB4ODAsCisJVFBNX1NUU19DT01NQU5EX1JFQURZCT0gMHg0MCwKKwlU UE1fU1RTX0dPCQk9IDB4MjAsCisJVFBNX1NUU19EQVRBX0FWQUlMCT0gMHgxMCwKKwlUUE1fU1RT X0RBVEFfRVhQRUNUCT0gMHgwOCwKKwlUUE1fU1RTX1NFTEZfVEVTVF9ET05FCT0gMHgwNCwKKwlU UE1fU1RTX1JFU1BPTlNFX1JFVFJZCT0gMHgwMgorfTsKKworc3RydWN0IHRwbV90aXNfY29tbWFu ZCB7CisJX19iZTE2IHRhZzsKKwlfX2JlMzIgc2l6ZTsKKwlfX2JlMzIgY29kZTsKKwkgICAgdTgg Ym9keVswXTsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOworCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgorICogVFBNIFRJUyBmdW5jdGlvbnMKKyAqLworCisvKioKKyAqIHhhcGVhMDB4 X3RwbV9tc2xlZXAgLSBzbGVlcCBmb3IgYXQgbGVhc3QgdGhlIHNwZWNpZmllZCB0aW1lLgorICog QG1zZWNzOiBtaW5pbXVtIGR1cmF0aW9uIHRvIHNsZWVwIGZvciBpbiBtaWxsaXNlY29uZHMKKyAq Lworc3RhdGljIHZvaWQgeGFwZWEwMHhfdHBtX21zbGVlcChpbnQgbXNlY3MpCit7CisJdXNsZWVw X3JhbmdlKG1zZWNzICogMTAwMCwKKwkJICAgICBtc2VjcyAqIDEwMDAgKyBUUE1fVElNRU9VVF9S QU5HRV9VUyk7Cit9CisKKy8qKgorICogeGFwZWEwMHhfdHBtX3RyYW5zZmVyIC0gZXhlY3V0ZSBh biBTUEkgdHJhbnNmZXIuCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqIEBhZGRy OiB0aGUgVFBNIFRJUyByZWdpc3RlciBhZGRyZXNzCisgKiBAaW46IGlmIGEgd3JpdGUgb3Igd3Jp dGVfcmVhZCB0cmFuc2ZlciwgdGhlIGRhdGEgdG8gd3JpdGUKKyAqIEBvdXQ6IGlmIGEgcmVhZCBv ciB3cml0ZV9yZWFkICB0cmFuc2ZlciwgdGhlIGJ1ZmZlciB0byByZWFkIGRhdGEgaW50bworICog QGxlbjogdGhlIG51bWJlciBvZiBieXRlcyB0byB0cmFuc2ZlcgorICoKKyAqIENvbnRleHQ6ICFp bl9pbnRlcnJ1cHQoKQorICoKKyAqIFJldHVybjogSWYgc3VjY2Vzc2Z1bCwgMC4gT3RoZXJ3aXNl IGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGludCB4YXBlYTAweF90cG1fdHJh bnNmZXIoc3RydWN0IHhhcGVhMDB4X2RldmljZSAqZGV2LAorCQkJCSB1MzIgYWRkciwgdTggKmlu LCB1OCAqb3V0LCB1MTYgbGVuKQoreworCXU4IGhlYWRlcls0XTsKKwlpbnQgaSwgcmV0dmFsOwor CisJaGVhZGVyWzBdID0gKGluID8gMHg4MCA6IDB4MDApIHwgKGxlbiAtIDEpOworCWhlYWRlclsx XSA9IDB4ZDQ7CisJaGVhZGVyWzJdID0gYWRkciA+PiA4OworCWhlYWRlclszXSA9IGFkZHI7CisK KwlyZXR2YWwgPSB4YXBlYTAweF9zcGlfdHJhbnNmZXIoZGV2LCBoZWFkZXIsIGhlYWRlciwgNCwg MSwgMCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwkvKiBoYW5kbGUgU1BJIHdhaXQg c3RhdGVzICovCisJaWYgKChoZWFkZXJbM10gJiAweDAxKSA9PSAweDAwKSB7CisJCWhlYWRlclsw XSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IFRQTV9SRVRSWTsgaSsrKSB7CisJCQlyZXR2YWwg PSB4YXBlYTAweF9zcGlfdHJhbnNmZXIoZGV2LCBoZWFkZXIsIGhlYWRlciwgMSwKKwkJCQkJCSAg ICAgICAxLCAwKTsKKwkJCWlmIChyZXR2YWwpCisJCQkJZ290byBvdXQ7CisJCQlpZiAoKGhlYWRl clswXSAmIDB4MDEpID09IDAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGkgPT0gVFBNX1JF VFJZKSB7CisJCQlyZXR2YWwgPSAtRVRJTUVET1VUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisK KwlyZXR2YWwgPSB4YXBlYTAweF9zcGlfdHJhbnNmZXIoZGV2LCBvdXQsIGluLCBsZW4sIDAsIDAp OworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30K KworLyoqCisgKiB4YXBlYTAweF90cG1fcmVhZF9ieXRlcyAtIHJlYWQgZGF0YSBmcm9tIHRoZSBU UE0KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRldmljZQorICogQGFkZHI6IHRoZSByZWdpc3Rl ciB0byByZWFkIGZyb20KKyAqIEByZXN1bHQ6IGJ1ZmZlciB0byBpbiB3aGljaCB0byBwbGFjZSB0 aGUgcmVhZCBkYXRhCisgKiBAbGVuOiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKKyAqCisg KiBDb250ZXh0OiAhaW5faW50ZXJydXB0KCkKKyAqCisgKiBSZXR1cm46IElmIHN1Y2Nlc3NmdWws IDAuIE90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgeGFw ZWEwMHhfdHBtX3JlYWRfYnl0ZXMoc3RydWN0IHhhcGVhMDB4X2RldmljZSAqZGV2LCB1MzIgYWRk ciwKKwkJCQkgICB2b2lkICpyZXN1bHQsIHUxNiBsZW4pCit7CisJcmV0dXJuIHhhcGVhMDB4X3Rw bV90cmFuc2ZlcihkZXYsIGFkZHIsIHJlc3VsdCwgTlVMTCwgbGVuKTsKK30KKworLyoqCisgKiB4 YXBlYTAweF90cG1fd3JpdGVfYnl0ZXMgLSB3cml0ZSBkYXRhIGZyb20gdGhlIFRQTQorICogQGRl djogcG9pbnRlciB0byB0aGUgZGV2aWNlCisgKiBAYWRkcjogdGhlIHJlZ2lzdGVyIHRvIHdyaXRl IHRvCisgKiBAZGF0YTogcG9pbnRlciB0byB0aGUgZGF0YSB0byB3cml0ZQorICogQGxlbjogdGhl IG51bWJlciBvZiBieXRlcyB0byByZWFkCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgp CisgKgorICogUmV0dXJuOiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBl cnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV93cml0ZV9ieXRlcyhzdHJ1 Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYsIHUzMiBhZGRyLAorCQkJCSAgICB2b2lkICpkYXRhLCB1 MTYgbGVuKQoreworCXJldHVybiB4YXBlYTAweF90cG1fdHJhbnNmZXIoZGV2LCBhZGRyLCBOVUxM LCBkYXRhLCBsZW4pOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV9yZWFkOCAtIHJlYWQgb25l IGJ5dGUgb2YgZGF0YSBmcm9tIHRoZSBUUE0KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRldmlj ZQorICogQGFkZHI6IHRoZSByZWdpc3RlciB0byByZWFkIGZyb20KKyAqIEByZXN1bHQ6IHBvaW50 ZXIgdG8gdGhlIGRlc3RpbmF0aW9uCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisg KgorICogUmV0dXJuOiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJv ciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV9yZWFkOChzdHJ1Y3QgeGFwZWEw MHhfZGV2aWNlICpkZXYsIHUzMiBhZGRyLCB1OCAqcmVzdWx0KQoreworCXJldHVybiB4YXBlYTAw eF90cG1fcmVhZF9ieXRlcyhkZXYsIGFkZHIsIHJlc3VsdCwgMSk7Cit9CisKKy8qKgorICogeGFw ZWEwMHhfdHBtX3dyaXRlOCAtIHdyaXRlIG9uZSBieXRlIG9mIGRhdGEgdG8gdGhlIFRQTQorICog QGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlCisgKiBAYWRkcjogdGhlIHJlZ2lzdGVyIHRvIHdy aXRlIHRvCisgKiBAZGF0YTogIHRoZSBieXRlIHRvIHdyaXRlCisgKgorICogQ29udGV4dDogIWlu X2ludGVycnVwdCgpCisgKgorICogUmV0dXJuOiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2Ug YSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV93cml0 ZTgoc3RydWN0IHhhcGVhMDB4X2RldmljZSAqZGV2LCB1MzIgYWRkciwgdTggZGF0YSkKK3sKKwly ZXR1cm4geGFwZWEwMHhfdHBtX3dyaXRlX2J5dGVzKGRldiwgYWRkciwgJmRhdGEsIDEpOworfQor CisvKioKKyAqIHhhcGVhMDB4X3RwbV9yZWFkMzIgLSByZWFkIG9uZSBpbnRlZ2VyIG9mIGRhdGEg ZnJvbSB0aGUgVFBNCisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqIEBhZGRyOiB0 aGUgcmVnaXN0ZXIgdG8gcmVhZCBmcm9tCisgKiBAcmVzdWx0OiBwb2ludGVyIHRvIHRoZSBkZXN0 aW5hdGlvbgorICoKKyAqIFRoZSBtZXRob2QgcGVyZm9ybXMgYW55IHJlcXVpcmVkIGVuZGlhbm5l c3MgY29udmVyc2lvbiBvbiB0aGUKKyAqIHJlc3VsdC4KKyAqCisgKiBDb250ZXh0OiAhaW5faW50 ZXJydXB0KCkKKyAqCisgKiBSZXR1cm46IElmIHN1Y2Nlc3NmdWwsIDAuIE90aGVyd2lzZSBhIG5l Z2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgeGFwZWEwMHhfdHBtX3JlYWQzMihz dHJ1Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYsIHUzMiBhZGRyLAorCQkJICAgICAgIHUzMiAqcmVz dWx0KQoreworCV9fbGUzMiByZXN1bHRfbGU7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHhh cGVhMDB4X3RwbV9yZWFkX2J5dGVzKGRldiwgYWRkciwgJnJlc3VsdF9sZSwKKwkJCQkJIHNpemVv ZihyZXN1bHRfbGUpKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCSpyZXN1bHQgPSBf X2xlMzJfdG9fY3B1KHJlc3VsdF9sZSk7CisJcmV0dmFsID0gMDsKKworb3V0OgorCXJldHVybiBy ZXR2YWw7Cit9CisKKy8qKgorICogeGFwZWEwMHhfdHBtX3dyaXRlMzIgLSB3cml0ZSBvbmUgaW50 ZWdlciBvZiBkYXRhIHRvIHRoZSBUUE0KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRldmljZQor ICogQGFkZHI6IHRoZSByZWdpc3RlciB0byByZWFkIGZyb20KKyAqIEBkYXRhOiB0aGUgaW50ZWdl ciB0byB3cml0ZQorICoKKyAqIFRoZSBtZXRob2QgcGVyZm9ybXMgYW55IHJlcXVpcmVkIGVuZGlh bm5lc3MgY29udmVyc2lvbiBvbiB0aGUKKyAqIGRhdGEuCisgKgorICogQ29udGV4dDogIWluX2lu dGVycnVwdCgpCisgKgorICogUmV0dXJuOiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBu ZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV93cml0ZTMy KHN0cnVjdCB4YXBlYTAweF9kZXZpY2UgKmRldiwgdTMyIGFkZHIsIHUzMiBkYXRhKQoreworCV9f bGUzMiBkYXRhX2xlOworCisJZGF0YV9sZSA9IF9fY3B1X3RvX2xlMzIoZGF0YSk7CisJcmV0dXJu IHhhcGVhMDB4X3RwbV93cml0ZV9ieXRlcyhkZXYsIGFkZHIsICZkYXRhX2xlLCBzaXplb2YoZGF0 YV9sZSkpOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV93YWl0X3JlZzggLSB3YWl0cyBmb3Ig dGhlIHNwZWNpZmllZCBmbGFncyBvbiB0aGUKKyAqIHJlZ2lzdGVyIHRvIGJlIHNldC4KKyAqIEBk ZXY6IHBvaW50ZXIgdG8gdGhlIGRldmljZQorICogQGFkZHI6IHRoZSByZWdpc3RlciB0byBjaGVj aworICogQGZsYWdzOiBtYXNrIG9mIHRoZSBmbGFncyB0byBjaGVjaworICogQHRpbWVvdXRfbXNl Y3M6IG1heGltdW0gYW1vdW50IG9mIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMKKyAqCisg KiBDb250ZXh0OiAhaW5faW50ZXJydXB0KCkKKyAqCisgKiBSZXN1bHQ6IElmIHN1Y2Nlc3NmdWws IDAuIE90aGVyd2lzZSBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgeGFw ZWEwMHhfdHBtX3dhaXRfcmVnOChzdHJ1Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYsCisJCQkJICB1 OCBhZGRyLCB1OCBmbGFncywKKwkJCQkgIGludCB0aW1lb3V0X21zZWNzKQoreworCXVuc2lnbmVk IGxvbmcgc3RvcCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXRfbXNlY3MpOwor CXU4IHJlZzsKKwlpbnQgcmV0dmFsOworCisJZG8geworCQlyZXR2YWwgPSB4YXBlYTAweF90cG1f cmVhZDgoZGV2LCBhZGRyLCAmcmVnKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gb3V0OworCisJ CWlmICgocmVnICYgZmxhZ3MpID09IGZsYWdzKSB7CisJCQlyZXR2YWwgPSAwOworCQkJZ290byBv dXQ7CisJCX0KKworCQl4YXBlYTAweF90cG1fbXNsZWVwKFRQTV9USU1FT1VUKTsKKwl9IHdoaWxl ICh0aW1lX2JlZm9yZShqaWZmaWVzLCBzdG9wKSk7CisKKwlyZXR2YWwgPSAtRVRJTUVET1VUOwor CitvdXQ6CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB4YXBlYTAweF90cG1fcmVxdWVz dF9sb2NhbGl0eTAgLSBzZXRzIHRoZSBhY3RpdmUgbG9jYWxpdHkgdG8gMAorICogQGRldjogcG9p bnRlciB0byB0aGUgZGV2aWNlCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisgKgor ICogUmVzdWx0OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBj b2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV9yZXF1ZXN0X2xvY2FsaXR5MChzdHJ1 Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYpCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHhh cGVhMDB4X3RwbV93cml0ZTgoZGV2LCBUUE1fQUNDRVNTXzAsIFRQTV9BQ0NFU1NfUkVRVUVTVF9V U0UpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJcmV0dmFsID0geGFwZWEwMHhfdHBt X3dhaXRfcmVnOChkZXYsIFRQTV9BQ0NFU1NfMCwKKwkJCQkJVFBNX0FDQ0VTU19BQ1RJVkVfTE9D QUxJVFksCisJCQkJCVRQTTJfVElNRU9VVF9BKTsKKworb3V0OgorCXJldHVybiByZXR2YWw7Cit9 CisKKy8qKgorICogeGFwZWEwMHhfdHBtX3JlbGVhc2VfbG9jYWxpdHkwIC0gcmVsZWFzZSB0aGUg YWN0aXZlIGxvY2FsaXR5CisgKiBAZGV2OiBwb2ludGVyIHRvIHRoZSBkZXZpY2UKKyAqCisgKiBD b250ZXh0OiAhaW5faW50ZXJydXB0KCkKKyAqCisgKiBSZXN1bHQ6IElmIHN1Y2Nlc3NmdWwsIDAu ICBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVh MDB4X3RwbV9yZWxlYXNlX2xvY2FsaXR5MChzdHJ1Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYpCit7 CisJcmV0dXJuIHhhcGVhMDB4X3RwbV93cml0ZTgoZGV2LCBUUE1fQUNDRVNTXzAsCisJCQkJICAg VFBNX0FDQ0VTU19BQ1RJVkVfTE9DQUxJVFkpOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV9i dXJzdF9jb3VudCAtIGZldGNoIHRoZSBudW1iZXIgb2YgYnl0ZXMgb2YgZGF0YSB0aGUKKyAqIFRQ TSBjYW4gY3VycmVudGx5IGhhbmRsZSBpbiBvbmUgYnVyc3QuCisgKiBAZGV2OiBwb2ludGVyIHRv IHRoZSBkZXZpY2UKKyAqIEBjb3VudGVyOiBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBmb3Ig dGhlIGNvdW50CisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisgKgorICogUmVzdWx0 OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICov CitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV9idXJzdF9jb3VudChzdHJ1Y3QgeGFwZWEwMHhfZGV2 aWNlICpkZXYsIHUzMiAqY291bnQpCit7CisJdTMyIHJlZzsKKwlpbnQgcmV0dmFsOworCisJcmV0 dmFsID0geGFwZWEwMHhfdHBtX3JlYWQzMihkZXYsIFRQTV9TVFNfMCwgJnJlZyk7CisJaWYgKHJl dHZhbCkKKwkJZ290byBvdXQ7CisKKwkqY291bnQgPSAocmVnID4+IDgpICYgMHhGRkZGOworCXJl dHZhbCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHhhcGVhMDB4 X3RwbV9zZW5kIC0gc2VuZCB0aGUgY29tbWFuZCB0byB0aGUgVFBNIGFuZCBleGVjdXRlIGl0Lgor ICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlCisgKiBAYnVmOiB0aGUgYnVmZmVyIGNvbnRh aW5pbmcgdGhlIGNvbW1hbmQKKyAqIEBsZW46IHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4K KyAqCisgKiBOLkIuLCB0aGUgY29tbWFuZCBtYXkgbm90IGZpbGwgdGhlIGVudGlyZSBidWZmZXIu IFRoaXMgZnVuY3Rpb24KKyAqIHBhcnNlcyB0aGUgY29tbWFuZCB0byBkZXRlcm1pbmUgaXRzIGFj dHVhbCBzaXplLgorICoKKyAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQorICoKKyAqIFJlc3Vs dDogSWYgc3VjY2Vzc2Z1bCwgMC4gT3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAq Lworc3RhdGljIGludCB4YXBlYTAweF90cG1fc2VuZChzdHJ1Y3QgeGFwZWEwMHhfZGV2aWNlICpk ZXYsIHZvaWQgKmJ1ZiwgdTMyIGxlbikKK3sKKwlzdHJ1Y3QgdHBtX3Rpc19jb21tYW5kICpjbWQg PSBidWY7CisJdTMyIHNpemUsIGJ1cnN0OworCWludCByZXR2YWw7CisKKwkvKiB3YWl0IGZvciBU UE0gdG8gYmUgcmVhZHkgZm9yIGNvbW1hbmQgKi8KKwlyZXR2YWwgPSB4YXBlYTAweF90cG1fd2Fp dF9yZWc4KGRldiwgVFBNX1NUU18wLCBUUE1fU1RTX0NPTU1BTkRfUkVBRFksCisJCQkJCVRQTTJf VElNRU9VVF9CKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGVycjsKKworCS8qIGV4dHJhY3Qgc2l6 ZSBvZiBmcm9tIGhlYWRlciAqLworCXNpemUgPSBfX2JlMzJfdG9fY3B1KGNtZC0+c2l6ZSk7CisK KwlpZiAoc2l6ZSA+IGxlbikgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9 CisKKwkvKiBXcml0ZSB0aGUgY29tbWFuZCAqLworCXdoaWxlIChzaXplID4gMCkgeworCQl4YXBl YTAweF90cG1fYnVyc3RfY291bnQoZGV2LCAmYnVyc3QpOworCQlidXJzdCA9IG1pbihidXJzdCwg c2l6ZSk7CisKKwkJcmV0dmFsID0geGFwZWEwMHhfdHBtX3dyaXRlX2J5dGVzKGRldiwgVFBNX0RB VEFfRklGT18wLCBidWYsCisJCQkJCQkgIGJ1cnN0KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8g Y2FuY2VsOworCisJCXJldHZhbCA9IHhhcGVhMDB4X3RwbV93YWl0X3JlZzgoZGV2LCBUUE1fU1RT XzAsIFRQTV9TVFNfVkFMSUQsCisJCQkJCQlUUE0yX1RJTUVPVVRfQyk7CisJCWlmIChyZXR2YWwp CisJCQlnb3RvIGNhbmNlbDsKKworCQlidWYgKz0gYnVyc3Q7CisJCXNpemUgLT0gYnVyc3Q7CisJ fQorCisJLyogRG8gaXQgKi8KKwlyZXR2YWwgPSB4YXBlYTAweF90cG1fd3JpdGU4KGRldiwgVFBN X1NUU18wLCBUUE1fU1RTX0dPKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNhbmNlbDsKKworCXJl dHVybiAwOworCitjYW5jZWw6CisJLyogQXR0ZW1wdCB0byBjYW5jZWwgKi8KKwl4YXBlYTAweF90 cG1fd3JpdGU4KGRldiwgVFBNX1NUU18wLCBUUE1fU1RTX0NPTU1BTkRfUkVBRFkpOworCitlcnI6 CisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB4YXBlYTAweF90cG1fcmVjdiAtIHJlY3Yg YSBjb21tYW5kIHJlc3BvbnNlIGZyb20gdGhlIFRQTS4KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhl IGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciBpbiB3aGljaCB0byBzdG9yZSB0aGUgcmVzcG9u c2UKKyAqIEBsZW46IHNpemUgb2YgdGhlIGJ1ZmZlciBpbiBieXRlcy4KKyAqCisgKiBOLkIuLCB0 aGUgcmVzdWx0IG1heSBub3QgZmlsbCB0aGUgZW50aXJlIGJ1ZmZlci4gVGhlIGNhbGxlciBtdXN0 CisgKiBwYXJzZSB0aGUgcmVzcG9uc2UgaGVhZGVyIHRvIGRldGVybWluZSBpdHMgYWN0dWFsIHNp emUuCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisgKgorICogUmVzdWx0OiBJZiBz dWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0 aWMgaW50IHhhcGVhMDB4X3RwbV9yZWN2KHN0cnVjdCB4YXBlYTAweF9kZXZpY2UgKmRldiwgdm9p ZCAqYnVmLCB1MzIgbGVuKQoreworCXN0cnVjdCB0cG1fdGlzX2NvbW1hbmQgKmNtZCA9IGJ1ZjsK Kwl1MzIgYnVyc3Q7CisJdTMyIHNpemU7CisJaW50IHJldHZhbDsKKworCS8qIHdhaXQgZm9yIFRQ TSB0byBoYXZlIGRhdGEgYXZhaWxhYmxlICovCisJcmV0dmFsID0geGFwZWEwMHhfdHBtX3dhaXRf cmVnOChkZXYsIFRQTV9TVFNfMCwgVFBNX1NUU19EQVRBX0FWQUlMLAorCQkJCQlUUE0yX1RJTUVP VVRfQyk7CisJaWYgKHJldHZhbCkKKwkJZ290byBjYW5jZWw7CisKKwkvKiByZWFkIHRoZSBoZWFk ZXIgKi8KKwlpZiAobGVuIDwgVElTX0hFQURFUl9MRU4pIHsKKwkJcmV0dmFsID0gLUVJTlZBTDsK KwkJZ290byBjYW5jZWw7CisJfQorCisJcmV0dmFsID0geGFwZWEwMHhfdHBtX3JlYWRfYnl0ZXMo ZGV2LCBUUE1fREFUQV9GSUZPXzAsIGJ1ZiwKKwkJCQkJIFRJU19IRUFERVJfTEVOKTsKKwlpZiAo cmV0dmFsKQorCQlnb3RvIGNhbmNlbDsKKworCS8qIGV4dHJhY3Qgc2l6ZSBvZiBib2R5IGZyb20g aGVhZGVyICovCisJc2l6ZSA9IF9fYmUzMl90b19jcHUoY21kLT5zaXplKTsKKwlpZiAobGVuIDwg c2l6ZSkgeworCQlyZXR2YWwgPSAtRUlOVkFMOworCQlnb3RvIGNhbmNlbDsKKwl9CisKKwlzaXpl IC09IFRJU19IRUFERVJfTEVOOworCWJ1ZiAgID0gJmNtZC0+Ym9keTsKKworCS8qIHJlYWQgdGhl IGJvZHkgKi8KKwl3aGlsZSAoc2l6ZSA+IFRJU19IRUFERVJfTEVOKSB7CisJCXhhcGVhMDB4X3Rw bV9idXJzdF9jb3VudChkZXYsICZidXJzdCk7CisJCWJ1cnN0ID0gbWluKGJ1cnN0LCBzaXplKTsK KworCQlyZXR2YWwgPSB4YXBlYTAweF90cG1fcmVhZF9ieXRlcyhkZXYsIFRQTV9EQVRBX0ZJRk9f MCwgYnVmLAorCQkJCQkJIGJ1cnN0KTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gY2FuY2VsOwor CisJCXNpemUgLT0gYnVyc3Q7CisJCWJ1ZiArPSBidXJzdDsKKwl9CisKKwkvKiB3YWl0IGZvciB2 YWxpZCAqLworCXJldHZhbCA9IHhhcGVhMDB4X3RwbV93YWl0X3JlZzgoZGV2LCBUUE1fU1RTXzAs IFRQTV9TVFNfVkFMSUQsCisJCQkJCVRQTTJfVElNRU9VVF9DKTsKKwlpZiAocmV0dmFsKQorCQln b3RvIGVycjsKKworCXJldHVybiAwOworCitjYW5jZWw6CisJeGFwZWEwMHhfdHBtX3dyaXRlMzIo ZGV2LCBUUE1fU1RTXzAsIFRQTV9TVFNfQ09NTUFORF9SRUFEWSk7CisKK2VycjoKKwlyZXR1cm4g cmV0dmFsOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV90cmFuc21pdCAtIHRyYW5zbWl0IG9u ZSBjb21tYW5kIHRvIHRoZSBUUE0gYW5kIHJlY2VpdmUKKyAqIHRoZSByZXNwb25zZS4KKyAqIEBk ZXY6IHBvaW50ZXIgdG8gdGhlIGRldmljZQorICogQGJ1ZjogdGhlIGJ1ZmZlciBjb250YWluaW5n IHRoZSBjb21tYW5kIGFuZCB0byBwbGFjZSB0aGUgcmVzcG9uc2UgaW4uCisgKiBAbGVuOiBzaXpl IG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMuCisgKgorICogTi5CLiwgdGhlIGNvbW1hbmQgYW5kIHJl c3VsdCBtYXkgbm90IGZpbGwgdGhlIGVudGlyZSBidWZmZXIuIFRoZQorICogY2FsbGVyIG11c3Qg cGFyc2UgdGhlIHJlc3BvbnNlIGhlYWRlciB0byBkZXRlcm1pbmUgaXRzIGFjdHVhbCBzaXplLgor ICoKKyAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQorICoKKyAqIFJlc3VsdDogSWYgc3VjY2Vz c2Z1bCwgMC4gT3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3RhdGljIGlu dCB4YXBlYTAweF90cG1fdHJhbnNtaXQoc3RydWN0IHhhcGVhMDB4X2RldmljZSAqZGV2LCB2b2lk ICpidWYsCisJCQkJIHUzMiBsZW4pCit7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHhhcGVh MDB4X3RwbV9yZXF1ZXN0X2xvY2FsaXR5MChkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0 OworCisJcmV0dmFsID0geGFwZWEwMHhfdHBtX3NlbmQoZGV2LCBidWYsIGxlbik7CisJaWYgKHJl dHZhbCkKKwkJZ290byByZWxlYXNlOworCisJcmV0dmFsID0geGFwZWEwMHhfdHBtX3dhaXRfcmVn OChkZXYsIFRQTV9TVFNfMCwgVFBNX1NUU19EQVRBX0FWQUlMLAorCQkJCQlUSVNfTE9OR19USU1F T1VUKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIGNhbmNlbDsKKworCXJldHZhbCA9IHhhcGVhMDB4 X3RwbV9yZWN2KGRldiwgYnVmLCBsZW4pOworCWlmIChyZXR2YWwpCisJCWdvdG8gcmVsZWFzZTsK KworCXJldHZhbCA9IDA7CisJZ290byByZWxlYXNlOworCitjYW5jZWw6CisJeGFwZWEwMHhfdHBt X3dyaXRlMzIoZGV2LCBUUE1fU1RTXzAsIFRQTV9TVFNfQ09NTUFORF9SRUFEWSk7CisKK3JlbGVh c2U6CisJeGFwZWEwMHhfdHBtX3JlbGVhc2VfbG9jYWxpdHkwKGRldik7CisKK291dDoKKwlyZXR1 cm4gcmV0dmFsOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV90cmFuc21pdF9jbWQgLSBidWls ZCBhbmQgdHJhbnNtaXQgb25lIGNvbW1hbmQgdG8gdGhlCisgKiBUUE0gYW5kIHJlY2VpdmUgdGhl IHJlc3BvbnNlLgorICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlCisgKiBAdGFnOiB0aGUg VFBNIGNvbW1hbmQgaGVhZGVyIHRhZworICogQGNjOiB0aGUgVFBNIGNvbW1hbmQgaGVhZGVyIGNv ZGUKKyAqIEBib2R5OiBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJvZHkKKyAqIEBib2R5X2xlbjog c2l6ZSBpbiBieXRlcyBvZiB0aGUgY29tbWFuZCBib2R5CisgKiBAcmM6IHBvaW50ZXIgdG8gdGhl IGRlc3RpbmF0aW9uIGZvciB0aGUgcmVzdWx0IGNvZGUKKyAqIEByZXN1bHQ6IHBvaW50ZXIgdG8g dGhlIGRlc3RpbmF0aW9uIGZvciB0aGUgcmVzdWx0IGJvZHkuIElmIE5VTEwsCisgKiAgICAgICAg ICB0aGUgcmVzdWx0IGJvZHkgd2lsbCBiZSBkaXNjYXJkZWQuCisgKiBAcmVzdWx0X2xlbjogc2l6 ZSBpbiBieXRlcyBvZiB0aGUgcmVzdWx0IGJ1ZmZlcgorICogQGFjdHVhbF9sZW46IHNpemUgaW4g Ynl0ZXMgb2YgdGhlIHJlc3VsdCBib2R5LiBNYXkgYmUgTlVMTCBpcworICogICAgICAgICAgICAg IHJlc3VsdCBpcyBOVUxMLgorICoKKyAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQorICoKKyAq IFJlc3VsdDogSWYgc3VjY2Vzc2Z1bCwgMC4gT3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29k ZS4KKyAqLworc3RhdGljIGludCB4YXBlYTAweF90cG1fdHJhbnNtaXRfY21kKHN0cnVjdCB4YXBl YTAweF9kZXZpY2UgKmRldiwKKwkJCQkgICAgIHUxNiB0YWcsIHUzMiBjYywgdm9pZCAqYm9keSwg dTMyIGJvZHlfbGVuLAorCQkJCSAgICAgdTMyICpyYywgdm9pZCAqcmVzdWx0LCB1MzIgcmVzdWx0 X2xlbiwKKwkJCQkgICAgIHUzMiAqYWN0dWFsX2xlbikKK3sKKwlzdHJ1Y3QgdHBtX3Rpc19jb21t YW5kICpjbWQ7CisJdm9pZCAqYnVmOworCWludCBidWZsZW4sIGNtZGxlbiwgcmV0dmFsOworCisJ YnVmbGVuID0gVElTX01BWF9CVUYgKyA0OworCWNtZGxlbiA9IGJ1ZmxlbiAtIDI7IC8qIHJlc2Vy dmUgMiBieXRlcyBmb3IgcmVhbGlnbm1lbnQgKi8KKworCWlmIChib2R5X2xlbiArIFRJU19IRUFE RVJfTEVOID4gY21kbGVuKSB7CisJCXJldHZhbCA9IC1FMkJJRzsKKwkJcHJfbm90aWNlKCJ0cmFu c21pdF9jbWQ6IGJvZHlfbGVuICsgVElTX0hFQURFUl9MRU4gPiBjbWRsZW4gKCVkKSIsCisJCQkg IGNtZGxlbik7CisJCWdvdG8gb3V0OworCX0KKworCWJ1ZiA9IGt6YWxsb2MoYnVmbGVuLCBHRlBf S0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dDsK Kwl9CisJY21kID0gYnVmICsgMjsgLyogZW5zdXJlIGFsbCBmaWVsZHMgYXJlIHByb3Blcmx5IGFs aWduZWQgKi8KKworCS8qIEJ1aWxkIHRoZSBjb21tYW5kICovCisJY21kLT50YWcgID0gX19jcHVf dG9fYmUxNih0YWcpOworCWNtZC0+c2l6ZSA9IF9fY3B1X3RvX2JlMzIoVElTX0hFQURFUl9MRU4g KyBib2R5X2xlbik7CisJY21kLT5jb2RlID0gX19jcHVfdG9fYmUzMihjYyk7CisJbWVtY3B5KCZj bWQtPmJvZHksIGJvZHksIGJvZHlfbGVuKTsKKworCS8qIEV4ZWN1dGUgdGhlIGNvbW1hbmQgKi8K KwlyZXR2YWwgPSB4YXBlYTAweF90cG1fdHJhbnNtaXQoZGV2LCBjbWQsIGNtZGxlbik7CisJaWYg KHJldHZhbCkKKwkJZ290byBmcmVlOworCisJLyogRXh0cmFjdCByZXN1bHQgY29kZSAqLworCSpy YyA9IF9fYmUzMl90b19jcHUoY21kLT5jb2RlKTsKKworCS8qIENvcHkgdGhlIHJlc3BvbnNlIGRh dGEgKi8KKwlpZiAocmVzdWx0KSB7CisJCSphY3R1YWxfbGVuID0gX19iZTMyX3RvX2NwdShjbWQt PnNpemUpIC0gVElTX0hFQURFUl9MRU47CisJCWlmICgqYWN0dWFsX2xlbiA+IHJlc3VsdF9sZW4p IHsKKwkJCXJldHZhbCA9IC1FMkJJRzsKKwkJCWdvdG8gZnJlZTsKKwkJfQorCQltZW1jcHkocmVz dWx0LCAmY21kLT5ib2R5LCAqYWN0dWFsX2xlbik7CisJfQorCisJcmV0dmFsID0gMDsKKworZnJl ZToKKwltZW1zZXQoYnVmLCAwLCBidWZsZW4pOworCWt6ZnJlZShidWYpOworCitvdXQ6CisJcmV0 dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB4YXBlYTAweF90cG1fdHJhbnNtaXRfY21kX3NpbXBs ZSAtIGJ1aWxkIGFuZCB0cmFuc21pdCBvbmUgY29tbWFuZCB0byB0aGUKKyAqIFRQTSBhbmQgZGlz Y2FyZCB0aGUgcmVzcG9uZSBib2R5LgorICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlCisg KiBAdGFnOiB0aGUgVFBNIGNvbW1hbmQgaGVhZGVyIHRhZworICogQGNjOiB0aGUgVFBNIGNvbW1h bmQgaGVhZGVyIGNvZGUKKyAqIEBib2R5OiBwb2ludGVyIHRvIHRoZSBjb21tYW5kIGJvZHkKKyAq IEBsZW46IHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNvbW1hbmQgYm9keQorICogQHJjOiBwb2ludGVy IHRvIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHJlc3VsdCBjb2RlCisgKgorICogQ29udGV4dDog IWluX2ludGVycnVwdCgpCisgKgorICogUmVzdWx0OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndp c2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV90 cmFuc21pdF9jbWRfc2ltcGxlKHN0cnVjdCB4YXBlYTAweF9kZXZpY2UgKmRldiwKKwkJCQkJICAg IHUxNiB0YWcsIHUzMiBjYywKKwkJCQkJICAgIHZvaWQgKmJvZHksIHUzMiBsZW4sIHUzMiAqcmMp Cit7CisJcmV0dXJuIHhhcGVhMDB4X3RwbV90cmFuc21pdF9jbWQoZGV2LCB0YWcsIGNjLCBib2R5 LCBsZW4sIHJjLCBOVUxMLCAwLAorCQkJCQkgTlVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCisgKiBUUE0gY29tbWFuZHMKKyAqLworCisvKioKKyAqIHhhcGVhMDB4X3RwbV9zdGFy dHVwIC0gZXhlY3V0ZXMgdGhlIFRQTTJfU3RhcnR1cCBjb21tYW5kLgorICogQGRldjogcG9pbnRl ciB0byB0aGUgZGV2aWNlCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisgKgorICog UmVzdWx0OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2Rl LgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV9zdGFydHVwKHN0cnVjdCB4YXBlYTAweF9k ZXZpY2UgKmRldikKK3sKKwl1OCBib2R5WzJdID0geyAweDAwLCAweDAwIH07CisJdTMyIHJjOwor CWludCByZXR2YWw7CisKKwlyZXR2YWwgPSB4YXBlYTAweF90cG1fdHJhbnNtaXRfY21kX3NpbXBs ZShkZXYsIFRQTTJfU1RfTk9fU0VTU0lPTlMsCisJCQkJCQkgIFRQTTJfQ0NfU1RBUlRVUCwgYm9k eSwKKwkJCQkJCSAgc2l6ZW9mKGJvZHkpLCAmcmMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0 OworCisJaWYgKHJjICE9IFRQTV9SQ19TVUNDRVNTICYmIHJjICE9IFRQTV9SQ19JTklUSUFMSVpF KSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IDA7CisK K291dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHhhcGVhMDB4X3RwbV9zZWxmX3Rl c3QgLSBleGVjdXRlcyB0aGUgVFBNMl9TZWxmVGVzdCBjb21tYW5kLgorICogQGRldjogcG9pbnRl ciB0byB0aGUgZGV2aWNlCisgKgorICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisgKgorICog UmVzdWx0OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2Rl LgorICovCitzdGF0aWMgaW50IHhhcGVhMDB4X3RwbV9zZWxmX3Rlc3Qoc3RydWN0IHhhcGVhMDB4 X2RldmljZSAqZGV2KQoreworCXU4IGJvZHlbMV0gPSB7IDB4MDEgfTsKKwl1MzIgcmM7CisJaW50 IHJldHZhbDsKKworCXJldHZhbCA9IHhhcGVhMDB4X3RwbV90cmFuc21pdF9jbWRfc2ltcGxlKGRl diwgVFBNMl9TVF9OT19TRVNTSU9OUywKKwkJCQkJCSAgVFBNMl9DQ19TRUxGX1RFU1QsIGJvZHks CisJCQkJCQkgIHNpemVvZihib2R5KSwgJnJjKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsK KworCWlmIChyYyAhPSBUUE1fUkNfU1VDQ0VTUykgeworCQlyZXR2YWwgPSAtRUlPOworCQlnb3Rv IG91dDsKKwl9CisKKwlyZXR2YWwgPSB4YXBlYTAweF90cG1fd2FpdF9yZWc4KGRldiwgVFBNX1NU U18wLCBUUE1fU1RTX1NFTEZfVEVTVF9ET05FLAorCQkJCQlUSVNfTE9OR19USU1FT1VUKTsKKwlp ZiAocmV0dmFsKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworb3V0Ogor CXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogeGFwZWEwMHhfdHBtX2RpY3RfYXR0YWNrX2xv Y2tfcmVzZXQgLSBleGVjdXRlcyB0aGUKKyAqIFRQTTJfRGljdGlvbmFyeUF0dGFja0xvY2tSZXNl dCBjb21tYW5kLgorICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlCisgKgorICogQ29udGV4 dDogIWluX2ludGVycnVwdCgpCisgKgorICogUmVzdWx0OiBJZiBzdWNjZXNzZnVsLCAwLiBPdGhl cndpc2UgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50Cit4YXBlYTAweF90 cG1fZGljdF9hdHRhY2tfbG9ja19yZXNldChzdHJ1Y3QgeGFwZWEwMHhfZGV2aWNlICpkZXYpCit7 CisJdTggYm9keVsxN10gPSB7IDB4NDAsIDB4MDAsIDB4MDAsIDB4MEEsIC8vIFRQTV9SSF9MT0NL T1VUCisJCQkweDAwLCAweDAwLCAweDAwLCAweDA5LCAvLyBhdXRob3JpemF0aW9uU2l6ZQorCQkJ MHg0MCwgMHgwMCwgMHgwMCwgMHgwOSwgLy8gVFBNX1JTX1BXCisJCQkweDAwLCAweDAwLAkJLy8g bm9uY2Ugc2l6ZQorCQkJCQkJLy8gbm9uY2UKKwkJCTB4MDEsCQkJLy8gc2Vzc2lvbiBhdHRyaWJ1 dGVzCisJCQkweDAwLCAweDAwCQkvLyBwYXlsb2FkIHNpemUKKwkJCQkJCS8vIHBheWxvYWQKKwkJ ICAgICAgfTsKKwl1MzIgcmM7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHhhcGVhMDB4X3Rw bV90cmFuc21pdF9jbWRfc2ltcGxlKGRldiwKKwkJCQkJCSAgVFBNMl9TVF9TRVNTSU9OUywKKwkJ CQkJCSAgVFBNMl9DQ19ESUNUX0FUVEFDS19MT0NLX1JTVCwKKwkJCQkJCSAgYm9keSwgc2l6ZW9m KGJvZHkpLCAmcmMpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0OworCisJaWYgKHJjICE9IFRQ TV9SQ19TVUNDRVNTKSB7CisJCXJldHZhbCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworb3V0 OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qKgorICogeGFwZWEwMHhfdHBtX2dldF9yYW5kb20g LSBleGVjdXRlcyB0aGUgVFBNMl9HZXRSYW5kb20gY29tbWFuZC4KKyAqIEBkZXY6IHBvaW50ZXIg dG8gdGhlIGRldmljZQorICogQGxlbjogbnVtYmVyIG9mIGJ5dGVzIHRvIHJlcXVlc3QKKyAqIEBi eXRlczogcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24KKyAqCisgKiBDb250ZXh0OiAhaW5faW50 ZXJydXB0KCkKKyAqCisgKiBSZXN1bHQ6IElmIHN1Y2Nlc3NmdWwsIDAuIE90aGVyd2lzZSBhIG5l Z2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQgeGFwZWEwMHhfdHBtX2dldF9yYW5k b20oc3RydWN0IHhhcGVhMDB4X2RldmljZSAqZGV2LCB1MTYgbGVuLAorCQkJCSAgIHZvaWQgKmJ5 dGVzKQoreworCV9fYmUxNiBib2R5OworCXU4ICpidWY7CisJdTMyIGJ1Zl9sZW4sIHJlc3VsdF9s ZW47CisJdTMyIHJjOworCWludCByZXR2YWw7CisKKwlidWZfbGVuID0gbGVuICsgMjsKKwlidWYg PSBremFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCXJldHZhbCA9 IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXdoaWxlIChsZW4gPiAwKSB7CisJCWJvZHkg PSBfX2NwdV90b19iZTE2KGxlbik7CisKKwkJcmV0dmFsID0geGFwZWEwMHhfdHBtX3RyYW5zbWl0 X2NtZChkZXYsIFRQTTJfU1RfTk9fU0VTU0lPTlMsCisJCQkJCQkgICBUUE0yX0NDX0dFVF9SQU5E T00sCisJCQkJCQkgICAmYm9keSwgc2l6ZW9mKGJvZHkpLAorCQkJCQkJICAgJnJjLCBidWYsIGJ1 Zl9sZW4sCisJCQkJCQkgICAmcmVzdWx0X2xlbik7CisKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8g ZnJlZTsKKworCQlpZiAocmMgIT0gVFBNX1JDX1NVQ0NFU1MpIHsKKwkJCXJldHZhbCA9IC1FSU87 CisJCQlnb3RvIGZyZWU7CisJCX0KKworCQlyZXN1bHRfbGVuID0gX19iZTE2X3RvX2NwdSgqKF9f YmUxNiAqKWJ1Zik7CisJCWlmIChyZXN1bHRfbGVuID4gbGVuKSB7CisJCQlyZXR2YWwgPSAtRTJC SUc7CisJCQlnb3RvIGZyZWU7CisJCX0KKworCQltZW1jcHkoYnl0ZXMsIGJ1ZiArIDIsIHJlc3Vs dF9sZW4pOworCQlsZW4gLT0gcmVzdWx0X2xlbjsKKwl9CisKKwlyZXR2YWwgPSAwOworCitmcmVl OgorCW1lbXNldChidWYsIDAsIGJ1Zl9sZW4pOworCWt6ZnJlZShidWYpOworCitvdXQ6CisJcmV0 dXJuIHJldHZhbDsKK30KKworLyoqCisgKiB4YXBlYTAweF90cG1fcmFuZG9taXplX3BsYXRmb3Jt X2F1dGggLSBzZXRzIHRoZSBwbGF0Zm9ybQorICogYXV0aG9yaXphdGlvbiB0byBhIHJhbmRvbSBw YXNzd29yZCBhbmQgdGhlbiBkaXNjYXJkcyBpdC4KKyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRl dmljZQorICoKKyAqIENvbnRleHQ6ICFpbl9pbnRlcnJ1cHQoKQorICoKKyAqIFJlc3VsdDogSWYg c3VjY2Vzc2Z1bCwgMC4gT3RoZXJ3aXNlIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqLworc3Rh dGljIGludCB4YXBlYTAweF90cG1fcmFuZG9taXplX3BsYXRmb3JtX2F1dGgoc3RydWN0IHhhcGVh MDB4X2RldmljZSAqZGV2KQoreworCXU4IHBhc3N3b3JkWzE2XTsKKwl1OCBib2R5WzM1XSA9IHsg MHg0MCwgMHgwMCwgMHgwMCwgMHgwQywgLy8gVFBNX1JIX1BMQVRGT1JNCisJCQkweDAwLCAweDAw LCAweDAwLCAweDA5LCAvLyBhdXRob3JpemF0aW9uU2l6ZQorCQkJMHg0MCwgMHgwMCwgMHgwMCwg MHgwOSwgLy8gVFBNX1JTX1BXCisJCQkweDAwLCAweDAwLAkJLy8gbm9uY2Ugc2l6ZQorCQkJCQkJ Ly8gbm9uY2UKKwkJCTB4MDEsCQkJLy8gc2Vzc2lvbiBhdHRyaWJ1dGVzCisJCQkweDAwLCAweDAw LAkJLy8gb2xkIGF1dGggcGF5bG9hZCBzaXplCisJCQkJCQkvLyBvbGQgYXV0aCBwYXlsb2FkCisJ CQkweDAwLCAweDEwLAkJLy8gbmV3IGF1dGggcGF5bG9hZCBzaXplCisJCQkweDAwLCAweDAwLCAw eDAwLCAweDAwLCAvLyBuZXcgYXV0aCBwYXlsb2FkCisJCQkweDAwLCAweDAwLCAweDAwLCAweDAw LCAvLyBuZXcgYXV0aCBwYXlsb2FkCisJCQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAvLyBuZXcg YXV0aCBwYXlsb2FkCisJCQkweDAwLCAweDAwLCAweDAwLCAweDAwCS8vIG5ldyBhdXRoIHBheWxv YWQKKwkJICAgICAgfTsKKwl1MzIgcmM7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IHhhcGVh MDB4X3RwbV9nZXRfcmFuZG9tKGRldiwgc2l6ZW9mKHBhc3N3b3JkKSwgcGFzc3dvcmQpOworCWlm IChyZXR2YWwpIHsKKwkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJCSJUUE0gZ2V0 IHJhbmRvbSBmYWlsZWQgd2l0aCAlZFxuIiwgcmV0dmFsKTsKKwkJZ290byBvdXQ7CisJfQorCisJ bWVtY3B5KGJvZHkgKyAxOSwgcGFzc3dvcmQsIHNpemVvZihwYXNzd29yZCkpOworCisJcmV0dmFs ID0geGFwZWEwMHhfdHBtX3RyYW5zbWl0X2NtZF9zaW1wbGUoZGV2LCBUUE0yX1NUX1NFU1NJT05T LAorCQkJCQkJICBUUE0yX0NDX0hJRVJBUkNIWV9DSEFOR0VfQVVUSCwKKwkJCQkJCSAgJmJvZHks IHNpemVvZihib2R5KSwgJnJjKTsKKwlpZiAocmV0dmFsKQorCQlnb3RvIG91dDsKKworCWlmIChy YyAhPSBUUE1fUkNfU1VDQ0VTUykgeworCQlyZXR2YWwgPSAtRUlPOworCQlwcl9ub3RpY2UoIkhp ZXJhcmNoeUNoYW5nZUF1dGggcmVzdWx0IGNvZGU6ICVkXG4iLCByYyk7CisJCWdvdG8gb3V0Owor CX0KKworCXJldHZhbCA9IDA7CisKK291dDoKKwltZW1zZXQocGFzc3dvcmQsIDAsIHNpemVvZihw YXNzd29yZCkpOworCW1lbXNldChib2R5LCAwLCBzaXplb2YoYm9keSkpOworCXJldHVybiByZXR2 YWw7Cit9CisKKy8qKgorICogeGFwZWEwMHhfdHBtX3BsYXRmb3JtX2luaXRpYWxpemUgLSBwZXJm b3JtcyB0aGUgbWluaW1hbAorICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIFRQTSBub3JtYWxseSBw ZXJmb3JtZWQgYnkgdGhlIHBsYXRmb3JtIGNvZGUKKyAqIChlLmcuLCBCSU9TKS4gVGhpcyBjb25z aXN0cyBvZiBleGVjdXRpbmcgdGhlIFRQTSBzdGFydHVwIGFuZAorICogc2VsZi10ZXN0IGNvbW1h bmRzIGFuZCBzZXR0aW5nIHRoZSBwbGF0Zm9ybSBhdXRob3JpemF0aW9uIHBhc3N3b3JkLgorICoK KyAqIEBkZXY6IHBvaW50ZXIgdG8gdGhlIGRldmljZQorICoKKyAqIENvbnRleHQ6ICFpbl9pbnRl cnJ1cHQoKQorICoKKyAqIFJlc3VsdDogSWYgc3VjY2Vzc2Z1bCwgMC4gT3RoZXJ3aXNlIGEgbmVn YXRpdmUgZXJyb3IgY29kZS4KKyAqLworaW50IHhhcGVhMDB4X3RwbV9wbGF0Zm9ybV9pbml0aWFs aXplKHN0cnVjdCB4YXBlYTAweF9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0dmFsOworCisJLyog d2FpdCBmb3IgVFBNIHRvIGJlIHJlYWR5ICovCisJcmV0dmFsID0gIHhhcGVhMDB4X3RwbV93YWl0 X3JlZzgoZGV2LCBUUE1fQUNDRVNTXzAsIFRQTV9BQ0NFU1NfVkFMSUQsCisJCQkJCSBUUE0yX1RJ TUVPVVRfQSk7CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXQ7CisKKwkvKiBpc3N1ZSBUUE0yX0ND X1NUQVJUVVAgY29tbWFuZCAqLworCXJldHZhbCA9IHhhcGVhMDB4X3RwbV9zdGFydHVwKGRldik7 CisJaWYgKHJldHZhbCkgeworCQlkZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiVFBNIHN0 YXJ0dXAgZmFpbGVkIHdpdGggJWRcbiIsCisJCQlyZXR2YWwpOworCQlnb3RvIG91dDsKKwl9CisK KwkvKiBpc3N1ZSBUUE0yX1NFTEZfVEVTVCBjb21tYW5kICovCisJcmV0dmFsID0geGFwZWEwMHhf dHBtX3NlbGZfdGVzdChkZXYpOworCWlmIChyZXR2YWwpIHsKKwkJZGV2X2VycigmZGV2LT5pbnRl cmZhY2UtPmRldiwgIlRQTSBzZWxmLXRlc3QgZmFpbGVkIHdpdGggJWRcbiIsCisJCQlyZXR2YWwp OworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFRoZSBUUE0gd2lsbCBlbnRlciBkaWN0aW9u YXJ5IGxvY2tvdXQgbW9kZSBpZiB0dXJuZWQgb2ZmCisJICogdG9vIG1hbnkgdGltZXMgd2l0aG91 dCBhIHByb3BlciBzaHV0ZG93bi4gRm9yIHRoZQorCSAqICJ0aHVtYi1kcml2ZSItZXNxdWUgZGVt byBkZXZpY2VzLCB0aGlzIGhhcHBlbnMgd2hlbmV2ZXIgaXQKKwkgKiBpcyB1bnBsdWdnZWQuIERp Y3Rpb25hcnkgYXR0YWNrcyBhZ2FpbnN0IHRoZSBkZW1vIGRldmljZXMKKwkgKiAoWEFQLUVBLTAw ezEsMn0pIGRvbid0IG1hdHRlciwgc28gcmVzZXQgdGhlIGxvY2tvdXQgb24gZXZlcnkKKwkgKiBi b290LiBQcm9kdWN0aW9uIGRldmljZXMgKFhBUC1FQS0wMDMpIGFyZSBpbnRlcm5hbCBtUENJLWUK KwkgKiBkZXZpY2VzIHRoYXQgc2hvdWxkIG5vdCBiZSBob3QtcGx1Z2dlZCwgc28gZG8gbm90IG5l ZWQgdG8gYmUKKwkgKiByZXNldC4KKwkgKi8KKwlpZiAoZGV2LT5waWQgPT0gVVNCX1BST0RVQ1Rf SURfWEFQRUEwMDEgfHwKKwkgICAgZGV2LT5waWQgPT0gVVNCX1BST0RVQ1RfSURfWEFQRUEwMDIp IHsKKwkJcmV0dmFsID0geGFwZWEwMHhfdHBtX2RpY3RfYXR0YWNrX2xvY2tfcmVzZXQoZGV2KTsK KwkJaWYgKHJldHZhbCkgeworCQkJZGV2X2VycigmZGV2LT5pbnRlcmZhY2UtPmRldiwKKwkJCQki UmVzZXR0aW5nIFRQTSBsb2Nrb3V0IGZhaWxlZCB3aXRoICVkXG4iLAorCQkJCXJldHZhbCk7CisJ CQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHNldCB0aGUgcGxhdGZvcm0gYXV0aG9yaXphdGlv biB0byByYW5kb20gYnl0ZXMgKi8KKwlyZXR2YWwgPSB4YXBlYTAweF90cG1fcmFuZG9taXplX3Bs YXRmb3JtX2F1dGgoZGV2KTsKKwlpZiAocmV0dmFsKSB7CisJCWRldl9lcnIoJmRldi0+aW50ZXJm YWNlLT5kZXYsCisJCQkiU2V0dGluZyBUUE0gcGxhdGZvcm0gYXV0aCBmYWlsZWQgd2l0aCAlZFxu IiwKKwkJCXJldHZhbCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldHZhbCA9IDA7CisKK291dDoK KwlyZXR1cm4gcmV0dmFsOworfQo=