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/4] dmaengine: mtk_uart_dma: add Mediatek uart DMA support From: Long Cheng Message-Id: <1537425673-18807-3-git-send-email-long.cheng@mediatek.com> Date: Thu, 20 Sep 2018 14:41:11 +0800 To: Vinod Koul , Rob Herring , Mark Rutland Cc: Matthias Brugger , Dan Williams , Greg Kroah-Hartman , Jiri Slaby , Ed Blake , Long Cheng , dmaengine@vger.kernel.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, srv_heupstream@mediatek.com, Yingjoe Chen , YT Shen List-ID: SW4gRE1BIGVuZ2luZSBmcmFtZXdvcmssIGFkZCA4MjUwIG10ayBkbWEgdG8gc3VwcG9ydCBpdC4K ClNpZ25lZC1vZmYtYnk6IExvbmcgQ2hlbmcgPGxvbmcuY2hlbmdAbWVkaWF0ZWsuY29tPgotLS0K IGRyaXZlcnMvZG1hLzgyNTBfbXRrX2RtYS5jIHwgMTA0OSArKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9kbWEvS2NvbmZpZyAgICAgICAgfCAgIDEx ICsKIGRyaXZlcnMvZG1hL01ha2VmaWxlICAgICAgIHwgICAgMSArCiAzIGZpbGVzIGNoYW5nZWQs IDEwNjEgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZG1hLzgyNTBf bXRrX2RtYS5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvODI1MF9tdGtfZG1hLmMgYi9kcml2 ZXJzL2RtYS84MjUwX210a19kbWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5hMDc4NDRlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9kbWEvODI1MF9tdGtfZG1hLmMK QEAgLTAsMCArMSwxMDQ5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAor LyoKKyAqIE1lZGlhdGVrIDgyNTAgRE1BIGRyaXZlci4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIw MTggTWVkaWFUZWsgSW5jLgorICogQXV0aG9yOiBMb25nIENoZW5nIDxsb25nLmNoZW5nQG1lZGlh dGVrLmNvbT4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICI4MjUwLW10ay1kbWE6ICIgZm10 CisjZGVmaW5lIERSVl9OQU1FICAgICI4MjUwLW10ay1kbWEiCisKKyNpbmNsdWRlIDxsaW51eC9j bGsuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2lu ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJy Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5o PgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNp bmNsdWRlIDxsaW51eC9vZl9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1l Lmg+CisKKyNpbmNsdWRlICJ2aXJ0LWRtYS5oIgorCisjZGVmaW5lIE1US19TRE1BX1JFUVVFU1RT CTEyNworI2RlZmluZSBNVEtfU0RNQV9DSEFOTkVMUwkoQ09ORklHX1NFUklBTF84MjUwX05SX1VB UlRTICogMikKKworI2RlZmluZSBWRkZfUlhfSU5UX0ZMQUdfQ0xSX0IJKEJJVCgwVSkgfCBCSVQo MVUpKQorI2RlZmluZSBWRkZfVFhfSU5UX0ZMQUdfQ0xSX0IJMAorI2RlZmluZSBWRkZfUlhfSU5U X0VOMF9CCUJJVCgwVSkJLypyeCB2YWxpZCBzaXplID49ICB2ZmYgdGhyZSAqLworI2RlZmluZSBW RkZfUlhfSU5UX0VOMV9CCUJJVCgxVSkKKyNkZWZpbmUgVkZGX1RYX0lOVF9FTl9CCQlCSVQoMFUp CS8qdHggbGVmdCBzaXplID49IHZmZiB0aHJlICovCisjZGVmaW5lIFZGRl9JTlRfRU5fQ0xSX0IJ MAorI2RlZmluZSBWRkZfV0FSTV9SU1RfQgkJQklUKDBVKQorI2RlZmluZSBWRkZfRU5fQgkJQklU KDBVKQorI2RlZmluZSBWRkZfU1RPUF9CCQlCSVQoMFUpCisjZGVmaW5lIFZGRl9TVE9QX0NMUl9C CQkwCisjZGVmaW5lIFZGRl9GTFVTSF9CCQlCSVQoMFUpCisjZGVmaW5lIFZGRl9GTFVTSF9DTFJf QgkJMAorI2RlZmluZSBWRkZfNEdfU1VQUE9SVF9CCUJJVCgwVSkKKyNkZWZpbmUgVkZGXzRHX1NV UFBPUlRfQ0xSX0IJMAorCisvKiBpbnRlcnJ1cHQgdHJpZ2dlciBsZXZlbCBmb3IgdHggKi8KKyNk ZWZpbmUgVkZGX1RYX1RIUkUobikJCSgobikgKiA3IC8gOCkKKy8qIGludGVycnVwdCB0cmlnZ2Vy IGxldmVsIGZvciByeCAqLworI2RlZmluZSBWRkZfUlhfVEhSRShuKQkJKChuKSAqIDMgLyA0KQor CisjZGVmaW5lIE1US19ETUFfUklOR19TSVpFCTB4ZmZmZlUKKy8qIGludmVydCB0aGlzIGJpdCB3 aGVuIHdyYXAgcmluZyBoZWFkIGFnYWluKi8KKyNkZWZpbmUgTVRLX0RNQV9SSU5HX1dSQVAJMHgx MDAwMFUKKworc3RydWN0IG10a19kbWFkZXYgeworCXN0cnVjdCBkbWFfZGV2aWNlIGRkZXY7CisJ dm9pZCBfX2lvbWVtICptZW1fYmFzZVtNVEtfU0RNQV9DSEFOTkVMU107CisJc3BpbmxvY2tfdCBs b2NrOyAvKiBkbWEgZGV2IGxvY2sgKi8KKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFzazsKKwlz dHJ1Y3QgbGlzdF9oZWFkIHBlbmRpbmc7CisJc3RydWN0IGNsayAqY2xrOworCXVuc2lnbmVkIGlu dCBkbWFfcmVxdWVzdHM7CisJYm9vbCBzdXBwb3J0XzMzYml0czsKKwl1bnNpZ25lZCBpbnQgZG1h X2lycVtNVEtfU0RNQV9DSEFOTkVMU107CisJc3RydWN0IG10a19jaGFuICpsY2hfbWFwW01US19T RE1BX0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBtdGtfY2hhbiB7CisJc3RydWN0IHZpcnRfZG1h X2NoYW4gdmM7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBkbWFfc2xhdmVfY29u ZmlnCWNmZzsKKwl2b2lkIF9faW9tZW0gKmNoYW5uZWxfYmFzZTsKKwlzdHJ1Y3QgbXRrX2RtYV9k ZXNjICpkZXNjOworCisJYm9vbCBwYXVzZWQ7CisJYm9vbCByZXF1ZXN0ZWQ7CisKKwl1bnNpZ25l ZCBpbnQgZG1hX3NpZzsKKwl1bnNpZ25lZCBpbnQgZG1hX2NoOworCXVuc2lnbmVkIGludCBzZ2lk eDsKKwl1bnNpZ25lZCBpbnQgcmVtYWluX3NpemU7CisJdW5zaWduZWQgaW50IHJ4X3B0cjsKKwor CS8qc3luYyovCisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsJLyogZG1hIHRyYW5zZmVyIGRvbmUg Ki8KKwlzcGlubG9ja190IGxvY2s7IC8qIGNoYW5uZWwgbG9jayAqLworCWF0b21pY190IGxvb3Bj bnQ7CisJYXRvbWljX3QgZW50cnk7CQkvKiBlbnRyeSBjb3VudCAqLworfTsKKworc3RydWN0IG10 a19kbWFfc2cgeworCWRtYV9hZGRyX3QgYWRkcjsKKwl1bnNpZ25lZCBpbnQgZW47CQkvKiBudW1i ZXIgb2YgZWxlbWVudHMgKDI0LWJpdCkgKi8KKwl1bnNpZ25lZCBpbnQgZm47CQkvKiBudW1iZXIg b2YgZnJhbWVzICgxNi1iaXQpICovCit9OworCitzdHJ1Y3QgbXRrX2RtYV9kZXNjIHsKKwlzdHJ1 Y3QgdmlydF9kbWFfZGVzYyB2ZDsKKwllbnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOwor CWRtYV9hZGRyX3QgZGV2X2FkZHI7CisKKwl1bnNpZ25lZCBpbnQgc2dsZW47CisJc3RydWN0IG10 a19kbWFfc2cgc2dbMF07Cit9OworCitlbnVtIHsKKwlWRkZfSU5UX0ZMQUcJCT0gMHgwMCwKKwlW RkZfSU5UX0VOCQk9IDB4MDQsCisJVkZGX0VOCQkJPSAweDA4LAorCVZGRl9SU1QJCQk9IDB4MGMs CisJVkZGX1NUT1AJCT0gMHgxMCwKKwlWRkZfRkxVU0gJCT0gMHgxNCwKKwlWRkZfQUREUgkJPSAw eDFjLAorCVZGRl9MRU4JCQk9IDB4MjQsCisJVkZGX1RIUkUJCT0gMHgyOCwKKwlWRkZfV1BUCQkJ PSAweDJjLAorCVZGRl9SUFQJCQk9IDB4MzAsCisJLypUWDogdGhlIGJ1ZmZlciBzaXplIEhXIGNh biByZWFkLiBSWDogdGhlIGJ1ZmZlciBzaXplIFNXIGNhbiByZWFkLiovCisJVkZGX1ZBTElEX1NJ WkUJCT0gMHgzYywKKwkvKlRYOiB0aGUgYnVmZmVyIHNpemUgU1cgY2FuIHdyaXRlLiBSWDogdGhl IGJ1ZmZlciBzaXplIEhXIGNhbiB3cml0ZS4qLworCVZGRl9MRUZUX1NJWkUJCT0gMHg0MCwKKwlW RkZfREVCVUdfU1RBVFVTCT0gMHg1MCwKKwlWRkZfNEdfU1VQUE9SVAkJPSAweDU0LAorfTsKKwor c3RhdGljIGJvb2wgbXRrX2RtYV9maWx0ZXJfZm4oc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lk ICpwYXJhbSk7CitzdGF0aWMgc3RydWN0IG9mX2RtYV9maWx0ZXJfaW5mbyBtdGtfZG1hX2luZm8g PSB7CisJLmZpbHRlcl9mbiA9IG10a19kbWFfZmlsdGVyX2ZuLAorfTsKKworc3RhdGljIGlubGlu ZSBzdHJ1Y3QgbXRrX2RtYWRldiAqdG9fbXRrX2RtYV9kZXYoc3RydWN0IGRtYV9kZXZpY2UgKmQp Cit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihkLCBzdHJ1Y3QgbXRrX2RtYWRldiwgZGRldik7Cit9 CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG10a19jaGFuICp0b19tdGtfZG1hX2NoYW4oc3RydWN0 IGRtYV9jaGFuICpjKQoreworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IG10a19jaGFu LCB2Yy5jaGFuKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXRrX2RtYV9kZXNjICp0b19t dGtfZG1hX2Rlc2MKKwkoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICp0KQoreworCXJl dHVybiBjb250YWluZXJfb2YodCwgc3RydWN0IG10a19kbWFfZGVzYywgdmQudHgpOworfQorCitz dGF0aWMgdm9pZCBtdGtfZG1hX2NoYW5fd3JpdGUoc3RydWN0IG10a19jaGFuICpjLAorCQkJICAg ICAgIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwg Yy0+Y2hhbm5lbF9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtdGtfZG1h X2NoYW5fcmVhZChzdHJ1Y3QgbXRrX2NoYW4gKmMsIHVuc2lnbmVkIGludCByZWcpCit7CisJcmV0 dXJuIHJlYWRsKGMtPmNoYW5uZWxfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19k bWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZCkKK3sKKwlzdHJ1Y3QgZG1hX2No YW4gKmNoYW4gPSB2ZC0+dHguY2hhbjsKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfZG1h X2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZjLT52Yy5sb2NrLCBmbGFncyk7CisJaWYgKGMtPmRlc2MgJiYgYy0+Y2ZnLmRpcmVjdGlvbiA9 PSBETUFfREVWX1RPX01FTSkKKwkJYXRvbWljX2RlYygmYy0+ZW50cnkpOworCisJa2ZyZWUoYy0+ ZGVzYyk7CisJYy0+ZGVzYyA9IE5VTEw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYy0+dmMu bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IG10a19kbWFfY2xrX2VuYWJsZShzdHJ1Y3Qg bXRrX2RtYWRldiAqbXRrZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gY2xrX3ByZXBhcmVfZW5h YmxlKG10a2QtPmNsayk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG10a2QtPmRkZXYuZGV2LCAi Q291bGRuJ3QgZW5hYmxlIHRoZSBjbG9ja1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfY2xrX2Rpc2FibGUoc3RydWN0IG10a19k bWFkZXYgKm10a2QpCit7CisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKG10a2QtPmNsayk7Cit9CisK K3N0YXRpYyB2b2lkIG10a19kbWFfcmVtb3ZlX3ZpcnRfbGlzdChkbWFfY29va2llX3QgY29va2ll LAorCQkJCSAgICAgc3RydWN0IHZpcnRfZG1hX2NoYW4gKnZjKQoreworCXN0cnVjdCB2aXJ0X2Rt YV9kZXNjICp2ZDsKKworCWlmIChsaXN0X2VtcHR5KCZ2Yy0+ZGVzY19pc3N1ZWQpID09IDApIHsK KwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2ZCwgJnZjLT5kZXNjX2lzc3VlZCwgbm9kZSkgeworCQkJ aWYgKGNvb2tpZSA9PSB2ZC0+dHguY29va2llKSB7CisJCQkJSU5JVF9MSVNUX0hFQUQoJnZjLT5k ZXNjX2lzc3VlZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lk IG10a19kbWFfdHhfZmx1c2goc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBtdGtf Y2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKworCWlmIChtdGtfZG1hX2NoYW5fcmVh ZChjLCBWRkZfRkxVU0gpID09IDBVKSB7CisJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfRkxV U0gsIFZGRl9GTFVTSF9CKTsKKwkJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmMtPmxvb3BjbnQp KQorCQkJY29tcGxldGUoJmMtPmRvbmUpOworCX0KK30KKworLyoKKyAqIGNoZWNrIHdoZXRoZXIg dGhlIGRtYSBmbHVzaCBvcGVyYXRpb24gaXMgZmluaXNoZWQgb3Igbm90LgorICogcmV0dXJuIDAg Zm9yIGZsdXNoIHN1Y2Nlc3MuCisgKiByZXR1cm4gb3RoZXJzIGZvciBmbHVzaCB0aW1lb3V0Lgor ICovCitzdGF0aWMgaW50IG10a19kbWFfY2hlY2tfZmx1c2hfcmVzdWx0KHN0cnVjdCBkbWFfY2hh biAqY2hhbikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQsIGVuZDsKKwlzdHJ1Y3QgbXRrX2No YW4gKmMgPSB0b19tdGtfZG1hX2NoYW4oY2hhbik7CisKKwlzdGFydCA9IGt0aW1lX3RvX3RpbWVz cGVjKGt0aW1lX2dldCgpKTsKKworCXdoaWxlICgobXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX0ZM VVNIKSAmIFZGRl9GTFVTSF9CKSA9PSBWRkZfRkxVU0hfQikgeworCQllbmQgPSBrdGltZV90b190 aW1lc3BlYyhrdGltZV9nZXQoKSk7CisJCWlmICgoZW5kLnR2X3NlYyAtIHN0YXJ0LnR2X3NlYykg PiAxIHx8CisJCSAgICAoKGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWMpID09IDEgJiYKKwkJICAg ICAgZW5kLnR2X25zZWMgPiBzdGFydC50dl9uc2VjKSkgeworCQkJZGV2X2VycihjaGFuLT5kZXZp Y2UtPmRldiwKKwkJCQkiW0RNQV0gUG9sbGluZyBmbHVzaCB0aW1lb3V0XG4iKTsKKwkJCXJldHVy biAtMTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtdGtfZG1hX3R4 X3dyaXRlKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMgPSB0 b19tdGtfZG1hX2NoYW4oY2hhbik7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2QgPSB0b19tdGtf ZG1hX2RldihjaGFuLT5kZXZpY2UpOworCXVuc2lnbmVkIGludCB0eGNvdW50ID0gYy0+cmVtYWlu X3NpemU7CisJdW5zaWduZWQgaW50IGxlbiwgc2VuZCwgbGVmdCwgd3B0LCB3cmFwOworCisJaWYg KGF0b21pY19pbmNfcmV0dXJuKCZjLT5lbnRyeSkgPiAxKSB7CisJCWlmICh2Y2hhbl9pc3N1ZV9w ZW5kaW5nKCZjLT52YykgJiYgIWMtPmRlc2MpIHsKKwkJCXNwaW5fbG9jaygmbXRrZC0+bG9jayk7 CisJCQlsaXN0X2FkZF90YWlsKCZjLT5ub2RlLCAmbXRrZC0+cGVuZGluZyk7CisJCQlzcGluX3Vu bG9jaygmbXRrZC0+bG9jayk7CisJCQl0YXNrbGV0X3NjaGVkdWxlKCZtdGtkLT50YXNrKTsKKwkJ fQorCX0gZWxzZSB7CisJCWxlbiA9IG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9MRU4pOworCQlp ZiAobXRrX2RtYV9jaGVja19mbHVzaF9yZXN1bHQoY2hhbikgIT0gMCkKKwkJCXJldHVybjsKKwor CQl3aGlsZSAoKGxlZnQgPSBtdGtfZG1hX2NoYW5fcmVhZChjLCBWRkZfTEVGVF9TSVpFKSkgPiAw VSkgeworCQkJc2VuZCA9IG1pbihsZWZ0LCBjLT5yZW1haW5fc2l6ZSk7CisJCQl3cHQgPSBtdGtf ZG1hX2NoYW5fcmVhZChjLCBWRkZfV1BUKTsKKwkJCXdyYXAgPSB3cHQgJiBNVEtfRE1BX1JJTkdf V1JBUCA/IDBVIDogTVRLX0RNQV9SSU5HX1dSQVA7CisKKwkJCWlmICgod3B0ICYgKGxlbiAtIDFV KSkgKyBzZW5kIDwgbGVuKQorCQkJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfV1BULCB3cHQg KyBzZW5kKTsKKwkJCWVsc2UKKwkJCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX1dQVCwKKwkJ CQkJCSAgICgod3B0ICsgc2VuZCkgJiAobGVuIC0gMVUpKQorCQkJCQkJICAgfCB3cmFwKTsKKwor CQkJYy0+cmVtYWluX3NpemUgLT0gc2VuZDsKKwkJCWlmIChjLT5yZW1haW5fc2l6ZSA9PSAwVSkK KwkJCQlicmVhazsKKwkJfQorCisJCWlmICh0eGNvdW50ICE9IGMtPnJlbWFpbl9zaXplKSB7CisJ CQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX1RYX0lOVF9FTl9CKTsKKwkJ CW10a19kbWFfdHhfZmx1c2goY2hhbik7CisJCX0KKwl9CisJYXRvbWljX2RlYygmYy0+ZW50cnkp OworfQorCitzdGF0aWMgdm9pZCBtdGtfZG1hX3N0YXJ0X3R4KHN0cnVjdCBtdGtfY2hhbiAqYykK K3sKKwlpZiAobXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX0xFRlRfU0laRSkgPT0gMFUpIHsKKwkJ cHJfaW5mbygiJXMgbWF5YmUgbmVlZCBmaXg/IEBMICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18p OworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9FTiwgVkZGX1RYX0lOVF9FTl9CKTsK Kwl9IGVsc2UgeworCQlyZWluaXRfY29tcGxldGlvbigmYy0+ZG9uZSk7CisKKwkJLyogaW5jIHR3 aWNlLCBvbmNlIGZvciB0eF9mbHVzaCwgYW5vdGhlciBmb3IgdHhfaW50ZXJydXB0ICovCisJCWF0 b21pY19pbmMoJmMtPmxvb3BjbnQpOworCQlhdG9taWNfaW5jKCZjLT5sb29wY250KTsKKwkJbXRr X2RtYV90eF93cml0ZSgmYy0+dmMuY2hhbik7CisJfQorCWMtPnBhdXNlZCA9IGZhbHNlOworfQor CitzdGF0aWMgdm9pZCBtdGtfZG1hX2dldF9yeF9zaXplKHN0cnVjdCBtdGtfY2hhbiAqYykKK3sK Kwl1bnNpZ25lZCBpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHJkcHRyLCB3cnB0ciwgd3JyZWcs IHJkcmVnOworCXVuc2lnbmVkIGludCByeF9zaXplID0gbXRrX2RtYV9jaGFuX3JlYWQoYywgVkZG X0xFTik7CisKKwlyZHJlZyA9IG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9SUFQpOworCXdycmVn ID0gbXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX1dQVCk7CisJcmRwdHIgPSByZHJlZyAmIE1US19E TUFfUklOR19TSVpFOworCXdycHRyID0gd3JyZWcgJiBNVEtfRE1BX1JJTkdfU0laRTsKKwljb3Vu dCA9ICgocmRyZWcgXiB3cnJlZykgJiBNVEtfRE1BX1JJTkdfV1JBUCkgPworCQkJKHdycHRyICsg cnhfc2l6ZSAtIHJkcHRyKSA6ICh3cnB0ciAtIHJkcHRyKTsKKworCWMtPnJlbWFpbl9zaXplID0g Y291bnQ7CisJYy0+cnhfcHRyID0gcmRwdHI7CisKKwltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZG X1JQVCwgd3JyZWcpOworfQorCitzdGF0aWMgdm9pZCBtdGtfZG1hX3N0YXJ0X3J4KHN0cnVjdCBt dGtfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4gPSAmYy0+dmMuY2hhbjsKKwlz dHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IHRvX210a19kbWFfZGV2KGNoYW4tPmRldmljZSk7CisJ c3RydWN0IG10a19kbWFfZGVzYyAqZCA9IGMtPmRlc2M7CisKKwlpZiAobXRrX2RtYV9jaGFuX3Jl YWQoYywgVkZGX1ZBTElEX1NJWkUpICE9IDBVICYmCisJICAgIGQgJiYgZC0+dmQudHguY29va2ll ICE9IDApIHsKKwkJbXRrX2RtYV9nZXRfcnhfc2l6ZShjKTsKKwkJbXRrX2RtYV9yZW1vdmVfdmly dF9saXN0KGQtPnZkLnR4LmNvb2tpZSwgJmMtPnZjKTsKKwkJdmNoYW5fY29va2llX2NvbXBsZXRl KCZkLT52ZCk7CisJfSBlbHNlIHsKKwkJaWYgKG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9WQUxJ RF9TSVpFKSAhPSAwVSkgeworCQkJc3Bpbl9sb2NrKCZtdGtkLT5sb2NrKTsKKwkJCWlmIChsaXN0 X2VtcHR5KCZtdGtkLT5wZW5kaW5nKSkKKwkJCQlsaXN0X2FkZF90YWlsKCZjLT5ub2RlLCAmbXRr ZC0+cGVuZGluZyk7CisJCQlzcGluX3VubG9jaygmbXRrZC0+bG9jayk7CisJCQl0YXNrbGV0X3Nj aGVkdWxlKCZtdGtkLT50YXNrKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmYy0+ ZW50cnkpID4gMCkKKwkJCQlhdG9taWNfc2V0KCZjLT5lbnRyeSwgMCk7CisJCX0KKwl9Cit9CisK K3N0YXRpYyB2b2lkIG10a19kbWFfcmVzZXQoc3RydWN0IG10a19jaGFuICpjKQoreworCXN0cnVj dCBtdGtfZG1hZGV2ICptdGtkID0gdG9fbXRrX2RtYV9kZXYoYy0+dmMuY2hhbi5kZXZpY2UpOwor CisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9BRERSLCAwKTsKKwltdGtfZG1hX2NoYW5fd3Jp dGUoYywgVkZGX1RIUkUsIDApOworCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfTEVOLCAwKTsK KwltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX1JTVCwgVkZGX1dBUk1fUlNUX0IpOworCisJd2hp bGUKKwkJKG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9FTikpOworCisJaWYgKGMtPmNmZy5kaXJl Y3Rpb24gPT0gRE1BX0RFVl9UT19NRU0pCisJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfUlBU LCAwKTsKKwllbHNlIGlmIChjLT5jZmcuZGlyZWN0aW9uID09IERNQV9NRU1fVE9fREVWKQorCQlt dGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX1dQVCwgMCk7CisJZWxzZQorCQlkZXZfaW5mbyhjLT52 Yy5jaGFuLmRldmljZS0+ZGV2LCAiVW5rbm93biBkaXJlY3Rpb24uXG4iKTsKKworCWlmIChtdGtk LT5zdXBwb3J0XzMzYml0cykKKwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl80R19TVVBQT1JU LCBWRkZfNEdfU1VQUE9SVF9DTFJfQik7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfc3RvcChz dHJ1Y3QgbXRrX2NoYW4gKmMpCit7CisJaW50IHBvbGxpbmdfY250OworCisJbXRrX2RtYV9jaGFu X3dyaXRlKGMsIFZGRl9GTFVTSCwgVkZGX0ZMVVNIX0NMUl9CKTsKKworCXBvbGxpbmdfY250ID0g MDsKKwl3aGlsZSAoKG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9GTFVTSCkgJiBWRkZfRkxVU0hf QikgPT0KKwkJVkZGX0ZMVVNIX0IpCXsKKwkJcG9sbGluZ19jbnQrKzsKKwkJaWYgKHBvbGxpbmdf Y250ID4gMTAwMDApIHsKKwkJCWRldl9lcnIoYy0+dmMuY2hhbi5kZXZpY2UtPmRldiwKKwkJCQki ZG1hIHN0b3A6IHBvbGxpbmcgRkxVU0ggZmFpbCwgREVCVUc9MHgleFxuIiwKKwkJCQltdGtfZG1h X2NoYW5fcmVhZChjLCBWRkZfREVCVUdfU1RBVFVTKSk7CisJCQlicmVhazsKKwkJfQorCX0KKwor CXBvbGxpbmdfY250ID0gMDsKKwkvKnNldCBzdG9wIGFzIDEgLT4gd2FpdCB1bnRpbCBlbiBpcyAw IC0+IHNldCBzdG9wIGFzIDAqLworCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfU1RPUCwgVkZG X1NUT1BfQik7CisJd2hpbGUgKG10a19kbWFfY2hhbl9yZWFkKGMsIFZGRl9FTikpIHsKKwkJcG9s bGluZ19jbnQrKzsKKwkJaWYgKHBvbGxpbmdfY250ID4gMTAwMDApIHsKKwkJCWRldl9lcnIoYy0+ dmMuY2hhbi5kZXZpY2UtPmRldiwKKwkJCQkiZG1hIHN0b3A6IHBvbGxpbmcgVkZGX0VOIGZhaWws IERFQlVHPTB4JXhcbiIsCisJCQkJbXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX0RFQlVHX1NUQVRV UykpOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9TVE9Q LCBWRkZfU1RPUF9DTFJfQik7CisJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9JTlRfRU4sIFZG Rl9JTlRfRU5fQ0xSX0IpOworCisJaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gRE1BX0RFVl9UT19N RU0pCisJCW10a19kbWFfY2hhbl93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9SWF9JTlRfRkxB R19DTFJfQik7CisJZWxzZQorCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0lOVF9GTEFHLCBW RkZfVFhfSU5UX0ZMQUdfQ0xSX0IpOworCisJYy0+cGF1c2VkID0gdHJ1ZTsKK30KKworLyoKKyAq IFdlIG5lZWQgdG8gZGVhbCB3aXRoICdhbGwgY2hhbm5lbHMgaW4tdXNlJworICovCitzdGF0aWMg dm9pZCBtdGtfZG1hX3J4X3NjaGVkKHN0cnVjdCBtdGtfY2hhbiAqYykKK3sKKwlzdHJ1Y3QgZG1h X2NoYW4gKmNoYW4gPSAmYy0+dmMuY2hhbjsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IHRv X210a19kbWFfZGV2KGNoYW4tPmRldmljZSk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmMtPmVudHJ5 KSA8IDEpIHsKKwkJbXRrX2RtYV9zdGFydF9yeChjKTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2so Jm10a2QtPmxvY2spOworCQlpZiAobGlzdF9lbXB0eSgmbXRrZC0+cGVuZGluZykpCisJCQlsaXN0 X2FkZF90YWlsKCZjLT5ub2RlLCAmbXRrZC0+cGVuZGluZyk7CisJCXNwaW5fdW5sb2NrKCZtdGtk LT5sb2NrKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmbXRrZC0+dGFzayk7CisJfQorfQorCisvKgor ICogVGhpcyBjYWxsYmFjayBzY2hlZHVsZXMgYWxsIHBlbmRpbmcgY2hhbm5lbHMuIFdlIGNvdWxk IGJlIG1vcmUKKyAqIGNsZXZlciBoZXJlIGJ5IHBvc3Rwb25pbmcgYWxsb2NhdGlvbiBvZiB0aGUg cmVhbCBETUEgY2hhbm5lbHMgdG8KKyAqIHRoaXMgcG9pbnQsIGFuZCBmcmVlaW5nIHRoZW0gd2hl biBvdXIgdmlydHVhbCBjaGFubmVsIGJlY29tZXMgaWRsZS4KKyAqCisgKiBXZSB3b3VsZCB0aGVu IG5lZWQgdG8gZGVhbCB3aXRoICdhbGwgY2hhbm5lbHMgaW4tdXNlJworICovCitzdGF0aWMgdm9p ZCBtdGtfZG1hX3NjaGVkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgbXRrX2RtYWRl diAqbXRrZCA9IChzdHJ1Y3QgbXRrX2RtYWRldiAqKWRhdGE7CisJc3RydWN0IG10a19jaGFuICpj OworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjICp2ZDsKKwlkbWFfY29va2llX3QgY29va2llOworCUxJ U1RfSEVBRChoZWFkKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycSgm bXRrZC0+bG9jayk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZtdGtkLT5wZW5kaW5nLCAmaGVh ZCk7CisJc3Bpbl91bmxvY2tfaXJxKCZtdGtkLT5sb2NrKTsKKworCWlmIChsaXN0X2VtcHR5KCZo ZWFkKSA9PSAwKSB7CisJCWMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZoZWFkLCBzdHJ1Y3QgbXRrX2No YW4sIG5vZGUpOworCQljb29raWUgPSBjLT52Yy5jaGFuLmNvb2tpZTsKKworCQlzcGluX2xvY2tf aXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCQlpZiAoYy0+Y2ZnLmRpcmVjdGlvbiA9PSBE TUFfREVWX1RPX01FTSkgeworCQkJbGlzdF9kZWxfaW5pdCgmYy0+bm9kZSk7CisJCQltdGtfZG1h X3J4X3NjaGVkKGMpOworCQl9IGVsc2UgaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gRE1BX01FTV9U T19ERVYpIHsKKwkJCXZkID0gdmNoYW5fZmluZF9kZXNjKCZjLT52YywgY29va2llKTsKKworCQkJ Yy0+ZGVzYyA9IHRvX210a19kbWFfZGVzYygmdmQtPnR4KTsKKwkJCWxpc3RfZGVsX2luaXQoJmMt Pm5vZGUpOworCQkJbXRrX2RtYV9zdGFydF90eChjKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJfQorfQorCitzdGF0aWMgaW50IG10a19kbWFf YWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRtYV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBt dGtfZG1hZGV2ICptdGtkID0gdG9fbXRrX2RtYV9kZXYoY2hhbi0+ZGV2aWNlKTsKKwlzdHJ1Y3Qg bXRrX2NoYW4gKmMgPSB0b19tdGtfZG1hX2NoYW4oY2hhbik7CisJaW50IHJldCA9IC1FQlVTWTsK KworCXBtX3J1bnRpbWVfZ2V0X3N5bmMobXRrZC0+ZGRldi5kZXYpOworCisJaWYgKCFtdGtkLT5s Y2hfbWFwW2MtPmRtYV9jaF0pIHsKKwkJYy0+Y2hhbm5lbF9iYXNlID0gbXRrZC0+bWVtX2Jhc2Vb Yy0+ZG1hX2NoXTsKKwkJbXRrZC0+bGNoX21hcFtjLT5kbWFfY2hdID0gYzsKKwkJcmV0ID0gMTsK Kwl9CisJYy0+cmVxdWVzdGVkID0gZmFsc2U7CisJbXRrX2RtYV9yZXNldChjKTsKKworCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1 Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2QgPSB0b19tdGtf ZG1hX2RldihjaGFuLT5kZXZpY2UpOworCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a19kbWFf Y2hhbihjaGFuKTsKKworCWlmIChjLT5yZXF1ZXN0ZWQpIHsKKwkJYy0+cmVxdWVzdGVkID0gZmFs c2U7CisJCWZyZWVfaXJxKG10a2QtPmRtYV9pcnFbYy0+ZG1hX2NoXSwgY2hhbik7CisJfQorCisJ dGFza2xldF9raWxsKCZtdGtkLT50YXNrKTsKKworCWMtPmNoYW5uZWxfYmFzZSA9IE5VTEw7CisJ bXRrZC0+bGNoX21hcFtjLT5kbWFfY2hdID0gTlVMTDsKKwl2Y2hhbl9mcmVlX2NoYW5fcmVzb3Vy Y2VzKCZjLT52Yyk7CisKKwlkZXZfZGJnKG10a2QtPmRkZXYuZGV2LCAiZnJlZWluZyBjaGFubmVs IGZvciAldVxuIiwgYy0+ZG1hX3NpZyk7CisJYy0+ZG1hX3NpZyA9IDA7CisKKwlwbV9ydW50aW1l X3B1dF9zeW5jKG10a2QtPmRkZXYuZGV2KTsKK30KKworc3RhdGljIGVudW0gZG1hX3N0YXR1cyBt dGtfZG1hX3R4X3N0YXR1cyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCisJCQkJCSBkbWFfY29va2ll X3QgY29va2llLAorCQkJCQkgc3RydWN0IGRtYV90eF9zdGF0ZSAqdHhzdGF0ZSkKK3sKKwlzdHJ1 Y3QgbXRrX2NoYW4gKmMgPSB0b19tdGtfZG1hX2NoYW4oY2hhbik7CisJZW51bSBkbWFfc3RhdHVz IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmV0ID0gZG1hX2Nvb2tpZV9zdGF0dXMo Y2hhbiwgY29va2llLCB0eHN0YXRlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2Nr LCBmbGFncyk7CisJaWYgKHJldCA9PSBETUFfSU5fUFJPR1JFU1MpIHsKKwkJYy0+cnhfcHRyID0g bXRrX2RtYV9jaGFuX3JlYWQoYywgVkZGX1JQVCkgJiBNVEtfRE1BX1JJTkdfU0laRTsKKwkJdHhz dGF0ZS0+cmVzaWR1ZSA9IGMtPnJ4X3B0cjsKKwl9IGVsc2UgaWYgKHJldCA9PSBETUFfQ09NUExF VEUgJiYgYy0+Y2ZnLmRpcmVjdGlvbiA9PSBETUFfREVWX1RPX01FTSkgeworCQl0eHN0YXRlLT5y ZXNpZHVlID0gYy0+cmVtYWluX3NpemU7CisJfSBlbHNlIHsKKwkJdHhzdGF0ZS0+cmVzaWR1ZSA9 IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKwor CXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbXRrX2RtYV9kZXNjX3NpemUo c3RydWN0IG10a19kbWFfZGVzYyAqZCkKK3sKKwlzdHJ1Y3QgbXRrX2RtYV9zZyAqc2c7CisJdW5z aWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHNpemU7CisKKwlmb3IgKHNpemUgPSBpID0gMDsg aSA8IGQtPnNnbGVuOyBpKyspIHsKKwkJc2cgPSAmZC0+c2dbaV07CisJCXNpemUgKz0gc2ctPmVu ICogc2ctPmZuOworCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5 bmNfdHhfZGVzY3JpcHRvciAqbXRrX2RtYV9wcmVwX3NsYXZlX3NnCisJKHN0cnVjdCBkbWFfY2hh biAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJdW5zaWduZWQgaW50IHNnbGVuLAll bnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLAorCXVuc2lnbmVkIGxvbmcgdHhfZmxhZ3Ms IHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX2RtYV9jaGFu KGNoYW4pOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dlbnQ7CisJc3RydWN0IG10a19kbWFfZGVz YyAqZDsKKwlkbWFfYWRkcl90IGRldl9hZGRyOworCXVuc2lnbmVkIGludCBpLCBqLCBlbiwgZnJh bWVfYnl0ZXM7CisKKwllbiA9IDE7CisJZnJhbWVfYnl0ZXMgPSAxOworCisJaWYgKGRpciA9PSBE TUFfREVWX1RPX01FTSkgeworCQlkZXZfYWRkciA9IGMtPmNmZy5zcmNfYWRkcjsKKwl9IGVsc2Ug aWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQlkZXZfYWRkciA9IGMtPmNmZy5kc3RfYWRk cjsKKwl9IGVsc2UgeworCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LCAiYmFkIGRpcmVjdGlv blxuIik7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE5vdyBhbGxvY2F0ZSBhbmQgc2V0dXAg dGhlIGRlc2NyaXB0b3IuICovCisJZCA9IGt6YWxsb2Moc2l6ZW9mKCpkKSArIHNnbGVuICogc2l6 ZW9mKGQtPnNnWzBdKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKwor CWQtPmRpciA9IGRpcjsKKwlkLT5kZXZfYWRkciA9IGRldl9hZGRyOworCisJaiA9IDA7CisJZm9y X2VhY2hfc2coc2dsLCBzZ2VudCwgc2dsZW4sIGkpIHsKKwkJZC0+c2dbal0uYWRkciA9IHNnX2Rt YV9hZGRyZXNzKHNnZW50KTsKKwkJZC0+c2dbal0uZW4gPSBlbjsKKwkJZC0+c2dbal0uZm4gPSBz Z19kbWFfbGVuKHNnZW50KSAvIGZyYW1lX2J5dGVzOworCQlqKys7CisJfQorCisJZC0+c2dsZW4g PSBqOworCisJaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikKKwkJYy0+cmVtYWluX3NpemUgPSBt dGtfZG1hX2Rlc2Nfc2l6ZShkKTsKKworCXJldHVybiB2Y2hhbl90eF9wcmVwKCZjLT52YywgJmQt PnZkLCB0eF9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG10a19kbWFfaXNzdWVfcGVuZGluZyhz dHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX2Rt YV9jaGFuKGNoYW4pOworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkOworCXN0cnVjdCB2aXJ0X2Rt YV9kZXNjICp2ZDsKKwlkbWFfY29va2llX3QgY29va2llOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCWlmIChjLT5jZmcu ZGlyZWN0aW9uID09IERNQV9ERVZfVE9fTUVNKSB7CisJCWNvb2tpZSA9IGMtPnZjLmNoYW4uY29v a2llOworCQltdGtkID0gdG9fbXRrX2RtYV9kZXYoY2hhbi0+ZGV2aWNlKTsKKwkJaWYgKHZjaGFu X2lzc3VlX3BlbmRpbmcoJmMtPnZjKSAmJiAhYy0+ZGVzYykgeworCQkJdmQgPSB2Y2hhbl9maW5k X2Rlc2MoJmMtPnZjLCBjb29raWUpOworCQkJYy0+ZGVzYyA9IHRvX210a19kbWFfZGVzYygmdmQt PnR4KTsKKwkJCWlmIChhdG9taWNfcmVhZCgmYy0+ZW50cnkpID4gMCkKKwkJCQlhdG9taWNfc2V0 KCZjLT5lbnRyeSwgMCk7CisJCX0KKwl9IGVsc2UgaWYgKGMtPmNmZy5kaXJlY3Rpb24gPT0gRE1B X01FTV9UT19ERVYpIHsKKwkJY29va2llID0gYy0+dmMuY2hhbi5jb29raWU7CisJCWlmICh2Y2hh bl9pc3N1ZV9wZW5kaW5nKCZjLT52YykgJiYgIWMtPmRlc2MpIHsKKwkJCXZkID0gdmNoYW5fZmlu ZF9kZXNjKCZjLT52YywgY29va2llKTsKKwkJCWMtPmRlc2MgPSB0b19tdGtfZG1hX2Rlc2MoJnZk LT50eCk7CisJCQltdGtfZG1hX3N0YXJ0X3R4KGMpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlycXJldHVybl90IG10 a19kbWFfcnhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZG1h X2NoYW4gKmNoYW4gPSAoc3RydWN0IGRtYV9jaGFuICopZGV2X2lkOworCXN0cnVjdCBtdGtfY2hh biAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9 IHRvX210a19kbWFfZGV2KGNoYW4tPmRldmljZSk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisJbXRrX2RtYV9jaGFuX3dy aXRlKGMsIFZGRl9JTlRfRkxBRywgVkZGX1JYX0lOVF9GTEFHX0NMUl9CKTsKKworCWlmIChhdG9t aWNfaW5jX3JldHVybigmYy0+ZW50cnkpID4gMSkgeworCQlpZiAobGlzdF9lbXB0eSgmbXRrZC0+ cGVuZGluZykpCisJCQlsaXN0X2FkZF90YWlsKCZjLT5ub2RlLCAmbXRrZC0+cGVuZGluZyk7CisJ CXRhc2tsZXRfc2NoZWR1bGUoJm10a2QtPnRhc2spOworCX0gZWxzZSB7CisJCW10a19kbWFfc3Rh cnRfcngoYyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdz KTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGlycXJldHVybl90IG10a19k bWFfdHhfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2No YW4gKmNoYW4gPSAoc3RydWN0IGRtYV9jaGFuICopZGV2X2lkOworCXN0cnVjdCBtdGtfY2hhbiAq YyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IHRv X210a19kbWFfZGV2KGNoYW4tPmRldmljZSk7CisJc3RydWN0IG10a19kbWFfZGVzYyAqZCA9IGMt PmRlc2M7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjLT52 Yy5sb2NrLCBmbGFncyk7CisJaWYgKGMtPnJlbWFpbl9zaXplICE9IDBVKSB7CisJCWxpc3RfYWRk X3RhaWwoJmMtPm5vZGUsICZtdGtkLT5wZW5kaW5nKTsKKwkJdGFza2xldF9zY2hlZHVsZSgmbXRr ZC0+dGFzayk7CisJfSBlbHNlIHsKKwkJbXRrX2RtYV9yZW1vdmVfdmlydF9saXN0KGQtPnZkLnR4 LmNvb2tpZSwgJmMtPnZjKTsKKwkJdmNoYW5fY29va2llX2NvbXBsZXRlKCZkLT52ZCk7CisJfQor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmMtPnZjLmxvY2ssIGZsYWdzKTsKKworCW10a19kbWFf Y2hhbl93cml0ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9UWF9JTlRfRkxBR19DTFJfQik7CisJaWYg KGF0b21pY19kZWNfYW5kX3Rlc3QoJmMtPmxvb3BjbnQpKQorCQljb21wbGV0ZSgmYy0+ZG9uZSk7 CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV9zbGF2ZV9j b25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCXN0cnVjdCBkbWFfc2xhdmVfY29uZmln ICpjZmcpCit7CisJc3RydWN0IG10a19jaGFuICpjID0gdG9fbXRrX2RtYV9jaGFuKGNoYW4pOwor CXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gdG9fbXRrX2RtYV9kZXYoYy0+dmMuY2hhbi5kZXZp Y2UpOworCWludCByZXQ7CisKKwljLT5jZmcgPSAqY2ZnOworCisJaWYgKGNmZy0+ZGlyZWN0aW9u ID09IERNQV9ERVZfVE9fTUVNKSB7CisJCXVuc2lnbmVkIGludCByeF9sZW4gPSBjZmctPnNyY19h ZGRyX3dpZHRoICogMTAyNDsKKworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0FERFIsIGNm Zy0+c3JjX2FkZHIpOworCQltdGtfZG1hX2NoYW5fd3JpdGUoYywgVkZGX0xFTiwgcnhfbGVuKTsK KwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9USFJFLCBWRkZfUlhfVEhSRShyeF9sZW4pKTsK KwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsCisJCQkJICAgVkZGX0lOVF9FTiwgVkZGX1JYX0lOVF9F TjBfQgorCQkJCSAgIHwgVkZGX1JYX0lOVF9FTjFfQik7CisJCW10a19kbWFfY2hhbl93cml0ZShj LCBWRkZfSU5UX0ZMQUcsIFZGRl9SWF9JTlRfRkxBR19DTFJfQik7CisJCW10a19kbWFfY2hhbl93 cml0ZShjLCBWRkZfRU4sIFZGRl9FTl9CKTsKKworCQlpZiAoIWMtPnJlcXVlc3RlZCkgeworCQkJ YXRvbWljX3NldCgmYy0+ZW50cnksIDApOworCQkJYy0+cmVxdWVzdGVkID0gdHJ1ZTsKKwkJCXJl dCA9IHJlcXVlc3RfaXJxKG10a2QtPmRtYV9pcnFbYy0+ZG1hX2NoXSwKKwkJCQkJICBtdGtfZG1h X3J4X2ludGVycnVwdCwKKwkJCQkJICBJUlFGX1RSSUdHRVJfTk9ORSwKKwkJCQkJICBEUlZfTkFN RSwgY2hhbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5k ZXYsICJDYW4ndCByZXF1ZXN0IHJ4IGRtYSBJUlFcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOwor CQkJfQorCQl9CisJfSBlbHNlIGlmIChjZmctPmRpcmVjdGlvbiA9PSBETUFfTUVNX1RPX0RFVikJ eworCQl1bnNpZ25lZCBpbnQgdHhfbGVuID0gY2ZnLT5kc3RfYWRkcl93aWR0aCAqIDEwMjQ7CisK KwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9BRERSLCBjZmctPmRzdF9hZGRyKTsKKwkJbXRr X2RtYV9jaGFuX3dyaXRlKGMsIFZGRl9MRU4sIHR4X2xlbik7CisJCW10a19kbWFfY2hhbl93cml0 ZShjLCBWRkZfVEhSRSwgVkZGX1RYX1RIUkUodHhfbGVuKSk7CisJCW10a19kbWFfY2hhbl93cml0 ZShjLCBWRkZfSU5UX0ZMQUcsIFZGRl9UWF9JTlRfRkxBR19DTFJfQik7CisJCW10a19kbWFfY2hh bl93cml0ZShjLCBWRkZfRU4sIFZGRl9FTl9CKTsKKworCQlpZiAoIWMtPnJlcXVlc3RlZCkgewor CQkJYy0+cmVxdWVzdGVkID0gdHJ1ZTsKKwkJCXJldCA9IHJlcXVlc3RfaXJxKG10a2QtPmRtYV9p cnFbYy0+ZG1hX2NoXSwKKwkJCQkJICBtdGtfZG1hX3R4X2ludGVycnVwdCwKKwkJCQkJICBJUlFG X1RSSUdHRVJfTk9ORSwKKwkJCQkJICBEUlZfTkFNRSwgY2hhbik7CisJCQlpZiAocmV0IDwgMCkg eworCQkJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsICJDYW4ndCByZXF1ZXN0IHR4IGRtYSBJ UlFcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJZGV2 X2luZm8oY2hhbi0+ZGV2aWNlLT5kZXYsICJVbmtub3duIGRpcmVjdGlvbiFcbiIpOworCX0KKwor CWlmIChtdGtkLT5zdXBwb3J0XzMzYml0cykKKwkJbXRrX2RtYV9jaGFuX3dyaXRlKGMsIFZGRl80 R19TVVBQT1JULCBWRkZfNEdfU1VQUE9SVF9CKTsKKworCWlmIChtdGtfZG1hX2NoYW5fcmVhZChj LCBWRkZfRU4pICE9IFZGRl9FTl9CKSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsCisJ CQkiY29uZmlnIGRtYSBkaXJbJWRdIGZhaWxcbiIsIGNmZy0+ZGlyZWN0aW9uKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV90ZXJt aW5hdGVfYWxsKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmMg PSB0b19tdGtfZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNUX0hF QUQoaGVhZCk7CisKKwlpZiAoYXRvbWljX3JlYWQoJmMtPmxvb3BjbnQpICE9IDApCisJCXdhaXRf Zm9yX2NvbXBsZXRpb24oJmMtPmRvbmUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmMtPnZjLmxv Y2ssIGZsYWdzKTsKKwlpZiAoYy0+ZGVzYykgeworCQltdGtfZG1hX3JlbW92ZV92aXJ0X2xpc3Qo Yy0+ZGVzYy0+dmQudHguY29va2llLCAmYy0+dmMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwkJbXRrX2RtYV9kZXNjX2ZyZWUoJmMtPmRlc2MtPnZk KTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYy0+dmMubG9jaywgZmxhZ3MpOworCQlpZiAoIWMt PnBhdXNlZCkJeworCQkJbGlzdF9kZWxfaW5pdCgmYy0+bm9kZSk7CisJCQltdGtfZG1hX3N0b3Ao Yyk7CisJCX0KKwl9CisJdmNoYW5fZ2V0X2FsbF9kZXNjcmlwdG9ycygmYy0+dmMsICZoZWFkKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT52Yy5sb2NrLCBmbGFncyk7CisKKwl2Y2hhbl9k bWFfZGVzY19mcmVlX2xpc3QoJmMtPnZjLCAmaGVhZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludCBtdGtfZG1hX2RldmljZV9wYXVzZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJ LyogUGF1c2UvUmVzdW1lIG9ubHkgYWxsb3dlZCB3aXRoIGN5Y2xpYyBtb2RlICovCisJcmV0dXJu IC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbXRrX2RtYV9kZXZpY2VfcmVzdW1lKHN0cnVjdCBk bWFfY2hhbiAqY2hhbikKK3sKKwkvKiBQYXVzZS9SZXN1bWUgb25seSBhbGxvd2VkIHdpdGggY3lj bGljIG1vZGUgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBtdGtfZG1hX2No YW5faW5pdChzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCkKK3sKKwlzdHJ1Y3QgbXRrX2NoYW4gKmM7 CisKKwljID0gZGV2bV9remFsbG9jKG10a2QtPmRkZXYuZGV2LCBzaXplb2YoKmMpLCBHRlBfS0VS TkVMKTsKKwlpZiAoIWMpCisJCXJldHVybiAtRU5PTUVNOworCisJYy0+dmMuZGVzY19mcmVlID0g bXRrX2RtYV9kZXNjX2ZyZWU7CisJdmNoYW5faW5pdCgmYy0+dmMsICZtdGtkLT5kZGV2KTsKKwlz cGluX2xvY2tfaW5pdCgmYy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmMtPm5vZGUpOworCisJ aW5pdF9jb21wbGV0aW9uKCZjLT5kb25lKTsKKwlhdG9taWNfc2V0KCZjLT5sb29wY250LCAwKTsK KwlhdG9taWNfc2V0KCZjLT5lbnRyeSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgbXRrX2RtYV9mcmVlKHN0cnVjdCBtdGtfZG1hZGV2ICptdGtkKQoreworCXRhc2tsZXRfa2ls bCgmbXRrZC0+dGFzayk7CisJd2hpbGUgKGxpc3RfZW1wdHkoJm10a2QtPmRkZXYuY2hhbm5lbHMp ID09IDApIHsKKwkJc3RydWN0IG10a19jaGFuICpjID0gbGlzdF9maXJzdF9lbnRyeSgmbXRrZC0+ ZGRldi5jaGFubmVscywKKwkJCXN0cnVjdCBtdGtfY2hhbiwgdmMuY2hhbi5kZXZpY2Vfbm9kZSk7 CisKKwkJbGlzdF9kZWwoJmMtPnZjLmNoYW4uZGV2aWNlX25vZGUpOworCQl0YXNrbGV0X2tpbGwo JmMtPnZjLnRhc2spOworCQlkZXZtX2tmcmVlKG10a2QtPmRkZXYuZGV2LCBjKTsKKwl9Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG10a191YXJ0X2RtYV9tYXRjaFtdID0g eworCXsgLmNvbXBhdGlibGUgPSAibWVkaWF0ZWssbXQ2NTc3LXVhcnQtZG1hIiwgfSwKKwl7IC8q IHNlbnRpbmVsICovIH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgbXRrX3VhcnRfZG1h X21hdGNoKTsKKworc3RhdGljIGludCBtdGtfZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCit7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2Q7CisJc3RydWN0IHJlc291cmNl ICpyZXM7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHJjOworCisJbXRrZCA9IGRldm1fa3phbGxv YygmcGRldi0+ZGV2LCBzaXplb2YoKm10a2QpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW10a2QpCisJ CXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IE1US19TRE1BX0NIQU5ORUxTOyBp KyspIHsKKwkJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVN LCBpKTsKKwkJaWYgKCFyZXMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJbXRrZC0+bWVtX2Jhc2Vb aV0gPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwkJaWYgKElTX0VS UihtdGtkLT5tZW1fYmFzZVtpXSkpCisJCQlyZXR1cm4gUFRSX0VSUihtdGtkLT5tZW1fYmFzZVtp XSk7CisJfQorCisJLyogcmVxdWVzdCBpcnEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTVRLX1NETUFf Q0hBTk5FTFM7IGkrKykgeworCQltdGtkLT5kbWFfaXJxW2ldID0gcGxhdGZvcm1fZ2V0X2lycShw ZGV2LCBpKTsKKwkJaWYgKChpbnQpbXRrZC0+ZG1hX2lycVtpXSA8IDApIHsKKwkJCWRldl9lcnIo JnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgSVJRWyVkXVxuIiwgaSk7CisJCQlyZXR1cm4gLUVJ TlZBTDsKKwkJfQorCX0KKworCW10a2QtPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBO VUxMKTsKKwlpZiAoSVNfRVJSKG10a2QtPmNsaykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAi Tm8gY2xvY2sgc3BlY2lmaWVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIobXRrZC0+Y2xrKTsKKwl9 CisKKwlpZiAob2ZfcHJvcGVydHlfcmVhZF9ib29sKHBkZXYtPmRldi5vZl9ub2RlLCAiZG1hLTMz Yml0cyIpKSB7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJTdXBwb3J0IGRtYSAzM2JpdHNcbiIp OworCQltdGtkLT5zdXBwb3J0XzMzYml0cyA9IHRydWU7CisJfQorCisJaWYgKG10a2QtPnN1cHBv cnRfMzNiaXRzKQorCQlyYyA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwg RE1BX0JJVF9NQVNLKDMzKSk7CisJZWxzZQorCQlyYyA9IGRtYV9zZXRfbWFza19hbmRfY29oZXJl bnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7 CisKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIG10a2QtPmRkZXYuY2FwX21hc2spOworCW10a2Qt PmRkZXYuZGV2aWNlX2FsbG9jX2NoYW5fcmVzb3VyY2VzID0gbXRrX2RtYV9hbGxvY19jaGFuX3Jl c291cmNlczsKKwltdGtkLT5kZGV2LmRldmljZV9mcmVlX2NoYW5fcmVzb3VyY2VzID0gbXRrX2Rt YV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCW10a2QtPmRkZXYuZGV2aWNlX3R4X3N0YXR1cyA9IG10 a19kbWFfdHhfc3RhdHVzOworCW10a2QtPmRkZXYuZGV2aWNlX2lzc3VlX3BlbmRpbmcgPSBtdGtf ZG1hX2lzc3VlX3BlbmRpbmc7CisJbXRrZC0+ZGRldi5kZXZpY2VfcHJlcF9zbGF2ZV9zZyA9IG10 a19kbWFfcHJlcF9zbGF2ZV9zZzsKKwltdGtkLT5kZGV2LmRldmljZV9jb25maWcgPSBtdGtfZG1h X3NsYXZlX2NvbmZpZzsKKwltdGtkLT5kZGV2LmRldmljZV9wYXVzZSA9IG10a19kbWFfZGV2aWNl X3BhdXNlOworCW10a2QtPmRkZXYuZGV2aWNlX3Jlc3VtZSA9IG10a19kbWFfZGV2aWNlX3Jlc3Vt ZTsKKwltdGtkLT5kZGV2LmRldmljZV90ZXJtaW5hdGVfYWxsID0gbXRrX2RtYV90ZXJtaW5hdGVf YWxsOworCW10a2QtPmRkZXYuc3JjX2FkZHJfd2lkdGhzID0gQklUKERNQV9TTEFWRV9CVVNXSURU SF8xX0JZVEUpOworCW10a2QtPmRkZXYuZHN0X2FkZHJfd2lkdGhzID0gQklUKERNQV9TTEFWRV9C VVNXSURUSF8xX0JZVEUpOworCW10a2QtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChETUFfREVWX1RP X01FTSkgfCBCSVQoRE1BX01FTV9UT19ERVYpOworCW10a2QtPmRkZXYucmVzaWR1ZV9ncmFudWxh cml0eSA9IERNQV9SRVNJRFVFX0dSQU5VTEFSSVRZX1NFR01FTlQ7CisJbXRrZC0+ZGRldi5kZXYg PSAmcGRldi0+ZGV2OworCUlOSVRfTElTVF9IRUFEKCZtdGtkLT5kZGV2LmNoYW5uZWxzKTsKKwlJ TklUX0xJU1RfSEVBRCgmbXRrZC0+cGVuZGluZyk7CisKKwlzcGluX2xvY2tfaW5pdCgmbXRrZC0+ bG9jayk7CisJdGFza2xldF9pbml0KCZtdGtkLT50YXNrLCBtdGtfZG1hX3NjaGVkLCAodW5zaWdu ZWQgbG9uZyltdGtkKTsKKworCW10a2QtPmRtYV9yZXF1ZXN0cyA9IE1US19TRE1BX1JFUVVFU1RT OworCWlmIChvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkgImRt YS1yZXF1ZXN0cyIsICZtdGtkLT5kbWFfcmVxdWVzdHMpICE9IDApIHsKKwkJZGV2X2luZm8oJnBk ZXYtPmRldiwKKwkJCSAiTWlzc2luZyBkbWEtcmVxdWVzdHMgcHJvcGVydHksIHVzaW5nICV1Llxu IiwKKwkJCSBNVEtfU0RNQV9SRVFVRVNUUyk7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1US19T RE1BX0NIQU5ORUxTOyBpKyspIHsKKwkJcmMgPSBtdGtfZG1hX2NoYW5faW5pdChtdGtkKTsKKwkJ aWYgKHJjKQorCQkJZ290byBlcnJfbm9fZG1hOworCX0KKworCXBtX3J1bnRpbWVfZW5hYmxlKCZw ZGV2LT5kZXYpOworCXBtX3J1bnRpbWVfc2V0X2FjdGl2ZSgmcGRldi0+ZGV2KTsKKworCXJjID0g ZG1hX2FzeW5jX2RldmljZV9yZWdpc3RlcigmbXRrZC0+ZGRldik7CisJaWYgKHJjKSB7CisJCWRl dl93YXJuKCZwZGV2LT5kZXYsICJmYWlsIHRvIHJlZ2lzdGVyIERNQSBkZXZpY2U6ICVkXG4iLCBy Yyk7CisJCW10a19kbWFfY2xrX2Rpc2FibGUobXRrZCk7CisJCWdvdG8gZXJyX25vX2RtYTsKKwl9 CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBtdGtkKTsKKworCWlmIChwZGV2LT5kZXYu b2Zfbm9kZSkgeworCQltdGtfZG1hX2luZm8uZG1hX2NhcCA9IG10a2QtPmRkZXYuY2FwX21hc2s7 CisKKwkJLyogRGV2aWNlLXRyZWUgRE1BIGNvbnRyb2xsZXIgcmVnaXN0cmF0aW9uICovCisJCXJj ID0gb2ZfZG1hX2NvbnRyb2xsZXJfcmVnaXN0ZXIocGRldi0+ZGV2Lm9mX25vZGUsCisJCQkJCQlv Zl9kbWFfc2ltcGxlX3hsYXRlLAorCQkJCQkJJm10a19kbWFfaW5mbyk7CisJCWlmIChyYykgewor CQkJZGV2X3dhcm4oJnBkZXYtPmRldiwgImZhaWwgdG8gcmVnaXN0ZXIgRE1BIGNvbnRyb2xsZXJc biIpOworCQkJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZtdGtkLT5kZGV2KTsKKwkJCW10 a19kbWFfY2xrX2Rpc2FibGUobXRrZCk7CisJCQlnb3RvIGVycl9ub19kbWE7CisJCX0KKwl9CisK KwlyZXR1cm4gcmM7CisKK2Vycl9ub19kbWE6CisJbXRrX2RtYV9mcmVlKG10a2QpOworCXJldHVy biByYzsKK30KKworc3RhdGljIGludCBtdGtfZG1hX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gcGxhdGZvcm1fZ2V0X2Ry dmRhdGEocGRldik7CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCW9mX2RtYV9jb250cm9s bGVyX2ZyZWUocGRldi0+ZGV2Lm9mX25vZGUpOworCisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2 LT5kZXYpOworCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmcGRldi0+ZGV2KTsKKworCWRtYV9hc3lu Y19kZXZpY2VfdW5yZWdpc3RlcigmbXRrZC0+ZGRldik7CisKKwltdGtfZG1hX2ZyZWUobXRrZCk7 CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIGludCBt dGtfZG1hX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBtdGtfZG1hZGV2 ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXBtX3J1bnRpbWVfc3VzcGVu ZGVkKGRldikpCisJCW10a19kbWFfY2xrX2Rpc2FibGUobXRrZCk7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBtdGtfZG1hX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50 IHJldDsKKwlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwor CisJaWYgKCFwbV9ydW50aW1lX3N1c3BlbmRlZChkZXYpKSB7CisJCXJldCA9IG10a19kbWFfY2xr X2VuYWJsZShtdGtkKTsKKwkJaWYgKHJldCkgeworCQkJZGV2X2luZm8oZGV2LCAiZmFpbCB0byBl bmFibGUgY2xrOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBtdGtfZG1hX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2 aWNlICpkZXYpCit7CisJc3RydWN0IG10a19kbWFkZXYgKm10a2QgPSBkZXZfZ2V0X2RydmRhdGEo ZGV2KTsKKworCW10a19kbWFfY2xrX2Rpc2FibGUobXRrZCk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBtdGtfZG1hX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sK KwlpbnQgcmV0OworCXN0cnVjdCBtdGtfZG1hZGV2ICptdGtkID0gZGV2X2dldF9kcnZkYXRhKGRl dik7CisKKwlyZXQgPSBtdGtfZG1hX2Nsa19lbmFibGUobXRrZCk7CisJaWYgKHJldCkgeworCQlk ZXZfd2FybihkZXYsICJmYWlsIHRvIGVuYWJsZSBjbGs6ICVkXG4iLCByZXQpOworCQlyZXR1cm4g cmV0OworCX0KKworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICov CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBtdGtfZG1hX3BtX29wcyA9IHsKKwlT RVRfU1lTVEVNX1NMRUVQX1BNX09QUyhtdGtfZG1hX3N1c3BlbmQsIG10a19kbWFfcmVzdW1lKQor CVNFVF9SVU5USU1FX1BNX09QUyhtdGtfZG1hX3J1bnRpbWVfc3VzcGVuZCwKKwkJCSAgIG10a19k bWFfcnVudGltZV9yZXN1bWUsIE5VTEwpCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2Ry aXZlciBtdGtfZG1hX2RyaXZlciA9IHsKKwkucHJvYmUJPSBtdGtfZG1hX3Byb2JlLAorCS5yZW1v dmUJPSBtdGtfZG1hX3JlbW92ZSwKKwkuZHJpdmVyID0geworCQkubmFtZQkJPSAiODI1MC1tdGst ZG1hIiwKKwkJLnBtCQk9ICZtdGtfZG1hX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gb2Zf bWF0Y2hfcHRyKG10a191YXJ0X2RtYV9tYXRjaCksCisJfSwKK307CisKK3N0YXRpYyBib29sIG10 a19kbWFfZmlsdGVyX2ZuKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqcGFyYW0pCit7CisJ aWYgKGNoYW4tPmRldmljZS0+ZGV2LT5kcml2ZXIgPT0gJm10a19kbWFfZHJpdmVyLmRyaXZlcikg eworCQlzdHJ1Y3QgbXRrX2RtYWRldiAqbXRrZCA9IHRvX210a19kbWFfZGV2KGNoYW4tPmRldmlj ZSk7CisJCXN0cnVjdCBtdGtfY2hhbiAqYyA9IHRvX210a19kbWFfY2hhbihjaGFuKTsKKwkJdW5z aWduZWQgaW50IHJlcSA9ICoodW5zaWduZWQgaW50ICopcGFyYW07CisKKwkJaWYgKHJlcSA8PSBt dGtkLT5kbWFfcmVxdWVzdHMpIHsKKwkJCWMtPmRtYV9zaWcgPSByZXE7CisJCQljLT5kbWFfY2gg PSByZXE7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0 YXRpYyBpbnQgbXRrX2RtYV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9y ZWdpc3RlcigmbXRrX2RtYV9kcml2ZXIpOworfQorc3Vic3lzX2luaXRjYWxsKG10a19kbWFfaW5p dCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtdGtfZG1hX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9y bV9kcml2ZXJfdW5yZWdpc3RlcigmbXRrX2RtYV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobXRr X2RtYV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL0tjb25maWcgYi9kcml2ZXJzL2Rt YS9LY29uZmlnCmluZGV4IGRhY2YzZjQuLmNmYTE2OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1h L0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvS2NvbmZpZwpAQCAtMTUxLDYgKzE1MSwxNyBAQCBj b25maWcgRE1BX0paNDc4MAogCSAgSWYgeW91IGhhdmUgYSBib2FyZCBiYXNlZCBvbiBzdWNoIGEg U29DIGFuZCB3aXNoIHRvIHVzZSBETUEgZm9yCiAJICBkZXZpY2VzIHdoaWNoIGNhbiB1c2UgdGhl IERNQSBjb250cm9sbGVyLCBzYXkgWSBvciBNIGhlcmUuCiAKK2NvbmZpZyBETUFfTVRLX1VBUlQK Kwl0cmlzdGF0ZSAiTWVkaWFUZWsgU29DcyBBUERNQSBzdXBwb3J0IGZvciBVQVJUIgorCWRlcGVu ZHMgb24gT0YKKwlzZWxlY3QgRE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVM UworCWhlbHAKKwkgIFN1cHBvcnQgZm9yIHRoZSBVQVJUIERNQSBlbmdpbmUgZm91bmQgb24gTWVk aWFUZWsgTVRLIFNvQ3MuCisJICB3aGVuIDgyNTAgbXRrIHVhcnQgaXMgZW5hYmxlZCwgYW5kIGlm IHlvdSB3YW50IHRvIHVzaW5nIERNQSwKKwkgIHlvdSBjYW4gZW5hYmxlIHRoZSBjb25maWcuIHRo ZSBETUEgZW5naW5lIGp1c3Qgb25seSBiZSB1c2VkCisJICB3aXRoIE1lZGlhVGVrIFNvY3MuCisK IGNvbmZpZyBETUFfU0ExMVgwCiAJdHJpc3RhdGUgIlNBLTExeDAgRE1BIHN1cHBvcnQiCiAJZGVw ZW5kcyBvbiBBUkNIX1NBMTEwMCB8fCBDT01QSUxFX1RFU1QKZGlmZiAtLWdpdCBhL2RyaXZlcnMv ZG1hL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvTWFrZWZpbGUKaW5kZXggYzkxNzAyZC4uNDI2OTBk OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9kbWEvTWFr ZWZpbGUKQEAgLTI0LDYgKzI0LDcgQEAgb2JqLSQoQ09ORklHX0NPSDkwMTMxOCkgKz0gY29oOTAx MzE4Lm8gY29oOTAxMzE4X2xsaS5vCiBvYmotJChDT05GSUdfRE1BX0JDTTI4MzUpICs9IGJjbTI4 MzUtZG1hLm8KIG9iai0kKENPTkZJR19ETUFfSlo0NzQwKSArPSBkbWEtano0NzQwLm8KIG9iai0k KENPTkZJR19ETUFfSlo0NzgwKSArPSBkbWEtano0NzgwLm8KK29iai0kKENPTkZJR19ETUFfTVRL X1VBUlQpICs9IDgyNTBfbXRrX2RtYS5vCiBvYmotJChDT05GSUdfRE1BX1NBMTFYMCkgKz0gc2Ex MXgwLWRtYS5vCiBvYmotJChDT05GSUdfRE1BX1NVTjRJKSArPSBzdW40aS1kbWEubwogb2JqLSQo Q09ORklHX0RNQV9TVU42SSkgKz0gc3VuNmktZG1hLm8K