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: [v2,2/2] phy: qualcomm: usb: Add Super-Speed PHY driver From: Jorge Ramirez Message-Id: Date: Wed, 30 Jan 2019 10:53:32 +0100 To: Bjorn Andersson Cc: gregkh@linuxfoundation.org, mark.rutland@arm.com, kishon@ti.com, jackp@codeaurora.org, andy.gross@linaro.org, swboyd@chromium.org, shawn.guo@linaro.org, vkoul@kernel.org, khasim.mohammed@linaro.org, devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-arm-msm@vger.kernel.org, linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org List-ID: T24gMS8yOS8xOSAyMToyNywgQmpvcm4gQW5kZXJzc29uIHdyb3RlOgo+IE9uIFR1ZSAyOSBKYW4g MDM6MzUgUFNUIDIwMTksIEpvcmdlIFJhbWlyZXotT3J0aXogd3JvdGU6Cj4+IGRpZmYgLS1naXQg YS9kcml2ZXJzL3BoeS9xdWFsY29tbS9waHktcWNvbS11c2Itc3MuYyBiL2RyaXZlcnMvcGh5L3F1 YWxjb21tL3BoeS1xY29tLXVzYi1zcy5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4 IDAwMDAwMDAuLmU2YWU5NmUKPj4gLS0tIC9kZXYvbnVsbAo+PiArKysgYi9kcml2ZXJzL3BoeS9x dWFsY29tbS9waHktcWNvbS11c2Itc3MuYwo+PiBAQCAtMCwwICsxLDM0NyBAQAo+PiArLy8gU1BE WC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKPj4gKy8qCj4+ICsgKiBDb3B5cmlnaHQgKGMp IDIwMTItMjAxNCwyMDE3IFRoZSBMaW51eCBGb3VuZGF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVk Lgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE4LCBMaW5hcm8gTGltaXRlZAo+PiArICovCj4+ICsK Pj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgo+ PiArI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2lvLmg+Cj4+ICsj aW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4+ ICsjaW5jbHVkZSA8bGludXgvb2YuaD4KPj4gKyNpbmNsdWRlIDxsaW51eC9waHkvcGh5Lmg+Cj4+ ICsjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgv cmVndWxhdG9yL2NvbnN1bWVyLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVzZXQuaD4KPj4gKyNp bmNsdWRlIDxsaW51eC9zbGFiLmg+Cj4+ICsKPj4gKyNkZWZpbmUgUEhZX0NUUkwwCQkJMHg2Qwo+ PiArI2RlZmluZSBQSFlfQ1RSTDEJCQkweDcwCj4+ICsjZGVmaW5lIFBIWV9DVFJMMgkJCTB4NzQK Pj4gKyNkZWZpbmUgUEhZX0NUUkw0CQkJMHg3Qwo+PiArCj4+ICsvKiBQSFlfQ1RSTCBiaXRzICov Cj4+ICsjZGVmaW5lIFJFRl9QSFlfRU4JCQlCSVQoMCkKPj4gKyNkZWZpbmUgTEFORTBfUFdSX09O CQkJQklUKDIpCj4+ICsjZGVmaW5lIFNXSV9QQ1NfQ0xLX1NFTAkJCUJJVCg0KQo+PiArI2RlZmlu ZSBUU1RfUFdSX0RPV04JCQlCSVQoNCkKPj4gKyNkZWZpbmUgUEhZX1JFU0VUCQkJQklUKDcpCj4+ ICsKPj4gK2VudW0gcGh5X3ZkZF9jdHJsIHsgRU5BQkxFLCBESVNBQkxFLCB9Owo+IAo+IFVzZSBi b29sIHRvIGRlc2NyaWJlIGJvb2xlYW4gdmFsdWVzLgoKdW0sIG9rLCBidXQgdGhlc2UgYXJlIG5v dCBib29sZWFucywgdGhleSBhcmUgYWN0aW9ucyAoaWUgY3RybCA9IGFjdGlvbgpub3QgdHJ1ZSBv ciBmYWxzZSkuCgphbnl3YXkgd2lsbCBjaGFuZ2UgaXQgdG8gc29tZXRoaW5nIGVsc2UKCj4gCj4+ ICtlbnVtIHBoeV9yZWd1bGF0b3IgeyBWREQsIFZEREExUDgsIH07Cj4gCj4gSXQgZG9lc24ndCBs b29rIGxpa2UgeW91IG5lZWQgZWl0aGVyIG9mIHRoZXNlIGlmIHlvdSByZW1vdmUgdGhlCj4gc2V0 X3ZvbHRhZ2UgY2FsbHMuCgp3ZSBuZWVkIHRvIHBvaW50IHRvIHRoZSByZWd1bGF0b3IgaW4gdGhl IGFycmF5IHNvIHdlIG5lZWQgYW4gaW5kZXggdG8gaXQKc29tZWhvdy4KCj4gCj4+ICsKPj4gK3N0 cnVjdCBzc3BoeV9wcml2IHsKPj4gKwl2b2lkIF9faW9tZW0gKmJhc2U7Cj4+ICsJc3RydWN0IGRl dmljZSAqZGV2Owo+PiArCXN0cnVjdCByZXNldF9jb250cm9sICpyZXNldF9jb207Cj4+ICsJc3Ry dWN0IHJlc2V0X2NvbnRyb2wgKnJlc2V0X3BoeTsKPj4gKwlzdHJ1Y3QgcmVndWxhdG9yICp2YnVz Owo+PiArCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpyZWdzOwo+PiArCWludCBudW1fcmVn czsKPj4gKwlzdHJ1Y3QgY2xrX2J1bGtfZGF0YSAqY2xrczsKPj4gKwlpbnQgbnVtX2Nsa3M7Cj4+ ICsJZW51bSBwaHlfbW9kZSBtb2RlOwo+PiArfTsKPj4gKwo+PiArc3RhdGljIGlubGluZSB2b2lk IHFjb21fc3NwaHlfdXBkYXRlbCh2b2lkIF9faW9tZW0gKmFkZHIsIHUzMiBtYXNrLCB1MzIgdmFs KQo+PiArewo+PiArCXdyaXRlbCgocmVhZGwoYWRkcikgJiB+bWFzaykgfCB2YWwsIGFkZHIpOwo+ PiArfQo+PiArCj4+ICtzdGF0aWMgaW5saW5lIGludCBxY29tX3NzcGh5X3ZidXNfZW5hYmxlKHN0 cnVjdCByZWd1bGF0b3IgKnZidXMpCj4+ICt7Cj4+ICsJcmV0dXJuICFyZWd1bGF0b3JfaXNfZW5h YmxlZCh2YnVzKSA/IHJlZ3VsYXRvcl9lbmFibGUodmJ1cykgOiAwOwo+IAo+IHJlZ3VsYXRvcl9p c19lbmFibGVkKCkgd2lsbCBjaGVjayBpZiB0aGUgYWN0dWFsIHJlZ3VsYXRvciBpcyBvbiwgbm90 IGlmCj4geW91IGFscmVhZHkgdm90ZWQgZm9yIGl0Lgo+IAo+IFNvIGlmIHNvbWV0aGluZyBlbHNl IGlzIGVuYWJsaW5nIHRoZSB2YnVzIHJlZ3VsYXRvciB5b3Ugd2lsbCBza2lwIHlvdXIKPiBlbmFi bGUgYW5kIGJlIGluIHRoZSBtZXJjeSBvZiB0aGVtIG5vdCByZWxlYXNpbmcgaXQuIFByZXN1bWFi bHkgdGhlcmUncwo+IG9ubHkgb25lIGNvbnN1bWVyIG9mIHRoaXMgcGFydGljdWxhciByZWd1bGF0 b3IsIGJ1dCBpdCdzIGEgYmFkIGhhYml0LgoKeWVwCgo+IAo+IFBsZWFzZSBrZWVwIHRyYWNrIG9m IHRoaXMgZHJpdmVycyByZXF1ZXN0ZWQgc3RhdGUgaW4gdGhpcyBkcml2ZXIsIGlmCj4gcWNvbV9z c3BoeV92YnVzX2N0cmwoKSBpcyBjYWxsZWQgbm90IG9ubHkgZm9yIHRoZSBzdGF0ZSBjaGFuZ2Vz LgoKdW0sIHRoZXJlIGlzIG5vdCBzdWNoIGEgZnVuY3Rpb246IHRoZSBjdHJsIGZ1bmN0aW9uIGlz IG5vdCBmb3IgdmJ1cyBidXQKZm9yIHZkZAoKPiAKPj4gK30KPj4gKwo+PiArc3RhdGljIGlubGlu ZSBpbnQgcWNvbV9zc3BoeV92YnVzX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqdmJ1cykKPj4g K3sKPj4gKwlyZXR1cm4gcmVndWxhdG9yX2lzX2VuYWJsZWQodmJ1cykgPyByZWd1bGF0b3JfZGlz YWJsZSh2YnVzKSA6IDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcWNvbV9zc3BoeV92ZGRf Y3RybChzdHJ1Y3Qgc3NwaHlfcHJpdiAqcHJpdiwgZW51bSBwaHlfdmRkX2N0cmwgY3RybCkKPiAK PiBBcyBkaXNjdXNzZWQgb24gSVJDLCBJIHRoaW5rIHlvdSBzaG91bGQganVzdCBsZWF2ZSB0aGUg dm9sdGFnZQo+IGNvbnN0cmFpbnRzIHRvIERldmljZVRyZWUuCgp5ZXMKCj4gCj4+ICt7Cj4+ICsJ Y29uc3QgaW50IHZkZF9taW4gPSBjdHJsID09IEVOQUJMRSA/IDEwNTAwMDAgOiAwOwo+PiArCWNv bnN0IGludCB2ZGRfbWF4ID0gMTA1MDAwMDsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJcmV0ID0g cmVndWxhdG9yX3NldF92b2x0YWdlKHByaXYtPnJlZ3NbVkREXS5jb25zdW1lciwgdmRkX21pbiwg dmRkX21heCk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJZGV2X2Vycihwcml2LT5kZXYsICJGYWlsZWQg dG8gc2V0IHJlZ3VsYXRvciB2ZGQgdG8gJWRcbiIsCj4+ICsJCQl2ZGRfbWluKTsKPj4gKwo+PiAr CXJldHVybiByZXQ7Cj4+ICt9Cj4gWy4uXQo+PiArc3RhdGljIGludCBxY29tX3NzcGh5X3Bvd2Vy X29uKHN0cnVjdCBwaHkgKnBoeSkKPj4gK3sKPj4gKwlzdHJ1Y3Qgc3NwaHlfcHJpdiAqcHJpdiA9 IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlyZXQgPSBxY29t X3NzcGh5X3ZkZF9jdHJsKHByaXYsIEVOQUJMRSk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJu IHJldDsKPj4gKwo+PiArCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShwcml2LT5udW1fcmVn cywgcHJpdi0+cmVncyk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJZ290byBlcnIxOwo+PiArCj4+ICsJ cmV0ID0gY2xrX2J1bGtfcHJlcGFyZV9lbmFibGUocHJpdi0+bnVtX2Nsa3MsIHByaXYtPmNsa3Mp Owo+PiArCWlmIChyZXQpCj4+ICsJCWdvdG8gZXJyMjsKPj4gKwo+PiArCXJldCA9IHFjb21fc3Nw aHlfdmJ1c19jdHJsKHByaXYtPnZidXMsIHByaXYtPm1vZGUpOwo+PiArCWlmIChyZXQpCj4+ICsJ CWdvdG8gZXJyMzsKPj4gKwo+PiArCXJldCA9IHFjb21fc3NwaHlfZG9fcmVzZXQocHJpdik7Cj4+ ICsJaWYgKHJldCkKPj4gKwkJZ290byBlcnI0Owo+PiArCj4+ICsJd3JpdGViKFNXSV9QQ1NfQ0xL X1NFTCwgcHJpdi0+YmFzZSArIFBIWV9DVFJMMCk7Cj4+ICsJcWNvbV9zc3BoeV91cGRhdGVsKHBy aXYtPmJhc2UgKyBQSFlfQ1RSTDQsIExBTkUwX1BXUl9PTiwgTEFORTBfUFdSX09OKTsKPj4gKwlx Y29tX3NzcGh5X3VwZGF0ZWwocHJpdi0+YmFzZSArIFBIWV9DVFJMMiwgUkVGX1BIWV9FTiwgUkVG X1BIWV9FTik7Cj4+ICsJcWNvbV9zc3BoeV91cGRhdGVsKHByaXYtPmJhc2UgKyBQSFlfQ1RSTDQs IFRTVF9QV1JfRE9XTiwgMCk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK2VycjQ6Cj4gCj4gTmFt ZSB5b3VyIGxhYmVscyBiYXNlZCBvbiB3aGF0IHRoZXkgZG8sIGUuZy4gZXJyX2Rpc2FibGVfdmJ1 cy4KCm9rCgo+IAo+PiArCWlmIChwcml2LT52YnVzICYmIHByaXYtPm1vZGUgIT0gUEhZX01PREVf SU5WQUxJRCkKPj4gKwkJcWNvbV9zc3BoeV92YnVzX2Rpc2FibGUocHJpdi0+dmJ1cyk7Cj4gCj4g cWNvbV9zc3BoeV92YnVzX2N0cmwoKSBhYm92ZSB3YXMgZWl0aGVyIGVuYWJsaW5nIG9yIGRpc2Fi bGluZyB2YnVzLCBidXQKPiBoZXJlIHlvdSdyZSBkaXJlY3RseSBjYWxsaW5nIGRpc2FibGUgdG8g dW5yb2xsIHRoYXQuIEl0IHRoaW5rIHRoZSByZXN1bHQKPiBpcyBjb3JyZWN0IChpbiBob3N0IHRo aXMgcmV2ZXJ0cyB0byBkaXNhYmxlZCBhbmQgaW4gZ2FkZ2V0IGl0J3MgYQo+IG5vLW9wKSwgYnV0 IEknbSBub3Qgc3VyZSBJIGxpa2UgdGhlIGRlc2lnbiBvZiBzb21ldGltZXMgY2FsbGluZyBzdHJh aWdodAo+IHRvIHRoZSB2YnVzIGVuYWJsZS9kaXNhYmxlIGFuZCBzb21ldGltZXMgdG8gdGhlIHdy YXBwZXIgZnVuY3Rpb24uCgpJIHRoaW5rIHlvdSBtaXNyZWFkOiB3ZSBoYXZlIHZidXMgZW5hYmxl L2Rpc2FibGUgYW5kIHZkZCBjb250cm9sCihkaWZmZXJlbnQgcmVndWxhdG9ycykKCgpJIGhhdmUg dG8gYWRtaXQgdGhhdCB0aGUgb25seSByZWFzb24gSSBoYWQgc2VwYXJhdGUgZnVuY3Rpb25zIGZv ciB2YnVzCmVuYWJsZS9kaXNhYmxlIHdhcyBjb3NtZXRpYyAoYW5kICJpZiIgb24gdGhlIGNvbnRy b2wgdmFyaWFibGUgKyBhbm90aGVyCiJpZiIgdG8gY2hlY2sgdGhhdCB0aGUgcmVndWxhdG9yIHdh cyBhbHJlYWR5IHZvdGVkIHdhcyB0YWtpbmcgbWUgYmV5b25kCnRoZSA4MCBsaW5lcyBjaGFyYWN0 ZXIgYW5kIEkgaGF0ZSB3aGVuIHRoYXQgaGFwcGVucyBvbiBzaW1wbGUKb3BlcmF0aW9ucykuIGFu eXdheSB3aWxsIHJlZG8KCj4gCj4+ICtlcnIzOgo+IAo+IGVycl9jbGtfZGlzYWJsZQo+IAo+PiAr CWNsa19idWxrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPm51bV9jbGtzLCBwcml2LT5jbGtzKTsK Pj4gK2VycjI6Cj4+ICsJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShwcml2LT5udW1fcmVncywgcHJp di0+cmVncyk7Cj4+ICtlcnIxOgo+PiArCXFjb21fc3NwaHlfdmRkX2N0cmwocHJpdiwgRElTQUJM RSk7Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHFjb21f c3NwaHlfcG93ZXJfb2ZmKHN0cnVjdCBwaHkgKnBoeSkKPj4gK3sKPj4gKwlzdHJ1Y3Qgc3NwaHlf cHJpdiAqcHJpdiA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+PiArCj4+ICsJcWNvbV9zc3BoeV91 cGRhdGVsKHByaXYtPmJhc2UgKyBQSFlfQ1RSTDQsIExBTkUwX1BXUl9PTiwgMCk7Cj4+ICsJcWNv bV9zc3BoeV91cGRhdGVsKHByaXYtPmJhc2UgKyBQSFlfQ1RSTDIsIFJFRl9QSFlfRU4sIDApOwo+ PiArCXFjb21fc3NwaHlfdXBkYXRlbChwcml2LT5iYXNlICsgUEhZX0NUUkw0LCBUU1RfUFdSX0RP V04sIFRTVF9QV1JfRE9XTik7Cj4+ICsKPj4gKwljbGtfYnVsa19kaXNhYmxlX3VucHJlcGFyZShw cml2LT5udW1fY2xrcywgcHJpdi0+Y2xrcyk7Cj4+ICsJcmVndWxhdG9yX2J1bGtfZGlzYWJsZShw cml2LT5udW1fcmVncywgcHJpdi0+cmVncyk7Cj4+ICsKPj4gKwlpZiAocHJpdi0+dmJ1cyAmJiBw cml2LT5tb2RlICE9IFBIWV9NT0RFX0lOVkFMSUQpCj4+ICsJCXFjb21fc3NwaHlfdmJ1c19kaXNh YmxlKHByaXYtPnZidXMpOwo+PiArCj4+ICsJcWNvbV9zc3BoeV92ZGRfY3RybChwcml2LCBESVNB QkxFKTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHFjb21f c3NwaHlfaW5pdF9jbG9jayhzdHJ1Y3Qgc3NwaHlfcHJpdiAqcHJpdikKPj4gK3sKPj4gKwljb25z dCBjaGFyICogY29uc3QgY2xrX2lkW10gPSB7ICJyZWYiLCAicGh5IiwgInBpcGUiLCB9Owo+PiAr CWludCBpOwo+PiArCj4+ICsJcHJpdi0+bnVtX2Nsa3MgPSBBUlJBWV9TSVpFKGNsa19pZCk7Cj4+ ICsJcHJpdi0+Y2xrcyA9IGRldm1fa2NhbGxvYyhwcml2LT5kZXYsIHByaXYtPm51bV9jbGtzLAo+ PiArCQkJCSAgc2l6ZW9mKCpwcml2LT5jbGtzKSwgR0ZQX0tFUk5FTCk7Cj4gCj4gWW91IGtub3cg bnVtX2Nsa3MgaXMgMywgc28gSSB3b3VsZCBzdWdnZXN0IHRoYXQgeW91IGp1c3QgY2hhbmdlIHRo ZQo+IHNzaHBoeV9wcml2IHRvIGNsa3NbM10gYW5kIHNraXAgdGhlIGR5bmFtaWMgYWxsb2NhdGlv bi4KCgpvawoKPiAKPiAKPiBBbHNvLCBhcyBudW1fY2xrcyBhbHdheXMgaXMgQVJSQVlfU0laRShw cml2LT5jbGtzKSBJIHdvdWxkIHN1Z2dlc3QgdXNpbmcKPiB0aGUgbGF0dGVyLCB0byBtYWtlIHRo YXQgY2xlYXIgdGhyb3VnaG91dCB0aGUgZHJpdmVyLgoKbWF5YmUgdGhlbiBqdXN0IGRlZmluZSBO QlJfQ0xLUyAoSSBmaW5kIGxvbmcgbGluZXMgYSBwYWluIHRvIHJlYWQpCgo+IAo+PiArCWlmICgh cHJpdi0+Y2xrcykKPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBp IDwgcHJpdi0+bnVtX2Nsa3M7IGkrKykKPj4gKwkJcHJpdi0+Y2xrc1tpXS5pZCA9IGNsa19pZFtp XTsKPiAKPiBUaGVyZSdzIG5vIGhhcm0gaW4ganVzdCB3cml0aW5nIHRoaXMgb24gdGhyZWUgbGlu ZXM6Cj4gCj4gCXByaXYtPmNsa3NbMF0uaWQgPSAicmVmIjsKPiAJcHJpdi0+Y2xrc1sxXS5pZCA9 ICJwaHkiOwo+IAlwcml2LT5jbGtzWzJdLmlkID0gInBpcGUiOwo+IAo+PiArCj4+ICsJcmV0dXJu IGRldm1fY2xrX2J1bGtfZ2V0KHByaXYtPmRldiwgcHJpdi0+bnVtX2Nsa3MsIHByaXYtPmNsa3Mp Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHFjb21fc3NwaHlfaW5pdF9yZWd1bGF0b3Ioc3Ry dWN0IHNzcGh5X3ByaXYgKnByaXYpCj4+ICt7Cj4+ICsJY29uc3QgY2hhciAqIGNvbnN0IHJlZ19z dXBwbGllc1tdID0gewo+PiArCQlbVkREXSA9ICJ2ZGQiLAo+PiArCQlbVkREQTFQOF0gPSAidmRk YTFwOCIsCj4+ICsJfTsKPj4gKwlpbnQgcmV0LCBpOwo+PiArCj4+ICsJcHJpdi0+bnVtX3JlZ3Mg PSBBUlJBWV9TSVpFKHJlZ19zdXBwbGllcyk7Cj4+ICsJcHJpdi0+cmVncyA9IGRldm1fa2NhbGxv Yyhwcml2LT5kZXYsIHByaXYtPm51bV9yZWdzLAo+PiArCQkJCSAgc2l6ZW9mKCpwcml2LT5yZWdz KSwgR0ZQX0tFUk5FTCk7Cj4gCj4gQXMgd2l0aCBjbG9ja3MsIHlvdSBrbm93IHRoZXJlIHdpbGwg b25seSBiZSAyIG9mIHRoZXNlLCBtYWtlIGl0IGZpeGVkCj4gc2l6ZSBpbiBzc3BoeV9wcml2LgoK d2VsbCBvawoKPiAKPiBBbmQgYXMgd2l0aCBjbG9ja3MsIEkgd291bGQgc3VnZ2VzdCB1c2luZyBB UlJBWV9TSVpFKHByaXYtPnJlZ3MpCj4gdGhyb3VnaG91dCB0aGUgZHJpdmVyIHRvIG1ha2UgaXQg b2J2aW91cyB0aGF0J3MgaXQncyBhIHN0YXRpYyBudW1iZXIuIAo+IAo+PiArCWlmICghcHJpdi0+ cmVncykKPj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgcHJp di0+bnVtX3JlZ3M7IGkrKykKPj4gKwkJcHJpdi0+cmVnc1tpXS5zdXBwbHkgPSByZWdfc3VwcGxp ZXNbaV07Cj4gCj4gQXMgd2l0aCBjbG9ja3MsIGp1c3QgdW5yb2xsIHRoaXMgYW5kIGZpbGwgaW4g dGhlIDIgc3VwcGxpZXMgZGlyZWN0bHkuCgp1bSwgb2ssIEkgZmluZCB0aGUgYWJvdmUgbW9yZSBy ZWFkYWJsZSBidXQgSSBzZWUgd2hlcmUgeW91IGFyZSBnb2luZwp3aXRoIHRoZXNlIHNvcnQgb2Yg cmVjb21lbmRhdGlvbnMuLi53aWxsIGp1c3QgZm9sbG93IHRoZW0KCj4gCj4+ICsKPj4gKwlyZXQg PSBkZXZtX3JlZ3VsYXRvcl9idWxrX2dldChwcml2LT5kZXYsIHByaXYtPm51bV9yZWdzLCBwcml2 LT5yZWdzKTsKPj4gKwlpZiAocmV0KQo+PiArCQlyZXR1cm4gcmV0Owo+PiArCj4+ICsJcHJpdi0+ dmJ1cyA9IGRldm1fcmVndWxhdG9yX2dldF9vcHRpb25hbChwcml2LT5kZXYsICJ2YnVzIik7Cj4g Cj4gZ2V0X29wdGlvbmFsIG1lYW5zIHRoYXQgaWYgdmJ1cy1zdXBwbHkgaXMgbm90IGZvdW5kLCBy YXRoZXIgdGhhbgo+IHJldHVybmluZyBhIGR1bW15IHJlZ3VsYXRvciBvYmplY3QgdGhpcyB3aWxs IGZhaWwgd2l0aCAtRU5PREVWLgoKeWVzIEkgbWVzc2VkIHRoaXMgdXAuCgo+IAo+IEdpdmVuIHRo ZSByZXN0IG9mIHRoZSBsb2dpYyByZWxhdGVkIHRvIHZidXMgeW91IHNob3VsZCBzZXQgdmJ1cyB0 byBOVUxMCj4gaWYgdGhlIHJldHVybmVkIFBUUl9FUlIodmFsdWUpIGlzIC1FTk9ERVYsIGFuZCBm YWlsIGZvciBvdGhlciBlcnJvcnMuCj4gCj4gCj4gT3IganVzdCBkcm9wIHRoZSBfb3B0aW9uYWws IGFuZCBsZXQgeW91ciB2YnVzIGNvbnRyb2xzIG9wZXJhdGUgb24gdGhlCj4gZHVtbXkgcmVndWxh dG9yIHlvdSBnZXQgYmFjay4KCnllcyB3aWxsIGRvIHRoaXMuIHRoYW5rcyBmb3IgdGhlIHN1Z2dl c3Rpb24gYW5kIHRoZSByZXZpZXchCgo+IAo+IChSaWdodCBub3cgdmJ1cyBjYW4ndCBiZSBOVUxM LCBzbyB0aGVzZSBjaGVja3MgYXJlIG5vdCB2ZXJ5IHVzZWZ1bCkKPiAKPj4gKwlpZiAoSVNfRVJS KHByaXYtPnZidXMpKQo+PiArCQlyZXR1cm4gUFRSX0VSUihwcml2LT52YnVzKTsKPj4gKwo+PiAr CXJldHVybiAwOwo+IAo+IHJldHVybiBQVFJfRVJSX09SX1pFUk8ocHJpdi0+dmJ1cykKPiAKPiAo QWx0aG91Z2ggdGhhdCBtaWdodCBjaGFuZ2UgYmFzZWQgb24gYWJvdmUgY29tbWVudCkKPiAKPj4g K30KPiAKPiBSZWdhcmRzLAo+IEJqb3JuCj4K