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: [v0,3/4] drivers: edac: Add cache erp driver for Last Level Cache Controller (LLCC) From: Venkata Narendra Kumar Gutta Message-Id: <090d55ef84af7bc6c750b93219408437@codeaurora.org> Date: Mon, 30 Jul 2018 14:38:01 -0700 To: Borislav Petkov Cc: evgreen@chromium.org, robh@kernel.org, mchehab@kernel.org, linux-edac@vger.kernel.org, linux-kernel@vger.kernel.org, andy.gross@linaro.org, david.brown@linaro.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org, robh+dt@kernel.org, mark.rutland@arm.com, devicetree@vger.kernel.org, tsoni@codeaurora.org, ckadabi@codeaurora.org, rishabhb@codeaurora.org List-ID: T24gMjAxOC0wNy0yOCAyMDo0OSwgQm9yaXNsYXYgUGV0a292IHdyb3RlOgo+IE9uIFdlZCwgSnVs IDI1LCAyMDE4IGF0IDEwOjQ0OjU2QU0gLTA3MDAsIFZlbmthdGEgTmFyZW5kcmEgS3VtYXIgR3V0 dGEgCj4gd3JvdGU6Cj4+IEFkZCBjYWNoZSBlcnJvciByZXBvcnRpbmcgZHJpdmVyIGZvciBzaW5n bGUgYW5kIGRvdWJsZSBiaXQgZXJyb3JzIG9uCj4+IExhc3QgTGV2ZWwgQ2FjaGUgQ29udHJvbGxl ciAoTExDQykgY2FjaGUuIFRoaXMgZHJpdmVyIHRha2VzIGNhcmUgb2YKPj4gZHVtcGluZyByZWdp c3RlcnMgYW5kIGFkZCBjb25maWcgb3B0aW9ucyB0byBlbmFibGUgYW5kIGRpc2FibGUgcGFuaWMK Pj4gd2hlbiB0aGVzZSBlcnJvcnMgaGFwcGVuLgo+PiAKPj4gU2lnbmVkLW9mZi1ieTogQ2hhbm5h Z291ZCBLYWRhYmkgPGNrYWRhYmlAY29kZWF1cm9yYS5vcmc+Cj4+IFNpZ25lZC1vZmYtYnk6IFZl bmthdGEgTmFyZW5kcmEgS3VtYXIgR3V0dGEgPHZua2d1dHRhQGNvZGVhdXJvcmEub3JnPgo+IAo+ IFRoaXMgU09CIGNoYWluIGRvZXNuJ3QgbWFrZSBhbnkgc2Vuc2UgLSBzZWUKPiBEb2N1bWVudGF0 aW9uL3Byb2Nlc3Mvc3VibWl0dGluZy1wYXRjaGVzLnJzdAoKRG8geW91IG1lYW4gdGhlIFNpZ25l ZC1vZmYtYnkgbGluZXMgYWJvdmU/IFRoYXQncyBiZWNhdXNlCkNoYW5uYWdvdWQgaXMgdGhlIG9u ZSB3aG8gaXMgdGhlIG9yaWdpbmFsIGF1dGhvciBvZiB0aGlzIGRyaXZlciwKYW5kIEknbSB0aGUg b25lIHdobyBkaWQgdGhlIGluY3JlbWVudGFsIGNoYW5nZXMgKGNoYW5nZXMgaW4gbGxjYykKYW5k IHVwbG9hZGluZyBpdCB1cHN0cmVhbS4KVGhhdCdzIHdoeSB0aGUgU2lnbmVkLW9mZiBpcyBsaWtl IHRoYXQuCldoaWNoIHdheSBkbyB5b3UgdGhpbmsgaXQgc2hvdWxkIGJlPwoKPiAKPj4gLS0tCj4+ ICBkcml2ZXJzL2VkYWMvS2NvbmZpZyAgICAgICAgICB8ICAyMSArKwo+PiAgZHJpdmVycy9lZGFj L01ha2VmaWxlICAgICAgICAgfCAgIDEgKwo+PiAgZHJpdmVycy9lZGFjL3Fjb21fbGxjY19lZGFj LmMgfCA1MjAgCj4+ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ PiAgMyBmaWxlcyBjaGFuZ2VkLCA1NDIgaW5zZXJ0aW9ucygrKQo+PiAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvZWRhYy9xY29tX2xsY2NfZWRhYy5jCj4gCj4gTmVlZHMgTUFJTlRBSU5FUlMg ZW50cnkgc28gdGhhdCB5b3UgZ2V0IGFsbCB0aGUgYnVnIHJlcG9ydHMuCkknbGwgdXBkYXRlIGl0 Lgo+IAo+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL0tjb25maWcgYi9kcml2ZXJzL2VkYWMv S2NvbmZpZwo+PiBpbmRleCA1NzMwNGIyLi42ODUxOGFkIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJz L2VkYWMvS2NvbmZpZwo+PiArKysgYi9kcml2ZXJzL2VkYWMvS2NvbmZpZwo+PiBAQCAtNDYwLDQg KzQ2MCwyNSBAQCBjb25maWcgRURBQ19USQo+PiAgCSAgU3VwcG9ydCBmb3IgZXJyb3IgZGV0ZWN0 aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZQo+PiAgICAgICAgICAgIFRJIFNvQ3MuCj4+IAo+PiAr Y29uZmlnIEVEQUNfUUNPTV9MTENDCj4+ICsgICAgICAgIGRlcGVuZHMgb24gUUNPTV9MTENDCj4+ ICsgICAgICAgIHRyaXN0YXRlICJRQ09NIEVEQUMgQ29udHJvbGxlciBmb3IgTExDQyBDYWNoZSIK PiAKPiBObyBlZGFjIGRyaXZlciBwZXIgZnVuY3Rpb25hbCB1bml0IHBscyAtIHNlZSBob3cgYWx0 ZXJhX2VkYWMuYyBkb2VzIGl0LAo+IGZvciBleGFtcGxlLiBJT1csIHRoaXMgZHJpdmVyIC0gaWYg aXQgY2Fubm90IHNoYXJlL3JldXNlIGFueSBvZiB0aGUKPiBleGlzdGluZyBlZGFjIGRyaXZlcnMs IGl0IHNob3VsZCBiZSBjYWxsZWQgcWNvbV9lZGFjIGFuZCBjb250YWluIGFsbCAKPiB0aGUKPiBR dWFsY29tbS1zcGVjaWZpYyBSQVMgZmVhdHVyZXMgdGhlcmUuCgpPaywgSSdsbCByZWZhY3RvciBp dC4KCgo+IAo+PiArICAgICAgICBoZWxwCj4+ICsgICAgICAgICAgU3VwcG9ydCBmb3IgZXJyb3Ig ZGV0ZWN0aW9uIGFuZCBjb3JyZWN0aW9uIG9uIHRoZQo+PiArICAgICAgICAgIFFDT00gTExDQyBj YWNoZS4gUmVwb3J0IGVycm9ycyBjYXVnaHQgYnkgTExDQyBFQ0MKPj4gKyAgICAgICAgICBtZWNo YW5pc20uCj4+ICsKPj4gKyAgICAgICAgICBGb3IgZGVidWdnaW5nIGlzc3VlcyBoYXZpbmcgdG8g ZG8gd2l0aCBzdGFiaWxpdHkgYW5kIAo+PiBvdmVyYWxsIHN5c3RlbQo+PiArICAgICAgICAgIGhl YWx0aCwgeW91IHNob3VsZCBwcm9iYWJseSBzYXkgJ1knIGhlcmUuCj4+ICsKPj4gK2NvbmZpZyBF REFDX1FDT01fTExDQ19QQU5JQ19PTl9VRQo+PiArICAgICAgICBkZXBlbmRzIG9uIEVEQUNfUUNP TV9MTENDCj4+ICsgICAgICAgIGJvb2wgIlBhbmljIG9uIHVuY29ycmVjdGFibGUgZXJyb3JzIC0g cWNvbSBsbGNjIgo+PiArICAgICAgICBoZWxwCj4+ICsgICAgICAgICAgRm9yY2libHkgY2F1c2Ug YSBrZXJuZWwgcGFuaWMgaWYgYW4gdW5jb3JyZWN0YWJsZSBlcnJvciAKPj4gKFVFKSBpcwo+PiAr ICAgICAgICAgIGRldGVjdGVkLiBUaGlzIGNhbiByZWR1Y2UgZGVidWdnaW5nIHRpbWVzIG9uIGhh cmR3YXJlIHdoaWNoIAo+PiBtYXkgYmUKPj4gKyAgICAgICAgICBvcGVyYXRpbmcgYXQgdm9sdGFn ZXMgb3IgZnJlcXVlbmNpZXMgb3V0c2lkZSBub3JtYWwgCj4+IHNwZWNpZmljYXRpb24uCj4+ICsK Pj4gKyAgICAgICAgICBGb3IgcHJvZHVjdGlvbiBidWlsZHMsIHlvdSBzaG91bGQgcHJvYmFibHkg c2F5ICdOJyBoZXJlLgo+PiArCj4+ICBlbmRpZiAjIEVEQUMKPj4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvZWRhYy9NYWtlZmlsZSBiL2RyaXZlcnMvZWRhYy9NYWtlZmlsZQo+PiBpbmRleCAwMmI0M2E3 Li4yOGFmZjI4IDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2VkYWMvTWFrZWZpbGUKPj4gKysrIGIv ZHJpdmVycy9lZGFjL01ha2VmaWxlCj4+IEBAIC03NywzICs3Nyw0IEBAIG9iai0kKENPTkZJR19F REFDX0FMVEVSQSkJCSs9IGFsdGVyYV9lZGFjLm8KPj4gIG9iai0kKENPTkZJR19FREFDX1NZTk9Q U1lTKQkJKz0gc3lub3BzeXNfZWRhYy5vCj4+ICBvYmotJChDT05GSUdfRURBQ19YR0VORSkJCSs9 IHhnZW5lX2VkYWMubwo+PiAgb2JqLSQoQ09ORklHX0VEQUNfVEkpCQkJKz0gdGlfZWRhYy5vCj4+ ICtvYmotJChDT05GSUdfRURBQ19RQ09NX0xMQ0MpCQkrPSBxY29tX2xsY2NfZWRhYy5vCj4+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvcWNvbV9sbGNjX2VkYWMuYyAKPj4gYi9kcml2ZXJzL2Vk YWMvcWNvbV9sbGNjX2VkYWMuYwo+PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+PiBpbmRleCAwMDAw MDAwLi43YTY3OGI1Cj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy9lZGFjL3Fjb21f bGxjY19lZGFjLmMKPj4gQEAgLTAsMCArMSw1MjAgQEAKPj4gKy8vIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wCj4+ICsvKgo+PiArICogQ29weXJpZ2h0IChjKSAyMDE4LCBUaGUgTGlu dXggRm91bmRhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KPj4gKyAqLwo+PiArCj4+ICsjaW5j bHVkZSA8bGludXgva2VybmVsLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvZWRhYy5oPgo+PiArI2lu Y2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L3Nw aW5sb2NrLmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Cj4+ICsjaW5jbHVkZSA8bGlu dXgvaW50ZXJydXB0Lmg+Cj4+ICsjaW5jbHVkZSA8bGludXgvc29jL3Fjb20vbGxjYy1xY29tLmg+ Cj4+ICsjaW5jbHVkZSAiZWRhY19tYy5oIgo+PiArI2luY2x1ZGUgImVkYWNfZGV2aWNlLmgiCj4+ ICsKPj4gKyNpZmRlZiBDT05GSUdfRURBQ19RQ09NX0xMQ0NfUEFOSUNfT05fVUUKPj4gKyNkZWZp bmUgTExDQ19FUlBfUEFOSUNfT05fVUUgMQo+PiArI2Vsc2UKPj4gKyNkZWZpbmUgTExDQ19FUlBf UEFOSUNfT05fVUUgMAo+PiArI2VuZGlmCj4+ICsKPj4gKyNkZWZpbmUgRURBQ19MTENDCSJxY29t X2xsY2MiCj4+ICsKPj4gKyNkZWZpbmUgVFJQX1NZTl9SRUdfQ05UCTYKPj4gKwo+PiArI2RlZmlu ZSBEUlBfU1lOX1JFR19DTlQJOAo+PiArCj4+ICsjZGVmaW5lIExMQ0NfQ09NTU9OX1NUQVRVUzAJ CTB4MDAwMzAwMEMKPj4gKyNkZWZpbmUgTExDQ19MQl9DTlRfTUFTSwkJR0VOTUFTSygzMSwgMjgp Cj4+ICsjZGVmaW5lIExMQ0NfTEJfQ05UX1NISUZUCQkyOAo+PiArCj4+ICsvKiBzaW5nbGUgJiBE b3VibGUgQml0IHN5bmRyb21lIHJlZ2lzdGVyIG9mZnNldHMgKi8KPj4gKyNkZWZpbmUgVFJQX0VD Q19TQl9FUlJfU1lOMAkJMHgwMDAyMzA0Qwo+PiArI2RlZmluZSBUUlBfRUNDX0RCX0VSUl9TWU4w CQkweDAwMDIwMzcwCj4+ICsjZGVmaW5lIERSUF9FQ0NfU0JfRVJSX1NZTjAJCTB4MDAwNDIwNEMK Pj4gKyNkZWZpbmUgRFJQX0VDQ19EQl9FUlJfU1lOMAkJMHgwMDA0MjA3MAo+PiArCj4+ICsvKiBF cnJvciByZWdpc3RlciBvZmZzZXRzICovCj4+ICsjZGVmaW5lIFRSUF9FQ0NfRVJST1JfU1RBVFVT MQkJMHgwMDAyMDM0OAo+PiArI2RlZmluZSBUUlBfRUNDX0VSUk9SX1NUQVRVUzAJCTB4MDAwMjAz NDQKPj4gKyNkZWZpbmUgRFJQX0VDQ19FUlJPUl9TVEFUVVMxCQkweDAwMDQyMDQ4Cj4+ICsjZGVm aW5lIERSUF9FQ0NfRVJST1JfU1RBVFVTMAkJMHgwMDA0MjA0NAo+PiArCj4+ICsvKiBUUlAsIERS UCBpbnRlcnJ1cHQgcmVnaXN0ZXIgb2Zmc2V0cyAqLwo+PiArI2RlZmluZSBEUlBfSU5URVJSVVBU X1NUQVRVUwkJMHgwMDA0MTAwMAo+PiArI2RlZmluZSBUUlBfSU5URVJSVVBUXzBfU1RBVFVTCQkw eDAwMDIwNDgwCj4+ICsjZGVmaW5lIERSUF9JTlRFUlJVUFRfQ0xFQVIJCTB4MDAwNDEwMDgKPj4g KyNkZWZpbmUgRFJQX0VDQ19FUlJPUl9DTlRSX0NMRUFSCTB4MDAwNDAwMDQKPj4gKyNkZWZpbmUg VFJQX0lOVEVSUlVQVF8wX0NMRUFSCQkweDAwMDIwNDg0Cj4+ICsjZGVmaW5lIFRSUF9FQ0NfRVJS T1JfQ05UUl9DTEVBUgkweDAwMDIwNDQwCj4+ICsKPj4gKy8qIE1hc2sgYW5kIHNoaWZ0IG1hY3Jv cyAqLwo+PiArI2RlZmluZSBFQ0NfREJfRVJSX0NPVU5UX01BU0sJR0VOTUFTSyg0LCAwKQo+IAo+ IEFsaWduIGFsbCB0aG9zZSB0byB0aGUgc2FtZSB2ZXJ0aWNhbCBjb2x1bW4uClN1cmUsIEknbGwg dXBkYXRlIGl0IGluIHRoZSBuZXh0IHBhdGNoIHNldC4KPiAKPj4gKyNkZWZpbmUgRUNDX0RCX0VS Ul9XQVlTX01BU0sJR0VOTUFTSygzMSwgMTYpCj4+ICsjZGVmaW5lIEVDQ19EQl9FUlJfV0FZU19T SElGVAlCSVQoNCkKPj4gKwo+PiArI2RlZmluZSBFQ0NfU0JfRVJSX0NPVU5UX01BU0sJR0VOTUFT SygyMywgMTYpCj4+ICsjZGVmaW5lIEVDQ19TQl9FUlJfQ09VTlRfU0hJRlQJQklUKDQpCj4+ICsj ZGVmaW5lIEVDQ19TQl9FUlJfV0FZU19NQVNLCUdFTk1BU0soMTUsIDApCj4+ICsKPj4gKyNkZWZp bmUgU0JfRUNDX0VSUk9SCQlCSVQoMCkKPj4gKyNkZWZpbmUgREJfRUNDX0VSUk9SCQlCSVQoMSkK Pj4gKwo+PiArI2RlZmluZSBEUlBfVFJQX0lOVF9DTEVBUglHRU5NQVNLKDEsIDApCj4+ICsjZGVm aW5lIERSUF9UUlBfQ05UX0NMRUFSCUdFTk1BU0soMSwgMCkKPj4gKwo+PiArLyogQ29uZmlnIHJl Z2lzdGVycyBvZmZzZXRzKi8KPj4gKyNkZWZpbmUgRFJQX0VDQ19FUlJPUl9DRkcgICAgICAgMHgw MDA0MDAwMAo+PiArCj4+ICsvKiBUUlAsIERSUCBpbnRlcnJ1cHQgcmVnaXN0ZXIgb2Zmc2V0cyAq Lwo+PiArI2RlZmluZSBDTU5fSU5URVJSVVBUXzBfRU5BQkxFICAgICAgICAgIDB4MDAwMzAwMUMK Pj4gKyNkZWZpbmUgQ01OX0lOVEVSUlVQVF8yX0VOQUJMRSAgICAgICAgICAweDAwMDMwMDNDCj4+ ICsjZGVmaW5lIFRSUF9JTlRFUlJVUFRfMF9FTkFCTEUgICAgICAgICAgMHgwMDAyMDQ4OAo+PiAr I2RlZmluZSBEUlBfSU5URVJSVVBUX0VOQUJMRSAgICAgICAgICAgIDB4MDAwNDEwMEMKPj4gKwo+ PiArI2RlZmluZSBTQl9FUlJPUl9USFJFU0hPTEQgICAgICAweDEKPj4gKyNkZWZpbmUgU0JfRVJS T1JfVEhSRVNIT0xEX1NISUZUICAgICAgICAyNAo+PiArI2RlZmluZSBTQl9EQl9UUlBfSU5URVJS VVBUX0VOQUJMRSAgICAgIDB4Mwo+PiArI2RlZmluZSBUUlAwX0lOVEVSUlVQVF9FTkFCTEUgICAw eDEKPj4gKyNkZWZpbmUgRFJQMF9JTlRFUlJVUFRfRU5BQkxFICAgQklUKDYpCj4+ICsjZGVmaW5l IFNCX0RCX0RSUF9JTlRFUlJVUFRfRU5BQkxFICAgICAgMHgzCj4+ICsKPj4gKwo+PiArZW51bSB7 Cj4+ICsJTExDQ19EUkFNX0NFID0gMCwKPj4gKwlMTENDX0RSQU1fVUUsCj4+ICsJTExDQ19UUkFN X0NFLAo+PiArCUxMQ0NfVFJBTV9VRSwKPj4gK307Cj4+ICsKPj4gK3N0cnVjdCBlcnJvcnNfZWRh YyB7Cj4+ICsJY29uc3QgY2hhciAqbXNnOwo+PiArCXZvaWQgKCpmdW5jKShzdHJ1Y3QgZWRhY19k ZXZpY2VfY3RsX2luZm8gKmVkZXZfY3RsLAo+PiArCQkJCWludCBpbnN0X25yLCBpbnQgYmxvY2tf bnIsIGNvbnN0IGNoYXIgKm1zZyk7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0 IGVycm9yc19lZGFjIGVycm9yc1tdID0gewo+PiArCXsiTExDQyBEYXRhIFJBTSBjb3JyZWN0YWJs ZSBFcnJvciIsIGVkYWNfZGV2aWNlX2hhbmRsZV9jZX0sCj4+ICsJeyJMTENDIERhdGEgUkFNIHVu Y29ycmVjdGFibGUgRXJyb3IiLCBlZGFjX2RldmljZV9oYW5kbGVfdWV9LAo+PiArCXsiTExDQyBU YWcgUkFNIGNvcnJlY3RhYmxlIEVycm9yIiwgZWRhY19kZXZpY2VfaGFuZGxlX2NlfSwKPj4gKwl7 IkxMQ0MgVGFnIFJBTSB1bmNvcnJlY3RhYmxlIEVycm9yIiwgZWRhY19kZXZpY2VfaGFuZGxlX3Vl fSwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcWNvbV9sbGNjX2NvcmVfc2V0dXAoc3RydWN0 IHJlZ21hcCAqbGxjY19iY2FzdF9yZWdtYXApCj4+ICt7Cj4+ICsJdTMyIHNiX2Vycl90aHJlc2hv bGQ7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCS8qIEVuYWJsZSBUUlAgaW4gaW5zdGFuY2UgMiBv ZiBjb21tb24gaW50ZXJydXB0IGVuYWJsZSByZWdpc3RlciAqLwo+PiArCXJldCA9IHJlZ21hcF91 cGRhdGVfYml0cyhsbGNjX2JjYXN0X3JlZ21hcCwgQ01OX0lOVEVSUlVQVF8yX0VOQUJMRSwKPj4g KwkJCQlUUlAwX0lOVEVSUlVQVF9FTkFCTEUsCj4+ICsJCQkJVFJQMF9JTlRFUlJVUFRfRU5BQkxF KTsKPiAKPiBBbGlnbiBhcmd1bWVudHMgYXQgdGhlIG9wZW5pbmcgYnJhY2UuIENoZWNrIHRoZSBy ZXN0IGJlbG93IHRvby4KU3VyZSwgSSdsbCB1cGRhdGUgdGhlbSBpbiBuZXh0IHBhdGNoLgo+IAo+ PiArCWlmIChyZXQpCj4+ICsJCXJldHVybiByZXQ7Cj4+ICsKPj4gKwkvKiBFbmFibGUgRUNDIGlu dGVycnVwdHMgb24gVGFnIFJhbSAqLwo+PiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhsbGNj X2JjYXN0X3JlZ21hcCwgVFJQX0lOVEVSUlVQVF8wX0VOQUJMRSwKPj4gKwkJCQlTQl9EQl9UUlBf SU5URVJSVVBUX0VOQUJMRSwKPj4gKwkJCQlTQl9EQl9UUlBfSU5URVJSVVBUX0VOQUJMRSk7Cj4+ ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJldDsKPj4gKwo+PiArCS8qIEVuYWJsZSBTQiBlcnJv ciBmb3IgRGF0YSBSQU0gKi8KPj4gKwlzYl9lcnJfdGhyZXNob2xkID0gKFNCX0VSUk9SX1RIUkVT SE9MRCA8PCBTQl9FUlJPUl9USFJFU0hPTERfU0hJRlQpOwo+PiArCXJldCA9IHJlZ21hcF93cml0 ZShsbGNjX2JjYXN0X3JlZ21hcCwgRFJQX0VDQ19FUlJPUl9DRkcsCj4+ICsJCQkJc2JfZXJyX3Ro cmVzaG9sZCk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJldDsKPj4gKwo+PiArCS8qIEVu YWJsZSBEUlAgaW4gaW5zdGFuY2UgMiBvZiBjb21tb24gaW50ZXJydXB0IGVuYWJsZSByZWdpc3Rl ciAqLwo+PiArCXJldCA9IHJlZ21hcF91cGRhdGVfYml0cyhsbGNjX2JjYXN0X3JlZ21hcCwgQ01O X0lOVEVSUlVQVF8yX0VOQUJMRSwKPj4gKwkJCQlEUlAwX0lOVEVSUlVQVF9FTkFCTEUsIERSUDBf SU5URVJSVVBUX0VOQUJMRSk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJldDsKPj4gKwo+ PiArCS8qIEVuYWJsZSBFQ0MgaW50ZXJydXB0cyBvbiBEYXRhIFJhbSAqLwo+PiArCXJldCA9IHJl Z21hcF93cml0ZShsbGNjX2JjYXN0X3JlZ21hcCwgRFJQX0lOVEVSUlVQVF9FTkFCTEUsCj4+ICsJ CQkJU0JfREJfRFJQX0lOVEVSUlVQVF9FTkFCTEUpOwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ ICsKPj4gKy8qIENsZWFyIHRoZSBlcnJvciBpbnRlcnJ1cHQgYW5kIGNvdW50ZXIgcmVnaXN0ZXJz ICovCj4+ICtzdGF0aWMgaW50IHFjb21fbGxjY19jbGVhcl9lcnJvcnMoaW50IGVycl90eXBlLCBz dHJ1Y3QgbGxjY19kcnZfZGF0YSAKPj4gKmRydikKPj4gK3sKPj4gKwlpbnQgcmV0ID0gMDsKPj4g Kwo+PiArCXN3aXRjaCAoZXJyX3R5cGUpIHsKPj4gKwljYXNlIExMQ0NfRFJBTV9DRToKPj4gKwlj YXNlIExMQ0NfRFJBTV9VRToKPj4gKwkJLyogQ2xlYXIgdGhlIGludGVycnVwdCAqLwo+PiArCQly ZXQgPSByZWdtYXBfd3JpdGUoZHJ2LT5iY2FzdF9yZWdtYXAsIERSUF9JTlRFUlJVUFRfQ0xFQVIs Cj4+ICsJCQkJCURSUF9UUlBfSU5UX0NMRUFSKTsKPj4gKwkJaWYgKHJldCkKPj4gKwkJCXJldHVy biByZXQ7Cj4+ICsKPj4gKwkJLyogQ2xlYXIgdGhlIGNvdW50ZXJzICovCj4+ICsJCXJldCA9IHJl Z21hcF93cml0ZShkcnYtPmJjYXN0X3JlZ21hcCwgRFJQX0VDQ19FUlJPUl9DTlRSX0NMRUFSLAo+ PiArCQkJCQlEUlBfVFJQX0NOVF9DTEVBUik7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1cm4g cmV0Owo+PiArCQlicmVhazsKPj4gKwljYXNlIExMQ0NfVFJBTV9DRToKPj4gKwljYXNlIExMQ0Nf VFJBTV9VRToKPj4gKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGRydi0+YmNhc3RfcmVnbWFwLCBUUlBf SU5URVJSVVBUXzBfQ0xFQVIsCj4+ICsJCQkJCURSUF9UUlBfSU5UX0NMRUFSKTsKPj4gKwkJaWYg KHJldCkKPj4gKwkJCXJldHVybiByZXQ7Cj4+ICsKPj4gKwkJcmV0ID0gcmVnbWFwX3dyaXRlKGRy di0+YmNhc3RfcmVnbWFwLCBUUlBfRUNDX0VSUk9SX0NOVFJfQ0xFQVIsCj4+ICsJCQkJCURSUF9U UlBfQ05UX0NMRUFSKTsKPj4gKwkJaWYgKHJldCkKPj4gKwkJCXJldHVybiByZXQ7Cj4+ICsJCWJy ZWFrOwo+PiArCX0KPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICsvKiBEdW1wIHN5bmRy b21lIHJlZ2lzdGVycyBmb3IgdGFnIFJhbSBEb3VibGUgYml0IGVycm9ycyAqLwo+PiArc3RhdGlj IGludCBkdW1wX3RycF9kYl9zeW5fcmVnKHN0cnVjdCBsbGNjX2Rydl9kYXRhICpkcnYsIHUzMiBi YW5rKQo+PiArewo+PiArCWludCBpLCByZXQ7Cj4+ICsJaW50IGRiX2Vycl9jbnQ7Cj4+ICsJaW50 IGRiX2Vycl93YXlzOwo+PiArCXUzMiBzeW5kX3JlZzsKPj4gKwl1MzIgc3luZF92YWw7Cj4+ICsK Pj4gKwlmb3IgKGkgPSAwOyBpIDwgVFJQX1NZTl9SRUdfQ05UOyBpKyspIHsKPj4gKwkJc3luZF9y ZWcgPSBUUlBfRUNDX0RCX0VSUl9TWU4wICsgKGkgKiA0KTsKPj4gKwkJcmV0ID0gcmVnbWFwX3Jl YWQoZHJ2LT5yZWdtYXAsIGRydi0+b2Zmc2V0c1tiYW5rXSArIHN5bmRfcmVnLAo+PiArCQkJCSZz eW5kX3ZhbCk7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1cm4gcmV0Owo+PiArCQllZGFjX3By aW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIlRSUF9FQ0NfU1lOJWQ6IDB4JTh4XG4iLAo+PiAr CQkJaSwgc3luZF92YWwpOwo+PiArCX0KPj4gKwo+PiArCXJldCA9IHJlZ21hcF9yZWFkKGRydi0+ cmVnbWFwLAo+PiArCQkJCWRydi0+b2Zmc2V0c1tiYW5rXSArIFRSUF9FQ0NfRVJST1JfU1RBVFVT MSwKPj4gKwkJCQkmZGJfZXJyX2NudCk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJldDsK Pj4gKwlkYl9lcnJfY250ID0gKGRiX2Vycl9jbnQgJiBFQ0NfREJfRVJSX0NPVU5UX01BU0spOwo+ PiArCWVkYWNfcHJpbnRrKEtFUk5fQ1JJVCwgRURBQ19MTENDLCAiRG91YmxlLUJpdCBlcnJvciBj b3VudDogMHglNHhcbiIsCj4+ICsJCWRiX2Vycl9jbnQpOwo+PiArCj4+ICsJcmV0ID0gcmVnbWFw X3JlYWQoZHJ2LT5yZWdtYXAsCj4+ICsJCWRydi0+b2Zmc2V0c1tiYW5rXSArIFRSUF9FQ0NfRVJS T1JfU1RBVFVTMCwgJmRiX2Vycl93YXlzKTsKPj4gKwlpZiAocmV0KQo+PiArCQlyZXR1cm4gcmV0 Owo+PiArCWRiX2Vycl93YXlzID0gKGRiX2Vycl93YXlzICYgRUNDX0RCX0VSUl9XQVlTX01BU0sp Owo+PiArCWRiX2Vycl93YXlzID4+PSBFQ0NfREJfRVJSX1dBWVNfU0hJRlQ7Cj4+ICsKPj4gKwll ZGFjX3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIkRvdWJsZS1CaXQgZXJyb3Igd2F5czog MHglNHhcbiIsCj4+ICsJCWRiX2Vycl93YXlzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9 Cj4+ICsKPj4gKy8qIER1bXAgc3luZHJvbWUgcmVnaXN0ZXIgZm9yIHRhZyBSYW0gU2luZ2xlIEJp dCBFcnJvcnMgKi8KPj4gK3N0YXRpYyBpbnQgZHVtcF90cnBfc2Jfc3luX3JlZyhzdHJ1Y3QgbGxj Y19kcnZfZGF0YSAqZHJ2LCB1MzIgYmFuaykKPj4gK3sKPj4gKwlpbnQgaSwgcmV0Owo+PiArCWlu dCBzYl9lcnJfY250Owo+PiArCWludCBzYl9lcnJfd2F5czsKPj4gKwl1MzIgc3luZF9yZWc7Cj4+ ICsJdTMyIHN5bmRfdmFsOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IFRSUF9TWU5fUkVHX0NO VDsgaSsrKSB7Cj4+ICsJCXN5bmRfcmVnID0gVFJQX0VDQ19TQl9FUlJfU1lOMCArIChpICogNCk7 Cj4+ICsJCXJldCA9IHJlZ21hcF9yZWFkKGRydi0+cmVnbWFwLCBkcnYtPm9mZnNldHNbYmFua10g KyBzeW5kX3JlZywKPj4gKwkJCQkJJnN5bmRfdmFsKTsKPj4gKwkJaWYgKHJldCkKPj4gKwkJCXJl dHVybiByZXQ7Cj4+ICsJCWVkYWNfcHJpbnRrKEtFUk5fQ1JJVCwgRURBQ19MTENDLCAiVFJQX0VD Q19TWU4lZDogMHglOHhcbiIsCj4+ICsJCQkJaSwgc3luZF92YWwpOwo+PiArCX0KPj4gKwo+PiAr CXJldCA9IHJlZ21hcF9yZWFkKGRydi0+cmVnbWFwLAo+PiArCQkJCWRydi0+b2Zmc2V0c1tiYW5r XSArIFRSUF9FQ0NfRVJST1JfU1RBVFVTMSwKPj4gKwkJCQkmc2JfZXJyX2NudCk7Cj4+ICsJaWYg KHJldCkKPj4gKwkJcmV0dXJuIHJldDsKPj4gKwlzYl9lcnJfY250ID0gKHNiX2Vycl9jbnQgJiBF Q0NfU0JfRVJSX0NPVU5UX01BU0spOwo+PiArCXNiX2Vycl9jbnQgPj49IEVDQ19TQl9FUlJfQ09V TlRfU0hJRlQ7Cj4+ICsJZWRhY19wcmludGsoS0VSTl9DUklULCBFREFDX0xMQ0MsICJTaW5nbGUt Qml0IGVycm9yIGNvdW50OiAweCU0eFxuIiwKPj4gKwkJc2JfZXJyX2NudCk7Cj4+ICsKPj4gKwly ZXQgPSByZWdtYXBfcmVhZChkcnYtPnJlZ21hcCwKPj4gKwkJCQlkcnYtPm9mZnNldHNbYmFua10g KyBUUlBfRUNDX0VSUk9SX1NUQVRVUzAsCj4+ICsJCQkJJnNiX2Vycl93YXlzKTsKPj4gKwlpZiAo cmV0KQo+PiArCQlyZXR1cm4gcmV0Owo+PiArCj4+ICsJc2JfZXJyX3dheXMgPSBzYl9lcnJfd2F5 cyAmIEVDQ19TQl9FUlJfV0FZU19NQVNLOwo+PiArCj4+ICsJZWRhY19wcmludGsoS0VSTl9DUklU LCBFREFDX0xMQ0MsICJTaW5nbGUtQml0IGVycm9yIHdheXM6IDB4JTR4XG4iLAo+PiArCQkJc2Jf ZXJyX3dheXMpOwo+PiArCj4+ICsJcmV0dXJuIHJldDsKPj4gK30KPj4gKwo+PiArLyogRHVtcCBz eW5kcm9tZSByZWdpc3RlcnMgZm9yIERhdGEgUmFtIERvdWJsZSBiaXQgZXJyb3JzICovCj4+ICtz dGF0aWMgaW50IGR1bXBfZHJwX2RiX3N5bl9yZWcoc3RydWN0IGxsY2NfZHJ2X2RhdGEgKmRydiwg dTMyIGJhbmspCj4+ICt7Cj4+ICsJaW50IGksIHJldDsKPj4gKwlpbnQgZGJfZXJyX2NudDsKPj4g KwlpbnQgZGJfZXJyX3dheXM7Cj4+ICsJdTMyIHN5bmRfcmVnOwo+PiArCXUzMiBzeW5kX3ZhbDsK Pj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBEUlBfU1lOX1JFR19DTlQ7IGkrKykgewo+PiArCQlz eW5kX3JlZyA9IERSUF9FQ0NfREJfRVJSX1NZTjAgKyAoaSAqIDQpOwo+PiArCQlyZXQgPSByZWdt YXBfcmVhZChkcnYtPnJlZ21hcCwgZHJ2LT5vZmZzZXRzW2JhbmtdICsgc3luZF9yZWcsCj4+ICsJ CQkJCSZzeW5kX3ZhbCk7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1cm4gcmV0Owo+PiArCQll ZGFjX3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIkRSUF9FQ0NfU1lOJWQ6IDB4JTh4XG4i LAo+PiArCQkJCWksIHN5bmRfdmFsKTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXQgPSByZWdtYXBfcmVh ZChkcnYtPnJlZ21hcCwKPj4gKwkJCQlkcnYtPm9mZnNldHNbYmFua10gKyBEUlBfRUNDX0VSUk9S X1NUQVRVUzEsCj4+ICsJCQkJJmRiX2Vycl9jbnQpOwo+PiArCWlmIChyZXQpCj4+ICsJCXJldHVy biByZXQ7Cj4+ICsJZGJfZXJyX2NudCA9IChkYl9lcnJfY250ICYgRUNDX0RCX0VSUl9DT1VOVF9N QVNLKTsKPj4gKwllZGFjX3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIkRvdWJsZS1CaXQg ZXJyb3IgY291bnQ6IDB4JTR4XG4iLAo+PiArCQlkYl9lcnJfY250KTsKPj4gKwo+PiArCXJldCA9 IHJlZ21hcF9yZWFkKGRydi0+cmVnbWFwLAo+PiArCQkJCWRydi0+b2Zmc2V0c1tiYW5rXSArIERS UF9FQ0NfRVJST1JfU1RBVFVTMCwKPj4gKwkJCQkmZGJfZXJyX3dheXMpOwo+PiArCWlmIChyZXQp Cj4+ICsJCXJldHVybiByZXQ7Cj4+ICsJZGJfZXJyX3dheXMgJj0gRUNDX0RCX0VSUl9XQVlTX01B U0s7Cj4+ICsJZGJfZXJyX3dheXMgPj49IEVDQ19EQl9FUlJfV0FZU19TSElGVDsKPj4gKwllZGFj X3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIkRvdWJsZS1CaXQgZXJyb3Igd2F5czogMHgl NHhcbiIsCj4+ICsJCWRiX2Vycl93YXlzKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ ICsKPj4gKy8qIER1bXAgU3luZHJvbWUgcmVnaXN0ZXJzIGZvciBEYXRhIFJhbSBTaW5nbGUgYml0 IGVycm9ycyovCj4+ICtzdGF0aWMgaW50IGR1bXBfZHJwX3NiX3N5bl9yZWcoc3RydWN0IGxsY2Nf ZHJ2X2RhdGEgKmRydiwgdTMyIGJhbmspCj4+ICt7Cj4+ICsJaW50IGksIHJldDsKPj4gKwlpbnQg c2JfZXJyX2NudDsKPj4gKwlpbnQgc2JfZXJyX3dheXM7Cj4+ICsJdTMyIHN5bmRfcmVnOwo+PiAr CXUzMiBzeW5kX3ZhbDsKPj4gKwo+PiArCWZvciAoaSA9IDA7IGkgPCBEUlBfU1lOX1JFR19DTlQ7 IGkrKykgewo+PiArCQlzeW5kX3JlZyA9IERSUF9FQ0NfU0JfRVJSX1NZTjAgKyAoaSAqIDQpOwo+ PiArCQlyZXQgPSByZWdtYXBfcmVhZChkcnYtPnJlZ21hcCwgZHJ2LT5vZmZzZXRzW2JhbmtdICsg c3luZF9yZWcsCj4+ICsJCQkJCSZzeW5kX3ZhbCk7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1 cm4gcmV0Owo+PiArCQllZGFjX3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIkRSUF9FQ0Nf U1lOJWQ6IDB4JTh4XG4iLAo+PiArCQkJCWksIHN5bmRfdmFsKTsKPj4gKwl9Cj4+ICsKPj4gKwly ZXQgPSByZWdtYXBfcmVhZChkcnYtPnJlZ21hcCwKPj4gKwkJCQlkcnYtPm9mZnNldHNbYmFua10g KyBEUlBfRUNDX0VSUk9SX1NUQVRVUzEsCj4+ICsJCQkJJnNiX2Vycl9jbnQpOwo+PiArCWlmIChy ZXQpCj4+ICsJCXJldHVybiByZXQ7Cj4+ICsJc2JfZXJyX2NudCAmPSBFQ0NfU0JfRVJSX0NPVU5U X01BU0s7Cj4+ICsJc2JfZXJyX2NudCA+Pj0gRUNDX1NCX0VSUl9DT1VOVF9TSElGVDsKPj4gKwll ZGFjX3ByaW50ayhLRVJOX0NSSVQsIEVEQUNfTExDQywgIlNpbmdsZS1CaXQgZXJyb3IgY291bnQ6 IDB4JTR4XG4iLAo+PiArCQlzYl9lcnJfY250KTsKPj4gKwo+PiArCXJldCA9IHJlZ21hcF9yZWFk KGRydi0+cmVnbWFwLAo+PiArCQkJCWRydi0+b2Zmc2V0c1tiYW5rXSArIERSUF9FQ0NfRVJST1Jf U1RBVFVTMCwKPj4gKwkJCQkmc2JfZXJyX3dheXMpOwo+PiArCWlmIChyZXQpCj4+ICsJCXJldHVy biByZXQ7Cj4+ICsJc2JfZXJyX3dheXMgPSBzYl9lcnJfd2F5cyAmIEVDQ19TQl9FUlJfV0FZU19N QVNLOwo+PiArCj4+ICsJZWRhY19wcmludGsoS0VSTl9DUklULCBFREFDX0xMQ0MsICJTaW5nbGUt Qml0IGVycm9yIHdheXM6IDB4JTR4XG4iLAo+PiArCQlzYl9lcnJfd2F5cyk7Cj4+ICsKPj4gKwly ZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICsKPiAKPiBvbmUgbmV3bGluZSBpcyBlbm91Z2guCk9r LCBJJ2xsIHJlbW92ZSBpdC4KPiAKPj4gK3N0YXRpYyBpbnQgZHVtcF9zeW5fcmVnKHN0cnVjdCBl ZGFjX2RldmljZV9jdGxfaW5mbyAqZWRldl9jdGwsCj4+ICsJCQkgaW50IGVycl90eXBlLCB1MzIg YmFuaykKPj4gK3sKPj4gKwlpbnQgcmV0ID0gMDsKPj4gKwlzdHJ1Y3QgbGxjY19kcnZfZGF0YSAq ZHJ2ID0gZWRldl9jdGwtPnB2dF9pbmZvOwo+PiArCj4+ICsJc3dpdGNoIChlcnJfdHlwZSkgewo+ PiArCWNhc2UgTExDQ19EUkFNX0NFOgo+PiArCQlyZXQgPSBkdW1wX2RycF9zYl9zeW5fcmVnKGRy diwgYmFuayk7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgTExDQ19EUkFNX1VFOgo+PiArCQlyZXQg PSBkdW1wX2RycF9kYl9zeW5fcmVnKGRydiwgYmFuayk7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2Ug TExDQ19UUkFNX0NFOgo+PiArCQlyZXQgPSBkdW1wX3RycF9zYl9zeW5fcmVnKGRydiwgYmFuayk7 Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgTExDQ19UUkFNX1VFOgo+PiArCQlyZXQgPSBkdW1wX3Ry cF9kYl9zeW5fcmVnKGRydiwgYmFuayk7Cj4+ICsJCWJyZWFrOwo+PiArCX0KPj4gKwlpZiAocmV0 KQo+PiArCQlyZXR1cm4gcmV0Owo+PiArCj4+ICsJcmV0ID0gcWNvbV9sbGNjX2NsZWFyX2Vycm9y cyhlcnJfdHlwZSwgZHJ2KTsKPj4gKwlpZiAocmV0KQo+PiArCQlyZXR1cm4gcmV0Owo+PiArCj4+ ICsJZXJyb3JzW2Vycl90eXBlXS5mdW5jKGVkZXZfY3RsLCAwLCBiYW5rLCBlcnJvcnNbZXJyX3R5 cGVdLm1zZyk7Cj4+ICsKPj4gKwlyZXR1cm4gcmV0Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaXJx cmV0dXJuX3QgcWNvbV9sbGNjX2NoZWNrX2NhY2hlX2Vycm9ycwo+PiArCQkoc3RydWN0IGVkYWNf ZGV2aWNlX2N0bF9pbmZvICplZGV2X2N0bCkKPiAKPiBQbGVhc2UgZG9uJ3Qgc3BsaXQgdGhlIGZ1 bmN0aW9uIG5hbWUgZnJvbSB0aGUgYXJncy4KT2ssIEknbGwgdXBkYXRlIHRoaXMgb25lLgo+IAo+ IHN0YXRpYyBpcnFyZXR1cm5fdAo+IHFjb21fbGxjY19jaGVja19jYWNoZV9lcnJvcnMoc3RydWN0 IGVkYWNfZGV2aWNlX2N0bF9pbmZvICplZGV2X2N0bCkKPiAKPiBpcyBhIGJpdCBiZXR0ZXIsIGZv ciBleGFtcGxlLgo+IAo+PiArewo+PiArCWludCByZXQ7Cj4+ICsJdTMyIGRycF9lcnJvcjsKPj4g Kwl1MzIgdHJwX2Vycm9yOwo+PiArCXN0cnVjdCBsbGNjX2Rydl9kYXRhICpkcnYgPSBlZGV2X2N0 bC0+cHZ0X2luZm87Cj4+ICsJdTMyIGk7Cj4+ICsJaXJxcmV0dXJuX3QgaXJxX3JjID0gSVJRX05P TkU7Cj4+ICsKPj4gKwlmb3IgKGkgPSAwOyBpIDwgZHJ2LT5udW1fYmFua3M7IGkrKykgewo+PiAr CQkvKiBMb29rIGZvciBEYXRhIFJBTSBlcnJvcnMgKi8KPj4gKwkJcmV0ID0gcmVnbWFwX3JlYWQo ZHJ2LT5yZWdtYXAsCj4+ICsJCQkJZHJ2LT5vZmZzZXRzW2ldICsgRFJQX0lOVEVSUlVQVF9TVEFU VVMsCj4+ICsJCQkJJmRycF9lcnJvcik7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1cm4gaXJx X3JjOwo+PiArCj4+ICsJCWlmIChkcnBfZXJyb3IgJiBTQl9FQ0NfRVJST1IpIHsKPj4gKwkJCWVk YWNfcHJpbnRrKEtFUk5fQ1JJVCwgRURBQ19MTENDLAo+PiArCQkJCSJTaW5nbGUgQml0IEVycm9y IGRldGVjdGVkIGluIERhdGEgUmFtXG4iKTsKPj4gKwkJCWR1bXBfc3luX3JlZyhlZGV2X2N0bCwg TExDQ19EUkFNX0NFLCBpKTsKPj4gKwkJCWlycV9yYyA9IElSUV9IQU5ETEVEOwo+PiArCQl9IGVs c2UgaWYgKGRycF9lcnJvciAmIERCX0VDQ19FUlJPUikgewo+PiArCQkJZWRhY19wcmludGsoS0VS Tl9DUklULCBFREFDX0xMQ0MsCj4+ICsJCQkJIkRvdWJsZSBCaXQgRXJyb3IgZGV0ZWN0ZWQgaW4g RGF0YSBSYW1cbiIpOwo+PiArCQkJZHVtcF9zeW5fcmVnKGVkZXZfY3RsLCBMTENDX0RSQU1fVUUs IGkpOwo+PiArCQkJaXJxX3JjID0gSVJRX0hBTkRMRUQ7Cj4+ICsJCX0KPj4gKwo+PiArCQkvKiBM b29rIGZvciBUYWcgUkFNIGVycm9ycyAqLwo+PiArCQlyZXQgPSByZWdtYXBfcmVhZChkcnYtPnJl Z21hcCwKPj4gKwkJCQlkcnYtPm9mZnNldHNbaV0gKyBUUlBfSU5URVJSVVBUXzBfU1RBVFVTLAo+ PiArCQkJCSZ0cnBfZXJyb3IpOwo+PiArCQlpZiAocmV0KQo+PiArCQkJcmV0dXJuIGlycV9yYzsK Pj4gKwkJaWYgKHRycF9lcnJvciAmIFNCX0VDQ19FUlJPUikgewo+PiArCQkJZWRhY19wcmludGso S0VSTl9DUklULCBFREFDX0xMQ0MsCj4+ICsJCQkJIlNpbmdsZSBCaXQgRXJyb3IgZGV0ZWN0ZWQg aW4gVGFnIFJhbVxuIik7Cj4+ICsJCQlkdW1wX3N5bl9yZWcoZWRldl9jdGwsIExMQ0NfVFJBTV9D RSwgaSk7Cj4+ICsJCQlpcnFfcmMgPSBJUlFfSEFORExFRDsKPj4gKwkJfSBlbHNlIGlmICh0cnBf ZXJyb3IgJiBEQl9FQ0NfRVJST1IpIHsKPj4gKwkJCWVkYWNfcHJpbnRrKEtFUk5fQ1JJVCwgRURB Q19MTENDLAo+PiArCQkJCSJEb3VibGUgQml0IEVycm9yIGRldGVjdGVkIGluIFRhZyBSYW1cbiIp Owo+PiArCQkJZHVtcF9zeW5fcmVnKGVkZXZfY3RsLCBMTENDX1RSQU1fVUUsIGkpOwo+PiArCQkJ aXJxX3JjID0gSVJRX0hBTkRMRUQ7Cj4+ICsJCX0KPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gaXJx X3JjOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaXJxcmV0dXJuX3QgbGxjY19lY2NfaXJxX2hhbmRs ZXIKPj4gKwkJCShpbnQgaXJxLCB2b2lkICplZGV2X2N0bCkKPiAKPiBUaGF0IGxvb2tzIGxpa2Ug YSB1c2VsZXNzIHdyYXBwZXIsIGdldCByaWQgb2YgaXQuCk9rLCBEb25lLgo+IAo+PiArewo+PiAr CXJldHVybiBxY29tX2xsY2NfY2hlY2tfY2FjaGVfZXJyb3JzKGVkZXZfY3RsKTsKPj4gK30KPj4g Kwo+PiArc3RhdGljIGludCBxY29tX2xsY2NfZXJwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCj4+ICt7Cj4+ICsJaW50IHJjOwo+PiArCXUzMiBlY2NfaXJxOwo+PiArCXN0cnVj dCBlZGFjX2RldmljZV9jdGxfaW5mbyAqZWRldl9jdGw7Cj4+ICsJc3RydWN0IGRldmljZSAqZGV2 ID0gJnBkZXYtPmRldjsKPj4gKwlzdHJ1Y3QgbGxjY19kcnZfZGF0YSAqbGxjY19kcml2X2RhdGEg PSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKPiAKPiBQbGVhc2Ugc29ydCBmdW5jdGlvbiBsb2Nh bCB2YXJpYWJsZXMgZGVjbGFyYXRpb24gaW4gYSByZXZlcnNlIGNocmlzdG1hcwo+IHRyZWUgb3Jk ZXI6Cj4gCj4gCTx0eXBlPiBsb25nZXN0X3ZhcmlhYmxlX25hbWU7Cj4gCTx0eXBlPiBzaG9ydGVy X3Zhcl9uYW1lOwo+IAk8dHlwZT4gZXZlbl9zaG9ydGVyOwo+IAk8dHlwZT4gaTsKPiAKPiBEaXR0 byBmb3IgdGhlIG90aGVyIGZ1bmN0aW9ucy4KT2ssIEknbGwgdXBkYXRlIGl0IGZvciBhbGwgb3Ro ZXIgZnVuY3Rpb25zIHRvby4KLS0tClRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5k IHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1lZGFjIiBpbgp0aGUgYm9keSBvZiBhIG1lc3Nh Z2UgdG8gbWFqb3Jkb21vQHZnZXIua2VybmVsLm9yZwpNb3JlIG1ham9yZG9tbyBpbmZvIGF0ICBo dHRwOi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwK