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: [v4,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <1520894116.16434.31.camel@kernel.crashing.org> Date: Tue, 13 Mar 2018 09:35:16 +1100 To: Felipe Balbi , linux-usb@vger.kernel.org Cc: Greg KH , Joel Stanley , Andrew Jeffery List-ID: T24gRnJpLCAyMDE4LTAzLTA5IGF0IDExOjIwICswMjAwLCBGZWxpcGUgQmFsYmkgd3JvdGU6Cj4g Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3Jl LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwo+ID4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uMzFlZDJiNmUyNDFiCj4gPiAt LS0gL2Rldi9udWxsCj4gPiArKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L2NvcmUuYwo+ID4gQEAgLTAsMCArMSw0MjkgQEAKPiAKPiBtaXNzaW5nIFNQRFggbGljZW5zZSBp ZGVudGlmaWVyIChhbGwgZmlsZXMpCgpBaCB5dXAsIHRoZSBkcml2ZXIgcHJlZGF0ZXMgbWUga25v d2luZyBhYm91dCB0aGVtLCBJJ2xsIGZpeC4KCj4gPiArc3RhdGljIGJvb2wgZm9yY2VfdXNiMSA9 IGZhbHNlOwo+ID4gK3N0YXRpYyBib29sIG5vX2RtYV9kZXNjID0gZmFsc2U7Cj4gPiArCj4gPiAr bW9kdWxlX3BhcmFtX25hbWVkKGZvcmNlX3VzYjEsIGZvcmNlX3VzYjEsIGJvb2wsIDA2NDQpOwo+ ID4gK01PRFVMRV9QQVJNX0RFU0MoZm9yY2VfdXNiMSwgIlNldCB0byB0cnVlIHRvIGZvcmNlIHRv IFVTQjEgc3BlZWQiKTsKPiA+ICttb2R1bGVfcGFyYW1fbmFtZWQobm9fZG1hX2Rlc2MsIG5vX2Rt YV9kZXNjLCBib29sLCAwNjQ0KTsKPiA+ICtNT0RVTEVfUEFSTV9ERVNDKG5vX2RtYV9kZXNjLCAi U2V0IHRvIHRydWUgdG8gZGlzYWJsZSB1c2Ugb2YgRE1BIGRlc2NyaXB0b3JzIik7Cj4gCj4gbW9k dWxlIHBhcmFtZXRlcnM/IFNvcnJ5LCBidXQgbm8uCgpXaHkgPyBBbnkgc3VnZ2VzdGlvbiB0aGVu IGZvciB0aGUgdHdvIGFib3ZlID8gVGhleSBhcmUgbW9zdGx5IG1lYW50IGFzCmRpYWdub3N0aWMv ZGVidWcgZmVhdHVyZXMgaWYgc29tZXRoaW5nIGRvZXNuJ3Qgd29yayAoZm9yIGV4YW1wbGUsIHRo ZQpib2FyZCBoYXMgc29tZSBzdWItc3RhbmRhcmQgd2lyaW5nIG1ha2luZyBVU0IyIHVucmVsaWFi bGUsIG9yIGEgZHJpdmVyCmJ1ZyB3aXRoIERNQSBkZXNjcmlwdG9ycykuCgpJIGNhbiBqdXN0IHRh a2UgdGhlbSBvdXQgY29tcGxldGVseSBidXQgaXQgZmVlbHMgbGlrZSBtb2R1bGUgcGFyYW1ldGVy cwphcmUgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGluIHRoYXQgc3BlY2lmaWMgY2FzZS4KCj4gPiAr dm9pZCBhc3Rfdmh1Yl9kb25lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1 Yl9yZXEgKnJlcSwKPiA+ICsJCSAgIGludCBzdGF0dXMpCj4gPiArewo+ID4gKwlib29sIGludGVy bmFsID0gcmVxLT5pbnRlcm5hbDsKPiA+ICsKPiA+ICsJRVBWREJHKGVwLCAiY29tcGxldGluZyBy ZXF1ZXN0IEAlcCwgc3RhdHVzICVkXG4iLCByZXEsIHN0YXR1cyk7Cj4gPiArCj4gPiArCWxpc3Rf ZGVsX2luaXQoJnJlcS0+cXVldWUpOwo+ID4gKwo+ID4gKwlpZiAocmVxLT5yZXEuc3RhdHVzID09 IC1FSU5QUk9HUkVTUykKPiA+ICsJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKPiA+ICsKPiA+ ICsJaWYgKHJlcS0+cmVxLmRtYSkgewo+ID4gKwkJaWYgKCFXQVJOX09OKCFlcC0+ZGV2KSkKPiA+ ICsJCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJmVwLT5kZXYtPmdhZGdldCwKPiA+ICsJCQkJ CQkgJnJlcS0+cmVxLCBlcC0+ZXBuLmlzX2luKTsKPiA+ICsJCXJlcS0+cmVxLmRtYSA9IDA7Cj4g PiArCX0KPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogSWYgdGhpcyBpc24ndCBhbiBpbnRlcm5hbCBF UDAgcmVxdWVzdCwgY2FsbCB0aGUgY29yZQo+ID4gKwkgKiB0byBjYWxsIHRoZSBnYWRnZXQgY29t cGxldGlvbi4KPiA+ICsJICovCj4gPiArCWlmICghaW50ZXJuYWwpIHsKPiA+ICsJCXNwaW5fdW5s b2NrKCZlcC0+dmh1Yi0+bG9jayk7Cj4gPiArCQl1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVlc3Qo JmVwLT5lcCwgJnJlcS0+cmVxKTsKPiA+ICsJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2spOwo+ ID4gKwl9Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgYXN0X3ZodWJfbnVrZShzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLCBpbnQgc3RhdHVzKQo+ID4gK3sKPiA+ICsJc3RydWN0IGFzdF92aHViX3JlcSAq cmVxOwo+ID4gKwo+ID4gKwlFUERCRyhlcCwgIk51a2luZ1xuIik7Cj4gPiArCj4gPiArCS8qIHRl cm1pbmF0ZSBhbnkgcmVxdWVzdCBpbiB0aGUgcXVldWUgKi8KPiA+ICsJaWYgKGxpc3RfZW1wdHko JmVwLT5xdWV1ZSkpCj4gPiArCQlyZXR1cm47Cj4gCj4gdW5uZWNlc3NhcnkgdGVzdC4KClJpZ2h0 Lgo+IAo+ID4gKwo+ID4gKwkvKiBCZXdhcmUsIGxvY2sgd2lsbCBiZSBkcm9wcGVkICYgcmVxLWFj cXVpcmVkIGJ5IGRvbmUoKSAqLwo+ID4gKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkp IHsKPiA+ICsJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92 aHViX3JlcSwgcXVldWUpOwo+IAo+IGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSgpID8/CgpObywg bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIGlzIGFib3V0IHRoZSBjdXJyZW50IGVudHJ5IGJlaW5n IHJlbW92ZWQKYnkgdGhlIGxvb3AuIEluIHRoaXMgY2FzZSwgd2UgZHJvcCB0aGUgbG9jayBpbiBk b25lKCksIHNvIGFueSBlbnRyeQppbmNsdWRpbmcgdGhlIG5leHQgb25lIGNvdWxkIGdvIGF3YXkg Y29uY3VycmVudGx5LiBUaGlzIGlzIHdoeSB0aGlzCmNvbnN0cnVjdCBpcyBuZWNlc3NhcnkuCgo+ ID4gKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCBzdGF0dXMpOwo+ID4gKwl9Cj4gPiArfQo+ID4g Kwo+ID4gK3N0cnVjdCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxsb2NfcmVxdWVzdChzdHJ1Y3Qg dXNiX2VwICp1X2VwLAo+ID4gKwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQo+ID4gK3sKPiA+ICsJ c3RydWN0IGFzdF92aHViX3JlcSAqcmVxOwo+ID4gKwo+ID4gKwlyZXEgPSBremFsbG9jKHNpemVv ZigqcmVxKSwgZ2ZwX2ZsYWdzKTsKPiA+ICsJaWYgKCFyZXEpCj4gPiArCQlyZXR1cm4gTlVMTDsK PiAKPiBEb24ndCB5b3Ugd2FubmEga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgZW5kcG9pbnQgdGhh dCBvd25zICR0aGlzCj4gcmVxdWVzdD8KCldoYXQgZm9yID8gSSBoYXZlbid0IGhhZCBuZWVkZWQg b25lIHNvIGZhci4uLiAKCj4gPiArCUlOSVRfTElTVF9IRUFEKCZyZXEtPnF1ZXVlKTsKPiAKPiB1 bm5lY2Vzc2FyeSBsaXN0IGluaXRpYWxpemF0aW9uCgpBaCByaWdodCwgSSB3YW50ZWQgdG8gcG9p c29uIGl0IGFjdHVhbGx5IGJ1dCBqdXN0IGxlYXZpbmcgaXQgTlVMTCBpcwpwcm9iYWJseSBmaW5l LgoKPiA+ICsJcmV0dXJuICZyZXEtPnJlcTsKPiA+ICt9Cj4gPiArCj4gPiArdm9pZCBhc3Rfdmh1 Yl9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1 X3JlcSkKPiA+ICt7Cj4gPiArCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEo dV9yZXEpOwo+ID4gKwo+ID4gKwlrZnJlZShyZXEpOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg aXJxcmV0dXJuX3QgYXN0X3ZodWJfaXJxIChpbnQgaXJxLCB2b2lkICpkYXRhKQo+IAo+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCj4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHVubmVjZXNzYXJ5IHNwYWNlCgpPay4KCj4gPiArewo+ID4gKwlzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIgPSBkYXRhOwo+ID4gKwlpcnFyZXR1cm5fdCBpcmV0ID0gSVJRX05PTkU7Cj4g PiArCXUzMiBpc3RhdDsKPiA+ICsKPiA+ICsJLyogU3RhbGUgaW50ZXJydXB0IHdoaWxlIHRlYXJp bmcgZG93biAqLwo+ID4gKwlpZiAoIXZodWItPmVwMF9idWZzKQo+ID4gKwkJcmV0dXJuIElSUV9O T05FOwo+ID4gKwo+ID4gKwlzcGluX2xvY2soJnZodWItPmxvY2spOwo+IAo+IHRoaXMgaXMgeW91 ciBoYXJkaXJxIGhhbmRsZXIgcmlnaHQ/IERvIHlvdSByZWFsbHkgbmVlZCB0aGlzIGxvY2sgaGVy ZT8KCll1cCwgcHJldHR5IG11Y2ggZXZlcnl0aGluZyBpdCBjYWxscyBuZWVkcyB0byBiZSBwcm90 ZWN0ZWQsIGl0IGFsc28KcHJvdGVjdHMgdnMgYSBjb25jdXJyZW50IHJlbW92ZS4KCj4gPiArCj4g PiArCS8qIFJlYWQgYW5kIEFDSyBpbnRlcnJ1cHRzICovCj4gPiArCWlzdGF0ID0gcmVhZGwodmh1 Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7Cj4gPiArCWlmICghaXN0YXQpCj4gPiArCQlnb3RvIGJh aWw7Cj4gPiArCXdyaXRlbChpc3RhdCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7Cj4gPiAr CWlyZXQgPSBJUlFfSEFORExFRDsKPiA+ICsKPiA+ICsJVURDVkRCRyh2aHViLCAiaXJxIHN0YXR1 cz0lMDh4LCBlcF9hY2tzPSUwOHggZXBfbmFja3M9JTA4eFxuIiwKPiA+ICsJICAgICAgIGlzdGF0 LAo+ID4gKwkgICAgICAgcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JU1IpLAo+ ID4gKwkgICAgICAgcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKSk7Cj4g PiArCj4gPiArCS8qIEhhbmRsZSBnZW5lcmljIEVQcyBmaXJzdCAqLwo+ID4gKwlpZiAoaXN0YXQg JiBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFMTCkgewo+ID4gKwkJdTMyIGksIGVwX2Fja3MgPSBy ZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7Cj4gPiArCQl3cml0ZWwoZXBf YWNrcywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JU1IpOwo+ID4gKwo+ID4gKwkJLyog Q2hlY2sgaWYgd2UgaGF2ZSBhIHVzZWZ1bCBmZnMgb24gYXJtIC4uLiAqLwo+ID4gKwkJZm9yIChp ID0gMDsgZXBfYWNrcyAmJiBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykgewo+ID4gKwkJ CXUzMiBtYXNrID0gMSA8PCBpOwo+ID4gKwkJCWlmIChlcF9hY2tzICYgbWFzaykgewo+ID4gKwkJ CQlhc3Rfdmh1Yl9lcG5fYWNrX2lycSgmdmh1Yi0+ZXBuc1tpXSk7Cj4gPiArCQkJCWVwX2Fja3Mg Jj0gfm1hc2s7Cj4gPiArCQkJfQo+ID4gKwkJfQo+ID4gKwl9Cj4gPiArCj4gPiArCS8qIEhhbmRs ZSBkZXZpY2UgaW50ZXJydXB0cyAqLwo+ID4gKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfREVWSUNF MSB8Cj4gPiArCQkgICAgIFZIVUJfSVJRX0RFVklDRTIgfAo+ID4gKwkJICAgICBWSFVCX0lSUV9E RVZJQ0UzIHwKPiA+ICsJCSAgICAgVkhVQl9JUlFfREVWSUNFNCB8Cj4gPiArCQkgICAgIFZIVUJf SVJRX0RFVklDRTUpKSB7Cj4gPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UxKQo+ID4g KwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzBdLmRldik7Cj4gPiArCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQo+ID4gKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBv cnRzWzFdLmRldik7Cj4gPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UzKQo+ID4gKwkJ CWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7Cj4gPiArCQlpZiAoaXN0YXQg JiBWSFVCX0lSUV9ERVZJQ0U0KQo+ID4gKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRz WzNdLmRldik7Cj4gPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQo+ID4gKwkJCWFz dF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzRdLmRldik7Cj4gPiArCX0KPiA+ICsKPiA+ICsJ LyogSGFuZGxlIHRvcC1sZXZlbCB2SHViIEVQMCBpbnRlcnJ1cHRzICovCj4gPiArCWlmIChpc3Rh dCAmIChWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwgfAo+ID4gKwkJICAgICBWSFVCX0lS UV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8Cj4gPiArCQkgICAgIFZIVUJfSVJRX0hVQl9FUDBfU0VU VVApKSB7Cj4gPiArCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCkK PiA+ICsJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCB0cnVlKTsKPiA+ICsJ CWlmIChpc3RhdCAmIFZIVUJfSVJRX0hVQl9FUDBfT1VUX0FDS19TVEFMTCkKPiA+ICsJCQlhc3Rf dmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCBmYWxzZSk7Cj4gPiArCQlpZiAoaXN0YXQg JiBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKQo+ID4gKwkJCWFzdF92aHViX2VwMF9oYW5kbGVfc2V0 dXAoJnZodWItPmVwMCk7Cj4gPiArCX0KPiA+ICsKPiA+ICsJLyogVmFyaW91cyB0b3AgbGV2ZWwg YnVzIGV2ZW50cyAqLwo+ID4gKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfQlVTX1JFU1VNRSB8Cj4g PiArCQkgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKPiA+ICsJCSAgICAgVkhVQl9JUlFfQlVT X1JFU0VUKSkgewo+ID4gKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1JFU1VNRSkKPiA+ICsJ CQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOwo+ID4gKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFf QlVTX1NVU1BFTkQpCj4gPiArCQkJYXN0X3ZodWJfaHViX3N1c3BlbmQodmh1Yik7Cj4gPiArCQlp ZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCj4gPiArCQkJYXN0X3ZodWJfaHViX3Jlc2V0 KHZodWIpOwo+ID4gKwl9Cj4gPiArCj4gPiArIGJhaWw6Cj4gPiArCXNwaW5fdW5sb2NrKCZ2aHVi LT5sb2NrKTsKPiA+ICsJcmV0dXJuIGlyZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgYXN0X3Zo dWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCj4gPiArewo+ID4gKwl1MzIgY3RybDsK PiA+ICsKPiA+ICsJVURDREJHKHZodWIsIihSZSlTdGFydGluZyBIVyAuLi5cbiIpOwo+ID4gKwo+ ID4gKwkvKiBFbmFibGUgUEhZICovCj4gPiArCWN0cmwgPSBWSFVCX0NUUkxfUEhZX0NMSyB8Cj4g PiArCQlWSFVCX0NUUkxfUEhZX1JFU0VUX0RJUzsKPiA+ICsKPiA+ICsjaWYgMCAvKgo+ID4gKyAg ICAgICAqIFRoaXMgY2F1c2VzIHJlZ2lzdGVycyB0byBiZWNvbWUgaW5hY2Nlc3NpYmxlIGR1cmlu Zwo+ID4gKyAgICAgICAqIHN1c3BlbmQuIE5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gYnJpbmcg dGhlIGNvbnRyb2xsZXIKPiA+ICsgICAgICAgKiBiYWNrIGludG8gbGlmZSB0byBpc3N1ZSBhIHdh a2V1cC4KPiA+ICsgICAgICAgKi8KPiA+ICsJY3RybCB8PSBWSFVCX0NUUkxfQ0xLX1NUT1BfU1VT UEVORDsKPiA+ICsjZW5kaWYKPiAKPiBubyBjb21tZW50ZWQgY29kZS4KCldoeSA/IFRoaXMgZG9j dW1lbnRzIGEgSFcgaXNzdWUgLi4uIGllLCBvbmUgd291bGQgbm9ybWFsbHkgd2FudCB0byBzZXQK dGhpcyBiaXQgYnV0IHlvdSBjYW4ndCBiZWNhdXNlIGluIHByYWN0aWNlIHlvdSBjYW4ndCBicmlu ZyB0aGUgSFcgYmFjawpzaG9ydCBvZiBkb2luZyBhIGZ1bGwgcmVzZXQuCgo+ID4gKwkvKgo+ID4g KwkgKiBTZXQgc29tZSBJU08gJiBzcGxpdCBjb250cm9sIGJpdHMgYWNjb3JkaW5nIHRvIEFzcGVl ZAo+ID4gKwkgKiByZWNvbW1lbmRhdGlvbgo+ID4gKwkgKgo+ID4gKwkgKiBWSFVCX0NUUkxfSVNP X1JTUF9DVFJMOiBXaGVuIHNldCB0ZWxscyB0aGUgSFcgdG8gcmVzcG9uZAo+ID4gKwkgKiB3aXRo IDAgYnl0ZXMgZGF0YSBwYWNrZXQgdG8gSVNPIElOIGVuZHBvaW50cyB3aGVuIG5vIGRhdGEKPiA+ ICsJICogaXMgYXZhaWxhYmxlLgo+ID4gKwkgKgo+ID4gKwkgKiBWSFVCX0NUUkxfU1BMSVRfSU46 IFRoaXMgbWFrZXMgYSBTT0YgY29tcGxldGUgYSBzcGxpdCBJTgo+ID4gKwkgKiB0cmFuc2FjdGlv bi4KPiA+ICsJICovCj4gPiArCWN0cmwgfD0gVkhVQl9DVFJMX0lTT19SU1BfQ1RSTCB8IFZIVUJf Q1RSTF9TUExJVF9JTjsKPiA+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9D VFJMKTsKPiA+ICsJdWRlbGF5KDEpOwo+ID4gKwo+ID4gKwkvKiBTZXQgZGVzY3JpcHRvciByaW5n IHNpemUgKi8KPiA+ICsjaWYgQVNUX1ZIVUJfREVTQ1NfQ09VTlQgPT0gMjU2Cj4gPiArCWN0cmwg fD0gVkhVQl9DVFJMX0xPTkdfREVTQzsKPiA+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9DVFJMKTsKPiA+ICsjZWxpZiBBU1RfVkhVQl9ERVNDU19DT1VOVCAhPSAzMgo+ID4g KwkjZXJyb3IgSW52YWxpZCBBU1RfVkhVQl9ERVNDU19DT1VOVAo+ID4gKyNlbmRpZgo+IAo+IGZp bmQgYSBiZXR0ZXIgd2F5IGZvciB0aGlzLiBObyBpZmRlZnMKClVnaCA/IFdoYXQncyB0aGF0IHJ1 bGUgPyBJIGNvdWxkIGRvIGEgbW9kdWxlIHBhcmFtZXRlciBidXQgeW91IGhhdGUKdGhhdCB0b28g YW5kIGhvbmVzdGx5IGtlZXBpbmcgdGhhdCBhbiBpZmRlZiBtYWtlcyB0aGluZ3MgZWFzaWVyLiBJ dCdzCm5vdCBtZWFudCB0byBiZSBjaGFuZ2VkIHVubGVzcyBhIGhhcmR3YXJlIG9yIHBlcmZvcm1h bmNlIGlzc3VlcyBzaG93cwp1cCwgSSB3YW50ZWQgdG8ga2VlcCBib3RoIG1vZGUgb2Ygb3BlcmF0 aW9ucyBhdmFpbGFibGUuCgo+ID4gKwo+ID4gKwkvKiBSZXNldCBhbGwgZGV2aWNlcyAqLwo+ID4g Kwl3cml0ZWwoMHgzM2YsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9TV19SRVNUKTsKPiAKPiBubyBt YWdpYyBjb25zdGFudHMuLi4KPiAKPiA+ICsJdWRlbGF5KDEpOwo+ID4gKwl3cml0ZWwoMCwgdmh1 Yi0+cmVncyArIEFTVF9WSFVCX1NXX1JFU1QpOwo+ID4gKwo+ID4gKwkvKiBEaXNhYmxlIGFuZCBj bGVhbnVwIEVQIEFDSy9OQUNLIGludGVycnVwdHMgKi8KPiA+ICsJd3JpdGVsKDAsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKPiA+ICsJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9FUF9OQUNLX0lFUik7Cj4gPiArCXdyaXRlbCgweGZmZmZmZmZmLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7Cj4gPiArCXdyaXRlbCgweGZmZmZmZmZmLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JU1IpOwo+IAo+IC4uLiBvZiBhbnkga2luZAoKVGhpcyBp cyBiZXlvbmQgY3JhenkuIFRoaXMgaXMgYmxvb2R5IGNsZWFyIHdlIGFyZSBqdXN0IGNsZWFyaW5n IGFsbApiaXRzIGhlcmUuIFRob3NlIGFyZSBqdXN0IGEgYml0IHBlciBFUCBzbyBtYWtpbmcgdGhl bSBjb25zdGFudHMgbWFrZXMKbm8gc2Vuc2UuCgo+ID4gKwkvKiBEZWZhdWx0IHNldHRpbmdzIGZv ciBFUDAsIGVuYWJsZSBIVyBodWIgRVAxICovCj4gPiArCXdyaXRlbCgwLCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfRVAwX0NUUkwpOwo+ID4gKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dH TEUgfAo+ID4gKwkgICAgICAgVkhVQl9FUDFfQ1RSTF9FTkFCTEUsCj4gPiArCSAgICAgICB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwpOwo+ID4gKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKPiA+ICsKPiA+ICsJLyogQ29uZmlndXJlIEVQMCBETUEg YnVmZmVyICovCj4gPiArCXdyaXRlbCh2aHViLT5lcDAuYnVmX2RtYSwgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMF9EQVRBKTsKPiA+ICsKPiA+ICsJLyogQ2xlYXIgYWRkcmVzcyAqLwo+ID4gKwl3 cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOwo+ID4gKwo+ID4gKwkvKiBQdWxs dXAgaHViIChhY3RpdmF0ZSBvbiBob3N0KSAqLwo+ID4gKwlpZiAodmh1Yi0+Zm9yY2VfdXNiMSkK PiA+ICsJCWN0cmwgfD0gVkhVQl9DVFJMX0ZVTExfU1BFRURfT05MWTsKPiA+ICsJY3RybCB8PSBW SFVCX0NUUkxfVVBTVFJFQU1fQ09OTkVDVDsKPiA+ICsJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9DVFJMKTsKPiA+ICsKPiA+ICsJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0cyAq Lwo+ID4gKwl3cml0ZWwoVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RBTEwgfAo+ID4gKwkgICAg ICAgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMIHwKPiA+ICsJICAgICAgIFZIVUJfSVJR X0hVQl9FUDBfU0VUVVAgfAo+ID4gKwkgICAgICAgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RBTEwg fAo+ID4gKwkgICAgICAgVkhVQl9JUlFfQlVTX1JFU1VNRSB8Cj4gPiArCSAgICAgICBWSFVCX0lS UV9CVVNfU1VTUEVORCB8Cj4gPiArCSAgICAgICBWSFVCX0lSUV9CVVNfUkVTRVQsCj4gPiArCSAg ICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKPiA+ICt9Cj4gPiArCj4gPiArc3RhdGlj IGludCBhc3Rfdmh1Yl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPiA+ICt7 Cj4gPiArCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYp Owo+ID4gKwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ID4gKwlpbnQgaTsKPiA+ICsKPiA+ICsJaWYg KCF2aHViIHx8ICF2aHViLT5yZWdzKQo+ID4gKwkJcmV0dXJuIDA7Cj4gPiArCj4gPiArCS8qIFJl bW92ZSBkZXZpY2VzICovCj4gPiArCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7 IGkrKykKPiA+ICsJCWFzdF92aHViX2RlbF9kZXYoJnZodWItPnBvcnRzW2ldLmRldik7Cj4gPiAr Cj4gPiArCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7Cj4gPiArCj4gPiAr CS8qIE1hc2sgJiBhY2sgYWxsIGludGVycnVwdHMgICovCj4gPiArCXdyaXRlbCgwLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfSUVSKTsKPiA+ICsJd3JpdGVsKFZIVUJfSVJRX0FDS19BTEwsIHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9JU1IpOwo+ID4gKwo+ID4gKwkvKiBQdWxsIGRldmljZSwgbGVhdmUg UEhZIGVuYWJsZWQgKi8KPiA+ICsJd3JpdGVsKFZIVUJfQ1RSTF9QSFlfQ0xLIHwKPiA+ICsJICAg ICAgIFZIVUJfQ1RSTF9QSFlfUkVTRVRfRElTLAo+ID4gKwkgICAgICAgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0NUUkwpOwo+ID4gKwo+ID4gKwlpZiAodmh1Yi0+Y2xrKQo+ID4gKwkJY2xrX2Rpc2Fi bGVfdW5wcmVwYXJlKHZodWItPmNsayk7Cj4gPiArCj4gPiArCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnZodWItPmxvY2ssIGZsYWdzKTsKPiA+ICsKPiA+ICsJaWYgKHZodWItPmVwMF9idWZzKQo+ ID4gKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKPiA+ICsJCQkJICBBU1RfVkhVQl9F UDBfTUFYX1BBQ0tFVCAqCj4gPiArCQkJCSAgKEFTVF9WSFVCX05VTV9QT1JUUyArIDEpLAo+ID4g KwkJCQkgIHZodWItPmVwMF9idWZzLAo+ID4gKwkJCQkgIHZodWItPmVwMF9idWZzX2RtYSk7Cj4g PiArCXZodWItPmVwMF9idWZzID0gTlVMTDsKPiA+ICsKPiA+ICsJcmV0dXJuIDA7Cj4gPiArfQo+ ID4gKwo+ID4gK3N0YXRpYyBpbnQgYXN0X3ZodWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKPiA+ICt7Cj4gPiArCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YjsKPiA+ICsJc3RydWN0 IHJlc291cmNlICpyZXM7Cj4gPiArCWludCBpLCByYyA9IDA7Cj4gPiArCj4gPiArCXZodWIgPSBk ZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp2aHViKSwgR0ZQX0tFUk5FTCk7Cj4gPiAr CWlmICghdmh1YikKPiA+ICsJCXJldHVybiAtRU5PTUVNOwo+ID4gKwo+ID4gKwlzcGluX2xvY2tf aW5pdCgmdmh1Yi0+bG9jayk7Cj4gPiArCXZodWItPnBkZXYgPSBwZGV2Owo+ID4gKwl2aHViLT5m b3JjZV91c2IxID0gZm9yY2VfdXNiMTsKPiA+ICsJdmh1Yi0+bm9fZG1hX2Rlc2MgPSBub19kbWFf ZGVzYzsKPiA+ICsKPiA+ICsJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVT T1VSQ0VfTUVNLCAwKTsKPiA+ICsJdmh1Yi0+cmVncyA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgm cGRldi0+ZGV2LCByZXMpOwo+ID4gKwlpZiAoSVNfRVJSKHZodWItPnJlZ3MpKSB7Cj4gPiArCQlk ZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7Cj4gPiArCQly ZXR1cm4gUFRSX0VSUih2aHViLT5yZWdzKTsKPiA+ICsJfQo+ID4gKwlVRENEQkcodmh1YiwgInZI dWJAJXBSIG1hcHBlZCBAJXBcbiIsIHJlcywgdmh1Yi0+cmVncyk7Cj4gPiArCj4gPiArCXBsYXRm b3JtX3NldF9kcnZkYXRhKHBkZXYsIHZodWIpOwo+ID4gKwo+ID4gKwl2aHViLT5jbGsgPSBkZXZt X2Nsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7Cj4gPiArICAgICAgICBpZiAoSVNfRVJSKHZodWIt PmNsaykpIHsKPiA+ICsgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJSKHZodWItPmNsayk7Cj4g PiArICAgICAgICAgICAgICAgIGdvdG8gZXJyOwo+ID4gKyAgICAgICAgfQo+ID4gKwlyYyA9IGNs a19wcmVwYXJlX2VuYWJsZSh2aHViLT5jbGspOwo+ID4gKwlpZiAocmMpIHsKPiA+ICsJCWRldl9l cnIoJnBkZXYtPmRldiwgIkVycm9yIGNvdWxkbid0IGVuYWJsZSBjbG9jayAoJWQpXG4iLCByYyk7 Cj4gPiArCQlnb3RvIGVycjsKPiA+ICsgICAgICAgIH0KPiA+ICsKPiA+ICsJLyogTWFzayAmIGFj ayBhbGwgaW50ZXJydXB0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgaGFuZGxlciAqLwo+ID4gKwl3 cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7Cj4gPiArCXdyaXRlbChWSFVCX0lS UV9BQ0tfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNSKTsKPiA+ICsKPiA+ICsJLyogRmlu ZCBpbnRlcnJ1cHQgYW5kIGluc3RhbGwgaGFuZGxlciAqLwo+ID4gKwl2aHViLT5pcnEgPSBwbGF0 Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwo+ID4gKwlpZiAodmh1Yi0+aXJxIDwgMCkgewo+ID4gKwkJ ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBpbnRlcnJ1cHRcbiIpOwo+ID4gKwkJ cmMgPSB2aHViLT5pcnE7Cj4gPiArCQlnb3RvIGVycjsKPiA+ICsJfQo+ID4gKwlyYyA9IGRldm1f cmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgdmh1Yi0+aXJxLCBhc3Rfdmh1Yl9pcnEsIDAsCj4gPiAr CQkJICAgICAgS0JVSUxEX01PRE5BTUUsIHZodWIpOwo+IAo+IHdlIHVzdWFsbHkgcmVseSBvbiB0 aGUgZGV2aWNlIG5hbWUsIGJ1dCBva2F5LgoKRWl0aGVyIHdvcmtzLCBJIGNhbiBjaGFuZ2UgaXQu CgpCZW4uCi0tLQpUbyB1bnN1YnNjcmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAi dW5zdWJzY3JpYmUgbGludXgtdXNiIiBpbgp0aGUgYm9keSBvZiBhIG1lc3NhZ2UgdG8gbWFqb3Jk b21vQHZnZXIua2VybmVsLm9yZwpNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBodHRwOi8vdmdlci5r ZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwK