Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [V2,7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Thierry Reding Message-Id: <20190503142238.GA3300@ulmo> Date: Fri, 3 May 2019 16:22:38 +0200 To: Nagarjuna Kristam Cc: balbi@kernel.org, gregkh@linuxfoundation.org, jonathanh@nvidia.com, linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org List-ID: T24gTW9uLCBNYXIgMTEsIDIwMTkgYXQgMDQ6NDE6NTVQTSArMDUzMCwgTmFnYXJqdW5hIEtyaXN0 YW0gd3JvdGU6Cj4gVGhpcyBwYXRjaCBhZGRzIFVEQyBkcml2ZXIgZm9yIHRlZ3JhIFhVU0IgMy4w IGRldmljZSBtb2RlIGNvbnRyb2xsZXIuCgpzL3RlZ3JhL1RlZ3JhLwoKPiBYVVNCIGRldmljZSBt b2RlIGNvbnRyb2xsZXIgc3VwcG9ydCBTUywgSFMgYW5kIEZTIG1vZGVzCgpzL3N1cHBvcnQvc3Vw cG9ydHMvIGFuZCB0ZXJtaW5hdGUgdGhlIHNlbnRlbmNlIHdpdGggYSBmdWxsLXN0b3AuCgo+IAo+ IEJhc2VkIG9uIHdvcmsgYnk6Cj4gICBNYXJrIEt1byA8bWt1b0BudmlkaWEuY29tPgo+ICAgQW5k cmV3IEJyZXN0aWNrZXIgPGFicmVzdGljQGNocm9taXVtLm9yZz4KPiAKPiBTaWduZWQtb2ZmLWJ5 OiBOYWdhcmp1bmEgS3Jpc3RhbSA8bmtyaXN0YW1AbnZpZGlhLmNvbT4KPiAtLS0KPiAgZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgfCAgIDEwICsKPiAgZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9NYWtlZmlsZSAgICAgfCAgICAxICsKPiAgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy90 ZWdyYV94dWRjLmMgfCAzNzAyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4g IDMgZmlsZXMgY2hhbmdlZCwgMzcxMyBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3RlZ3JhX3h1ZGMuYwo+IAo+IGRpZmYgLS1naXQgYS9k cml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tj b25maWcKPiBpbmRleCAwYTE2Y2JkLi5mNmY0NjljIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdXNi L2dhZGdldC91ZGMvS2NvbmZpZwo+ICsrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZp Zwo+IEBAIC00MzksNiArNDM5LDE2IEBAIGNvbmZpZyBVU0JfR0FER0VUX1hJTElOWAo+ICAJICBk eW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAidWRjLXhpbGlueCIgYW5kIGZvcmNlIGFs bAo+ICAJICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KPiAg Cj4gK2NvbmZpZyBVU0JfVEVHUkFfWFVEQwo+ICsJdHJpc3RhdGUgIk5WSURJQSBTdXBlcnNwZWVk IFVTQiAzLjAgRGV2aWNlIENvbnRyb2xsZXIiCgpOVklESUEgVGVncmE/IE5vdCBzdXJlIGlmIHRo aXMgaXMgYXZhaWxhYmxlIGFueXdoZXJlIGVsc2UuCgo+ICsJZGVwZW5kcyBvbiBBUkNIX1RFR1JB Cj4gKwloZWxwCj4gKwkgRW5hYmxlcyBURUdSQSBVU0IgMy4wIGRldmljZSBtb2RlIGNvbnRyb2xs ZXIgZHJpdmVyLgoKTlZJRElBIFRlZ3JhIGhlcmUsIHRvby4KCj4gKwo+ICsJIFNheSAieSIgdG8g bGluayB0aGUgZHJpdmVyIHN0YXRpY2FsbHksIG9yICJtIiB0byBidWlsZCBhCj4gKwkgZHluYW1p Y2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInRlZ3JhX3h1ZGMiIGFuZCBmb3JjZSBhbGwKPiAr CSBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KPiArCj4gIHNv dXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIgo+ICAKPiAg Iwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQo+IGluZGV4IDg5N2Y2NDguLjFjNTVjOTYgMTAwNjQ0 Cj4gLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQo+ICsrKyBiL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKPiBAQCAtMjQsNiArMjQsNyBAQCBvYmotJChDT05GSUdf VVNCX0JDTTYzWFhfVURDKQkrPSBiY202M3h4X3VkYy5vCj4gIG9iai0kKENPTkZJR19VU0JfRlNM X1VTQjIpCSs9IGZzbF91c2IyX3VkYy5vCj4gIGZzbF91c2IyX3VkYy15CQkJOj0gZnNsX3VkY19j b3JlLm8KPiAgZnNsX3VzYjJfdWRjLSQoQ09ORklHX0FSQ0hfTVhDKQkrPSBmc2xfbXhjX3VkYy5v Cj4gK29iai0kKENPTkZJR19VU0JfVEVHUkFfWFVEQykJKz0gdGVncmFfeHVkYy5vCj4gIG9iai0k KENPTkZJR19VU0JfTTY2NTkyKQkrPSBtNjY1OTItdWRjLm8KPiAgb2JqLSQoQ09ORklHX1VTQl9S OEE2NjU5NykJKz0gcjhhNjY1OTctdWRjLm8KPiAgb2JqLSQoQ09ORklHX1VTQl9SRU5FU0FTX1VT QjMpCSs9IHJlbmVzYXNfdXNiMy5vCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvdGVncmFfeHVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMKPiBu ZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjcwYmVkYTAKPiAtLS0gL2Rldi9u dWxsCj4gKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMKPiBAQCAtMCww ICsxLDM3MDIgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCj4gKy8q Cj4gKyAqIE5WSURJQSBYVVNCIGRldmljZSBtb2RlIGNvbnRyb2xsZXIKCkFnYWluLCBwZXJoYXBz IG1lbnRpb24gdGhhdCB0aGlzIGlzIGZvciBUZWdyYS4KCkkgZGlkbid0IGZpbmQgYW55dGhpbmcg dGhhdCBzdG9vZCBvdXQgaW4gbW9zdCBvZiB0aGUgZHJpdmVyLiBCZWxvdyBhcmUgYQpjb3VwbGUg b2YgdGhpbmdzIHRvd2FyZHMgdGhlIGVuZCB0aGF0IEkgdGhpbmsgeW91IHNob3VsZCBsb29rIGF0 LgoKR2VuZXJhbGx5IEkgdGhvdWdodCBpdCB3YXMgZmFpcmx5IGRpZmZpY3VsdCB0byByZWFkLiBZ b3UgbWF5IHdhbnQgdG8gc2VlCmlmIHlvdSBjYW4gaW1wcm92ZSByZWFkYWJpbGl0eSBieSBhZGRp bmcgYSBiaXQgb2Ygd2hpdGVzcGFjZSB3aGVyZQphcHByb3ByaWF0ZS4gRm9yIGV4YW1wbGUsIHRy eSB0byBsZWF2ZSBhIGJsYW5rIGxpbmUgYWJvdmUgYW5kIGJlbG93CmJsb2NrIGVsZW1lbnRzLCBz dWNoIGFzIGNvbmRpdGlvbmFscyBvciBsb29wcy4gSSBmaW5kIHRoYXQgdGhhdCBoZWxwcyBhCmxv dCBpbiBtYWtpbmcgdGhlIGNvZGUgZWFzaWVyIHRvIHJlYWQuCgpTZWUgYmVsb3cgZm9yIGFuIGV4 YW1wbGUuCgpbLi4uXQo+ICtzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcHJvYmUoc3RydWN0IHBsYXRm b3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7Cj4gKwlz dHJ1Y3QgcmVzb3VyY2UgKnJlczsKPiArCXVuc2lnbmVkIGludCBpOwo+ICsJaW50IGVycjsKPiAr Cj4gKwl4dWRjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqeHVkYyksIEdGUF9B VE9NSUMpOwo+ICsJaWYgKCF4dWRjKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJeHVkYy0+ZGV2 ID0gJnBkZXYtPmRldjsKPiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHh1ZGMpOwoKVGhp cywgZm9yIGV4YW1wbGUsIHdvdWxkIGJlIGVhc2llciB0byByZWFkIGFzOgoKCXh1ZGMgPSBkZXZt X2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp4dWRjKSwgR0ZQX0FUT01JQyk7CglpZiAoIXh1 ZGMpCgkJcmV0dXJuIC1FTk9NRU07CgoJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgeHVkYyk7 Cgl4dWRjLT5kZXYgPSAmcGRldi0+ZGV2OwoKPiArCj4gKwl4dWRjLT5zb2MgPSBvZl9kZXZpY2Vf Z2V0X21hdGNoX2RhdGEoJnBkZXYtPmRldik7Cj4gKwlpZiAoIXh1ZGMtPnNvYykKPiArCQlyZXR1 cm4gLUVOT0RFVjsKClRoaXMgc2l0dWF0aW9uIGNhbiBuZXZlciBoYXBwZW4uIFRoZSBkcml2ZXIg aXMgb25seSBldmVyIGluc3RhbnRpYXRlZApmcm9tIGRldmljZSB0cmVlLCBpbiB3aGljaCBjYXNl IHh1ZGMtPnNvYyB3aWxsIGJlIGEgdmFsaWQgcG9pbnRlciB0byB0aGUKY29ycmVjdCBTb0MgZGF0 YSBzdHJ1Y3R1cmUuCgo+ICsKPiArCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJ T1JFU09VUkNFX01FTSwgMCk7Cj4gKwl4dWRjLT5iYXNlID0gZGV2bV9pb3JlbWFwX3Jlc291cmNl KCZwZGV2LT5kZXYsIHJlcyk7Cj4gKwlpZiAoSVNfRVJSKHh1ZGMtPmJhc2UpKQo+ICsJCXJldHVy biBQVFJfRVJSKHh1ZGMtPmJhc2UpOwo+ICsJeHVkYy0+cGh5c19iYXNlID0gcmVzLT5zdGFydDsK PiArCj4gKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0s IDEpOwo+ICsJeHVkYy0+ZnBjaSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCBy ZXMpOwo+ICsJaWYgKElTX0VSUih4dWRjLT5mcGNpKSkKPiArCQlyZXR1cm4gUFRSX0VSUih4dWRj LT5mcGNpKTsKPiArCj4gKwlpZiAoeHVkYy0+c29jLT5oYXNfaXBmcykgewo+ICsJCXJlcyA9IHBs YXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7Cj4gKwkJeHVkYy0+ aXBmcyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOwo+ICsJCWlmIChJ U19FUlIoeHVkYy0+aXBmcykpCj4gKwkJCXJldHVybiBQVFJfRVJSKHh1ZGMtPmlwZnMpOwo+ICsJ fQo+ICsKPiArCXh1ZGMtPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Cj4gKwlpZiAo eHVkYy0+aXJxIDwgMCkgewo+ICsJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBJ UlE6ICVkXG4iLAo+ICsJCQkJeHVkYy0+aXJxKTsKPiArCQlyZXR1cm4geHVkYy0+aXJxOwo+ICsJ fQo+ICsJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB4dWRjLT5pcnEsIHRlZ3Jh X3h1ZGNfaXJxLCAwLAo+ICsJCQkgICAgICAgZGV2X25hbWUoJnBkZXYtPmRldiksIHh1ZGMpOwo+ ICsJaWYgKGVyciA8IDApIHsKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBjbGFp bSBJUlEjJXU6ICVkXG4iLCB4dWRjLT5pcnEsCj4gKwkJCWVycik7Cj4gKwkJcmV0dXJuIGVycjsK PiArCX0KPiArCj4gKwl4dWRjLT5jbGtzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHh1ZGMt PnNvYy0+bnVtX2Nsa3MsCj4gKwkJCQkgICAgICBzaXplb2YoKnh1ZGMtPmNsa3MpLCBHRlBfS0VS TkVMKTsKPiArCWlmICgheHVkYy0+Y2xrcykKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCWZvciAo aSA9IDA7IGkgPCB4dWRjLT5zb2MtPm51bV9jbGtzOyBpKyspCj4gKwkJeHVkYy0+Y2xrc1tpXS5p ZCA9IHh1ZGMtPnNvYy0+Y2xvY2tfbmFtZXNbaV07Cj4gKwllcnIgPSBkZXZtX2Nsa19idWxrX2dl dCgmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9jbGtzLAo+ICsJCQkJICAgICAgeHVkYy0+Y2xr cyk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gcmVx dWVzdCBjbGtzICVkXG4iLCBlcnIpOwo+ICsJCXJldHVybiBlcnI7Cj4gKwl9Cj4gKwo+ICsJeHVk Yy0+c3VwcGxpZXMgPSBkZXZtX2tjYWxsb2MoJnBkZXYtPmRldiwgeHVkYy0+c29jLT5udW1fc3Vw cGxpZXMsCj4gKwkJCQkgICAgICBzaXplb2YoKnh1ZGMtPnN1cHBsaWVzKSwgR0ZQX0tFUk5FTCk7 Cj4gKwlpZiAoIXh1ZGMtPnN1cHBsaWVzKQo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJZm9yIChp ID0gMDsgaSA8IHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzOyBpKyspCj4gKwkJeHVkYy0+c3VwcGxp ZXNbaV0uc3VwcGx5ID0geHVkYy0+c29jLT5zdXBwbHlfbmFtZXNbaV07Cj4gKwllcnIgPSBkZXZt X3JlZ3VsYXRvcl9idWxrX2dldCgmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9zdXBwbGllcywK PiArCQkJCSAgICAgIHh1ZGMtPnN1cHBsaWVzKTsKPiArCWlmIChlcnIpIHsKPiArCQlkZXZfZXJy KHh1ZGMtPmRldiwgImZhaWxlZCB0byByZXF1ZXN0IHJlZ3VsYXRvcnMgJWRcbiIsIGVycik7Cj4g KwkJcmV0dXJuIGVycjsKPiArCX0KPiArCj4gKwl4dWRjLT5wYWRjdGwgPSB0ZWdyYV94dXNiX3Bh ZGN0bF9nZXQoJnBkZXYtPmRldik7Cj4gKwlpZiAoSVNfRVJSKHh1ZGMtPnBhZGN0bCkpCj4gKwkJ cmV0dXJuIFBUUl9FUlIoeHVkYy0+cGFkY3RsKTsKPiArCj4gKwllcnIgPSByZWd1bGF0b3JfYnVs a19lbmFibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKPiArCWlm IChlcnIpIHsKPiArCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBlbmFibGUgcmVndWxh dG9ycyAlZFxuIiwgZXJyKTsKPiArCQlnb3RvIHB1dF9wYWRjdGw7Cj4gKwl9Cj4gKwo+ICsJeHVk Yy0+dXNiM19waHkgPSBkZXZtX3BoeV9vcHRpb25hbF9nZXQoJnBkZXYtPmRldiwgInVzYjMiKTsK PiArCWlmIChJU19FUlIoeHVkYy0+dXNiM19waHkpKSB7Cj4gKwkJZXJyID0gUFRSX0VSUih4dWRj LT51c2IzX3BoeSk7Cj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYjMg cGh5OiAlZFxuIiwgZXJyKTsKPiArCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOwo+ICsJfQo+ICsJ eHVkYy0+dXRtaV9waHkgPSBkZXZtX3BoeV9vcHRpb25hbF9nZXQoJnBkZXYtPmRldiwgInVzYjIi KTsKPiArCWlmIChJU19FUlIoeHVkYy0+dXRtaV9waHkpKSB7Cj4gKwkJZXJyID0gUFRSX0VSUih4 dWRjLT51dG1pX3BoeSk7Cj4gKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVz YjIgcGh5OiAlZFxuIiwgZXJyKTsKPiArCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOwo+ICsJfQo+ ICsKPiArCXh1ZGMtPmRhdGFfcm9sZV9leHRjb24gPSBleHRjb25fZ2V0X2VkZXZfYnlfcGhhbmRs ZSgmcGRldi0+ZGV2LCAwKTsKPiArCWlmIChJU19FUlIoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbikp IHsKPiArCQllcnIgPSBQVFJfRVJSKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pOwo+ICsJCWRldl9l cnIoeHVkYy0+ZGV2LCAiZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUgZmFpbGVkICVkXG4iLAo+ ICsJCQkJZXJyKTsKPiArCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOwo+ICsJfQo+ICsKPiArCWVy ciA9IHRlZ3JhX3h1ZGNfcG93ZXJkb21haW5faW5pdCh4dWRjKTsKPiArCWlmIChlcnIpCj4gKwkJ Z290byBwdXRfcG93ZXJkb21haW5zOwo+ICsKPiArCWVyciA9IHRlZ3JhX3h1ZGNfcGh5X2luaXQo eHVkYyk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gcHV0X3Bvd2VyZG9tYWluczsKPiArCj4gKwll cnIgPSB0ZWdyYV94dWRjX2FsbG9jX2V2ZW50X3JpbmcoeHVkYyk7Cj4gKwlpZiAoZXJyKQo+ICsJ CWdvdG8gZGlzYWJsZV9waHk7Cj4gKwo+ICsJZXJyID0gdGVncmFfeHVkY19hbGxvY19lcHMoeHVk Yyk7Cj4gKwlpZiAoZXJyKQo+ICsJCWdvdG8gZnJlZV9ldmVudF9yaW5nOwo+ICsKPiArCXNwaW5f bG9ja19pbml0KCZ4dWRjLT5sb2NrKTsKPiArCWluaXRfY29tcGxldGlvbigmeHVkYy0+ZGlzY29u bmVjdF9jb21wbGV0ZSk7Cj4gKwo+ICsJSU5JVF9XT1JLKCZ4dWRjLT5kYXRhX3JvbGVfd29yaywg dGVncmFfeHVkY19kYXRhX3JvbGVfd29yayk7Cj4gKwl4dWRjLT5kYXRhX3JvbGVfbmIubm90aWZp ZXJfY2FsbCA9IHRlZ3JhX3h1ZGNfZGF0YV9yb2xlX25vdGlmaWVyOwo+ICsJZXh0Y29uX3JlZ2lz dGVyX25vdGlmaWVyKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IsCj4gKwkJCQkg Jnh1ZGMtPmRhdGFfcm9sZV9uYik7Cj4gKwo+ICsJSU5JVF9ERUxBWUVEX1dPUksoJnh1ZGMtPnBs Y19yZXNldF93b3JrLCB0ZWdyYV94dWRjX3BsY19yZXNldF93b3JrKTsKPiArCj4gKwlJTklUX0RF TEFZRURfV09SSygmeHVkYy0+cG9ydF9yZXNldF93YXJfd29yaywKPiArCQkJCXRlZ3JhX3h1ZGNf cG9ydF9yZXNldF93YXJfd29yayk7Cj4gKwo+ICsJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRl dik7Cj4gKwo+ICsJeHVkYy0+Z2FkZ2V0Lm9wcyA9ICZ0ZWdyYV94dWRjX2dhZGdldF9vcHM7Cj4g Kwl4dWRjLT5nYWRnZXQuZXAwID0gJnh1ZGMtPmVwWzBdLnVzYl9lcDsKPiArCXh1ZGMtPmdhZGdl dC5uYW1lID0gInRlZ3JhLXh1ZGMiOwo+ICsJeHVkYy0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVTQl9T UEVFRF9TVVBFUjsKPiArCj4gKwllcnIgPSB1c2JfYWRkX2dhZGdldF91ZGMoJnBkZXYtPmRldiwg Jnh1ZGMtPmdhZGdldCk7Cj4gKwlpZiAoZXJyKSB7Cj4gKwkJZGV2X2VycigmcGRldi0+ZGV2LCAi ZmFpbGVkIHRvIGFkZCBVU0IgZ2FkZ2V0OiAlZFxuIiwgZXJyKTsKPiArCQlnb3RvIGZyZWVfZXBz Owo+ICsJfQo+ICsKPiArCXRlZ3JhX3h1ZGNfdXBkYXRlX2RhdGFfcm9sZSh4dWRjKTsKPiArCj4g KwlyZXR1cm4gMDsKPiArCj4gK2ZyZWVfZXBzOgo+ICsJdGVncmFfeHVkY19mcmVlX2Vwcyh4dWRj KTsKPiArZnJlZV9ldmVudF9yaW5nOgo+ICsJdGVncmFfeHVkY19mcmVlX2V2ZW50X3JpbmcoeHVk Yyk7Cj4gK2Rpc2FibGVfcGh5Ogo+ICsJdGVncmFfeHVkY19waHlfZXhpdCh4dWRjKTsKPiArcHV0 X3Bvd2VyZG9tYWluczoKPiArCXRlZ3JhX3h1ZGNfcG93ZXJkb21haW5fcmVtb3ZlKHh1ZGMpOwo+ ICtkaXNhYmxlX3JlZ3VsYXRvcjoKPiArCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoeHVkYy0+c29j LT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKPiArcHV0X3BhZGN0bDoKPiArCXRlZ3Jh X3h1c2JfcGFkY3RsX3B1dCh4dWRjLT5wYWRjdGwpOwo+ICsKPiArCXJldHVybiBlcnI7Cj4gK30K PiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBwbGF0Zm9ybV9nZXRf ZHJ2ZGF0YShwZGV2KTsKPiArCj4gKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7Cj4g Kwo+ICsJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dvcmspOwo+ICsJaWYg KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pIHsKPiArCQlleHRjb25fdW5yZWdpc3Rlcl9ub3RpZmll cih4dWRjLT5kYXRhX3JvbGVfZXh0Y29uLCBFWFRDT05fVVNCLAo+ICsJCQkJJnh1ZGMtPmRhdGFf cm9sZV9uYik7Cj4gKwkJY2FuY2VsX3dvcmtfc3luYygmeHVkYy0+ZGF0YV9yb2xlX3dvcmspOwo+ ICsJfQo+ICsJdXNiX2RlbF9nYWRnZXRfdWRjKCZ4dWRjLT5nYWRnZXQpOwo+ICsJdGVncmFfeHVk Y19mcmVlX2Vwcyh4dWRjKTsKPiArCXRlZ3JhX3h1ZGNfZnJlZV9ldmVudF9yaW5nKHh1ZGMpOwo+ ICsJdGVncmFfeHVkY19wb3dlcmRvbWFpbl9yZW1vdmUoeHVkYyk7Cj4gKwo+ICsJcmVndWxhdG9y X2J1bGtfZGlzYWJsZSh4dWRjLT5zb2MtPm51bV9zdXBwbGllcywgeHVkYy0+c3VwcGxpZXMpOwo+ ICsKPiArCXBoeV9wb3dlcl9vZmYoeHVkYy0+dXRtaV9waHkpOwo+ICsJcGh5X3Bvd2VyX29mZih4 dWRjLT51c2IzX3BoeSk7Cj4gKwl0ZWdyYV94dWRjX3BoeV9leGl0KHh1ZGMpOwo+ICsJcG1fcnVu dGltZV9kaXNhYmxlKHh1ZGMtPmRldik7Cj4gKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOwo+ ICsKPiArCXRlZ3JhX3h1c2JfcGFkY3RsX3B1dCh4dWRjLT5wYWRjdGwpOwo+ICsKPiArCXJldHVy biAwOwo+ICt9Cj4gKwo+ICsjaWYgSVNfRU5BQkxFRChDT05GSUdfUE1fU0xFRVApIHx8IElTX0VO QUJMRUQoQ09ORklHX1BNKQoKSSdkIGRyb3AgdGhlc2UgYW5kIGluc3RlYWQgYW5ub3RhdGUgd2l0 aCBfX21heWJlX3VudXNlZC4gV2Ugbm8gbG9uZ2VyCnN1cHBvcnQgYnVpbGRpbmcgVGVncmEgd2l0 aG91dCBQTSwgc28gdGhpcyBpcyBtb3N0bHkgYWNhZGVtaWMgYW55d2F5LgoKPiArc3RhdGljIGlu dCB0ZWdyYV94dWRjX3Bvd2VyZ2F0ZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJ dW5zaWduZWQgbG9uZyBmbGFnczsKPiArCj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlbnRlcmlu ZyBFTFBHXG4iKTsKClRoZXJlJ3MgYSBjb3VwbGUgb2YgZGV2X2luZm8oKSBjYWxscyB0aHJvdWdo b3V0IHRoZSBkcml2ZXIgdGhhdCBJIHRoaW5rCmFyZSB0b28gbm9pc3kuIEkgdGhpbmsgbW9zdCBv ZiB0aG9zZSBzaG91bGQgYmUgZGV2X2RiZygpIHNvIHRoYXQgdXNlcnMKYXJlbid0IGJvdGhlcmVk IHdpdGggdGhlbS4gSW4gY2FzZXMgd2hlcmUgeW91IHJlYWxseSB3YW50IHRvIGhpZ2hsaWdodAph biBlcnJvciBvciBzb21ldGhpbmcsIG1ha2UgdGhlbSBkZXZfZXJyKCkgb3IgZGV2X3dhcm4oKS4K Cj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ICsJeHVkYy0+cG93 ZXJnYXRlZCA9IHRydWU7Cj4gKwl4dWRjLT5zYXZlZF9yZWdzLmN0cmwgPSB4dWRjX3JlYWRsKHh1 ZGMsIENUUkwpOwo+ICsJeHVkYy0+c2F2ZWRfcmVncy5wb3J0cG0gPSB4dWRjX3JlYWRsKHh1ZGMs IFBPUlRQTSk7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCAwLCBDVFJMKTsKPiArCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCj4gKwljbGtfYnVsa19kaXNhYmxl X3VucHJlcGFyZSh4dWRjLT5zb2MtPm51bV9jbGtzLCB4dWRjLT5jbGtzKTsKPiArCXJlZ3VsYXRv cl9idWxrX2Rpc2FibGUoeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsK PiArCj4gKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlbnRlcmluZyBFTFBHIGRvbmVcbiIpOwo+ICsJ cmV0dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY191bnBvd2VyZ2F0ZShz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKPiArewo+ICsJdW5zaWduZWQgbG9uZyBmbGFnczsKPiAr CWludCBlcnI7Cj4gKwo+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhpdGluZyBFTFBHXG4iKTsK PiArCj4gKwllcnIgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoeHVkYy0+c29jLT5udW1fc3VwcGxp ZXMsCj4gKwkJCXh1ZGMtPnN1cHBsaWVzKTsKPiArCWlmIChlcnIgPCAwKQo+ICsJCXJldHVybiBl cnI7Cj4gKwo+ICsKCkdyYXR1aXR1b3VzIGJsYW5rIGxpbmUuCgo+ICsJZXJyID0gY2xrX2J1bGtf cHJlcGFyZV9lbmFibGUoeHVkYy0+c29jLT5udW1fY2xrcywgeHVkYy0+Y2xrcyk7Cj4gKwlpZiAo ZXJyIDwgMCkKPiArCQlyZXR1cm4gZXJyOwo+ICsKPiArCXRlZ3JhX3h1ZGNfZnBjaV9pcGZzX2lu aXQoeHVkYyk7Cj4gKwl0ZWdyYV94dWRjX2RldmljZV9wYXJhbXNfaW5pdCh4dWRjKTsKPiArCj4g Kwl0ZWdyYV94dWRjX2luaXRfZXZlbnRfcmluZyh4dWRjKTsKPiArCXRlZ3JhX3h1ZGNfaW5pdF9l cHMoeHVkYyk7Cj4gKwo+ICsJeHVkY193cml0ZWwoeHVkYywgeHVkYy0+c2F2ZWRfcmVncy5wb3J0 cG0sIFBPUlRQTSk7Cj4gKwl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT5zYXZlZF9yZWdzLmN0cmws IENUUkwpOwo+ICsKPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4g Kwl4dWRjLT5wb3dlcmdhdGVkID0gZmFsc2U7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhpdGluZyBF TFBHIGRvbmVcbiIpOwo+ICsJcmV0dXJuIDA7Cj4gK30KPiArI2VuZGlmCj4gKwo+ICsjaWZkZWYg Q09ORklHX1BNX1NMRUVQCj4gK3N0YXRpYyBpbnQgdGVncmFfeHVkY19zdXNwZW5kKHN0cnVjdCBk ZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBkZXZfZ2V0X2Ry dmRhdGEoZGV2KTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4gKwo+ICsJc3Bpbl9sb2NrX2ly cXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKPiArCXh1ZGMtPnN1c3BlbmRlZCA9IHRydWU7Cj4g KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJaWYg KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pCj4gKwkJZmx1c2hfd29yaygmeHVkYy0+ZGF0YV9yb2xl X3dvcmspOwo+ICsKPiArCS8qIEZvcmNpYmx5IGRpc2Nvbm5lY3QgYmVmb3JlIHBvd2VyZ2F0aW5n LiAqLwo+ICsJdGVncmFfeHVkY19kZXZpY2VfbW9kZV9vZmYoeHVkYyk7Cj4gKwo+ICsJaWYgKCFw bV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkKPiArCQl0ZWdyYV94dWRjX3Bvd2VyZ2F0 ZSh4dWRjKTsKPiArCj4gKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKPiArCj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94dWRjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNl ICpkZXYpCj4gK3sKPiArCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZGV2X2dldF9kcnZkYXRh KGRldik7Cj4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJaW50IGVycjsKPiArCj4gKwllcnIg PSB0ZWdyYV94dWRjX3VucG93ZXJnYXRlKHh1ZGMpOwo+ICsJaWYgKGVyciA8IDApCj4gKwkJcmV0 dXJuIGVycjsKPiArCj4gKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwo+ ICsJeHVkYy0+c3VzcGVuZGVkID0gZmFsc2U7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7Cj4gKwo+ICsJdGVncmFfeHVkY191cGRhdGVfZGF0YV9yb2xlKHh1 ZGMpOwo+ICsKPiArCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4g K30KPiArI2VuZGlmCj4gKwo+ICsjaWZkZWYgQ09ORklHX1BNCj4gK3N0YXRpYyBpbnQgdGVncmFf eHVkY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwo+ICsKPiArCXJldHVybiB0 ZWdyYV94dWRjX3Bvd2VyZ2F0ZSh4dWRjKTsKPiArfQo+ICsKPiArc3RhdGljIGludCB0ZWdyYV94 dWRjX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiArCj4gKwlyZXR1cm4gdGVn cmFfeHVkY191bnBvd2VyZ2F0ZSh4dWRjKTsKPiArfQo+ICsjZW5kaWYKCl9fbWF5YmVfdW51c2Vk IGZvciB0aGVzZSBhcyB3ZWxsLgoKVGhpZXJyeQoKPiArCj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg ZGV2X3BtX29wcyB0ZWdyYV94dWRjX3BtX29wcyA9IHsKPiArCVNFVF9TWVNURU1fU0xFRVBfUE1f T1BTKHRlZ3JhX3h1ZGNfc3VzcGVuZCwgdGVncmFfeHVkY19yZXN1bWUpCj4gKwlTRVRfUlVOVElN RV9QTV9PUFModGVncmFfeHVkY19ydW50aW1lX3N1c3BlbmQsCj4gKwkJCSAgIHRlZ3JhX3h1ZGNf cnVudGltZV9yZXN1bWUsIE5VTEwpCj4gK307Cj4gKwo+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3Jt X2RyaXZlciB0ZWdyYV94dWRjX2RyaXZlciA9IHsKPiArCS5wcm9iZSA9IHRlZ3JhX3h1ZGNfcHJv YmUsCj4gKwkucmVtb3ZlID0gdGVncmFfeHVkY19yZW1vdmUsCj4gKwkuZHJpdmVyID0gewo+ICsJ CS5uYW1lID0gInRlZ3JhLXh1ZGMiLAo+ICsJCS5wbSA9ICZ0ZWdyYV94dWRjX3BtX29wcywKPiAr CQkub2ZfbWF0Y2hfdGFibGUgPSB0ZWdyYV94dWRjX29mX21hdGNoLAo+ICsJfSwKPiArfTsKPiAr bW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0ZWdyYV94dWRjX2RyaXZlcik7Cj4gKwo+ICtNT0RVTEVf REVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYSBYVVNCIERldmljZSBDb250cm9sbGVyIik7Cj4gK01P RFVMRV9BVVRIT1IoIkFuZHJldyBCcmVzdGlja2VyIDxhYnJlc3RpY0BjaHJvbWl1bS5vcmc+Iik7 Cj4gK01PRFVMRV9BVVRIT1IoIkh1aSBGdSIpOwo+ICtNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7 Cj4gLS0gCj4gMi43LjQKPgo=