RE: [PATCH v2] can: xilinx CAN controller support.
From: Appana Durga Kedareswara Rao <hidden>
Date: 2014-02-14 09:37:03
Also in:
linux-arm-kernel, linux-can, linux-devicetree, lkml
SGkgTWFyYywNCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBNYXJjIEtsZWluZS1CdWRkZSBbbWFpbHRvOm1rbEBwZW5ndXRyb25peC5kZV0NCj4gU2VudDogRnJpZGF5LCBGZWJydWFyeSAxNCwgMjAxNCAxMjo1MSBBTQ0KPiBUbzogQXBwYW5hIER1cmdhIEtlZGFyZXN3YXJhIFJhbzsgd2dAZ3JhbmRlZ2dlci5jb207IE1pY2hhbCBTaW1lazsNCj4gZ3JhbnQubGlrZWx5QGxpbmFyby5vcmc7IHJvYmgrZHRAa2VybmVsLm9yZzsgbGludXgtY2FuQHZnZXIua2VybmVsLm9yZw0KPiBDYzogbmV0ZGV2QHZnZXIua2VybmVsLm9yZzsgbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBsaW51eC0NCj4ga2VybmVsQHZnZXIua2VybmVsLm9yZzsgZGV2aWNldHJlZUB2Z2VyLmtlcm5lbC5vcmc7IEFwcGFuYSBEdXJnYQ0KPiBLZWRhcmVzd2FyYSBSYW8NCj4gU3ViamVjdDogUmU6IFtQQVRDSCB2Ml0gY2FuOiB4aWxpbnggQ0FOIGNvbnRyb2xsZXIgc3VwcG9ydC4NCj4NCj4gT24gMDIvMTIvMjAxNCAwODoxMCBBTSwgS2VkYXJlc3dhcmEgcmFvIEFwcGFuYSB3cm90ZToNCj4gPiBUaGlzIHBhdGNoIGFkZHMgeGlsaW54IENBTiBjb250cm9sbGVyIHN1cHBvcnQuDQo+ID4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgYm90aCBaWU5RIENBTlBTIElQIGFuZCBTb2Z0IElQIEFYSSBDQU4NCj4gPiBjb250cm9sbGVyLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogS2VkYXJlc3dhcmEgcmFvIEFwcGFuYSA8YXBwYW5hZEB4aWxpbnguY29tPg0KPiA+IC0tLQ0KPiA+IFRoaXMgcGF0Y2ggaXMgcmViYXNlZCBvbiB0aGUgMy4xNCByYzIga2VybmVsLg0KPiA+IENoYW5nZXMgZm9yIHYyOg0KPiA+IC0gVXBkYXRlZCB3aXRoIHRoZSByZXZpZXcgY29tbWVudHMuDQo+ID4gLSBSZW1vdmVkIHVubmVjZXNzYXJ5IGRlYnVnIHByaW50cy4NCj4gPiAtIGluY2x1ZGVkIHR4LHJ4IGZpZm8gZGVwdGhzIGluIFpZTlEgQ0FOUFMgY2FzZSBhbHNvLg0KPiA+IC0tLQ0KPiA+ICAuLi4vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY2FuL3hpbGlueF9jYW4udHh0ICAgICB8ICAgNDUgKw0KPiA+ICBkcml2ZXJzL25ldC9jYW4vS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDcgKw0KPiA+ICBkcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKw0KPiA+ICBkcml2ZXJzL25ldC9jYW4veGlsaW54X2Nhbi5jICAgICAgICAgICAgICAgICAgICAgICB8IDExNTMgKysrKysrKysrKysrKysrKysrKysNCj4gPiAgNCBmaWxlcyBjaGFuZ2VkLCAxMjA2IGluc2VydGlvbnMoKyksIDAgZGVsZXRpb25zKC0pICBjcmVhdGUgbW9kZQ0KPiA+IDEwMDY0NCBEb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi94aWxpbnhfY2FuLnR4dA0KPiA+ICBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9uZXQvY2FuL3hpbGlueF9jYW4uYw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY2FuL3hpbGlueF9jYW4udHh0DQo+ID4gYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi94aWxpbnhfY2FuLnR4dA0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uMGU1NzEwMw0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi94aWxpbnhfY2FuLnR4dA0KPiA+IEBAIC0wLDAgKzEsNDUgQEANCj4gPiArWGlsaW54IEF4aSBDQU4vWnlucSBDQU5QUyBjb250cm9sbGVyIERldmljZSBUcmVlIEJpbmRpbmdzDQo+ID4gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiA+ICsNCj4gPiArUmVxdWlyZWQgcHJvcGVydGllczoNCj4gPiArLSBjb21wYXRpYmxlICAgICAgICAgICAgICAgOiBTaG91bGQgYmUgInhsbngsenlucS1jYW4tMS4wMC5hIiBmb3IgWnlucQ0KPiBDQU4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlcnMgYW5kICJ4bG54LGF4aS1jYW4tMS4wMC5hIiBmb3IgQXhpIENBTg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVycy4NCj4gPiArLSByZWcgICAgICAgICAgICAgICAgICAgICAgOiBQaHlzaWNhbCBiYXNlIGFkZHJlc3MgYW5kIHNpemUgb2YgdGhlIEF4aSBDQU4vWnlucQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBDQU5QUyByZWdpc3RlcnMgbWFwLg0KPiA+ICstIGludGVycnVwdHMgICAgICAgICAgICAgICA6IFByb3BlcnR5IHdpdGggYSB2YWx1ZSBkZXNjcmliaW5nIHRoZSBpbnRlcnJ1cHQNCj4gPiArICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLg0KPiA+ICstIGludGVycnVwdC1wYXJlbnQgOiBNdXN0IGJlIGNvcmUgaW50ZXJydXB0IGNvbnRyb2xsZXINCj4gPiArLSBjbG9jay1uYW1lcyAgICAgICAgICAgICAgOiBMaXN0IG9mIGlucHV0IGNsb2NrIG5hbWVzIC0gInJlZl9jbGsiLA0KPiAiYXBlcl9jbGsiDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIChTZWUgY2xvY2sgYmluZGluZ3MgZm9yIGRldGFpbHMuIFR3byBjbG9ja3MgYXJlDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBmb3IgWnlucSBDQU4uIEZvciBBeGkgQ0FODQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICBjYXNlIGl0IGlzIG9uZShyZWZfY2xrKSkuDQo+ID4gKy0gY2xvY2tzICAgICAgICAgICA6IENsb2NrIHBoYW5kbGVzIChzZWUgY2xvY2sgYmluZGluZ3MgZm9yIGRldGFpbHMpLg0KPiA+ICstIHR4LWZpZm8tZGVwdGggICAgICAgICAgICA6IENhbiBUeCBmaWZvIGRlcHRoLg0KPiA+ICstIHJ4LWZpZm8tZGVwdGggICAgICAgICAgICA6IENhbiBSeCBmaWZvIGRlcHRoLg0KPiA+ICsNCj4gPiArDQo+ID4gK0V4YW1wbGU6DQo+ID4gKw0KPiA+ICtGb3IgWnlucSBDQU5QUyBEdHMgZmlsZToNCj4gPiArICAgenlucV9jYW5fMDogenlucS1jYW5AZTAwMDgwMDAgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEtY2FuLTEuMDAuYSI7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjbG9ja3MgPSA8JmNsa2MgMTk+LCA8JmNsa2MgMzY+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgY2xvY2stbmFtZXMgPSAicmVmX2NsayIsICJhcGVyX2NsayI7DQo+ID4gKyAgICAgICAgICAgICAgICAgICByZWcgPSA8MHhlMDAwODAwMCAweDEwMDA+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwwIDI4IDQ+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47DQo+ID4gKyAgICAgICAgICAgICAgICAgICB0eC1maWZvLWRlcHRoID0gPDB4NDA+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgcngtZmlmby1kZXB0aCA9IDwweDQwPjsNCj4gPiArICAgICAgICAgICB9Ow0KPiA+ICtGb3IgQXhpIENBTiBEdHMgZmlsZToNCj4gPiArICAgYXhpX2Nhbl8wOiBheGktY2FuQDQwMDAwMDAwIHsNCj4gPiArICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAieGxueCxheGktY2FuLTEuMDAuYSI7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjbG9ja3MgPSA8JmNsa2MgMD47DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjbG9jay1uYW1lcyA9ICJyZWZfY2xrIiA7DQo+ID4gKyAgICAgICAgICAgICAgICAgICByZWcgPSA8MHg0MDAwMDAwMCAweDEwMDAwPjsNCj4gPiArICAgICAgICAgICAgICAgICAgIGludGVycnVwdC1wYXJlbnQgPSA8JmludGM+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0cyA9IDwwIDU5IDE+Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgdHgtZmlmby1kZXB0aCA9IDwweDQwPjsNCj4gPiArICAgICAgICAgICAgICAgICAgIHJ4LWZpZm8tZGVwdGggPSA8MHg0MD47DQo+ID4gKyAgICAgICAgICAgfTsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZyBpbmRleA0KPiA+IDllN2Q5NWQuLmIxODAyMzkgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcNCj4gPiArKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZw0KPiA+IEBAIC0xMjUsNiArMTI1LDEzIEBAIGNvbmZpZyBDQU5fR1JDQU4NCj4gPiAgICAgICBlbmRpYW4gc3ludGhlc2VzIG9mIHRoZSBjb3JlcyB3b3VsZCBuZWVkIHNvbWUgbW9kaWZpY2F0aW9ucyBvbg0KPiA+ICAgICAgIHRoZSBoYXJkd2FyZSBsZXZlbCB0byB3b3JrLg0KPiA+DQo+ID4gK2NvbmZpZyBDQU5fWElMSU5YQ0FODQo+ID4gKyAgIHRyaXN0YXRlICJYaWxpbnggQ0FOIg0KPiA+ICsgICBkZXBlbmRzIG9uIEFSQ0hfWllOUSB8fCBNSUNST0JMQVpFDQo+ID4gKyAgIC0tLWhlbHAtLS0NCj4gPiArICAgICBYaWxpbnggQ0FOIGRyaXZlci4gVGhpcyBkcml2ZXIgc3VwcG9ydHMgYm90aCBzb2Z0IEFYSSBDQU4gSVAgYW5kDQo+ID4gKyAgICAgWnlucSBDQU5QUyBJUC4NCj4gPiArDQo+ID4gIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL21zY2FuL0tjb25maWciDQo+ID4NCj4gPiAgc291cmNlICJkcml2ZXJzL25ldC9jYW4vc2phMTAwMC9LY29uZmlnIg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUgaW5kZXgNCj4gPiBjNzQ0MDM5Li4wYjhlMTFlIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQ0KPiA+IEBAIC0yNSw1ICsyNSw2IEBAIG9iai0kKENPTkZJR19DQU5fSkFOWl9JQ0FOMykgICAgICArPSBqYW56LQ0KPiBpY2FuMy5vDQo+ID4gIG9iai0kKENPTkZJR19DQU5fRkxFWENBTikgICs9IGZsZXhjYW4ubw0KPiA+ICBvYmotJChDT05GSUdfUENIX0NBTikgICAgICAgICAgICAgICs9IHBjaF9jYW4ubw0KPiA+ICBvYmotJChDT05GSUdfQ0FOX0dSQ0FOKSAgICAgICAgICAgICs9IGdyY2FuLm8NCj4gPiArb2JqLSQoQ09ORklHX0NBTl9YSUxJTlhDQU4pICAgICAgICArPSB4aWxpbnhfY2FuLm8NCj4gPg0KPiA+ICBjY2ZsYWdzLSQoQ09ORklHX0NBTl9ERUJVR19ERVZJQ0VTKSA6PSAtRERFQlVHIGRpZmYgLS1naXQNCj4gPiBhL2RyaXZlcnMvbmV0L2Nhbi94aWxpbnhfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4veGlsaW54X2Nhbi5jIG5ldyBmaWxlDQo+ID4gbW9kZSAxMDA2NDQgaW5kZXggMDAwMDAwMC4uNjQyZTZiNA0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC9jYW4veGlsaW54X2Nhbi5jDQo+ID4gQEAgLTAsMCArMSwxMTUzIEBADQo+ID4gKy8qIFhpbGlueCBDQU4gZGV2aWNlIGRyaXZlcg0KPiA+ICsgKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTIgLSAyMDE0IFhpbGlueCwgSW5jLg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMDkgUGV0YUxvZ2l4LiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KPiA+ICsgKg0KPiA+ICsgKiBEZXNjcmlwdGlvbjoNCj4gPiArICogVGhpcyBkcml2ZXIgaXMgZGV2ZWxvcGVkIGZvciBBeGkgQ0FOIElQIGFuZCBmb3IgWnlucSBDQU5QUyBDb250cm9sbGVyLg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yDQo+ID4gK21vZGlmeQ0KPiA+ICsgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZA0KPiA+ICtieQ0KPiA+ICsgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcg0KPiA+ICsgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLg0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCj4gPiArICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YNCj4gPiArICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQ0KPiA+ICsgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KPiA+ICsgKg0KPiA+ICsgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQ0KPiA+ICsgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaW5jbHVkZSA8bGludXgvY2xrLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pby5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9jYW4vZXJyb3IuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2Nhbi9sZWQuaD4NCj4gPiArDQo+ID4gKyNkZWZpbmUgRFJJVkVSX05BTUUgICAgICAgICJYSUxJTlhfQ0FOIg0KPiA+ICsNCj4gPiArLyogQ0FOIHJlZ2lzdGVycyBzZXQgKi8NCj4gPiArI2RlZmluZSBYQ0FOX1NSUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDAgLyogU29mdHdhcmUgcmVzZXQgKi8NCj4gPiArI2RlZmluZSBYQ0FOX01TUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MDQgLyogTW9kZSBzZWxlY3QgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0JSUFJfT0ZGU0VUICAgICAgICAgICAweDA4IC8qIEJhdWQgcmF0ZSBwcmVzY2FsZXIgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0JUUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MEMgLyogQml0IHRpbWluZyAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRUNSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgxMCAvKiBFcnJvciBjb3VudGVyICovDQo+ID4gKyNkZWZpbmUgWENBTl9FU1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAweDE0IC8qIEVycm9yIHN0YXR1cyAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fU1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAgMHgxOCAvKiBTdGF0dXMgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lTUl9PRkZTRVQgICAgICAgICAgICAgICAgICAgIDB4MUMgLyogSW50ZXJydXB0IHN0YXR1cyAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSUVSX09GRlNFVCAgICAgICAgICAgICAgICAgICAgMHgyMCAvKiBJbnRlcnJ1cHQgZW5hYmxlICovDQo+ID4gKyNkZWZpbmUgWENBTl9JQ1JfT0ZGU0VUICAgICAgICAgICAgICAgICAgICAweDI0IC8qIEludGVycnVwdCBjbGVhciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fVFhGSUZPX0lEX09GRlNFVCAgICAgICAgICAgICAgMHgzMCAvKiBUWCBGSUZPIElEICovDQo+ID4gKyNkZWZpbmUgWENBTl9UWEZJRk9fRExDX09GRlNFVCAgICAgICAgICAgICAweDM0IC8qIFRYIEZJRk8gRExDICovDQo+ID4gKyNkZWZpbmUgWENBTl9UWEZJRk9fRFcxX09GRlNFVCAgICAgICAgICAgICAweDM4IC8qIFRYIEZJRk8gRGF0YQ0KPiBXb3JkIDEgKi8NCj4gPiArI2RlZmluZSBYQ0FOX1RYRklGT19EVzJfT0ZGU0VUICAgICAgICAgICAgIDB4M0MgLyogVFggRklGTyBEYXRhDQo+IFdvcmQgMiAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fUlhGSUZPX0lEX09GRlNFVCAgICAgICAgICAgICAgMHg1MCAvKiBSWCBGSUZPIElEICovDQo+ID4gKyNkZWZpbmUgWENBTl9SWEZJRk9fRExDX09GRlNFVCAgICAgICAgICAgICAweDU0IC8qIFJYIEZJRk8gRExDICovDQo+ID4gKyNkZWZpbmUgWENBTl9SWEZJRk9fRFcxX09GRlNFVCAgICAgICAgICAgICAweDU4IC8qIFJYIEZJRk8gRGF0YQ0KPiBXb3JkIDEgKi8NCj4gPiArI2RlZmluZSBYQ0FOX1JYRklGT19EVzJfT0ZGU0VUICAgICAgICAgICAgIDB4NUMgLyogUlggRklGTyBEYXRhDQo+IFdvcmQgMiAqLw0KPg0KPiBDYW4geW91IGRlZmluZSBhbGwgcmVnaXN0ZXIgb2Zmc2V0cyB2aWEgYW4gZW51bSBwbGVhc2UuDQo+DQoNCk9rDQoNCj4gPiArLyogQ0FOIHJlZ2lzdGVyIGJpdCBtYXNrcyAtIFhDQU5fPFJFRz5fPEJJVD5fTUFTSyAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fU1JSX0NFTl9NQVNLICAgICAgICAgIDB4MDAwMDAwMDIgLyogQ0FOIGVuYWJsZSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fU1JSX1JFU0VUX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBTb2Z0IFJlc2V0IHRoZQ0KPiBDQU4gY29yZSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fTVNSX0xCQUNLX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMiAvKiBMb29wIGJhY2sNCj4gbW9kZSBzZWxlY3QgKi8NCj4gPiArI2RlZmluZSBYQ0FOX01TUl9TTEVFUF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEgLyogU2xlZXAgbW9kZQ0KPiBzZWxlY3QgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0JSUFJfQlJQX01BU0sgICAgICAgICAweDAwMDAwMEZGIC8qIEJhdWQgcmF0ZQ0KPiBwcmVzY2FsZXIgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0JUUl9TSldfTUFTSyAgICAgICAgICAweDAwMDAwMTgwIC8qIFN5bmNocm9ub3VzDQo+IGp1bXAgd2lkdGggKi8NCj4gPiArI2RlZmluZSBYQ0FOX0JUUl9UUzJfTUFTSyAgICAgICAgICAweDAwMDAwMDcwIC8qIFRpbWUgc2VnbWVudA0KPiAyICovDQo+ID4gKyNkZWZpbmUgWENBTl9CVFJfVFMxX01BU0sgICAgICAgICAgMHgwMDAwMDAwRiAvKiBUaW1lIHNlZ21lbnQNCj4gMSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRUNSX1JFQ19NQVNLICAgICAgICAgIDB4MDAwMEZGMDAgLyogUmVjZWl2ZSBlcnJvcg0KPiBjb3VudGVyICovDQo+ID4gKyNkZWZpbmUgWENBTl9FQ1JfVEVDX01BU0sgICAgICAgICAgMHgwMDAwMDBGRiAvKiBUcmFuc21pdCBlcnJvcg0KPiBjb3VudGVyICovDQo+ID4gKyNkZWZpbmUgWENBTl9FU1JfQUNLRVJfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDEwIC8qIEFDSyBlcnJvciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRVNSX0JFUlJfTUFTSyAgICAgICAgIDB4MDAwMDAwMDggLyogQml0IGVycm9yICovDQo+ID4gKyNkZWZpbmUgWENBTl9FU1JfU1RFUl9NQVNLICAgICAgICAgMHgwMDAwMDAwNCAvKiBTdHVmZiBlcnJvciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRVNSX0ZNRVJfTUFTSyAgICAgICAgIDB4MDAwMDAwMDIgLyogRm9ybSBlcnJvciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRVNSX0NSQ0VSX01BU0sgICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBDUkMgZXJyb3IgKi8NCj4gPiArI2RlZmluZSBYQ0FOX1NSX1RYRkxMX01BU0sgICAgICAgICAweDAwMDAwNDAwIC8qIFRYIEZJRk8gaXMgZnVsbA0KPiAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fU1JfRVNUQVRfTUFTSyAgICAgICAgIDB4MDAwMDAxODAgLyogRXJyb3Igc3RhdHVzICovDQo+ID4gKyNkZWZpbmUgWENBTl9TUl9FUlJXUk5fTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDQwIC8qIEVycm9yIHdhcm5pbmcNCj4gKi8NCj4gPiArI2RlZmluZSBYQ0FOX1NSX05PUk1BTF9NQVNLICAgICAgICAgICAgICAgIDB4MDAwMDAwMDggLyogTm9ybWFsIG1vZGUNCj4gKi8NCj4gPiArI2RlZmluZSBYQ0FOX1NSX0xCQUNLX01BU0sgICAgICAgICAweDAwMDAwMDAyIC8qIExvb3AgYmFjaw0KPiBtb2RlICovDQo+ID4gKyNkZWZpbmUgWENBTl9TUl9DT05GSUdfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIENvbmZpZ3VyYXRpb24NCj4gbW9kZSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSVhSX1RYRkVNUF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwNDAwMCAvKiBUWCBGSUZPIEVtcHR5DQo+ICovDQo+ID4gKyNkZWZpbmUgWENBTl9JWFJfV0tVUF9NQVNLICAgICAgICAgMHgwMDAwMDgwMCAvKiBXYWtlIHVwDQo+IGludGVycnVwdCAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSVhSX1NMUF9NQVNLICAgICAgICAgIDB4MDAwMDA0MDAgLyogU2xlZXANCj4gaW50ZXJydXB0ICovDQo+ID4gKyNkZWZpbmUgWENBTl9JWFJfQlNPRkZfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMjAwIC8qIEJ1cyBvZmYNCj4gaW50ZXJydXB0ICovDQo+ID4gKyNkZWZpbmUgWENBTl9JWFJfRVJST1JfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMTAwIC8qIEVycm9yIGludGVycnVwdA0KPiAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSVhSX1JYTkVNUF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDA4MCAvKiBSWCBGSUZPDQo+IE5vdEVtcHR5IGludHIgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lYUl9SWE9GTFdfTUFTSyAgICAgICAgICAgICAgIDB4MDAwMDAwNDAgLyogUlggRklGTw0KPiBPdmVyZmxvdyBpbnRyICovDQo+ID4gKyNkZWZpbmUgWENBTl9JWFJfUlhPS19NQVNLICAgICAgICAgMHgwMDAwMDAxMCAvKiBNZXNzYWdlDQo+IHJlY2VpdmVkIGludHIgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lYUl9UWE9LX01BU0sgICAgICAgICAweDAwMDAwMDAyIC8qIFRYIHN1Y2Nlc3NmdWwNCj4gaW50ciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSVhSX0FSQkxTVF9NQVNLICAgICAgICAgICAgICAgMHgwMDAwMDAwMSAvKiBBcmJpdHJhdGlvbg0KPiBsb3N0IGludHIgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lEUl9JRDFfTUFTSyAgICAgICAgICAweEZGRTAwMDAwIC8qIFN0YW5kYXJkIG1zZw0KPiBpZGVudGlmaWVyICovDQo+ID4gKyNkZWZpbmUgWENBTl9JRFJfU1JSX01BU0sgICAgICAgICAgMHgwMDEwMDAwMCAvKiBTdWJzdGl0dXRlDQo+IHJlbW90ZSBUWHJlcSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSURSX0lERV9NQVNLICAgICAgICAgIDB4MDAwODAwMDAgLyogSWRlbnRpZmllcg0KPiBleHRlbnNpb24gKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lEUl9JRDJfTUFTSyAgICAgICAgICAweDAwMDdGRkZFIC8qIEV4dGVuZGVkDQo+IG1lc3NhZ2UgaWRlbnQgKi8NCj4gPiArI2RlZmluZSBYQ0FOX0lEUl9SVFJfTUFTSyAgICAgICAgICAweDAwMDAwMDAxIC8qIFJlbW90ZSBUWA0KPiByZXF1ZXN0ICovDQo+ID4gKyNkZWZpbmUgWENBTl9ETENSX0RMQ19NQVNLICAgICAgICAgMHhGMDAwMDAwMCAvKiBEYXRhIGxlbmd0aA0KPiBjb2RlICovDQo+ID4gKw0KDQpOZWVkIHRvIHVzZSBCSVQoKSBNYWNybyBmb3IgdGhlIE1hc2tzPw0KDQoNCj4gPiArI2RlZmluZSBYQ0FOX0lOVFJfQUxMICAgICAgICAgICAgICAoWENBTl9JWFJfVFhPS19NQVNLIHwNCj4gWENBTl9JWFJfQlNPRkZfTUFTSyB8XA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9JWFJfV0tVUF9NQVNLIHwNCj4gWENBTl9JWFJfU0xQX01BU0sgfCBcDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQ0FOX0lYUl9SWE5FTVBfTUFTSyB8DQo+IFhDQU5fSVhSX0VSUk9SX01BU0sgfCBcDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBYQ0FOX0lYUl9BUkJMU1RfTUFTSyB8DQo+IFhDQU5fSVhSX1JYT0tfTUFTSykNCj4gPiArDQo+ID4gKy8qIENBTiByZWdpc3RlciBiaXQgc2hpZnQgLSBYQ0FOXzxSRUc+XzxCSVQ+X1NISUZUICovDQo+ID4gKyNkZWZpbmUgWENBTl9CVFJfU0pXX1NISUZUICAgICAgICAgNyAgLyogU3luY2hyb25vdXMganVtcCB3aWR0aA0KPiAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fQlRSX1RTMl9TSElGVCAgICAgICAgIDQgIC8qIFRpbWUgc2VnbWVudCAyICovDQo+ID4gKyNkZWZpbmUgWENBTl9JRFJfSUQxX1NISUZUICAgICAgICAgMjEgLyogU3RhbmRhcmQgTWVzc2cNCj4gSWRlbnRpZmllciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fSURSX0lEMl9TSElGVCAgICAgICAgIDEgIC8qIEV4dGVuZGVkIE1lc3NhZ2UNCj4gSWRlbnRpZmllciAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRExDUl9ETENfU0hJRlQgICAgICAgICAgICAgICAgMjggLyogRGF0YSBsZW5ndGggY29kZSAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRVNSX1JFQ19TSElGVCAgICAgICAgIDggIC8qIFJ4IEVycm9yIENvdW50ICovDQo+ID4gKw0KPiA+ICsvKiBDQU4gZnJhbWUgbGVuZ3RoIGNvbnN0YW50cyAqLw0KPiA+ICsjZGVmaW5lIFhDQU5fRUNIT19TS0JfTUFYICAgICAgICAgIDY0DQo+ID4gKyNkZWZpbmUgWENBTl9GUkFNRV9NQVhfREFUQV9MRU4gICAgICAgICAgICA4DQo+ID4gKyNkZWZpbmUgWENBTl9USU1FT1VUICAgICAgICAgICAgICAgICAgICAgICAoNTAgKiBIWikNCj4NCj4gVGhpcyBpcyA1MCBzZWNvbmRzLCBpcyB0aGlzIGludGVudGlvbmFsPw0KPg0KDQpTb3JyeSB3aWxsIG1ha2UgaXQgYXMgMSpIWi4NCg0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHN0cnVjdCB4Y2FuX3ByaXYgLSBUaGlzIGRlZmluaXRpb24gZGVmaW5lIENBTiBkcml2ZXIgaW5zdGFuY2UNCj4gPiArICogQGNhbjogICAgICAgICAgICAgICAgICAgQ0FOIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUuDQo+ID4gKyAqIEBvcGVuX3RpbWU6ICAgICAgICAgICAgICAgICAgICAgRm9yIGhvbGRpbmcgdGltZW91dCB2YWx1ZXMNCj4NCj4gUGxlYXNlIHJlbW92ZSBvcGVuX3RpbWUgY29tcGxldGVseSBmcm9tIHRoZSBkcml2ZXIuDQoNCk9rDQoNCj4NCj4gPiArICogQHdhaXRpbmdfZWNoX3NrYl9pbmRleDogUG9pbnRlciBmb3Igc2tiDQo+ID4gKyAqIEBlY2hfc2tiX25leHQ6ICAgICAgICAgIFRoaXMgdGVsbCB0aGUgbmV4dCBwYWNrZXQgaW4gdGhlIHF1ZXVlDQo+ID4gKyAqIEB3YWl0aW5nX2VjaF9za2JfbnVtOiAgIEdpdmVzIHRoZSBudW1iZXIgb2YgcGFja2V0cyB3YWl0aW5nDQo+ID4gKyAqIEB4Y2FuX2VjaG9fc2tiX21heF90eDogIE1heGltdW0gbnVtYmVyIHBhY2tldHMgdGhlIGRyaXZlcg0KPiBjYW4gc2VuZA0KPiA+ICsgKiBAeGNhbl9lY2hvX3NrYl9tYXhfcng6ICBNYXhpbXVtIG51bWJlciBwYWNrZXRzIHRoZSBkcml2ZXINCj4gY2FuIHJlY2VpdmUNCj4gPiArICogQG5hcGk6ICAgICAgICAgICAgICAgICAgTkFQSSBzdHJ1Y3R1cmUNCj4gPiArICogQGVjaF9za2JfbG9jazogICAgICAgICAgRm9yIHNwaW5sb2NrIHB1cnBvc2UNCj4gPiArICogQHJlYWRfcmVnOiAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVhZGluZyBkYXRhIGZyb20gQ0FOIHJlZ2lzdGVycw0KPiA+ICsgKiBAd3JpdGVfcmVnOiAgICAgICAgICAgICAgICAgICAgIEZvciB3cml0aW5nIGRhdGEgdG8gQ0FOIHJlZ2lzdGVycw0KPiA+ICsgKiBAZGV2OiAgICAgICAgICAgICAgICAgICBOZXR3b3JrIGRldmljZSBkYXRhIHN0cnVjdHVyZQ0KPiA+ICsgKiBAcmVnX2Jhc2U6ICAgICAgICAgICAgICAgICAgICAgIElvcmVtYXBwZWQgYWRkcmVzcyB0byByZWdpc3RlcnMNCj4gPiArICogQGlycV9mbGFnczogICAgICAgICAgICAgICAgICAgICBGb3IgcmVxdWVzdF9pcnEoKQ0KPiA+ICsgKiBAYXBlcmNsazogICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IGNsaw0KPiA+ICsgKiBAZGV2Y2xrOiAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gc3RydWN0IGNsaw0KPiA+ICsgKi8NCj4gPiArc3RydWN0IHhjYW5fcHJpdiB7DQo+ID4gKyAgIHN0cnVjdCBjYW5fcHJpdiBjYW47DQo+ID4gKyAgIGludCBvcGVuX3RpbWU7DQo+ID4gKyAgIGludCB3YWl0aW5nX2VjaF9za2JfaW5kZXg7DQo+ID4gKyAgIGludCBlY2hfc2tiX25leHQ7DQo+DQo+IHBsZWFzZSBtYWtlIHRoZW06DQo+DQo+IHVuc2lnbmVkIGludCB0eF9oZWFkOw0KPiB1bnNpZ25lZCBpbnQgdHhfdGFpbDsNCj4NCj4gSSdsbCBleHBsYWluIGhvdyB0byB1c2UgdGhlbSBsYXRlci4gSGF2ZSBhIGxvb2sgYXQgdGhlIHRpX2hlY2MgZHJpdmVyLg0KDQoNCk9rDQo+DQo+ID4gKyAgIGludCB3YWl0aW5nX2VjaF9za2JfbnVtOw0KPiA+ICsgICBpbnQgeGNhbl9lY2hvX3NrYl9tYXhfdHg7DQo+ID4gKyAgIGludCB4Y2FuX2VjaG9fc2tiX21heF9yeDsNCj4gPiArICAgc3RydWN0IG5hcGlfc3RydWN0IG5hcGk7DQo+ID4gKyAgIHNwaW5sb2NrX3QgZWNoX3NrYl9sb2NrOw0KPiA+ICsgICB1MzIgKCpyZWFkX3JlZykoY29uc3Qgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiwgaW50IHJlZyk7DQo+ID4gKyAgIHZvaWQgKCp3cml0ZV9yZWcpKGNvbnN0IHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYsIGludCByZWcsIHUzMiB2YWwpOw0KPg0KPiBQbGVhc2UgcmVtb3ZlIHJlYWRfcmVnLCB3cml0ZV9yZWcsIGFzIGxvbmcgYXMgdGhlcmUgaXNuJ3QgYW55IEJFIHN1cHBvcnQgaW4NCj4gdGhlIGRyaXZlciwgY2FsbCB0aGVtIGRpcmVjdGx5Lg0KPg0KDQoNCkFzIHBlciB5b3VycyBhbmQgTWljaGFsIGRpc2N1c3Npb24gSSBhbSBrZWVwaW5nIHRoaXMgaGVyZSAoZW5kaWFuZXNzIG9mIHRoZSBJUCBpcyBub3QgZml4ZWQgYXQgY29tcGlsZSB0aW1lKS4NCg0KPiA+ICsgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2Ow0KPiA+ICsgICB2b2lkIF9faW9tZW0gKnJlZ19iYXNlOw0KPiA+ICsgICB1bnNpZ25lZCBsb25nIGlycV9mbGFnczsNCj4gPiArICAgc3RydWN0IGNsayAqYXBlcmNsazsNCj4gPiArICAgc3RydWN0IGNsayAqZGV2Y2xrOw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyogQ0FOIEJpdHRpbWluZyBjb25zdGFudHMgYXMgcGVyIFhpbGlueCBDQU4gc3BlY3MgKi8gc3RhdGljIGNvbnN0DQo+ID4gK3N0cnVjdCBjYW5fYml0dGltaW5nX2NvbnN0IHhjYW5fYml0dGltaW5nX2NvbnN0ID0gew0KPiA+ICsgICAubmFtZSA9IERSSVZFUl9OQU1FLA0KPiA+ICsgICAudHNlZzFfbWluID0gMSwNCj4gPiArICAgLnRzZWcxX21heCA9IDE2LA0KPiA+ICsgICAudHNlZzJfbWluID0gMSwNCj4gPiArICAgLnRzZWcyX21heCA9IDgsDQo+ID4gKyAgIC5zandfbWF4ID0gNCwNCj4gPiArICAgLmJycF9taW4gPSAxLA0KPiA+ICsgICAuYnJwX21heCA9IDI1NiwNCj4gPiArICAgLmJycF9pbmMgPSAxLA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fd3JpdGVfcmVnIC0gV3JpdGUgYSB2YWx1ZSB0byB0aGUgZGV2aWNlIHJlZ2lzdGVyDQo+ID4gKyAqIEBwcml2OiAgRHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUNCj4gPiArICogQHJlZzogICBSZWdpc3RlciBvZmZzZXQNCj4gPiArICogQHZhbDogICBWYWx1ZSB0byB3cml0ZSBhdCB0aGUgUmVnaXN0ZXIgb2Zmc2V0DQo+ID4gKyAqDQo+ID4gKyAqIFdyaXRlIGRhdGEgdG8gdGhlIHBhcmljdWxhciBDQU4gcmVnaXN0ZXIgICovIHN0YXRpYyB2b2lkDQo+ID4gK3hjYW5fd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYsIGludCByZWcsIHUzMiB2YWwpDQo+DQo+IFBsZWFzZSB1c2UgdGhlIGVudW0gZm9yIGluc3RlYWQgb2YgYW4gaW50IGZvciB0aGUgcmVnLg0KDQpPaw0KPg0KPiA+ICt7DQo+ID4gKyAgIHdyaXRlbCh2YWwsIHByaXYtPnJlZ19iYXNlICsgcmVnKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fcmVhZF9yZWcgLSBSZWFkIGEgdmFsdWUgZnJvbSB0aGUgZGV2aWNlIHJlZ2lzdGVyDQo+ID4gKyAqIEBwcml2OiAgRHJpdmVyIHByaXZhdGUgZGF0YSBzdHJ1Y3R1cmUNCj4gPiArICogQHJlZzogICBSZWdpc3RlciBvZmZzZXQNCj4gPiArICoNCj4gPiArICogUmVhZCBkYXRhIGZyb20gdGhlIHBhcnRpY3VsYXIgQ0FOIHJlZ2lzdGVyDQo+ID4gKyAqIFJldHVybjogdmFsdWUgcmVhZCBmcm9tIHRoZSBDQU4gcmVnaXN0ZXIgICovIHN0YXRpYyB1MzINCj4gPiAreGNhbl9yZWFkX3JlZyhjb25zdCBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2LCBpbnQgcmVnKSB7DQo+DQo+IHNhbWUgaGVyZQ0KDQpPaw0KPg0KPiA+ICsgICByZXR1cm4gcmVhZGwocHJpdi0+cmVnX2Jhc2UgKyByZWcpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogc2V0X3Jlc2V0X21vZGUgLSBSZXNldHMgdGhlIENBTiBkZXZpY2UgbW9kZQ0KPiA+ICsgKiBAbmRldjogIFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBpcyB0aGUgZHJpdmVyIHJlc2V0IG1vZGUgcm91dGluZS5UaGUgZHJpdmVyDQo+ID4gKyAqIGVudGVycyBpbnRvIGNvbmZpZ3VyYXRpb24gbW9kZS4NCj4gPiArICoNCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IgICovIHN0YXRpYyBpbnQNCj4gPiArc2V0X3Jlc2V0X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpIHsNCj4gPiArICAgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOw0KPiA+ICsgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7DQo+ID4gKw0KPiA+ICsgICBwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU1RPUFBFRDsNCj4gPiArDQo+ID4gKyAgIHRpbWVvdXQgPSBqaWZmaWVzICsgWENBTl9USU1FT1VUOw0KPiA+ICsgICB3aGlsZSAoIShwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkgJg0KPiBYQ0FOX1NSX0NPTkZJR19NQVNLKSkgew0KPiA+ICsgICAgICAgICAgIGlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBuZXRkZXZfd2FybihuZGV2LCAidGltZWRvdXQgd2FpdGluZyBmb3IgY29uZmlnDQo+IG1vZGVcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7DQo+ID4gKyAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgIHVzbGVlcF9yYW5nZSg1MDAsIDEwMDAwKTsNCj4gPiArICAgfQ0KPiA+ICsNCj4gPiArICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX3NldF9iaXR0aW1pbmcgLSBDQU4gc2V0IGJpdCB0aW1pbmcgcm91dGluZQ0KPiA+ICsgKiBAbmRldjogIFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBpcyB0aGUgZHJpdmVyIHNldCBiaXR0aW1pbmcgIHJvdXRpbmUuDQo+ID4gKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlIHZhbHVlIG9uIGVycm9yICAqLyBzdGF0aWMgaW50DQo+ID4gK3hjYW5fc2V0X2JpdHRpbWluZyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikgew0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKyAgIHN0cnVjdCBjYW5fYml0dGltaW5nICpidCA9ICZwcml2LT5jYW4uYml0dGltaW5nOw0KPiA+ICsgICB1MzIgYnRyMCwgYnRyMTsNCj4gPiArICAgdTMyIGlzX2NvbmZpZ19tb2RlOw0KPiA+ICsNCj4gPiArICAgLyogQ2hlY2sgd2hldGhlciBYaWxpbnggQ0FOIGlzIGluIGNvbmZpZ3VyYXRpb24gbW9kZS4NCj4gPiArICAgICogSXQgY2Fubm90IHNldCBiaXQgdGltaW5nIGlmIFhpbGlueCBDQU4gaXMgbm90IGluIGNvbmZpZ3VyYXRpb24gbW9kZS4NCj4gPiArICAgICovDQo+ID4gKyAgIGlzX2NvbmZpZ19tb2RlID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9TUl9PRkZTRVQpICYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9TUl9DT05GSUdfTUFTSzsNCj4gPiArICAgaWYgKCFpc19jb25maWdfbW9kZSkgew0KPiA+ICsgICAgICAgICAgIG5ldGRldl9hbGVydChuZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgYml0dGltaW5nIGNhbiBpcyBub3QgaW4gY29uZmlnIG1vZGVcbiIpOw0KPiA+ICsgICAgICAgICAgIHJldHVybiAtRVBFUk07DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIFNldHRpbmcgQmF1ZCBSYXRlIHByZXNjYWxhciB2YWx1ZSBpbiBCUlBSIFJlZ2lzdGVyICovDQo+ID4gKyAgIGJ0cjAgPSAoYnQtPmJycCAtIDEpICYgWENBTl9CUlBSX0JSUF9NQVNLOw0KPiA+ICsNCj4gPiArICAgLyogU2V0dGluZyBUaW1lIFNlZ21lbnQgMSBpbiBCVFIgUmVnaXN0ZXIgKi8NCj4gPiArICAgYnRyMSA9IChidC0+cHJvcF9zZWcgKyBidC0+cGhhc2Vfc2VnMSAtIDEpICYgWENBTl9CVFJfVFMxX01BU0s7DQo+ID4gKw0KPiA+ICsgICAvKiBTZXR0aW5nIFRpbWUgU2VnbWVudCAyIGluIEJUUiBSZWdpc3RlciAqLw0KPiA+ICsgICBidHIxIHw9ICgoYnQtPnBoYXNlX3NlZzIgLSAxKSA8PCBYQ0FOX0JUUl9UUzJfU0hJRlQpICYNCj4gPiArICAgICAgICAgICBYQ0FOX0JUUl9UUzJfTUFTSzsNCj4gPiArDQo+ID4gKyAgIC8qIFNldHRpbmcgU3luY2hyb25vdXMganVtcCB3aWR0aCBpbiBCVFIgUmVnaXN0ZXIgKi8NCj4gPiArICAgYnRyMSB8PSAoKGJ0LT5zancgLSAxKSA8PCBYQ0FOX0JUUl9TSldfU0hJRlQpICYNCj4gWENBTl9CVFJfU0pXX01BU0s7DQo+DQo+IEFsbCB0aGUgbWFza2luZyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYXMgdGhlIGJpdCB0aW1pbmcgaXMgY2FsY3VsYXRlZCB3aXRoaW4NCj4gdGhlIGJvdW5kcyB5b3Ugc3BlY2lmaWVkLg0KDQoNCk9rDQo+DQo+ID4gKyAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0JSUFJfT0ZGU0VULCBidHIwKTsNCj4gPiArICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fQlRSX09GRlNFVCwgYnRyMSk7DQo+ID4gKw0KPiA+ICsgICBuZXRkZXZfZGJnKG5kZXYsICJCUlBSPTB4JTA4eCwgQlRSPTB4JTA4eFxuIiwNCj4gPiArICAgICAgICAgICAgICAgICAgIHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fQlJQUl9PRkZTRVQpLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9CVFJfT0ZGU0VUKSk7DQo+ID4gKw0KPiA+ICsgICByZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fc3RhcnQgLSBUaGlzIHRoZSBkcml2ZXJzIHN0YXJ0IHJvdXRpbmUNCj4gPiArICogQG5kZXY6ICBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgaXMgdGhlIGRyaXZlcnMgc3RhcnQgcm91dGluZS4NCj4gPiArICogQmFzZWQgb24gdGhlIFN0YXRlIG9mIHRoZSBDQU4gZGV2aWNlIGl0IHB1dHMNCj4gPiArICogdGhlIENBTiBkZXZpY2UgaW50byBhIHByb3BlciBtb2RlLg0KPiA+ICsgKg0KPiA+ICsgKiBSZXR1cm46IDAgb24gc3VjY2VzcyBhbmQgZmFpbHVyZSB2YWx1ZSBvbiBlcnJvciAgKi8gc3RhdGljIGludA0KPiA+ICt4Y2FuX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQ0KPg0KPiBQbGVhc2UgbmFtZSB0aGUgZnVuY3Rpb24geGNhbl9jaGlwX3N0YXJ0KCksIHRvIGZvciBhIGNvbW1vbiBuYW1pbmcgbGlrZQ0KPiB0aGUgZmxleGNhbiBhbmQgYXQ5MSBkcml2ZXIuDQo+DQoNCg0KT0sNCg0KPiA+ICt7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArICAgdTMyIGVycjsNCj4gPiArICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0Ow0KPiA+ICsNCj4gPiArICAgLyogQ2hlY2sgaWYgaXQgaXMgaW4gcmVzZXQgbW9kZSAqLw0KPiA+ICsgICBpZiAocHJpdi0+Y2FuLnN0YXRlICE9IENBTl9TVEFURV9TVE9QUEVEKQ0KPg0KPiBEb24ndCBkZXBlbmQgb24gYW55IHN0YXRlIGhlcmUsIEkgc3VnZ2VzdCB0byBkbyBhIHNvZnRyZXNldCAob3INCj4gZXF1aXZhbGVudCkgb2YgeW91IENBTiBjb3JlIGFuZCBjb25maWd1cmUgZXZlcnl0aGluZy4NCj4NCg0KT2sNCj4gPiArICAgICAgICAgICBlcnIgPSBzZXRfcmVzZXRfbW9kZShuZGV2KTsNCj4gPiArICAgICAgICAgICBpZiAoZXJyIDwgMCkNCj4gPiArICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7DQo+ID4gKw0KPiA+ICsgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLw0KPiA+ICsgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VULCBYQ0FOX0lOVFJfQUxMKTsNCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIHdoZXRoZXIgaXQgaXMgbG9vcGJhY2sgbW9kZSBvciBub3JtYWwgbW9kZSAgKi8NCj4gPiArICAgaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9MT09QQkFDSykNCj4gPiArICAgICAgICAgICAvKiBQdXQgZGV2aWNlIGludG8gbG9vcGJhY2sgbW9kZSAqLw0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX01TUl9PRkZTRVQsDQo+IFhDQU5fTVNSX0xCQUNLX01BU0spOw0KPiA+ICsgICBlbHNlDQo+ID4gKyAgICAgICAgICAgLyogVGhlIGRldmljZSBpcyBpbiBub3JtYWwgbW9kZSAqLw0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX01TUl9PRkZTRVQsIDApOw0KPiA+ICsNCj4gPiArICAgaWYgKHByaXYtPmNhbi5zdGF0ZSA9PSBDQU5fU1RBVEVfU1RPUFBFRCkgew0KPiA+ICsgICAgICAgICAgIC8qIEVuYWJsZSBYaWxpbnggQ0FOICovDQo+ID4gKyAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwNCj4gWENBTl9TUlJfQ0VOX01BU0spOw0KPiA+ICsgICAgICAgICAgIHByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7DQo+ID4gKyAgICAgICAgICAgdGltZW91dCA9IGppZmZpZXMgKyBYQ0FOX1RJTUVPVVQ7DQo+ID4gKyAgICAgICAgICAgaWYgKHByaXYtPmNhbi5jdHJsbW9kZSAmIENBTl9DVFJMTU9ERV9MT09QQkFDSykgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFhDQU5fU1JfTEJBQ0tfTUFTSykgPT0gMCkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldGRldl93YXJuKG5kZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZWRvdXQgZm9yIGxvb3BiYWNrDQo+IG1vZGVcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRVRJTUVET1VUOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzbGVlcF9yYW5nZSg1MDAsIDEwMDAwKTsNCj4gPiArICAgICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgICAgICAgd2hpbGUgKChwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIFhDQU5fU1JfTk9STUFMX01BU0spID09IDApIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRkZXZfd2FybihuZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVkb3V0IGZvciBub3JtYWwNCj4gbW9kZVxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FVElNRURPVVQ7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNsZWVwX3JhbmdlKDUwMCwgMTAwMDApOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICBuZXRkZXZfZGJnKG5kZXYsICJzdGF0dXM6I3glMDh4XG4iLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkpOw0KPiA+ICsgICB9DQo+ID4gKyAgIHByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7DQo+ID4gKyAgIHJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9kb19zZXRfbW9kZSAtIFRoaXMgc2V0cyB0aGUgbW9kZSBvZiB0aGUgZHJpdmVyDQo+ID4gKyAqIEBuZGV2OiAgUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQ0KPiA+ICsgKiBAbW9kZTogIFRlbGxzIHRoZSBtb2RlIG9mIHRoZSBkcml2ZXINCj4gPiArICoNCj4gPiArICogVGhpcyBjaGVjayB0aGUgZHJpdmVycyBzdGF0ZSBhbmQgY2FsbHMgdGhlDQo+ID4gKyAqIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVzIHRvIHNldC4NCj4gPiArICoNCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IgICovIHN0YXRpYyBpbnQNCj4gPiAreGNhbl9kb19zZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgZW51bSBjYW5fbW9kZSBtb2RlKSB7DQo+ID4gKyAgIGludCByZXQ7DQo+ID4gKw0KPiA+ICsgICBzd2l0Y2ggKG1vZGUpIHsNCj4gPiArICAgY2FzZSBDQU5fTU9ERV9TVEFSVDoNCj4gPiArICAgICAgICAgICByZXQgPSB4Y2FuX3N0YXJ0KG5kZXYpOw0KPiA+ICsgICAgICAgICAgIGlmIChyZXQgPCAwKQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgbmV0ZGV2X2VycihuZGV2LCAieGNhbl9zdGFydCBmYWlsZWQhXG4iKTsNCj4gPiArICAgICAgICAgICBuZXRpZl93YWtlX3F1ZXVlKG5kZXYpOw0KPiA+ICsgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICBkZWZhdWx0Og0KPiA+ICsgICAgICAgICAgIHJldCA9IC1FT1BOT1RTVVBQOw0KPiA+ICsgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICByZXR1cm4gcmV0Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9zdGFydF94bWl0IC0gU3RhcnRzIHRoZSB0cmFuc21pc3Npb24NCj4gPiArICogQHNrYjogICBza19idWZmIHBvaW50ZXIgdGhhdCBjb250YWlucyBkYXRhIHRvIGJlIFR4ZWQNCj4gPiArICogQG5kZXY6ICBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCBmcm9tIHVwcGVyIGxheWVycyB0byBpbml0aWF0ZQ0KPiA+ICt0cmFuc21pc3Npb24uIFRoaXMNCj4gPiArICogZnVuY3Rpb24gdXNlcyB0aGUgbmV4dCBhdmFpbGFibGUgZnJlZSB0eGJ1ZmYgYW5kIHBvcHVsYXRlcyB0aGVpcg0KPiA+ICtmaWVsZHMgdG8NCj4gPiArICogc3RhcnQgdGhlIHRyYW5zbWlzc2lvbi4NCj4gPiArICoNCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IgICovIHN0YXRpYyBpbnQNCj4gPiAreGNhbl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSB7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5kZXYtPnN0YXRzOw0KPiA+ICsgICBzdHJ1Y3QgY2FuX2ZyYW1lICpjZiA9IChzdHJ1Y3QgY2FuX2ZyYW1lICopc2tiLT5kYXRhOw0KPiA+ICsgICB1MzIgaWQsIGRsYywgZGF0YVsyXSA9IHswLCAwfSwgcnRyID0gMDsNCj4NCj4gSSB0aGluayB5b3UgY2FuIGRyb3AgdGhlIHJ0ciB2YXJpYmFsZSBhbmQgdXNlIGNmLT5jYW5faWQgJiBDQU5fUlRSX0ZMQUcNCj4gaW5zdGVhZC4NCj4NCg0KT0sNCj4gPiArICAgdW5zaWduZWQgbG9uZyBmbGFnczsNCj4gPiArDQo+ID4gKyAgIGlmIChjYW5fZHJvcHBlZF9pbnZhbGlkX3NrYihuZGV2LCBza2IpKQ0KPiA+ICsgICAgICAgICAgIHJldHVybiBORVRERVZfVFhfT0s7DQo+ID4gKw0KPiA+ICsgICAvKiBXYXRjaCBjYXJlZnVsbHkgb24gdGhlIGJpdCBzZXF1ZW5jZSAqLw0KPiA+ICsgICBpZiAoY2YtPmNhbl9pZCAmIENBTl9FRkZfRkxBRykgew0KPiA+ICsgICAgICAgICAgIC8qIEV4dGVuZGVkIENBTiBJRCBmb3JtYXQgKi8NCj4gPiArICAgICAgICAgICBpZCA9ICgoY2YtPmNhbl9pZCAmIENBTl9FRkZfTUFTSykgPDwgWENBTl9JRFJfSUQyX1NISUZUKQ0KPiAmDQo+ID4gKyAgICAgICAgICAgICAgICAgICBYQ0FOX0lEUl9JRDJfTUFTSzsNCj4gPiArICAgICAgICAgICBpZCB8PSAoKChjZi0+Y2FuX2lkICYgQ0FOX0VGRl9NQVNLKSA+Pg0KPiA+ICsgICAgICAgICAgICAgICAgICAgKENBTl9FRkZfSURfQklUUy1DQU5fU0ZGX0lEX0JJVFMpKSA8PA0KPiA+ICsgICAgICAgICAgICAgICAgICAgWENBTl9JRFJfSUQxX1NISUZUKSAmIFhDQU5fSURSX0lEMV9NQVNLOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAvKiBUaGUgc3Vic3RpYnV0ZSByZW1vdGUgVFggcmVxdWVzdCBiaXQgc2hvdWxkIGJlICIxIg0KPiA+ICsgICAgICAgICAgICAqIGZvciBleHRlbmRlZCBmcmFtZXMgYXMgaW4gdGhlIFhpbGlueCBDQU4gZGF0YXNoZWV0DQo+ID4gKyAgICAgICAgICAgICovDQo+ID4gKyAgICAgICAgICAgaWQgfD0gWENBTl9JRFJfSURFX01BU0sgfCBYQ0FOX0lEUl9TUlJfTUFTSzsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgaWYgKGNmLT5jYW5faWQgJiBDQU5fUlRSX0ZMQUcpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgIC8qIEV4dGVuZGVkIGZyYW1lcyByZW1vdGUgVFggcmVxdWVzdCAqLw0KPiA+ICsgICAgICAgICAgICAgICAgICAgaWQgfD0gWENBTl9JRFJfUlRSX01BU0s7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBydHIgPSAxOw0KPiA+ICsgICAgICAgICAgIH0NCj4gPiArICAgfSBlbHNlIHsNCj4gPiArICAgICAgICAgICAvKiBTdGFuZGFyZCBDQU4gSUQgZm9ybWF0ICovDQo+ID4gKyAgICAgICAgICAgaWQgPSAoKGNmLT5jYW5faWQgJiBDQU5fU0ZGX01BU0spIDw8IFhDQU5fSURSX0lEMV9TSElGVCkNCj4gJg0KPiA+ICsgICAgICAgICAgICAgICAgICAgWENBTl9JRFJfSUQxX01BU0s7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgIGlmIChjZi0+Y2FuX2lkICYgQ0FOX1JUUl9GTEFHKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAvKiBFeHRlbmRlZCBmcmFtZXMgcmVtb3RlIFRYIHJlcXVlc3QgKi8NCj4gPiArICAgICAgICAgICAgICAgICAgIGlkIHw9IFhDQU5fSURSX1NSUl9NQVNLOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgcnRyID0gMTsNCj4gPiArICAgICAgICAgICB9DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIGRsYyA9IChjZi0+Y2FuX2RsYyAmIDB4ZikgPDwgWENBTl9ETENSX0RMQ19TSElGVDsNCj4NCj4gTm8gbmVlZCB0byBtYXNrIGRsYywgaXQncyB2YWxpZC4NCj4NCk9LDQoNCj4gPiArDQo+ID4gKyAgIGlmIChkbGMgPiAwKQ0KPg0KPiBZb3UndmUgY29waWVkIG15IHNwZXVkbyBjb2RlIDopDQo+IEJ1dCB5b3UgaGF2ZSB0byB1c2UgKGNmLT5jYW5fZGxjID4gMCkgaGVyZSwgYXMgZGxjIGlzIHRoZSBzaGlmdGVkIHZhbHVlLg0KDQpZZXMgOikgSSBtaXNzZWQgaXQgd2lsbCBjaGFuZ2UNCg0KPg0KPiA+ICsgICAgICAgICAgIGRhdGFbMF0gPSBiZTMyX3RvX2NwdXAoKF9fYmUzMiAqKShjZi0+ZGF0YSArIDApKTsNCj4gPiArICAgaWYgKGRsYyA+IDQpDQo+ID4gKyAgICAgICAgICAgZGF0YVsxXSA9IGJlMzJfdG9fY3B1cCgoX19iZTMyICopKGNmLT5kYXRhICsgNCkpOw0KPiA+ICsNCj4gPiArICAgY2FuX3B1dF9lY2hvX3NrYihza2IsIG5kZXYsIHByaXYtPmVjaF9za2JfbmV4dCk7DQo+DQo+ICAgICAgIGNhbl9wdXRfZWNob19za2Ioc2tiLCBuZGV2LA0KPiAgICAgICAgICAgICAgIHByaXYtPnR4X2hlYWQgJSBwcml2LT54Y2FuX2VjaG9fc2tiX21heF90eCk7DQo+DQo+ICAgICAgIHByaXYtPnR4X2hlYWQrKzsNCj4NCg0KT2sNCj4gPiArDQo+ID4gKyAgIC8qIFdyaXRlIHRoZSBGcmFtZSB0byBYaWxpbnggQ0FOIFRYIEZJRk8gKi8NCj4gPiArICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fVFhGSUZPX0lEX09GRlNFVCwgaWQpOw0KPiA+ICsgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9UWEZJRk9fRExDX09GRlNFVCwgZGxjKTsNCj4gPiArICAgaWYgKCFydHIpIHsNCj4gPiArICAgICAgICAgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9UWEZJRk9fRFcxX09GRlNFVCwgZGF0YVswXSk7DQo+ID4gKyAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fVFhGSUZPX0RXMl9PRkZTRVQsIGRhdGFbMV0pOw0KPiA+ICsgICAgICAgICAgIHN0YXRzLT50eF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsNCj4NCj4gUGxlYXNlIGFkZCBhIGNvbW1lbnQgd2hpY2ggd3JpdGUgdHJpZ2dlcnMgdGhlIHR4LiBXaGF0IGluIGNhc2Ugb2YgdGhlIHJ0cj8NCj4gV2hpY2ggd3JpdGUgdHJpZ2dlcnMgdGhlIHR4IHRoZW4/DQo+DQoNCk9rICBXaWxsIEFkZA0KDQogSW4gUlRSIENhc2UgIHRoZSBiZWxvdyB3cml0ZSB0cmlnZ2VycyB0aGUgdHJhc21pc3Npb24NCnByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX1RYRklGT19ETENfT0ZGU0VULCBkbGMpOw0KSW4gTm9ybWFsIGNhc2UgIHRoaXMgd3JpdGUNCnByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX1RYRklGT19EVzJfT0ZGU0VULCBkYXRhWzFdKTsNClRyaWdnZXJzIHRoZSB0cmFuc21pc3Npb24uDQoNCkluIEJ0dzogRHVlIHRvIHRoZSBsaW1pdGF0aW9ucyBpbiB0aGUgSVAoIFR4IERMQyByZWdpc3RlciBpcyBhIHdyaXRlIG9ubHkgUmVnaXN0ZXIpDQpJIGNhbid0IHB1dCB0aGlzIHN0YXRzLT50eF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsgaW4gdGhlIHR4IGludGVycnVwdCByb3V0aW5lLg0KDQoNCg0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICBwcml2LT5lY2hfc2tiX25leHQgPSAocHJpdi0+ZWNoX3NrYl9uZXh0ICsgMSkgJQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXYtPnhjYW5fZWNob19za2JfbWF4X3R4Ow0KPg0KPiBQbGVhc2UgcmVtb3ZlLCBpdCdzIG5vdCBuZWVkZWQuDQo+DQpPaw0KDQo+ID4gKw0KPiA+ICsgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZWNoX3NrYl9sb2NrLCBmbGFncyk7DQo+ID4gKyAgIHByaXYtPndhaXRpbmdfZWNoX3NrYl9udW0rKzsNCj4gPiArICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+ZWNoX3NrYl9sb2NrLCBmbGFncyk7DQo+DQo+IEFsbCAzIG5vdCBuZWVkZWQuDQo+DQpPaw0KPiA+ICsNCj4gPiArICAgLyogQ2hlY2sgaWYgdGhlIFRYIGJ1ZmZlciBpcyBmdWxsICovDQo+ID4gKyAgIGlmIChwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1NSX09GRlNFVCkgJiBYQ0FOX1NSX1RYRkxMX01BU0spDQo+IHsNCj4gPiArICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOw0KPiA+ICsgICAgICAgICAgIG5ldGRldl9lcnIobmRldiwgIlRYIHJlZ2lzdGVyIGlzIHN0aWxsIGZ1bGwhXG4iKTsNCj4gPiArICAgICAgICAgICByZXR1cm4gTkVUREVWX1RYX0JVU1k7DQo+DQo+IElmIHRoaXMgaXMgdHJ1ZSwgdGhlcmUgaXMgYSBCdWcgaW4gdGhlIGZsb3cgY29udHJvbC4gSXQgc2hvdWxkIGJlIG1vdmVkIHRvIHRoZQ0KPiBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLCBzZWUgYXQ5MV9jYW4ncyB4bWl0IGZ1bmN0aW9uLg0KDQoNClllcyB0aGlzIENvbmRpdGlvbiBCZWNvbWVzIHRydWUuDQpXaWxsIHB1dCB0aGUgYmVsb3cgY2hlY2sgaW4gdGhlIEJlZ2lubmluZyBvZiB0aGlzIGZ1bmN0aW9uDQo+DQo+ICAgICAgIC8qIENoZWNrIGlmIHRoZSBUWCBidWZmZXIgaXMgZnVsbCAqLw0KPiAgICAgICBpZiAodW5saWtlbHkocHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9TUl9PRkZTRVQpICYNCj4gICAgICAgICAgICAgICBYQ0FOX1NSX1RYRkxMX01BU0spKSB7DQo+ICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsNCj4gICAgICAgICAgICAgICBuZXRkZXZfZXJyKG5kZXYsDQo+ICAgICAgICAgICAgICAgICAgICAgICAiQlVHISwgVFggRklGTyBmdWxsIHdoZW4gcXVldWUgYXdha2UhXG4iKTsNCj4gICAgICAgICAgICAgICByZXR1cm4gTkVUREVWX1RYX0JVU1k7DQo+ICAgICAgIH0NCj4NCj4gPiArICAgfSBlbHNlIGlmIChwcml2LT53YWl0aW5nX2VjaF9za2JfbnVtID09IHByaXYtDQo+ID54Y2FuX2VjaG9fc2tiX21heF90eCkgew0KPiA+ICsgICAgICAgICAgIG5ldGlmX3N0b3BfcXVldWUobmRldik7DQo+ID4gKyAgICAgICAgICAgbmV0ZGV2X2VycihuZGV2LCAid2FpdGluZzoweCUwOHgsIG1heDoweCUwOHhcbiIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICBwcml2LT53YWl0aW5nX2VjaF9za2JfbnVtLCBwcml2LQ0KPiA+eGNhbl9lY2hvX3NrYl9tYXhfdHgpOw0KPiA+ICsgICAgICAgICAgIHJldHVybiBORVRERVZfVFhfQlVTWTsNCj4gPiArICAgfQ0KPg0KPiBUaGlzIGlzIGEgdGhlIHJlZ3VsYXIgZmxvdyBjb250cm9sIGZ1bmN0aW9uIGFuZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYSBUWA0KPiBjb21wbGV0ZSBpbnRlcnJ1cHQgY2FuIHRyaWdnZXIuIFlvdXIgdHgtY29tcGxldGUgaW50ZXJydXB0IGlzIHByb2JhYmx5DQo+IGFsd2F5cyBlbmFibGVkPw0KPg0KDQpZZXMuIFRoZSB0eC1jb21wbGV0ZWQgaW50ZXJydXB0IGFsd2F5cyBlbmFibGVkLg0KDQo+IFNvIGhlcmUgeW91IGNoZWNrIHRoZSBmaWxsIGxldmVsIG9mIHRoZSBGSUZPOg0KPg0KPiAgICAgICBpZiAoKHByaXYtPnR4X2hlYWQgLSBwcml2LT50eF90YWlsKSA9PQ0KPiAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+eGNhbl9lY2hvX3NrYl9tYXhfdHgpDQo+ICAgICAgICAgICAgICAgbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsNCj4NCj4gSWYgaXQncyBmdWxsLCBzdG9wIHRoZSBxdWV1ZS4gVGhlIHlvdSB0cmlnZ2VyIHRoZSB0eCwgdGhlIHR4IGNvbXBsZXRlIGludGVycnVwdA0KPiBnZXRzIGNhbGxlZCBhbmQgdGhlIHF1ZXVlIHdpbGwgYmUgcmVzdGFydGVkLg0KPg0KDQpPaw0KPiA+ICsNCj4gPiArICAgcmV0dXJuIE5FVERFVl9UWF9PSzsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fcnggLSAgSXMgY2FsbGVkIGZyb20gQ0FOIGlzciB0byBjb21wbGV0ZSB0aGUgcmVjZWl2ZWQNCj4gPiArICogICAgICAgICBmcmFtZSAgcHJvY2Vzc2luZw0KPiA+ICsgKiBAbmRldjogIFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBmdW5jdGlvbiBpcyBpbnZva2VkIGZyb20gdGhlIENBTiBpc3IocG9sbCkgdG8gcHJvY2VzcyB0aGUgUngNCj4gPiArZnJhbWVzLiBJdA0KPiA+ICsgKiBkb2VzIG1pbmltYWwgcHJvY2Vzc2luZyBhbmQgaW52b2tlcyAibmV0aWZfcmVjZWl2ZV9za2IiIHRvDQo+ID4gK2NvbXBsZXRlIGZ1cnRoZXINCj4gPiArICogcHJvY2Vzc2luZy4NCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIG5lZ2F0aXZlIGVycm9yIHZhbHVlIG9uIGVycm9yICAqLyBzdGF0aWMNCj4gPiAraW50IHhjYW5fcngoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpIHsNCj4gPiArICAgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOw0KPiA+ICsgICBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmbmRldi0+c3RhdHM7DQo+ID4gKyAgIHN0cnVjdCBjYW5fZnJhbWUgKmNmOw0KPiA+ICsgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiOw0KPiA+ICsgICB1MzIgaWRfeGNhbiwgZGxjLCBkYXRhWzJdID0gezAsIDB9LCBydHIgPSAwOw0KPiA+ICsNCj4gPiArICAgc2tiID0gYWxsb2NfY2FuX3NrYihuZGV2LCAmY2YpOw0KPiA+ICsgICBpZiAoIXNrYikNCj4gPiArICAgICAgICAgICByZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKyAgIC8qIFJlYWQgYSBmcmFtZSBmcm9tIFhpbGlueCB6eW5xIENBTlBTICovDQo+ID4gKyAgIGlkX3hjYW4gPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1JYRklGT19JRF9PRkZTRVQpOw0KPiA+ICsgICBkbGMgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1JYRklGT19ETENfT0ZGU0VUKSAmDQo+ID4gK1hDQU5fRExDUl9ETENfTUFTSzsNCj4NCj4gQmV0dGVyIGRvIHRoZSBzaGlmdCB0byBkbGMuDQo+DQpPaw0KDQo+ID4gKw0KPiA+ICsgICAvKiBDaGFuZ2UgWGlsaW54IENBTiBkYXRhIGxlbmd0aCBmb3JtYXQgdG8gc29ja2V0Q0FOIGRhdGEgZm9ybWF0DQo+ICovDQo+ID4gKyAgIGNmLT5jYW5fZGxjID0gZ2V0X2Nhbl9kbGMoKGRsYyAmIFhDQU5fRExDUl9ETENfTUFTSykgPj4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9ETENSX0RMQ19TSElGVCk7DQo+DQo+IFRoZW4gaXQncyBqdXN0OiBnZXRfY2FuX2RsYyhkbGMpOw0KDQoNCk9rDQo+DQo+ID4gKw0KPiA+ICsgICAvKiBDaGFuZ2UgWGlsaW54IENBTiBJRCBmb3JtYXQgdG8gc29ja2V0Q0FOIElEIGZvcm1hdCAqLw0KPiA+ICsgICBpZiAoaWRfeGNhbiAmIFhDQU5fSURSX0lERV9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgLyogVGhlIHJlY2VpdmVkIGZyYW1lIGlzIGFuIEV4dGVuZGVkIGZvcm1hdCBmcmFtZSAqLw0KPiA+ICsgICAgICAgICAgIGNmLT5jYW5faWQgPSAoaWRfeGNhbiAmIFhDQU5fSURSX0lEMV9NQVNLKSA+PiAzOw0KPiA+ICsgICAgICAgICAgIGNmLT5jYW5faWQgfD0gKGlkX3hjYW4gJiBYQ0FOX0lEUl9JRDJfTUFTSykgPj4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9JRFJfSUQyX1NISUZUOw0KPiA+ICsgICAgICAgICAgIGNmLT5jYW5faWQgfD0gQ0FOX0VGRl9GTEFHOw0KPiA+ICsgICAgICAgICAgIGlmIChpZF94Y2FuICYgWENBTl9JRFJfUlRSX01BU0spIHsNCj4gPiArICAgICAgICAgICAgICAgICAgIGNmLT5jYW5faWQgfD0gQ0FOX1JUUl9GTEFHOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgcnRyID0gMTsNCj4gPiArICAgICAgICAgICB9DQo+ID4gKyAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgLyogVGhlIHJlY2VpdmVkIGZyYW1lIGlzIGEgc3RhbmRhcmQgZm9ybWF0IGZyYW1lICovDQo+ID4gKyAgICAgICAgICAgY2YtPmNhbl9pZCA9IChpZF94Y2FuICYgWENBTl9JRFJfSUQxX01BU0spID4+DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQU5fSURSX0lEMV9TSElGVDsNCj4gPiArICAgICAgICAgICBpZiAoaWRfeGNhbiAmIFhDQU5fSURSX1JUUl9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9SVFJfRkxBRzsNCj4gPiArICAgICAgICAgICAgICAgICAgIHJ0ciA9IDE7DQo+ID4gKyAgICAgICAgICAgfQ0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICBpZiAoIXJ0cikgew0KPiA+ICsgICAgICAgICAgIGRhdGFbMF0gPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX1JYRklGT19EVzFfT0ZGU0VUKTsNCj4gPiArICAgICAgICAgICBkYXRhWzFdID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9SWEZJRk9fRFcyX09GRlNFVCk7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgIC8qIENoYW5nZSBYaWxpbnggQ0FOIGRhdGEgZm9ybWF0IHRvIHNvY2tldENBTiBkYXRhIGZvcm1hdA0KPiAqLw0KPiA+ICsgICAgICAgICAgICooX19iZTMyICopKGNmLT5kYXRhKSA9IGNwdV90b19iZTMyKGRhdGFbMF0pOw0KPiA+ICsgICAgICAgICAgIGlmIChjZi0+Y2FuX2RsYyA+IDQpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAqKF9fYmUzMiAqKShjZi0+ZGF0YSArIDQpID0gY3B1X3RvX2JlMzIoZGF0YVsxXSk7DQo+ID4gKyAgIH0NCj4gPiArICAgY2FuX2xlZF9ldmVudChuZGV2LCBDQU5fTEVEX0VWRU5UX1JYKTsNCj4gPiArDQo+ID4gKyAgIG5ldGlmX3JlY2VpdmVfc2tiKHNrYik7DQo+ID4gKw0KPiA+ICsgICBzdGF0cy0+cnhfYnl0ZXMgKz0gY2YtPmNhbl9kbGM7DQo+ID4gKyAgIHN0YXRzLT5yeF9wYWNrZXRzKys7DQo+ID4gKyAgIHJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9lcnJfaW50ZXJydXB0IC0gZXJyb3IgZnJhbWUgSXNyDQo+ID4gKyAqIEBuZGV2OiAgbmV0X2RldmljZSBwb2ludGVyDQo+ID4gKyAqIEBpc3I6ICAgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciB2YWx1ZQ0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIGlzIHRoZSBDQU4gZXJyb3IgaW50ZXJydXB0IGFuZCBpdCB3aWxsDQo+ID4gKyAqIGNoZWNrIHRoZSB0aGUgdHlwZSBvZiBlcnJvciBhbmQgZm9yd2FyZCB0aGUgZXJyb3INCj4gPiArICogZnJhbWUgdG8gdXBwZXIgbGF5ZXJzLg0KPiA+ICsgKi8NCj4gPiArc3RhdGljIHZvaWQgeGNhbl9lcnJfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgaXNyKSB7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArICAgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJm5kZXYtPnN0YXRzOw0KPiA+ICsgICBzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsNCj4gPiArICAgc3RydWN0IHNrX2J1ZmYgKnNrYjsNCj4gPiArICAgdTMyIGVycl9zdGF0dXMsIHN0YXR1czsNCj4gPiArDQo+ID4gKyAgIHNrYiA9IGFsbG9jX2Nhbl9lcnJfc2tiKG5kZXYsICZjZik7DQo+ID4gKyAgIGlmICghc2tiKSB7DQo+ID4gKyAgICAgICAgICAgbmV0ZGV2X2VycihuZGV2LCAiYWxsb2NfY2FuX2Vycl9za2IoKSBmYWlsZWQhXG4iKTsNCj4gPiArICAgICAgICAgICByZXR1cm47DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIGVycl9zdGF0dXMgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0VTUl9PRkZTRVQpOw0KPiA+ICsgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9FU1JfT0ZGU0VULCBlcnJfc3RhdHVzKTsNCj4gPiArICAgc3RhdHVzID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9TUl9PRkZTRVQpOw0KPiA+ICsNCj4gPiArICAgaWYgKGlzciAmIFhDQU5fSVhSX0JTT0ZGX01BU0spIHsNCj4gPiArICAgICAgICAgICBwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsNCj4gPiArICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOw0KPiA+ICsgICAgICAgICAgIHByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX29mZisrOw0KPiA+ICsgICAgICAgICAgIC8qIExlYXZlIGRldmljZSBpbiBDb25maWcgTW9kZSBpbiBidXMtb2ZmIHN0YXRlICovDQo+ID4gKyAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwNCj4gWENBTl9TUlJfUkVTRVRfTUFTSyk7DQo+ID4gKyAgICAgICAgICAgY2FuX2J1c19vZmYobmRldik7DQo+ID4gKyAgIH0gZWxzZSBpZiAoKHN0YXR1cyAmIFhDQU5fU1JfRVNUQVRfTUFTSykgPT0NCj4gWENBTl9TUl9FU1RBVF9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0NSVEw7DQo+ID4gKyAgICAgICAgICAgcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX1BBU1NJVkU7DQo+ID4gKyAgICAgICAgICAgcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl9wYXNzaXZlKys7DQo+ID4gKyAgICAgICAgICAgY2YtPmRhdGFbMV0gfD0gQ0FOX0VSUl9DUlRMX1JYX1BBU1NJVkUgfA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9FUlJfQ1JUTF9UWF9QQVNTSVZFOw0KPiA+ICsgICB9IGVsc2UgaWYgKHN0YXR1cyAmIFhDQU5fU1JfRVJSV1JOX01BU0spIHsNCj4gPiArICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsNCj4gPiArICAgICAgICAgICBwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfV0FSTklORzsNCj4gPiArICAgICAgICAgICBwcml2LT5jYW4uY2FuX3N0YXRzLmVycm9yX3dhcm5pbmcrKzsNCj4gPiArICAgICAgICAgICBjZi0+ZGF0YVsxXSB8PSBDQU5fRVJSX0NSVExfUlhfV0FSTklORyB8DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0VSUl9DUlRMX1RYX1dBUk5JTkc7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciBBcmJpdHJhdGlvbiBsb3N0IGludGVycnVwdCAqLw0KPiA+ICsgICBpZiAoaXNyICYgWENBTl9JWFJfQVJCTFNUX01BU0spIHsNCj4gPiArICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfTE9TVEFSQjsNCj4gPiArICAgICAgICAgICBjZi0+ZGF0YVswXSA9IENBTl9FUlJfTE9TVEFSQl9VTlNQRUM7DQo+ID4gKyAgICAgICAgICAgcHJpdi0+Y2FuLmNhbl9zdGF0cy5hcmJpdHJhdGlvbl9sb3N0Kys7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciBSWCBGSUZPIE92ZXJmbG93IGludGVycnVwdCAqLw0KPiA+ICsgICBpZiAoaXNyICYgWENBTl9JWFJfUlhPRkxXX01BU0spIHsNCj4gPiArICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsNCj4gPiArICAgICAgICAgICBjZi0+ZGF0YVsxXSB8PSBDQU5fRVJSX0NSVExfUlhfT1ZFUkZMT1c7DQo+ID4gKyAgICAgICAgICAgc3RhdHMtPnJ4X292ZXJfZXJyb3JzKys7DQo+ID4gKyAgICAgICAgICAgc3RhdHMtPnJ4X2Vycm9ycysrOw0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX1NSUl9PRkZTRVQsDQo+IFhDQU5fU1JSX1JFU0VUX01BU0spOw0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICAvKiBDaGVjayBmb3IgZXJyb3IgaW50ZXJydXB0ICovDQo+ID4gKyAgIGlmIChpc3IgJiBYQ0FOX0lYUl9FUlJPUl9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1QgfCBDQU5fRVJSX0JVU0VSUk9SOw0KPiA+ICsgICAgICAgICAgIGNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9VTlNQRUM7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgIC8qIENoZWNrIGZvciBBY2sgZXJyb3IgaW50ZXJydXB0ICovDQo+ID4gKyAgICAgICAgICAgaWYgKGVycl9zdGF0dXMgJiBYQ0FOX0VTUl9BQ0tFUl9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfQUNLOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgY2YtPmRhdGFbM10gfD0gQ0FOX0VSUl9QUk9UX0xPQ19BQ0s7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBzdGF0cy0+dHhfZXJyb3JzKys7DQo+ID4gKyAgICAgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgICAgICAvKiBDaGVjayBmb3IgQml0IGVycm9yIGludGVycnVwdCAqLw0KPiA+ICsgICAgICAgICAgIGlmIChlcnJfc3RhdHVzICYgWENBTl9FU1JfQkVSUl9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsNCj4gPiArICAgICAgICAgICAgICAgICAgIGNmLT5kYXRhWzJdID0gQ0FOX0VSUl9QUk9UX0JJVDsNCj4gPiArICAgICAgICAgICAgICAgICAgIHN0YXRzLT50eF9lcnJvcnMrKzsNCj4gPiArICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgIC8qIENoZWNrIGZvciBTdHVmZiBlcnJvciBpbnRlcnJ1cHQgKi8NCj4gPiArICAgICAgICAgICBpZiAoZXJyX3N0YXR1cyAmIFhDQU5fRVNSX1NURVJfTUFTSykgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1Q7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+ZGF0YVsyXSA9IENBTl9FUlJfUFJPVF9TVFVGRjsNCj4gPiArICAgICAgICAgICAgICAgICAgIHN0YXRzLT5yeF9lcnJvcnMrKzsNCj4gPiArICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgIC8qIENoZWNrIGZvciBGb3JtIGVycm9yIGludGVycnVwdCAqLw0KPiA+ICsgICAgICAgICAgIGlmIChlcnJfc3RhdHVzICYgWENBTl9FU1JfRk1FUl9NQVNLKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsNCj4gPiArICAgICAgICAgICAgICAgICAgIGNmLT5kYXRhWzJdID0gQ0FOX0VSUl9QUk9UX0ZPUk07DQo+ID4gKyAgICAgICAgICAgICAgICAgICBzdGF0cy0+cnhfZXJyb3JzKys7DQo+ID4gKyAgICAgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgICAgICAvKiBDaGVjayBmb3IgQ1JDIGVycm9yIGludGVycnVwdCAqLw0KPiA+ICsgICAgICAgICAgIGlmIChlcnJfc3RhdHVzICYgWENBTl9FU1JfQ1JDRVJfTUFTSykgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgY2YtPmNhbl9pZCB8PSBDQU5fRVJSX1BST1Q7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBjZi0+ZGF0YVszXSA9IENBTl9FUlJfUFJPVF9MT0NfQ1JDX1NFUSB8DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOX0VSUl9QUk9UX0xPQ19DUkNfREVMOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgc3RhdHMtPnJ4X2Vycm9ycysrOw0KPiA+ICsgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgICAgIHByaXYtPmNhbi5jYW5fc3RhdHMuYnVzX2Vycm9yKys7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIG5ldGlmX3J4KHNrYik7DQo+ID4gKyAgIHN0YXRzLT5yeF9wYWNrZXRzKys7DQo+ID4gKyAgIHN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsNCj4gPiArDQo+ID4gKyAgIG5ldGRldl9kYmcobmRldiwgIiVzOiBlcnJvciBzdGF0dXMgcmVnaXN0ZXI6MHgleFxuIiwNCj4gPiArICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0VTUl9PRkZTRVQpKTsNCj4gfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fc3RhdGVfaW50ZXJydXB0IC0gSXQgd2lsbCBjaGVjayB0aGUgc3RhdGUgb2YgdGhlIENBTiBkZXZpY2UNCj4gPiArICogQG5kZXY6ICBuZXRfZGV2aWNlIHBvaW50ZXINCj4gPiArICogQGlzcjogICBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIHZhbHVlDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgd2lsbCBjaGVja3MgdGhlIHN0YXRlIG9mIHRoZSBDQU4gZGV2aWNlDQo+ID4gKyAqIGFuZCBwdXRzIHRoZSBkZXZpY2UgaW50byBhcHByb3ByaWF0ZSBzdGF0ZS4NCj4gPiArICovDQo+ID4gK3N0YXRpYyB2b2lkIHhjYW5fc3RhdGVfaW50ZXJydXB0KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgaXNyKSB7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciBTbGVlcCBpbnRlcnJ1cHQgaWYgc2V0IHB1dCBDQU4gZGV2aWNlIGluIHNsZWVwIHN0YXRlICovDQo+ID4gKyAgIGlmIChpc3IgJiBYQ0FOX0lYUl9TTFBfTUFTSykNCj4gPiArICAgICAgICAgICBwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU0xFRVBJTkc7DQo+ID4gKw0KPiA+ICsgICAvKiBDaGVjayBmb3IgV2FrZSB1cCBpbnRlcnJ1cHQgaWYgc2V0IHB1dCBDQU4gZGV2aWNlIGluIEFjdGl2ZSBzdGF0ZQ0KPiAqLw0KPiA+ICsgICBpZiAoaXNyICYgWENBTl9JWFJfV0tVUF9NQVNLKQ0KPiA+ICsgICAgICAgICAgIHByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9BQ1RJVkU7IH0NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX3J4X3BvbGwgLSBQb2xsIHJvdXRpbmUgZm9yIHJ4IHBhY2tldHMgKE5BUEkpDQo+ID4gKyAqIEBuYXBpOiAgbmFwaSBzdHJ1Y3R1cmUgcG9pbnRlcg0KPiA+ICsgKiBAcXVvdGE6IE1heCBudW1iZXIgb2YgcnggcGFja2V0cyB0byBiZSBwcm9jZXNzZWQuDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgaXMgdGhlIHBvbGwgcm91dGluZSBmb3IgcnggcGFydC4NCj4gPiArICogSXQgd2lsbCBwcm9jZXNzIHRoZSBwYWNrZXRzIG1heGltdXggcXVvdGEgdmFsdWUuDQo+ID4gKyAqDQo+ID4gKyAqIFJldHVybjogbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgICovIHN0YXRpYyBpbnQNCj4gPiAreGNhbl9yeF9wb2xsKHN0cnVjdCBuYXBpX3N0cnVjdCAqbmFwaSwgaW50IHF1b3RhKSB7DQo+ID4gKyAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gbmFwaS0+ZGV2Ow0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKyAgIHUzMiBpc3IsIGllcjsNCj4gPiArICAgaW50IHdvcmtfZG9uZSA9IDA7DQo+ID4gKw0KPiA+ICsgICBpc3IgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0lTUl9PRkZTRVQpOw0KPiA+ICsgICB3aGlsZSAoKGlzciAmIFhDQU5fSVhSX1JYTkVNUF9NQVNLKSAmJiAod29ya19kb25lIDwgcXVvdGEpKSB7DQo+ID4gKyAgICAgICAgICAgaWYgKGlzciAmIFhDQU5fSVhSX1JYT0tfTUFTSykgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUNSX09GRlNFVCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9JWFJfUlhPS19NQVNLKTsNCj4gPiArICAgICAgICAgICAgICAgICAgIGlmICh4Y2FuX3J4KG5kZXYpIDwgMCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtfZG9uZTsNCj4gPiArICAgICAgICAgICAgICAgICAgIHdvcmtfZG9uZSsrOw0KPiA+ICsgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JQ1JfT0ZGU0VULA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICBYQ0FOX0lYUl9SWE5FTVBfTUFTSyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBicmVhazsNCj4gPiArICAgICAgICAgICB9DQo+DQo+IFdoYXQgZG9lcyB0aGUgWENBTl9JWFJfUlhPS19NQVNLIG1lYW4gaWYgaXQncyBzZW5kIGFuZCB1bmRzZXQ/DQoNClhDQU5fSVhSX1JYT0tfTUFTSyBNZWFucyBpdCBpcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgb25lIHBhY2tldA0KDQo+DQo+ID4gKyAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUNSX09GRlNFVCwNCj4gWENBTl9JWFJfUlhORU1QX01BU0spOw0KPiA+ICsgICAgICAgICAgIGlzciA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fSVNSX09GRlNFVCk7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIGlmICh3b3JrX2RvbmUgPCBxdW90YSkgew0KPiA+ICsgICAgICAgICAgIG5hcGlfY29tcGxldGUobmFwaSk7DQo+ID4gKyAgICAgICAgICAgaWVyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VUKTsNCj4gPiArICAgICAgICAgICBpZXIgfD0gKFhDQU5fSVhSX1JYT0tfTUFTSyB8DQo+IFhDQU5fSVhSX1JYTkVNUF9NQVNLKTsNCj4gPiArICAgICAgICAgICBwcml2LT53cml0ZV9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VULCBpZXIpOw0KPg0KPiBJcyB0aGlzIGEgcmVhZC1tb2RpZnktd3JpdGUgcmVnaXN0ZXI/IEkgbWVhbiB3aWxsIGFuIGludGVycnVwdCBnZXQgZGlzYWJsZWQsIGlmDQo+IHlvdSB3cml0ZSBhIDAtYml0IGluIHRoZSBJRVIgcmVnaXN0ZXI/IFdoYXQgZG9lcyB0aGUgSUNSIHJlZ2lzdGVyPw0KDQpJU1ItIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKFJlYWQgb25seSByZWdpc3RlcikNCklFUi0gSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlcihSL3cgcmVnaXN0ZXIpDQpJQ1ItIEludGVycnVwdCBDbGVhciBSZWdpc3Rlci4od3JpdGUgb25seSByZWdpc3RlcikNCg0KDQpUaGUgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAoSVNSKSBjb250YWlucyBiaXRzIHRoYXQgYXJlIHNldCB3aGVuIGEgcGFydGljdWxhciBpbnRlcnJ1cHQgY29uZGl0aW9uIG9jY3Vycy4gSWYNCnRoZSBjb3JyZXNwb25kaW5nIG1hc2sgYml0IGluIHRoZSBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIGlzIHNldCwgYW4gaW50ZXJydXB0IGlzIGdlbmVyYXRlZC4NCkludGVycnVwdCBiaXRzIGluIHRoZSBJU1IgY2FuIGJlIGNsZWFyZWQgYnkgd3JpdGluZyB0byB0aGUgSW50ZXJydXB0IENsZWFyIFJlZ2lzdGVyDQoNCg0KPg0KPiA+ICsgICB9DQo+ID4gKyAgIHJldHVybiB3b3JrX2RvbmU7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX3R4X2ludGVycnVwdCAtIFR4IERvbmUgSXNyDQo+ID4gKyAqIEBuZGV2OiAgbmV0X2RldmljZSBwb2ludGVyDQo+ID4gKyAqLw0KPiA+ICtzdGF0aWMgdm9pZCB4Y2FuX3R4X2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikgew0KPiA+ICsgICB1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKyAgIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZuZGV2LT5zdGF0czsNCj4gPiArICAgdTMyIHByb2Nlc3NlZCA9IDAsIHR4cGFja2V0czsNCj4gPiArDQo+ID4gKyAgIHN0YXRzLT50eF9wYWNrZXRzKys7DQo+ID4gKyAgIG5ldGRldl9kYmcobmRldiwgIiVzOiB3YWl0aW5nIHRvdGFsOiVkLGN1cnJlbnQ6JWRcbiIsIF9fZnVuY19fLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgcHJpdi0+d2FpdGluZ19lY2hfc2tiX251bSwgcHJpdi0NCj4gPndhaXRpbmdfZWNoX3NrYl9pbmRleCk7DQo+ID4gKw0KPiA+ICsgICB0eHBhY2tldHMgPSBwcml2LT53YWl0aW5nX2VjaF9za2JfbnVtOw0KPiA+ICsNCj4gPiArICAgaWYgKHR4cGFja2V0cykgew0KPiA+ICsgICAgICAgICAgIGNhbl9nZXRfZWNob19za2IobmRldiwgcHJpdi0+d2FpdGluZ19lY2hfc2tiX2luZGV4KTsNCj4gPiArICAgICAgICAgICBwcml2LT53YWl0aW5nX2VjaF9za2JfaW5kZXggPQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgKHByaXYtPndhaXRpbmdfZWNoX3NrYl9pbmRleCArIDEpICUNCj4gPiArICAgICAgICAgICAgICAgICAgIHByaXYtPnhjYW5fZWNob19za2JfbWF4X3R4Ow0KPiA+ICsgICAgICAgICAgIHByb2Nlc3NlZCsrOw0KPiA+ICsgICAgICAgICAgIHR4cGFja2V0cy0tOw0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICBzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+ZWNoX3NrYl9sb2NrLCBmbGFncyk7DQo+ID4gKyAgIHByaXYtPndhaXRpbmdfZWNoX3NrYl9udW0gLT0gcHJvY2Vzc2VkOw0KPiA+ICsgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5lY2hfc2tiX2xvY2ssIGZsYWdzKTsNCj4NCj4gVGhpcyBhbGwgc2ltcGx5ZmllcyB0byBhOg0KPiAgICAgICBjYW5fZ2V0X2VjaG9fc2tiKG5kZXYsIHByaXYtPnR4X3RhaWwgJQ0KPiAgICAgICAgICAgICAgIHByaXYtPnhjYW5fZWNob19za2JfbWF4X3R4KTsNCj4gICAgICAgcHJpdi0+dHhfdGFpbCsrOw0KPg0KDQpPaw0KDQo+IEkgdGhpbmsgeW91IHNob3VsZCBhZGQgc29tZSBraW5kIG9mIGxvb3AgaGVyZSwgaXQgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSB0eC0NCj4gY29tcGxldGUgcGVyIElSUS4NCj4NCg0KT2sNCg0KPiA+ICsNCj4gPiArICAgbmV0ZGV2X2RiZyhuZGV2LCAiJXM6IHdhaXRpbmcgdG90YWw6JWQsY3VycmVudDolZFxuIiwgX19mdW5jX18sDQo+ID4gKyAgICAgICAgICAgICAgICAgICBwcml2LT53YWl0aW5nX2VjaF9za2JfbnVtLCBwcml2LQ0KPiA+d2FpdGluZ19lY2hfc2tiX2luZGV4KTsNCj4gPiArDQo+ID4gKyAgIG5ldGlmX3dha2VfcXVldWUobmRldik7DQo+ID4gKw0KPiA+ICsgICBjYW5fbGVkX2V2ZW50KG5kZXYsIENBTl9MRURfRVZFTlRfVFgpOyB9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9pbnRlcnJ1cHQgLSBDQU4gSXNyDQo+ID4gKyAqIEBpcnE6ICAgaXJxIG51bWJlcg0KPiA+ICsgKiBAZGV2X2lkOiAgICAgICAgZGV2aWNlIGlkIHBvbml0ZXINCj4gPiArICoNCj4gPiArICogVGhpcyBpcyB0aGUgeGlsaW54IENBTiBJc3IuIEl0IGNoZWNrcyBmb3IgdGhlIHR5cGUgb2YgaW50ZXJydXB0DQo+ID4gKyAqIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nIElTUi4NCj4gPiArICoNCj4gPiArICogUmV0dXJuOg0KPiA+ICsgKiBJUlFfTk9ORSAtIElmIENBTiBkZXZpY2UgaXMgaW4gc2xlZXAgbW9kZSwgSVJRX0hBTkRMRUQgb3RoZXJ3aXNlDQo+ID4gKyovIHN0YXRpYyBpcnFyZXR1cm5fdCB4Y2FuX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpIHsNCj4gPiArICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArICAgdTMyIGlzciwgaWVyOw0KPiA+ICsNCj4gPiArICAgLyogR2V0IHRoZSBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gWGlsaW54IENBTiAqLw0KPiA+ICsgICBpc3IgPSBwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0lTUl9PRkZTRVQpOw0KPiA+ICsgICBpZiAoIWlzcikNCj4gPiArICAgICAgICAgICByZXR1cm4gSVJRX05PTkU7DQo+ID4gKw0KPiA+ICsgICBuZXRkZXZfZGJnKG5kZXYsICIlczogaXNyOiN4JTA4eCwgZXJyOiN4JTA4eFxuIiwgX19mdW5jX18sDQo+ID4gKyAgICAgICAgICAgICAgICAgICBpc3IsIHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fRVNSX09GRlNFVCkpOw0KPiA+ICsNCj4gPiArICAgLyogQ2hlY2sgZm9yIHRoZSB0eXBlIG9mIGludGVycnVwdCBhbmQgUHJvY2Vzc2luZyBpdCAqLw0KPiA+ICsgICBpZiAoaXNyICYgKFhDQU5fSVhSX1NMUF9NQVNLIHwgWENBTl9JWFJfV0tVUF9NQVNLKSkgew0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lDUl9PRkZTRVQsDQo+IChYQ0FOX0lYUl9TTFBfTUFTSyB8DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFhDQU5fSVhSX1dLVVBfTUFTSykpOw0KPiA+ICsgICAgICAgICAgIHhjYW5fc3RhdGVfaW50ZXJydXB0KG5kZXYsIGlzcik7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciBUeCBpbnRlcnJ1cHQgYW5kIFByb2Nlc3NpbmcgaXQgKi8NCj4gPiArICAgaWYgKGlzciAmIFhDQU5fSVhSX1RYT0tfTUFTSykgew0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lDUl9PRkZTRVQsDQo+IFhDQU5fSVhSX1RYT0tfTUFTSyk7DQo+ID4gKyAgICAgICAgICAgeGNhbl90eF9pbnRlcnJ1cHQobmRldik7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciB0aGUgdHlwZSBvZiBlcnJvciBpbnRlcnJ1cHQgYW5kIFByb2Nlc3NpbmcgaXQgKi8NCj4gPiArICAgaWYgKGlzciAmIChYQ0FOX0lYUl9FUlJPUl9NQVNLIHwgWENBTl9JWFJfUlhPRkxXX01BU0sgfA0KPiA+ICsgICAgICAgICAgICAgICAgICAgWENBTl9JWFJfQlNPRkZfTUFTSyB8DQo+IFhDQU5fSVhSX0FSQkxTVF9NQVNLKSkgew0KPiA+ICsgICAgICAgICAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX0lDUl9PRkZTRVQsDQo+IChYQ0FOX0lYUl9FUlJPUl9NQVNLIHwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9JWFJfUlhPRkxXX01BU0sgfA0KPiBYQ0FOX0lYUl9CU09GRl9NQVNLIHwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgWENBTl9JWFJfQVJCTFNUX01BU0spKTsNCj4gPiArICAgICAgICAgICB4Y2FuX2Vycl9pbnRlcnJ1cHQobmRldiwgaXNyKTsNCj4gPiArICAgfQ0KPiA+ICsNCj4gPiArICAgLyogQ2hlY2sgZm9yIHRoZSB0eXBlIG9mIHJlY2VpdmUgaW50ZXJydXB0IGFuZCBQcm9jZXNzaW5nIGl0ICovDQo+ID4gKyAgIGlmIChpc3IgJiAoWENBTl9JWFJfUlhORU1QX01BU0sgfCBYQ0FOX0lYUl9SWE9LX01BU0spKSB7DQo+ID4gKyAgICAgICAgICAgaWVyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9JRVJfT0ZGU0VUKTsNCj4gPiArICAgICAgICAgICBpZXIgJj0gfihYQ0FOX0lYUl9SWE5FTVBfTUFTSyB8DQo+IFhDQU5fSVhSX1JYT0tfTUFTSyk7DQo+ID4gKyAgICAgICAgICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUVSX09GRlNFVCwgaWVyKTsNCj4gPiArICAgICAgICAgICBuYXBpX3NjaGVkdWxlKCZwcml2LT5uYXBpKTsNCj4gPiArICAgfQ0KPiA+ICsgICByZXR1cm4gSVJRX0hBTkRMRUQ7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX3N0b3AgLSBEcml2ZXIgc3RvcCByb3V0aW5lDQo+ID4gKyAqIEBuZGV2OiAgUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQ0KPiA+ICsgKg0KPiA+ICsgKiBUaGlzIGlzIHRoZSBkcml2ZXJzIHN0b3Agcm91dGluZS4gSXQgd2lsbCBkaXNhYmxlIHRoZQ0KPiA+ICsgKiBpbnRlcnJ1cHRzIGFuZCBwdXQgdGhlIGRldmljZSBpbnRvIGNvbmZpZ3VyYXRpb24gbW9kZS4NCj4gPiArICovDQo+ID4gK3N0YXRpYyB2b2lkIHhjYW5fc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikgew0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKyAgIHUzMiBpZXI7DQo+ID4gKw0KPiA+ICsgICAvKiBEaXNhYmxlIGludGVycnVwdHMgYW5kIGxlYXZlIHRoZSBjYW4gaW4gY29uZmlndXJhdGlvbiBtb2RlICovDQo+ID4gKyAgIGllciA9IHByaXYtPnJlYWRfcmVnKHByaXYsIFhDQU5fSUVSX09GRlNFVCk7DQo+ID4gKyAgIGllciAmPSB+WENBTl9JTlRSX0FMTDsNCj4gPiArICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fSUVSX09GRlNFVCwgaWVyKTsNCj4gPiArICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fU1JSX09GRlNFVCwgWENBTl9TUlJfUkVTRVRfTUFTSyk7DQo+ID4gKyAgIHByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9TVE9QUEVEOyB9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9vcGVuIC0gRHJpdmVyIG9wZW4gcm91dGluZQ0KPiA+ICsgKiBAbmRldjogIFBvaW50ZXIgdG8gbmV0X2RldmljZSBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBpcyB0aGUgZHJpdmVyIG9wZW4gcm91dGluZS4NCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IgICovIHN0YXRpYyBpbnQNCj4gPiAreGNhbl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KSB7DQo+ID4gKyAgIHN0cnVjdCB4Y2FuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsNCj4gPiArICAgaW50IHJldDsNCj4gPiArDQo+ID4gKyAgIHJldCA9IHJlcXVlc3RfaXJxKG5kZXYtPmlycSwgeGNhbl9pbnRlcnJ1cHQsIHByaXYtPmlycV9mbGFncywNCj4gPiArICAgICAgICAgICAgICAgICAgIG5kZXYtPm5hbWUsICh2b2lkICopbmRldik7DQo+ID4gKyAgIGlmIChyZXQgPCAwKSB7DQo+ID4gKyAgICAgICAgICAgbmV0ZGV2X2VycihuZGV2LCAiSXJxIGFsbG9jYXRpb24gZm9yIENBTiBmYWlsZWRcbiIpOw0KPiA+ICsgICAgICAgICAgIHJldHVybiByZXQ7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIFNldCBjaGlwIGludG8gcmVzZXQgbW9kZSAqLw0KPiA+ICsgICByZXQgPSBzZXRfcmVzZXRfbW9kZShuZGV2KTsNCj4gPiArICAgaWYgKHJldCA8IDApDQo+ID4gKyAgICAgICAgICAgbmV0ZGV2X2VycihuZGV2LCAibW9kZSByZXNldHRpbmcgZmFpbGVkIGZhaWxlZCFcbiIpOw0KPg0KPiBJcyB0aGlzIGNyaXRpY2FsPw0KDQpUaGlzIGNvbmRpdGlvbiB1c3VhbGx5IHdvbid0IGZhaWwuDQpCdXQgaWYgdGhlIGNvbnRyb2xsZXIgaGFzIGEgcHJvYmxlbXMgYXQgdGhlIGgvdyBsZXZlbCBpbiB0aGF0IGNhc2UgcHV0dGVkIHRoaXMgZXJyIHByaW50Lg0KSWYgeW91IHdhbnQgbWUgdG8gY2hhbmdlIGl0IGFzIGEgd2FybmluZyB3aWxsIGRvDQoNCj4NCj4gPiArDQo+ID4gKyAgIC8qIENvbW1vbiBvcGVuICovDQo+ID4gKyAgIHJldCA9IG9wZW5fY2FuZGV2KG5kZXYpOw0KPiA+ICsgICBpZiAocmV0KQ0KPiA+ICsgICAgICAgICAgIHJldHVybiByZXQ7DQo+DQo+IFlvdSBzaG91bGQgZnJlZSB0aGUgaW50ZXJydXB0IGhhbmRsZXIgaWYgdGhpcyBmYWlscy4NCg0KT2sNCj4NCj4gPiArDQo+ID4gKyAgIHJldCA9IHhjYW5fc3RhcnQobmRldik7DQo+ID4gKyAgIGlmIChyZXQgPCAwKQ0KPiA+ICsgICAgICAgICAgIG5ldGRldl9lcnIobmRldiwgInhjYW5fc3RhcnQgZmFpbGVkIVxuIik7DQo+ID4gKw0KPiA+ICsNCj4gPiArICAgY2FuX2xlZF9ldmVudChuZGV2LCBDQU5fTEVEX0VWRU5UX09QRU4pOw0KPiA+ICsgICBuYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7DQo+ID4gKyAgIG5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOw0KPiA+ICsNCj4gPiArICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX2Nsb3NlIC0gRHJpdmVyIGNsb3NlIHJvdXRpbmUNCj4gPiArICogQG5kZXY6ICBQb2ludGVyIHRvIG5ldF9kZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFJldHVybjogMCBhbHdheXMNCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQgeGNhbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikgew0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKw0KPiA+ICsgICBuZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOw0KPiA+ICsgICBuYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOw0KPiA+ICsgICB4Y2FuX3N0b3AobmRldik7DQo+ID4gKyAgIGZyZWVfaXJxKG5kZXYtPmlycSwgbmRldik7DQo+ID4gKyAgIGNsb3NlX2NhbmRldihuZGV2KTsNCj4gPiArDQo+ID4gKyAgIGNhbl9sZWRfZXZlbnQobmRldiwgQ0FOX0xFRF9FVkVOVF9TVE9QKTsNCj4gPiArDQo+ID4gKyAgIHJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9nZXRfYmVycl9jb3VudGVyIC0gZXJyb3IgY291bnRlciByb3V0aW5lDQo+ID4gKyAqIEBuZGV2OiAgUG9pbnRlciB0byBuZXRfZGV2aWNlIHN0cnVjdHVyZQ0KPiA+ICsgKiBAYmVjOiAgIFBvaW50ZXIgdG8gY2FuX2JlcnJfY291bnRlciBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBpcyB0aGUgZHJpdmVyIGVycm9yIGNvdW50ZXIgcm91dGluZS4NCj4gPiArICogUmV0dXJuOiAwIGFsd2F5cw0KPiA+ICsgKi8NCj4gPiArc3RhdGljIGludCB4Y2FuX2dldF9iZXJyX2NvdW50ZXIoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgKmJlYykNCj4gPiArew0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKw0KPiA+ICsgICBiZWMtPnR4ZXJyID0gcHJpdi0+cmVhZF9yZWcocHJpdiwgWENBTl9FQ1JfT0ZGU0VUKSAmDQo+IFhDQU5fRUNSX1RFQ19NQVNLOw0KPiA+ICsgICBiZWMtPnJ4ZXJyID0gKChwcml2LT5yZWFkX3JlZyhwcml2LCBYQ0FOX0VDUl9PRkZTRVQpICYNCj4gPiArICAgICAgICAgICAgICAgICAgIFhDQU5fRUNSX1JFQ19NQVNLKSA+PiBYQ0FOX0VTUl9SRUNfU0hJRlQpOw0KPiA+ICsgICByZXR1cm4gMDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4Y2FuX25ldGRldl9vcHMgPSB7DQo+ID4gKyAgIC5uZG9fb3BlbiAgICAgICA9IHhjYW5fb3BlbiwNCj4gPiArICAgLm5kb19zdG9wICAgICAgID0geGNhbl9jbG9zZSwNCj4gPiArICAgLm5kb19zdGFydF94bWl0ID0geGNhbl9zdGFydF94bWl0LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArI2lmZGVmIENPTkZJR19QTV9TTEVFUA0KPiA+ICsvKioNCj4gPiArICogeGNhbl9zdXNwZW5kIC0gU3VzcGVuZCBtZXRob2QgZm9yIHRoZSBkcml2ZXINCj4gPiArICogQF9kZXY6ICBBZGRyZXNzIG9mIHRoZSBwbGF0Zm9ybV9kZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFB1dCB0aGUgZHJpdmVyIGludG8gbG93IHBvd2VyIG1vZGUuDQo+ID4gKyAqIFJldHVybjogMCBhbHdheXMNCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQgeGNhbl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKl9kZXYpIHsNCj4gPiArICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IGNvbnRhaW5lcl9vZihfZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsNCj4gPiArICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsNCj4gPiArICAgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOw0KPiA+ICsNCj4gPiArICAgaWYgKG5ldGlmX3J1bm5pbmcobmRldikpIHsNCj4gPiArICAgICAgICAgICBuZXRpZl9zdG9wX3F1ZXVlKG5kZXYpOw0KPiA+ICsgICAgICAgICAgIG5ldGlmX2RldmljZV9kZXRhY2gobmRldik7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX01TUl9PRkZTRVQsDQo+IFhDQU5fTVNSX1NMRUVQX01BU0spOw0KPiA+ICsgICBwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfU0xFRVBJTkc7DQo+ID4gKw0KPiA+ICsgICBjbGtfZGlzYWJsZShwcml2LT5hcGVyY2xrKTsNCj4gPiArICAgY2xrX2Rpc2FibGUocHJpdi0+ZGV2Y2xrKTsNCj4gPiArDQo+ID4gKyAgIHJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICsvKioNCj4gPiArICogeGNhbl9yZXN1bWUgLSBSZXN1bWUgZnJvbSBzdXNwZW5kDQo+ID4gKyAqIEBkZXY6ICAgQWRkcmVzcyBvZiB0aGUgcGxhdGZvcm1kZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFJlc3VtZSBvcGVyYXRpb24gYWZ0ZXIgc3VzcGVuZC4NCj4gPiArICogUmV0dXJuOiAwIG9uIHN1Y2Nlc3MgYW5kIGZhaWx1cmUgdmFsdWUgb24gZXJyb3IgICovIHN0YXRpYyBpbnQNCj4gPiAreGNhbl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KSB7DQo+ID4gKyAgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYgPSBjb250YWluZXJfb2YoZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgc3RydWN0IHBsYXRmb3JtX2RldmljZSwgZGV2KTsNCj4gPiArICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsNCj4gPiArICAgc3RydWN0IHhjYW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOw0KPiA+ICsgICBpbnQgcmV0Ow0KPiA+ICsNCj4gPiArICAgcmV0ID0gY2xrX2VuYWJsZShwcml2LT5hcGVyY2xrKTsNCj4gPiArICAgaWYgKHJldCkgew0KPiA+ICsgICAgICAgICAgIGRldl9lcnIoZGV2LCAiQ2Fubm90IGVuYWJsZSBjbG9jay5cbiIpOw0KPiA+ICsgICAgICAgICAgIHJldHVybiByZXQ7DQo+ID4gKyAgIH0NCj4gPiArICAgcmV0ID0gY2xrX2VuYWJsZShwcml2LT5kZXZjbGspOw0KPiA+ICsgICBpZiAocmV0KSB7DQo+ID4gKyAgICAgICAgICAgZGV2X2VycihkZXYsICJDYW5ub3QgZW5hYmxlIGNsb2NrLlxuIik7DQo+ID4gKyAgICAgICAgICAgcmV0dXJuIHJldDsNCj4gPiArICAgfQ0KPiA+ICsNCj4gPiArICAgcHJpdi0+d3JpdGVfcmVnKHByaXYsIFhDQU5fTVNSX09GRlNFVCwgMCk7DQo+ID4gKyAgIHByaXYtPndyaXRlX3JlZyhwcml2LCBYQ0FOX1NSUl9PRkZTRVQsIFhDQU5fU1JSX0NFTl9NQVNLKTsNCj4gPiArICAgcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX0VSUk9SX0FDVElWRTsNCj4gPiArDQo+ID4gKyAgIGlmIChuZXRpZl9ydW5uaW5nKG5kZXYpKSB7DQo+ID4gKyAgICAgICAgICAgbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsNCj4gPiArICAgICAgICAgICBuZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsNCj4gPiArICAgfQ0KPiA+ICsNCj4gPiArICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArI2VuZGlmDQo+ID4gKw0KPiA+ICtzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoeGNhbl9kZXZfcG1fb3BzLCB4Y2FuX3N1c3BlbmQsDQo+IHhjYW5fcmVzdW1lKTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiB4Y2FuX3Byb2JlIC0gUGxhdGZvcm0gcmVnaXN0cmF0aW9uIGNhbGwNCj4gPiArICogQHBkZXY6ICBIYW5kbGUgdG8gdGhlIHBsYXRmb3JtIGRldmljZSBzdHJ1Y3R1cmUNCj4gPiArICoNCj4gPiArICogVGhpcyBmdW5jdGlvbiBkb2VzIGFsbCB0aGUgbWVtb3J5IGFsbG9jYXRpb24gYW5kIHJlZ2lzdHJhdGlvbiBmb3INCj4gPiArdGhlIENBTg0KPiA+ICsgKiBkZXZpY2UuDQo+ID4gKyAqDQo+ID4gKyAqIFJldHVybjogMCBvbiBzdWNjZXNzIGFuZCBmYWlsdXJlIHZhbHVlIG9uIGVycm9yICAqLyBzdGF0aWMgaW50DQo+ID4gK3hjYW5fcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgew0KPiA+ICsgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlczsgLyogSU8gbWVtIHJlc291cmNlcyAqLw0KPiA+ICsgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsNCj4gPiArICAgc3RydWN0IHhjYW5fcHJpdiAqcHJpdjsNCj4gPiArICAgaW50IHJldCwgZmlmb2RlcDsNCj4gPiArDQo+ID4gKyAgIC8qIENyZWF0ZSBhIENBTiBkZXZpY2UgaW5zdGFuY2UgKi8NCj4gPiArICAgbmRldiA9IGFsbG9jX2NhbmRldihzaXplb2Yoc3RydWN0IHhjYW5fcHJpdiksDQo+IFhDQU5fRUNIT19TS0JfTUFYKTsNCj4gPiArICAgaWYgKCFuZGV2KQ0KPiA+ICsgICAgICAgICAgIHJldHVybiAtRU5PTUVNOw0KPiA+ICsNCj4gPiArICAgcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOw0KPiA+ICsgICBwcml2LT5kZXYgPSBuZGV2Ow0KPiA+ICsgICBwcml2LT5jYW4uYml0dGltaW5nX2NvbnN0ID0gJnhjYW5fYml0dGltaW5nX2NvbnN0Ow0KPiA+ICsgICBwcml2LT5jYW4uZG9fc2V0X2JpdHRpbWluZyA9IHhjYW5fc2V0X2JpdHRpbWluZzsNCj4gPiArICAgcHJpdi0+Y2FuLmRvX3NldF9tb2RlID0geGNhbl9kb19zZXRfbW9kZTsNCj4gPiArICAgcHJpdi0+Y2FuLmRvX2dldF9iZXJyX2NvdW50ZXIgPSB4Y2FuX2dldF9iZXJyX2NvdW50ZXI7DQo+ID4gKyAgIHByaXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgPSBDQU5fQ1RSTE1PREVfTE9PUEJBQ0sgfA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBTl9DVFJMTU9ERV9CRVJSX1JFUE9SVElORzsNCj4gPiArDQo+ID4gKyAgIC8qIEdldCBJUlEgZm9yIHRoZSBkZXZpY2UgKi8NCj4gPiArICAgbmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsNCj4gPiArDQo+ID4gKyAgIHNwaW5fbG9ja19pbml0KCZwcml2LT5lY2hfc2tiX2xvY2spOw0KPiA+ICsgICBuZGV2LT5mbGFncyB8PSBJRkZfRUNITzsgICAgICAgIC8qIFdlIHN1cHBvcnQgbG9jYWwgZWNobyAqLw0KPiA+ICsNCj4gPiArICAgcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7DQo+ID4gKyAgIFNFVF9ORVRERVZfREVWKG5kZXYsICZwZGV2LT5kZXYpOw0KPiA+ICsgICBuZGV2LT5uZXRkZXZfb3BzID0gJnhjYW5fbmV0ZGV2X29wczsNCj4gPiArDQo+ID4gKyAgIC8qIEdldCB0aGUgdmlydHVhbCBiYXNlIGFkZHJlc3MgZm9yIHRoZSBkZXZpY2UgKi8NCj4gPiArICAgcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsNCj4gPiArICAgcHJpdi0+cmVnX2Jhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsNCj4gPiArICAgaWYgKElTX0VSUihwcml2LT5yZWdfYmFzZSkpIHsNCj4gPiArICAgICAgICAgICByZXQgPSBQVFJfRVJSKHByaXYtPnJlZ19iYXNlKTsNCj4gPiArICAgICAgICAgICBnb3RvIGVycl9mcmVlOw0KPiA+ICsgICB9DQo+ID4gKyAgIG5kZXYtPm1lbV9zdGFydCA9IHJlcy0+c3RhcnQ7DQo+ID4gKyAgIG5kZXYtPm1lbV9lbmQgPSByZXMtPmVuZDsNCj4gPiArDQo+ID4gKyAgIHByaXYtPndyaXRlX3JlZyA9IHhjYW5fd3JpdGVfcmVnOw0KPiA+ICsgICBwcml2LT5yZWFkX3JlZyA9IHhjYW5fcmVhZF9yZWc7DQo+ID4gKw0KPiA+ICsgICByZXQgPSBvZl9wcm9wZXJ0eV9yZWFkX3UzMihwZGV2LT5kZXYub2Zfbm9kZSwgInR4LWZpZm8tZGVwdGgiLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlmb2RlcCk7DQo+ID4gKyAgIGlmIChyZXQgPCAwKQ0KPiA+ICsgICAgICAgICAgIGdvdG8gZXJyX2ZyZWU7DQo+ID4gKyAgIHByaXYtPnhjYW5fZWNob19za2JfbWF4X3R4ID0gZmlmb2RlcDsNCj4gPiArDQo+ID4gKyAgIHJldCA9IG9mX3Byb3BlcnR5X3JlYWRfdTMyKHBkZXYtPmRldi5vZl9ub2RlLCAicngtZmlmby1kZXB0aCIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWZvZGVwKTsNCj4gPiArICAgaWYgKHJldCA8IDApDQo+ID4gKyAgICAgICAgICAgZ290byBlcnJfZnJlZTsNCj4gPiArICAgcHJpdi0+eGNhbl9lY2hvX3NrYl9tYXhfcnggPSBmaWZvZGVwOw0KPiA+ICsNCj4gPiArICAgLyogR2V0dGluZyB0aGUgQ0FOIGRldmNsayBpbmZvICovDQo+ID4gKyAgIHByaXYtPmRldmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCAicmVmX2NsayIpOw0KPiA+ICsgICBpZiAoSVNfRVJSKHByaXYtPmRldmNsaykpIHsNCj4gPiArICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJEZXZpY2UgY2xvY2sgbm90IGZvdW5kLlxuIik7DQo+ID4gKyAgICAgICAgICAgcmV0ID0gUFRSX0VSUihwcml2LT5kZXZjbGspOw0KPiA+ICsgICAgICAgICAgIGdvdG8gZXJyX2ZyZWU7DQo+ID4gKyAgIH0NCj4gPiArDQo+ID4gKyAgIC8qIENoZWNrIGZvciB0eXBlIG9mIENBTiBkZXZpY2UgKi8NCj4gPiArICAgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBkZXYtPmRldi5vZl9ub2RlLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInhsbngsenlucS1jYW4tMS4wMC5hIikpIHsNCj4gPiArICAgICAgICAgICBwcml2LT5hcGVyY2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsICJhcGVyX2NsayIpOw0KPiA+ICsgICAgICAgICAgIGlmIChJU19FUlIocHJpdi0+YXBlcmNsaykpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgImFwZXIgY2xvY2sgbm90IGZvdW5kXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgICAgIHJldCA9IFBUUl9FUlIocHJpdi0+YXBlcmNsayk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICBnb3RvIGVycl9mcmVlOw0KPiA+ICsgICAgICAgICAgIH0NCj4gPiArICAgfSBlbHNlIHsNCj4gPiArICAgICAgICAgICBwcml2LT5hcGVyY2xrID0gcHJpdi0+ZGV2Y2xrOw0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICByZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+ZGV2Y2xrKTsNCj4gPiArICAgaWYgKHJldCkgew0KPiA+ICsgICAgICAgICAgIGRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBlbmFibGUgZGV2aWNlIGNsb2NrXG4iKTsNCj4gPiArICAgICAgICAgICBnb3RvIGVycl9mcmVlOw0KPiA+ICsgICB9DQo+ID4gKw0KPiA+ICsgICByZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocHJpdi0+YXBlcmNsayk7DQo+ID4gKyAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gZW5hYmxlIGFwZXIgY2xvY2tcbiIpOw0KPiA+ICsgICAgICAgICAgIGdvdG8gZXJyX3VucHJlcGFyX2Rpc2FibGVkZXY7DQo+ID4gKyAgIH0NCj4NCj4gQ2FuIHlvdSBrZWVwIHlvdXIgY2xvY2tzIGRpc2FsZWQgaWYgdGhlIGludGVyZmFjZSBpcyBub3QgdXA/DQoNCkkgZGlkbid0IGdldCBpdCB3aWxsIHlvdSBwbGVhc2UgZXhwbGFpbj8NCg0KDQoNCg0KUmVnYXJkcywNCktlZGFyLg0KDQo+DQo+ID4gKw0KPiA+ICsgICBwcml2LT5jYW4uY2xvY2suZnJlcSA9IGNsa19nZXRfcmF0ZShwcml2LT5kZXZjbGspOw0KPiA+ICsNCj4gPiArICAgbmV0aWZfbmFwaV9hZGQobmRldiwgJnByaXYtPm5hcGksIHhjYW5fcnhfcG9sbCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdi0+eGNhbl9lY2hvX3NrYl9tYXhfcngpOw0KPiA+ICsgICByZXQgPSByZWdpc3Rlcl9jYW5kZXYobmRldik7DQo+ID4gKyAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICBkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsIHRvIHJlZ2lzdGVyIGZhaWxlZCAoZXJyPSVkKVxuIiwNCj4gcmV0KTsNCj4gPiArICAgICAgICAgICBnb3RvIGVycl91bnByZXBhcl9kaXNhYmxlYXBlcjsNCj4gPiArICAgfQ0KPiA+ICsNCj4gPiArICAgZGV2bV9jYW5fbGVkX2luaXQobmRldik7DQo+ID4gKyAgIGRldl9pbmZvKCZwZGV2LT5kZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAicmVnX2Jhc2U9MHglcCBpcnE9JWQgY2xvY2s9JWQsIHR4IGZpZm8NCj4gZGVwdGg6JWRcbiIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICBwcml2LT5yZWdfYmFzZSwgbmRldi0+aXJxLCBwcml2LT5jYW4uY2xvY2suZnJlcSwNCj4gPiArICAgICAgICAgICAgICAgICAgIHByaXYtPnhjYW5fZWNob19za2JfbWF4X3R4KTsNCj4gPiArDQo+ID4gKyAgIHJldHVybiAwOw0KPiA+ICsNCj4gPiArZXJyX3VucHJlcGFyX2Rpc2FibGVhcGVyOg0KPiA+ICsgICBjbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+YXBlcmNsayk7DQo+ID4gK2Vycl91bnByZXBhcl9kaXNhYmxlZGV2Og0KPiA+ICsgICBjbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+ZGV2Y2xrKTsNCj4gPiArZXJyX2ZyZWU6DQo+ID4gKyAgIGZyZWVfY2FuZGV2KG5kZXYpOw0KPiA+ICsNCj4gPiArICAgcmV0dXJuIHJldDsNCj4gPiArfQ0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAqIHhjYW5fcmVtb3ZlIC0gVW5yZWdpc3RlciB0aGUgZGV2aWNlIGFmdGVyIHJlbGVhc2luZyB0aGUgcmVzb3VyY2VzDQo+ID4gKyAqIEBwZGV2OiAgSGFuZGxlIHRvIHRoZSBwbGF0Zm9ybSBkZXZpY2Ugc3RydWN0dXJlDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gZnJlZXMgYWxsIHRoZSByZXNvdXJjZXMgYWxsb2NhdGVkIHRvIHRoZSBkZXZpY2UuDQo+ID4gKyAqIFJldHVybjogMCBhbHdheXMNCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbnQgeGNhbl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgew0KPiA+ICsgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOw0KPiA+ICsgICBzdHJ1Y3QgeGNhbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7DQo+ID4gKw0KPiA+ICsgICBpZiAoc2V0X3Jlc2V0X21vZGUobmRldikgPCAwKQ0KPiA+ICsgICAgICAgICAgIG5ldGRldl9lcnIobmRldiwgIm1vZGUgcmVzZXR0aW5nIGZhaWxlZCFcbiIpOw0KPiA+ICsNCj4gPiArICAgdW5yZWdpc3Rlcl9jYW5kZXYobmRldik7DQo+ID4gKyAgIG5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsNCj4gPiArICAgY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHByaXYtPmFwZXJjbGspOw0KPiA+ICsgICBjbGtfZGlzYWJsZV91bnByZXBhcmUocHJpdi0+ZGV2Y2xrKTsNCj4gPiArDQo+ID4gKyAgIGZyZWVfY2FuZGV2KG5kZXYpOw0KPiA+ICsNCj4gPiArICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qIE1hdGNoIHRhYmxlIGZvciBPRiBwbGF0Zm9ybSBiaW5kaW5nICovIHN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkDQo+ID4gK3hjYW5fb2ZfbWF0Y2hbXSA9IHsNCj4gPiArICAgeyAuY29tcGF0aWJsZSA9ICJ4bG54LHp5bnEtY2FuLTEuMDAuYSIsIH0sDQo+ID4gKyAgIHsgLmNvbXBhdGlibGUgPSAieGxueCxheGktY2FuLTEuMDAuYSIsIH0sDQo+ID4gKyAgIHsgLyogZW5kIG9mIGxpc3QgKi8gfSwNCj4gPiArfTsNCj4gPiArTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGNhbl9vZl9tYXRjaCk7DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Y2FuX2RyaXZlciA9IHsNCj4gPiArICAgLnByb2JlID0geGNhbl9wcm9iZSwNCj4gPiArICAgLnJlbW92ZSA9IHhjYW5fcmVtb3ZlLA0KPiA+ICsgICAuZHJpdmVyID0gew0KPiA+ICsgICAgICAgICAgIC5vd25lciA9IFRISVNfTU9EVUxFLA0KPiA+ICsgICAgICAgICAgIC5uYW1lID0gRFJJVkVSX05BTUUsDQo+ID4gKyAgICAgICAgICAgLnBtID0gJnhjYW5fZGV2X3BtX29wcywNCj4gPiArICAgICAgICAgICAub2ZfbWF0Y2hfdGFibGUgPSB4Y2FuX29mX21hdGNoLA0KPiA+ICsgICB9LA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4Y2FuX2RyaXZlcik7DQo+ID4gKw0KPiA+ICtNT0RVTEVfTElDRU5TRSgiR1BMIik7DQo+ID4gK01PRFVMRV9BVVRIT1IoIlhpbGlueCBJbmMiKTsNCj4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJYaWxpbnggQ0FOIGludGVyZmFjZSIpOw0KPiA+DQo+DQo+IE1hcmMNCj4NCj4gLS0NCj4gUGVuZ3V0cm9uaXggZS5LLiAgICAgICAgICAgICAgICAgIHwgTWFyYyBLbGVpbmUtQnVkZGUgICAgICAgICAgIHwNCj4gSW5kdXN0cmlhbCBMaW51eCBTb2x1dGlvbnMgICAgICAgIHwgUGhvbmU6ICs0OS0yMzEtMjgyNi05MjQgICAgIHwNCj4gVmVydHJldHVuZyBXZXN0L0RvcnRtdW5kICAgICAgICAgIHwgRmF4OiAgICs0OS01MTIxLTIwNjkxNy01NTU1IHwNCj4gQW10c2dlcmljaHQgSGlsZGVzaGVpbSwgSFJBIDI2ODYgIHwgaHR0cDovL3d3dy5wZW5ndXRyb25peC5kZSAgIHwNCg0KDQoNClRoaXMgZW1haWwgYW5kIGFueSBhdHRhY2htZW50cyBhcmUgaW50ZW5kZWQgZm9yIHRoZSBzb2xlIHVzZSBvZiB0aGUgbmFtZWQgcmVjaXBpZW50KHMpIGFuZCBjb250YWluKHMpIGNvbmZpZGVudGlhbCBpbmZvcm1hdGlvbiB0aGF0IG1heSBiZSBwcm9wcmlldGFyeSwgcHJpdmlsZWdlZCBvciBjb3B5cmlnaHRlZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gSWYgeW91IGFyZSBub3QgdGhlIGludGVuZGVkIHJlY2lwaWVudCwgZG8gbm90IHJlYWQsIGNvcHksIG9yIGZvcndhcmQgdGhpcyBlbWFpbCBtZXNzYWdlIG9yIGFueSBhdHRhY2htZW50cy4gRGVsZXRlIHRoaXMgZW1haWwgbWVzc2FnZSBhbmQgYW55IGF0dGFjaG1lbnRzIGltbWVkaWF0ZWx5Lg0KDQoKCg==--To unsubscribe from this list: send the line "unsubscribe devicetree" inthe body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.orgMore majordomo info at http://vger.kernel.org/majordomo-info.html