From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:39254 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S964792AbcKOCLs (ORCPT ); Mon, 14 Nov 2016 21:11:48 -0500 From: Laurent Pinchart To: Rob Herring Cc: Thierry Reding , Laurent Pinchart , dri-devel , "devicetree@vger.kernel.org" , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Tue, 15 Nov 2016 04:11:55 +0200 Message-ID: <4350940.43ZWQivOUU@avalon> In-Reply-To: References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1488637.i0jADhlNmg@avalon> MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: Hi Rob, On Monday 14 Nov 2016 19:40:26 Rob Herring wrote: > On Mon, Oct 17, 2016 at 7:42 AM, Laurent Pinchart wrote: > > On Friday 14 Oct 2016 07:40:14 Rob Herring wrote: > >> On Sun, Oct 9, 2016 at 11:33 AM, Laurent Pinchart wrote: > >>> On Saturday 08 Oct 2016 20:29:39 Rob Herring wrote: > >>>> On Tue, Oct 04, 2016 at 07:23:29PM +0300, Laurent Pinchart wrote: > >>>>> LVDS is a physical layer specification defined in ANSI/TIA/EIA-644-A. > >>>>> Multiple incompatible data link layers have been used over time to > >>>>> transmit image data to LVDS panels. This binding supports display > >>>>> panels compatible with the JEIDA-59-1999, Open-LDI and VESA SWPG > >>>>> specifications. > >>>>> > >>>>> Signed-off-by: Laurent Pinchart > >>>>> > >>>>> --- > >>>>> > >>>>> .../bindings/display/panel/panel-lvds.txt | 119 ++++++++++++ > >>>>> 1 file changed, 119 insertions(+) > >>>>> create mode 100644 > >>>>> Documentation/devicetree/bindings/display/panel/panel-lvds.txt> > >>>>> > >>>>> diff --git > >>>>> a/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>>> b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>>> new file mode 100644 > >>>>> index 000000000000..250861f2673e > >>>>> --- /dev/null > >>>>> +++ b/Documentation/devicetree/bindings/display/panel/panel-lvds.txt > >>>>> @@ -0,0 +1,119 @@ > >>>>> +Generic LVDS Panel > >>>>> +================== > >>>>> + > >>>>> +LVDS is a physical layer specification defined in > >>>>> ANSI/TIA/EIA-644-A. Multiple > >>>>> +incompatible data link layers have been used over time to transmit > >>>>> image data > >>>>> +to LVDS panels. This bindings supports display panels compatible > >>>>> with the > >>>>> +following specifications. > >>>>> + > >>>>> +[JEIDA] "Digital Interface Standards for Monitor", JEIDA-59-1999, > >>>>> February > >>>>> +1999 (Version 1.0), Japan Electronic Industry Development > >>>>> Association (JEIDA) > >>>>> +[LDI] "Open LVDS Display Interface", May 1999 (Version 0.95), > >>>>> National > >>>>> +Semiconductor > >>>>> +[VESA] "VESA Notebook Panel Standard", October 2007 (Version 1.0), > >>>>> Video > >>>>> +Electronics Standards Association (VESA) > >>>>> + > >>>>> +Device compatible with those specifications have been marketed under > >>>>> the > >>>>> +FPD-Link and FlatLink brands. > >>>>> + > >>>>> + > >>>>> +Required properties: > >>>>> +- compatible: shall contain "panel-lvds" > >>>> > >>>> Maybe as a fallback, but on its own, no way. > >>> > >>> Which brings an interesting question: when designing generic DT > >>> bindings, what's the rule regarding > > > > Looks like I forgot part of the question. I meant to ask what is the rule > > regarding usage of more precise compatible strings ? > > When in doubt, always have one. If there's any chance at all that s/w > will need to know or care, then we should have one. > > > For instance (but perhaps not the best example), the > > input/rotary-encoder.txt bindings define a "rotary-encoder" compatible > > string, with no other bindings defining more precise compatible strings > > for the exact rotary encoder model. When it comes to panels I believe it > > makes sense to define model-specific compatible strings even if they're > > unused by drivers. I'm however wondering what the rule is there, and > > where those device-specific compatible strings should be defined. I'd > > like to avoid using one file per panel model as done today for the > > simple-panel bindings. > > There's a few exceptions like this where there is not any sort of > model to base a compatible on. For example, a GPIO connected LED is > truly generic. The only way to have a more specific compatible would > be something with the board name in it. > > Your case here is in the middle. It seems like it's generic and > passive, but perhaps power control is not. Rather than trying to > decide, we can just cover our ass and put both a generic and specific > compatible in. That sounds good to me. I'll mention in the document that a more precise compatible is required. > >> Call it "simple" so I can easily NAK it. :) > >> > >> Define a generic structure, not a single binding trying to serve all. > >> > >>>>> +- width-mm: panel display width in millimeters > >>>>> +- height-mm: panel display height in millimeters > >>>> > >>>> This is already documented for all panels IIRC. > >>> > >>> Note that this DT binding has nothing to do with the simple-panel > >>> binding. It is instead similar to the panel-dpi and panel-dsi-cm > >>> bindings (which currently don't but should specify the panel size in > >>> DT). The LVDS panel driver will *not* include any panel-specific > >>> information such as size or timings, these are specified in DT. > >> > >> The panel bindings aren't really different. The biggest difference was > >> location in the tree, but we now generally allow panels to be either a > >> child of the LCD controller or connected with OF graph. We probably > >> need to work on restructuring the panel bindings a bit. We should have > >> an inheritance with a base panel binding of things like size, label, > >> graph, backlight, etc, then perhaps an interface specific bindings for > >> LVDS, DSI, and parallel, then a panel specific binding. With this the > >> panel specific binding is typically just a compatible string and which > >> inherited properties apply to it. > > > > That sounds good to me, but we have multiple models for panel bindings. > > > > As you mentioned panels can be referenced through an LCD controller node > > property containing a phandle to the panel node, or through OF graph. > > That's a situation we have today, and we need to keep supporting both (at > > least for existing panels, perhaps not for the new ones). > > > > Another difference is how to express panel data such as size and timings. > > The simple-panel DT bindings don't contain such data and expects the > > drivers to contain a table of panel data for all models supported, while > > the DPI, DSI and now the proposed LVDS panel bindings contain properties > > for panel data. > > > > How would you like to reconcile all that ? > > Thierry has outlined the position[1] that simple-panel follows many > times and I generally agree. I could be convinced that perhaps panel > timings could go into DT. However, you can't really describe > *everything*, so we're not going to get away from panel specific > compatible strings and panel specifics in the kernel. I'm fine with that middle ground, and will include panel timings in DT but not an information related to power sequencing or other panel-specific properties (beside the standardized properties defined in this binding of course). > >>>>> +- data-mapping: the color signals mapping order, "jeida-18", > >>>>> "jeida-24" > >>>>> + or "vesa-24" > >>>> > >>>> Maybe this should be part of the compatible. > >>> > >>> I've thought about it, but given that some panels support selecting > >>> between multiple modes (through a mode pin that is usually hardwired), > >>> I believe a separate DT property makes sense. > >> > >> Okay. > >> > >>> Furthermore, LVDS data organization is controlled by the combination of > >>> both data-mapping and data-mirror. It makes little sense from my point > >>> of view to handle one as part of the compatible string and the other one > >>> as a separate property. > >>> > >>>> > +Optional properties: > >>>> > +- label: a symbolic name for the panel > >>>> > >>>> Could be for any panel or display connector. > >>> > >>> Yes, but I'm not sure to understand how that's relevant :-) > >> > >> Meaning it should be a common property. > > > > Sure. So you expect me to reorganize all the panels and connectors DT > > bindings in order to get this one merged ? :-) > > No, because I don't think label is widely defined. Just put it in a > common place and reference it. Any other panels can be fixed later. > Really, the "simple panel" binding should probably morph into the > common binding. The "label" property is actually defined in the "Devicetree Specification, Release 0.1" as recently published on devicetree.org. Where would you like me to define it in the bindings ? > >>>>> +- avdd-supply: reference to the regulator that powers the panel > >>>>> analog supply > >>>>> +- dvdd-supply: reference to the regulator that powers the panel > >>>>> digital supply > >>>> > >>>> Which one has to be powered on first, what voltage, and with what time > >>>> in between? This is why "generic" or "simple" bindings don't work. > >>> > >>> The above-mentioned specifications also define connectors, pinouts and > >>> power supplies, but many LVDS panels compatible with the LVDS physical > >>> and data layers use a different connector with small differences in > >>> power supplies. > >>> > >>> I believe the voltage is irrelevant here, it doesn't need to be > >>> controlled by the operating system. Power supplies order and timing is > >>> relevant, I'll investigate the level of differences between panels. I'm > >>> also fine with dropping those properties for now. > >> > >> Whether you have control of the supplies is dependent on the board. > >> Dropping them is just puts us in the simple binding trap. The simple > >> bindings start out that way and then people keep adding to them. > > > > Damn, you can't be fooled easily ;-) > > I guess you can count all the simple bindings to see how many times I > can be fooled. :) > > > On a more serious note, I'd like to design the bindings in a way that > > wouldn't require adding device-specific code in the driver for each panel > > model, given that in most cases power supply handling will be generic. > > What's your opinion about a generic power supply model that would be used > > in the default case, with the option to override it with device-specific > > code when needed ? > > I don't agree. Read Thierry's post on the subject[1]. I'm not sure you understood me correctly (and writing a clarification at 4:00am might not help :-)). My point here is that a fair number of panels don't care about power sequencing and have no control GPIOs (that's certainly the case of the two Mitsubishi panels I use here that have a single power supply - good luck trying to convince me that this needs to be sequenced :-) - and no enable or reset control pin). This kind of panel should obviously be modelled in DT with both a specific and a generic ("panel-lvds") compatible string, to ensure that we'll have enough information available on the operating system side to control the panel properly. The power supply(ies) should be documented in relation to the specific compatible string and not mentioned by the generic bindings (whether that should go in one or multiple text files is bikeshedding). This being said, on the driver side, I don't see a reason to list the specific compatible strings explicitly for those panels when a generic implementation matching the generic compatible string can handle them fine. This has no impact on the bindings and is an Linux implementation decision. > [1] > http://sietch-tagr.blogspot.com/2016/04/display-panels-are-not-special.html -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 1/2] devicetree/bindings: display: Add bindings for LVDS panels Date: Tue, 15 Nov 2016 04:11:55 +0200 Message-ID: <4350940.43ZWQivOUU@avalon> References: <1475598210-26857-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1488637.i0jADhlNmg@avalon> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rob Herring Cc: "devicetree@vger.kernel.org" , Laurent Pinchart , dri-devel , "open list:MEDIA DRIVERS FOR RENESAS - FCP" , Tomi Valkeinen , "linux-media@vger.kernel.org" List-Id: devicetree@vger.kernel.org SGkgUm9iLAoKT24gTW9uZGF5IDE0IE5vdiAyMDE2IDE5OjQwOjI2IFJvYiBIZXJyaW5nIHdyb3Rl Ogo+IE9uIE1vbiwgT2N0IDE3LCAyMDE2IGF0IDc6NDIgQU0sIExhdXJlbnQgUGluY2hhcnQgd3Jv dGU6Cj4gPiBPbiBGcmlkYXkgMTQgT2N0IDIwMTYgMDc6NDA6MTQgUm9iIEhlcnJpbmcgd3JvdGU6 Cj4gPj4gT24gU3VuLCBPY3QgOSwgMjAxNiBhdCAxMTozMyBBTSwgTGF1cmVudCBQaW5jaGFydCB3 cm90ZToKPiA+Pj4gT24gU2F0dXJkYXkgMDggT2N0IDIwMTYgMjA6Mjk6MzkgUm9iIEhlcnJpbmcg d3JvdGU6Cj4gPj4+PiBPbiBUdWUsIE9jdCAwNCwgMjAxNiBhdCAwNzoyMzoyOVBNICswMzAwLCBM YXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+ID4+Pj4+IExWRFMgaXMgYSBwaHlzaWNhbCBsYXllciBz cGVjaWZpY2F0aW9uIGRlZmluZWQgaW4gQU5TSS9USUEvRUlBLTY0NC1BLgo+ID4+Pj4+IE11bHRp cGxlIGluY29tcGF0aWJsZSBkYXRhIGxpbmsgbGF5ZXJzIGhhdmUgYmVlbiB1c2VkIG92ZXIgdGlt ZSB0bwo+ID4+Pj4+IHRyYW5zbWl0IGltYWdlIGRhdGEgdG8gTFZEUyBwYW5lbHMuIFRoaXMgYmlu ZGluZyBzdXBwb3J0cyBkaXNwbGF5Cj4gPj4+Pj4gcGFuZWxzIGNvbXBhdGlibGUgd2l0aCB0aGUg SkVJREEtNTktMTk5OSwgT3Blbi1MREkgYW5kIFZFU0EgU1dQRwo+ID4+Pj4+IHNwZWNpZmljYXRp b25zLgo+ID4+Pj4+IAo+ID4+Pj4+IFNpZ25lZC1vZmYtYnk6IExhdXJlbnQgUGluY2hhcnQKPiA+ Pj4+PiA8bGF1cmVudC5waW5jaGFydCtyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gPj4+Pj4g LS0tCj4gPj4+Pj4gCj4gPj4+Pj4gIC4uLi9iaW5kaW5ncy9kaXNwbGF5L3BhbmVsL3BhbmVsLWx2 ZHMudHh0ICAgICAgICAgIHwgMTE5ICsrKysrKysrKysrKwo+ID4+Pj4+ICAxIGZpbGUgY2hhbmdl ZCwgMTE5IGluc2VydGlvbnMoKykKPiA+Pj4+PiAgY3JlYXRlIG1vZGUgMTAwNjQ0Cj4gPj4+Pj4g IERvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9kaXNwbGF5L3BhbmVsL3BhbmVsLWx2 ZHMudHh0Pgo+ID4+Pj4+IAo+ID4+Pj4+IGRpZmYgLS1naXQKPiA+Pj4+PiBhL0RvY3VtZW50YXRp b24vZGV2aWNldHJlZS9iaW5kaW5ncy9kaXNwbGF5L3BhbmVsL3BhbmVsLWx2ZHMudHh0Cj4gPj4+ Pj4gYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZGlzcGxheS9wYW5lbC9wYW5l bC1sdmRzLnR4dAo+ID4+Pj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPj4+Pj4gaW5kZXggMDAw MDAwMDAwMDAwLi4yNTA4NjFmMjY3M2UKPiA+Pj4+PiAtLS0gL2Rldi9udWxsCj4gPj4+Pj4gKysr IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2Rpc3BsYXkvcGFuZWwvcGFuZWwt bHZkcy50eHQKPiA+Pj4+PiBAQCAtMCwwICsxLDExOSBAQAo+ID4+Pj4+ICtHZW5lcmljIExWRFMg UGFuZWwKPiA+Pj4+PiArPT09PT09PT09PT09PT09PT09Cj4gPj4+Pj4gKwo+ID4+Pj4+ICtMVkRT IGlzIGEgcGh5c2ljYWwgbGF5ZXIgc3BlY2lmaWNhdGlvbiBkZWZpbmVkIGluCj4gPj4+Pj4gQU5T SS9USUEvRUlBLTY0NC1BLiBNdWx0aXBsZQo+ID4+Pj4+ICtpbmNvbXBhdGlibGUgZGF0YSBsaW5r IGxheWVycyBoYXZlIGJlZW4gdXNlZCBvdmVyIHRpbWUgdG8gdHJhbnNtaXQKPiA+Pj4+PiBpbWFn ZSBkYXRhCj4gPj4+Pj4gK3RvIExWRFMgcGFuZWxzLiBUaGlzIGJpbmRpbmdzIHN1cHBvcnRzIGRp c3BsYXkgcGFuZWxzIGNvbXBhdGlibGUKPiA+Pj4+PiB3aXRoIHRoZQo+ID4+Pj4+ICtmb2xsb3dp bmcgc3BlY2lmaWNhdGlvbnMuCj4gPj4+Pj4gKwo+ID4+Pj4+ICtbSkVJREFdICJEaWdpdGFsIElu dGVyZmFjZSBTdGFuZGFyZHMgZm9yIE1vbml0b3IiLCBKRUlEQS01OS0xOTk5LAo+ID4+Pj4+IEZl YnJ1YXJ5Cj4gPj4+Pj4gKzE5OTkgKFZlcnNpb24gMS4wKSwgSmFwYW4gRWxlY3Ryb25pYyBJbmR1 c3RyeSBEZXZlbG9wbWVudAo+ID4+Pj4+IEFzc29jaWF0aW9uIChKRUlEQSkKPiA+Pj4+PiArW0xE SV0gIk9wZW4gTFZEUyBEaXNwbGF5IEludGVyZmFjZSIsIE1heSAxOTk5IChWZXJzaW9uIDAuOTUp LAo+ID4+Pj4+IE5hdGlvbmFsCj4gPj4+Pj4gK1NlbWljb25kdWN0b3IKPiA+Pj4+PiArW1ZFU0Fd ICJWRVNBIE5vdGVib29rIFBhbmVsIFN0YW5kYXJkIiwgT2N0b2JlciAyMDA3IChWZXJzaW9uIDEu MCksCj4gPj4+Pj4gVmlkZW8KPiA+Pj4+PiArRWxlY3Ryb25pY3MgU3RhbmRhcmRzIEFzc29jaWF0 aW9uIChWRVNBKQo+ID4+Pj4+ICsKPiA+Pj4+PiArRGV2aWNlIGNvbXBhdGlibGUgd2l0aCB0aG9z ZSBzcGVjaWZpY2F0aW9ucyBoYXZlIGJlZW4gbWFya2V0ZWQgdW5kZXIKPiA+Pj4+PiB0aGUKPiA+ Pj4+PiArRlBELUxpbmsgYW5kIEZsYXRMaW5rIGJyYW5kcy4KPiA+Pj4+PiArCj4gPj4+Pj4gKwo+ ID4+Pj4+ICtSZXF1aXJlZCBwcm9wZXJ0aWVzOgo+ID4+Pj4+ICstIGNvbXBhdGlibGU6IHNoYWxs IGNvbnRhaW4gInBhbmVsLWx2ZHMiCj4gPj4+PiAKPiA+Pj4+IE1heWJlIGFzIGEgZmFsbGJhY2ss IGJ1dCBvbiBpdHMgb3duLCBubyB3YXkuCj4gPj4+IAo+ID4+PiBXaGljaCBicmluZ3MgYW4gaW50 ZXJlc3RpbmcgcXVlc3Rpb246IHdoZW4gZGVzaWduaW5nIGdlbmVyaWMgRFQKPiA+Pj4gYmluZGlu Z3MsIHdoYXQncyB0aGUgcnVsZSByZWdhcmRpbmcKPiA+IAo+ID4gTG9va3MgbGlrZSBJIGZvcmdv dCBwYXJ0IG9mIHRoZSBxdWVzdGlvbi4gSSBtZWFudCB0byBhc2sgd2hhdCBpcyB0aGUgcnVsZQo+ ID4gcmVnYXJkaW5nIHVzYWdlIG9mIG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0cmluZ3MgPwo+ IAo+IFdoZW4gaW4gZG91YnQsIGFsd2F5cyBoYXZlIG9uZS4gSWYgdGhlcmUncyBhbnkgY2hhbmNl IGF0IGFsbCB0aGF0IHMvdwo+IHdpbGwgbmVlZCB0byBrbm93IG9yIGNhcmUsIHRoZW4gd2Ugc2hv dWxkIGhhdmUgb25lLgo+IAo+ID4gRm9yIGluc3RhbmNlIChidXQgcGVyaGFwcyBub3QgdGhlIGJl c3QgZXhhbXBsZSksIHRoZQo+ID4gaW5wdXQvcm90YXJ5LWVuY29kZXIudHh0IGJpbmRpbmdzIGRl ZmluZSBhICJyb3RhcnktZW5jb2RlciIgY29tcGF0aWJsZQo+ID4gc3RyaW5nLCB3aXRoIG5vIG90 aGVyIGJpbmRpbmdzIGRlZmluaW5nIG1vcmUgcHJlY2lzZSBjb21wYXRpYmxlIHN0cmluZ3MKPiA+ IGZvciB0aGUgZXhhY3Qgcm90YXJ5IGVuY29kZXIgbW9kZWwuIFdoZW4gaXQgY29tZXMgdG8gcGFu ZWxzIEkgYmVsaWV2ZSBpdAo+ID4gbWFrZXMgc2Vuc2UgdG8gZGVmaW5lIG1vZGVsLXNwZWNpZmlj IGNvbXBhdGlibGUgc3RyaW5ncyBldmVuIGlmIHRoZXkncmUKPiA+IHVudXNlZCBieSBkcml2ZXJz LiBJJ20gaG93ZXZlciB3b25kZXJpbmcgd2hhdCB0aGUgcnVsZSBpcyB0aGVyZSwgYW5kCj4gPiB3 aGVyZSB0aG9zZSBkZXZpY2Utc3BlY2lmaWMgY29tcGF0aWJsZSBzdHJpbmdzIHNob3VsZCBiZSBk ZWZpbmVkLiBJJ2QKPiA+IGxpa2UgdG8gYXZvaWQgdXNpbmcgb25lIGZpbGUgcGVyIHBhbmVsIG1v ZGVsIGFzIGRvbmUgdG9kYXkgZm9yIHRoZQo+ID4gc2ltcGxlLXBhbmVsIGJpbmRpbmdzLgo+IAo+ IFRoZXJlJ3MgYSBmZXcgZXhjZXB0aW9ucyBsaWtlIHRoaXMgd2hlcmUgdGhlcmUgaXMgbm90IGFu eSBzb3J0IG9mCj4gbW9kZWwgdG8gYmFzZSBhIGNvbXBhdGlibGUgb24uIEZvciBleGFtcGxlLCBh IEdQSU8gY29ubmVjdGVkIExFRCBpcwo+IHRydWx5IGdlbmVyaWMuIFRoZSBvbmx5IHdheSB0byBo YXZlIGEgbW9yZSBzcGVjaWZpYyBjb21wYXRpYmxlIHdvdWxkCj4gYmUgc29tZXRoaW5nIHdpdGgg dGhlIGJvYXJkIG5hbWUgaW4gaXQuCj4gCj4gWW91ciBjYXNlIGhlcmUgaXMgaW4gdGhlIG1pZGRs ZS4gSXQgc2VlbXMgbGlrZSBpdCdzIGdlbmVyaWMgYW5kCj4gcGFzc2l2ZSwgYnV0IHBlcmhhcHMg cG93ZXIgY29udHJvbCBpcyBub3QuIFJhdGhlciB0aGFuIHRyeWluZyB0bwo+IGRlY2lkZSwgd2Ug Y2FuIGp1c3QgY292ZXIgb3VyIGFzcyBhbmQgcHV0IGJvdGggYSBnZW5lcmljIGFuZCBzcGVjaWZp Ywo+IGNvbXBhdGlibGUgaW4uCgpUaGF0IHNvdW5kcyBnb29kIHRvIG1lLiBJJ2xsIG1lbnRpb24g aW4gdGhlIGRvY3VtZW50IHRoYXQgYSBtb3JlIHByZWNpc2UgCmNvbXBhdGlibGUgaXMgcmVxdWly ZWQuCgo+ID4+IENhbGwgaXQgInNpbXBsZSIgc28gSSBjYW4gZWFzaWx5IE5BSyBpdC4gOikKPiA+ PiAKPiA+PiBEZWZpbmUgYSBnZW5lcmljIHN0cnVjdHVyZSwgbm90IGEgc2luZ2xlIGJpbmRpbmcg dHJ5aW5nIHRvIHNlcnZlIGFsbC4KPiA+PiAKPiA+Pj4+PiArLSB3aWR0aC1tbTogcGFuZWwgZGlz cGxheSB3aWR0aCBpbiBtaWxsaW1ldGVycwo+ID4+Pj4+ICstIGhlaWdodC1tbTogcGFuZWwgZGlz cGxheSBoZWlnaHQgaW4gbWlsbGltZXRlcnMKPiA+Pj4+IAo+ID4+Pj4gVGhpcyBpcyBhbHJlYWR5 IGRvY3VtZW50ZWQgZm9yIGFsbCBwYW5lbHMgSUlSQy4KPiA+Pj4gCj4gPj4+IE5vdGUgdGhhdCB0 aGlzIERUIGJpbmRpbmcgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgc2ltcGxlLXBhbmVsCj4g Pj4+IGJpbmRpbmcuIEl0IGlzIGluc3RlYWQgc2ltaWxhciB0byB0aGUgcGFuZWwtZHBpIGFuZCBw YW5lbC1kc2ktY20KPiA+Pj4gYmluZGluZ3MgKHdoaWNoIGN1cnJlbnRseSBkb24ndCBidXQgc2hv dWxkIHNwZWNpZnkgdGhlIHBhbmVsIHNpemUgaW4KPiA+Pj4gRFQpLiBUaGUgTFZEUyBwYW5lbCBk cml2ZXIgd2lsbCAqbm90KiBpbmNsdWRlIGFueSBwYW5lbC1zcGVjaWZpYwo+ID4+PiBpbmZvcm1h dGlvbiBzdWNoIGFzIHNpemUgb3IgdGltaW5ncywgdGhlc2UgYXJlIHNwZWNpZmllZCBpbiBEVC4K PiA+PiAKPiA+PiBUaGUgcGFuZWwgYmluZGluZ3MgYXJlbid0IHJlYWxseSBkaWZmZXJlbnQuIFRo ZSBiaWdnZXN0IGRpZmZlcmVuY2Ugd2FzCj4gPj4gbG9jYXRpb24gaW4gdGhlIHRyZWUsIGJ1dCB3 ZSBub3cgZ2VuZXJhbGx5IGFsbG93IHBhbmVscyB0byBiZSBlaXRoZXIgYQo+ID4+IGNoaWxkIG9m IHRoZSBMQ0QgY29udHJvbGxlciBvciBjb25uZWN0ZWQgd2l0aCBPRiBncmFwaC4gV2UgcHJvYmFi bHkKPiA+PiBuZWVkIHRvIHdvcmsgb24gcmVzdHJ1Y3R1cmluZyB0aGUgcGFuZWwgYmluZGluZ3Mg YSBiaXQuIFdlIHNob3VsZCBoYXZlCj4gPj4gYW4gaW5oZXJpdGFuY2Ugd2l0aCBhIGJhc2UgcGFu ZWwgYmluZGluZyBvZiB0aGluZ3MgbGlrZSBzaXplLCBsYWJlbCwKPiA+PiBncmFwaCwgYmFja2xp Z2h0LCBldGMsIHRoZW4gcGVyaGFwcyBhbiBpbnRlcmZhY2Ugc3BlY2lmaWMgYmluZGluZ3MgZm9y Cj4gPj4gTFZEUywgRFNJLCBhbmQgcGFyYWxsZWwsIHRoZW4gYSBwYW5lbCBzcGVjaWZpYyBiaW5k aW5nLiBXaXRoIHRoaXMgdGhlCj4gPj4gcGFuZWwgc3BlY2lmaWMgYmluZGluZyBpcyB0eXBpY2Fs bHkganVzdCBhIGNvbXBhdGlibGUgc3RyaW5nIGFuZCB3aGljaAo+ID4+IGluaGVyaXRlZCBwcm9w ZXJ0aWVzIGFwcGx5IHRvIGl0Lgo+ID4gCj4gPiBUaGF0IHNvdW5kcyBnb29kIHRvIG1lLCBidXQg d2UgaGF2ZSBtdWx0aXBsZSBtb2RlbHMgZm9yIHBhbmVsIGJpbmRpbmdzLgo+ID4gCj4gPiBBcyB5 b3UgbWVudGlvbmVkIHBhbmVscyBjYW4gYmUgcmVmZXJlbmNlZCB0aHJvdWdoIGFuIExDRCBjb250 cm9sbGVyIG5vZGUKPiA+IHByb3BlcnR5IGNvbnRhaW5pbmcgYSBwaGFuZGxlIHRvIHRoZSBwYW5l bCBub2RlLCBvciB0aHJvdWdoIE9GIGdyYXBoLgo+ID4gVGhhdCdzIGEgc2l0dWF0aW9uIHdlIGhh dmUgdG9kYXksIGFuZCB3ZSBuZWVkIHRvIGtlZXAgc3VwcG9ydGluZyBib3RoIChhdAo+ID4gbGVh c3QgZm9yIGV4aXN0aW5nIHBhbmVscywgcGVyaGFwcyBub3QgZm9yIHRoZSBuZXcgb25lcykuCj4g PiAKPiA+IEFub3RoZXIgZGlmZmVyZW5jZSBpcyBob3cgdG8gZXhwcmVzcyBwYW5lbCBkYXRhIHN1 Y2ggYXMgc2l6ZSBhbmQgdGltaW5ncy4KPiA+IFRoZSBzaW1wbGUtcGFuZWwgRFQgYmluZGluZ3Mg ZG9uJ3QgY29udGFpbiBzdWNoIGRhdGEgYW5kIGV4cGVjdHMgdGhlCj4gPiBkcml2ZXJzIHRvIGNv bnRhaW4gYSB0YWJsZSBvZiBwYW5lbCBkYXRhIGZvciBhbGwgbW9kZWxzIHN1cHBvcnRlZCwgd2hp bGUKPiA+IHRoZSBEUEksIERTSSBhbmQgbm93IHRoZSBwcm9wb3NlZCBMVkRTIHBhbmVsIGJpbmRp bmdzIGNvbnRhaW4gcHJvcGVydGllcwo+ID4gZm9yIHBhbmVsIGRhdGEuCj4gPiAKPiA+IEhvdyB3 b3VsZCB5b3UgbGlrZSB0byByZWNvbmNpbGUgYWxsIHRoYXQgPwo+IAo+IFRoaWVycnkgaGFzIG91 dGxpbmVkIHRoZSBwb3NpdGlvblsxXSB0aGF0IHNpbXBsZS1wYW5lbCBmb2xsb3dzIG1hbnkKPiB0 aW1lcyBhbmQgSSBnZW5lcmFsbHkgYWdyZWUuIEkgY291bGQgYmUgY29udmluY2VkIHRoYXQgcGVy aGFwcyBwYW5lbAo+IHRpbWluZ3MgY291bGQgZ28gaW50byBEVC4gSG93ZXZlciwgeW91IGNhbid0 IHJlYWxseSBkZXNjcmliZQo+ICpldmVyeXRoaW5nKiwgc28gd2UncmUgbm90IGdvaW5nIHRvIGdl dCBhd2F5IGZyb20gcGFuZWwgc3BlY2lmaWMKPiBjb21wYXRpYmxlIHN0cmluZ3MgYW5kIHBhbmVs IHNwZWNpZmljcyBpbiB0aGUga2VybmVsLgoKSSdtIGZpbmUgd2l0aCB0aGF0IG1pZGRsZSBncm91 bmQsIGFuZCB3aWxsIGluY2x1ZGUgcGFuZWwgdGltaW5ncyBpbiBEVCBidXQgbm90IAphbiBpbmZv cm1hdGlvbiByZWxhdGVkIHRvIHBvd2VyIHNlcXVlbmNpbmcgb3Igb3RoZXIgcGFuZWwtc3BlY2lm aWMgcHJvcGVydGllcyAKKGJlc2lkZSB0aGUgc3RhbmRhcmRpemVkIHByb3BlcnRpZXMgZGVmaW5l ZCBpbiB0aGlzIGJpbmRpbmcgb2YgY291cnNlKS4KCj4gPj4+Pj4gKy0gZGF0YS1tYXBwaW5nOiB0 aGUgY29sb3Igc2lnbmFscyBtYXBwaW5nIG9yZGVyLCAiamVpZGEtMTgiLAo+ID4+Pj4+ICJqZWlk YS0yNCIKPiA+Pj4+PiArICBvciAidmVzYS0yNCIKPiA+Pj4+IAo+ID4+Pj4gTWF5YmUgdGhpcyBz aG91bGQgYmUgcGFydCBvZiB0aGUgY29tcGF0aWJsZS4KPiA+Pj4gCj4gPj4+IEkndmUgdGhvdWdo dCBhYm91dCBpdCwgYnV0IGdpdmVuIHRoYXQgc29tZSBwYW5lbHMgc3VwcG9ydCBzZWxlY3RpbmcK PiA+Pj4gYmV0d2VlbiBtdWx0aXBsZSBtb2RlcyAodGhyb3VnaCBhIG1vZGUgcGluIHRoYXQgaXMg dXN1YWxseSBoYXJkd2lyZWQpLAo+ID4+PiBJIGJlbGlldmUgYSBzZXBhcmF0ZSBEVCBwcm9wZXJ0 eSBtYWtlcyBzZW5zZS4KPiA+PiAKPiA+PiBPa2F5Lgo+ID4+IAo+ID4+PiBGdXJ0aGVybW9yZSwg TFZEUyBkYXRhIG9yZ2FuaXphdGlvbiBpcyBjb250cm9sbGVkIGJ5IHRoZSBjb21iaW5hdGlvbiBv Zgo+ID4+PiBib3RoIGRhdGEtbWFwcGluZyBhbmQgZGF0YS1taXJyb3IuIEl0IG1ha2VzIGxpdHRs ZSBzZW5zZSBmcm9tIG15IHBvaW50Cj4gPj4+IG9mIHZpZXcgdG8gaGFuZGxlIG9uZSBhcyBwYXJ0 IG9mIHRoZSBjb21wYXRpYmxlIHN0cmluZyBhbmQgdGhlIG90aGVyIG9uZQo+ID4+PiBhcyBhIHNl cGFyYXRlIHByb3BlcnR5Lgo+ID4+PiAKPiA+Pj4+ID4gK09wdGlvbmFsIHByb3BlcnRpZXM6Cj4g Pj4+PiA+ICstIGxhYmVsOiBhIHN5bWJvbGljIG5hbWUgZm9yIHRoZSBwYW5lbAo+ID4+Pj4gCj4g Pj4+PiBDb3VsZCBiZSBmb3IgYW55IHBhbmVsIG9yIGRpc3BsYXkgY29ubmVjdG9yLgo+ID4+PiAK PiA+Pj4gWWVzLCBidXQgSSdtIG5vdCBzdXJlIHRvIHVuZGVyc3RhbmQgaG93IHRoYXQncyByZWxl dmFudCA6LSkKPiA+PiAKPiA+PiBNZWFuaW5nIGl0IHNob3VsZCBiZSBhIGNvbW1vbiBwcm9wZXJ0 eS4KPiA+IAo+ID4gU3VyZS4gU28geW91IGV4cGVjdCBtZSB0byByZW9yZ2FuaXplIGFsbCB0aGUg cGFuZWxzIGFuZCBjb25uZWN0b3JzIERUCj4gPiBiaW5kaW5ncyBpbiBvcmRlciB0byBnZXQgdGhp cyBvbmUgbWVyZ2VkID8gOi0pCj4gCj4gTm8sIGJlY2F1c2UgSSBkb24ndCB0aGluayBsYWJlbCBp cyB3aWRlbHkgZGVmaW5lZC4gSnVzdCBwdXQgaXQgaW4gYQo+IGNvbW1vbiBwbGFjZSBhbmQgcmVm ZXJlbmNlIGl0LiBBbnkgb3RoZXIgcGFuZWxzIGNhbiBiZSBmaXhlZCBsYXRlci4KPiBSZWFsbHks IHRoZSAic2ltcGxlIHBhbmVsIiBiaW5kaW5nIHNob3VsZCBwcm9iYWJseSBtb3JwaCBpbnRvIHRo ZQo+IGNvbW1vbiBiaW5kaW5nLgoKVGhlICJsYWJlbCIgcHJvcGVydHkgaXMgYWN0dWFsbHkgZGVm aW5lZCBpbiB0aGUgIkRldmljZXRyZWUgU3BlY2lmaWNhdGlvbiwgClJlbGVhc2UgMC4xIiBhcyBy ZWNlbnRseSBwdWJsaXNoZWQgb24gZGV2aWNldHJlZS5vcmcuIFdoZXJlIHdvdWxkIHlvdSBsaWtl IG1lIAp0byBkZWZpbmUgaXQgaW4gdGhlIGJpbmRpbmdzID8KCj4gPj4+Pj4gKy0gYXZkZC1zdXBw bHk6IHJlZmVyZW5jZSB0byB0aGUgcmVndWxhdG9yIHRoYXQgcG93ZXJzIHRoZSBwYW5lbAo+ID4+ Pj4+IGFuYWxvZyBzdXBwbHkKPiA+Pj4+PiArLSBkdmRkLXN1cHBseTogcmVmZXJlbmNlIHRvIHRo ZSByZWd1bGF0b3IgdGhhdCBwb3dlcnMgdGhlIHBhbmVsCj4gPj4+Pj4gZGlnaXRhbCBzdXBwbHkK PiA+Pj4+IAo+ID4+Pj4gV2hpY2ggb25lIGhhcyB0byBiZSBwb3dlcmVkIG9uIGZpcnN0LCB3aGF0 IHZvbHRhZ2UsIGFuZCB3aXRoIHdoYXQgdGltZQo+ID4+Pj4gaW4gYmV0d2Vlbj8gVGhpcyBpcyB3 aHkgImdlbmVyaWMiIG9yICJzaW1wbGUiIGJpbmRpbmdzIGRvbid0IHdvcmsuCj4gPj4+IAo+ID4+ PiBUaGUgYWJvdmUtbWVudGlvbmVkIHNwZWNpZmljYXRpb25zIGFsc28gZGVmaW5lIGNvbm5lY3Rv cnMsIHBpbm91dHMgYW5kCj4gPj4+IHBvd2VyIHN1cHBsaWVzLCBidXQgbWFueSBMVkRTIHBhbmVs cyBjb21wYXRpYmxlIHdpdGggdGhlIExWRFMgcGh5c2ljYWwKPiA+Pj4gYW5kIGRhdGEgbGF5ZXJz IHVzZSBhIGRpZmZlcmVudCBjb25uZWN0b3Igd2l0aCBzbWFsbCBkaWZmZXJlbmNlcyBpbgo+ID4+ PiBwb3dlciBzdXBwbGllcy4KPiA+Pj4gCj4gPj4+IEkgYmVsaWV2ZSB0aGUgdm9sdGFnZSBpcyBp cnJlbGV2YW50IGhlcmUsIGl0IGRvZXNuJ3QgbmVlZCB0byBiZQo+ID4+PiBjb250cm9sbGVkIGJ5 IHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBQb3dlciBzdXBwbGllcyBvcmRlciBhbmQgdGltaW5nIGlz Cj4gPj4+IHJlbGV2YW50LCBJJ2xsIGludmVzdGlnYXRlIHRoZSBsZXZlbCBvZiBkaWZmZXJlbmNl cyBiZXR3ZWVuIHBhbmVscy4gSSdtCj4gPj4+IGFsc28gZmluZSB3aXRoIGRyb3BwaW5nIHRob3Nl IHByb3BlcnRpZXMgZm9yIG5vdy4KPiA+PiAKPiA+PiBXaGV0aGVyIHlvdSBoYXZlIGNvbnRyb2wg b2YgdGhlIHN1cHBsaWVzIGlzIGRlcGVuZGVudCBvbiB0aGUgYm9hcmQuCj4gPj4gRHJvcHBpbmcg dGhlbSBpcyBqdXN0IHB1dHMgdXMgaW4gdGhlIHNpbXBsZSBiaW5kaW5nIHRyYXAuIFRoZSBzaW1w bGUKPiA+PiBiaW5kaW5ncyBzdGFydCBvdXQgdGhhdCB3YXkgYW5kIHRoZW4gcGVvcGxlIGtlZXAg YWRkaW5nIHRvIHRoZW0uCj4gPiAKPiA+IERhbW4sIHlvdSBjYW4ndCBiZSBmb29sZWQgZWFzaWx5 IDstKQo+IAo+IEkgZ3Vlc3MgeW91IGNhbiBjb3VudCBhbGwgdGhlIHNpbXBsZSBiaW5kaW5ncyB0 byBzZWUgaG93IG1hbnkgdGltZXMgSQo+IGNhbiBiZSBmb29sZWQuIDopCj4gCj4gPiBPbiBhIG1v cmUgc2VyaW91cyBub3RlLCBJJ2QgbGlrZSB0byBkZXNpZ24gdGhlIGJpbmRpbmdzIGluIGEgd2F5 IHRoYXQKPiA+IHdvdWxkbid0IHJlcXVpcmUgYWRkaW5nIGRldmljZS1zcGVjaWZpYyBjb2RlIGlu IHRoZSBkcml2ZXIgZm9yIGVhY2ggcGFuZWwKPiA+IG1vZGVsLCBnaXZlbiB0aGF0IGluIG1vc3Qg Y2FzZXMgcG93ZXIgc3VwcGx5IGhhbmRsaW5nIHdpbGwgYmUgZ2VuZXJpYy4KPiA+IFdoYXQncyB5 b3VyIG9waW5pb24gYWJvdXQgYSBnZW5lcmljIHBvd2VyIHN1cHBseSBtb2RlbCB0aGF0IHdvdWxk IGJlIHVzZWQKPiA+IGluIHRoZSBkZWZhdWx0IGNhc2UsIHdpdGggdGhlIG9wdGlvbiB0byBvdmVy cmlkZSBpdCB3aXRoIGRldmljZS1zcGVjaWZpYwo+ID4gY29kZSB3aGVuIG5lZWRlZCA/Cj4KPiBJ IGRvbid0IGFncmVlLiBSZWFkIFRoaWVycnkncyBwb3N0IG9uIHRoZSBzdWJqZWN0WzFdLgoKSSdt IG5vdCBzdXJlIHlvdSB1bmRlcnN0b29kIG1lIGNvcnJlY3RseSAoYW5kIHdyaXRpbmcgYSBjbGFy aWZpY2F0aW9uIGF0IAo0OjAwYW0gbWlnaHQgbm90IGhlbHAgOi0pKS4gTXkgcG9pbnQgaGVyZSBp cyB0aGF0IGEgZmFpciBudW1iZXIgb2YgcGFuZWxzIApkb24ndCBjYXJlIGFib3V0IHBvd2VyIHNl cXVlbmNpbmcgYW5kIGhhdmUgbm8gY29udHJvbCBHUElPcyAodGhhdCdzIGNlcnRhaW5seSAKdGhl IGNhc2Ugb2YgdGhlIHR3byBNaXRzdWJpc2hpIHBhbmVscyBJIHVzZSBoZXJlIHRoYXQgaGF2ZSBh IHNpbmdsZSBwb3dlciAKc3VwcGx5IC0gZ29vZCBsdWNrIHRyeWluZyB0byBjb252aW5jZSBtZSB0 aGF0IHRoaXMgbmVlZHMgdG8gYmUgc2VxdWVuY2VkIDotKSAtIAphbmQgbm8gZW5hYmxlIG9yIHJl c2V0IGNvbnRyb2wgcGluKS4gVGhpcyBraW5kIG9mIHBhbmVsIHNob3VsZCBvYnZpb3VzbHkgYmUg Cm1vZGVsbGVkIGluIERUIHdpdGggYm90aCBhIHNwZWNpZmljIGFuZCBhIGdlbmVyaWMgKCJwYW5l bC1sdmRzIikgY29tcGF0aWJsZSAKc3RyaW5nLCB0byBlbnN1cmUgdGhhdCB3ZSdsbCBoYXZlIGVu b3VnaCBpbmZvcm1hdGlvbiBhdmFpbGFibGUgb24gdGhlIApvcGVyYXRpbmcgc3lzdGVtIHNpZGUg dG8gY29udHJvbCB0aGUgcGFuZWwgcHJvcGVybHkuIFRoZSBwb3dlciBzdXBwbHkoaWVzKSAKc2hv dWxkIGJlIGRvY3VtZW50ZWQgaW4gcmVsYXRpb24gdG8gdGhlIHNwZWNpZmljIGNvbXBhdGlibGUg c3RyaW5nIGFuZCBub3QgCm1lbnRpb25lZCBieSB0aGUgZ2VuZXJpYyBiaW5kaW5ncyAod2hldGhl ciB0aGF0IHNob3VsZCBnbyBpbiBvbmUgb3IgbXVsdGlwbGUgCnRleHQgZmlsZXMgaXMgYmlrZXNo ZWRkaW5nKS4KClRoaXMgYmVpbmcgc2FpZCwgb24gdGhlIGRyaXZlciBzaWRlLCBJIGRvbid0IHNl ZSBhIHJlYXNvbiB0byBsaXN0IHRoZSBzcGVjaWZpYyAKY29tcGF0aWJsZSBzdHJpbmdzIGV4cGxp Y2l0bHkgZm9yIHRob3NlIHBhbmVscyB3aGVuIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiAKbWF0 Y2hpbmcgdGhlIGdlbmVyaWMgY29tcGF0aWJsZSBzdHJpbmcgY2FuIGhhbmRsZSB0aGVtIGZpbmUu IFRoaXMgaGFzIG5vIAppbXBhY3Qgb24gdGhlIGJpbmRpbmdzIGFuZCBpcyBhbiBMaW51eCBpbXBs ZW1lbnRhdGlvbiBkZWNpc2lvbi4KCj4gWzFdCj4gaHR0cDovL3NpZXRjaC10YWdyLmJsb2dzcG90 LmNvbS8yMDE2LzA0L2Rpc3BsYXktcGFuZWxzLWFyZS1ub3Qtc3BlY2lhbC5odG1sCgotLSAKUmVn YXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2RyaS1kZXZlbAo=