From mboxrd@z Thu Jan 1 00:00:00 1970 From: s.hauer@pengutronix.de (Sascha Hauer) Date: Wed, 27 Feb 2013 08:44:04 +0100 Subject: [PATCH 2/3] ARM: dts: imx: replace magic number with pin function name In-Reply-To: References: <1361344089-16804-1-git-send-email-shawn.guo@linaro.org> <1361344089-16804-3-git-send-email-shawn.guo@linaro.org> <51251A11.2030300@wwwdotorg.org> <20130221050247.GD17738@S2101-09.ap.freescale.net> <20130222055203.GB27371@S2101-09.ap.freescale.net> Message-ID: <20130227074404.GD1906@pengutronix.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Wed, Feb 27, 2013 at 12:51:56AM -0600, Matt Sealey wrote: > On Thu, Feb 21, 2013 at 11:52 PM, Shawn Guo wrote: > > On Thu, Feb 21, 2013 at 11:36:36AM -0600, Matt Sealey wrote: > >> On Wed, Feb 20, 2013 at 11:02 PM, Shawn Guo wrote: > >> > On Wed, Feb 20, 2013 at 06:03:39PM -0600, Matt Sealey wrote: > >> >> I am not sure I am getting this point across, but.. damn it.. nack nack nack :D > >> >> > >> > Do you see any downgrade side that the series introduces over the > >> > existing implementation? > >> > >> Because it replaces the horribly stupid existing implementation with > >> something that doesn't solve the fundamental logical problems caused > >> by the existing implementation. > > > > When did I say that the series is targeting to solve those "fundamental > > logical problems" in *your* view? > > > > ... > > Why would you submit a series that doesn't solve such problems? :) > > To replace an illogical, ridiculous system of arbitrary pin numbering > with an illogical mapping of registers to arbitrary names is.. > illogical. > > >> What you've fixed it to do, as I read this patch, is this; > >> > >> > >> > > No, it's not arbitrary_pin_name. It's pin function name which comes > > from hardware manual. It may not exactly match the public reference > > manual, but they are obvious to be identified. For imx6q pad SD2_DAT1 > > example, the manual says: > > > > Select 1 of 6 iomux modes to be used for pad: SD2_DAT1. > > 000 ALT0 ? Select signal SD2_DATA1. > > 001 ALT1 ? Select signal ECSPI5_SS0. > > 010 ALT2 ? Select signal EIM_CS2. > > 011 ALT3 ? Select signal AUD4_TXFS. > > 100 ALT4 ? Select signal KEY_COL7. > > 101 ALT5 ? Select signal GPIO1_IO14. > > > > And imx6q-pinfunc.h gives: > > > > MX6Q_PAD_SD2_DAT1__USDHC2_DAT1 > > MX6Q_PAD_SD2_DAT1__ECSPI5_SS0 > > MX6Q_PAD_SD2_DAT1__WEIM_WEIM_CS_2 > > MX6Q_PAD_SD2_DAT1__AUDMUX_AUD4_TXFS > > MX6Q_PAD_SD2_DAT1__KPP_COL_7 > > MX6Q_PAD_SD2_DAT1__GPIO_1_14 > > So, SD2_DAT1 with function SD2_DAT1 in the manual is SD2_DAT1__USDHC2_DAT1 ? > > KEY_COL7 -> KPP_COL_7? > EIM_CS2 -> WEIM_WEIM_CS_2? > AUD4_TXFS -> AUDMUX_AUD4_TXFS? > GPIO1_IO14 -> GPIO_1_14? > > This is what I call arbitrary. > > Since the documented NAMING of pins changes between SoC revisions > (where pins change definition or group), manual revisions (where > people fix definitions), and even existing source code, it makes no > sense whatsoever to give things like this a name. Especially as it is > possible to break out the pin definitions and see that your "use a > macro to encode 5 values at once and leave the most-often changing > value to the device tree" method misses one thing: it is not easy to > set the SION bit in the ALT register for each of these without > replacing the macro. Sometimes SION is important for debugging, > sometimes it is not... some pins need SION *forever* and other times.. > not. On i.MX6 using RMII ethernet, you need SION to loopback the clock > input to the MAC.. but it's possible you'd want to temporarily disable > this in a build. The only way here is to replace the pin definition > macro part with the actual register values, set your SION bit, and > rebuild the device tree. > > The only canonical thing you can guarantee is that in general the > registers fit within certain ranges (although on i.MX51 the ranges did > change between revisions, this is another problem), and accept certain > values. > > The only reasonable thing we can be doing with pre-processing IOMUX > data is make sure it fits those ranges (within reason) and possibly > use the preprocessing to ensure that invalid values never make it into > a device tree (i.e. there are bits in the pad settings which are > never, ever set on a particular SoC, and masking and bailing out using > #error or pitching a #warning would be much more useful than allowing > random bits to go into register areas that are "reserved". > > I half-agree with Sascha. I am responsible for porting the i.MX51 > iomux-v3.h stuff to U-Boot because using the naming scheme worked so > much better there than mxc_request_iomux clutter since most boards > came with almost exactly the same settings on exactly the same buses > because it was a limited choice on i.MX51. This MOSTLY works but there > are several - if not a ridiculous number - of entries which needed to > be modified for any particular board. And the remit came from the > U-Boot guys simply that we should not commit into the tree any pins > which no board makes use of. > > Here, we have potential for a huge file full of macros of which a good > deal of them will end up with NOBODY using, and therefore just clutter > the file. If we go with the U-Boot model, we only add macros to define > a pin configuration set if at least ONE board requires that > definition. This will keep it nice and clean and make sure nobody > commits huge swaths of macros which nobody is testing. Great, so you end up patching this file over and over again, maintaining out of boards always require patches to the iomux file, maintainers have to deal with merge conflicts. > > Since I did that work, I've changed my mind; actually naming the pins > by their intended function simply doesn't ADD anything to the device > tree functionality, nor does it really help Sascha out any more than > simply having a *really good reference* would help him out. > > For example, please explain to me why; > > MX51_PIN_EIM_23__GPIO1_2 0x6528 > > is clearer than; > > 0x174 0x5 0x3d8 0x7 0x654 0x7633, /* EIM_23 GPIO1_2 and some pullup > settings or so comment comment comment */ Look what you have to do to get the pin muxing for a single pin from the datasheet. - identify the name, grep for it in the datasheet, find 0x78 for the mux register. - identify the mode wanted, it's ALT1 for GPIO1_2 - Look if it is involved in daisy chain, grep again if it is - grep again for EIM_D23, find 0x40c for the PAD_CTL register That's exactly the steps that are annoying, error prone and you can get rid of by having a macro like we currently have. If you found a bug in the macro, fix it and everyone benefits. Also you should notice that with the new patches Shawn has posted nobody is forced to use these macros. If you don't like them, go and dump the raw hex numbers into your devicetrees. Sascha -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sascha Hauer Subject: Re: [PATCH 2/3] ARM: dts: imx: replace magic number with pin function name Date: Wed, 27 Feb 2013 08:44:04 +0100 Message-ID: <20130227074404.GD1906@pengutronix.de> References: <1361344089-16804-1-git-send-email-shawn.guo@linaro.org> <1361344089-16804-3-git-send-email-shawn.guo@linaro.org> <51251A11.2030300@wwwdotorg.org> <20130221050247.GD17738@S2101-09.ap.freescale.net> <20130222055203.GB27371@S2101-09.ap.freescale.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: "devicetree-discuss" To: Matt Sealey Cc: Dong Aisheng , devicetree-discuss , Rob Herring , Uwe =?iso-8859-15?Q?Kleine-K=F6nig?= , Linux ARM Kernel ML List-Id: devicetree@vger.kernel.org T24gV2VkLCBGZWIgMjcsIDIwMTMgYXQgMTI6NTE6NTZBTSAtMDYwMCwgTWF0dCBTZWFsZXkgd3Jv dGU6Cj4gT24gVGh1LCBGZWIgMjEsIDIwMTMgYXQgMTE6NTIgUE0sIFNoYXduIEd1byA8c2hhd24u Z3VvQGxpbmFyby5vcmc+IHdyb3RlOgo+ID4gT24gVGh1LCBGZWIgMjEsIDIwMTMgYXQgMTE6MzY6 MzZBTSAtMDYwMCwgTWF0dCBTZWFsZXkgd3JvdGU6Cj4gPj4gT24gV2VkLCBGZWIgMjAsIDIwMTMg YXQgMTE6MDIgUE0sIFNoYXduIEd1byA8c2hhd24uZ3VvQGxpbmFyby5vcmc+IHdyb3RlOgo+ID4+ ID4gT24gV2VkLCBGZWIgMjAsIDIwMTMgYXQgMDY6MDM6MzlQTSAtMDYwMCwgTWF0dCBTZWFsZXkg d3JvdGU6Cj4gPj4gPj4gSSBhbSBub3Qgc3VyZSBJIGFtIGdldHRpbmcgdGhpcyBwb2ludCBhY3Jv c3MsIGJ1dC4uIGRhbW4gaXQuLiBuYWNrIG5hY2sgbmFjayA6RAo+ID4+ID4+Cj4gPj4gPiBEbyB5 b3Ugc2VlIGFueSBkb3duZ3JhZGUgc2lkZSB0aGF0IHRoZSBzZXJpZXMgaW50cm9kdWNlcyBvdmVy IHRoZQo+ID4+ID4gZXhpc3RpbmcgaW1wbGVtZW50YXRpb24/Cj4gPj4KPiA+PiBCZWNhdXNlIGl0 IHJlcGxhY2VzIHRoZSBob3JyaWJseSBzdHVwaWQgZXhpc3RpbmcgaW1wbGVtZW50YXRpb24gd2l0 aAo+ID4+IHNvbWV0aGluZyB0aGF0IGRvZXNuJ3Qgc29sdmUgdGhlIGZ1bmRhbWVudGFsIGxvZ2lj YWwgcHJvYmxlbXMgY2F1c2VkCj4gPj4gYnkgdGhlIGV4aXN0aW5nIGltcGxlbWVudGF0aW9uLgo+ ID4KPiA+IFdoZW4gZGlkIEkgc2F5IHRoYXQgdGhlIHNlcmllcyBpcyB0YXJnZXRpbmcgdG8gc29s dmUgdGhvc2UgImZ1bmRhbWVudGFsCj4gPiBsb2dpY2FsIHByb2JsZW1zIiBpbiAqeW91ciogdmll dz8KPiA+Cj4gPiAuLi4KPiAKPiBXaHkgd291bGQgeW91IHN1Ym1pdCBhIHNlcmllcyB0aGF0IGRv ZXNuJ3Qgc29sdmUgc3VjaCBwcm9ibGVtcz8gOikKPiAKPiBUbyByZXBsYWNlIGFuIGlsbG9naWNh bCwgcmlkaWN1bG91cyBzeXN0ZW0gb2YgYXJiaXRyYXJ5IHBpbiBudW1iZXJpbmcKPiB3aXRoIGFu IGlsbG9naWNhbCBtYXBwaW5nIG9mIHJlZ2lzdGVycyB0byBhcmJpdHJhcnkgbmFtZXMgaXMuLgo+ IGlsbG9naWNhbC4KPiAKPiA+PiBXaGF0IHlvdSd2ZSBmaXhlZCBpdCB0byBkbywgYXMgSSByZWFk IHRoaXMgcGF0Y2gsIGlzIHRoaXM7Cj4gPj4KPiA+PiA8YXJiaXRyYXJ5X3Bpbl9uYW1lIHBhZF9t b2RlPgo+ID4+Cj4gPiBObywgaXQncyBub3QgYXJiaXRyYXJ5X3Bpbl9uYW1lLiAgSXQncyBwaW4g ZnVuY3Rpb24gbmFtZSB3aGljaCBjb21lcwo+ID4gZnJvbSBoYXJkd2FyZSBtYW51YWwuICBJdCBt YXkgbm90IGV4YWN0bHkgbWF0Y2ggdGhlIHB1YmxpYyByZWZlcmVuY2UKPiA+IG1hbnVhbCwgYnV0 IHRoZXkgYXJlIG9idmlvdXMgdG8gYmUgaWRlbnRpZmllZC4gIEZvciBpbXg2cSBwYWQgU0QyX0RB VDEKPiA+IGV4YW1wbGUsIHRoZSBtYW51YWwgc2F5czoKPiA+Cj4gPiBTZWxlY3QgMSBvZiA2IGlv bXV4IG1vZGVzIHRvIGJlIHVzZWQgZm9yIHBhZDogU0QyX0RBVDEuCj4gPiAgIDAwMCBBTFQwIOKA lCBTZWxlY3Qgc2lnbmFsIFNEMl9EQVRBMS4KPiA+ICAgMDAxIEFMVDEg4oCUIFNlbGVjdCBzaWdu YWwgRUNTUEk1X1NTMC4KPiA+ICAgMDEwIEFMVDIg4oCUIFNlbGVjdCBzaWduYWwgRUlNX0NTMi4K PiA+ICAgMDExIEFMVDMg4oCUIFNlbGVjdCBzaWduYWwgQVVENF9UWEZTLgo+ID4gICAxMDAgQUxU NCDigJQgU2VsZWN0IHNpZ25hbCBLRVlfQ09MNy4KPiA+ICAgMTAxIEFMVDUg4oCUIFNlbGVjdCBz aWduYWwgR1BJTzFfSU8xNC4KPiA+Cj4gPiBBbmQgaW14NnEtcGluZnVuYy5oIGdpdmVzOgo+ID4K PiA+ICAgTVg2UV9QQURfU0QyX0RBVDFfX1VTREhDMl9EQVQxCj4gPiAgIE1YNlFfUEFEX1NEMl9E QVQxX19FQ1NQSTVfU1MwCj4gPiAgIE1YNlFfUEFEX1NEMl9EQVQxX19XRUlNX1dFSU1fQ1NfMgo+ ID4gICBNWDZRX1BBRF9TRDJfREFUMV9fQVVETVVYX0FVRDRfVFhGUwo+ID4gICBNWDZRX1BBRF9T RDJfREFUMV9fS1BQX0NPTF83Cj4gPiAgIE1YNlFfUEFEX1NEMl9EQVQxX19HUElPXzFfMTQKPiAK PiBTbywgU0QyX0RBVDEgd2l0aCBmdW5jdGlvbiBTRDJfREFUMSBpbiB0aGUgbWFudWFsIGlzIFNE Ml9EQVQxX19VU0RIQzJfREFUMSA/Cj4gCj4gS0VZX0NPTDcgLT4gS1BQX0NPTF83Pwo+IEVJTV9D UzIgLT4gV0VJTV9XRUlNX0NTXzI/Cj4gQVVENF9UWEZTIC0+IEFVRE1VWF9BVUQ0X1RYRlM/Cj4g R1BJTzFfSU8xNCAtPiBHUElPXzFfMTQ/Cj4gCj4gVGhpcyBpcyB3aGF0IEkgY2FsbCBhcmJpdHJh cnkuCj4gCj4gU2luY2UgdGhlIGRvY3VtZW50ZWQgTkFNSU5HIG9mIHBpbnMgY2hhbmdlcyBiZXR3 ZWVuIFNvQyByZXZpc2lvbnMKPiAod2hlcmUgcGlucyBjaGFuZ2UgZGVmaW5pdGlvbiBvciBncm91 cCksIG1hbnVhbCByZXZpc2lvbnMgKHdoZXJlCj4gcGVvcGxlIGZpeCBkZWZpbml0aW9ucyksIGFu ZCBldmVuIGV4aXN0aW5nIHNvdXJjZSBjb2RlLCBpdCBtYWtlcyBubwo+IHNlbnNlIHdoYXRzb2V2 ZXIgdG8gZ2l2ZSB0aGluZ3MgbGlrZSB0aGlzIGEgbmFtZS4gRXNwZWNpYWxseSBhcyBpdCBpcwo+ IHBvc3NpYmxlIHRvIGJyZWFrIG91dCB0aGUgcGluIGRlZmluaXRpb25zIGFuZCBzZWUgdGhhdCB5 b3VyICJ1c2UgYQo+IG1hY3JvIHRvIGVuY29kZSA1IHZhbHVlcyBhdCBvbmNlIGFuZCBsZWF2ZSB0 aGUgbW9zdC1vZnRlbiBjaGFuZ2luZwo+IHZhbHVlIHRvIHRoZSBkZXZpY2UgdHJlZSIgbWV0aG9k IG1pc3NlcyBvbmUgdGhpbmc6IGl0IGlzIG5vdCBlYXN5IHRvCj4gc2V0IHRoZSBTSU9OIGJpdCBp biB0aGUgQUxUIHJlZ2lzdGVyIGZvciBlYWNoIG9mIHRoZXNlIHdpdGhvdXQKPiByZXBsYWNpbmcg dGhlIG1hY3JvLiBTb21ldGltZXMgU0lPTiBpcyBpbXBvcnRhbnQgZm9yIGRlYnVnZ2luZywKPiBz b21ldGltZXMgaXQgaXMgbm90Li4uIHNvbWUgcGlucyBuZWVkIFNJT04gKmZvcmV2ZXIqIGFuZCBv dGhlciB0aW1lcy4uCj4gbm90LiBPbiBpLk1YNiB1c2luZyBSTUlJIGV0aGVybmV0LCB5b3UgbmVl ZCBTSU9OIHRvIGxvb3BiYWNrIHRoZSBjbG9jawo+IGlucHV0IHRvIHRoZSBNQUMuLiBidXQgaXQn cyBwb3NzaWJsZSB5b3UnZCB3YW50IHRvIHRlbXBvcmFyaWx5IGRpc2FibGUKPiB0aGlzIGluIGEg YnVpbGQuIFRoZSBvbmx5IHdheSBoZXJlIGlzIHRvIHJlcGxhY2UgdGhlIHBpbiBkZWZpbml0aW9u Cj4gbWFjcm8gcGFydCB3aXRoIHRoZSBhY3R1YWwgcmVnaXN0ZXIgdmFsdWVzLCBzZXQgeW91ciBT SU9OIGJpdCwgYW5kCj4gcmVidWlsZCB0aGUgZGV2aWNlIHRyZWUuCj4gCj4gVGhlIG9ubHkgY2Fu b25pY2FsIHRoaW5nIHlvdSBjYW4gZ3VhcmFudGVlIGlzIHRoYXQgaW4gZ2VuZXJhbCB0aGUKPiBy ZWdpc3RlcnMgZml0IHdpdGhpbiBjZXJ0YWluIHJhbmdlcyAoYWx0aG91Z2ggb24gaS5NWDUxIHRo ZSByYW5nZXMgZGlkCj4gY2hhbmdlIGJldHdlZW4gcmV2aXNpb25zLCB0aGlzIGlzIGFub3RoZXIg cHJvYmxlbSksIGFuZCBhY2NlcHQgY2VydGFpbgo+IHZhbHVlcy4KPiAKPiBUaGUgb25seSByZWFz b25hYmxlIHRoaW5nIHdlIGNhbiBiZSBkb2luZyB3aXRoIHByZS1wcm9jZXNzaW5nIElPTVVYCj4g ZGF0YSBpcyBtYWtlIHN1cmUgaXQgZml0cyB0aG9zZSByYW5nZXMgKHdpdGhpbiByZWFzb24pIGFu ZCBwb3NzaWJseQo+IHVzZSB0aGUgcHJlcHJvY2Vzc2luZyB0byBlbnN1cmUgdGhhdCBpbnZhbGlk IHZhbHVlcyBuZXZlciBtYWtlIGl0IGludG8KPiBhIGRldmljZSB0cmVlIChpLmUuIHRoZXJlIGFy ZSBiaXRzIGluIHRoZSBwYWQgc2V0dGluZ3Mgd2hpY2ggYXJlCj4gbmV2ZXIsIGV2ZXIgc2V0IG9u IGEgcGFydGljdWxhciBTb0MsIGFuZCBtYXNraW5nIGFuZCBiYWlsaW5nIG91dCB1c2luZwo+ICNl cnJvciBvciBwaXRjaGluZyBhICN3YXJuaW5nIHdvdWxkIGJlIG11Y2ggbW9yZSB1c2VmdWwgdGhh biBhbGxvd2luZwo+IHJhbmRvbSBiaXRzIHRvIGdvIGludG8gcmVnaXN0ZXIgYXJlYXMgdGhhdCBh cmUgInJlc2VydmVkIi4KPiAKPiBJIGhhbGYtYWdyZWUgd2l0aCBTYXNjaGEuIEkgYW0gcmVzcG9u c2libGUgZm9yIHBvcnRpbmcgdGhlIGkuTVg1MQo+IGlvbXV4LXYzLmggc3R1ZmYgdG8gVS1Cb290 IGJlY2F1c2UgdXNpbmcgdGhlIG5hbWluZyBzY2hlbWUgd29ya2VkIHNvCj4gbXVjaCBiZXR0ZXIg dGhlcmUgdGhhbiBteGNfcmVxdWVzdF9pb211eCBjbHV0dGVyIHNpbmNlIG1vc3QgYm9hcmRzCj4g Y2FtZSB3aXRoIGFsbW9zdCBleGFjdGx5IHRoZSBzYW1lIHNldHRpbmdzIG9uIGV4YWN0bHkgdGhl IHNhbWUgYnVzZXMKPiBiZWNhdXNlIGl0IHdhcyBhIGxpbWl0ZWQgY2hvaWNlIG9uIGkuTVg1MS4g VGhpcyBNT1NUTFkgd29ya3MgYnV0IHRoZXJlCj4gYXJlIHNldmVyYWwgLSBpZiBub3QgYSByaWRp Y3Vsb3VzIG51bWJlciAtIG9mIGVudHJpZXMgd2hpY2ggbmVlZGVkIHRvCj4gYmUgbW9kaWZpZWQg Zm9yIGFueSBwYXJ0aWN1bGFyIGJvYXJkLiBBbmQgdGhlIHJlbWl0IGNhbWUgZnJvbSB0aGUKPiBV LUJvb3QgZ3V5cyBzaW1wbHkgdGhhdCB3ZSBzaG91bGQgbm90IGNvbW1pdCBpbnRvIHRoZSB0cmVl IGFueSBwaW5zCj4gd2hpY2ggbm8gYm9hcmQgbWFrZXMgdXNlIG9mLgo+IAo+IEhlcmUsIHdlIGhh dmUgcG90ZW50aWFsIGZvciBhIGh1Z2UgZmlsZSBmdWxsIG9mIG1hY3JvcyBvZiB3aGljaCBhIGdv b2QKPiBkZWFsIG9mIHRoZW0gd2lsbCBlbmQgdXAgd2l0aCBOT0JPRFkgdXNpbmcsIGFuZCB0aGVy ZWZvcmUganVzdCBjbHV0dGVyCj4gdGhlIGZpbGUuIElmIHdlIGdvIHdpdGggdGhlIFUtQm9vdCBt b2RlbCwgd2Ugb25seSBhZGQgbWFjcm9zIHRvIGRlZmluZQo+IGEgcGluIGNvbmZpZ3VyYXRpb24g c2V0IGlmIGF0IGxlYXN0IE9ORSBib2FyZCByZXF1aXJlcyB0aGF0Cj4gZGVmaW5pdGlvbi4gVGhp cyB3aWxsIGtlZXAgaXQgbmljZSBhbmQgY2xlYW4gYW5kIG1ha2Ugc3VyZSBub2JvZHkKPiBjb21t aXRzIGh1Z2Ugc3dhdGhzIG9mIG1hY3JvcyB3aGljaCBub2JvZHkgaXMgdGVzdGluZy4KCkdyZWF0 LCBzbyB5b3UgZW5kIHVwIHBhdGNoaW5nIHRoaXMgZmlsZSBvdmVyIGFuZCBvdmVyIGFnYWluLCBt YWludGFpbmluZwpvdXQgb2YgYm9hcmRzIGFsd2F5cyByZXF1aXJlIHBhdGNoZXMgdG8gdGhlIGlv bXV4IGZpbGUsIG1haW50YWluZXJzIGhhdmUKdG8gZGVhbCB3aXRoIG1lcmdlIGNvbmZsaWN0cy4K Cj4gCj4gU2luY2UgSSBkaWQgdGhhdCB3b3JrLCBJJ3ZlIGNoYW5nZWQgbXkgbWluZDsgYWN0dWFs bHkgbmFtaW5nIHRoZSBwaW5zCj4gYnkgdGhlaXIgaW50ZW5kZWQgZnVuY3Rpb24gc2ltcGx5IGRv ZXNuJ3QgQUREIGFueXRoaW5nIHRvIHRoZSBkZXZpY2UKPiB0cmVlIGZ1bmN0aW9uYWxpdHksIG5v ciBkb2VzIGl0IHJlYWxseSBoZWxwIFNhc2NoYSBvdXQgYW55IG1vcmUgdGhhbgo+IHNpbXBseSBo YXZpbmcgYSAqcmVhbGx5IGdvb2QgcmVmZXJlbmNlKiB3b3VsZCBoZWxwIGhpbSBvdXQuCj4gCj4g Rm9yIGV4YW1wbGUsIHBsZWFzZSBleHBsYWluIHRvIG1lIHdoeTsKPiAKPiBNWDUxX1BJTl9FSU1f MjNfX0dQSU8xXzIgMHg2NTI4Cj4gCj4gaXMgY2xlYXJlciB0aGFuOwo+IAo+IDB4MTc0IDB4NSAw eDNkOCAweDcgMHg2NTQgMHg3NjMzLCAvKiBFSU1fMjMgR1BJTzFfMiBhbmQgc29tZSBwdWxsdXAK PiBzZXR0aW5ncyBvciBzbyBjb21tZW50IGNvbW1lbnQgY29tbWVudCAqLwoKTG9vayB3aGF0IHlv dSBoYXZlIHRvIGRvIHRvIGdldCB0aGUgcGluIG11eGluZyBmb3IgYSBzaW5nbGUgcGluIGZyb20g dGhlCmRhdGFzaGVldC4KCi0gaWRlbnRpZnkgdGhlIG5hbWUsIGdyZXAgZm9yIGl0IGluIHRoZSBk YXRhc2hlZXQsIGZpbmQgMHg3OCBmb3IgdGhlIG11eAogIHJlZ2lzdGVyLgotIGlkZW50aWZ5IHRo ZSBtb2RlIHdhbnRlZCwgaXQncyBBTFQxIGZvciBHUElPMV8yCi0gTG9vayBpZiBpdCBpcyBpbnZv bHZlZCBpbiBkYWlzeSBjaGFpbiwgZ3JlcCBhZ2FpbiBpZiBpdCBpcwotIGdyZXAgYWdhaW4gZm9y IEVJTV9EMjMsIGZpbmQgMHg0MGMgZm9yIHRoZSBQQURfQ1RMIHJlZ2lzdGVyCgpUaGF0J3MgZXhh Y3RseSB0aGUgc3RlcHMgdGhhdCBhcmUgYW5ub3lpbmcsIGVycm9yIHByb25lIGFuZCB5b3UgY2Fu IGdldApyaWQgb2YgYnkgaGF2aW5nIGEgbWFjcm8gbGlrZSB3ZSBjdXJyZW50bHkgaGF2ZS4gSWYg eW91IGZvdW5kIGEgYnVnIGluCnRoZSBtYWNybywgZml4IGl0IGFuZCBldmVyeW9uZSBiZW5lZml0 cy4KCkFsc28geW91IHNob3VsZCBub3RpY2UgdGhhdCB3aXRoIHRoZSBuZXcgcGF0Y2hlcyBTaGF3 biBoYXMgcG9zdGVkIG5vYm9keQppcyBmb3JjZWQgdG8gdXNlIHRoZXNlIG1hY3Jvcy4gSWYgeW91 IGRvbid0IGxpa2UgdGhlbSwgZ28gYW5kIGR1bXAgdGhlCnJhdyBoZXggbnVtYmVycyBpbnRvIHlv dXIgZGV2aWNldHJlZXMuCgpTYXNjaGEKCi0tIApQZW5ndXRyb25peCBlLksuICAgICAgICAgICAg ICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfApJbmR1c3RyaWFs IExpbnV4IFNvbHV0aW9ucyAgICAgICAgICAgICAgICAgfCBodHRwOi8vd3d3LnBlbmd1dHJvbml4 LmRlLyAgfApQZWluZXIgU3RyLiA2LTgsIDMxMTM3IEhpbGRlc2hlaW0sIEdlcm1hbnkgfCBQaG9u ZTogKzQ5LTUxMjEtMjA2OTE3LTAgICAgfApBbXRzZ2VyaWNodCBIaWxkZXNoZWltLCBIUkEgMjY4 NiAgICAgICAgICAgfCBGYXg6ICAgKzQ5LTUxMjEtMjA2OTE3LTU1NTUgfApfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkZXZpY2V0cmVlLWRpc2N1c3MgbWFp bGluZyBsaXN0CmRldmljZXRyZWUtZGlzY3Vzc0BsaXN0cy5vemxhYnMub3JnCmh0dHBzOi8vbGlz dHMub3psYWJzLm9yZy9saXN0aW5mby9kZXZpY2V0cmVlLWRpc2N1c3MK