From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Williams, Dan J" Subject: Re: [PATCH v2 00/20] libnd: non-volatile memory device support Date: Fri, 8 May 2015 06:31:15 +0000 Message-ID: <1431066672.30434.4.camel@intel.com> References: <20150428181203.35812.60474.stgit@dwillia2-desk3.amr.corp.intel.com> <2127273.OhQ7MIpEUu@vostro.rjw.lan> <9076255.5kM0LKa3dN@vostro.rjw.lan> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <9076255.5kM0LKa3dN@vostro.rjw.lan> Content-Language: en-US Content-ID: <91A75B7C979A1D4084CFEF50B7872239@intel.com> Sender: linux-kernel-owner@vger.kernel.org To: "rjw@rjwysocki.net" Cc: "mingo@kernel.org" , "linux-kernel@vger.kernel.org" , "nicholas.w.moulin@linux.intel.com" , "neilb@suse.de" , "jmoyer@redhat.com" , "tglx@linutronix.de" , "torvalds@linux-foundation.org" , "hch@lst.de" , "Moore, Robert" , "Wysocki, Rafael J" , "hpa@zytor.com" , "linux-nvdimm@lists.01.org" , "axboe@fb.com" , "vishal.l.verma@linux.intel.com" , "willy@linux.intel.com" , "bp@alien8.de" , "ross.zwisler@linux.intel.com" , "luto@amacapital.net" , gregkh@linuxfoundation. List-Id: linux-acpi@vger.kernel.org T24gVHVlLCAyMDE1LTA1LTA1IGF0IDAyOjA2ICswMjAwLCBSYWZhZWwgSi4gV3lzb2NraSB3cm90 ZToNCj4gT24gVHVlc2RheSwgQXByaWwgMjgsIDIwMTUgMDY6MjI6MDUgUE0gRGFuIFdpbGxpYW1z IHdyb3RlOg0KPiA+IE9uIFR1ZSwgQXByIDI4LCAyMDE1IGF0IDU6MjUgUE0sIFJhZmFlbCBKLiBX eXNvY2tpIDxyandAcmp3eXNvY2tpLm5ldD4gd3JvdGU6DQo+ID4gPiBPbiBUdWVzZGF5LCBBcHJp bCAyOCwgMjAxNSAwMjoyNDoxMiBQTSBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ID4gPj4gQ2hhbmdl cyBzaW5jZSB2MSBbMV06IEluY29ycG9yYXRlcyBmZWVkYmFjayByZWNlaXZlZCBwcmlvciB0byBB cHJpbCAyNC4NCj4gPiA+Pg0KPiANCj4gW2N1dF0NCj4gDQo+ID4gPg0KPiA+ID4gSSdtIHdvbmRl cmluZyB3aGF0J3Mgd3Jvbmcgd2l0aCBDQ2luZyBhbGwgb2YgdGhlIHNlcmllcyB0byBsaW51eC1h Y3BpPw0KPiA+ID4NCj4gPiA+IElzIHRoZXJlIGFueXRoaW5nIGluIGl0IHRoYXQgdGhlIHBlb3Bs ZSBvbiB0aGF0IGxpc3Qgc2hvdWxkIG5vdCBzZWUsIGJ5IGFueQ0KPiA+ID4gY2hhbmNlPw0KPiA+ IA0KPiA+IGxpbnV4LWFjcGkgbWF5IG5vdCBjYXJlIGFib3V0IHRoZSBkaW1tLW1ldGFkYXRhIGxh YmVsaW5nIHBhdGNoZXMgdGhhdA0KPiA+IGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIEFD UEksIGJ1dCBtaWdodCBhcyB3ZWxsIGluY2x1ZGUNCj4gPiBsaW51eC1hY3BpIG9uIHRoZSB3aG9s ZSBzZXJpZXMgYXQgdGhpcyBwb2ludC4NCj4gDQo+IEkndmUgZ29uZSB0aHJvdWdoIHRoZSBBQ1BJ LXJlbGF0ZWQgcGF0Y2hlcyBpbiB0aGlzIHNlcmllcyAob3RoZXIgdGhhbiBbMi8yMF0NCj4gdGhh dCBJJ3ZlIGNvbW1lbnRlZCBkaXJlY3RseSkgYW5kIHdoaWxlIEkgaGF2ZW4ndCBmb3VuZCBhbnl0 aGluZyBob3JyaWJsZSBpbg0KPiB0aGVtLCBJIGRvbid0IHF1aXRlIGZlZWwgY29uZmlkZW50IGVu b3VnaCB0byBBQ0sgdGhlbS4NCj4gDQo+IFdoYXQgSSdtIHJlYWxseSBtaXNzaW5nIGluIHRoaXMg c2VyaWVzIGlzIGEgZGVzaWduIGRvY3VtZW50IGRlc2NyaWJpbmcgYWxsIHRoYXQNCj4gZnJvbSBh IGhpZ2gtbGV2ZWwgcGVyc3BlY3RpdmUgYW5kIG1ha2luZyBpdCBjbGVhciB3aGVyZSBhbGwgb2Yg dGhlIHBpZWNlcyBnbw0KPiBhbmQgd2hhdCB0aGVpciByZXNwZWN0aXZlIHJvbGVzIGFyZS4gIEFs c28gcmVvcmRlcmluZyB0aGUgc2VyaWVzIHRvIGludHJvZHVjZQ0KPiB0aGUgbmQgc3Vic3lzdGVt IHRvIHN0YXJ0IHdpdGggYW5kIHRoZW4gaXRzIHVzZXJzIG1pZ2h0IGhlbHAgaGVyZS4NCg0KSGVy ZSB5b3UgZ28sIGFuZCBhbHNvIHNlZSB0aGUgIlN1cHBvcnRpbmcgRG9jdW1lbnRzIiBzZWN0aW9u IGlmIHlvdSBuZWVkDQptb3JlIGRldGFpbHMsIG9yIGp1c3QgYXNrLiAgVGhpcyBpcyB0aGUgcmV3 b3JrZWQgZG9jdW1lbnQgYWZ0ZXIgcHVzaGluZw0KTkZJVCBzcGVjaWZpY3Mgb3V0IG9mIHRoZSBj b3JlIGltcGxlbWVudGF0aW9uLiAgVGhlIGNvcmUgYXBpcyBhcmUNCm5kX2J1c19yZWdpc3Rlcigp LCBuZF9kaW1tX2NyZWF0ZSgpLCBuZF9wbWVtX3JlZ2lvbl9jcmVhdGUoKSwgYW5kDQpuZF9ibGtf cmVnaW9uX2NyZWF0ZSgpLg0KDQotLS0NCg0KCQkJICBMSUJORDogTm9uLXZvbGF0aWxlIERldmlj ZXMNCgkgICAgICBsaWJuZCAtIGtlcm5lbCAvIGxpYm5kY3RsIC0gdXNlcnNwYWNlIGhlbHBlciBs aWJyYXJ5DQoJCQkgICBsaW51eC1udmRpbW1AbGlzdHMuMDEub3JnDQoJCQkJICAgICAgdjEwDQoN Cg0KCUdsb3NzYXJ5DQoJT3ZlcnZpZXcNCgkgICAgU3VwcG9ydGluZyBEb2N1bWVudHMNCgkgICAg R2l0IFRyZWVzDQoJTElCTkQgUE1FTSBhbmQgQkxLDQoJV2h5IEJMSz8NCgkgICAgUE1FTSB2cyBC TEsNCgkgICAgICAgIEJMSy1SRUdJT05zLCBQTUVNLVJFR0lPTnMsIEF0b21pYyBTZWN0b3JzLCBh bmQgREFYDQoJRXhhbXBsZSBOVkRJTU0gUGxhdGZvcm0NCglMSUJORCBLZXJuZWwgRGV2aWNlIE1v ZGVsIGFuZCBMSUJORENUTCBVc2Vyc3BhY2UgQVBJDQoJICAgIExJQk5EQ1RMOiBDb250ZXh0DQoJ ICAgICAgICBsaWJuZGN0bDogaW5zdGFudGlhdGUgYSBuZXcgbGlicmFyeSBjb250ZXh0IGV4YW1w bGUNCgkgICAgTElCTkQvTElCTkRDVEw6IEJ1cw0KCSAgICAgICAgbGlibmQ6IGNvbnRyb2wgY2xh c3MgZGV2aWNlIGluIC9zeXMvY2xhc3MNCgkgICAgICAgIGxpYm5kOiBidXMNCgkgICAgICAgIGxp Ym5kY3RsOiBidXMgZW51bWVyYXRpb24gZXhhbXBsZQ0KCSAgICBMSUJORC9MSUJORENUTDogRElN TSAoTk1FTSkNCgkgICAgICAgIGxpYm5kOiBESU1NIChOTUVNKQ0KCSAgICAgICAgbGlibmRjdGw6 IERJTU0gZW51bWVyYXRpb24gZXhhbXBsZQ0KCSAgICBMSUJORC9MSUJORENUTDogUmVnaW9uDQoJ ICAgICAgICBsaWJuZDogcmVnaW9uDQoJICAgICAgICBsaWJuZGN0bDogcmVnaW9uIGVudW1lcmF0 aW9uIGV4YW1wbGUNCgkgICAgICAgIFdoeSBOb3QgRW5jb2RlIHRoZSBSZWdpb24gVHlwZSBpbnRv IHRoZSBSZWdpb24gTmFtZT8NCgkgICAgICAgIEhvdyBEbyBJIERldGVybWluZSB0aGUgTWFqb3Ig VHlwZSBvZiBhIFJlZ2lvbj8NCgkgICAgTElCTkQvTElCTkRDVEw6IE5hbWVzcGFjZQ0KCSAgICAg ICAgbGlibmQ6IG5hbWVzcGFjZQ0KCSAgICAgICAgbGlibmRjdGw6IG5hbWVzcGFjZSBlbnVtZXJh dGlvbiBleGFtcGxlDQoJICAgICAgICBsaWJuZGN0bDogbmFtZXNwYWNlIGNyZWF0aW9uIGV4YW1w bGUNCgkgICAgICAgIFdoeSB0aGUgVGVybSAibmFtZXNwYWNlIj8NCgkgICAgTElCTkQvTElCTkRD VEw6IEJsb2NrIFRyYW5zbGF0aW9uIFRhYmxlICJidHQiDQoJICAgICAgICBsaWJuZDogYnR0IGxh eW91dA0KCSAgICAgICAgbGlibmRjdGw6IGJ0dCBjcmVhdGlvbiBleGFtcGxlDQoJU3VtbWFyeSBM SUJORENUTCBEaWFncmFtDQoNCg0KR2xvc3NhcnkNCi0tLS0tLS0tDQoNClBNRU06IEEgc3lzdGVt IHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugd2hlcmUgd3JpdGVzIGFyZSBwZXJzaXN0ZW50LiAgQQ0K YmxvY2sgZGV2aWNlIGNvbXBvc2VkIG9mIFBNRU0gaXMgY2FwYWJsZSBvZiBEQVguICBBIFBNRU0g YWRkcmVzcyByYW5nZQ0KbWF5IHNwYW4vaW50ZXJsZWF2ZSBzZXZlcmFsIERJTU1zLg0KDQpCTEs6 IEEgc2V0IG9mIG9uZSBvciBtb3JlIHByb2dyYW1tYWJsZSBtZW1vcnkgbWFwcGVkIGFwZXJ0dXJl cyBwcm92aWRlZA0KYnkgYSBESU1NIHRvIGFjY2VzcyBpdHMgbWVkaWEuICBUaGlzIGluZGlyZWN0 aW9uIHByZWNsdWRlcyB0aGUNCnBlcmZvcm1hbmNlIGJlbmVmaXQgb2YgaW50ZXJsZWF2aW5nLCBi dXQgZW5hYmxlcyBESU1NLWJvdW5kZWQgZmFpbHVyZQ0KbW9kZXMgLg0KDQpEUEE6IERJTU0gUGh5 c2ljYWwgQWRkcmVzcywgaXMgYSBESU1NLXJlbGF0aXZlIG9mZnNldC4gIFdpdGggb25lIERJTU0g aW4NCnRoZSBzeXN0ZW0gdGhlcmUgd291bGQgYmUgYSAxOjEgc3lzdGVtLXBoeXNpY2FsLWFkZHJl c3M6RFBBIGFzc29jaWF0aW9uLg0KT25jZSBtb3JlIERJTU1zIGFyZSBhZGRlZCBhbiBtZW1vcnkg Y29udHJvbGxlciBpbnRlcmxlYXZlIG11c3QgYmUNCmRlY29kZWQgdG8gZGV0ZXJtaW5lIHRoZSBE UEEgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4NCnN5c3RlbS1waHlzaWNhbC1hZGRyZXNzLiAgQkxL IGNhcGFjaXR5IGFsd2F5cyBoYXMgYSAxOjEgcmVsYXRpb25zaGlwDQp3aXRoIGEgc2luZ2xlLWRp bW0ncyBEUEEgcmFuZ2UuDQoNCkRBWDogRmlsZSBzeXN0ZW0gZXh0ZW5zaW9ucyB0byBieXBhc3Mg dGhlIHBhZ2UgY2FjaGUgYW5kIGJsb2NrIGxheWVyIHRvDQptbWFwIHBlcnNpc3RlbnQgbWVtb3J5 LCBmcm9tIGEgUE1FTSBibG9jayBkZXZpY2UsIGRpcmVjdGx5IGludG8gYQ0KcHJvY2VzcyBhZGRy ZXNzIHNwYWNlLg0KDQpCVFQ6IEJsb2NrIFRyYW5zbGF0aW9uIFRhYmxlOiBQZXJzaXN0ZW50IG1l bW9yeSBpcyBieXRlIGFkZHJlc3NhYmxlLg0KRXhpc3Rpbmcgc29mdHdhcmUgbWF5IGhhdmUgYW4g ZXhwZWN0YXRpb24gdGhhdCB0aGUgcG93ZXItZmFpbC1hdG9taWNpdHkNCm9mIHdyaXRlcyBpcyBh dCBsZWFzdCBvbmUgc2VjdG9yLCA1MTIgYnl0ZXMuICBUaGUgQlRUIGlzIGFuIGluZGlyZWN0aW9u DQp0YWJsZSB3aXRoIGF0b21pYyB1cGRhdGUgc2VtYW50aWNzIHRvIGZyb250IGEgUE1FTS9CTEsg YmxvY2sgZGV2aWNlDQpkcml2ZXIgYW5kIHByZXNlbnQgYXJiaXRyYXJ5IGF0b21pYyBzZWN0b3Ig c2l6ZXMuDQoNCkxBQkVMOiBNZXRhZGF0YSBzdG9yZWQgb24gYSBESU1NIGRldmljZSB0aGF0IHBh cnRpdGlvbnMgYW5kIGlkZW50aWZpZXMNCihwZXJzaXN0ZW50bHkgbmFtZXMpIHN0b3JhZ2UgYmV0 d2VlbiBQTUVNIGFuZCBCTEsuICBJdCBhbHNvIHBhcnRpdGlvbnMNCkJMSyBzdG9yYWdlIHRvIGhv c3QgQlRUcyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHBlciBCTEstcGFydGl0aW9uLg0KTm90 ZSB0aGF0IHRyYWRpdGlvbmFsIHBhcnRpdGlvbiB0YWJsZXMsIEdQVC9NQlIsIGFyZSBsYXllcmVk IG9uIHRvcCBvZiBhDQpCTEsgb3IgUE1FTSBkZXZpY2UuDQoNCg0KT3ZlcnZpZXcNCi0tLS0tLS0t DQoNClRoZSBsaWJuZCBzdWJzeXN0ZW0gcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhyZWUgdHlwZXMg b2YgTlZESU1NcywgUE1FTSwNCkJMSywgYW5kIE5WRElNTSBwbGF0Zm9ybXMgdGhhdCBjYW4gc2lt dWx0YW5lb3VzbHkgc3VwcG9ydCBQTUVNIGFuZCBCTEsNCm1vZGUgYWNjZXNzIGNhcGFiaWxpdGll cyBvbiBhIGdpdmVuIHNldCBvZiBESU1Ncy4gIFRoZXNlIHRocmVlIG1vZGVzIG9mDQpvcGVyYXRp b24gYXJlIGRlc2NyaWJlZCBieSB0aGUgIk5WRElNTSBGaXJtd2FyZSBJbnRlcmZhY2UgVGFibGUi IChORklUKQ0KaW4gQUNQSSA2LiAgV2hpbGUgdGhlIGxpYm5kIGltcGxlbWVudGF0aW9uIGlzIGdl bmVyaWMgYW5kIHN1cHBvcnRzDQpwcmUtTkZJVCBwbGF0Zm9ybXMsIGl0IHdhcyBndWlkZWQgYnkg dGhlIHN1cGVyc2V0IG9mIGNhcGFiaWxpdGllcyBuZWVkDQp0byBzdXBwb3J0IHRoaXMgQUNQSSA2 IGRlZmluaXRpb24gZm9yIE5WRElNTSByZXNvdXJjZXMuICBUaGUgYnVsayBvZiB0aGUNCmtlcm5l bCBpbXBsZW1lbnRhdGlvbiBpcyBpbiBwbGFjZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgRFBB DQphY2Nlc3NpYmxlIHZpYSBQTUVNIGlzIGFsaWFzZWQgd2l0aCBEUEEgYWNjZXNzaWJsZSB2aWEg QkxLLiAgV2hlbiB0aGF0DQpvY2N1cnMgYSBMQUJFTCBpcyBuZWVkZWQgdG8gcmVzZXJ2ZSBEUEEg Zm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdmlhIG9uZQ0KbW9kZSBhIHRpbWUuDQoNClN1cHBvcnRpbmcg RG9jdW1lbnRzDQpBQ1BJIDY6IGh0dHA6Ly93d3cudWVmaS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxl cy9yZXNvdXJjZXMvQUNQSV82LjAucGRmDQpOVkRJTU0gTmFtZXNwYWNlOiBodHRwOi8vcG1lbS5p by9kb2N1bWVudHMvTlZESU1NX05hbWVzcGFjZV9TcGVjLnBkZg0KRFNNIEludGVyZmFjZSBFeGFt cGxlOiBodHRwOi8vcG1lbS5pby9kb2N1bWVudHMvTlZESU1NX0RTTV9JbnRlcmZhY2VfRXhhbXBs ZS5wZGYNCkRyaXZlciBXcml0ZXIncyBHdWlkZTogaHR0cDovL3BtZW0uaW8vZG9jdW1lbnRzL05W RElNTV9Ecml2ZXJfV3JpdGVyc19HdWlkZS5wZGYNCg0KR2l0IFRyZWVzDQpMSUJORDogaHR0cHM6 Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvZGpidy9udmRpbW0uZ2l0L2xv Zy8/aD1uZA0KTElCTkRDVEw6IGh0dHBzOi8vZ2l0aHViLmNvbS9wbWVtL25kY3RsLmdpdA0KUE1F TTogaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL3ByZA0KDQoNCkxJQk5EIFBNRU0gYW5kIEJMSw0K LS0tLS0tLS0tLS0tLS0tLS0tDQoNClByaW9yIHRvIHRoZSBhcnJpdmFsIG9mIHRoZSBORklULCBu b24tdm9sYXRpbGUgbWVtb3J5IHdhcyBkZXNjcmliZWQgdG8gYQ0Kc3lzdGVtIGluIHZhcmlvdXMg YWQtaG9jIHdheXMuICBVc3VhbGx5IG9ubHkgdGhlIGJhcmUgbWluaW11bSB3YXMNCnByb3ZpZGVk LCBuYW1lbHksIGEgc2luZ2xlIHN5c3RlbS1waHlzaWNhbC1hZGRyZXNzIHJhbmdlIHdoZXJlIHdy aXRlcw0KYXJlIGV4cGVjdGVkIHRvIGJlIGR1cmFibGUgYWZ0ZXIgYSBzeXN0ZW0gcG93ZXIgbG9z cy4gIE5vdywgdGhlIE5GSVQNCnNwZWNpZmljYXRpb24gc3RhbmRhcmRpemVzIG5vdCBvbmx5IHRo ZSBkZXNjcmlwdGlvbiBvZiBQTUVNLCBidXQgYWxzbw0KQkxLIGFuZCBwbGF0Zm9ybSBtZXNzYWdl LXBhc3NpbmcgZW50cnkgcG9pbnRzIGZvciBjb250cm9sIGFuZA0KY29uZmlndXJhdGlvbi4NCg0K Rm9yIGVhY2ggTlZESU1NIGFjY2VzcyBtZXRob2QgKFBNRU0sIEJMSyksIExJQk5EIHByb3ZpZGVz IGEgYmxvY2sgZGV2aWNlIGRyaXZlcjoNCg0KICAgIDEuIFBNRU0gKG5kX3BtZW0ua28pOiBEcml2 ZXMgYSBzeXN0ZW0tcGh5c2ljYWwtYWRkcmVzcyByYW5nZS4gIFRoaXMNCiAgICByYW5nZSBpcyBj b250aWd1b3VzIGluIHN5c3RlbSBtZW1vcnkgYW5kIG1heSBiZSBpbnRlcmxlYXZlZCAoaGFyZHdh cmUNCiAgICBtZW1vcnkgY29udHJvbGxlciBzdHJpcGVkKSBhY3Jvc3MgbXVsdGlwbGUgRElNTXMu ICBXaGVuIGludGVybGVhdmVkIHRoZQ0KICAgIHBsYXRmb3JtIG1heSBvcHRpb25hbGx5IHByb3Zp ZGUgZGV0YWlscyBvZiB3aGljaCBESU1NcyBhcmUgcGFydGljaXBhdGluZw0KICAgIGluIHRoZSBp bnRlcmxlYXZlLg0KICAgIA0KICAgIE5vdGUsIExJQk5EIGRlc2NyaWJlcyBzeXN0ZW0tcGh5c2lj YWwtYWRkcmVzcyByYW5nZXMgdGhhdCBtYXkgYWxpYXMgd2l0aA0KICAgIEJMSyBhY2Nlc3MgTkRf TkFNRVNQQUNFX1BNRU0gcmFuZ2VzIGFuZCB0aG9zZSB3aXRob3V0IGFsaWFzIGFzDQogICAgTkRf TkFNRVNQQUNFX0lPIHJhbmdlcywgdG8gdGhlIG5kX3BtZW0gZHJpdmVyIHRoZXJlIGlzIG5vIGRp c3RpbmN0aW9uLg0KICAgIFRoZSBkaWZmZXJlbnQgZGV2aWNlLXR5cGVzIGFyZSBhbiBpbXBsZW1l bnRhdGlvbiBkZXRhaWwgdGhhdCB1c2Vyc3BhY2UNCiAgICBjYW4gZXhwbG9pdCB0byBpbXBsZW1l bnQgcG9saWNpZXMgbGlrZSAib25seSBpbnRlcmZhY2Ugd2l0aCBhZGRyZXNzDQogICAgcmFuZ2Vz IGZyb20gY2VydGFpbiBESU1NcyIuICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIGFsaWFz aW5nIGlzDQogICAgcHJlc2VudCBhbmQgYSBESU1NIGxhY2tzIGEgbGFiZWwsIHRoZW4gbm8gYmxv Y2sgZGV2aWNlIGNhbiBiZSBjcmVhdGVkIGJ5DQogICAgZGVmYXVsdCBhcyB1c2Vyc3BhY2UgbmVl ZHMgdG8gZG8gYXQgbGVhc3Qgb25lIGFsbG9jYXRpb24gb2YgRFBBIHRvIHRoZQ0KICAgIFBNRU0g cmFuZ2UuICBJbiBjb250cmFzdCBORF9OQU1FU1BBQ0VfSU8gcmFuZ2VzLCBvbmNlIHJlZ2lzdGVy ZWQsIGNhbiBiZQ0KICAgIGltbWVkaWF0ZWx5IGF0dGFjaGVkIHRvIG5kX3BtZW0uDQogICAgDQog ICAgMi4gQkxLIChuZF9ibGsua28pOiBUaGlzIGRyaXZlciBwZXJmb3JtcyBJL08gdXNpbmcgYSBz ZXQgb2YgcGxhdGZvcm0NCiAgICBkZWZpbmVkIGFwZXJ0dXJlcy4gIEEgc2V0IG9mIGFwZXJ0dXJl cyB3aWxsIGFsbCBhY2Nlc3MganVzdCBvbmUgRElNTS4NCiAgICBNdWx0aXBsZSB3aW5kb3dzIGFs bG93IG11bHRpcGxlIGNvbmN1cnJlbnQgYWNjZXNzZXMsIG11Y2ggbGlrZQ0KICAgIHRhZ2dlZC1j b21tYW5kLXF1ZXVpbmcsIGFuZCB3b3VsZCBsaWtlbHkgYmUgdXNlZCBieSBkaWZmZXJlbnQgdGhy ZWFkcyBvcg0KICAgIGRpZmZlcmVudCBDUFVzLg0KDQogICAgVGhlIE5GSVQgc3BlY2lmaWNhdGlv biBkZWZpbmVzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBhIEJMSy1hcGVydHVyZSwgYnV0DQogICAg dGhlIHNwZWMgYWxzbyBhbGxvd3MgZm9yIHZlbmRvciBzcGVjaWZpYyBsYXlvdXRzLCBhbmQgbm9u LU5GSVQgQkxLDQogICAgaW1wbGVtZW50YXRpb25zIG1heSBvdGhlciBkZXNpZ25zIGZvciBCTEsg SS9PLiAgRm9yIHRoaXMgcmVhc29uICJuZF9ibGsiDQogICAgY2FsbHMgYmFjayBpbnRvIHBsYXRm b3JtLXNwZWNpZmljIGNvZGUgdG8gcGVyZm9ybSB0aGUgSS9PLiAgT25lIHN1Y2gNCiAgICBpbXBs ZW1lbnRhdGlvbiBpcyBkZWZpbmVkIGluIHRoZSAiRHJpdmVyIFdyaXRlcidzIEd1aWRlIiBhbiAi RFNNDQogICAgSW50ZXJmYWNlIEV4YW1wbGUiLg0KDQoNCldoeSBCTEs/DQotLS0tLS0tLQ0KDQpX aGlsZSBQTUVNIHByb3ZpZGVzIGRpcmVjdCBieXRlLWFkZHJlc3NhYmxlIENQVS1sb2FkL3N0b3Jl IGFjY2VzcyB0bw0KTlZESU1NIHN0b3JhZ2UsIGl0IGRvZXMgbm90IHByb3ZpZGUgdGhlIGJlc3Qg c3lzdGVtIFJBUyAocmVjb3ZlcnksDQphdmFpbGFiaWxpdHksIGFuZCBzZXJ2aWNlYWJpbGl0eSkg bW9kZWwuICBBbiBhY2Nlc3MgdG8gYSBjb3JydXB0ZWQNCnN5c3RlbS1waHlzaWNhbC1hZGRyZXNz IGFkZHJlc3MgY2F1c2VzIGEgY3B1IGV4Y2VwdGlvbiB3aGlsZSBhbiBhY2Nlc3MNCnRvIGEgY29y cnVwdGVkIGFkZHJlc3MgdGhyb3VnaCBhbiBCTEstYXBlcnR1cmUgY2F1c2VzIHRoYXQgYmxvY2sg d2luZG93DQp0byByYWlzZSBhbiBlcnJvciBzdGF0dXMgaW4gYSByZWdpc3Rlci4gIFRoZSBsYXR0 ZXIgaXMgbW9yZSBhbGlnbmVkIHdpdGgNCnRoZSBzdGFuZGFyZCBlcnJvciBtb2RlbCB0aGF0IGhv c3QtYnVzLWFkYXB0ZXIgYXR0YWNoZWQgZGlza3MgcHJlc2VudC4NCkFsc28sIGlmIGFuIGFkbWlu aXN0cmF0b3IgZXZlciB3YW50cyB0byByZXBsYWNlIGEgbWVtb3J5IGl0IGlzIGVhc2llciB0bw0K c2VydmljZSBhIHN5c3RlbSBhdCBESU1NIG1vZHVsZSBib3VuZGFyaWVzLiAgQ29tcGFyZSB0aGlz IHRvIFBNRU0gd2hlcmUNCmRhdGEgY291bGQgYmUgaW50ZXJsZWF2ZWQgaW4gYW4gb3BhcXVlIGhh cmR3YXJlIHNwZWNpZmljIG1hbm5lciBhY3Jvc3MNCnNldmVyYWwgRElNTXMuDQoNClBNRU0gdnMg QkxLDQpCTEstYXBlcnR1cmVzIHNvbHZlIHRoaXMgUkFTIHByb2JsZW0sIGJ1dCB0aGVpciBwcmVz ZW5jZSBpcyBhbHNvIHRoZQ0KbWFqb3IgY29udHJpYnV0aW5nIGZhY3RvciB0byB0aGUgY29tcGxl eGl0eSBvZiB0aGUgTkQgc3Vic3lzdGVtLiAgVGhleQ0KY29tcGxpY2F0ZSB0aGUgaW1wbGVtZW50 YXRpb24gYmVjYXVzZSBQTUVNIGFuZCBCTEsgYWxpYXMgaW4gRFBBIHNwYWNlLg0KQW55IGdpdmVu IERJTU0ncyBEUEEtcmFuZ2UgbWF5IGNvbnRyaWJ1dGUgdG8gb25lIG9yIG1vcmUNCnN5c3RlbS1w aHlzaWNhbC1hZGRyZXNzIHNldHMgb2YgaW50ZXJsZWF2ZWQgRElNTXMsICphbmQqIG1heSBhbHNv IGJlDQphY2Nlc3NlZCBpbiBpdHMgZW50aXJldHkgdGhyb3VnaCBpdHMgQkxLLWFwZXJ0dXJlLiAg QWNjZXNzaW5nIGEgRFBBDQp0aHJvdWdoIGEgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3Mgd2hpbGUg c2ltdWx0YW5lb3VzbHkgYWNjZXNzaW5nIHRoZQ0Kc2FtZSBEUEEgdGhyb3VnaCBhIEJMSy1hcGVy dHVyZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuICBGb3IgdGhpcyByZWFzb24sDQpESU1NJ3Mgd2l0 aCB0aGlzIGR1YWwgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZSBhIERTTSBmdW5jdGlv biB0bw0Kc3RvcmUvcmV0cmlldmUgYSBMQUJFTC4gIFRoZSBMQUJFTCBlZmZlY3RpdmVseSBwYXJ0 aXRpb25zIHRoZSBEUEEtc3BhY2UNCmludG8gZXhjbHVzaXZlIHN5c3RlbS1waHlzaWNhbC1hZGRy ZXNzIGFuZCBCTEstYXBlcnR1cmUgYWNjZXNzaWJsZQ0KcmVnaW9ucy4gIEZvciBzaW1wbGljaXR5 IGEgRElNTSBpcyBhbGxvd2VkIGEgUE1FTSAicmVnaW9uIiBwZXIgZWFjaA0KaW50ZXJsZWF2ZSBz ZXQgaW4gd2hpY2ggaXQgaXMgYSBtZW1iZXIuICBUaGUgcmVtYWluaW5nIERQQSBzcGFjZSBjYW4g YmUNCmNhcnZlZCBpbnRvIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgQkxLIGRldmljZXMgd2l0aCBk aXNjb250aWd1b3VzDQpleHRlbnRzLg0KDQpCTEstUkVHSU9OcywgUE1FTS1SRUdJT05zLCBBdG9t aWMgU2VjdG9ycywgYW5kIERBWA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCg0KT25lIG9mIHRoZSBmZXcNCnJlYXNvbnMgdG8gYWxsb3cgbXVsdGlw bGUgQkxLIG5hbWVzcGFjZXMgcGVyIFJFR0lPTiBpcyBzbyB0aGF0IGVhY2gNCkJMSy1uYW1lc3Bh Y2UgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIEJUVCB3aXRoIHVuaXF1ZSBhdG9taWMgc2VjdG9y DQpzaXplcy4gIFdoaWxlIGEgUE1FTSBkZXZpY2UgY2FuIGhvc3QgYSBCVFQgdGhlIExBQkVMIHNw ZWNpZmljYXRpb24gZG9lcw0Kbm90IHByb3ZpZGUgZm9yIGEgc2VjdG9yIHNpemUgdG8gYmUgc3Bl Y2lmaWVkIGZvciBhIFBNRU0gbmFtZXNwYWNlLg0KVGhpcyBpcyBkdWUgdG8gdGhlIGV4cGVjdGF0 aW9uIHRoYXQgdGhlIHByaW1hcnkgdXNhZ2UgbW9kZWwgZm9yIFBNRU0gaXMNCnZpYSBEQVgsIGFu ZCB0aGUgQlRUIGlzIGluY29tcGF0aWJsZSB3aXRoIERBWC4gIEhvd2V2ZXIsIGZvciB0aGUgY2Fz ZXMNCndoZXJlIGFuIGFwcGxpY2F0aW9uIG9yIGZpbGVzeXN0ZW0gc3RpbGwgbmVlZHMgYXRvbWlj IHNlY3RvciB1cGRhdGUNCmd1YXJhbnRlZXMgaXQgY2FuIHJlZ2lzdGVyIGEgQlRUIG9uIGEgUE1F TSBkZXZpY2Ugb3IgcGFydGl0aW9uLiAgU2VlDQpMSUJORC9ORENUTDogQmxvY2sgVHJhbnNsYXRp b24gVGFibGUgImJ0dCINCg0KDQpFeGFtcGxlIE5WRElNTSBQbGF0Zm9ybQ0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCg0KRm9yIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCB0aGUgZm9s bG93aW5nIGRpYWdyYW0gd2lsbCBiZQ0KcmVmZXJlbmNlZCBmb3IgYW55IGV4YW1wbGUgc3lzZnMg bGF5b3V0cy4NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhKSAgICAgICAgICAg ICAgIChiKSAgICAgICAgICAgRElNTSAgIEJMSy1SRUdJT04NCiAgICAgICAgICArLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsNCistLS0tLS0rICB8ICAgICAg IHBtMC4wICAgICAgIHwgYmxrMi4wIHwgcG0xLjAgIHwgYmxrMi4xIHwgICAgMCAgICAgIHJlZ2lv bjINCnwgaW1jMCArLS0rLSAtIC0gcmVnaW9uMC0gLSAtICstLS0tLS0tLSsgICAgICAgICstLS0t LS0tLSsNCistLSstLS0rICB8ICAgICAgIHBtMC4wICAgICAgIHwgYmxrMy4wIHwgcG0xLjAgIHwg YmxrMy4xIHwgICAgMSAgICAgIHJlZ2lvbjMNCiAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLXYgICAgICAgIHYtLS0tLS0tLSsNCistLSstLS0rICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwNCnwgY3B1MCB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbjENCistLSstLS0rICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwNCiAgIHwgICAgICArLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLV4gICAgICAgIF4tLS0tLS0tLSsNCistLSstLS0rICB8ICAgICAgICAg ICBibGs0LjAgICAgICAgICAgIHwgcG0xLjAgIHwgYmxrNC4wIHwgICAgMiAgICAgIHJlZ2lvbjQN CnwgaW1jMSArLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICstLS0tLS0t LSsNCistLS0tLS0rICB8ICAgICAgICAgICBibGs1LjAgICAgICAgICAgIHwgcG0xLjAgIHwgYmxr NS4wIHwgICAgMyAgICAgIHJlZ2lvbjUNCiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsNCg0KSW4gdGhpcyBwbGF0Zm9ybSB3ZSBoYXZlIGZv dXIgRElNTXMgYW5kIHR3byBtZW1vcnkgY29udHJvbGxlcnMgaW4gb25lDQpzb2NrZXQuICBFYWNo IHVuaXF1ZSBpbnRlcmZhY2UgKEJMSyBvciBQTUVNKSB0byBEUEEgc3BhY2UgaXMgaWRlbnRpZmll ZA0KYnkgYSByZWdpb24gZGV2aWNlIHdpdGggYSBkeW5hbWljYWxseSBhc3NpZ25lZCBpZCAoUkVH SU9OMCAtIFJFR0lPTjUpLg0KDQogICAgMS4gVGhlIGZpcnN0IHBvcnRpb24gb2YgRElNTTAgYW5k IERJTU0xIGFyZSBpbnRlcmxlYXZlZCBhcyBSRUdJT04wLiBBDQogICAgc2luZ2xlIFBNRU0gbmFt ZXNwYWNlIGlzIGNyZWF0ZWQgaW4gdGhlIFJFR0lPTjAtU1BBLXJhbmdlIHRoYXQgc3BhbnMNCiAg ICBESU1NMCBhbmQgRElNTTEgd2l0aCBhIHVzZXItc3BlY2lmaWVkIG5hbWUgb2YgInBtMC4wIi4g U29tZSBvZiB0aGF0DQogICAgaW50ZXJsZWF2ZWQgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFu Z2UgaXMgcmVjbGFpbWVkIGFzIEJMSy1hcGVydHVyZQ0KICAgIGFjY2Vzc2VkIHNwYWNlIHN0YXJ0 aW5nIGF0IERQQS1vZmZzZXQgKGEpIGludG8gZWFjaCBESU1NLiAgSW4gdGhhdA0KICAgIHJlY2xh aW1lZCBzcGFjZSB3ZSBjcmVhdGUgdHdvIEJMSy1hcGVydHVyZSAibmFtZXNwYWNlcyIgZnJvbSBS RUdJT04yIGFuZA0KICAgIFJFR0lPTjMgd2hlcmUgImJsazIuMCIgYW5kICJibGszLjAiIGFyZSBq dXN0IGh1bWFuIHJlYWRhYmxlIG5hbWVzIHRoYXQNCiAgICBjb3VsZCBiZSBzZXQgdG8gYW55IHVz ZXItZGVzaXJlZCBuYW1lIGluIHRoZSBMQUJFTC4NCiAgICANCiAgICAyLiBJbiB0aGUgbGFzdCBw b3J0aW9uIG9mIERJTU0wIGFuZCBESU1NMSB3ZSBoYXZlIGFuIGludGVybGVhdmVkDQogICAgc3lz dGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFuZ2UsIFJFR0lPTjEsIHRoYXQgc3BhbnMgdGhvc2UgdHdv IERJTU1zIGFzDQogICAgd2VsbCBhcyBESU1NMiBhbmQgRElNTTMuICBTb21lIG9mIFJFR0lPTjEg YWxsb2NhdGVkIHRvIGEgUE1FTSBuYW1lc3BhY2UNCiAgICBuYW1lZCAicG0xLjAiIHRoZSByZXN0 IGlzIHJlY2xhaW1lZCBpbiA0IEJMSy1hcGVydHVyZSBuYW1lc3BhY2VzIChmb3INCiAgICBlYWNo IERJTU0gaW4gdGhlIGludGVybGVhdmUgc2V0KSwgImJsazIuMSIsICJibGszLjEiLCAiYmxrNC4w IiwgYW5kDQogICAgImJsazUuMCIuDQogICAgDQogICAgMy4gVGhlIHBvcnRpb24gb2YgRElNTTIg YW5kIERJTU0zIHRoYXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBSRUdJT04xDQogICAgaW50 ZXJsZWF2ZWQgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFuZ2UgKGkuZS4gdGhlIERQQSBhZGRy ZXNzIGJlbG93DQogICAgb2Zmc2V0IChiKSBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgImJsazQu MCIgYW5kICJibGs1LjAiIG5hbWVzcGFjZXMuDQogICAgTm90ZSwgdGhhdCB0aGlzIGV4YW1wbGUg c2hvd3MgdGhhdCBCTEstYXBlcnR1cmUgbmFtZXNwYWNlcyBkb24ndCBuZWVkIHRvDQogICAgYmUg Y29udGlndW91cyBpbiBEUEEtc3BhY2UuDQogICAgDQogICAgVGhpcyBidXMgaXMgcHJvdmlkZWQg YnkgdGhlIGtlcm5lbCB1bmRlciB0aGUgZGV2aWNlDQogICAgL3N5cy9kZXZpY2VzL3BsYXRmb3Jt L25maXRfdGVzdC4wIHdoZW4gQ09ORklHX05GSVRfVEVTVCBpcyBlbmFibGVkIGFuZA0KICAgIHRo ZSBuZml0X3Rlc3Qua28gbW9kdWxlIGlzIGxvYWRlZC4gIFRoaXMgbm90IG9ubHkgdGVzdCBMSUJO RCBidXQgdGhlDQogICAgYWNwaV9uZml0LmtvIGRyaXZlciBhcyB3ZWxsLg0KDQoNCkxJQk5EIEtl cm5lbCBEZXZpY2UgTW9kZWwgYW5kIExJQk5EQ1RMIFVzZXJzcGFjZSBBUEkNCi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KV2hhdCBmb2xsb3dz IGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIExJQk5EIHN5c2ZzIGxheW91dCBhbmQgYQ0KY29ycmVz cG9uZGluZyBvYmplY3QgaGllcmFyY2h5IGRpYWdyYW0gYXMgdmlld2VkIHRocm91Z2ggdGhlIExJ Qk5EQ1RMDQphcGkuICBUaGUgZXhhbXBsZSBzeXNmcyBwYXRocyBhbmQgZGlhZ3JhbXMgYXJlIHJl bGF0aXZlIHRvIHRoZSBFeGFtcGxlDQpOVkRJTU0gUGxhdGZvcm0gd2hpY2ggaXMgYWxzbyB0aGUg bGlibmQgYnVzIHVzZWQgaW4gdGhlIGxpYm5kY3RsIHVuaXQNCnRlc3QuDQoNCkxJQk5EQ1RMOiBD b250ZXh0DQpFdmVyeSBhcGkgY2FsbCBpbiB0aGUgTElCTkRDVEwgbGlicmFyeSByZXF1aXJlcyBh IGNvbnRleHQgdGhhdCBob2xkcyB0aGUNCmxvZ2dpbmcgcGFyYW1ldGVycyBhbmQgb3RoZXIgbGli cmFyeSBpbnN0YW5jZSBzdGF0ZS4gIFRoZSBsaWJyYXJ5IGlzDQpiYXNlZCBvbiB0aGUgbGliYWJj IHRlbXBsYXRlOg0KaHR0cHM6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQv a2F5L2xpYmFiYy5naXQvIGxpYm5kY3RsOg0KaW5zdGFudGlhdGUgYSBuZXcgbGlicmFyeSBjb250 ZXh0IGV4YW1wbGUNCg0KCXN0cnVjdCBuZGN0bF9jdHggKmN0eDsNCg0KCWlmIChuZGN0bF9uZXco JmN0eCkgPT0gMCkNCgkJcmV0dXJuIGN0eDsNCgllbHNlDQoJCXJldHVybiBOVUxMOw0KDQpMSUJO RC9MSUJORENUTDogQnVzDQotLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgYnVzIGhhcyBhIDE6MSBy ZWxhdGlvbnNoaXAgd2l0aCBhbiBORklULiAgVGhlIGN1cnJlbnQgZXhwZWN0YXRpb24gZm9yDQpB Q1BJIGJhc2VkIHN5c3RlbXMgaXMgdGhhdCB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lIHBsYXRmb3Jt LWdsb2JhbCBORklULg0KVGhhdCBzYWlkLCBpdCBpcyB0cml2aWFsIHRvIHJlZ2lzdGVyIG11bHRp cGxlIE5GSVRzLCB0aGUgc3BlY2lmaWNhdGlvbg0KZG9lcyBub3QgcHJlY2x1ZGUgaXQuICBUaGUg aW5mcmFzdHJ1Y3R1cmUgc3VwcG9ydHMgbXVsdGlwbGUgYnVzc2VzIGFuZA0Kd2Ugd2UgdXNlIHRo aXMgY2FwYWJpbGl0eSB0byB0ZXN0IG11bHRpcGxlIE5GSVQgY29uZmlndXJhdGlvbnMgaW4gdGhl DQp1bml0IHRlc3QuDQoNCmxpYm5kOiBjb250cm9sIGNsYXNzIGRldmljZSBpbiAvc3lzL2NsYXNz DQoNClRoaXMgY2hhcmFjdGVyIGRldmljZSBhY2NlcHRzIERTTSBtZXNzYWdlcyB0byBiZSBwYXNz ZWQgdG8gRElNTQ0KaWRlbnRpZmllZCBieSBpdHMgTkZJVCBoYW5kbGUuDQoNCgkvc3lzL2NsYXNz L25kL25kY3RsMA0KCXwtLSBkZXYNCgl8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL25kYnVzMA0KCXwt LSBzdWJzeXN0ZW0gLT4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xhc3MvbmQNCg0KDQoNCmxpYm5k OiBidXMNCg0KCXN0cnVjdCBuZF9idXMgKm5kX2J1c19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpw YXJlbnQsDQoJICAgICAgIHN0cnVjdCBuZF9idXNfZGVzY3JpcHRvciAqbmZpdF9kZXNjKTsNCg0K CS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czANCgl8LS0gYnR0MA0KCXwt LSBidHRfc2VlZA0KCXwtLSBjb21tYW5kcw0KCXwtLSBuZA0KCXwtLSBuZml0DQoJfC0tIG5tZW0w DQoJfC0tIG5tZW0xDQoJfC0tIG5tZW0yDQoJfC0tIG5tZW0zDQoJfC0tIHBvd2VyDQoJfC0tIHBy b3ZpZGVyDQoJfC0tIHJlZ2lvbjANCgl8LS0gcmVnaW9uMQ0KCXwtLSByZWdpb24yDQoJfC0tIHJl Z2lvbjMNCgl8LS0gcmVnaW9uNA0KCXwtLSByZWdpb241DQoJfC0tIHVldmVudA0KCWAtLSB3YWl0 X3Byb2JlDQoNCmxpYm5kY3RsOiBidXMgZW51bWVyYXRpb24gZXhhbXBsZQ0KRmluZCB0aGUgYnVz IGhhbmRsZSB0aGF0IGRlc2NyaWJlcyB0aGUgYnVzIGZyb20gRXhhbXBsZSBOVkRJTU0gUGxhdGZv cm0NCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfYnVzICpnZXRfYnVzX2J5X3Byb3ZpZGVyKHN0cnVj dCBuZGN0bF9jdHggKmN0eCwNCgkJCWNvbnN0IGNoYXIgKnByb3ZpZGVyKQ0KCXsNCgkJc3RydWN0 IG5kY3RsX2J1cyAqYnVzOw0KDQoJCW5kY3RsX2J1c19mb3JlYWNoKGN0eCwgYnVzKQ0KCQkJaWYg KHN0cmNtcChwcm92aWRlciwgbmRjdGxfYnVzX2dldF9wcm92aWRlcihidXMpKSA9PSAwKQ0KCQkJ CXJldHVybiBidXM7DQoNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KDQoJYnVzID0gZ2V0X2J1c19ieV9w cm92aWRlcihjdHgsICJuZml0X3Rlc3QuMCIpOw0KDQoNCkxJQk5EL0xJQk5EQ1RMOiBESU1NIChO TUVNKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoZSBESU1NIGRldmljZSBwcm92 aWRlcyBhIGNoYXJhY3RlciBkZXZpY2UgZm9yIHNlbmRpbmcgY29tbWFuZHMgdG8NCmhhcmR3YXJl LCBhbmQgaXQgaXMgYSBjb250YWluZXIgZm9yIExBQkVMcy4gIElmIHRoZSBESU1NIGlzIGRlZmlu ZWQgYnkNCk5GSVQgdGhlbiBhbiBvcHRpb25hbCAnbmZpdCcgYXR0cmlidXRlIHN1Yi1kaXJlY3Rv cnkgaXMgYXZhaWxhYmxlIHRvIGFkZA0KTkZJVC1zcGVjaWZpY3MuDQoNCk5vdGUgdGhhdCB0aGUg a2VybmVsIGRldmljZSBuYW1lIGZvciAiRElNTXMiIGlzICJubWVtWCIuICBUaGUgTkZJVA0KZGVz Y3JpYmVzIHRoZXNlIGRldmljZXMgdmlhICJNZW1vcnkgRGV2aWNlIHRvIFN5c3RlbSBQaHlzaWNh bCBBZGRyZXNzDQpSYW5nZSBNYXBwaW5nIFN0cnVjdHVyZSIsIGFuZCB0aGVyZSBpcyBubyByZXF1 aXJlbWVudCB0aGF0IHRoZXkgYWN0dWFsbHkNCmJlIHBoeXNpY2FsIERJTU1zLCBzbyB3ZSB1c2Ug YSBtb3JlIGdlbmVyaWMgbmFtZS4NCg0KbGlibmQ6IERJTU0gKE5NRU0pDQoNCglzdHJ1Y3QgbmRf ZGltbSAqbmRfZGltbV9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRfYnVzLCB2b2lkICpwcm92aWRl cl9kYXRhLA0KCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcywgdW5zaWdu ZWQgbG9uZyBmbGFncywNCgkJCXVuc2lnbmVkIGxvbmcgKmRzbV9tYXNrKTsNCg0KCS9zeXMvZGV2 aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czANCgl8LS0gbm1lbTANCgl8ICAgfC0tIGF2 YWlsYWJsZV9zbG90cw0KCXwgICB8LS0gY29tbWFuZHMNCgl8ICAgfC0tIGRldg0KCXwgICB8LS0g ZGV2dHlwZQ0KCXwgICB8LS0gZHJpdmVyIC0+IC4uLy4uLy4uLy4uLy4uL2J1cy9uZC9kcml2ZXJz L25kX2RpbW0NCgl8ICAgfC0tIG1vZGFsaWFzDQoJfCAgIHwtLSBuZml0DQoJfCAgIHwgICB8LS0g ZGV2aWNlDQoJfCAgIHwgICB8LS0gZm9ybWF0DQoJfCAgIHwgICB8LS0gaGFuZGxlDQoJfCAgIHwg ICB8LS0gcGh5c19pZA0KCXwgICB8ICAgfC0tIHJldl9pZA0KCXwgICB8ICAgfC0tIHNlcmlhbA0K CXwgICB8ICAgYC0tIHZlbmRvcg0KCXwgICB8LS0gc3RhdGUNCgl8ICAgfC0tIHN1YnN5c3RlbSAt PiAuLi8uLi8uLi8uLi8uLi9idXMvbmQNCgl8ICAgYC0tIHVldmVudA0KCXwtLSBubWVtMQ0KCVsu Ll0NCg0KDQpsaWJuZGN0bDogRElNTSBlbnVtZXJhdGlvbiBleGFtcGxlDQoNCk5vdGUsIGluIHRo aXMgZXhhbXBsZSB3ZSBhcmUgYXNzdW1pbmcgTkZJVC1kZWZpbmVkIERJTU1zIHdoaWNoIGFyZQ0K aWRlbnRpZmllZCBieSBhbiAibmZpdF9oYW5kbGUiIGEgMzItYml0IHZhbHVlIHdoZXJlOg0KQml0 IDM6MCBESU1NIG51bWJlciB3aXRoaW4gdGhlIG1lbW9yeSBjaGFubmVsDQpCaXQgNzo0IG1lbW9y eSBjaGFubmVsIG51bWJlcg0KQml0IDExOjggbWVtb3J5IGNvbnRyb2xsZXIgSUQNCkJpdCAxNTox MiBzb2NrZXQgSUQgKHdpdGhpbiBzY29wZSBvZiBhIE5vZGUgY29udHJvbGxlciBpZiBub2RlIGNv bnRyb2xsZXIgaXMgcHJlc2VudCkNCkJpdCAyNzoxNiBOb2RlIENvbnRyb2xsZXIgSUQgDQpCaXQg MzE6MjggUmVzZXJ2ZWQNCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfZGltbSAqZ2V0X2RpbW1fYnlf aGFuZGxlKHN0cnVjdCBuZGN0bF9idXMgKmJ1cywNCgkgICAgICAgdW5zaWduZWQgaW50IGhhbmRs ZSkNCgl7DQoJCXN0cnVjdCBuZGN0bF9kaW1tICpkaW1tOw0KDQoJCW5kY3RsX2RpbW1fZm9yZWFj aChidXMsIGRpbW0pDQoJCQlpZiAobmRjdGxfZGltbV9nZXRfaGFuZGxlKGRpbW0pID09IGhhbmRs ZSkNCgkJCQlyZXR1cm4gZGltbTsNCg0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCgkjZGVmaW5lIERJ TU1fSEFORExFKG4sIHMsIGksIGMsIGQpIFwNCgkJKCgobiAmIDB4ZmZmKSA8PCAxNikgfCAoKHMg JiAweGYpIDw8IDEyKSB8ICgoaSAmIDB4ZikgPDwgOCkgXA0KCQkgfCAoKGMgJiAweGYpIDw8IDQp IHwgKGQgJiAweGYpKQ0KDQoJZGltbSA9IGdldF9kaW1tX2J5X2hhbmRsZShidXMsIERJTU1fSEFO RExFKDAsIDAsIDAsIDAsIDApKTsNCg0KTElCTkQvTElCTkRDVEw6IFJlZ2lvbg0KLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KDQpBIGdlbmVyaWMgUkVHSU9OIGRldmljZSBpcyByZWdpc3RlcmVkIGZv ciBlYWNoIFBNRU0gcmFuZ2Ugb3JCTEstYXBlcnR1cmUNCnNldC4gIFBlciB0aGUgZXhhbXBsZSB0 aGVyZSBhcmUgNiByZWdpb25zOiAyIFBNRU0gYW5kIDQgQkxLLWFwZXJ0dXJlDQpzZXRzIG9uIHRo ZSAibmZpdF90ZXN0LjAiIGJ1cy4gIFRoZSBwcmltYXJ5IHJvbGUgb2YgcmVnaW9ucyBhcmUgdG8g YmUgYQ0KY29udGFpbmVyIG9mICJtYXBwaW5ncyIuICBBIG1hcHBpbmcgaXMgYSB0dXBsZSBvZiA8 RElNTSwNCkRQQS1zdGFydC1vZmZzZXQsIGxlbmd0aD4uDQoNCkxJQk5EIHByb3ZpZGVzIGEgYnVp bHQtaW4gZHJpdmVyIGZvciB0aGVzZSBSRUdJT04gZGV2aWNlcy4gIFRoaXMgZHJpdmVyDQppcyBy ZXNwb25zaWJsZSBmb3IgcmVjb25jaWxpbmcgdGhlIGFsaWFzZWQgRFBBIG1hcHBpbmdzIGFjcm9z cyBhbGwNCnJlZ2lvbnMsIHBhcnNpbmcgdGhlIExBQkVMLCBpZiBwcmVzZW50LCBhbmQgdGhlbiBl bWl0dGluZyBOQU1FU1BBQ0UNCmRldmljZXMgd2l0aCB0aGUgcmVzb2x2ZWQvZXhjbHVzaXZlIERQ QS1ib3VuZGFyaWVzIGZvciB0aGUgbmRfcG1lbSBvcg0KbmRfYmxrIGRldmljZSBkcml2ZXIgdG8g Y29uc3VtZS4NCg0KSW4gYWRkaXRpb24gdG8gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiAibWFw cGluZyJzLCAiaW50ZXJsZWF2ZV93YXlzIg0KYW5kICJzaXplIiB0aGUgUkVHSU9OIGRldmljZSBh bHNvIGV4cG9ydHMgc29tZSBjb252ZW5pZW5jZSBhdHRyaWJ1dGVzLg0KIm5zdHlwZSIgaW5kaWNh dGVzIHRoZSBpbnRlZ2VyIHR5cGUgb2YgbmFtZXNwYWNlLWRldmljZSB0aGlzIHJlZ2lvbg0KZW1p dHMsICJkZXZ0eXBlIiBkdXBsaWNhdGVzIHRoZSBERVZUWVBFIHZhcmlhYmxlIHN0b3JlZCBieSB1 ZGV2IGF0IHRoZQ0KJ2FkZCcgZXZlbnQsICJtb2RhbGlhcyIgZHVwbGljYXRlcyB0aGUgTU9EQUxJ QVMgdmFyaWFibGUgc3RvcmVkIGJ5IHVkZXYNCmF0IHRoZSAnYWRkJyBldmVudCwgYW5kIGZpbmFs bHksIHRoZSBvcHRpb25hbCAic3BhX2luZGV4IiBpcyBwcm92aWRlZCBpbg0KdGhlIGNhc2Ugd2hl cmUgdGhlIHJlZ2lvbiBpcyBkZWZpbmVkIGJ5IGEgU1BBLg0KDQpsaWJuZDogcmVnaW9uDQoNCglz dHJ1Y3QgbmRfcmVnaW9uICpuZF9wbWVtX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRf YnVzLA0KCQkJc3RydWN0IG5kX3JlZ2lvbl9kZXNjICpuZHJfZGVzYyk7DQoJc3RydWN0IG5kX3Jl Z2lvbiAqbmRfYmxrX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRfYnVzLA0KCQkJc3Ry dWN0IG5kX3JlZ2lvbl9kZXNjICpuZHJfZGVzYyk7DQoNCgkvc3lzL2RldmljZXMvcGxhdGZvcm0v bmZpdF90ZXN0LjAvbmRidXMwDQoJfC0tIHJlZ2lvbjANCgl8ICAgfC0tIGF2YWlsYWJsZV9zaXpl DQoJfCAgIHwtLSBkZXZ0eXBlDQoJfCAgIHwtLSBkcml2ZXIgLT4gLi4vLi4vLi4vLi4vLi4vYnVz L25kL2RyaXZlcnMvbmRfcmVnaW9uDQoJfCAgIHwtLSBpbml0X25hbWVzcGFjZXMNCgl8ICAgfC0t IG1hcHBpbmcwDQoJfCAgIHwtLSBtYXBwaW5nMQ0KCXwgICB8LS0gbWFwcGluZ3MNCgl8ICAgfC0t IG1vZGFsaWFzDQoJfCAgIHwtLSBuYW1lc3BhY2UwLjANCgl8ICAgfC0tIG5hbWVzcGFjZV9zZWVk DQoJfCAgIHwtLSBuZml0DQoJfCAgIHwgICBgLS0gc3BhX2luZGV4DQoJfCAgIHwtLSBuc3R5cGUN Cgl8ICAgfC0tIHNldF9jb29raWUNCgl8ICAgfC0tIHNpemUNCgl8ICAgfC0tIHN1YnN5c3RlbSAt PiAuLi8uLi8uLi8uLi8uLi9idXMvbmQNCgl8ICAgYC0tIHVldmVudA0KCXwtLSByZWdpb24xDQoJ Wy4uXQ0KDQpsaWJuZGN0bDogcmVnaW9uIGVudW1lcmF0aW9uIGV4YW1wbGUNCg0KU2FtcGxlIHJl Z2lvbiByZXRyaWV2YWwgcm91dGluZXMgYmFzZWQgb24gTkZJVC11bmlxdWUgZGF0YSBsaWtlDQoi c3BhX2luZGV4IiAoaW50ZXJsZWF2ZSBzZXQgaWQpIGZvciBQTUVNIGFuZCAibmZpdF9oYW5kbGUi IChkaW1tIGlkKSBmb3INCkJMSy4NCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfcmVnaW9uICpnZXRf cG1lbV9yZWdpb25fYnlfc3BhX2luZGV4KHN0cnVjdCBuZGN0bF9idXMgKmJ1cywNCgkJCXVuc2ln bmVkIGludCBzcGFfaW5kZXgpDQoJew0KCQlzdHJ1Y3QgbmRjdGxfcmVnaW9uICpyZWdpb247DQoN CgkJbmRjdGxfcmVnaW9uX2ZvcmVhY2goYnVzLCByZWdpb24pIHsNCgkJCWlmIChuZGN0bF9yZWdp b25fZ2V0X3R5cGUocmVnaW9uKSAhPSBORF9ERVZJQ0VfUkVHSU9OX1BNRU0pDQoJCQkJY29udGlu dWU7DQoJCQlpZiAobmRjdGxfcmVnaW9uX2dldF9zcGFfaW5kZXgocmVnaW9uKSA9PSBzcGFfaW5k ZXgpDQoJCQkJcmV0dXJuIHJlZ2lvbjsNCgkJfQ0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglzdGF0 aWMgc3RydWN0IG5kY3RsX3JlZ2lvbiAqZ2V0X2Jsa19yZWdpb25fYnlfZGltbV9oYW5kbGUoc3Ry dWN0IG5kY3RsX2J1cyAqYnVzLA0KCQkJdW5zaWduZWQgaW50IGhhbmRsZSkNCgl7DQoJCXN0cnVj dCBuZGN0bF9yZWdpb24gKnJlZ2lvbjsNCg0KCQluZGN0bF9yZWdpb25fZm9yZWFjaChidXMsIHJl Z2lvbikgew0KCQkJc3RydWN0IG5kY3RsX21hcHBpbmcgKm1hcDsNCg0KCQkJaWYgKG5kY3RsX3Jl Z2lvbl9nZXRfdHlwZShyZWdpb24pICE9IE5EX0RFVklDRV9SRUdJT05fQkxPQ0spDQoJCQkJY29u dGludWU7DQoJCQluZGN0bF9tYXBwaW5nX2ZvcmVhY2gocmVnaW9uLCBtYXApIHsNCgkJCQlzdHJ1 Y3QgbmRjdGxfZGltbSAqZGltbSA9IG5kY3RsX21hcHBpbmdfZ2V0X2RpbW0obWFwKTsNCg0KCQkJ CWlmIChuZGN0bF9kaW1tX2dldF9oYW5kbGUoZGltbSkgPT0gaGFuZGxlKQ0KCQkJCQlyZXR1cm4g cmVnaW9uOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KDQpXaHkgTm90IEVuY29k ZSB0aGUgUmVnaW9uIFR5cGUgaW50byB0aGUgUmVnaW9uIE5hbWU/DQotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkF0IGZpcnN0IGdsYW5jZSBp dCBzZWVtcyBzaW5jZSBORklUIGRlZmluZXMganVzdCBQTUVNIGFuZCBCTEsgaW50ZXJmYWNlDQp0 eXBlcyB0aGF0IHdlIHNob3VsZCBzaW1wbHkgbmFtZSBSRUdJT04gZGV2aWNlcyB3aXRoIHNvbWV0 aGluZyBkZXJpdmVkDQpmcm9tIHRob3NlIHR5cGUgbmFtZXMuICBIb3dldmVyLCB0aGUgTkQgc3Vi c3lzdGVtIGV4cGxpY2l0bHkga2VlcHMgdGhlDQpSRUdJT04gbmFtZSBnZW5lcmljIGFuZCBleHBl Y3RzIHVzZXJzcGFjZSB0byBhbHdheXMgY29uc2lkZXIgdGhlDQpyZWdpb24tYXR0cmlidXRlcyBm b3IgNCByZWFzb25zOg0KDQogICAgMS4gVGhlcmUgYXJlIGFscmVhZHkgbW9yZSB0aGFuIHR3byBS RUdJT04gYW5kICJuYW1lc3BhY2UiIHR5cGVzLiAgRm9yDQogICAgUE1FTSB0aGVyZSBhcmUgdHdv IHN1YnR5cGVzLiAgQXMgbWVudGlvbmVkIHByZXZpb3VzbHkgd2UgaGF2ZSBQTUVNIHdoZXJlDQog ICAgdGhlIGNvbnN0aXR1ZW50IERJTU0gZGV2aWNlcyBhcmUga25vd24gYW5kIGFub255bW91cyBQ TUVNLiAgRm9yIEJMSw0KICAgIHJlZ2lvbnMgdGhlIE5GSVQgc3BlY2lmaWNhdGlvbiBhbHJlYWR5 IGFudGljaXBhdGVzIHZlbmRvciBzcGVjaWZpYw0KICAgIGltcGxlbWVudGF0aW9ucy4gIFRoZSBl eGFjdCBkaXN0aW5jdGlvbiBvZiB3aGF0IGEgcmVnaW9uIGNvbnRhaW5zIGlzIGluDQogICAgdGhl IHJlZ2lvbi1hdHRyaWJ1dGVzIG5vdCB0aGUgcmVnaW9uLW5hbWUgb3IgdGhlIHJlZ2lvbi1kZXZ0 eXBlLg0KICAgIA0KICAgIDIuIEEgcmVnaW9uIHdpdGggemVybyBjaGlsZC1uYW1lc3BhY2VzIGlz IGEgcG9zc2libGUgY29uZmlndXJhdGlvbi4gIEZvcg0KICAgIGV4YW1wbGUsIHRoZSBORklUIGFs bG93cyBmb3IgYSBEQ1IgdG8gYmUgcHVibGlzaGVkIHdpdGhvdXQgYQ0KICAgIGNvcnJlc3BvbmRp bmcgQkxLLWFwZXJ0dXJlLiAgVGhpcyBlcXVhdGVzIHRvIGEgRElNTSB0aGF0IGNhbiBvbmx5IGFj Y2VwdA0KICAgIGNvbnRyb2wvY29uZmlndXJhdGlvbiBtZXNzYWdlcywgYnV0IG5vIGkvbyB0aHJv dWdoIGEgZGVzY2VuZGFudCBibG9jaw0KICAgIGRldmljZS4gIEFnYWluLCB0aGlzICJ0eXBlIiBp cyBhZHZlcnRpc2VkIGluIHRoZSBhdHRyaWJ1dGVzICgnbWFwcGluZ3MnDQogICAgPT0gMCkgYW5k IHRoZSBuYW1lIGRvZXMgbm90IHRlbGwgeW91IG11Y2guDQogICAgDQogICAgMy4gV2hhdCBpZiBh IHRoaXJkIG1ham9yIGludGVyZmFjZSB0eXBlIGFyaXNlcyBpbiB0aGUgZnV0dXJlPyAgT3V0c2lk ZQ0KICAgIG9mIHZlbmRvciBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMsIGl0J3Mgbm90IGRpZmZp Y3VsdCB0byBlbnZpc2lvbiBhDQogICAgdGhpcmQgY2xhc3Mgb2YgaW50ZXJmYWNlIHR5cGUgYmV5 b25kIEJMSyBhbmQgUE1FTS4gIFdpdGggYSBnZW5lcmljIG5hbWUNCiAgICBmb3IgdGhlIFJFR0lP TiBsZXZlbCBvZiB0aGUgZGV2aWNlLWhpZXJhcmNoeSBvbGQgdXNlcnNwYWNlDQogICAgaW1wbGVt ZW50YXRpb25zIGNhbiBzdGlsbCBtYWtlIHNlbnNlIG9mIG5ldyBrZXJuZWwgYWR2ZXJ0aXNlZA0K ICAgIHJlZ2lvbi10eXBlcy4gIFVzZXJzcGFjZSBjYW4gYWx3YXlzIHJlbHkgb24gdGhlIGdlbmVy aWMgcmVnaW9uDQogICAgYXR0cmlidXRlcyBsaWtlICJtYXBwaW5ncyIsICJzaXplIiwgZXRjIGFu ZCB0aGUgZXhwZWN0ZWQgY2hpbGQgZGV2aWNlcw0KICAgIG5hbWVkICJuYW1lc3BhY2UiLiAgVGhp cyBnZW5lcmljIGZvcm1hdCBvZiB0aGUgZGV2aWNlLW1vZGVsIGhpZXJhcmNoeQ0KICAgIGFsbG93 cyB0aGUgTElCTkQgYW5kIExJQk5EQ1RMIGltcGxlbWVudGF0aW9ucyB0byBiZSBtb3JlIHVuaWZv cm0gYW5kDQogICAgZnV0dXJlLXByb29mLg0KICAgIA0KICAgIDQuIFRoZXJlIGFyZSBtb3JlIHJv YnVzdCBtZWNoYW5pc21zIGZvciBkZXRlcm1pbmluZyB0aGUgbWFqb3IgdHlwZSBvZiBhDQogICAg cmVnaW9uIHRoYW4gYSBkZXZpY2UgbmFtZS4gIFNlZSB0aGUgbmV4dCBzZWN0aW9uLCBIb3cgRG8g SSBEZXRlcm1pbmUgdGhlDQogICAgTWFqb3IgVHlwZSBvZiBhIFJlZ2lvbj8NCg0KSG93IERvIEkg RGV0ZXJtaW5lIHRoZSBNYWpvciBUeXBlIG9mIGEgUmVnaW9uPw0KLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpPdXRzaWRlIG9mIHRoZSBibGFua2V0IHJl Y29tbWVuZGF0aW9uIG9mICJ1c2UgbGlibmRjdGwiLCBvciBzaW1wbHkNCmxvb2tpbmcgYXQgdGhl IGtlcm5lbCBoZWFkZXIgKC91c3IvaW5jbHVkZS9saW51eC9uZGN0bC5oKSB0byBkZWNvZGUgdGhl DQoibnN0eXBlIiBpbnRlZ2VyIGF0dHJpYnV0ZSwgaGVyZSBhcmUgc29tZSBvdGhlciBvcHRpb25z Lg0KDQogICAgMS4gbW9kdWxlIGFsaWFzIGxvb2t1cDoNCiAgICANCiAgICBUaGUgd2hvbGUgcG9p bnQgb2YgcmVnaW9uL25hbWVzcGFjZSBkZXZpY2UgdHlwZSBkaWZmZXJlbnRpYXRpb24gaXMgdG8N CiAgICBkZWNpZGUgd2hpY2ggYmxvY2stZGV2aWNlIGRyaXZlciB3aWxsIGF0dGFjaCB0byBhIGdp dmVuIExJQk5EIG5hbWVzcGFjZS4NCiAgICBPbmUgY2FuIHNpbXBseSB1c2UgdGhlIG1vZGFsaWFz IHRvIGxvb2t1cCB0aGUgcmVzdWx0aW5nIG1vZHVsZS4gIEl0J3MNCiAgICBpbXBvcnRhbnQgdG8g bm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHJvYnVzdCBpbiB0aGUgcHJlc2VuY2Ugb2YgYQ0KICAg IHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgZG93biB0aGUgcm9hZC4gIElmIGEgdmVuZG9yLXNwZWNp ZmljDQogICAgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gc3VwcGxhbnQgdGhlIHN0YW5kYXJkIG5k X2JsayBkcml2ZXIgaXQgY2FuIHdpdGgNCiAgICBtaW5pbWFsIGltcGFjdCB0byB0aGUgcmVzdCBv ZiBMSUJORC4NCiAgICANCiAgICBJbiBmYWN0LCBhIHZlbmRvciBtYXkgYWxzbyB3YW50IHRvIGhh dmUgYSB2ZW5kb3Itc3BlY2lmaWMgcmVnaW9uLWRyaXZlcg0KICAgIChvdXRzaWRlIG9mIG5kX3Jl Z2lvbikuICBGb3IgZXhhbXBsZSwgaWYgYSB2ZW5kb3IgZGVmaW5lZCBpdHMgb3duIExBQkVMDQog ICAgZm9ybWF0IGl0IHdvdWxkIG5lZWQgaXRzIG93biByZWdpb24gZHJpdmVyIHRvIHBhcnNlIHRo YXQgTEFCRUwgYW5kIGVtaXQNCiAgICB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZXMuICBUaGUgb3V0 cHV0IGZyb20gbW9kdWxlIHJlc29sdXRpb24gaXMgbW9yZQ0KICAgIGFjY3VyYXRlIHRoYW4gYSBy ZWdpb24tbmFtZSBvciByZWdpb24tZGV2dHlwZS4NCiAgICANCiAgICAyLiB1ZGV2Og0KICAgIA0K ICAgIFRoZSBrZXJuZWwgImRldnR5cGUiIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHVkZXYgZGF0YWJh c2UNCiAgICAjIHVkZXZhZG0gaW5mbyAtLXBhdGg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0 LjAvbmRidXMwL3JlZ2lvbjAgDQogICAgUDogL2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAv bmRidXMwL3JlZ2lvbjANCiAgICBFOiBERVZQQVRIPS9kZXZpY2VzL3BsYXRmb3JtL25maXRfdGVz dC4wL25kYnVzMC9yZWdpb24wDQogICAgRTogREVWVFlQRT1uZF9wbWVtDQogICAgRTogTU9EQUxJ QVM9bmQ6dDINCiAgICBFOiBTVUJTWVNURU09bmQNCiAgICANCiAgICAjIHVkZXZhZG0gaW5mbyAt LXBhdGg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAvbmRidXMwL3JlZ2lvbjQNCiAgICBQ OiAvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czAvcmVnaW9uNA0KICAgIEU6IERF VlBBVEg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAvbmRidXMwL3JlZ2lvbjQNCiAgICBF OiBERVZUWVBFPW5kX2Jsaw0KICAgIEU6IE1PREFMSUFTPW5kOnQzDQogICAgRTogU1VCU1lTVEVN PW5kDQogICAgDQogICAgLi4uYW5kIGlzIGF2YWlsYWJsZSBhcyBhIHJlZ2lvbiBhdHRyaWJ1dGUs IGJ1dCBrZWVwIGluIG1pbmQgdGhhdCB0aGUNCiAgICAiZGV2dHlwZSIgZG9lcyBub3QgaW5kaWNh dGUgc3ViLXR5cGUgdmFyaWF0aW9ucyBhbmQgc2NyaXB0cyBzaG91bGQNCiAgICByZWFsbHkgYmUg dW5kZXJzdGFuZGluZyB0aGUgb3RoZXIgYXR0cmlidXRlcy4NCiAgICANCiAgICAzLiB0eXBlIHNw ZWNpZmljIGF0dHJpYnV0ZXM6DQogICAgDQogICAgQXMgaXQgY3VycmVudGx5IHN0YW5kcyBhIEJM Sy1hcGVydHVyZSByZWdpb24gd2lsbCBuZXZlciBoYXZlIGENCiAgICAibmZpdC9zcGFfaW5kZXgi IGF0dHJpYnV0ZSwgYnV0IG5laXRoZXIgd2lsbCBhIG5vbi1ORklUIFBNRU0gcmVnaW9uLiAgQQ0K ICAgIEJMSyByZWdpb24gd2l0aCBhICJtYXBwaW5ncyIgdmFsdWUgb2YgMCBpcywgYXMgbWVudGlv bmVkIGFib3ZlLCBhIERJTU0NCiAgICB0aGF0IGRvZXMgbm90IGFsbG93IEkvTy4gIEEgUE1FTSBy ZWdpb24gd2l0aCBhICJtYXBwaW5ncyIgdmFsdWUgb2YgemVybw0KICAgIGlzIGEgc2ltcGxlIHN5 c3RlbS1waHlzaWNhbC1hZGRyZXNzIHJhbmdlLg0KIA0KDQpMSUJORC9MSUJORENUTDogTmFtZXNw YWNlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgUkVHSU9OLCBhZnRlciByZXNvbHZp bmcgRFBBIGFsaWFzaW5nIGFuZCBMQUJFTCBzcGVjaWZpZWQgYm91bmRhcmllcywNCnN1cmZhY2Vz IG9uZSBvciBtb3JlICJuYW1lc3BhY2UiIGRldmljZXMuICBUaGUgYXJyaXZhbCBvZiBhICJuYW1l c3BhY2UiDQpkZXZpY2UgY3VycmVudGx5IHRyaWdnZXJzIGVpdGhlciB0aGUgbmRfYmxrIG9yIG5k X3BtZW0gZHJpdmVyIHRvIGxvYWQNCmFuZCByZWdpc3RlciBhIGRpc2svYmxvY2sgZGV2aWNlLg0K DQpsaWJuZDogbmFtZXNwYWNlDQpIZXJlIGlzIGEgc2FtcGxlIGxheW91dCBmcm9tIHRoZSB0aHJl ZSBtYWpvciB0eXBlcyBvZiBOQU1FU1BBQ0Ugd2hlcmUNCm5hbWVzcGFjZTAuMCByZXByZXNlbnRz IERJTU0taW5mby1iYWNrZWQgUE1FTSAobm90ZSB0aGF0IGl0IGhhcyBhICd1dWlkJw0KYXR0cmli dXRlKSwgbmFtZXNwYWNlMi4wIHJlcHJlc2VudHMgYSBCTEsgbmFtZXNwYWNlIChub3RlIGl0IGhh cyBhDQonc2VjdG9yX3NpemUnIGF0dHJpYnV0ZSkgdGhhdCwgYW5kIG5hbWVzcGFjZTYuMCByZXBy ZXNlbnRzIGFuIGFub255bW91cw0KUE1FTSBuYW1lc3BhY2UgKG5vdGUgdGhhdCBoYXMgbm8gJ3V1 aWQnIGF0dHJpYnV0ZSBkdWUgdG8gbm90IHN1cHBvcnQgYQ0KTEFCRUwpLg0KDQoJL3N5cy9kZXZp Y2VzL3BsYXRmb3JtL25maXRfdGVzdC4wL25kYnVzMC9yZWdpb24wL25hbWVzcGFjZTAuMA0KCXwt LSBhbHRfbmFtZQ0KCXwtLSBkZXZ0eXBlDQoJfC0tIGRwYV9leHRlbnRzDQoJfC0tIG1vZGFsaWFz DQoJfC0tIHJlc291cmNlDQoJfC0tIHNpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4uLy4uLy4u Ly4uLy4uL2J1cy9uZA0KCXwtLSB0eXBlDQoJfC0tIHVldmVudA0KCWAtLSB1dWlkDQoJL3N5cy9k ZXZpY2VzL3BsYXRmb3JtL25maXRfdGVzdC4wL25kYnVzMC9yZWdpb24yL25hbWVzcGFjZTIuMA0K CXwtLSBhbHRfbmFtZQ0KCXwtLSBkZXZ0eXBlDQoJfC0tIGRwYV9leHRlbnRzDQoJfC0tIG1vZGFs aWFzDQoJfC0tIHNlY3Rvcl9zaXplDQoJfC0tIHNpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4u Ly4uLy4uLy4uLy4uL2J1cy9uZA0KCXwtLSB0eXBlDQoJfC0tIHVldmVudA0KCWAtLSB1dWlkDQoJ L3N5cy9kZXZpY2VzL3BsYXRmb3JtL25maXRfdGVzdC4xL25kYnVzMS9yZWdpb242L25hbWVzcGFj ZTYuMA0KCXwtLSBibG9jaw0KCXwgICBgLS0gcG1lbTANCgl8LS0gZGV2dHlwZQ0KCXwtLSBkcml2 ZXIgLT4gLi4vLi4vLi4vLi4vLi4vLi4vYnVzL25kL2RyaXZlcnMvcG1lbQ0KCXwtLSBtb2RhbGlh cw0KCXwtLSByZXNvdXJjZQ0KCXwtLSBzaXplDQoJfC0tIHN1YnN5c3RlbSAtPiAuLi8uLi8uLi8u Li8uLi8uLi9idXMvbmQNCgl8LS0gdHlwZQ0KCWAtLSB1ZXZlbnQNCg0KbGlibmRjdGw6IG5hbWVz cGFjZSBlbnVtZXJhdGlvbiBleGFtcGxlDQpOYW1lc3BhY2VzIGFyZSBpbmRleGVkIHJlbGF0aXZl IHRvIHRoZWlyIHBhcmVudCByZWdpb24sIGV4YW1wbGUgYmVsb3cuICBUaGVzZSBpbmRleGVzIGFy ZSBtb3N0bHkgc3RhdGljIGZyb20gYm9vdCB0byBib290LCBidXQgc3Vic3lzdGVtIG1ha2VzIG5v IGd1YXJhbnRlZXMgaW4gdGhpcyByZWdhcmQuICBGb3IgYSBzdGF0aWMgbmFtZXNwYWNlIGlkZW50 aWZpZXIgdXNlIGl0cyAndXVpZCcgYXR0cmlidXRlLg0KDQpzdGF0aWMgc3RydWN0IG5kY3RsX25h bWVzcGFjZSAqZ2V0X25hbWVzcGFjZV9ieV9pZChzdHJ1Y3QgbmRjdGxfcmVnaW9uICpyZWdpb24s DQogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkKQ0Kew0KICAgICAgICBzdHJ1Y3QgbmRj dGxfbmFtZXNwYWNlICpuZG5zOw0KDQogICAgICAgIG5kY3RsX25hbWVzcGFjZV9mb3JlYWNoKHJl Z2lvbiwgbmRucykNCiAgICAgICAgICAgICAgICBpZiAobmRjdGxfbmFtZXNwYWNlX2dldF9pZChu ZG5zKSA9PSBpZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZG5zOw0KDQogICAg ICAgIHJldHVybiBOVUxMOw0KfQ0KDQpsaWJuZGN0bDogbmFtZXNwYWNlIGNyZWF0aW9uIGV4YW1w bGUNCklkbGUgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBrZXJu ZWwgaWYgYSBnaXZlbiByZWdpb24gaGFzIGVub3VnaCBhdmFpbGFibGUgY2FwYWNpdHkgdG8gY3Jl YXRlIGEgbmV3IG5hbWVzcGFjZS4gIE5hbWVzcGFjZSBpbnN0YW50aWF0aW9uIGludm9sdmVzIGZp bmRpbmcgYW4gaWRsZSBuYW1lc3BhY2UgYW5kIGNvbmZpZ3VyaW5nIGl0LiAgRm9yIHRoZSBtb3N0 IHBhcnQgdGhlIHNldHRpbmcgb2YgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgY2FuIG9jY3VyIGluIGFu eSBvcmRlciwgdGhlIG9ubHkgY29uc3RyYWludCBpcyB0aGF0ICd1dWlkJyBtdXN0IGJlIHNldCBi ZWZvcmUgJ3NpemUnLiAgVGhpcyBlbmFibGVzIHRoZSBrZXJuZWwgdG8gdHJhY2sgRFBBIGFsbG9j YXRpb25zIGludGVybmFsbHkgd2l0aCBhIHN0YXRpYyBpZGVudGlmaWVyLg0KDQpzdGF0aWMgaW50 IGNvbmZpZ3VyZV9uYW1lc3BhY2Uoc3RydWN0IG5kY3RsX3JlZ2lvbiAqcmVnaW9uLA0KICAgICAg ICAgICAgICAgIHN0cnVjdCBuZGN0bF9uYW1lc3BhY2UgKm5kbnMsDQogICAgICAgICAgICAgICAg c3RydWN0IG5hbWVzcGFjZV9wYXJhbWV0ZXJzICpwYXJhbWV0ZXJzKQ0Kew0KICAgICAgICBjaGFy IGRldm5hbWVbNTBdOw0KDQogICAgICAgIHNucHJpbnRmKGRldm5hbWUsIHNpemVvZihkZXZuYW1l KSwgIm5hbWVzcGFjZSVkLiVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5kY3RsX3JlZ2lv bl9nZXRfaWQocmVnaW9uKSwgcGFyYW1hdGVycy0+aWQpOw0KDQogICAgICAgIG5kY3RsX25hbWVz cGFjZV9zZXRfYWx0X25hbWUobmRucywgZGV2bmFtZSk7DQogICAgICAgIC8qICd1dWlkJyBtdXN0 IGJlIHNldCBwcmlvciB0byBzZXR0aW5nIHNpemUhICovDQogICAgICAgIG5kY3RsX25hbWVzcGFj ZV9zZXRfdXVpZChuZG5zLCBwYXJhbWF0ZXJzLT51dWlkKTsNCiAgICAgICAgbmRjdGxfbmFtZXNw YWNlX3NldF9zaXplKG5kbnMsIHBhcmFtYXRlcnMtPnNpemUpOw0KICAgICAgICAvKiB1bmxpa2Ug cG1lbSBuYW1lc3BhY2VzLCBibGsgbmFtZXNwYWNlcyBoYXZlIGEgc2VjdG9yIHNpemUgKi8NCiAg ICAgICAgaWYgKHBhcmFtZXRlcnMtPmxiYXNpemUpDQogICAgICAgICAgICAgICAgbmRjdGxfbmFt ZXNwYWNlX3NldF9zZWN0b3Jfc2l6ZShuZG5zLCBwYXJhbWV0ZXJzLT5sYmFzaXplKTsNCiAgICAg ICAgbmRjdGxfbmFtZXNwYWNlX2VuYWJsZShuZG5zKTsNCn0NCg0KDQpXaHkgdGhlIFRlcm0gIm5h bWVzcGFjZSI/DQoNCiAgICAxLiBXaHkgbm90ICJ2b2x1bWUiIGZvciBpbnN0YW5jZT8gICJ2b2x1 bWUiIHJhbiB0aGUgcmlzayBvZiBjb25mdXNpbmcgTkQNCiAgICBhcyBhIHZvbHVtZSBtYW5hZ2Vy IGxpa2UgZGV2aWNlLW1hcHBlci4NCiAgICANCiAgICAyLiBUaGUgdGVybSBvcmlnaW5hdGVkIHRv IGRlc2NyaWJlIHRoZSBzdWItZGV2aWNlcyB0aGF0IGNhbiBiZSBjcmVhdGVkDQogICAgd2l0aGlu IGEgTlZNRSBjb250cm9sbGVyIChzZWUgdGhlIG52bWUgc3BlY2lmaWNhdGlvbjoNCiAgICBodHRw Oi8vd3d3Lm52bWV4cHJlc3Mub3JnL3NwZWNpZmljYXRpb25zLyksIGFuZCBORklUIG5hbWVzcGFj ZXMgYXJlDQogICAgbWVhbnQgdG8gcGFyYWxsZWwgdGhlIGNhcGFiaWxpdGllcyBhbmQgY29uZmln dXJhYmlsaXR5IG9mDQogICAgTlZNRS1uYW1lc3BhY2VzLg0KDQoNCkxJQk5EL0xJQk5EQ1RMOiBC bG9jayBUcmFuc2xhdGlvbiBUYWJsZSAiYnR0Ig0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgQlRUIChkZXNpZ24gZG9jdW1lbnQ6IGh0dHA6Ly9wbWVt LmlvLzIwMTQvMDkvMjMvYnR0Lmh0bWwpIGlzIGEgc3RhY2tlZA0KYmxvY2sgZGV2aWNlIGRyaXZl ciB0aGF0IGZyb250cyBlaXRoZXIgdGhlIHdob2xlIGJsb2NrIGRldmljZSBvciBhDQpwYXJ0aXRp b24gb2YgYSBibG9jayBkZXZpY2UgZW1pdHRlZCBieSBlaXRoZXIgYSBQTUVNIG9yIEJMSyBOQU1F U1BBQ0UuDQoNCmxpYm5kOiBidHQgbGF5b3V0DQpFdmVyeSBidXMgd2lsbCBzdGFydCBvdXQgd2l0 aCBhdCBsZWFzdCBvbmUgQlRUIGRldmljZSB3aGljaCBpcyB0aGUgc2VlZA0KZGV2aWNlLiAgVG8g YWN0aXZhdGUgaXQgc2V0IHRoZSAiYmFja2luZ19kZXYiLCAidXVpZCIsIGFuZCAic2VjdG9yX3Np emUiDQphdHRyaWJ1dGVzIGFuZCB0aGVuIGJpbmQgdGhlIGRldmljZSB0byB0aGUgbmRfYnR0IGRy aXZlci4NCg0KCS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMS9uZGJ1czAvYnR0MC8N Cgl8LS0gYmFja2luZ19kZXYNCgl8LS0gZGVsZXRlDQoJfC0tIGRldnR5cGUNCgl8LS0gbW9kYWxp YXMNCgl8LS0gc2VjdG9yX3NpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4uLy4uLy4uLy4uL2J1 cy9uZA0KCXwtLSB1ZXZlbnQNCglgLS0gdXVpZA0KDQpsaWJuZGN0bDogYnR0IGNyZWF0aW9uIGV4 YW1wbGUNClNpbWlsYXIgdG8gbmFtZXNwYWNlcyBhbiBpZGxlIEJUVCBkZXZpY2UgaXMgYXV0b21h dGljYWxseSBjcmVhdGVkIHBlcg0KYnVzLiAgRWFjaCB0aW1lIHRoaXMgInNlZWQiIGJ0dCBkZXZp Y2UgaXMgY29uZmlndXJlZCBhbmQgZW5hYmxlZCBhIG5ldw0Kc2VlZCBpcyBjcmVhdGVkLiAgQ3Jl YXRpbmcgYSBCVFQgY29uZmlndXJhdGlvbiBpbnZvbHZlcyB0d28gc3RlcHMgb2YNCmZpbmRpbmcg YW5kIGlkbGUgQlRUIGFuZCBhc3NpZ25pbmcgaXQgdG8gZnJvbnQgYSBQTUVNIG9yIEJMSyBuYW1l c3BhY2UuDQoNCglzdGF0aWMgc3RydWN0IG5kY3RsX2J0dCAqZ2V0X2lkbGVfYnR0KHN0cnVjdCBu ZGN0bF9idXMgKmJ1cykNCgl7DQoJCXN0cnVjdCBuZGN0bF9idHQgKmJ0dDsNCg0KCQluZGN0bF9i dHRfZm9yZWFjaChidXMsIGJ0dCkNCgkJCWlmICghbmRjdGxfYnR0X2lzX2VuYWJsZWQoYnR0KSAm JiAhbmRjdGxfYnR0X2lzX2NvbmZpZ3VyZWQoYnR0KSkNCgkJCQlyZXR1cm4gYnR0Ow0KDQoJCXJl dHVybiBOVUxMOw0KCX0NCg0KCXN0YXRpYyBpbnQgY29uZmlndXJlX2J0dChzdHJ1Y3QgbmRjdGxf YnVzICpidXMsIHN0cnVjdCBidHRfcGFyYW1ldGVycyAqcGFyYW1ldGVycykNCgl7DQoJCWJ0dCA9 IGdldF9pZGxlX2J0dChidXMpOw0KDQoJCXNwcmludGYoYmRldnBhdGgsICIvZGV2LyVzIiwNCgkJ CQluZGN0bF9uYW1lc3BhY2VfZ2V0X2Jsb2NrX2RldmljZShwYXJhbWV0ZXJzLT5uZG5zKSk7DQoJ CW5kY3RsX2J0dF9zZXRfdXVpZChidHQsIHBhcmFtZXRlcnMtPnV1aWQpOw0KCQluZGN0bF9idHRf c2V0X3NlY3Rvcl9zaXplKGJ0dCwgcGFyYW1ldGVycy0+c2VjdG9yX3NpemUpOw0KCQluZGN0bF9i dHRfc2V0X2JhY2tpbmdfZGV2KGJ0dCwgcGFyYW1ldGVzLT5iZGV2cGF0aCk7DQoJCW5kY3RsX2J0 dF9lbmFibGUoYnR0KTsNCgl9DQoNCk9uY2UgaW5zdGFudGlhdGVkIGEgIm5kX2J0dCIgbGluayB3 aWxsIGJlIGNyZWF0ZWQgdW5kZXIgdGhlDQoiYmFja2luZ19kZXYiIChwbWVtMCkgYmxvY2sgZGV2 aWNlOg0KDQoJL3N5cy9ibG9jay9wbWVtMC8NCgl8LS0gYWxpZ25tZW50X29mZnNldA0KCXwtLSBi ZGkgLT4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmlydHVhbC9iZGkvMjU5OjANCgl8LS0gY2FwYWJp bGl0eQ0KCXwtLSBkZXYNCgl8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL25hbWVzcGFjZTAuMA0KCXwt LSBkaXNjYXJkX2FsaWdubWVudA0KCXwtLSBleHRfcmFuZ2UNCgl8LS0gaG9sZGVycw0KCXwtLSBp bmZsaWdodA0KCXwtLSBuZF9idHQgLT4gLi4vLi4vLi4vLi4vYnR0MA0KDQouLi5hbmQgYSBuZXcg aW5hY3RpdmUgc2VlZCBkZXZpY2Ugd2lsbCBhcHBlYXIgb24gdGhlIGJ1cy4NCg0KT25jZSBhICJi YWNraW5nX2RldiIgaXMgZGlzYWJsZWQgaXRzIGFzc29jaWF0ZWQgQlRUIHdpbGwgYmUNCmF1dG9t YXRpY2FsbHkgZGVsZXRlZC4gIFRoaXMgZGVsZXRpb24gaXMgb25seSBhdCB0aGUgZGV2aWNlIG1v ZGVsIGxldmVsLg0KSW4gb3JkZXIgdG8gZGVzdHJveSBhIEJUVCB0aGUgImluZm8gYmxvY2siIG5l ZWRzIHRvIGJlIGRlc3Ryb3llZC4NCg0KDQpTdW1tYXJ5IExJQk5EQ1RMIERpYWdyYW0NCi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpGb3IgdGhlIGdpdmVuIGV4YW1wbGUgYWJvdmUsIGhlcmUg aXMgdGhlIHZpZXcgb2YgdGhlIG9iamVjdHMgYXMgc2VlbiBieSB0aGUgTElCTkRDVEwgYXBpOg0K ICAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHxDVFh8ICAgICstLS0tLS0tLS0rICAg Ky0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQogICAgICAgICAgICAr LSstKyAgKy0+IFJFR0lPTjAgKy0tLT4gTkFNRVNQQUNFMC4wICstLT4gUE1FTTggInBtMC4wIiB8 ICAgICAgIA0KICAgICAgICAgICAgICB8ICAgIHwgKy0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0t LS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICANCistLS0tLS0tKyAgICAgfCAgICB8ICstLS0t LS0tLS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQp8IERJ TU0wIDwtKyAgIHwgICAgKy0+IFJFR0lPTjEgKy0tLT4gTkFNRVNQQUNFMS4wICstLT4gUE1FTTYg InBtMS4wIiB8ICAgICAgIA0KKy0tLS0tLS0rIHwgICB8ICAgIHwgKy0tLS0tLS0tLSsgICArLS0t LS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICANCnwgRElNTTEgPC0rICstdi0t KyB8ICstLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAg ICAgDQorLS0tLS0tLSsgKy0rQlVTMCstLS0+IFJFR0lPTjIgKy0rLT4gTkFNRVNQQUNFMi4wICst LT4gTkQ2ICAiYmxrMi4wIiB8ICAgICAgIA0KfCBESU1NMiA8LSsgKy0tLS0rIHwgKy0tLS0tLS0t LSsgfCArLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCistLS0tLS0t KyB8ICAgICAgICB8ICAgICAgICAgICAgICstPiBOQU1FU1BBQ0UyLjEgKy0tPiBORDUgICJibGsy LjEiIHwgQlRUMiB8DQp8IERJTU0zIDwtKyAgICAgICAgfCAgICAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KKy0tLS0tLS0rICAgICAgICAgIHwg Ky0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAN CiAgICAgICAgICAgICAgICAgICArLT4gUkVHSU9OMyArLSstPiBOQU1FU1BBQ0UzLjAgKy0tPiBO RDQgICJibGszLjAiIHwgICAgICAgDQogICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0tKyB8 ICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KICAgICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICAgKy0+IE5BTUVTUEFDRTMuMSArLS0+IE5EMyAgImJsazMuMSIg fCBCVFQxIHwNCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0t LS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICAgICAgICAgICAgICAgICAgfCArLS0t LS0tLS0tKyAgICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0rICAgICAgIA0KICAg ICAgICAgICAgICAgICAgICstPiBSRUdJT040ICstLS0+IE5BTUVTUEFDRTQuMCArLS0+IE5EMiAg ImJsazQuMCIgfCAgICAgICANCiAgICAgICAgICAgICAgICAgICB8ICstLS0tLS0tLS0rICAgKy0t LS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQogICAgICAgICAgICAgICAg ICAgfCArLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0t LS0tKw0KICAgICAgICAgICAgICAgICAgICstPiBSRUdJT041ICstLS0+IE5BTUVTUEFDRTUuMCAr LS0+IE5EMSAgImJsazUuMCIgfCBCVFQwIHwNCiAgICAgICAgICAgICAgICAgICAgICstLS0tLS0t LS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0rDQoNCg0KDQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: "Williams, Dan J" Subject: Re: [PATCH v2 00/20] libnd: non-volatile memory device support Date: Fri, 8 May 2015 06:31:15 +0000 Message-ID: <1431066672.30434.4.camel@intel.com> References: <20150428181203.35812.60474.stgit@dwillia2-desk3.amr.corp.intel.com> <2127273.OhQ7MIpEUu@vostro.rjw.lan> <9076255.5kM0LKa3dN@vostro.rjw.lan> In-Reply-To: <9076255.5kM0LKa3dN@vostro.rjw.lan> Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: <91A75B7C979A1D4084CFEF50B7872239@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org To: "rjw@rjwysocki.net" Cc: "mingo@kernel.org" , "linux-kernel@vger.kernel.org" , "nicholas.w.moulin@linux.intel.com" , "neilb@suse.de" , "jmoyer@redhat.com" , "tglx@linutronix.de" , "torvalds@linux-foundation.org" , "hch@lst.de" , "Moore, Robert" , "Wysocki, Rafael J" , "hpa@zytor.com" , "linux-nvdimm@lists.01.org" , "axboe@fb.com" , "vishal.l.verma@linux.intel.com" , "willy@linux.intel.com" , "bp@alien8.de" , "ross.zwisler@linux.intel.com" , "luto@amacapital.net" , "gregkh@linuxfoundation.org" , "boaz@plexistor.com" , "david@fromorbit.com" , "akpm@linux-foundation.org" , "linux-acpi@vger.kernel.org" List-ID: T24gVHVlLCAyMDE1LTA1LTA1IGF0IDAyOjA2ICswMjAwLCBSYWZhZWwgSi4gV3lzb2NraSB3cm90 ZToNCj4gT24gVHVlc2RheSwgQXByaWwgMjgsIDIwMTUgMDY6MjI6MDUgUE0gRGFuIFdpbGxpYW1z IHdyb3RlOg0KPiA+IE9uIFR1ZSwgQXByIDI4LCAyMDE1IGF0IDU6MjUgUE0sIFJhZmFlbCBKLiBX eXNvY2tpIDxyandAcmp3eXNvY2tpLm5ldD4gd3JvdGU6DQo+ID4gPiBPbiBUdWVzZGF5LCBBcHJp bCAyOCwgMjAxNSAwMjoyNDoxMiBQTSBEYW4gV2lsbGlhbXMgd3JvdGU6DQo+ID4gPj4gQ2hhbmdl cyBzaW5jZSB2MSBbMV06IEluY29ycG9yYXRlcyBmZWVkYmFjayByZWNlaXZlZCBwcmlvciB0byBB cHJpbCAyNC4NCj4gPiA+Pg0KPiANCj4gW2N1dF0NCj4gDQo+ID4gPg0KPiA+ID4gSSdtIHdvbmRl cmluZyB3aGF0J3Mgd3Jvbmcgd2l0aCBDQ2luZyBhbGwgb2YgdGhlIHNlcmllcyB0byBsaW51eC1h Y3BpPw0KPiA+ID4NCj4gPiA+IElzIHRoZXJlIGFueXRoaW5nIGluIGl0IHRoYXQgdGhlIHBlb3Bs ZSBvbiB0aGF0IGxpc3Qgc2hvdWxkIG5vdCBzZWUsIGJ5IGFueQ0KPiA+ID4gY2hhbmNlPw0KPiA+ IA0KPiA+IGxpbnV4LWFjcGkgbWF5IG5vdCBjYXJlIGFib3V0IHRoZSBkaW1tLW1ldGFkYXRhIGxh YmVsaW5nIHBhdGNoZXMgdGhhdA0KPiA+IGFyZSBjb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIEFD UEksIGJ1dCBtaWdodCBhcyB3ZWxsIGluY2x1ZGUNCj4gPiBsaW51eC1hY3BpIG9uIHRoZSB3aG9s ZSBzZXJpZXMgYXQgdGhpcyBwb2ludC4NCj4gDQo+IEkndmUgZ29uZSB0aHJvdWdoIHRoZSBBQ1BJ LXJlbGF0ZWQgcGF0Y2hlcyBpbiB0aGlzIHNlcmllcyAob3RoZXIgdGhhbiBbMi8yMF0NCj4gdGhh dCBJJ3ZlIGNvbW1lbnRlZCBkaXJlY3RseSkgYW5kIHdoaWxlIEkgaGF2ZW4ndCBmb3VuZCBhbnl0 aGluZyBob3JyaWJsZSBpbg0KPiB0aGVtLCBJIGRvbid0IHF1aXRlIGZlZWwgY29uZmlkZW50IGVu b3VnaCB0byBBQ0sgdGhlbS4NCj4gDQo+IFdoYXQgSSdtIHJlYWxseSBtaXNzaW5nIGluIHRoaXMg c2VyaWVzIGlzIGEgZGVzaWduIGRvY3VtZW50IGRlc2NyaWJpbmcgYWxsIHRoYXQNCj4gZnJvbSBh IGhpZ2gtbGV2ZWwgcGVyc3BlY3RpdmUgYW5kIG1ha2luZyBpdCBjbGVhciB3aGVyZSBhbGwgb2Yg dGhlIHBpZWNlcyBnbw0KPiBhbmQgd2hhdCB0aGVpciByZXNwZWN0aXZlIHJvbGVzIGFyZS4gIEFs c28gcmVvcmRlcmluZyB0aGUgc2VyaWVzIHRvIGludHJvZHVjZQ0KPiB0aGUgbmQgc3Vic3lzdGVt IHRvIHN0YXJ0IHdpdGggYW5kIHRoZW4gaXRzIHVzZXJzIG1pZ2h0IGhlbHAgaGVyZS4NCg0KSGVy ZSB5b3UgZ28sIGFuZCBhbHNvIHNlZSB0aGUgIlN1cHBvcnRpbmcgRG9jdW1lbnRzIiBzZWN0aW9u IGlmIHlvdSBuZWVkDQptb3JlIGRldGFpbHMsIG9yIGp1c3QgYXNrLiAgVGhpcyBpcyB0aGUgcmV3 b3JrZWQgZG9jdW1lbnQgYWZ0ZXIgcHVzaGluZw0KTkZJVCBzcGVjaWZpY3Mgb3V0IG9mIHRoZSBj b3JlIGltcGxlbWVudGF0aW9uLiAgVGhlIGNvcmUgYXBpcyBhcmUNCm5kX2J1c19yZWdpc3Rlcigp LCBuZF9kaW1tX2NyZWF0ZSgpLCBuZF9wbWVtX3JlZ2lvbl9jcmVhdGUoKSwgYW5kDQpuZF9ibGtf cmVnaW9uX2NyZWF0ZSgpLg0KDQotLS0NCg0KCQkJICBMSUJORDogTm9uLXZvbGF0aWxlIERldmlj ZXMNCgkgICAgICBsaWJuZCAtIGtlcm5lbCAvIGxpYm5kY3RsIC0gdXNlcnNwYWNlIGhlbHBlciBs aWJyYXJ5DQoJCQkgICBsaW51eC1udmRpbW1AbGlzdHMuMDEub3JnDQoJCQkJICAgICAgdjEwDQoN Cg0KCUdsb3NzYXJ5DQoJT3ZlcnZpZXcNCgkgICAgU3VwcG9ydGluZyBEb2N1bWVudHMNCgkgICAg R2l0IFRyZWVzDQoJTElCTkQgUE1FTSBhbmQgQkxLDQoJV2h5IEJMSz8NCgkgICAgUE1FTSB2cyBC TEsNCgkgICAgICAgIEJMSy1SRUdJT05zLCBQTUVNLVJFR0lPTnMsIEF0b21pYyBTZWN0b3JzLCBh bmQgREFYDQoJRXhhbXBsZSBOVkRJTU0gUGxhdGZvcm0NCglMSUJORCBLZXJuZWwgRGV2aWNlIE1v ZGVsIGFuZCBMSUJORENUTCBVc2Vyc3BhY2UgQVBJDQoJICAgIExJQk5EQ1RMOiBDb250ZXh0DQoJ ICAgICAgICBsaWJuZGN0bDogaW5zdGFudGlhdGUgYSBuZXcgbGlicmFyeSBjb250ZXh0IGV4YW1w bGUNCgkgICAgTElCTkQvTElCTkRDVEw6IEJ1cw0KCSAgICAgICAgbGlibmQ6IGNvbnRyb2wgY2xh c3MgZGV2aWNlIGluIC9zeXMvY2xhc3MNCgkgICAgICAgIGxpYm5kOiBidXMNCgkgICAgICAgIGxp Ym5kY3RsOiBidXMgZW51bWVyYXRpb24gZXhhbXBsZQ0KCSAgICBMSUJORC9MSUJORENUTDogRElN TSAoTk1FTSkNCgkgICAgICAgIGxpYm5kOiBESU1NIChOTUVNKQ0KCSAgICAgICAgbGlibmRjdGw6 IERJTU0gZW51bWVyYXRpb24gZXhhbXBsZQ0KCSAgICBMSUJORC9MSUJORENUTDogUmVnaW9uDQoJ ICAgICAgICBsaWJuZDogcmVnaW9uDQoJICAgICAgICBsaWJuZGN0bDogcmVnaW9uIGVudW1lcmF0 aW9uIGV4YW1wbGUNCgkgICAgICAgIFdoeSBOb3QgRW5jb2RlIHRoZSBSZWdpb24gVHlwZSBpbnRv IHRoZSBSZWdpb24gTmFtZT8NCgkgICAgICAgIEhvdyBEbyBJIERldGVybWluZSB0aGUgTWFqb3Ig VHlwZSBvZiBhIFJlZ2lvbj8NCgkgICAgTElCTkQvTElCTkRDVEw6IE5hbWVzcGFjZQ0KCSAgICAg ICAgbGlibmQ6IG5hbWVzcGFjZQ0KCSAgICAgICAgbGlibmRjdGw6IG5hbWVzcGFjZSBlbnVtZXJh dGlvbiBleGFtcGxlDQoJICAgICAgICBsaWJuZGN0bDogbmFtZXNwYWNlIGNyZWF0aW9uIGV4YW1w bGUNCgkgICAgICAgIFdoeSB0aGUgVGVybSAibmFtZXNwYWNlIj8NCgkgICAgTElCTkQvTElCTkRD VEw6IEJsb2NrIFRyYW5zbGF0aW9uIFRhYmxlICJidHQiDQoJICAgICAgICBsaWJuZDogYnR0IGxh eW91dA0KCSAgICAgICAgbGlibmRjdGw6IGJ0dCBjcmVhdGlvbiBleGFtcGxlDQoJU3VtbWFyeSBM SUJORENUTCBEaWFncmFtDQoNCg0KR2xvc3NhcnkNCi0tLS0tLS0tDQoNClBNRU06IEEgc3lzdGVt IHBoeXNpY2FsIGFkZHJlc3MgcmFuZ2Ugd2hlcmUgd3JpdGVzIGFyZSBwZXJzaXN0ZW50LiAgQQ0K YmxvY2sgZGV2aWNlIGNvbXBvc2VkIG9mIFBNRU0gaXMgY2FwYWJsZSBvZiBEQVguICBBIFBNRU0g YWRkcmVzcyByYW5nZQ0KbWF5IHNwYW4vaW50ZXJsZWF2ZSBzZXZlcmFsIERJTU1zLg0KDQpCTEs6 IEEgc2V0IG9mIG9uZSBvciBtb3JlIHByb2dyYW1tYWJsZSBtZW1vcnkgbWFwcGVkIGFwZXJ0dXJl cyBwcm92aWRlZA0KYnkgYSBESU1NIHRvIGFjY2VzcyBpdHMgbWVkaWEuICBUaGlzIGluZGlyZWN0 aW9uIHByZWNsdWRlcyB0aGUNCnBlcmZvcm1hbmNlIGJlbmVmaXQgb2YgaW50ZXJsZWF2aW5nLCBi dXQgZW5hYmxlcyBESU1NLWJvdW5kZWQgZmFpbHVyZQ0KbW9kZXMgLg0KDQpEUEE6IERJTU0gUGh5 c2ljYWwgQWRkcmVzcywgaXMgYSBESU1NLXJlbGF0aXZlIG9mZnNldC4gIFdpdGggb25lIERJTU0g aW4NCnRoZSBzeXN0ZW0gdGhlcmUgd291bGQgYmUgYSAxOjEgc3lzdGVtLXBoeXNpY2FsLWFkZHJl c3M6RFBBIGFzc29jaWF0aW9uLg0KT25jZSBtb3JlIERJTU1zIGFyZSBhZGRlZCBhbiBtZW1vcnkg Y29udHJvbGxlciBpbnRlcmxlYXZlIG11c3QgYmUNCmRlY29kZWQgdG8gZGV0ZXJtaW5lIHRoZSBE UEEgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4NCnN5c3RlbS1waHlzaWNhbC1hZGRyZXNzLiAgQkxL IGNhcGFjaXR5IGFsd2F5cyBoYXMgYSAxOjEgcmVsYXRpb25zaGlwDQp3aXRoIGEgc2luZ2xlLWRp bW0ncyBEUEEgcmFuZ2UuDQoNCkRBWDogRmlsZSBzeXN0ZW0gZXh0ZW5zaW9ucyB0byBieXBhc3Mg dGhlIHBhZ2UgY2FjaGUgYW5kIGJsb2NrIGxheWVyIHRvDQptbWFwIHBlcnNpc3RlbnQgbWVtb3J5 LCBmcm9tIGEgUE1FTSBibG9jayBkZXZpY2UsIGRpcmVjdGx5IGludG8gYQ0KcHJvY2VzcyBhZGRy ZXNzIHNwYWNlLg0KDQpCVFQ6IEJsb2NrIFRyYW5zbGF0aW9uIFRhYmxlOiBQZXJzaXN0ZW50IG1l bW9yeSBpcyBieXRlIGFkZHJlc3NhYmxlLg0KRXhpc3Rpbmcgc29mdHdhcmUgbWF5IGhhdmUgYW4g ZXhwZWN0YXRpb24gdGhhdCB0aGUgcG93ZXItZmFpbC1hdG9taWNpdHkNCm9mIHdyaXRlcyBpcyBh dCBsZWFzdCBvbmUgc2VjdG9yLCA1MTIgYnl0ZXMuICBUaGUgQlRUIGlzIGFuIGluZGlyZWN0aW9u DQp0YWJsZSB3aXRoIGF0b21pYyB1cGRhdGUgc2VtYW50aWNzIHRvIGZyb250IGEgUE1FTS9CTEsg YmxvY2sgZGV2aWNlDQpkcml2ZXIgYW5kIHByZXNlbnQgYXJiaXRyYXJ5IGF0b21pYyBzZWN0b3Ig c2l6ZXMuDQoNCkxBQkVMOiBNZXRhZGF0YSBzdG9yZWQgb24gYSBESU1NIGRldmljZSB0aGF0IHBh cnRpdGlvbnMgYW5kIGlkZW50aWZpZXMNCihwZXJzaXN0ZW50bHkgbmFtZXMpIHN0b3JhZ2UgYmV0 d2VlbiBQTUVNIGFuZCBCTEsuICBJdCBhbHNvIHBhcnRpdGlvbnMNCkJMSyBzdG9yYWdlIHRvIGhv c3QgQlRUcyB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHBlciBCTEstcGFydGl0aW9uLg0KTm90 ZSB0aGF0IHRyYWRpdGlvbmFsIHBhcnRpdGlvbiB0YWJsZXMsIEdQVC9NQlIsIGFyZSBsYXllcmVk IG9uIHRvcCBvZiBhDQpCTEsgb3IgUE1FTSBkZXZpY2UuDQoNCg0KT3ZlcnZpZXcNCi0tLS0tLS0t DQoNClRoZSBsaWJuZCBzdWJzeXN0ZW0gcHJvdmlkZXMgc3VwcG9ydCBmb3IgdGhyZWUgdHlwZXMg b2YgTlZESU1NcywgUE1FTSwNCkJMSywgYW5kIE5WRElNTSBwbGF0Zm9ybXMgdGhhdCBjYW4gc2lt dWx0YW5lb3VzbHkgc3VwcG9ydCBQTUVNIGFuZCBCTEsNCm1vZGUgYWNjZXNzIGNhcGFiaWxpdGll cyBvbiBhIGdpdmVuIHNldCBvZiBESU1Ncy4gIFRoZXNlIHRocmVlIG1vZGVzIG9mDQpvcGVyYXRp b24gYXJlIGRlc2NyaWJlZCBieSB0aGUgIk5WRElNTSBGaXJtd2FyZSBJbnRlcmZhY2UgVGFibGUi IChORklUKQ0KaW4gQUNQSSA2LiAgV2hpbGUgdGhlIGxpYm5kIGltcGxlbWVudGF0aW9uIGlzIGdl bmVyaWMgYW5kIHN1cHBvcnRzDQpwcmUtTkZJVCBwbGF0Zm9ybXMsIGl0IHdhcyBndWlkZWQgYnkg dGhlIHN1cGVyc2V0IG9mIGNhcGFiaWxpdGllcyBuZWVkDQp0byBzdXBwb3J0IHRoaXMgQUNQSSA2 IGRlZmluaXRpb24gZm9yIE5WRElNTSByZXNvdXJjZXMuICBUaGUgYnVsayBvZiB0aGUNCmtlcm5l bCBpbXBsZW1lbnRhdGlvbiBpcyBpbiBwbGFjZSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgRFBB DQphY2Nlc3NpYmxlIHZpYSBQTUVNIGlzIGFsaWFzZWQgd2l0aCBEUEEgYWNjZXNzaWJsZSB2aWEg QkxLLiAgV2hlbiB0aGF0DQpvY2N1cnMgYSBMQUJFTCBpcyBuZWVkZWQgdG8gcmVzZXJ2ZSBEUEEg Zm9yIGV4Y2x1c2l2ZSBhY2Nlc3MgdmlhIG9uZQ0KbW9kZSBhIHRpbWUuDQoNClN1cHBvcnRpbmcg RG9jdW1lbnRzDQpBQ1BJIDY6IGh0dHA6Ly93d3cudWVmaS5vcmcvc2l0ZXMvZGVmYXVsdC9maWxl cy9yZXNvdXJjZXMvQUNQSV82LjAucGRmDQpOVkRJTU0gTmFtZXNwYWNlOiBodHRwOi8vcG1lbS5p by9kb2N1bWVudHMvTlZESU1NX05hbWVzcGFjZV9TcGVjLnBkZg0KRFNNIEludGVyZmFjZSBFeGFt cGxlOiBodHRwOi8vcG1lbS5pby9kb2N1bWVudHMvTlZESU1NX0RTTV9JbnRlcmZhY2VfRXhhbXBs ZS5wZGYNCkRyaXZlciBXcml0ZXIncyBHdWlkZTogaHR0cDovL3BtZW0uaW8vZG9jdW1lbnRzL05W RElNTV9Ecml2ZXJfV3JpdGVyc19HdWlkZS5wZGYNCg0KR2l0IFRyZWVzDQpMSUJORDogaHR0cHM6 Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQvZGpidy9udmRpbW0uZ2l0L2xv Zy8/aD1uZA0KTElCTkRDVEw6IGh0dHBzOi8vZ2l0aHViLmNvbS9wbWVtL25kY3RsLmdpdA0KUE1F TTogaHR0cHM6Ly9naXRodWIuY29tLzAxb3JnL3ByZA0KDQoNCkxJQk5EIFBNRU0gYW5kIEJMSw0K LS0tLS0tLS0tLS0tLS0tLS0tDQoNClByaW9yIHRvIHRoZSBhcnJpdmFsIG9mIHRoZSBORklULCBu b24tdm9sYXRpbGUgbWVtb3J5IHdhcyBkZXNjcmliZWQgdG8gYQ0Kc3lzdGVtIGluIHZhcmlvdXMg YWQtaG9jIHdheXMuICBVc3VhbGx5IG9ubHkgdGhlIGJhcmUgbWluaW11bSB3YXMNCnByb3ZpZGVk LCBuYW1lbHksIGEgc2luZ2xlIHN5c3RlbS1waHlzaWNhbC1hZGRyZXNzIHJhbmdlIHdoZXJlIHdy aXRlcw0KYXJlIGV4cGVjdGVkIHRvIGJlIGR1cmFibGUgYWZ0ZXIgYSBzeXN0ZW0gcG93ZXIgbG9z cy4gIE5vdywgdGhlIE5GSVQNCnNwZWNpZmljYXRpb24gc3RhbmRhcmRpemVzIG5vdCBvbmx5IHRo ZSBkZXNjcmlwdGlvbiBvZiBQTUVNLCBidXQgYWxzbw0KQkxLIGFuZCBwbGF0Zm9ybSBtZXNzYWdl LXBhc3NpbmcgZW50cnkgcG9pbnRzIGZvciBjb250cm9sIGFuZA0KY29uZmlndXJhdGlvbi4NCg0K Rm9yIGVhY2ggTlZESU1NIGFjY2VzcyBtZXRob2QgKFBNRU0sIEJMSyksIExJQk5EIHByb3ZpZGVz IGEgYmxvY2sgZGV2aWNlIGRyaXZlcjoNCg0KICAgIDEuIFBNRU0gKG5kX3BtZW0ua28pOiBEcml2 ZXMgYSBzeXN0ZW0tcGh5c2ljYWwtYWRkcmVzcyByYW5nZS4gIFRoaXMNCiAgICByYW5nZSBpcyBj b250aWd1b3VzIGluIHN5c3RlbSBtZW1vcnkgYW5kIG1heSBiZSBpbnRlcmxlYXZlZCAoaGFyZHdh cmUNCiAgICBtZW1vcnkgY29udHJvbGxlciBzdHJpcGVkKSBhY3Jvc3MgbXVsdGlwbGUgRElNTXMu ICBXaGVuIGludGVybGVhdmVkIHRoZQ0KICAgIHBsYXRmb3JtIG1heSBvcHRpb25hbGx5IHByb3Zp ZGUgZGV0YWlscyBvZiB3aGljaCBESU1NcyBhcmUgcGFydGljaXBhdGluZw0KICAgIGluIHRoZSBp bnRlcmxlYXZlLg0KICAgIA0KICAgIE5vdGUsIExJQk5EIGRlc2NyaWJlcyBzeXN0ZW0tcGh5c2lj YWwtYWRkcmVzcyByYW5nZXMgdGhhdCBtYXkgYWxpYXMgd2l0aA0KICAgIEJMSyBhY2Nlc3MgTkRf TkFNRVNQQUNFX1BNRU0gcmFuZ2VzIGFuZCB0aG9zZSB3aXRob3V0IGFsaWFzIGFzDQogICAgTkRf TkFNRVNQQUNFX0lPIHJhbmdlcywgdG8gdGhlIG5kX3BtZW0gZHJpdmVyIHRoZXJlIGlzIG5vIGRp c3RpbmN0aW9uLg0KICAgIFRoZSBkaWZmZXJlbnQgZGV2aWNlLXR5cGVzIGFyZSBhbiBpbXBsZW1l bnRhdGlvbiBkZXRhaWwgdGhhdCB1c2Vyc3BhY2UNCiAgICBjYW4gZXhwbG9pdCB0byBpbXBsZW1l bnQgcG9saWNpZXMgbGlrZSAib25seSBpbnRlcmZhY2Ugd2l0aCBhZGRyZXNzDQogICAgcmFuZ2Vz IGZyb20gY2VydGFpbiBESU1NcyIuICBJdCBpcyB3b3J0aCBub3RpbmcgdGhhdCB3aGVuIGFsaWFz aW5nIGlzDQogICAgcHJlc2VudCBhbmQgYSBESU1NIGxhY2tzIGEgbGFiZWwsIHRoZW4gbm8gYmxv Y2sgZGV2aWNlIGNhbiBiZSBjcmVhdGVkIGJ5DQogICAgZGVmYXVsdCBhcyB1c2Vyc3BhY2UgbmVl ZHMgdG8gZG8gYXQgbGVhc3Qgb25lIGFsbG9jYXRpb24gb2YgRFBBIHRvIHRoZQ0KICAgIFBNRU0g cmFuZ2UuICBJbiBjb250cmFzdCBORF9OQU1FU1BBQ0VfSU8gcmFuZ2VzLCBvbmNlIHJlZ2lzdGVy ZWQsIGNhbiBiZQ0KICAgIGltbWVkaWF0ZWx5IGF0dGFjaGVkIHRvIG5kX3BtZW0uDQogICAgDQog ICAgMi4gQkxLIChuZF9ibGsua28pOiBUaGlzIGRyaXZlciBwZXJmb3JtcyBJL08gdXNpbmcgYSBz ZXQgb2YgcGxhdGZvcm0NCiAgICBkZWZpbmVkIGFwZXJ0dXJlcy4gIEEgc2V0IG9mIGFwZXJ0dXJl cyB3aWxsIGFsbCBhY2Nlc3MganVzdCBvbmUgRElNTS4NCiAgICBNdWx0aXBsZSB3aW5kb3dzIGFs bG93IG11bHRpcGxlIGNvbmN1cnJlbnQgYWNjZXNzZXMsIG11Y2ggbGlrZQ0KICAgIHRhZ2dlZC1j b21tYW5kLXF1ZXVpbmcsIGFuZCB3b3VsZCBsaWtlbHkgYmUgdXNlZCBieSBkaWZmZXJlbnQgdGhy ZWFkcyBvcg0KICAgIGRpZmZlcmVudCBDUFVzLg0KDQogICAgVGhlIE5GSVQgc3BlY2lmaWNhdGlv biBkZWZpbmVzIGEgc3RhbmRhcmQgZm9ybWF0IGZvciBhIEJMSy1hcGVydHVyZSwgYnV0DQogICAg dGhlIHNwZWMgYWxzbyBhbGxvd3MgZm9yIHZlbmRvciBzcGVjaWZpYyBsYXlvdXRzLCBhbmQgbm9u LU5GSVQgQkxLDQogICAgaW1wbGVtZW50YXRpb25zIG1heSBvdGhlciBkZXNpZ25zIGZvciBCTEsg SS9PLiAgRm9yIHRoaXMgcmVhc29uICJuZF9ibGsiDQogICAgY2FsbHMgYmFjayBpbnRvIHBsYXRm b3JtLXNwZWNpZmljIGNvZGUgdG8gcGVyZm9ybSB0aGUgSS9PLiAgT25lIHN1Y2gNCiAgICBpbXBs ZW1lbnRhdGlvbiBpcyBkZWZpbmVkIGluIHRoZSAiRHJpdmVyIFdyaXRlcidzIEd1aWRlIiBhbiAi RFNNDQogICAgSW50ZXJmYWNlIEV4YW1wbGUiLg0KDQoNCldoeSBCTEs/DQotLS0tLS0tLQ0KDQpX aGlsZSBQTUVNIHByb3ZpZGVzIGRpcmVjdCBieXRlLWFkZHJlc3NhYmxlIENQVS1sb2FkL3N0b3Jl IGFjY2VzcyB0bw0KTlZESU1NIHN0b3JhZ2UsIGl0IGRvZXMgbm90IHByb3ZpZGUgdGhlIGJlc3Qg c3lzdGVtIFJBUyAocmVjb3ZlcnksDQphdmFpbGFiaWxpdHksIGFuZCBzZXJ2aWNlYWJpbGl0eSkg bW9kZWwuICBBbiBhY2Nlc3MgdG8gYSBjb3JydXB0ZWQNCnN5c3RlbS1waHlzaWNhbC1hZGRyZXNz IGFkZHJlc3MgY2F1c2VzIGEgY3B1IGV4Y2VwdGlvbiB3aGlsZSBhbiBhY2Nlc3MNCnRvIGEgY29y cnVwdGVkIGFkZHJlc3MgdGhyb3VnaCBhbiBCTEstYXBlcnR1cmUgY2F1c2VzIHRoYXQgYmxvY2sg d2luZG93DQp0byByYWlzZSBhbiBlcnJvciBzdGF0dXMgaW4gYSByZWdpc3Rlci4gIFRoZSBsYXR0 ZXIgaXMgbW9yZSBhbGlnbmVkIHdpdGgNCnRoZSBzdGFuZGFyZCBlcnJvciBtb2RlbCB0aGF0IGhv c3QtYnVzLWFkYXB0ZXIgYXR0YWNoZWQgZGlza3MgcHJlc2VudC4NCkFsc28sIGlmIGFuIGFkbWlu aXN0cmF0b3IgZXZlciB3YW50cyB0byByZXBsYWNlIGEgbWVtb3J5IGl0IGlzIGVhc2llciB0bw0K c2VydmljZSBhIHN5c3RlbSBhdCBESU1NIG1vZHVsZSBib3VuZGFyaWVzLiAgQ29tcGFyZSB0aGlz IHRvIFBNRU0gd2hlcmUNCmRhdGEgY291bGQgYmUgaW50ZXJsZWF2ZWQgaW4gYW4gb3BhcXVlIGhh cmR3YXJlIHNwZWNpZmljIG1hbm5lciBhY3Jvc3MNCnNldmVyYWwgRElNTXMuDQoNClBNRU0gdnMg QkxLDQpCTEstYXBlcnR1cmVzIHNvbHZlIHRoaXMgUkFTIHByb2JsZW0sIGJ1dCB0aGVpciBwcmVz ZW5jZSBpcyBhbHNvIHRoZQ0KbWFqb3IgY29udHJpYnV0aW5nIGZhY3RvciB0byB0aGUgY29tcGxl eGl0eSBvZiB0aGUgTkQgc3Vic3lzdGVtLiAgVGhleQ0KY29tcGxpY2F0ZSB0aGUgaW1wbGVtZW50 YXRpb24gYmVjYXVzZSBQTUVNIGFuZCBCTEsgYWxpYXMgaW4gRFBBIHNwYWNlLg0KQW55IGdpdmVu IERJTU0ncyBEUEEtcmFuZ2UgbWF5IGNvbnRyaWJ1dGUgdG8gb25lIG9yIG1vcmUNCnN5c3RlbS1w aHlzaWNhbC1hZGRyZXNzIHNldHMgb2YgaW50ZXJsZWF2ZWQgRElNTXMsICphbmQqIG1heSBhbHNv IGJlDQphY2Nlc3NlZCBpbiBpdHMgZW50aXJldHkgdGhyb3VnaCBpdHMgQkxLLWFwZXJ0dXJlLiAg QWNjZXNzaW5nIGEgRFBBDQp0aHJvdWdoIGEgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3Mgd2hpbGUg c2ltdWx0YW5lb3VzbHkgYWNjZXNzaW5nIHRoZQ0Kc2FtZSBEUEEgdGhyb3VnaCBhIEJMSy1hcGVy dHVyZSBoYXMgdW5kZWZpbmVkIHJlc3VsdHMuICBGb3IgdGhpcyByZWFzb24sDQpESU1NJ3Mgd2l0 aCB0aGlzIGR1YWwgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gaW5jbHVkZSBhIERTTSBmdW5jdGlv biB0bw0Kc3RvcmUvcmV0cmlldmUgYSBMQUJFTC4gIFRoZSBMQUJFTCBlZmZlY3RpdmVseSBwYXJ0 aXRpb25zIHRoZSBEUEEtc3BhY2UNCmludG8gZXhjbHVzaXZlIHN5c3RlbS1waHlzaWNhbC1hZGRy ZXNzIGFuZCBCTEstYXBlcnR1cmUgYWNjZXNzaWJsZQ0KcmVnaW9ucy4gIEZvciBzaW1wbGljaXR5 IGEgRElNTSBpcyBhbGxvd2VkIGEgUE1FTSAicmVnaW9uIiBwZXIgZWFjaA0KaW50ZXJsZWF2ZSBz ZXQgaW4gd2hpY2ggaXQgaXMgYSBtZW1iZXIuICBUaGUgcmVtYWluaW5nIERQQSBzcGFjZSBjYW4g YmUNCmNhcnZlZCBpbnRvIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgQkxLIGRldmljZXMgd2l0aCBk aXNjb250aWd1b3VzDQpleHRlbnRzLg0KDQpCTEstUkVHSU9OcywgUE1FTS1SRUdJT05zLCBBdG9t aWMgU2VjdG9ycywgYW5kIERBWA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0NCg0KT25lIG9mIHRoZSBmZXcNCnJlYXNvbnMgdG8gYWxsb3cgbXVsdGlw bGUgQkxLIG5hbWVzcGFjZXMgcGVyIFJFR0lPTiBpcyBzbyB0aGF0IGVhY2gNCkJMSy1uYW1lc3Bh Y2UgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBhIEJUVCB3aXRoIHVuaXF1ZSBhdG9taWMgc2VjdG9y DQpzaXplcy4gIFdoaWxlIGEgUE1FTSBkZXZpY2UgY2FuIGhvc3QgYSBCVFQgdGhlIExBQkVMIHNw ZWNpZmljYXRpb24gZG9lcw0Kbm90IHByb3ZpZGUgZm9yIGEgc2VjdG9yIHNpemUgdG8gYmUgc3Bl Y2lmaWVkIGZvciBhIFBNRU0gbmFtZXNwYWNlLg0KVGhpcyBpcyBkdWUgdG8gdGhlIGV4cGVjdGF0 aW9uIHRoYXQgdGhlIHByaW1hcnkgdXNhZ2UgbW9kZWwgZm9yIFBNRU0gaXMNCnZpYSBEQVgsIGFu ZCB0aGUgQlRUIGlzIGluY29tcGF0aWJsZSB3aXRoIERBWC4gIEhvd2V2ZXIsIGZvciB0aGUgY2Fz ZXMNCndoZXJlIGFuIGFwcGxpY2F0aW9uIG9yIGZpbGVzeXN0ZW0gc3RpbGwgbmVlZHMgYXRvbWlj IHNlY3RvciB1cGRhdGUNCmd1YXJhbnRlZXMgaXQgY2FuIHJlZ2lzdGVyIGEgQlRUIG9uIGEgUE1F TSBkZXZpY2Ugb3IgcGFydGl0aW9uLiAgU2VlDQpMSUJORC9ORENUTDogQmxvY2sgVHJhbnNsYXRp b24gVGFibGUgImJ0dCINCg0KDQpFeGFtcGxlIE5WRElNTSBQbGF0Zm9ybQ0KLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0NCg0KRm9yIHRoZSByZW1haW5kZXIgb2YgdGhpcyBkb2N1bWVudCB0aGUgZm9s bG93aW5nIGRpYWdyYW0gd2lsbCBiZQ0KcmVmZXJlbmNlZCBmb3IgYW55IGV4YW1wbGUgc3lzZnMg bGF5b3V0cy4NCg0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhKSAgICAgICAgICAg ICAgIChiKSAgICAgICAgICAgRElNTSAgIEJMSy1SRUdJT04NCiAgICAgICAgICArLS0tLS0tLS0t LS0tLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsNCistLS0tLS0rICB8ICAgICAg IHBtMC4wICAgICAgIHwgYmxrMi4wIHwgcG0xLjAgIHwgYmxrMi4xIHwgICAgMCAgICAgIHJlZ2lv bjINCnwgaW1jMCArLS0rLSAtIC0gcmVnaW9uMC0gLSAtICstLS0tLS0tLSsgICAgICAgICstLS0t LS0tLSsNCistLSstLS0rICB8ICAgICAgIHBtMC4wICAgICAgIHwgYmxrMy4wIHwgcG0xLjAgIHwg YmxrMy4xIHwgICAgMSAgICAgIHJlZ2lvbjMNCiAgIHwgICAgICArLS0tLS0tLS0tLS0tLS0tLS0t LSstLS0tLS0tLXYgICAgICAgIHYtLS0tLS0tLSsNCistLSstLS0rICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwNCnwgY3B1MCB8ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbjENCistLSstLS0rICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwNCiAgIHwgICAgICArLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLV4gICAgICAgIF4tLS0tLS0tLSsNCistLSstLS0rICB8ICAgICAgICAg ICBibGs0LjAgICAgICAgICAgIHwgcG0xLjAgIHwgYmxrNC4wIHwgICAgMiAgICAgIHJlZ2lvbjQN CnwgaW1jMSArLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgICstLS0tLS0t LSsNCistLS0tLS0rICB8ICAgICAgICAgICBibGs1LjAgICAgICAgICAgIHwgcG0xLjAgIHwgYmxr NS4wIHwgICAgMyAgICAgIHJlZ2lvbjUNCiAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLSstLS0tLS0tLSstLS0tLS0tLSsNCg0KSW4gdGhpcyBwbGF0Zm9ybSB3ZSBoYXZlIGZv dXIgRElNTXMgYW5kIHR3byBtZW1vcnkgY29udHJvbGxlcnMgaW4gb25lDQpzb2NrZXQuICBFYWNo IHVuaXF1ZSBpbnRlcmZhY2UgKEJMSyBvciBQTUVNKSB0byBEUEEgc3BhY2UgaXMgaWRlbnRpZmll ZA0KYnkgYSByZWdpb24gZGV2aWNlIHdpdGggYSBkeW5hbWljYWxseSBhc3NpZ25lZCBpZCAoUkVH SU9OMCAtIFJFR0lPTjUpLg0KDQogICAgMS4gVGhlIGZpcnN0IHBvcnRpb24gb2YgRElNTTAgYW5k IERJTU0xIGFyZSBpbnRlcmxlYXZlZCBhcyBSRUdJT04wLiBBDQogICAgc2luZ2xlIFBNRU0gbmFt ZXNwYWNlIGlzIGNyZWF0ZWQgaW4gdGhlIFJFR0lPTjAtU1BBLXJhbmdlIHRoYXQgc3BhbnMNCiAg ICBESU1NMCBhbmQgRElNTTEgd2l0aCBhIHVzZXItc3BlY2lmaWVkIG5hbWUgb2YgInBtMC4wIi4g U29tZSBvZiB0aGF0DQogICAgaW50ZXJsZWF2ZWQgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFu Z2UgaXMgcmVjbGFpbWVkIGFzIEJMSy1hcGVydHVyZQ0KICAgIGFjY2Vzc2VkIHNwYWNlIHN0YXJ0 aW5nIGF0IERQQS1vZmZzZXQgKGEpIGludG8gZWFjaCBESU1NLiAgSW4gdGhhdA0KICAgIHJlY2xh aW1lZCBzcGFjZSB3ZSBjcmVhdGUgdHdvIEJMSy1hcGVydHVyZSAibmFtZXNwYWNlcyIgZnJvbSBS RUdJT04yIGFuZA0KICAgIFJFR0lPTjMgd2hlcmUgImJsazIuMCIgYW5kICJibGszLjAiIGFyZSBq dXN0IGh1bWFuIHJlYWRhYmxlIG5hbWVzIHRoYXQNCiAgICBjb3VsZCBiZSBzZXQgdG8gYW55IHVz ZXItZGVzaXJlZCBuYW1lIGluIHRoZSBMQUJFTC4NCiAgICANCiAgICAyLiBJbiB0aGUgbGFzdCBw b3J0aW9uIG9mIERJTU0wIGFuZCBESU1NMSB3ZSBoYXZlIGFuIGludGVybGVhdmVkDQogICAgc3lz dGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFuZ2UsIFJFR0lPTjEsIHRoYXQgc3BhbnMgdGhvc2UgdHdv IERJTU1zIGFzDQogICAgd2VsbCBhcyBESU1NMiBhbmQgRElNTTMuICBTb21lIG9mIFJFR0lPTjEg YWxsb2NhdGVkIHRvIGEgUE1FTSBuYW1lc3BhY2UNCiAgICBuYW1lZCAicG0xLjAiIHRoZSByZXN0 IGlzIHJlY2xhaW1lZCBpbiA0IEJMSy1hcGVydHVyZSBuYW1lc3BhY2VzIChmb3INCiAgICBlYWNo IERJTU0gaW4gdGhlIGludGVybGVhdmUgc2V0KSwgImJsazIuMSIsICJibGszLjEiLCAiYmxrNC4w IiwgYW5kDQogICAgImJsazUuMCIuDQogICAgDQogICAgMy4gVGhlIHBvcnRpb24gb2YgRElNTTIg YW5kIERJTU0zIHRoYXQgZG8gbm90IHBhcnRpY2lwYXRlIGluIHRoZSBSRUdJT04xDQogICAgaW50 ZXJsZWF2ZWQgc3lzdGVtLXBoeXNpY2FsLWFkZHJlc3MgcmFuZ2UgKGkuZS4gdGhlIERQQSBhZGRy ZXNzIGJlbG93DQogICAgb2Zmc2V0IChiKSBhcmUgYWxzbyBpbmNsdWRlZCBpbiB0aGUgImJsazQu MCIgYW5kICJibGs1LjAiIG5hbWVzcGFjZXMuDQogICAgTm90ZSwgdGhhdCB0aGlzIGV4YW1wbGUg c2hvd3MgdGhhdCBCTEstYXBlcnR1cmUgbmFtZXNwYWNlcyBkb24ndCBuZWVkIHRvDQogICAgYmUg Y29udGlndW91cyBpbiBEUEEtc3BhY2UuDQogICAgDQogICAgVGhpcyBidXMgaXMgcHJvdmlkZWQg YnkgdGhlIGtlcm5lbCB1bmRlciB0aGUgZGV2aWNlDQogICAgL3N5cy9kZXZpY2VzL3BsYXRmb3Jt L25maXRfdGVzdC4wIHdoZW4gQ09ORklHX05GSVRfVEVTVCBpcyBlbmFibGVkIGFuZA0KICAgIHRo ZSBuZml0X3Rlc3Qua28gbW9kdWxlIGlzIGxvYWRlZC4gIFRoaXMgbm90IG9ubHkgdGVzdCBMSUJO RCBidXQgdGhlDQogICAgYWNwaV9uZml0LmtvIGRyaXZlciBhcyB3ZWxsLg0KDQoNCkxJQk5EIEtl cm5lbCBEZXZpY2UgTW9kZWwgYW5kIExJQk5EQ1RMIFVzZXJzcGFjZSBBUEkNCi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KV2hhdCBmb2xsb3dz IGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIExJQk5EIHN5c2ZzIGxheW91dCBhbmQgYQ0KY29ycmVz cG9uZGluZyBvYmplY3QgaGllcmFyY2h5IGRpYWdyYW0gYXMgdmlld2VkIHRocm91Z2ggdGhlIExJ Qk5EQ1RMDQphcGkuICBUaGUgZXhhbXBsZSBzeXNmcyBwYXRocyBhbmQgZGlhZ3JhbXMgYXJlIHJl bGF0aXZlIHRvIHRoZSBFeGFtcGxlDQpOVkRJTU0gUGxhdGZvcm0gd2hpY2ggaXMgYWxzbyB0aGUg bGlibmQgYnVzIHVzZWQgaW4gdGhlIGxpYm5kY3RsIHVuaXQNCnRlc3QuDQoNCkxJQk5EQ1RMOiBD b250ZXh0DQpFdmVyeSBhcGkgY2FsbCBpbiB0aGUgTElCTkRDVEwgbGlicmFyeSByZXF1aXJlcyBh IGNvbnRleHQgdGhhdCBob2xkcyB0aGUNCmxvZ2dpbmcgcGFyYW1ldGVycyBhbmQgb3RoZXIgbGli cmFyeSBpbnN0YW5jZSBzdGF0ZS4gIFRoZSBsaWJyYXJ5IGlzDQpiYXNlZCBvbiB0aGUgbGliYWJj IHRlbXBsYXRlOg0KaHR0cHM6Ly9naXQua2VybmVsLm9yZy9jZ2l0L2xpbnV4L2tlcm5lbC9naXQv a2F5L2xpYmFiYy5naXQvIGxpYm5kY3RsOg0KaW5zdGFudGlhdGUgYSBuZXcgbGlicmFyeSBjb250 ZXh0IGV4YW1wbGUNCg0KCXN0cnVjdCBuZGN0bF9jdHggKmN0eDsNCg0KCWlmIChuZGN0bF9uZXco JmN0eCkgPT0gMCkNCgkJcmV0dXJuIGN0eDsNCgllbHNlDQoJCXJldHVybiBOVUxMOw0KDQpMSUJO RC9MSUJORENUTDogQnVzDQotLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgYnVzIGhhcyBhIDE6MSBy ZWxhdGlvbnNoaXAgd2l0aCBhbiBORklULiAgVGhlIGN1cnJlbnQgZXhwZWN0YXRpb24gZm9yDQpB Q1BJIGJhc2VkIHN5c3RlbXMgaXMgdGhhdCB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lIHBsYXRmb3Jt LWdsb2JhbCBORklULg0KVGhhdCBzYWlkLCBpdCBpcyB0cml2aWFsIHRvIHJlZ2lzdGVyIG11bHRp cGxlIE5GSVRzLCB0aGUgc3BlY2lmaWNhdGlvbg0KZG9lcyBub3QgcHJlY2x1ZGUgaXQuICBUaGUg aW5mcmFzdHJ1Y3R1cmUgc3VwcG9ydHMgbXVsdGlwbGUgYnVzc2VzIGFuZA0Kd2Ugd2UgdXNlIHRo aXMgY2FwYWJpbGl0eSB0byB0ZXN0IG11bHRpcGxlIE5GSVQgY29uZmlndXJhdGlvbnMgaW4gdGhl DQp1bml0IHRlc3QuDQoNCmxpYm5kOiBjb250cm9sIGNsYXNzIGRldmljZSBpbiAvc3lzL2NsYXNz DQoNClRoaXMgY2hhcmFjdGVyIGRldmljZSBhY2NlcHRzIERTTSBtZXNzYWdlcyB0byBiZSBwYXNz ZWQgdG8gRElNTQ0KaWRlbnRpZmllZCBieSBpdHMgTkZJVCBoYW5kbGUuDQoNCgkvc3lzL2NsYXNz L25kL25kY3RsMA0KCXwtLSBkZXYNCgl8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL25kYnVzMA0KCXwt LSBzdWJzeXN0ZW0gLT4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vY2xhc3MvbmQNCg0KDQoNCmxpYm5k OiBidXMNCg0KCXN0cnVjdCBuZF9idXMgKm5kX2J1c19yZWdpc3RlcihzdHJ1Y3QgZGV2aWNlICpw YXJlbnQsDQoJICAgICAgIHN0cnVjdCBuZF9idXNfZGVzY3JpcHRvciAqbmZpdF9kZXNjKTsNCg0K CS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czANCgl8LS0gYnR0MA0KCXwt LSBidHRfc2VlZA0KCXwtLSBjb21tYW5kcw0KCXwtLSBuZA0KCXwtLSBuZml0DQoJfC0tIG5tZW0w DQoJfC0tIG5tZW0xDQoJfC0tIG5tZW0yDQoJfC0tIG5tZW0zDQoJfC0tIHBvd2VyDQoJfC0tIHBy b3ZpZGVyDQoJfC0tIHJlZ2lvbjANCgl8LS0gcmVnaW9uMQ0KCXwtLSByZWdpb24yDQoJfC0tIHJl Z2lvbjMNCgl8LS0gcmVnaW9uNA0KCXwtLSByZWdpb241DQoJfC0tIHVldmVudA0KCWAtLSB3YWl0 X3Byb2JlDQoNCmxpYm5kY3RsOiBidXMgZW51bWVyYXRpb24gZXhhbXBsZQ0KRmluZCB0aGUgYnVz IGhhbmRsZSB0aGF0IGRlc2NyaWJlcyB0aGUgYnVzIGZyb20gRXhhbXBsZSBOVkRJTU0gUGxhdGZv cm0NCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfYnVzICpnZXRfYnVzX2J5X3Byb3ZpZGVyKHN0cnVj dCBuZGN0bF9jdHggKmN0eCwNCgkJCWNvbnN0IGNoYXIgKnByb3ZpZGVyKQ0KCXsNCgkJc3RydWN0 IG5kY3RsX2J1cyAqYnVzOw0KDQoJCW5kY3RsX2J1c19mb3JlYWNoKGN0eCwgYnVzKQ0KCQkJaWYg KHN0cmNtcChwcm92aWRlciwgbmRjdGxfYnVzX2dldF9wcm92aWRlcihidXMpKSA9PSAwKQ0KCQkJ CXJldHVybiBidXM7DQoNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KDQoJYnVzID0gZ2V0X2J1c19ieV9w cm92aWRlcihjdHgsICJuZml0X3Rlc3QuMCIpOw0KDQoNCkxJQk5EL0xJQk5EQ1RMOiBESU1NIChO TUVNKQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNClRoZSBESU1NIGRldmljZSBwcm92 aWRlcyBhIGNoYXJhY3RlciBkZXZpY2UgZm9yIHNlbmRpbmcgY29tbWFuZHMgdG8NCmhhcmR3YXJl LCBhbmQgaXQgaXMgYSBjb250YWluZXIgZm9yIExBQkVMcy4gIElmIHRoZSBESU1NIGlzIGRlZmlu ZWQgYnkNCk5GSVQgdGhlbiBhbiBvcHRpb25hbCAnbmZpdCcgYXR0cmlidXRlIHN1Yi1kaXJlY3Rv cnkgaXMgYXZhaWxhYmxlIHRvIGFkZA0KTkZJVC1zcGVjaWZpY3MuDQoNCk5vdGUgdGhhdCB0aGUg a2VybmVsIGRldmljZSBuYW1lIGZvciAiRElNTXMiIGlzICJubWVtWCIuICBUaGUgTkZJVA0KZGVz Y3JpYmVzIHRoZXNlIGRldmljZXMgdmlhICJNZW1vcnkgRGV2aWNlIHRvIFN5c3RlbSBQaHlzaWNh bCBBZGRyZXNzDQpSYW5nZSBNYXBwaW5nIFN0cnVjdHVyZSIsIGFuZCB0aGVyZSBpcyBubyByZXF1 aXJlbWVudCB0aGF0IHRoZXkgYWN0dWFsbHkNCmJlIHBoeXNpY2FsIERJTU1zLCBzbyB3ZSB1c2Ug YSBtb3JlIGdlbmVyaWMgbmFtZS4NCg0KbGlibmQ6IERJTU0gKE5NRU0pDQoNCglzdHJ1Y3QgbmRf ZGltbSAqbmRfZGltbV9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRfYnVzLCB2b2lkICpwcm92aWRl cl9kYXRhLA0KCQkJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCAqKmdyb3VwcywgdW5zaWdu ZWQgbG9uZyBmbGFncywNCgkJCXVuc2lnbmVkIGxvbmcgKmRzbV9tYXNrKTsNCg0KCS9zeXMvZGV2 aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czANCgl8LS0gbm1lbTANCgl8ICAgfC0tIGF2 YWlsYWJsZV9zbG90cw0KCXwgICB8LS0gY29tbWFuZHMNCgl8ICAgfC0tIGRldg0KCXwgICB8LS0g ZGV2dHlwZQ0KCXwgICB8LS0gZHJpdmVyIC0+IC4uLy4uLy4uLy4uLy4uL2J1cy9uZC9kcml2ZXJz L25kX2RpbW0NCgl8ICAgfC0tIG1vZGFsaWFzDQoJfCAgIHwtLSBuZml0DQoJfCAgIHwgICB8LS0g ZGV2aWNlDQoJfCAgIHwgICB8LS0gZm9ybWF0DQoJfCAgIHwgICB8LS0gaGFuZGxlDQoJfCAgIHwg ICB8LS0gcGh5c19pZA0KCXwgICB8ICAgfC0tIHJldl9pZA0KCXwgICB8ICAgfC0tIHNlcmlhbA0K CXwgICB8ICAgYC0tIHZlbmRvcg0KCXwgICB8LS0gc3RhdGUNCgl8ICAgfC0tIHN1YnN5c3RlbSAt PiAuLi8uLi8uLi8uLi8uLi9idXMvbmQNCgl8ICAgYC0tIHVldmVudA0KCXwtLSBubWVtMQ0KCVsu Ll0NCg0KDQpsaWJuZGN0bDogRElNTSBlbnVtZXJhdGlvbiBleGFtcGxlDQoNCk5vdGUsIGluIHRo aXMgZXhhbXBsZSB3ZSBhcmUgYXNzdW1pbmcgTkZJVC1kZWZpbmVkIERJTU1zIHdoaWNoIGFyZQ0K aWRlbnRpZmllZCBieSBhbiAibmZpdF9oYW5kbGUiIGEgMzItYml0IHZhbHVlIHdoZXJlOg0KQml0 IDM6MCBESU1NIG51bWJlciB3aXRoaW4gdGhlIG1lbW9yeSBjaGFubmVsDQpCaXQgNzo0IG1lbW9y eSBjaGFubmVsIG51bWJlcg0KQml0IDExOjggbWVtb3J5IGNvbnRyb2xsZXIgSUQNCkJpdCAxNTox MiBzb2NrZXQgSUQgKHdpdGhpbiBzY29wZSBvZiBhIE5vZGUgY29udHJvbGxlciBpZiBub2RlIGNv bnRyb2xsZXIgaXMgcHJlc2VudCkNCkJpdCAyNzoxNiBOb2RlIENvbnRyb2xsZXIgSUQgDQpCaXQg MzE6MjggUmVzZXJ2ZWQNCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfZGltbSAqZ2V0X2RpbW1fYnlf aGFuZGxlKHN0cnVjdCBuZGN0bF9idXMgKmJ1cywNCgkgICAgICAgdW5zaWduZWQgaW50IGhhbmRs ZSkNCgl7DQoJCXN0cnVjdCBuZGN0bF9kaW1tICpkaW1tOw0KDQoJCW5kY3RsX2RpbW1fZm9yZWFj aChidXMsIGRpbW0pDQoJCQlpZiAobmRjdGxfZGltbV9nZXRfaGFuZGxlKGRpbW0pID09IGhhbmRs ZSkNCgkJCQlyZXR1cm4gZGltbTsNCg0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCgkjZGVmaW5lIERJ TU1fSEFORExFKG4sIHMsIGksIGMsIGQpIFwNCgkJKCgobiAmIDB4ZmZmKSA8PCAxNikgfCAoKHMg JiAweGYpIDw8IDEyKSB8ICgoaSAmIDB4ZikgPDwgOCkgXA0KCQkgfCAoKGMgJiAweGYpIDw8IDQp IHwgKGQgJiAweGYpKQ0KDQoJZGltbSA9IGdldF9kaW1tX2J5X2hhbmRsZShidXMsIERJTU1fSEFO RExFKDAsIDAsIDAsIDAsIDApKTsNCg0KTElCTkQvTElCTkRDVEw6IFJlZ2lvbg0KLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQ0KDQpBIGdlbmVyaWMgUkVHSU9OIGRldmljZSBpcyByZWdpc3RlcmVkIGZv ciBlYWNoIFBNRU0gcmFuZ2Ugb3JCTEstYXBlcnR1cmUNCnNldC4gIFBlciB0aGUgZXhhbXBsZSB0 aGVyZSBhcmUgNiByZWdpb25zOiAyIFBNRU0gYW5kIDQgQkxLLWFwZXJ0dXJlDQpzZXRzIG9uIHRo ZSAibmZpdF90ZXN0LjAiIGJ1cy4gIFRoZSBwcmltYXJ5IHJvbGUgb2YgcmVnaW9ucyBhcmUgdG8g YmUgYQ0KY29udGFpbmVyIG9mICJtYXBwaW5ncyIuICBBIG1hcHBpbmcgaXMgYSB0dXBsZSBvZiA8 RElNTSwNCkRQQS1zdGFydC1vZmZzZXQsIGxlbmd0aD4uDQoNCkxJQk5EIHByb3ZpZGVzIGEgYnVp bHQtaW4gZHJpdmVyIGZvciB0aGVzZSBSRUdJT04gZGV2aWNlcy4gIFRoaXMgZHJpdmVyDQppcyBy ZXNwb25zaWJsZSBmb3IgcmVjb25jaWxpbmcgdGhlIGFsaWFzZWQgRFBBIG1hcHBpbmdzIGFjcm9z cyBhbGwNCnJlZ2lvbnMsIHBhcnNpbmcgdGhlIExBQkVMLCBpZiBwcmVzZW50LCBhbmQgdGhlbiBl bWl0dGluZyBOQU1FU1BBQ0UNCmRldmljZXMgd2l0aCB0aGUgcmVzb2x2ZWQvZXhjbHVzaXZlIERQ QS1ib3VuZGFyaWVzIGZvciB0aGUgbmRfcG1lbSBvcg0KbmRfYmxrIGRldmljZSBkcml2ZXIgdG8g Y29uc3VtZS4NCg0KSW4gYWRkaXRpb24gdG8gdGhlIGdlbmVyaWMgYXR0cmlidXRlcyBvZiAibWFw cGluZyJzLCAiaW50ZXJsZWF2ZV93YXlzIg0KYW5kICJzaXplIiB0aGUgUkVHSU9OIGRldmljZSBh bHNvIGV4cG9ydHMgc29tZSBjb252ZW5pZW5jZSBhdHRyaWJ1dGVzLg0KIm5zdHlwZSIgaW5kaWNh dGVzIHRoZSBpbnRlZ2VyIHR5cGUgb2YgbmFtZXNwYWNlLWRldmljZSB0aGlzIHJlZ2lvbg0KZW1p dHMsICJkZXZ0eXBlIiBkdXBsaWNhdGVzIHRoZSBERVZUWVBFIHZhcmlhYmxlIHN0b3JlZCBieSB1 ZGV2IGF0IHRoZQ0KJ2FkZCcgZXZlbnQsICJtb2RhbGlhcyIgZHVwbGljYXRlcyB0aGUgTU9EQUxJ QVMgdmFyaWFibGUgc3RvcmVkIGJ5IHVkZXYNCmF0IHRoZSAnYWRkJyBldmVudCwgYW5kIGZpbmFs bHksIHRoZSBvcHRpb25hbCAic3BhX2luZGV4IiBpcyBwcm92aWRlZCBpbg0KdGhlIGNhc2Ugd2hl cmUgdGhlIHJlZ2lvbiBpcyBkZWZpbmVkIGJ5IGEgU1BBLg0KDQpsaWJuZDogcmVnaW9uDQoNCglz dHJ1Y3QgbmRfcmVnaW9uICpuZF9wbWVtX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRf YnVzLA0KCQkJc3RydWN0IG5kX3JlZ2lvbl9kZXNjICpuZHJfZGVzYyk7DQoJc3RydWN0IG5kX3Jl Z2lvbiAqbmRfYmxrX3JlZ2lvbl9jcmVhdGUoc3RydWN0IG5kX2J1cyAqbmRfYnVzLA0KCQkJc3Ry dWN0IG5kX3JlZ2lvbl9kZXNjICpuZHJfZGVzYyk7DQoNCgkvc3lzL2RldmljZXMvcGxhdGZvcm0v bmZpdF90ZXN0LjAvbmRidXMwDQoJfC0tIHJlZ2lvbjANCgl8ICAgfC0tIGF2YWlsYWJsZV9zaXpl DQoJfCAgIHwtLSBkZXZ0eXBlDQoJfCAgIHwtLSBkcml2ZXIgLT4gLi4vLi4vLi4vLi4vLi4vYnVz L25kL2RyaXZlcnMvbmRfcmVnaW9uDQoJfCAgIHwtLSBpbml0X25hbWVzcGFjZXMNCgl8ICAgfC0t IG1hcHBpbmcwDQoJfCAgIHwtLSBtYXBwaW5nMQ0KCXwgICB8LS0gbWFwcGluZ3MNCgl8ICAgfC0t IG1vZGFsaWFzDQoJfCAgIHwtLSBuYW1lc3BhY2UwLjANCgl8ICAgfC0tIG5hbWVzcGFjZV9zZWVk DQoJfCAgIHwtLSBuZml0DQoJfCAgIHwgICBgLS0gc3BhX2luZGV4DQoJfCAgIHwtLSBuc3R5cGUN Cgl8ICAgfC0tIHNldF9jb29raWUNCgl8ICAgfC0tIHNpemUNCgl8ICAgfC0tIHN1YnN5c3RlbSAt PiAuLi8uLi8uLi8uLi8uLi9idXMvbmQNCgl8ICAgYC0tIHVldmVudA0KCXwtLSByZWdpb24xDQoJ Wy4uXQ0KDQpsaWJuZGN0bDogcmVnaW9uIGVudW1lcmF0aW9uIGV4YW1wbGUNCg0KU2FtcGxlIHJl Z2lvbiByZXRyaWV2YWwgcm91dGluZXMgYmFzZWQgb24gTkZJVC11bmlxdWUgZGF0YSBsaWtlDQoi c3BhX2luZGV4IiAoaW50ZXJsZWF2ZSBzZXQgaWQpIGZvciBQTUVNIGFuZCAibmZpdF9oYW5kbGUi IChkaW1tIGlkKSBmb3INCkJMSy4NCg0KCXN0YXRpYyBzdHJ1Y3QgbmRjdGxfcmVnaW9uICpnZXRf cG1lbV9yZWdpb25fYnlfc3BhX2luZGV4KHN0cnVjdCBuZGN0bF9idXMgKmJ1cywNCgkJCXVuc2ln bmVkIGludCBzcGFfaW5kZXgpDQoJew0KCQlzdHJ1Y3QgbmRjdGxfcmVnaW9uICpyZWdpb247DQoN CgkJbmRjdGxfcmVnaW9uX2ZvcmVhY2goYnVzLCByZWdpb24pIHsNCgkJCWlmIChuZGN0bF9yZWdp b25fZ2V0X3R5cGUocmVnaW9uKSAhPSBORF9ERVZJQ0VfUkVHSU9OX1BNRU0pDQoJCQkJY29udGlu dWU7DQoJCQlpZiAobmRjdGxfcmVnaW9uX2dldF9zcGFfaW5kZXgocmVnaW9uKSA9PSBzcGFfaW5k ZXgpDQoJCQkJcmV0dXJuIHJlZ2lvbjsNCgkJfQ0KCQlyZXR1cm4gTlVMTDsNCgl9DQoNCglzdGF0 aWMgc3RydWN0IG5kY3RsX3JlZ2lvbiAqZ2V0X2Jsa19yZWdpb25fYnlfZGltbV9oYW5kbGUoc3Ry dWN0IG5kY3RsX2J1cyAqYnVzLA0KCQkJdW5zaWduZWQgaW50IGhhbmRsZSkNCgl7DQoJCXN0cnVj dCBuZGN0bF9yZWdpb24gKnJlZ2lvbjsNCg0KCQluZGN0bF9yZWdpb25fZm9yZWFjaChidXMsIHJl Z2lvbikgew0KCQkJc3RydWN0IG5kY3RsX21hcHBpbmcgKm1hcDsNCg0KCQkJaWYgKG5kY3RsX3Jl Z2lvbl9nZXRfdHlwZShyZWdpb24pICE9IE5EX0RFVklDRV9SRUdJT05fQkxPQ0spDQoJCQkJY29u dGludWU7DQoJCQluZGN0bF9tYXBwaW5nX2ZvcmVhY2gocmVnaW9uLCBtYXApIHsNCgkJCQlzdHJ1 Y3QgbmRjdGxfZGltbSAqZGltbSA9IG5kY3RsX21hcHBpbmdfZ2V0X2RpbW0obWFwKTsNCg0KCQkJ CWlmIChuZGN0bF9kaW1tX2dldF9oYW5kbGUoZGltbSkgPT0gaGFuZGxlKQ0KCQkJCQlyZXR1cm4g cmVnaW9uOw0KCQkJfQ0KCQl9DQoJCXJldHVybiBOVUxMOw0KCX0NCg0KDQpXaHkgTm90IEVuY29k ZSB0aGUgUmVnaW9uIFR5cGUgaW50byB0aGUgUmVnaW9uIE5hbWU/DQotLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkF0IGZpcnN0IGdsYW5jZSBp dCBzZWVtcyBzaW5jZSBORklUIGRlZmluZXMganVzdCBQTUVNIGFuZCBCTEsgaW50ZXJmYWNlDQp0 eXBlcyB0aGF0IHdlIHNob3VsZCBzaW1wbHkgbmFtZSBSRUdJT04gZGV2aWNlcyB3aXRoIHNvbWV0 aGluZyBkZXJpdmVkDQpmcm9tIHRob3NlIHR5cGUgbmFtZXMuICBIb3dldmVyLCB0aGUgTkQgc3Vi c3lzdGVtIGV4cGxpY2l0bHkga2VlcHMgdGhlDQpSRUdJT04gbmFtZSBnZW5lcmljIGFuZCBleHBl Y3RzIHVzZXJzcGFjZSB0byBhbHdheXMgY29uc2lkZXIgdGhlDQpyZWdpb24tYXR0cmlidXRlcyBm b3IgNCByZWFzb25zOg0KDQogICAgMS4gVGhlcmUgYXJlIGFscmVhZHkgbW9yZSB0aGFuIHR3byBS RUdJT04gYW5kICJuYW1lc3BhY2UiIHR5cGVzLiAgRm9yDQogICAgUE1FTSB0aGVyZSBhcmUgdHdv IHN1YnR5cGVzLiAgQXMgbWVudGlvbmVkIHByZXZpb3VzbHkgd2UgaGF2ZSBQTUVNIHdoZXJlDQog ICAgdGhlIGNvbnN0aXR1ZW50IERJTU0gZGV2aWNlcyBhcmUga25vd24gYW5kIGFub255bW91cyBQ TUVNLiAgRm9yIEJMSw0KICAgIHJlZ2lvbnMgdGhlIE5GSVQgc3BlY2lmaWNhdGlvbiBhbHJlYWR5 IGFudGljaXBhdGVzIHZlbmRvciBzcGVjaWZpYw0KICAgIGltcGxlbWVudGF0aW9ucy4gIFRoZSBl eGFjdCBkaXN0aW5jdGlvbiBvZiB3aGF0IGEgcmVnaW9uIGNvbnRhaW5zIGlzIGluDQogICAgdGhl IHJlZ2lvbi1hdHRyaWJ1dGVzIG5vdCB0aGUgcmVnaW9uLW5hbWUgb3IgdGhlIHJlZ2lvbi1kZXZ0 eXBlLg0KICAgIA0KICAgIDIuIEEgcmVnaW9uIHdpdGggemVybyBjaGlsZC1uYW1lc3BhY2VzIGlz IGEgcG9zc2libGUgY29uZmlndXJhdGlvbi4gIEZvcg0KICAgIGV4YW1wbGUsIHRoZSBORklUIGFs bG93cyBmb3IgYSBEQ1IgdG8gYmUgcHVibGlzaGVkIHdpdGhvdXQgYQ0KICAgIGNvcnJlc3BvbmRp bmcgQkxLLWFwZXJ0dXJlLiAgVGhpcyBlcXVhdGVzIHRvIGEgRElNTSB0aGF0IGNhbiBvbmx5IGFj Y2VwdA0KICAgIGNvbnRyb2wvY29uZmlndXJhdGlvbiBtZXNzYWdlcywgYnV0IG5vIGkvbyB0aHJv dWdoIGEgZGVzY2VuZGFudCBibG9jaw0KICAgIGRldmljZS4gIEFnYWluLCB0aGlzICJ0eXBlIiBp cyBhZHZlcnRpc2VkIGluIHRoZSBhdHRyaWJ1dGVzICgnbWFwcGluZ3MnDQogICAgPT0gMCkgYW5k IHRoZSBuYW1lIGRvZXMgbm90IHRlbGwgeW91IG11Y2guDQogICAgDQogICAgMy4gV2hhdCBpZiBh IHRoaXJkIG1ham9yIGludGVyZmFjZSB0eXBlIGFyaXNlcyBpbiB0aGUgZnV0dXJlPyAgT3V0c2lk ZQ0KICAgIG9mIHZlbmRvciBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMsIGl0J3Mgbm90IGRpZmZp Y3VsdCB0byBlbnZpc2lvbiBhDQogICAgdGhpcmQgY2xhc3Mgb2YgaW50ZXJmYWNlIHR5cGUgYmV5 b25kIEJMSyBhbmQgUE1FTS4gIFdpdGggYSBnZW5lcmljIG5hbWUNCiAgICBmb3IgdGhlIFJFR0lP TiBsZXZlbCBvZiB0aGUgZGV2aWNlLWhpZXJhcmNoeSBvbGQgdXNlcnNwYWNlDQogICAgaW1wbGVt ZW50YXRpb25zIGNhbiBzdGlsbCBtYWtlIHNlbnNlIG9mIG5ldyBrZXJuZWwgYWR2ZXJ0aXNlZA0K ICAgIHJlZ2lvbi10eXBlcy4gIFVzZXJzcGFjZSBjYW4gYWx3YXlzIHJlbHkgb24gdGhlIGdlbmVy aWMgcmVnaW9uDQogICAgYXR0cmlidXRlcyBsaWtlICJtYXBwaW5ncyIsICJzaXplIiwgZXRjIGFu ZCB0aGUgZXhwZWN0ZWQgY2hpbGQgZGV2aWNlcw0KICAgIG5hbWVkICJuYW1lc3BhY2UiLiAgVGhp cyBnZW5lcmljIGZvcm1hdCBvZiB0aGUgZGV2aWNlLW1vZGVsIGhpZXJhcmNoeQ0KICAgIGFsbG93 cyB0aGUgTElCTkQgYW5kIExJQk5EQ1RMIGltcGxlbWVudGF0aW9ucyB0byBiZSBtb3JlIHVuaWZv cm0gYW5kDQogICAgZnV0dXJlLXByb29mLg0KICAgIA0KICAgIDQuIFRoZXJlIGFyZSBtb3JlIHJv YnVzdCBtZWNoYW5pc21zIGZvciBkZXRlcm1pbmluZyB0aGUgbWFqb3IgdHlwZSBvZiBhDQogICAg cmVnaW9uIHRoYW4gYSBkZXZpY2UgbmFtZS4gIFNlZSB0aGUgbmV4dCBzZWN0aW9uLCBIb3cgRG8g SSBEZXRlcm1pbmUgdGhlDQogICAgTWFqb3IgVHlwZSBvZiBhIFJlZ2lvbj8NCg0KSG93IERvIEkg RGV0ZXJtaW5lIHRoZSBNYWpvciBUeXBlIG9mIGEgUmVnaW9uPw0KLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpPdXRzaWRlIG9mIHRoZSBibGFua2V0IHJl Y29tbWVuZGF0aW9uIG9mICJ1c2UgbGlibmRjdGwiLCBvciBzaW1wbHkNCmxvb2tpbmcgYXQgdGhl IGtlcm5lbCBoZWFkZXIgKC91c3IvaW5jbHVkZS9saW51eC9uZGN0bC5oKSB0byBkZWNvZGUgdGhl DQoibnN0eXBlIiBpbnRlZ2VyIGF0dHJpYnV0ZSwgaGVyZSBhcmUgc29tZSBvdGhlciBvcHRpb25z Lg0KDQogICAgMS4gbW9kdWxlIGFsaWFzIGxvb2t1cDoNCiAgICANCiAgICBUaGUgd2hvbGUgcG9p bnQgb2YgcmVnaW9uL25hbWVzcGFjZSBkZXZpY2UgdHlwZSBkaWZmZXJlbnRpYXRpb24gaXMgdG8N CiAgICBkZWNpZGUgd2hpY2ggYmxvY2stZGV2aWNlIGRyaXZlciB3aWxsIGF0dGFjaCB0byBhIGdp dmVuIExJQk5EIG5hbWVzcGFjZS4NCiAgICBPbmUgY2FuIHNpbXBseSB1c2UgdGhlIG1vZGFsaWFz IHRvIGxvb2t1cCB0aGUgcmVzdWx0aW5nIG1vZHVsZS4gIEl0J3MNCiAgICBpbXBvcnRhbnQgdG8g bm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIHJvYnVzdCBpbiB0aGUgcHJlc2VuY2Ugb2YgYQ0KICAg IHZlbmRvci1zcGVjaWZpYyBkcml2ZXIgZG93biB0aGUgcm9hZC4gIElmIGEgdmVuZG9yLXNwZWNp ZmljDQogICAgaW1wbGVtZW50YXRpb24gd2FudHMgdG8gc3VwcGxhbnQgdGhlIHN0YW5kYXJkIG5k X2JsayBkcml2ZXIgaXQgY2FuIHdpdGgNCiAgICBtaW5pbWFsIGltcGFjdCB0byB0aGUgcmVzdCBv ZiBMSUJORC4NCiAgICANCiAgICBJbiBmYWN0LCBhIHZlbmRvciBtYXkgYWxzbyB3YW50IHRvIGhh dmUgYSB2ZW5kb3Itc3BlY2lmaWMgcmVnaW9uLWRyaXZlcg0KICAgIChvdXRzaWRlIG9mIG5kX3Jl Z2lvbikuICBGb3IgZXhhbXBsZSwgaWYgYSB2ZW5kb3IgZGVmaW5lZCBpdHMgb3duIExBQkVMDQog ICAgZm9ybWF0IGl0IHdvdWxkIG5lZWQgaXRzIG93biByZWdpb24gZHJpdmVyIHRvIHBhcnNlIHRo YXQgTEFCRUwgYW5kIGVtaXQNCiAgICB0aGUgcmVzdWx0aW5nIG5hbWVzcGFjZXMuICBUaGUgb3V0 cHV0IGZyb20gbW9kdWxlIHJlc29sdXRpb24gaXMgbW9yZQ0KICAgIGFjY3VyYXRlIHRoYW4gYSBy ZWdpb24tbmFtZSBvciByZWdpb24tZGV2dHlwZS4NCiAgICANCiAgICAyLiB1ZGV2Og0KICAgIA0K ICAgIFRoZSBrZXJuZWwgImRldnR5cGUiIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIHVkZXYgZGF0YWJh c2UNCiAgICAjIHVkZXZhZG0gaW5mbyAtLXBhdGg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0 LjAvbmRidXMwL3JlZ2lvbjAgDQogICAgUDogL2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAv bmRidXMwL3JlZ2lvbjANCiAgICBFOiBERVZQQVRIPS9kZXZpY2VzL3BsYXRmb3JtL25maXRfdGVz dC4wL25kYnVzMC9yZWdpb24wDQogICAgRTogREVWVFlQRT1uZF9wbWVtDQogICAgRTogTU9EQUxJ QVM9bmQ6dDINCiAgICBFOiBTVUJTWVNURU09bmQNCiAgICANCiAgICAjIHVkZXZhZG0gaW5mbyAt LXBhdGg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAvbmRidXMwL3JlZ2lvbjQNCiAgICBQ OiAvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMC9uZGJ1czAvcmVnaW9uNA0KICAgIEU6IERF VlBBVEg9L2RldmljZXMvcGxhdGZvcm0vbmZpdF90ZXN0LjAvbmRidXMwL3JlZ2lvbjQNCiAgICBF OiBERVZUWVBFPW5kX2Jsaw0KICAgIEU6IE1PREFMSUFTPW5kOnQzDQogICAgRTogU1VCU1lTVEVN PW5kDQogICAgDQogICAgLi4uYW5kIGlzIGF2YWlsYWJsZSBhcyBhIHJlZ2lvbiBhdHRyaWJ1dGUs IGJ1dCBrZWVwIGluIG1pbmQgdGhhdCB0aGUNCiAgICAiZGV2dHlwZSIgZG9lcyBub3QgaW5kaWNh dGUgc3ViLXR5cGUgdmFyaWF0aW9ucyBhbmQgc2NyaXB0cyBzaG91bGQNCiAgICByZWFsbHkgYmUg dW5kZXJzdGFuZGluZyB0aGUgb3RoZXIgYXR0cmlidXRlcy4NCiAgICANCiAgICAzLiB0eXBlIHNw ZWNpZmljIGF0dHJpYnV0ZXM6DQogICAgDQogICAgQXMgaXQgY3VycmVudGx5IHN0YW5kcyBhIEJM Sy1hcGVydHVyZSByZWdpb24gd2lsbCBuZXZlciBoYXZlIGENCiAgICAibmZpdC9zcGFfaW5kZXgi IGF0dHJpYnV0ZSwgYnV0IG5laXRoZXIgd2lsbCBhIG5vbi1ORklUIFBNRU0gcmVnaW9uLiAgQQ0K ICAgIEJMSyByZWdpb24gd2l0aCBhICJtYXBwaW5ncyIgdmFsdWUgb2YgMCBpcywgYXMgbWVudGlv bmVkIGFib3ZlLCBhIERJTU0NCiAgICB0aGF0IGRvZXMgbm90IGFsbG93IEkvTy4gIEEgUE1FTSBy ZWdpb24gd2l0aCBhICJtYXBwaW5ncyIgdmFsdWUgb2YgemVybw0KICAgIGlzIGEgc2ltcGxlIHN5 c3RlbS1waHlzaWNhbC1hZGRyZXNzIHJhbmdlLg0KIA0KDQpMSUJORC9MSUJORENUTDogTmFtZXNw YWNlDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgUkVHSU9OLCBhZnRlciByZXNvbHZp bmcgRFBBIGFsaWFzaW5nIGFuZCBMQUJFTCBzcGVjaWZpZWQgYm91bmRhcmllcywNCnN1cmZhY2Vz IG9uZSBvciBtb3JlICJuYW1lc3BhY2UiIGRldmljZXMuICBUaGUgYXJyaXZhbCBvZiBhICJuYW1l c3BhY2UiDQpkZXZpY2UgY3VycmVudGx5IHRyaWdnZXJzIGVpdGhlciB0aGUgbmRfYmxrIG9yIG5k X3BtZW0gZHJpdmVyIHRvIGxvYWQNCmFuZCByZWdpc3RlciBhIGRpc2svYmxvY2sgZGV2aWNlLg0K DQpsaWJuZDogbmFtZXNwYWNlDQpIZXJlIGlzIGEgc2FtcGxlIGxheW91dCBmcm9tIHRoZSB0aHJl ZSBtYWpvciB0eXBlcyBvZiBOQU1FU1BBQ0Ugd2hlcmUNCm5hbWVzcGFjZTAuMCByZXByZXNlbnRz IERJTU0taW5mby1iYWNrZWQgUE1FTSAobm90ZSB0aGF0IGl0IGhhcyBhICd1dWlkJw0KYXR0cmli dXRlKSwgbmFtZXNwYWNlMi4wIHJlcHJlc2VudHMgYSBCTEsgbmFtZXNwYWNlIChub3RlIGl0IGhh cyBhDQonc2VjdG9yX3NpemUnIGF0dHJpYnV0ZSkgdGhhdCwgYW5kIG5hbWVzcGFjZTYuMCByZXBy ZXNlbnRzIGFuIGFub255bW91cw0KUE1FTSBuYW1lc3BhY2UgKG5vdGUgdGhhdCBoYXMgbm8gJ3V1 aWQnIGF0dHJpYnV0ZSBkdWUgdG8gbm90IHN1cHBvcnQgYQ0KTEFCRUwpLg0KDQoJL3N5cy9kZXZp Y2VzL3BsYXRmb3JtL25maXRfdGVzdC4wL25kYnVzMC9yZWdpb24wL25hbWVzcGFjZTAuMA0KCXwt LSBhbHRfbmFtZQ0KCXwtLSBkZXZ0eXBlDQoJfC0tIGRwYV9leHRlbnRzDQoJfC0tIG1vZGFsaWFz DQoJfC0tIHJlc291cmNlDQoJfC0tIHNpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4uLy4uLy4u Ly4uLy4uL2J1cy9uZA0KCXwtLSB0eXBlDQoJfC0tIHVldmVudA0KCWAtLSB1dWlkDQoJL3N5cy9k ZXZpY2VzL3BsYXRmb3JtL25maXRfdGVzdC4wL25kYnVzMC9yZWdpb24yL25hbWVzcGFjZTIuMA0K CXwtLSBhbHRfbmFtZQ0KCXwtLSBkZXZ0eXBlDQoJfC0tIGRwYV9leHRlbnRzDQoJfC0tIG1vZGFs aWFzDQoJfC0tIHNlY3Rvcl9zaXplDQoJfC0tIHNpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4u Ly4uLy4uLy4uLy4uL2J1cy9uZA0KCXwtLSB0eXBlDQoJfC0tIHVldmVudA0KCWAtLSB1dWlkDQoJ L3N5cy9kZXZpY2VzL3BsYXRmb3JtL25maXRfdGVzdC4xL25kYnVzMS9yZWdpb242L25hbWVzcGFj ZTYuMA0KCXwtLSBibG9jaw0KCXwgICBgLS0gcG1lbTANCgl8LS0gZGV2dHlwZQ0KCXwtLSBkcml2 ZXIgLT4gLi4vLi4vLi4vLi4vLi4vLi4vYnVzL25kL2RyaXZlcnMvcG1lbQ0KCXwtLSBtb2RhbGlh cw0KCXwtLSByZXNvdXJjZQ0KCXwtLSBzaXplDQoJfC0tIHN1YnN5c3RlbSAtPiAuLi8uLi8uLi8u Li8uLi8uLi9idXMvbmQNCgl8LS0gdHlwZQ0KCWAtLSB1ZXZlbnQNCg0KbGlibmRjdGw6IG5hbWVz cGFjZSBlbnVtZXJhdGlvbiBleGFtcGxlDQpOYW1lc3BhY2VzIGFyZSBpbmRleGVkIHJlbGF0aXZl IHRvIHRoZWlyIHBhcmVudCByZWdpb24sIGV4YW1wbGUgYmVsb3cuICBUaGVzZSBpbmRleGVzIGFy ZSBtb3N0bHkgc3RhdGljIGZyb20gYm9vdCB0byBib290LCBidXQgc3Vic3lzdGVtIG1ha2VzIG5v IGd1YXJhbnRlZXMgaW4gdGhpcyByZWdhcmQuICBGb3IgYSBzdGF0aWMgbmFtZXNwYWNlIGlkZW50 aWZpZXIgdXNlIGl0cyAndXVpZCcgYXR0cmlidXRlLg0KDQpzdGF0aWMgc3RydWN0IG5kY3RsX25h bWVzcGFjZSAqZ2V0X25hbWVzcGFjZV9ieV9pZChzdHJ1Y3QgbmRjdGxfcmVnaW9uICpyZWdpb24s DQogICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkKQ0Kew0KICAgICAgICBzdHJ1Y3QgbmRj dGxfbmFtZXNwYWNlICpuZG5zOw0KDQogICAgICAgIG5kY3RsX25hbWVzcGFjZV9mb3JlYWNoKHJl Z2lvbiwgbmRucykNCiAgICAgICAgICAgICAgICBpZiAobmRjdGxfbmFtZXNwYWNlX2dldF9pZChu ZG5zKSA9PSBpZCkNCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZG5zOw0KDQogICAg ICAgIHJldHVybiBOVUxMOw0KfQ0KDQpsaWJuZGN0bDogbmFtZXNwYWNlIGNyZWF0aW9uIGV4YW1w bGUNCklkbGUgbmFtZXNwYWNlcyBhcmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHRoZSBrZXJu ZWwgaWYgYSBnaXZlbiByZWdpb24gaGFzIGVub3VnaCBhdmFpbGFibGUgY2FwYWNpdHkgdG8gY3Jl YXRlIGEgbmV3IG5hbWVzcGFjZS4gIE5hbWVzcGFjZSBpbnN0YW50aWF0aW9uIGludm9sdmVzIGZp bmRpbmcgYW4gaWRsZSBuYW1lc3BhY2UgYW5kIGNvbmZpZ3VyaW5nIGl0LiAgRm9yIHRoZSBtb3N0 IHBhcnQgdGhlIHNldHRpbmcgb2YgbmFtZXNwYWNlIGF0dHJpYnV0ZXMgY2FuIG9jY3VyIGluIGFu eSBvcmRlciwgdGhlIG9ubHkgY29uc3RyYWludCBpcyB0aGF0ICd1dWlkJyBtdXN0IGJlIHNldCBi ZWZvcmUgJ3NpemUnLiAgVGhpcyBlbmFibGVzIHRoZSBrZXJuZWwgdG8gdHJhY2sgRFBBIGFsbG9j YXRpb25zIGludGVybmFsbHkgd2l0aCBhIHN0YXRpYyBpZGVudGlmaWVyLg0KDQpzdGF0aWMgaW50 IGNvbmZpZ3VyZV9uYW1lc3BhY2Uoc3RydWN0IG5kY3RsX3JlZ2lvbiAqcmVnaW9uLA0KICAgICAg ICAgICAgICAgIHN0cnVjdCBuZGN0bF9uYW1lc3BhY2UgKm5kbnMsDQogICAgICAgICAgICAgICAg c3RydWN0IG5hbWVzcGFjZV9wYXJhbWV0ZXJzICpwYXJhbWV0ZXJzKQ0Kew0KICAgICAgICBjaGFy IGRldm5hbWVbNTBdOw0KDQogICAgICAgIHNucHJpbnRmKGRldm5hbWUsIHNpemVvZihkZXZuYW1l KSwgIm5hbWVzcGFjZSVkLiVkIiwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5kY3RsX3JlZ2lv bl9nZXRfaWQocmVnaW9uKSwgcGFyYW1hdGVycy0+aWQpOw0KDQogICAgICAgIG5kY3RsX25hbWVz cGFjZV9zZXRfYWx0X25hbWUobmRucywgZGV2bmFtZSk7DQogICAgICAgIC8qICd1dWlkJyBtdXN0 IGJlIHNldCBwcmlvciB0byBzZXR0aW5nIHNpemUhICovDQogICAgICAgIG5kY3RsX25hbWVzcGFj ZV9zZXRfdXVpZChuZG5zLCBwYXJhbWF0ZXJzLT51dWlkKTsNCiAgICAgICAgbmRjdGxfbmFtZXNw YWNlX3NldF9zaXplKG5kbnMsIHBhcmFtYXRlcnMtPnNpemUpOw0KICAgICAgICAvKiB1bmxpa2Ug cG1lbSBuYW1lc3BhY2VzLCBibGsgbmFtZXNwYWNlcyBoYXZlIGEgc2VjdG9yIHNpemUgKi8NCiAg ICAgICAgaWYgKHBhcmFtZXRlcnMtPmxiYXNpemUpDQogICAgICAgICAgICAgICAgbmRjdGxfbmFt ZXNwYWNlX3NldF9zZWN0b3Jfc2l6ZShuZG5zLCBwYXJhbWV0ZXJzLT5sYmFzaXplKTsNCiAgICAg ICAgbmRjdGxfbmFtZXNwYWNlX2VuYWJsZShuZG5zKTsNCn0NCg0KDQpXaHkgdGhlIFRlcm0gIm5h bWVzcGFjZSI/DQoNCiAgICAxLiBXaHkgbm90ICJ2b2x1bWUiIGZvciBpbnN0YW5jZT8gICJ2b2x1 bWUiIHJhbiB0aGUgcmlzayBvZiBjb25mdXNpbmcgTkQNCiAgICBhcyBhIHZvbHVtZSBtYW5hZ2Vy IGxpa2UgZGV2aWNlLW1hcHBlci4NCiAgICANCiAgICAyLiBUaGUgdGVybSBvcmlnaW5hdGVkIHRv IGRlc2NyaWJlIHRoZSBzdWItZGV2aWNlcyB0aGF0IGNhbiBiZSBjcmVhdGVkDQogICAgd2l0aGlu IGEgTlZNRSBjb250cm9sbGVyIChzZWUgdGhlIG52bWUgc3BlY2lmaWNhdGlvbjoNCiAgICBodHRw Oi8vd3d3Lm52bWV4cHJlc3Mub3JnL3NwZWNpZmljYXRpb25zLyksIGFuZCBORklUIG5hbWVzcGFj ZXMgYXJlDQogICAgbWVhbnQgdG8gcGFyYWxsZWwgdGhlIGNhcGFiaWxpdGllcyBhbmQgY29uZmln dXJhYmlsaXR5IG9mDQogICAgTlZNRS1uYW1lc3BhY2VzLg0KDQoNCkxJQk5EL0xJQk5EQ1RMOiBC bG9jayBUcmFuc2xhdGlvbiBUYWJsZSAiYnR0Ig0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tDQoNCkEgQlRUIChkZXNpZ24gZG9jdW1lbnQ6IGh0dHA6Ly9wbWVt LmlvLzIwMTQvMDkvMjMvYnR0Lmh0bWwpIGlzIGEgc3RhY2tlZA0KYmxvY2sgZGV2aWNlIGRyaXZl ciB0aGF0IGZyb250cyBlaXRoZXIgdGhlIHdob2xlIGJsb2NrIGRldmljZSBvciBhDQpwYXJ0aXRp b24gb2YgYSBibG9jayBkZXZpY2UgZW1pdHRlZCBieSBlaXRoZXIgYSBQTUVNIG9yIEJMSyBOQU1F U1BBQ0UuDQoNCmxpYm5kOiBidHQgbGF5b3V0DQpFdmVyeSBidXMgd2lsbCBzdGFydCBvdXQgd2l0 aCBhdCBsZWFzdCBvbmUgQlRUIGRldmljZSB3aGljaCBpcyB0aGUgc2VlZA0KZGV2aWNlLiAgVG8g YWN0aXZhdGUgaXQgc2V0IHRoZSAiYmFja2luZ19kZXYiLCAidXVpZCIsIGFuZCAic2VjdG9yX3Np emUiDQphdHRyaWJ1dGVzIGFuZCB0aGVuIGJpbmQgdGhlIGRldmljZSB0byB0aGUgbmRfYnR0IGRy aXZlci4NCg0KCS9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9uZml0X3Rlc3QuMS9uZGJ1czAvYnR0MC8N Cgl8LS0gYmFja2luZ19kZXYNCgl8LS0gZGVsZXRlDQoJfC0tIGRldnR5cGUNCgl8LS0gbW9kYWxp YXMNCgl8LS0gc2VjdG9yX3NpemUNCgl8LS0gc3Vic3lzdGVtIC0+IC4uLy4uLy4uLy4uLy4uL2J1 cy9uZA0KCXwtLSB1ZXZlbnQNCglgLS0gdXVpZA0KDQpsaWJuZGN0bDogYnR0IGNyZWF0aW9uIGV4 YW1wbGUNClNpbWlsYXIgdG8gbmFtZXNwYWNlcyBhbiBpZGxlIEJUVCBkZXZpY2UgaXMgYXV0b21h dGljYWxseSBjcmVhdGVkIHBlcg0KYnVzLiAgRWFjaCB0aW1lIHRoaXMgInNlZWQiIGJ0dCBkZXZp Y2UgaXMgY29uZmlndXJlZCBhbmQgZW5hYmxlZCBhIG5ldw0Kc2VlZCBpcyBjcmVhdGVkLiAgQ3Jl YXRpbmcgYSBCVFQgY29uZmlndXJhdGlvbiBpbnZvbHZlcyB0d28gc3RlcHMgb2YNCmZpbmRpbmcg YW5kIGlkbGUgQlRUIGFuZCBhc3NpZ25pbmcgaXQgdG8gZnJvbnQgYSBQTUVNIG9yIEJMSyBuYW1l c3BhY2UuDQoNCglzdGF0aWMgc3RydWN0IG5kY3RsX2J0dCAqZ2V0X2lkbGVfYnR0KHN0cnVjdCBu ZGN0bF9idXMgKmJ1cykNCgl7DQoJCXN0cnVjdCBuZGN0bF9idHQgKmJ0dDsNCg0KCQluZGN0bF9i dHRfZm9yZWFjaChidXMsIGJ0dCkNCgkJCWlmICghbmRjdGxfYnR0X2lzX2VuYWJsZWQoYnR0KSAm JiAhbmRjdGxfYnR0X2lzX2NvbmZpZ3VyZWQoYnR0KSkNCgkJCQlyZXR1cm4gYnR0Ow0KDQoJCXJl dHVybiBOVUxMOw0KCX0NCg0KCXN0YXRpYyBpbnQgY29uZmlndXJlX2J0dChzdHJ1Y3QgbmRjdGxf YnVzICpidXMsIHN0cnVjdCBidHRfcGFyYW1ldGVycyAqcGFyYW1ldGVycykNCgl7DQoJCWJ0dCA9 IGdldF9pZGxlX2J0dChidXMpOw0KDQoJCXNwcmludGYoYmRldnBhdGgsICIvZGV2LyVzIiwNCgkJ CQluZGN0bF9uYW1lc3BhY2VfZ2V0X2Jsb2NrX2RldmljZShwYXJhbWV0ZXJzLT5uZG5zKSk7DQoJ CW5kY3RsX2J0dF9zZXRfdXVpZChidHQsIHBhcmFtZXRlcnMtPnV1aWQpOw0KCQluZGN0bF9idHRf c2V0X3NlY3Rvcl9zaXplKGJ0dCwgcGFyYW1ldGVycy0+c2VjdG9yX3NpemUpOw0KCQluZGN0bF9i dHRfc2V0X2JhY2tpbmdfZGV2KGJ0dCwgcGFyYW1ldGVzLT5iZGV2cGF0aCk7DQoJCW5kY3RsX2J0 dF9lbmFibGUoYnR0KTsNCgl9DQoNCk9uY2UgaW5zdGFudGlhdGVkIGEgIm5kX2J0dCIgbGluayB3 aWxsIGJlIGNyZWF0ZWQgdW5kZXIgdGhlDQoiYmFja2luZ19kZXYiIChwbWVtMCkgYmxvY2sgZGV2 aWNlOg0KDQoJL3N5cy9ibG9jay9wbWVtMC8NCgl8LS0gYWxpZ25tZW50X29mZnNldA0KCXwtLSBi ZGkgLT4gLi4vLi4vLi4vLi4vLi4vLi4vLi4vdmlydHVhbC9iZGkvMjU5OjANCgl8LS0gY2FwYWJp bGl0eQ0KCXwtLSBkZXYNCgl8LS0gZGV2aWNlIC0+IC4uLy4uLy4uL25hbWVzcGFjZTAuMA0KCXwt LSBkaXNjYXJkX2FsaWdubWVudA0KCXwtLSBleHRfcmFuZ2UNCgl8LS0gaG9sZGVycw0KCXwtLSBp bmZsaWdodA0KCXwtLSBuZF9idHQgLT4gLi4vLi4vLi4vLi4vYnR0MA0KDQouLi5hbmQgYSBuZXcg aW5hY3RpdmUgc2VlZCBkZXZpY2Ugd2lsbCBhcHBlYXIgb24gdGhlIGJ1cy4NCg0KT25jZSBhICJi YWNraW5nX2RldiIgaXMgZGlzYWJsZWQgaXRzIGFzc29jaWF0ZWQgQlRUIHdpbGwgYmUNCmF1dG9t YXRpY2FsbHkgZGVsZXRlZC4gIFRoaXMgZGVsZXRpb24gaXMgb25seSBhdCB0aGUgZGV2aWNlIG1v ZGVsIGxldmVsLg0KSW4gb3JkZXIgdG8gZGVzdHJveSBhIEJUVCB0aGUgImluZm8gYmxvY2siIG5l ZWRzIHRvIGJlIGRlc3Ryb3llZC4NCg0KDQpTdW1tYXJ5IExJQk5EQ1RMIERpYWdyYW0NCi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpGb3IgdGhlIGdpdmVuIGV4YW1wbGUgYWJvdmUsIGhlcmUg aXMgdGhlIHZpZXcgb2YgdGhlIG9iamVjdHMgYXMgc2VlbiBieSB0aGUgTElCTkRDVEwgYXBpOg0K ICAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIHxDVFh8ICAgICstLS0tLS0tLS0rICAg Ky0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQogICAgICAgICAgICAr LSstKyAgKy0+IFJFR0lPTjAgKy0tLT4gTkFNRVNQQUNFMC4wICstLT4gUE1FTTggInBtMC4wIiB8 ICAgICAgIA0KICAgICAgICAgICAgICB8ICAgIHwgKy0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0t LS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICANCistLS0tLS0tKyAgICAgfCAgICB8ICstLS0t LS0tLS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQp8IERJ TU0wIDwtKyAgIHwgICAgKy0+IFJFR0lPTjEgKy0tLT4gTkFNRVNQQUNFMS4wICstLT4gUE1FTTYg InBtMS4wIiB8ICAgICAgIA0KKy0tLS0tLS0rIHwgICB8ICAgIHwgKy0tLS0tLS0tLSsgICArLS0t LS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICANCnwgRElNTTEgPC0rICstdi0t KyB8ICstLS0tLS0tLS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAg ICAgDQorLS0tLS0tLSsgKy0rQlVTMCstLS0+IFJFR0lPTjIgKy0rLT4gTkFNRVNQQUNFMi4wICst LT4gTkQ2ICAiYmxrMi4wIiB8ICAgICAgIA0KfCBESU1NMiA8LSsgKy0tLS0rIHwgKy0tLS0tLS0t LSsgfCArLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsNCistLS0tLS0t KyB8ICAgICAgICB8ICAgICAgICAgICAgICstPiBOQU1FU1BBQ0UyLjEgKy0tPiBORDUgICJibGsy LjEiIHwgQlRUMiB8DQp8IERJTU0zIDwtKyAgICAgICAgfCAgICAgICAgICAgICAgICstLS0tLS0t LS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KKy0tLS0tLS0rICAgICAgICAgIHwg Ky0tLS0tLS0tLSsgICArLS0tLS0tLS0tLS0tLS0rICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICAN CiAgICAgICAgICAgICAgICAgICArLT4gUkVHSU9OMyArLSstPiBOQU1FU1BBQ0UzLjAgKy0tPiBO RDQgICJibGszLjAiIHwgICAgICAgDQogICAgICAgICAgICAgICAgICAgfCArLS0tLS0tLS0tKyB8 ICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tKw0KICAgICAgICAgICAg ICAgICAgIHwgICAgICAgICAgICAgKy0+IE5BTUVTUEFDRTMuMSArLS0+IE5EMyAgImJsazMuMSIg fCBCVFQxIHwNCiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0t LS0tKyAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rDQogICAgICAgICAgICAgICAgICAgfCArLS0t LS0tLS0tKyAgICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0rICAgICAgIA0KICAg ICAgICAgICAgICAgICAgICstPiBSRUdJT040ICstLS0+IE5BTUVTUEFDRTQuMCArLS0+IE5EMiAg ImJsazQuMCIgfCAgICAgICANCiAgICAgICAgICAgICAgICAgICB8ICstLS0tLS0tLS0rICAgKy0t LS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSsgICAgICAgDQogICAgICAgICAgICAgICAg ICAgfCArLS0tLS0tLS0tKyAgICstLS0tLS0tLS0tLS0tLSsgICstLS0tLS0tLS0tLS0tLS0tLS0t LS0tKw0KICAgICAgICAgICAgICAgICAgICstPiBSRUdJT041ICstLS0+IE5BTUVTUEFDRTUuMCAr LS0+IE5EMSAgImJsazUuMCIgfCBCVFQwIHwNCiAgICAgICAgICAgICAgICAgICAgICstLS0tLS0t LS0rICAgKy0tLS0tLS0tLS0tLS0tKyAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0rDQoNCg0KDQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751520AbbEHGbV (ORCPT ); Fri, 8 May 2015 02:31:21 -0400 Received: from mga01.intel.com ([192.55.52.88]:41635 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750812AbbEHGbS (ORCPT ); Fri, 8 May 2015 02:31:18 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.13,388,1427785200"; d="scan'208";a="490951992" From: "Williams, Dan J" To: "rjw@rjwysocki.net" CC: "mingo@kernel.org" , "linux-kernel@vger.kernel.org" , "nicholas.w.moulin@linux.intel.com" , "neilb@suse.de" , "jmoyer@redhat.com" , "tglx@linutronix.de" , "torvalds@linux-foundation.org" , "hch@lst.de" , "Moore, Robert" , "Wysocki, Rafael J" , "hpa@zytor.com" , "linux-nvdimm@lists.01.org" , "axboe@fb.com" , "vishal.l.verma@linux.intel.com" , "willy@linux.intel.com" , "bp@alien8.de" , "ross.zwisler@linux.intel.com" , "luto@amacapital.net" , "gregkh@linuxfoundation.org" , "boaz@plexistor.com" , "david@fromorbit.com" , "akpm@linux-foundation.org" , "linux-acpi@vger.kernel.org" Subject: Re: [PATCH v2 00/20] libnd: non-volatile memory device support Thread-Topic: [PATCH v2 00/20] libnd: non-volatile memory device support Thread-Index: AQHQhsPhaglCQV1ukUaEzY0nK2IATJ1yGPgA Date: Fri, 8 May 2015 06:31:15 +0000 Message-ID: <1431066672.30434.4.camel@intel.com> References: <20150428181203.35812.60474.stgit@dwillia2-desk3.amr.corp.intel.com> <2127273.OhQ7MIpEUu@vostro.rjw.lan> <9076255.5kM0LKa3dN@vostro.rjw.lan> In-Reply-To: <9076255.5kM0LKa3dN@vostro.rjw.lan> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.22.254.138] Content-Type: text/plain; charset="utf-8" Content-ID: <91A75B7C979A1D4084CFEF50B7872239@intel.com> MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by nfs id t486VdTp026135 On Tue, 2015-05-05 at 02:06 +0200, Rafael J. Wysocki wrote: > On Tuesday, April 28, 2015 06:22:05 PM Dan Williams wrote: > > On Tue, Apr 28, 2015 at 5:25 PM, Rafael J. Wysocki wrote: > > > On Tuesday, April 28, 2015 02:24:12 PM Dan Williams wrote: > > >> Changes since v1 [1]: Incorporates feedback received prior to April 24. > > >> > > [cut] > > > > > > > I'm wondering what's wrong with CCing all of the series to linux-acpi? > > > > > > Is there anything in it that the people on that list should not see, by any > > > chance? > > > > linux-acpi may not care about the dimm-metadata labeling patches that > > are completely independent of ACPI, but might as well include > > linux-acpi on the whole series at this point. > > I've gone through the ACPI-related patches in this series (other than [2/20] > that I've commented directly) and while I haven't found anything horrible in > them, I don't quite feel confident enough to ACK them. > > What I'm really missing in this series is a design document describing all that > from a high-level perspective and making it clear where all of the pieces go > and what their respective roles are. Also reordering the series to introduce > the nd subsystem to start with and then its users might help here. Here you go, and also see the "Supporting Documents" section if you need more details, or just ask. This is the reworked document after pushing NFIT specifics out of the core implementation. The core apis are nd_bus_register(), nd_dimm_create(), nd_pmem_region_create(), and nd_blk_region_create(). --- LIBND: Non-volatile Devices libnd - kernel / libndctl - userspace helper library linux-nvdimm@lists.01.org v10 Glossary Overview Supporting Documents Git Trees LIBND PMEM and BLK Why BLK? PMEM vs BLK BLK-REGIONs, PMEM-REGIONs, Atomic Sectors, and DAX Example NVDIMM Platform LIBND Kernel Device Model and LIBNDCTL Userspace API LIBNDCTL: Context libndctl: instantiate a new library context example LIBND/LIBNDCTL: Bus libnd: control class device in /sys/class libnd: bus libndctl: bus enumeration example LIBND/LIBNDCTL: DIMM (NMEM) libnd: DIMM (NMEM) libndctl: DIMM enumeration example LIBND/LIBNDCTL: Region libnd: region libndctl: region enumeration example Why Not Encode the Region Type into the Region Name? How Do I Determine the Major Type of a Region? LIBND/LIBNDCTL: Namespace libnd: namespace libndctl: namespace enumeration example libndctl: namespace creation example Why the Term "namespace"? LIBND/LIBNDCTL: Block Translation Table "btt" libnd: btt layout libndctl: btt creation example Summary LIBNDCTL Diagram Glossary -------- PMEM: A system physical address range where writes are persistent. A block device composed of PMEM is capable of DAX. A PMEM address range may span/interleave several DIMMs. BLK: A set of one or more programmable memory mapped apertures provided by a DIMM to access its media. This indirection precludes the performance benefit of interleaving, but enables DIMM-bounded failure modes . DPA: DIMM Physical Address, is a DIMM-relative offset. With one DIMM in the system there would be a 1:1 system-physical-address:DPA association. Once more DIMMs are added an memory controller interleave must be decoded to determine the DPA associated with a given system-physical-address. BLK capacity always has a 1:1 relationship with a single-dimm's DPA range. DAX: File system extensions to bypass the page cache and block layer to mmap persistent memory, from a PMEM block device, directly into a process address space. BTT: Block Translation Table: Persistent memory is byte addressable. Existing software may have an expectation that the power-fail-atomicity of writes is at least one sector, 512 bytes. The BTT is an indirection table with atomic update semantics to front a PMEM/BLK block device driver and present arbitrary atomic sector sizes. LABEL: Metadata stored on a DIMM device that partitions and identifies (persistently names) storage between PMEM and BLK. It also partitions BLK storage to host BTTs with different parameters per BLK-partition. Note that traditional partition tables, GPT/MBR, are layered on top of a BLK or PMEM device. Overview -------- The libnd subsystem provides support for three types of NVDIMMs, PMEM, BLK, and NVDIMM platforms that can simultaneously support PMEM and BLK mode access capabilities on a given set of DIMMs. These three modes of operation are described by the "NVDIMM Firmware Interface Table" (NFIT) in ACPI 6. While the libnd implementation is generic and supports pre-NFIT platforms, it was guided by the superset of capabilities need to support this ACPI 6 definition for NVDIMM resources. The bulk of the kernel implementation is in place to handle the case where DPA accessible via PMEM is aliased with DPA accessible via BLK. When that occurs a LABEL is needed to reserve DPA for exclusive access via one mode a time. Supporting Documents ACPI 6: http://www.uefi.org/sites/default/files/resources/ACPI_6.0.pdf NVDIMM Namespace: http://pmem.io/documents/NVDIMM_Namespace_Spec.pdf DSM Interface Example: http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf Driver Writer's Guide: http://pmem.io/documents/NVDIMM_Driver_Writers_Guide.pdf Git Trees LIBND: https://git.kernel.org/cgit/linux/kernel/git/djbw/nvdimm.git/log/?h=nd LIBNDCTL: https://github.com/pmem/ndctl.git PMEM: https://github.com/01org/prd LIBND PMEM and BLK ------------------ Prior to the arrival of the NFIT, non-volatile memory was described to a system in various ad-hoc ways. Usually only the bare minimum was provided, namely, a single system-physical-address range where writes are expected to be durable after a system power loss. Now, the NFIT specification standardizes not only the description of PMEM, but also BLK and platform message-passing entry points for control and configuration. For each NVDIMM access method (PMEM, BLK), LIBND provides a block device driver: 1. PMEM (nd_pmem.ko): Drives a system-physical-address range. This range is contiguous in system memory and may be interleaved (hardware memory controller striped) across multiple DIMMs. When interleaved the platform may optionally provide details of which DIMMs are participating in the interleave. Note, LIBND describes system-physical-address ranges that may alias with BLK access ND_NAMESPACE_PMEM ranges and those without alias as ND_NAMESPACE_IO ranges, to the nd_pmem driver there is no distinction. The different device-types are an implementation detail that userspace can exploit to implement policies like "only interface with address ranges from certain DIMMs". It is worth noting that when aliasing is present and a DIMM lacks a label, then no block device can be created by default as userspace needs to do at least one allocation of DPA to the PMEM range. In contrast ND_NAMESPACE_IO ranges, once registered, can be immediately attached to nd_pmem. 2. BLK (nd_blk.ko): This driver performs I/O using a set of platform defined apertures. A set of apertures will all access just one DIMM. Multiple windows allow multiple concurrent accesses, much like tagged-command-queuing, and would likely be used by different threads or different CPUs. The NFIT specification defines a standard format for a BLK-aperture, but the spec also allows for vendor specific layouts, and non-NFIT BLK implementations may other designs for BLK I/O. For this reason "nd_blk" calls back into platform-specific code to perform the I/O. One such implementation is defined in the "Driver Writer's Guide" an "DSM Interface Example". Why BLK? -------- While PMEM provides direct byte-addressable CPU-load/store access to NVDIMM storage, it does not provide the best system RAS (recovery, availability, and serviceability) model. An access to a corrupted system-physical-address address causes a cpu exception while an access to a corrupted address through an BLK-aperture causes that block window to raise an error status in a register. The latter is more aligned with the standard error model that host-bus-adapter attached disks present. Also, if an administrator ever wants to replace a memory it is easier to service a system at DIMM module boundaries. Compare this to PMEM where data could be interleaved in an opaque hardware specific manner across several DIMMs. PMEM vs BLK BLK-apertures solve this RAS problem, but their presence is also the major contributing factor to the complexity of the ND subsystem. They complicate the implementation because PMEM and BLK alias in DPA space. Any given DIMM's DPA-range may contribute to one or more system-physical-address sets of interleaved DIMMs, *and* may also be accessed in its entirety through its BLK-aperture. Accessing a DPA through a system-physical-address while simultaneously accessing the same DPA through a BLK-aperture has undefined results. For this reason, DIMM's with this dual interface configuration include a DSM function to store/retrieve a LABEL. The LABEL effectively partitions the DPA-space into exclusive system-physical-address and BLK-aperture accessible regions. For simplicity a DIMM is allowed a PMEM "region" per each interleave set in which it is a member. The remaining DPA space can be carved into an arbitrary number of BLK devices with discontiguous extents. BLK-REGIONs, PMEM-REGIONs, Atomic Sectors, and DAX -------------------------------------------------- One of the few reasons to allow multiple BLK namespaces per REGION is so that each BLK-namespace can be configured with a BTT with unique atomic sector sizes. While a PMEM device can host a BTT the LABEL specification does not provide for a sector size to be specified for a PMEM namespace. This is due to the expectation that the primary usage model for PMEM is via DAX, and the BTT is incompatible with DAX. However, for the cases where an application or filesystem still needs atomic sector update guarantees it can register a BTT on a PMEM device or partition. See LIBND/NDCTL: Block Translation Table "btt" Example NVDIMM Platform ----------------------- For the remainder of this document the following diagram will be referenced for any example sysfs layouts. (a) (b) DIMM BLK-REGION +-------------------+--------+--------+--------+ +------+ | pm0.0 | blk2.0 | pm1.0 | blk2.1 | 0 region2 | imc0 +--+- - - region0- - - +--------+ +--------+ +--+---+ | pm0.0 | blk3.0 | pm1.0 | blk3.1 | 1 region3 | +-------------------+--------v v--------+ +--+---+ | | | cpu0 | region1 +--+---+ | | | +----------------------------^ ^--------+ +--+---+ | blk4.0 | pm1.0 | blk4.0 | 2 region4 | imc1 +--+----------------------------| +--------+ +------+ | blk5.0 | pm1.0 | blk5.0 | 3 region5 +----------------------------+--------+--------+ In this platform we have four DIMMs and two memory controllers in one socket. Each unique interface (BLK or PMEM) to DPA space is identified by a region device with a dynamically assigned id (REGION0 - REGION5). 1. The first portion of DIMM0 and DIMM1 are interleaved as REGION0. A single PMEM namespace is created in the REGION0-SPA-range that spans DIMM0 and DIMM1 with a user-specified name of "pm0.0". Some of that interleaved system-physical-address range is reclaimed as BLK-aperture accessed space starting at DPA-offset (a) into each DIMM. In that reclaimed space we create two BLK-aperture "namespaces" from REGION2 and REGION3 where "blk2.0" and "blk3.0" are just human readable names that could be set to any user-desired name in the LABEL. 2. In the last portion of DIMM0 and DIMM1 we have an interleaved system-physical-address range, REGION1, that spans those two DIMMs as well as DIMM2 and DIMM3. Some of REGION1 allocated to a PMEM namespace named "pm1.0" the rest is reclaimed in 4 BLK-aperture namespaces (for each DIMM in the interleave set), "blk2.1", "blk3.1", "blk4.0", and "blk5.0". 3. The portion of DIMM2 and DIMM3 that do not participate in the REGION1 interleaved system-physical-address range (i.e. the DPA address below offset (b) are also included in the "blk4.0" and "blk5.0" namespaces. Note, that this example shows that BLK-aperture namespaces don't need to be contiguous in DPA-space. This bus is provided by the kernel under the device /sys/devices/platform/nfit_test.0 when CONFIG_NFIT_TEST is enabled and the nfit_test.ko module is loaded. This not only test LIBND but the acpi_nfit.ko driver as well. LIBND Kernel Device Model and LIBNDCTL Userspace API ---------------------------------------------------- What follows is a description of the LIBND sysfs layout and a corresponding object hierarchy diagram as viewed through the LIBNDCTL api. The example sysfs paths and diagrams are relative to the Example NVDIMM Platform which is also the libnd bus used in the libndctl unit test. LIBNDCTL: Context Every api call in the LIBNDCTL library requires a context that holds the logging parameters and other library instance state. The library is based on the libabc template: https://git.kernel.org/cgit/linux/kernel/git/kay/libabc.git/ libndctl: instantiate a new library context example struct ndctl_ctx *ctx; if (ndctl_new(&ctx) == 0) return ctx; else return NULL; LIBND/LIBNDCTL: Bus ------------------- A bus has a 1:1 relationship with an NFIT. The current expectation for ACPI based systems is that there is only ever one platform-global NFIT. That said, it is trivial to register multiple NFITs, the specification does not preclude it. The infrastructure supports multiple busses and we we use this capability to test multiple NFIT configurations in the unit test. libnd: control class device in /sys/class This character device accepts DSM messages to be passed to DIMM identified by its NFIT handle. /sys/class/nd/ndctl0 |-- dev |-- device -> ../../../ndbus0 |-- subsystem -> ../../../../../../../class/nd libnd: bus struct nd_bus *nd_bus_register(struct device *parent, struct nd_bus_descriptor *nfit_desc); /sys/devices/platform/nfit_test.0/ndbus0 |-- btt0 |-- btt_seed |-- commands |-- nd |-- nfit |-- nmem0 |-- nmem1 |-- nmem2 |-- nmem3 |-- power |-- provider |-- region0 |-- region1 |-- region2 |-- region3 |-- region4 |-- region5 |-- uevent `-- wait_probe libndctl: bus enumeration example Find the bus handle that describes the bus from Example NVDIMM Platform static struct ndctl_bus *get_bus_by_provider(struct ndctl_ctx *ctx, const char *provider) { struct ndctl_bus *bus; ndctl_bus_foreach(ctx, bus) if (strcmp(provider, ndctl_bus_get_provider(bus)) == 0) return bus; return NULL; } bus = get_bus_by_provider(ctx, "nfit_test.0"); LIBND/LIBNDCTL: DIMM (NMEM) --------------------------- The DIMM device provides a character device for sending commands to hardware, and it is a container for LABELs. If the DIMM is defined by NFIT then an optional 'nfit' attribute sub-directory is available to add NFIT-specifics. Note that the kernel device name for "DIMMs" is "nmemX". The NFIT describes these devices via "Memory Device to System Physical Address Range Mapping Structure", and there is no requirement that they actually be physical DIMMs, so we use a more generic name. libnd: DIMM (NMEM) struct nd_dimm *nd_dimm_create(struct nd_bus *nd_bus, void *provider_data, const struct attribute_group **groups, unsigned long flags, unsigned long *dsm_mask); /sys/devices/platform/nfit_test.0/ndbus0 |-- nmem0 | |-- available_slots | |-- commands | |-- dev | |-- devtype | |-- driver -> ../../../../../bus/nd/drivers/nd_dimm | |-- modalias | |-- nfit | | |-- device | | |-- format | | |-- handle | | |-- phys_id | | |-- rev_id | | |-- serial | | `-- vendor | |-- state | |-- subsystem -> ../../../../../bus/nd | `-- uevent |-- nmem1 [..] libndctl: DIMM enumeration example Note, in this example we are assuming NFIT-defined DIMMs which are identified by an "nfit_handle" a 32-bit value where: Bit 3:0 DIMM number within the memory channel Bit 7:4 memory channel number Bit 11:8 memory controller ID Bit 15:12 socket ID (within scope of a Node controller if node controller is present) Bit 27:16 Node Controller ID Bit 31:28 Reserved static struct ndctl_dimm *get_dimm_by_handle(struct ndctl_bus *bus, unsigned int handle) { struct ndctl_dimm *dimm; ndctl_dimm_foreach(bus, dimm) if (ndctl_dimm_get_handle(dimm) == handle) return dimm; return NULL; } #define DIMM_HANDLE(n, s, i, c, d) \ (((n & 0xfff) << 16) | ((s & 0xf) << 12) | ((i & 0xf) << 8) \ | ((c & 0xf) << 4) | (d & 0xf)) dimm = get_dimm_by_handle(bus, DIMM_HANDLE(0, 0, 0, 0, 0)); LIBND/LIBNDCTL: Region ---------------------- A generic REGION device is registered for each PMEM range orBLK-aperture set. Per the example there are 6 regions: 2 PMEM and 4 BLK-aperture sets on the "nfit_test.0" bus. The primary role of regions are to be a container of "mappings". A mapping is a tuple of . LIBND provides a built-in driver for these REGION devices. This driver is responsible for reconciling the aliased DPA mappings across all regions, parsing the LABEL, if present, and then emitting NAMESPACE devices with the resolved/exclusive DPA-boundaries for the nd_pmem or nd_blk device driver to consume. In addition to the generic attributes of "mapping"s, "interleave_ways" and "size" the REGION device also exports some convenience attributes. "nstype" indicates the integer type of namespace-device this region emits, "devtype" duplicates the DEVTYPE variable stored by udev at the 'add' event, "modalias" duplicates the MODALIAS variable stored by udev at the 'add' event, and finally, the optional "spa_index" is provided in the case where the region is defined by a SPA. libnd: region struct nd_region *nd_pmem_region_create(struct nd_bus *nd_bus, struct nd_region_desc *ndr_desc); struct nd_region *nd_blk_region_create(struct nd_bus *nd_bus, struct nd_region_desc *ndr_desc); /sys/devices/platform/nfit_test.0/ndbus0 |-- region0 | |-- available_size | |-- devtype | |-- driver -> ../../../../../bus/nd/drivers/nd_region | |-- init_namespaces | |-- mapping0 | |-- mapping1 | |-- mappings | |-- modalias | |-- namespace0.0 | |-- namespace_seed | |-- nfit | | `-- spa_index | |-- nstype | |-- set_cookie | |-- size | |-- subsystem -> ../../../../../bus/nd | `-- uevent |-- region1 [..] libndctl: region enumeration example Sample region retrieval routines based on NFIT-unique data like "spa_index" (interleave set id) for PMEM and "nfit_handle" (dimm id) for BLK. static struct ndctl_region *get_pmem_region_by_spa_index(struct ndctl_bus *bus, unsigned int spa_index) { struct ndctl_region *region; ndctl_region_foreach(bus, region) { if (ndctl_region_get_type(region) != ND_DEVICE_REGION_PMEM) continue; if (ndctl_region_get_spa_index(region) == spa_index) return region; } return NULL; } static struct ndctl_region *get_blk_region_by_dimm_handle(struct ndctl_bus *bus, unsigned int handle) { struct ndctl_region *region; ndctl_region_foreach(bus, region) { struct ndctl_mapping *map; if (ndctl_region_get_type(region) != ND_DEVICE_REGION_BLOCK) continue; ndctl_mapping_foreach(region, map) { struct ndctl_dimm *dimm = ndctl_mapping_get_dimm(map); if (ndctl_dimm_get_handle(dimm) == handle) return region; } } return NULL; } Why Not Encode the Region Type into the Region Name? ---------------------------------------------------- At first glance it seems since NFIT defines just PMEM and BLK interface types that we should simply name REGION devices with something derived from those type names. However, the ND subsystem explicitly keeps the REGION name generic and expects userspace to always consider the region-attributes for 4 reasons: 1. There are already more than two REGION and "namespace" types. For PMEM there are two subtypes. As mentioned previously we have PMEM where the constituent DIMM devices are known and anonymous PMEM. For BLK regions the NFIT specification already anticipates vendor specific implementations. The exact distinction of what a region contains is in the region-attributes not the region-name or the region-devtype. 2. A region with zero child-namespaces is a possible configuration. For example, the NFIT allows for a DCR to be published without a corresponding BLK-aperture. This equates to a DIMM that can only accept control/configuration messages, but no i/o through a descendant block device. Again, this "type" is advertised in the attributes ('mappings' == 0) and the name does not tell you much. 3. What if a third major interface type arises in the future? Outside of vendor specific implementations, it's not difficult to envision a third class of interface type beyond BLK and PMEM. With a generic name for the REGION level of the device-hierarchy old userspace implementations can still make sense of new kernel advertised region-types. Userspace can always rely on the generic region attributes like "mappings", "size", etc and the expected child devices named "namespace". This generic format of the device-model hierarchy allows the LIBND and LIBNDCTL implementations to be more uniform and future-proof. 4. There are more robust mechanisms for determining the major type of a region than a device name. See the next section, How Do I Determine the Major Type of a Region? How Do I Determine the Major Type of a Region? ---------------------------------------------- Outside of the blanket recommendation of "use libndctl", or simply looking at the kernel header (/usr/include/linux/ndctl.h) to decode the "nstype" integer attribute, here are some other options. 1. module alias lookup: The whole point of region/namespace device type differentiation is to decide which block-device driver will attach to a given LIBND namespace. One can simply use the modalias to lookup the resulting module. It's important to note that this method is robust in the presence of a vendor-specific driver down the road. If a vendor-specific implementation wants to supplant the standard nd_blk driver it can with minimal impact to the rest of LIBND. In fact, a vendor may also want to have a vendor-specific region-driver (outside of nd_region). For example, if a vendor defined its own LABEL format it would need its own region driver to parse that LABEL and emit the resulting namespaces. The output from module resolution is more accurate than a region-name or region-devtype. 2. udev: The kernel "devtype" is registered in the udev database # udevadm info --path=/devices/platform/nfit_test.0/ndbus0/region0 P: /devices/platform/nfit_test.0/ndbus0/region0 E: DEVPATH=/devices/platform/nfit_test.0/ndbus0/region0 E: DEVTYPE=nd_pmem E: MODALIAS=nd:t2 E: SUBSYSTEM=nd # udevadm info --path=/devices/platform/nfit_test.0/ndbus0/region4 P: /devices/platform/nfit_test.0/ndbus0/region4 E: DEVPATH=/devices/platform/nfit_test.0/ndbus0/region4 E: DEVTYPE=nd_blk E: MODALIAS=nd:t3 E: SUBSYSTEM=nd ...and is available as a region attribute, but keep in mind that the "devtype" does not indicate sub-type variations and scripts should really be understanding the other attributes. 3. type specific attributes: As it currently stands a BLK-aperture region will never have a "nfit/spa_index" attribute, but neither will a non-NFIT PMEM region. A BLK region with a "mappings" value of 0 is, as mentioned above, a DIMM that does not allow I/O. A PMEM region with a "mappings" value of zero is a simple system-physical-address range. LIBND/LIBNDCTL: Namespace ------------------------- A REGION, after resolving DPA aliasing and LABEL specified boundaries, surfaces one or more "namespace" devices. The arrival of a "namespace" device currently triggers either the nd_blk or nd_pmem driver to load and register a disk/block device. libnd: namespace Here is a sample layout from the three major types of NAMESPACE where namespace0.0 represents DIMM-info-backed PMEM (note that it has a 'uuid' attribute), namespace2.0 represents a BLK namespace (note it has a 'sector_size' attribute) that, and namespace6.0 represents an anonymous PMEM namespace (note that has no 'uuid' attribute due to not support a LABEL). /sys/devices/platform/nfit_test.0/ndbus0/region0/namespace0.0 |-- alt_name |-- devtype |-- dpa_extents |-- modalias |-- resource |-- size |-- subsystem -> ../../../../../../bus/nd |-- type |-- uevent `-- uuid /sys/devices/platform/nfit_test.0/ndbus0/region2/namespace2.0 |-- alt_name |-- devtype |-- dpa_extents |-- modalias |-- sector_size |-- size |-- subsystem -> ../../../../../../bus/nd |-- type |-- uevent `-- uuid /sys/devices/platform/nfit_test.1/ndbus1/region6/namespace6.0 |-- block | `-- pmem0 |-- devtype |-- driver -> ../../../../../../bus/nd/drivers/pmem |-- modalias |-- resource |-- size |-- subsystem -> ../../../../../../bus/nd |-- type `-- uevent libndctl: namespace enumeration example Namespaces are indexed relative to their parent region, example below. These indexes are mostly static from boot to boot, but subsystem makes no guarantees in this regard. For a static namespace identifier use its 'uuid' attribute. static struct ndctl_namespace *get_namespace_by_id(struct ndctl_region *region, unsigned int id) { struct ndctl_namespace *ndns; ndctl_namespace_foreach(region, ndns) if (ndctl_namespace_get_id(ndns) == id) return ndns; return NULL; } libndctl: namespace creation example Idle namespaces are automatically created by the kernel if a given region has enough available capacity to create a new namespace. Namespace instantiation involves finding an idle namespace and configuring it. For the most part the setting of namespace attributes can occur in any order, the only constraint is that 'uuid' must be set before 'size'. This enables the kernel to track DPA allocations internally with a static identifier. static int configure_namespace(struct ndctl_region *region, struct ndctl_namespace *ndns, struct namespace_parameters *parameters) { char devname[50]; snprintf(devname, sizeof(devname), "namespace%d.%d", ndctl_region_get_id(region), paramaters->id); ndctl_namespace_set_alt_name(ndns, devname); /* 'uuid' must be set prior to setting size! */ ndctl_namespace_set_uuid(ndns, paramaters->uuid); ndctl_namespace_set_size(ndns, paramaters->size); /* unlike pmem namespaces, blk namespaces have a sector size */ if (parameters->lbasize) ndctl_namespace_set_sector_size(ndns, parameters->lbasize); ndctl_namespace_enable(ndns); } Why the Term "namespace"? 1. Why not "volume" for instance? "volume" ran the risk of confusing ND as a volume manager like device-mapper. 2. The term originated to describe the sub-devices that can be created within a NVME controller (see the nvme specification: http://www.nvmexpress.org/specifications/), and NFIT namespaces are meant to parallel the capabilities and configurability of NVME-namespaces. LIBND/LIBNDCTL: Block Translation Table "btt" --------------------------------------------- A BTT (design document: http://pmem.io/2014/09/23/btt.html) is a stacked block device driver that fronts either the whole block device or a partition of a block device emitted by either a PMEM or BLK NAMESPACE. libnd: btt layout Every bus will start out with at least one BTT device which is the seed device. To activate it set the "backing_dev", "uuid", and "sector_size" attributes and then bind the device to the nd_btt driver. /sys/devices/platform/nfit_test.1/ndbus0/btt0/ |-- backing_dev |-- delete |-- devtype |-- modalias |-- sector_size |-- subsystem -> ../../../../../bus/nd |-- uevent `-- uuid libndctl: btt creation example Similar to namespaces an idle BTT device is automatically created per bus. Each time this "seed" btt device is configured and enabled a new seed is created. Creating a BTT configuration involves two steps of finding and idle BTT and assigning it to front a PMEM or BLK namespace. static struct ndctl_btt *get_idle_btt(struct ndctl_bus *bus) { struct ndctl_btt *btt; ndctl_btt_foreach(bus, btt) if (!ndctl_btt_is_enabled(btt) && !ndctl_btt_is_configured(btt)) return btt; return NULL; } static int configure_btt(struct ndctl_bus *bus, struct btt_parameters *parameters) { btt = get_idle_btt(bus); sprintf(bdevpath, "/dev/%s", ndctl_namespace_get_block_device(parameters->ndns)); ndctl_btt_set_uuid(btt, parameters->uuid); ndctl_btt_set_sector_size(btt, parameters->sector_size); ndctl_btt_set_backing_dev(btt, parametes->bdevpath); ndctl_btt_enable(btt); } Once instantiated a "nd_btt" link will be created under the "backing_dev" (pmem0) block device: /sys/block/pmem0/ |-- alignment_offset |-- bdi -> ../../../../../../../virtual/bdi/259:0 |-- capability |-- dev |-- device -> ../../../namespace0.0 |-- discard_alignment |-- ext_range |-- holders |-- inflight |-- nd_btt -> ../../../../btt0 ...and a new inactive seed device will appear on the bus. Once a "backing_dev" is disabled its associated BTT will be automatically deleted. This deletion is only at the device model level. In order to destroy a BTT the "info block" needs to be destroyed. Summary LIBNDCTL Diagram ------------------------ For the given example above, here is the view of the objects as seen by the LIBNDCTL api: +---+ |CTX| +---------+ +--------------+ +---------------+ +-+-+ +-> REGION0 +---> NAMESPACE0.0 +--> PMEM8 "pm0.0" | | | +---------+ +--------------+ +---------------+ +-------+ | | +---------+ +--------------+ +---------------+ | DIMM0 <-+ | +-> REGION1 +---> NAMESPACE1.0 +--> PMEM6 "pm1.0" | +-------+ | | | +---------+ +--------------+ +---------------+ | DIMM1 <-+ +-v--+ | +---------+ +--------------+ +---------------+ +-------+ +-+BUS0+---> REGION2 +-+-> NAMESPACE2.0 +--> ND6 "blk2.0" | | DIMM2 <-+ +----+ | +---------+ | +--------------+ +----------------------+ +-------+ | | +-> NAMESPACE2.1 +--> ND5 "blk2.1" | BTT2 | | DIMM3 <-+ | +--------------+ +----------------------+ +-------+ | +---------+ +--------------+ +---------------+ +-> REGION3 +-+-> NAMESPACE3.0 +--> ND4 "blk3.0" | | +---------+ | +--------------+ +----------------------+ | +-> NAMESPACE3.1 +--> ND3 "blk3.1" | BTT1 | | +--------------+ +----------------------+ | +---------+ +--------------+ +---------------+ +-> REGION4 +---> NAMESPACE4.0 +--> ND2 "blk4.0" | | +---------+ +--------------+ +---------------+ | +---------+ +--------------+ +----------------------+ +-> REGION5 +---> NAMESPACE5.0 +--> ND1 "blk5.0" | BTT0 | +---------+ +--------------+ +---------------+------+ {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I