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: [2/3] spi: add FTDI MPSSE SPI controller driver From: Anatolij Gustschin Message-Id: <20181105161913.27538-3-agust@denx.de> Date: Mon, 5 Nov 2018 17:19:12 +0100 To: linux-usb@vger.kernel.org, linux-spi@vger.kernel.org, linux-fpga@vger.kernel.org Cc: gregkh@linuxfoundation.org, broonie@kernel.org, atull@kernel.org, mdf@kernel.org List-ID: QWRkIFNQSSBidXMgY29udHJvbGxlciBkcml2ZXIgZm9yIEZUREkgTVBTU0UgbW9kZS4gVGhpcyBk cml2ZXIKaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCB0b2dldGhlciB3aXRoIHRoZSBGVDIzMkggaW50 ZXJmYWNlIGRyaXZlcgpmb3IgRlBHQSBjb25maWd1cmF0aW9uIGluIGRyaXZlcnMvdXNiL21pc2Mv ZnQyMzJoLWludGYuYyB3aGljaAphZGRzIGFuIG1wc3NlIHNwaSBwbGF0Zm9ybSBkZXZpY2UgZGVz Y3JpYmluZyBVU0IgU1BJIGJ1cyB3aXRoCmF0dGFjaGVkIFNQSSBzbGF2ZSBkZXZpY2VzLgoKU2ln bmVkLW9mZi1ieTogQW5hdG9saWogR3VzdHNjaGluIDxhZ3VzdEBkZW54LmRlPgotLS0KIGRyaXZl cnMvc3BpL0tjb25maWcgICAgICAgICAgfCAgIDcgKwogZHJpdmVycy9zcGkvTWFrZWZpbGUgICAg ICAgICB8ICAgMSArCiBkcml2ZXJzL3NwaS9zcGktZnRkaS1tcHNzZS5jIHwgNjcxICsrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDY3OSBpbnNlcnRp b25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9zcGkvc3BpLWZ0ZGktbXBzc2UuYwoK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL0tjb25maWcgYi9kcml2ZXJzL3NwaS9LY29uZmlnCmlu ZGV4IDdkM2E1Yzk0NzI3ZS4uMmNiMjRlMjhjNDg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9L Y29uZmlnCisrKyBiL2RyaXZlcnMvc3BpL0tjb25maWcKQEAgLTI1OSw2ICsyNTksMTMgQEAgY29u ZmlnIFNQSV9GU0xfTFBTUEkKIAloZWxwCiAJICBUaGlzIGVuYWJsZXMgRnJlZXNjYWxlIGkuTVgg TFBTUEkgY29udHJvbGxlcnMgaW4gbWFzdGVyIG1vZGUuCiAKK2NvbmZpZyBTUElfRlRESV9NUFNT RQorCXRyaXN0YXRlICJGVERJIE1QU1NFIFNQSSBjb250cm9sbGVyIgorCWRlcGVuZHMgb24gVVNC X0ZUMjMySF9JTlRGIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIEZUMjMySCBzdXBwb3J0cyBT UEkgaW4gTVBTU0UgbW9kZS4gVGhpcyBkcml2ZXIgcHJvdmlkZXMgTVBTU0UKKwkgIFNQSSBjb250 cm9sbGVyIGluIG1hc3RlciBtb2RlLgorCiBjb25maWcgU1BJX0dQSU8KIAl0cmlzdGF0ZSAiR1BJ Ty1iYXNlZCBiaXRiYW5naW5nIFNQSSBNYXN0ZXIiCiAJZGVwZW5kcyBvbiBHUElPTElCIHx8IENP TVBJTEVfVEVTVApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvTWFrZWZpbGUgYi9kcml2ZXJzL3Nw aS9NYWtlZmlsZQppbmRleCAzNTc1MjA1YzVjMjcuLjI2OGM0MmM1MDJlMiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9zcGkvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zcGkvTWFrZWZpbGUKQEAgLTExMyw2 ICsxMTMsNyBAQCBvYmotJChDT05GSUdfU1BJX1hJTElOWCkJCSs9IHNwaS14aWxpbngubwogb2Jq LSQoQ09ORklHX1NQSV9YTFApCQkJKz0gc3BpLXhscC5vCiBvYmotJChDT05GSUdfU1BJX1hURU5T QV9YVEZQR0EpCQkrPSBzcGkteHRlbnNhLXh0ZnBnYS5vCiBvYmotJChDT05GSUdfU1BJX1pZTlFN UF9HUVNQSSkJCSs9IHNwaS16eW5xbXAtZ3FzcGkubworb2JqLSQoQ09ORklHX1NQSV9GVERJX01Q U1NFKQkJKz0gc3BpLWZ0ZGktbXBzc2UubwogCiAjIFNQSSBzbGF2ZSBwcm90b2NvbCBoYW5kbGVy cwogb2JqLSQoQ09ORklHX1NQSV9TTEFWRV9USU1FKQkJKz0gc3BpLXNsYXZlLXRpbWUubwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWZ0ZGktbXBzc2UuYyBiL2RyaXZlcnMvc3BpL3NwaS1m dGRpLW1wc3NlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44OWMw MjdlNGY4YzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3NwaS9zcGktZnRkaS1tcHNzZS5j CkBAIC0wLDAgKzEsNjcxIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAor LyoKKyAqIEZUREkgRlQyMzJIIE1QU1NFIFNQSSBjb250cm9sbGVyIGRyaXZlcgorICoKKyAqIENv cHlyaWdodCAoQykgMjAxNyBERU5YIFNvZnR3YXJlIEVuZ2luZWVyaW5nCisgKiBBbmF0b2xpaiBH dXN0c2NoaW4gPGFndXN0QGRlbnguZGU+CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+ CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cisj aW5jbHVkZSA8bGludXgvZ3Bpby9jb25zdW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8vbWFj aGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxp bnV4L3ByaW50ay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9z cGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zaXpl cy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9mdDIzMmgt aW50Zi5oPgorCitlbnVtIGdwaW9sIHsKKwlTSwk9IEJJVCgwKSwKKwlETwk9IEJJVCgxKSwKKwlE SQk9IEJJVCgyKSwKKwlDUwk9IEJJVCgzKSwKK307CisKK3N0cnVjdCBmdGRpX3NwaSB7CisJc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsK KwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyOworCWNvbnN0IHN0cnVjdCBmdDIzMmhfaW50Zl9v cHMgKmlvcHM7CisJc3RydWN0IGdwaW9kX2xvb2t1cF90YWJsZSAqbG9va3VwWzEzXTsKKwlzdHJ1 Y3QgZ3Bpb19kZXNjICoqY3NfZ3Bpb3M7CisKKwl1OCB0eHJ4X2NtZDsKKwl1OCByeF9jbWQ7CisJ dTggdHhfY21kOworCXU4IHhmZXJfYnVmW1NaXzY0S107CisJdTE2IGxhc3RfbW9kZTsKK307CisK K3N0YXRpYyB2b2lkIGZ0ZGlfc3BpX2NoaXBzZWxlY3Qoc3RydWN0IGZ0ZGlfc3BpICpwcml2LCBz dHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAorCQkJCWJvb2wgdmFsdWUpCit7CisJaW50IGNzID0gc3Bp LT5jaGlwX3NlbGVjdDsKKworCWRldl9kYmcoJnByaXYtPm1hc3Rlci0+ZGV2LCAiJXM6IENTICVk LCBtb2RlKCVkKSwgdmFsICVkXG4iLAorCQlfX2Z1bmNfXywgY3MsIChzcGktPm1vZGUgJiBTUElf Q1NfSElHSCksIHZhbHVlKTsKKworCWdwaW9kX3NldF9yYXdfdmFsdWVfY2Fuc2xlZXAocHJpdi0+ Y3NfZ3Bpb3NbY3NdLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZnRkaV9zcGlfdHhy eF9ieXRlX2NtZChzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXU4IG1vZGUgPSBzcGktPm1v ZGUgJiAoU1BJX0NQT0wgfCBTUElfQ1BIQSk7CisJdTggY21kOworCisJaWYgKHNwaS0+bW9kZSAm IFNQSV9MU0JfRklSU1QpIHsKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgU1BJX01PREVfMDoK KwkJY2FzZSBTUElfTU9ERV8xOgorCQkJY21kID0gVFhGX1JYUl9CWVRFU19MU0I7CisJCQlicmVh azsKKwkJY2FzZSBTUElfTU9ERV8yOgorCQljYXNlIFNQSV9NT0RFXzM6CisJCQljbWQgPSBUWFJf UlhGX0JZVEVTX0xTQjsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChtb2Rl KSB7CisJCWNhc2UgU1BJX01PREVfMDoKKwkJY2FzZSBTUElfTU9ERV8xOgorCQkJY21kID0gVFhG X1JYUl9CWVRFU19NU0I7CisJCQlicmVhazsKKwkJY2FzZSBTUElfTU9ERV8yOgorCQljYXNlIFNQ SV9NT0RFXzM6CisJCQljbWQgPSBUWFJfUlhGX0JZVEVTX01TQjsKKwkJCWJyZWFrOworCQl9CisJ fQorCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGZ0ZGlfc3BpX2xvb3BiYWNr X2NmZyhzdHJ1Y3QgZnRkaV9zcGkgKnByaXYsIGludCBvbikKK3sKKwlpbnQgcmV0OworCisJcHJp di0+eGZlcl9idWZbMF0gPSBvbiA/IExPT1BCQUNLX09OIDogTE9PUEJBQ0tfT0ZGOworCisJcmV0 ID0gcHJpdi0+aW9wcy0+d3JpdGVfZGF0YShwcml2LT5pbnRmLCBwcml2LT54ZmVyX2J1ZiwgMSk7 CisJaWYgKHJldCA8IDApCisJCWRldl93YXJuKCZwcml2LT5tYXN0ZXItPmRldiwgImxvb3BiYWNr ICVkIGZhaWxlZFxuIiwgb24pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9z cGlfdHhfcngoc3RydWN0IGZ0ZGlfc3BpICpwcml2LCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpLAor CQkJICBzdHJ1Y3Qgc3BpX3RyYW5zZmVyICp0KQoreworCWNvbnN0IHN0cnVjdCBmdDIzMmhfaW50 Zl9vcHMgKm9wcyA9IHByaXYtPmlvcHM7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHBy aXYtPm1hc3RlcjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbWFzdGVyLT5kZXY7CisJdm9pZCAq cnhfb2ZmczsKKwljb25zdCB2b2lkICp0eF9vZmZzOworCXNpemVfdCByZW1haW5pbmcsIHN0cmlk ZTsKKwlzaXplX3Qgcnhfc3RyaWRlOworCWludCByZXQsIHRvdXQgPSAxMDsKKwljb25zdCB1OCAq dHhfZGF0YSA9IHQtPnR4X2J1ZjsKKwl1OCAqcnhfZGF0YSA9IHQtPnJ4X2J1ZjsKKworCWlmICgh dC0+bGVuKQorCQlyZXR1cm4gMDsKKworCW9wcy0+bG9jayhwcml2LT5pbnRmKTsKKworCWlmIChz cGktPm1vZGUgJiBTUElfTE9PUCkgeworCQlyZXQgPSBmdGRpX3NwaV9sb29wYmFja19jZmcocHJp diwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJcmVtYWluaW5nID0g dC0+bGVuOworCXJ4X29mZnMgPSByeF9kYXRhOworCXR4X29mZnMgPSB0eF9kYXRhOworCisJd2hp bGUgKHJlbWFpbmluZykgeworCQlzdHJpZGUgPSBtaW5fdChzaXplX3QsIHJlbWFpbmluZywgU1pf NTEyIC0gMyk7CisKKwkJcHJpdi0+eGZlcl9idWZbMF0gPSBwcml2LT50eHJ4X2NtZDsKKwkJcHJp di0+eGZlcl9idWZbMV0gPSBzdHJpZGUgLSAxOworCQlwcml2LT54ZmVyX2J1ZlsyXSA9IChzdHJp ZGUgLSAxKSA+PiA4OworCQltZW1jcHkoJnByaXYtPnhmZXJfYnVmWzNdLCB0eF9vZmZzLCBzdHJp ZGUpOworCQlwcmludF9oZXhfZHVtcF9kZWJ1ZygiV1I6ICIsIERVTVBfUFJFRklYX09GRlNFVCwg MTYsIDEsCisJCQkJICAgICBwcml2LT54ZmVyX2J1Ziwgc3RyaWRlICsgMywgMSk7CisKKwkJcmV0 ID0gb3BzLT53cml0ZV9kYXRhKHByaXYtPmludGYsIHByaXYtPnhmZXJfYnVmLCBzdHJpZGUgKyAz KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoZGV2LCAiJXM6IHhmZXIgZmFpbGVkICVk XG4iLCBfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlkZXZfZGJnKGRldiwg IiVzOiBXUiAlenUgYnl0ZShzKSwgVFhSWCBDTUQgMHglMDJ4XG4iLAorCQkJX19mdW5jX18sIHN0 cmlkZSwgcHJpdi0+dHhyeF9jbWQpOworCisJCXJ4X3N0cmlkZSA9IG1pbl90KHNpemVfdCwgc3Ry aWRlLCBTWl81MTIpOworCisJCXJldCA9IG9wcy0+cmVhZF9kYXRhKHByaXYtPmludGYsIHByaXYt PnhmZXJfYnVmLCByeF9zdHJpZGUpOworCQl3aGlsZSAocmV0ID09IDApIHsKKwkJCS8qIElmIG5v IGRhdGEgeWV0LCB3YWl0IGFuZCByZXBlYXQgKi8KKwkJCXVzbGVlcF9yYW5nZSg1MDAwLCA1MTAw KTsKKwkJCXJldCA9IG9wcy0+cmVhZF9kYXRhKHByaXYtPmludGYsIHByaXYtPnhmZXJfYnVmLAor CQkJCQkgICAgIHJ4X3N0cmlkZSk7CisJCQlkZXZfZGJnKGRldiwgIldhaXRpbmcgZGF0YSByZWFk eSwgcmVhZDogJWRcbiIsIHJldCk7CisJCQlpZiAoIS0tdG91dCkgeworCQkJCWRldl9lcnIoZGV2 LCAiUmVhZCB0aW1lb3V0XG4iKTsKKwkJCQlyZXQgPSAtRVRJTUVET1VUOworCQkJCWdvdG8gZmFp bDsKKwkJCX0KKwkJfQorCisJCWlmIChyZXQgPCAwKQorCQkJZ290byBmYWlsOworCisJCXByaW50 X2hleF9kdW1wX2RlYnVnKCJSRDogIiwgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwKKwkJCQkg ICAgIHByaXYtPnhmZXJfYnVmLCByeF9zdHJpZGUsIDEpOworCQltZW1jcHkocnhfb2ZmcywgcHJp di0+eGZlcl9idWYsIHJldCk7CisJCXJ4X29mZnMgKz0gcmV0OworCisJCXJlbWFpbmluZyAtPSBz dHJpZGU7CisJCXR4X29mZnMgKz0gc3RyaWRlOworCQlkZXZfZGJnKGRldiwgIiVzOiBXUiByZW1h aW5zICV6dVxuIiwgX19mdW5jX18sIHJlbWFpbmluZyk7CisJfQorCisJcmV0ID0gMDsKKworZmFp bDoKKwlpZiAoc3BpLT5tb2RlICYgU1BJX0xPT1ApCisJCWZ0ZGlfc3BpX2xvb3BiYWNrX2NmZyhw cml2LCAwKTsKKworZXJyOgorCW9wcy0+dW5sb2NrKHByaXYtPmludGYpOworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9zcGlfdHgoc3RydWN0IGZ0ZGlfc3BpICpwcml2LCBjb25z dCB1OCAqdHhfZGF0YSwgc2l6ZV90IGxlbikKK3sKKwlzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVy ID0gcHJpdi0+bWFzdGVyOworCXNpemVfdCByZW1haW5pbmcsIHN0cmlkZTsKKwlpbnQgcmV0Owor CisJaWYgKCFsZW4pCisJCXJldHVybiAwOworCisJcHJpdi0+aW9wcy0+bG9jayhwcml2LT5pbnRm KTsKKworCXJlbWFpbmluZyA9IGxlbjsKKwlkbyB7CisJCXN0cmlkZSA9IG1pbl90KHNpemVfdCwg cmVtYWluaW5nLCBTWl82NEsgLSAzKTsKKworCQlwcml2LT54ZmVyX2J1ZlswXSA9IHByaXYtPnR4 X2NtZDsKKwkJcHJpdi0+eGZlcl9idWZbMV0gPSBzdHJpZGUgLSAxOworCQlwcml2LT54ZmVyX2J1 ZlsyXSA9IChzdHJpZGUgLSAxKSA+PiA4OworCisJCW1lbWNweSgmcHJpdi0+eGZlcl9idWZbM10s IHR4X2RhdGEsIHN0cmlkZSk7CisKKwkJcmV0ID0gcHJpdi0+aW9wcy0+d3JpdGVfZGF0YShwcml2 LT5pbnRmLCBwcml2LT54ZmVyX2J1ZiwKKwkJCQkJICAgICBzdHJpZGUgKyAzKTsKKwkJaWYgKHJl dCA8IDApIHsKKwkJCWRldl9kYmcoJm1hc3Rlci0+ZGV2LCAiJXM6IHR4IGZhaWxlZCAlZFxuIiwK KwkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCWdvdG8gZXJyOworCQl9CisJCWRldl9kYmcoJm1hc3Rl ci0+ZGV2LCAiJXM6ICV6dSBieXRlKHMpIGRvbmVcbiIsCisJCQlfX2Z1bmNfXywgc3RyaWRlKTsK KwkJcmVtYWluaW5nIC09IHN0cmlkZTsKKwl9IHdoaWxlIChyZW1haW5pbmcpOworCisJcmV0ID0g MDsKK2VycjoKKwlwcml2LT5pb3BzLT51bmxvY2socHJpdi0+aW50Zik7CisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIGludCBmdGRpX3NwaV9yeChzdHJ1Y3QgZnRkaV9zcGkgKnByaXYsIHU4ICpy eF9kYXRhLCBzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCBmdDIzMmhfaW50Zl9vcHMgKm9w cyA9IHByaXYtPmlvcHM7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlciA9IHByaXYtPm1hc3Rl cjsKKwlzaXplX3QgcmVtYWluaW5nLCBzdHJpZGU7CisJaW50IHJldCwgdG91dCA9IDEwOworCXZv aWQgKnJ4YnVmOworCisJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogQ01EIDB4JTAyeCwgbGVu ICV6dVxuIiwKKwkJX19mdW5jX18sIHByaXYtPnJ4X2NtZCwgbGVuKTsKKworCWlmICghbGVuKQor CQlyZXR1cm4gMDsKKworCXByaXYtPnhmZXJfYnVmWzBdID0gcHJpdi0+cnhfY21kOworCXByaXYt PnhmZXJfYnVmWzFdID0gbGVuIC0gMTsKKwlwcml2LT54ZmVyX2J1ZlsyXSA9IChsZW4gLSAxKSA+ PiA4OworCisJb3BzLT5sb2NrKHByaXYtPmludGYpOworCisJcmV0ID0gb3BzLT53cml0ZV9kYXRh KHByaXYtPmludGYsIHByaXYtPnhmZXJfYnVmLCAzKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBl cnI7CisKKwlyZW1haW5pbmcgPSBsZW47CisJcnhidWYgPSByeF9kYXRhOworCisJZG8geworCQlz dHJpZGUgPSBtaW5fdChzaXplX3QsIHJlbWFpbmluZywgU1pfNTEyKTsKKworCQlyZXQgPSBvcHMt PnJlYWRfZGF0YShwcml2LT5pbnRmLCBwcml2LT54ZmVyX2J1Ziwgc3RyaWRlKTsKKwkJaWYgKHJl dCA8IDApCisJCQlnb3RvIGVycjsKKworCQlpZiAoIXJldCkgeworCQkJZGV2X2RiZygmbWFzdGVy LT5kZXYsCisJCQkJIldhaXRpbmcgZm9yIGRhdGEgKHJlYWQgOiAlMDJYKSwgdG91dCAlZFxuIiwK KwkJCQkgcmV0LCB0b3V0KTsKKwkJCWlmICgtLXRvdXQpCisJCQkJY29udGludWU7CisKKwkJCWRl dl9kYmcoJm1hc3Rlci0+ZGV2LCAicmVhZCB0aW1lb3V0Li4uXG4iKTsKKwkJCXJldCA9IC1FVElN RURPVVQ7CisJCQlnb3RvIGVycjsKKwkJfQorCisJCW1lbWNweShyeGJ1ZiwgcHJpdi0+eGZlcl9i dWYsIHJldCk7CisKKwkJZGV2X2RiZygmbWFzdGVyLT5kZXYsICIlczogJWQgYnl0ZShzKVxuIiwg X19mdW5jX18sIHJldCk7CisJCXJ4YnVmICs9IHJldDsKKwkJcmVtYWluaW5nIC09IHJldDsKKwl9 IHdoaWxlIChyZW1haW5pbmcpOworCisJcmV0ID0gMDsKK2VycjoKKwlvcHMtPnVubG9jayhwcml2 LT5pbnRmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGZ0ZGlfc3BpX3RyYW5zZmVy X29uZShzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLAorCQkJCSBzdHJ1Y3Qgc3BpX21lc3NhZ2Ug Km1zZykKK3sKKwlzdHJ1Y3QgZnRkaV9zcGkgKnByaXYgPSBzcGlfY29udHJvbGxlcl9nZXRfZGV2 ZGF0YShtYXN0ZXIpOworCXN0cnVjdCBzcGlfZGV2aWNlICpzcGkgPSBtc2ctPnNwaTsKKwlzdHJ1 Y3Qgc3BpX3RyYW5zZmVyICp0OworCWJvb2wga2VlcF9jcyA9IGZhbHNlOworCWludCByZXQgPSAw OworCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW1zZy0+YWN0dWFsX2xlbmd0 aCA9IDA7CisJbXNnLT5zdGF0ZSA9IE5VTEw7CisJbXNnLT5zdGF0dXMgPSAwOworCisJaWYgKHBy aXYtPmxhc3RfbW9kZSAhPSBzcGktPm1vZGUpIHsKKwkJdTggc3BpX21vZGUgPSBzcGktPm1vZGUg JiAoU1BJX0NQT0wgfCBTUElfQ1BIQSk7CisJCXU4IHBpbnMgPSAwOworCisJCWRldl9kYmcoJm1h c3Rlci0+ZGV2LCAiJXM6IE1PREUgJWRcbiIsIF9fZnVuY19fLCBzcGktPm1vZGUpOworCQlpZiAo c3BpLT5tb2RlICYgU1BJX0xTQl9GSVJTVCkgeworCQkJc3dpdGNoIChzcGlfbW9kZSkgeworCQkJ Y2FzZSBTUElfTU9ERV8wOgorCQkJY2FzZSBTUElfTU9ERV8zOgorCQkJCXByaXYtPnR4X2NtZCA9 IFRYX0JZVEVTX0ZFX0xTQjsKKwkJCQlwcml2LT5yeF9jbWQgPSBSWF9CWVRFU19SRV9MU0I7CisJ CQkJYnJlYWs7CisJCQljYXNlIFNQSV9NT0RFXzE6CisJCQljYXNlIFNQSV9NT0RFXzI6CisJCQkJ cHJpdi0+dHhfY21kID0gVFhfQllURVNfUkVfTFNCOworCQkJCXByaXYtPnJ4X2NtZCA9IFJYX0JZ VEVTX0ZFX0xTQjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoc3Bp X21vZGUpIHsKKwkJCWNhc2UgU1BJX01PREVfMDoKKwkJCWNhc2UgU1BJX01PREVfMzoKKwkJCQlw cml2LT50eF9jbWQgPSBUWF9CWVRFU19GRV9NU0I7CisJCQkJcHJpdi0+cnhfY21kID0gUlhfQllU RVNfUkVfTVNCOworCQkJCWJyZWFrOworCQkJY2FzZSBTUElfTU9ERV8xOgorCQkJY2FzZSBTUElf TU9ERV8yOgorCQkJCXByaXYtPnR4X2NtZCA9IFRYX0JZVEVTX1JFX01TQjsKKwkJCQlwcml2LT5y eF9jbWQgPSBSWF9CWVRFU19GRV9NU0I7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlwcml2 LT50eHJ4X2NtZCA9IGZ0ZGlfc3BpX3R4cnhfYnl0ZV9jbWQoc3BpKTsKKworCQlzd2l0Y2ggKHNw aV9tb2RlKSB7CisJCWNhc2UgU1BJX01PREVfMjoKKwkJY2FzZSBTUElfTU9ERV8zOgorCQkJcGlu cyB8PSBTSzsKKwkJCWJyZWFrOworCQl9CisKKwkJcmV0ID0gcHJpdi0+aW9wcy0+Y2ZnX2J1c19w aW5zKHByaXYtPmludGYsIFNLIHwgRE8sIHBpbnMpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2 X2VycigmbWFzdGVyLT5kZXYsICJJTyBjZmcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVy biByZXQ7CisJCX0KKwkJcHJpdi0+bGFzdF9tb2RlID0gc3BpLT5tb2RlOworCX0KKworCWRldl9k YmcoJm1hc3Rlci0+ZGV2LCAiJXM6IG1vZGUgMHgleCwgQ01EIFJYL1RYIDB4JXgvMHgleFxuIiwK KwkJX19mdW5jX18sIHNwaS0+bW9kZSwgcHJpdi0+cnhfY21kLCBwcml2LT50eF9jbWQpOworCisJ ZnRkaV9zcGlfY2hpcHNlbGVjdChwcml2LCBzcGksIHNwaS0+bW9kZSAmIFNQSV9DU19ISUdIKTsK KworCXJldCA9IC1FSU5WQUw7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHQsICZtc2ctPnRyYW5z ZmVycywgdHJhbnNmZXJfbGlzdCkgeworCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBjc19j aGFuZ2UgJWQsIGNzICVkLCBsZW4gJWRcbiIsCisJCQlfX2Z1bmNfXywgdC0+Y3NfY2hhbmdlLCBz cGktPmNoaXBfc2VsZWN0LCB0LT5sZW4pOworCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiB0 eGIgMHglcCwgcnhiIDB4JXAsIGJwdyAlZFxuIiwKKwkJCV9fZnVuY19fLCB0LT50eF9idWYsIHQt PnJ4X2J1ZiwgdC0+Yml0c19wZXJfd29yZCk7CisKKwkJaWYgKHQtPnR4X2J1ZiAmJiB0LT5yeF9i dWYpCisJCQlyZXQgPSBmdGRpX3NwaV90eF9yeChwcml2LCBzcGksIHQpOworCQllbHNlIGlmICh0 LT50eF9idWYpCisJCQlyZXQgPSBmdGRpX3NwaV90eChwcml2LCB0LT50eF9idWYsIHQtPmxlbik7 CisJCWVsc2UgaWYgKHQtPnJ4X2J1ZikKKwkJCXJldCA9IGZ0ZGlfc3BpX3J4KHByaXYsIHQtPnJ4 X2J1ZiwgdC0+bGVuKTsKKworCQlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiB4ZmVyIHJldCAl ZFxuIiwgX19mdW5jX18sIHJldCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworCQltc2ctPmFj dHVhbF9sZW5ndGggKz0gdC0+bGVuOworCisJCWlmICh0LT5kZWxheV91c2VjcykgeworCQkJdTE2 IHVzID0gdC0+ZGVsYXlfdXNlY3M7CisKKwkJCWlmICh1cyA8PSAxMCkKKwkJCQl1ZGVsYXkodXMp OworCQkJZWxzZQorCQkJCXVzbGVlcF9yYW5nZSh1cywgdXMgKyBESVZfUk9VTkRfVVAodXMsIDEw KSk7CisJCX0KKworCQlpZiAoIXQtPmNzX2NoYW5nZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIExh c3QgdHJhbnNmZXIgd2l0aCBjc19jaGFuZ2Ugc2V0LCBzdG9wIGtlZXBpbmcgQ1MgKi8KKwkJaWYg KGxpc3RfaXNfbGFzdCgmdC0+dHJhbnNmZXJfbGlzdCwgJm1zZy0+dHJhbnNmZXJzKSkgeworCQkJ a2VlcF9jcyA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlmdGRpX3NwaV9jaGlwc2VsZWN0KHBy aXYsIHNwaSwgIShzcGktPm1vZGUgJiBTUElfQ1NfSElHSCkpOworCQl1c2xlZXBfcmFuZ2UoMTAs IDE1KTsKKwkJZnRkaV9zcGlfY2hpcHNlbGVjdChwcml2LCBzcGksIHNwaS0+bW9kZSAmIFNQSV9D U19ISUdIKTsKKwl9CisKKwlkZXZfZGJnKCZtYXN0ZXItPmRldiwgIiVzOiBzdGF0dXMgJWRcbiIs IF9fZnVuY19fLCByZXQpOworCW1zZy0+c3RhdHVzID0gcmV0OworCXNwaV9maW5hbGl6ZV9jdXJy ZW50X21lc3NhZ2UobWFzdGVyKTsKKworCWlmICgha2VlcF9jcykKKwkJZnRkaV9zcGlfY2hpcHNl bGVjdChwcml2LCBzcGksICEoc3BpLT5tb2RlICYgU1BJX0NTX0hJR0gpKTsKKworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyBpbnQgZnRkaV9tcHNzZV9pbml0KHN0cnVjdCBmdGRpX3NwaSAqcHJp dikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gcHJpdi0+cGRldjsKKwlpbnQg cmV0OworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAiTVBTU0UgaW5pdFxuIik7CisKKwkvKiBTZXR1 cCBhbmQgc2VuZCBvZmYgdGhlIEhpLVNwZWVkIHNwZWNpZmljIGNvbW1hbmRzIGZvciB0aGUgRlR4 MjMySCAqLworCXByaXYtPnhmZXJfYnVmWzBdID0gRElTX0RJVl81OyAgICAgIC8qIFVzZSA2ME1I eiBtYXN0ZXIgY2xvY2sgKi8KKwlwcml2LT54ZmVyX2J1ZlsxXSA9IERJU19BREFQVElWRTsgICAv KiBUdXJuIG9mZiBhZGFwdGl2ZSBjbG9ja2luZyAqLworCXByaXYtPnhmZXJfYnVmWzJdID0gRElT XzNfUEhBU0U7ICAgIC8qIERpc2FibGUgdGhyZWUtcGhhc2UgY2xvY2tpbmcgKi8KKworCXByaXYt PmlvcHMtPmxvY2socHJpdi0+aW50Zik7CisKKwlyZXQgPSBwcml2LT5pb3BzLT53cml0ZV9kYXRh KHByaXYtPmludGYsIHByaXYtPnhmZXJfYnVmLCAzKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJDbGsgY2ZnIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCXByaXYtPmlv cHMtPnVubG9jayhwcml2LT5pbnRmKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlwcml2LT54ZmVy X2J1ZlswXSA9IFRDS19ESVZJU09SOworCXByaXYtPnhmZXJfYnVmWzFdID0gZGl2X3ZhbHVlKDYw MDAwMDAwKTsKKwlwcml2LT54ZmVyX2J1ZlsyXSA9IGRpdl92YWx1ZSg2MDAwMDAwMCkgPj4gODsK KwlkZXZfZGJnKCZwZGV2LT5kZXYsICJUQ0tfRElWSVNPUjogMHglMDR4IDB4JTA0eFxuIiwKKwkJ cHJpdi0+eGZlcl9idWZbMV0sIHByaXYtPnhmZXJfYnVmWzJdKTsKKworCXJldCA9IHByaXYtPmlv cHMtPndyaXRlX2RhdGEocHJpdi0+aW50ZiwgcHJpdi0+eGZlcl9idWYsIDMpOworCWlmIChyZXQg PCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNsayBjZmcgZmFpbGVkOiAlZFxuIiwgcmV0 KTsKKwkJcHJpdi0+aW9wcy0+dW5sb2NrKHByaXYtPmludGYpOworCQlyZXR1cm4gcmV0OworCX0K KworCXByaXYtPmlvcHMtPnVubG9jayhwcml2LT5pbnRmKTsKKworCXJldCA9IHByaXYtPmlvcHMt PmNmZ19idXNfcGlucyhwcml2LT5pbnRmLCBTSyB8IERPLCAwKTsKKwlpZiAocmV0IDwgMCkgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBpbml0IFNQSSBidXMgcGluczogJWRcbiIsIHJl dCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnRk aV9zcGlfaW5pdF9pbyhzdHJ1Y3Qgc3BpX21hc3RlciAqbWFzdGVyLCBpbnQgY3MpCit7CisJc3Ry dWN0IGZ0ZGlfc3BpICpwcml2ID0gc3BpX2NvbnRyb2xsZXJfZ2V0X2RldmRhdGEobWFzdGVyKTsK Kwljb25zdCBzdHJ1Y3QgbXBzc2Vfc3BpX3BsYXRmb3JtX2RhdGEgKnBkOworCXN0cnVjdCBwbGF0 Zm9ybV9kZXZpY2UgKnBkZXYgPSBwcml2LT5wZGV2OworCXN0cnVjdCBncGlvZF9sb29rdXBfdGFi bGUgKmxvb2t1cDsKKwlzaXplX3QgbG9va3VwX3NpemU7CisJY2hhciAqbGFiZWw7CisJaW50IGks IHNpemU7CisKKwlwZCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXNpemUgPSBwZC0+aW9f ZGF0YV9sZW4gKyAxOworCisJbG9va3VwX3NpemUgPSBzaXplb2YoKmxvb2t1cCkgKyBzaXplICog c2l6ZW9mKHN0cnVjdCBncGlvZF9sb29rdXApOworCWxvb2t1cCA9IGRldm1fa3phbGxvYygmcGRl di0+ZGV2LCBsb29rdXBfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsb29rdXApCisJCXJldHVy biAtRU5PTUVNOworCisJbG9va3VwLT5kZXZfaWQgPSBkZXZtX2thc3ByaW50ZigmcGRldi0+ZGV2 LCBHRlBfS0VSTkVMLCAic3BpJWQuJWQiLAorCQkJCQltYXN0ZXItPmJ1c19udW0sIGNzKTsKKwlp ZiAoIWxvb2t1cC0+ZGV2X2lkKSB7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbG9va3VwKTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWRldl9kYmcoJnBkZXYtPmRldiwgIkxPT0tVUCBJRCAn JXMnXG4iLCBsb29rdXAtPmRldl9pZCk7CisKKwlsYWJlbCA9IGRldm1fa2FzcHJpbnRmKCZwZGV2 LT5kZXYsIEdGUF9LRVJORUwsICJmdGRpLW1wc3NlLWdwaW8uJWQiLAorCQkJICAgICAgIHBkZXYt PmlkKTsKKwlpZiAoIWxhYmVsKSB7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgKHZvaWQgKils b29rdXAtPmRldl9pZCk7CisJCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgbG9va3VwKTsKKwkJcmV0 dXJuIC1FTk9NRU07CisJfQorCisJZm9yIChpID0gMDsgaSA8IHBkLT5pb19kYXRhX2xlbjsgaSsr KSB7CisJCWRldl9kYmcoJnBkZXYtPmRldiwgImNvbl9pZDogJyVzJyBpZHg6ICVkLCBmbGFnczog MHgleFxuIiwKKwkJCXBkLT5pb19kYXRhW2ldLmNvbl9pZCwgcGQtPmlvX2RhdGFbaV0uaWR4LAor CQkJcGQtPmlvX2RhdGFbaV0uZmxhZ3MpOworCQlsb29rdXAtPnRhYmxlW2ldLmNoaXBfbGFiZWwg PSBsYWJlbDsKKwkJbG9va3VwLT50YWJsZVtpXS5jaGlwX2h3bnVtID0gcGQtPmlvX2RhdGFbaV0u aWR4OworCQlsb29rdXAtPnRhYmxlW2ldLmlkeCA9IDA7CisJCWxvb2t1cC0+dGFibGVbaV0uY29u X2lkID0gcGQtPmlvX2RhdGFbaV0uY29uX2lkOworCQlsb29rdXAtPnRhYmxlW2ldLmZsYWdzID0g cGQtPmlvX2RhdGFbaV0uZmxhZ3M7CisJfQorCisJcHJpdi0+bG9va3VwW2NzXSA9IGxvb2t1cDsK KwlncGlvZF9hZGRfbG9va3VwX3RhYmxlKGxvb2t1cCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgZnRkaV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlj b25zdCBzdHJ1Y3QgbXBzc2Vfc3BpX3BsYXRmb3JtX2RhdGEgKnBkOworCXN0cnVjdCBkZXZpY2Ug KmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNwaV9tYXN0ZXIgKm1hc3RlcjsKKwlzdHJ1Y3Qg ZnRkaV9zcGkgKnByaXY7CisJc3RydWN0IGdwaW9fZGVzYyAqZGVzYzsKKwlpbnQgbnVtX2NzLCBt YXhfY3MgPSAwOworCWludCBpLCByZXQ7CisKKwlwZCA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlp ZiAoIXBkKSB7CisJCWRldl9lcnIoZGV2LCAiTWlzc2luZyBwbGF0Zm9ybSBkYXRhLlxuIik7CisJ CXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcGQtPm9wcyB8fAorCSAgICAhcGQtPm9wcy0+ cmVhZF9kYXRhIHx8ICFwZC0+b3BzLT53cml0ZV9kYXRhIHx8CisJICAgICFwZC0+b3BzLT5zZXRf Yml0bW9kZSB8fCAhcGQtPm9wcy0+c2V0X2JhdWRyYXRlIHx8CisJICAgICFwZC0+b3BzLT5kaXNh YmxlX2JpdGJhbmcgfHwgIXBkLT5vcHMtPmNmZ19idXNfcGlucykKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwkvKiBGaW5kIG1heC4gc2xhdmUgY2hpcHNlbGVjdCBudW1iZXIgKi8KKwludW1fY3MgPSBw ZC0+c3BpX2luZm9fbGVuOworCWZvciAoaSA9IDA7IGkgPCBudW1fY3M7IGkrKykgeworCQlpZiAo bWF4X2NzIDwgcGQtPnNwaV9pbmZvW2ldLmNoaXBfc2VsZWN0KQorCQkJbWF4X2NzID0gcGQtPnNw aV9pbmZvW2ldLmNoaXBfc2VsZWN0OworCX0KKworCWlmIChtYXhfY3MgPiAxMikgeworCQlkZXZf ZXJyKGRldiwgIkludmFsaWQgbWF4IENTIGluIHBsYXRmb3JtIGRhdGE6ICVkXG4iLCBtYXhfY3Mp OworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZGV2X2RiZyhkZXYsICJDUyBjb3VudCAlZCwgbWF4 IENTICVkXG4iLCBudW1fY3MsIG1heF9jcyk7CisJbWF4X2NzICs9IDE7IC8qIGluY2x1ZGluZyBD UzAgKi8KKworCW1hc3RlciA9IHNwaV9hbGxvY19tYXN0ZXIoJnBkZXYtPmRldiwgc2l6ZW9mKCpw cml2KSk7CisJaWYgKCFtYXN0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJcGxhdGZvcm1fc2V0 X2RydmRhdGEocGRldiwgbWFzdGVyKTsKKworCXByaXYgPSBzcGlfY29udHJvbGxlcl9nZXRfZGV2 ZGF0YShtYXN0ZXIpOworCXByaXYtPm1hc3RlciA9IG1hc3RlcjsKKwlwcml2LT5wZGV2ID0gcGRl djsKKwlwcml2LT5pbnRmID0gdG9fdXNiX2ludGVyZmFjZShkZXYtPnBhcmVudCk7CisJcHJpdi0+ aW9wcyA9IHBkLT5vcHM7CisKKwltYXN0ZXItPmJ1c19udW0gPSAtMTsKKwltYXN0ZXItPm1vZGVf Yml0cyA9IFNQSV9DUE9MIHwgU1BJX0NQSEEgfCBTUElfTE9PUCB8CisJCQkgICAgU1BJX0NTX0hJ R0ggfCBTUElfTFNCX0ZJUlNUOworCW1hc3Rlci0+bnVtX2NoaXBzZWxlY3QgPSBtYXhfY3M7CisJ bWFzdGVyLT5taW5fc3BlZWRfaHogPSA0NTA7CisJbWFzdGVyLT5tYXhfc3BlZWRfaHogPSAzMDAw MDAwMDsKKwltYXN0ZXItPmJpdHNfcGVyX3dvcmRfbWFzayA9IFNQSV9CUFdfTUFTSyg4KTsKKwlt YXN0ZXItPnRyYW5zZmVyX29uZV9tZXNzYWdlID0gZnRkaV9zcGlfdHJhbnNmZXJfb25lOworCW1h c3Rlci0+YXV0b19ydW50aW1lX3BtID0gZmFsc2U7CisKKwlwcml2LT5jc19ncGlvcyA9IGRldm1f a2NhbGxvYygmbWFzdGVyLT5kZXYsIG1heF9jcywgc2l6ZW9mKGRlc2MpLAorCQkJCSAgICAgIEdG UF9LRVJORUwpOworCWlmICghcHJpdi0+Y3NfZ3Bpb3MpIHsKKwkJc3BpX2NvbnRyb2xsZXJfcHV0 KG1hc3Rlcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1f Y3M7IGkrKykgeworCQlpbnQgaWR4ID0gcGQtPnNwaV9pbmZvW2ldLmNoaXBfc2VsZWN0OworCisJ CWRldl9kYmcoJnBkZXYtPmRldiwgIkNTIG51bTogJWRcbiIsIGlkeCk7CisJCWRlc2MgPSBkZXZt X2dwaW9kX2dldF9pbmRleCgmcHJpdi0+cGRldi0+ZGV2LCAic3BpLWNzIiwKKwkJCQkJICAgIGks IEdQSU9EX09VVF9MT1cpOworCQlpZiAoSVNfRVJSKGRlc2MpKSB7CisJCQlyZXQgPSBQVFJfRVJS KGRlc2MpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ1MgJWQgZ3Bpb2QgZXJyOiAlZFxuIiwg aSwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaXYtPmNzX2dwaW9zW2lkeF0gPSBkZXNj OworCX0KKworCXJldCA9IHNwaV9yZWdpc3Rlcl9jb250cm9sbGVyKG1hc3Rlcik7CisJaWYgKHJl dCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHNwaSBt YXN0ZXJcbiIpOworCQlzcGlfY29udHJvbGxlcl9wdXQobWFzdGVyKTsKKwkJcmV0dXJuIHJldDsK Kwl9CisKKwlyZXQgPSBwcml2LT5pb3BzLT5zZXRfYml0bW9kZShwcml2LT5pbnRmLCAweDAwLCBC SVRNT0RFX01QU1NFKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJG YWlsZWQgdG8gc2V0IE1QU1NFIG1vZGVcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwlwcml2LT5s YXN0X21vZGUgPSAweGZmZmY7CisKKwlyZXQgPSBmdGRpX21wc3NlX2luaXQocHJpdik7CisJaWYg KHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTVBTU0UgaW5pdCBmYWlsZWRcbiIp OworCQlnb3RvIGVycjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcGQtPnNwaV9pbmZvX2xlbjsg aSsrKSB7CisJCXN0cnVjdCBzcGlfZGV2aWNlICpzZGV2OworCQlpbnQgY3M7CisKKwkJZGV2X2Ri ZygmcGRldi0+ZGV2LCAic2xhdmU6ICclcycsIENTOiAlZFxuIiwKKwkJCXBkLT5zcGlfaW5mb1tp XS5tb2RhbGlhcywgcGQtPnNwaV9pbmZvW2ldLmNoaXBfc2VsZWN0KTsKKwkJcmV0ID0gZnRkaV9z cGlfaW5pdF9pbyhtYXN0ZXIsIHBkLT5zcGlfaW5mb1tpXS5jaGlwX3NlbGVjdCk7CisJCWlmIChy ZXQgPCAwKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiQ2FuJ3QgYWRkIHNsYXZlIElPOiAl ZFxuIiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXNkZXYgPSBzcGlfbmV3X2RldmljZSht YXN0ZXIsICZwZC0+c3BpX2luZm9baV0pOworCQlpZiAoIXNkZXYpIHsKKwkJCWNzID0gcGQtPnNw aV9pbmZvW2ldLmNoaXBfc2VsZWN0OworCQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgIkNhbid0IGFk ZCBzbGF2ZSAnJXMnLCBDUyAlZFxuIiwKKwkJCQkgcGQtPnNwaV9pbmZvW2ldLm1vZGFsaWFzLCBj cyk7CisJCQlpZiAocHJpdi0+bG9va3VwW2NzXSkgeworCQkJCWdwaW9kX3JlbW92ZV9sb29rdXBf dGFibGUocHJpdi0+bG9va3VwW2NzXSk7CisJCQkJcHJpdi0+bG9va3VwW2NzXSA9IE5VTEw7CisJ CQl9CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShw ZGV2LCBOVUxMKTsKKwlzcGlfdW5yZWdpc3Rlcl9jb250cm9sbGVyKG1hc3Rlcik7CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBmdGRpX3NwaV9zbGF2ZV9yZWxlYXNlKHN0cnVjdCBkZXZp Y2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdG9fc3Bp X2RldmljZShkZXYpOworCXN0cnVjdCBmdGRpX3NwaSAqcHJpdiA9IGRhdGE7CisJaW50IGNzID0g c3BpLT5jaGlwX3NlbGVjdDsKKworCWRldl9kYmcoZGV2LCAiJXM6IHJlbW92ZSBDUyAlZFxuIiwg X19mdW5jX18sIGNzKTsKKwlzcGlfdW5yZWdpc3Rlcl9kZXZpY2UodG9fc3BpX2RldmljZShkZXYp KTsKKworCWlmIChwcml2LT5sb29rdXBbY3NdKQorCQlncGlvZF9yZW1vdmVfbG9va3VwX3RhYmxl KHByaXYtPmxvb2t1cFtjc10pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0ZGlfc3Bp X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBzcGlfbWFz dGVyICptYXN0ZXI7CisJc3RydWN0IGZ0ZGlfc3BpICpwcml2OworCisJbWFzdGVyID0gcGxhdGZv cm1fZ2V0X2RydmRhdGEocGRldik7CisJcHJpdiA9IHNwaV9jb250cm9sbGVyX2dldF9kZXZkYXRh KG1hc3Rlcik7CisKKwlkZXZpY2VfZm9yX2VhY2hfY2hpbGQoJm1hc3Rlci0+ZGV2LCBwcml2LCBm dGRpX3NwaV9zbGF2ZV9yZWxlYXNlKTsKKworCXNwaV91bnJlZ2lzdGVyX2NvbnRyb2xsZXIobWFz dGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnRk aV9zcGlfZHJpdmVyID0geworCS5kcml2ZXIubmFtZQk9ICJmdGRpLW1wc3NlLXNwaSIsCisJLnBy b2JlCQk9IGZ0ZGlfc3BpX3Byb2JlLAorCS5yZW1vdmUJCT0gZnRkaV9zcGlfcmVtb3ZlLAorfTsK K21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZnRkaV9zcGlfZHJpdmVyKTsKKworTU9EVUxFX0FMSUFT KCJwbGF0Zm9ybTpmdGRpLW1wc3NlLXNwaSIpOworTU9EVUxFX0FVVEhPUigiQW5hdG9saWogR3Vz dHNjaGluIDxhZ3VzdEBkZW54LmRlIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZUREkgTVBTU0Ug U1BJIG1hc3RlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsK