From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752459AbdECPAo (ORCPT ); Wed, 3 May 2017 11:00:44 -0400 Received: from mail-wr0-f195.google.com ([209.85.128.195]:33951 "EHLO mail-wr0-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751118AbdECPAf (ORCPT ); Wed, 3 May 2017 11:00:35 -0400 Date: Wed, 3 May 2017 17:00:31 +0200 From: Daniel Vetter To: Jose Abreu Cc: Daniel Vetter , dri-devel , Linux Kernel Mailing List , Carlos Palminha , Alexey Brodkin , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , Dave Airlie Subject: Re: [PATCH 1/2] drm: Introduce crtc->mode_valid() callback Message-ID: <20170503150031.rpd5xs2bb67mpsnc@phenom.ffwll.local> Mail-Followup-To: Jose Abreu , dri-devel , Linux Kernel Mailing List , Carlos Palminha , Alexey Brodkin , Ville =?iso-8859-1?Q?Syrj=E4l=E4?= , Dave Airlie References: <3e1dba0cd5fc053e56f1c9c94d0cb8789ecca4ae.1493203049.git.joabreu@synopsys.com> <20170502084807.k7ioo7a5j33xtnpj@phenom.ffwll.local> <80752cfe-4bc7-b7c6-c29b-e634c356a509@synopsys.com> <9edb415e-4d0b-5a2a-a735-0dbb98d77984@synopsys.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <9edb415e-4d0b-5a2a-a735-0dbb98d77984@synopsys.com> X-Operating-System: Linux phenom 4.9.0-2-amd64 User-Agent: NeoMutt/20170306 (1.8.0) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 03, 2017 at 03:16:13PM +0100, Jose Abreu wrote: > Hi Daniel, > > > On 03-05-2017 07:19, Daniel Vetter wrote: > > On Tue, May 2, 2017 at 11:29 AM, Jose Abreu wrote: > >> On 02-05-2017 09:48, Daniel Vetter wrote: > >>> On Wed, Apr 26, 2017 at 11:48:34AM +0100, Jose Abreu wrote: > >>>> Some crtc's may have restrictions in the mode they can display. In > >>>> this patch a new callback (crtc->mode_valid()) is introduced that > >>>> is called at the same stage of connector->mode_valid() callback. > >>>> > >>>> This shall be implemented if the crtc has some sort of restriction > >>>> so that we don't probe modes that will fail in the commit() stage. > >>>> For example: A given crtc may be responsible to set a clock value. > >>>> If the clock can not produce all the values for the available > >>>> modes then this callback can be used to restrict the number of > >>>> probbed modes to only the ones that can be displayed. > >>>> > >>>> If the crtc does not implement the callback then the behaviour will > >>>> remain the same. Also, for a given set of crtcs that can be bound to > >>>> the connector, if at least one can display the mode then the mode > >>>> will be probbed. > >>>> > >>>> Signed-off-by: Jose Abreu > >>>> Cc: Carlos Palminha > >>>> Cc: Alexey Brodkin > >>>> Cc: Ville Syrjälä > >>>> Cc: Daniel Vetter > >>>> Cc: Dave Airlie > >>> Not sure this is useful, since you still have to duplicate the exact same > >>> check into your ->mode_fixup hook. That seems to make things even more > >>> confusing. > >> Yeah, in arcpgu I had to duplicate the code in ->atomic_check. > >> > >>> Also this doesn't update the various kerneldoc comments. For the existing > >>> hooks. Since this topic causes so much confusion, I don't think a > >>> half-solution will help, but has some good potential to make things worse. > >> I only documented the callback in drm_modeset_helper_vtables.h. > >> > >> Despite all of this, I think it doesn't makes sense delivering > >> modes to userspace which can never be used. > >> > >> This is really annoying in arcpgu. Imagine: I try to use mpv to > >> play a video, the full set of modes from EDID were probed so if I > >> just start mpv it will pick the native mode of the TV instead of > >> the one that is supported, so mpv will fail to play. I know the > >> value of clock which will work (so I know what mode shall be > >> used), but a normal user which is not aware of the HW will have > >> to cycle through the list of modes and try them all until it hits > >> one that works. Its really boring. > >> > >> For the modes that user specifies manually there is nothing we > >> can do, but we should not trick users into thinking that a given > >> mode is supported when it will always fail at commit. > > Yes, you are supposed to filter these out in ->mode_valid. But my > > stance is that only adding a half-baked support for a new callback to > > the core isn't going to make life easier for drivers, it will just add > > to the confusion. There's already piles of docs for both @mode_valid > > and @mode_fixup hooks explaining this, I don't want to make the > > documentation even more complex. And half-baked crtc checking is > > _much_ easier to implement in the driver directly (e.g. i915 checks > > for crtc constraints since forever, as do the other big x86 drivers). > > But i915 crtc checks are done after handing the mode to > userspace, arcpgu also does that. We must let users specify > manually a mode but there is no point in returning modes in > get_connector which will always fail to commit. I get your point > and this can lead to code duplication, but I don't think it will > lead to confusion as long as it is well documented. And besides, > the callback is completely optional. Look closer, e.g. intel_dp_mode_valid calls intel_dp_downstream_max_dotclock which also looks at dev_priv->max_dotclkc_freq (which is the source dotclk limit, yeah it's a misnamed function). And the max dotclk is very much a crtc limit, not a port limit. Note that a bunch of other ports have port limits which are guaranteed to be lower than the crtc limit, hence the absence of the checks. > > So all taken together, if we add a ->mode_valid to crtcs, then imo we > > should do it right and actually make life easier for drivers. A good > > proof would be if your patch would allow us to drop a lot of the > > lenghty language from the @mode_valid hooks. > > I completely agree that it should make life easier for drivers > but unfortunately I don't really see how :/ > > So, in summary: > Disadvantage 1: Code duplication > Disadvantage 2: Confusing documentation can lead to callback > misuse > > Advantage 1: User will get life simpler Ok, let me try to explain a bit in more detail what I think would be a real improvement: - Add ->mode_valid checks to all the places where we currently have ->mode_fixup. That'd be crtc, encoder and bridges. - Pimp the probe helper code to go through all of the combinations, filtering out those that aren't allowed by possible_* masks (essentially do the same thing that userspace is supposed to do). - Call all these ->mode_valid checks from the atomic check functions (I think we can forget about the legacy crtc helpers for old drivers). Do this also for connector->mode_valid. Taken all together this gives us the guarantee that that any mode which fails the check in the probe path is guaranteed to never pass in an atomic commit. And since the probed mode list is what developers generally see, that's hopefully enough to make sure the filtering is correct. It is a bit more code than what you've typed here, but not a lot: - probe path needs to loop over all CRTCxEncoder combos (the encoder->bridge routing is fixed) instead over just CRTCs. - Call ->mode_valid in all the places we already call ->mode_fixup. You don't need a new loop over all connectors to be able to call ->mode_valid since we already have that connector loop in check_modesets(). With that we should also be able to simplify the documentation and rip out all the warnings about how this is tricky. -Daniel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 1/2] drm: Introduce crtc->mode_valid() callback Date: Wed, 3 May 2017 17:00:31 +0200 Message-ID: <20170503150031.rpd5xs2bb67mpsnc@phenom.ffwll.local> References: <3e1dba0cd5fc053e56f1c9c94d0cb8789ecca4ae.1493203049.git.joabreu@synopsys.com> <20170502084807.k7ioo7a5j33xtnpj@phenom.ffwll.local> <80752cfe-4bc7-b7c6-c29b-e634c356a509@synopsys.com> <9edb415e-4d0b-5a2a-a735-0dbb98d77984@synopsys.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x242.google.com (mail-wr0-x242.google.com [IPv6:2a00:1450:400c:c0c::242]) by gabe.freedesktop.org (Postfix) with ESMTPS id C73FD6E334 for ; Wed, 3 May 2017 15:00:35 +0000 (UTC) Received: by mail-wr0-x242.google.com with SMTP id g12so23363730wrg.2 for ; Wed, 03 May 2017 08:00:35 -0700 (PDT) Content-Disposition: inline In-Reply-To: <9edb415e-4d0b-5a2a-a735-0dbb98d77984@synopsys.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jose Abreu Cc: Alexey Brodkin , Carlos Palminha , dri-devel , Linux Kernel Mailing List List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBNYXkgMDMsIDIwMTcgYXQgMDM6MTY6MTNQTSArMDEwMCwgSm9zZSBBYnJldSB3cm90 ZToKPiBIaSBEYW5pZWwsCj4gCj4gCj4gT24gMDMtMDUtMjAxNyAwNzoxOSwgRGFuaWVsIFZldHRl ciB3cm90ZToKPiA+IE9uIFR1ZSwgTWF5IDIsIDIwMTcgYXQgMTE6MjkgQU0sIEpvc2UgQWJyZXUg PEpvc2UuQWJyZXVAc3lub3BzeXMuY29tPiB3cm90ZToKPiA+PiBPbiAwMi0wNS0yMDE3IDA5OjQ4 LCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+ID4+PiBPbiBXZWQsIEFwciAyNiwgMjAxNyBhdCAxMTo0 ODozNEFNICswMTAwLCBKb3NlIEFicmV1IHdyb3RlOgo+ID4+Pj4gU29tZSBjcnRjJ3MgbWF5IGhh dmUgcmVzdHJpY3Rpb25zIGluIHRoZSBtb2RlIHRoZXkgY2FuIGRpc3BsYXkuIEluCj4gPj4+PiB0 aGlzIHBhdGNoIGEgbmV3IGNhbGxiYWNrIChjcnRjLT5tb2RlX3ZhbGlkKCkpIGlzIGludHJvZHVj ZWQgdGhhdAo+ID4+Pj4gaXMgY2FsbGVkIGF0IHRoZSBzYW1lIHN0YWdlIG9mIGNvbm5lY3Rvci0+ bW9kZV92YWxpZCgpIGNhbGxiYWNrLgo+ID4+Pj4KPiA+Pj4+IFRoaXMgc2hhbGwgYmUgaW1wbGVt ZW50ZWQgaWYgdGhlIGNydGMgaGFzIHNvbWUgc29ydCBvZiByZXN0cmljdGlvbgo+ID4+Pj4gc28g dGhhdCB3ZSBkb24ndCBwcm9iZSBtb2RlcyB0aGF0IHdpbGwgZmFpbCBpbiB0aGUgY29tbWl0KCkg c3RhZ2UuCj4gPj4+PiBGb3IgZXhhbXBsZTogQSBnaXZlbiBjcnRjIG1heSBiZSByZXNwb25zaWJs ZSB0byBzZXQgYSBjbG9jayB2YWx1ZS4KPiA+Pj4+IElmIHRoZSBjbG9jayBjYW4gbm90IHByb2R1 Y2UgYWxsIHRoZSB2YWx1ZXMgZm9yIHRoZSBhdmFpbGFibGUKPiA+Pj4+IG1vZGVzIHRoZW4gdGhp cyBjYWxsYmFjayBjYW4gYmUgdXNlZCB0byByZXN0cmljdCB0aGUgbnVtYmVyIG9mCj4gPj4+PiBw cm9iYmVkIG1vZGVzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBjYW4gYmUgZGlzcGxheWVkLgo+ID4+ Pj4KPiA+Pj4+IElmIHRoZSBjcnRjIGRvZXMgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2sgdGhl biB0aGUgYmVoYXZpb3VyIHdpbGwKPiA+Pj4+IHJlbWFpbiB0aGUgc2FtZS4gQWxzbywgZm9yIGEg Z2l2ZW4gc2V0IG9mIGNydGNzIHRoYXQgY2FuIGJlIGJvdW5kIHRvCj4gPj4+PiB0aGUgY29ubmVj dG9yLCBpZiBhdCBsZWFzdCBvbmUgY2FuIGRpc3BsYXkgdGhlIG1vZGUgdGhlbiB0aGUgbW9kZQo+ ID4+Pj4gd2lsbCBiZSBwcm9iYmVkLgo+ID4+Pj4KPiA+Pj4+IFNpZ25lZC1vZmYtYnk6IEpvc2Ug QWJyZXUgPGpvYWJyZXVAc3lub3BzeXMuY29tPgo+ID4+Pj4gQ2M6IENhcmxvcyBQYWxtaW5oYSA8 cGFsbWluaGFAc3lub3BzeXMuY29tPgo+ID4+Pj4gQ2M6IEFsZXhleSBCcm9ka2luIDxhYnJvZGtp bkBzeW5vcHN5cy5jb20+Cj4gPj4+PiBDYzogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxh QGxpbnV4LmludGVsLmNvbT4KPiA+Pj4+IENjOiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVy QGZmd2xsLmNoPgo+ID4+Pj4gQ2M6IERhdmUgQWlybGllIDxhaXJsaWVkQGxpbnV4LmllPgo+ID4+ PiBOb3Qgc3VyZSB0aGlzIGlzIHVzZWZ1bCwgc2luY2UgeW91IHN0aWxsIGhhdmUgdG8gZHVwbGlj YXRlIHRoZSBleGFjdCBzYW1lCj4gPj4+IGNoZWNrIGludG8geW91ciAtPm1vZGVfZml4dXAgaG9v ay4gVGhhdCBzZWVtcyB0byBtYWtlIHRoaW5ncyBldmVuIG1vcmUKPiA+Pj4gY29uZnVzaW5nLgo+ ID4+IFllYWgsIGluIGFyY3BndSBJIGhhZCB0byBkdXBsaWNhdGUgdGhlIGNvZGUgaW4gLT5hdG9t aWNfY2hlY2suCj4gPj4KPiA+Pj4gQWxzbyB0aGlzIGRvZXNuJ3QgdXBkYXRlIHRoZSB2YXJpb3Vz IGtlcm5lbGRvYyBjb21tZW50cy4gRm9yIHRoZSBleGlzdGluZwo+ID4+PiBob29rcy4gU2luY2Ug dGhpcyB0b3BpYyBjYXVzZXMgc28gbXVjaCBjb25mdXNpb24sIEkgZG9uJ3QgdGhpbmsgYQo+ID4+ PiBoYWxmLXNvbHV0aW9uIHdpbGwgaGVscCwgYnV0IGhhcyBzb21lIGdvb2QgcG90ZW50aWFsIHRv IG1ha2UgdGhpbmdzIHdvcnNlLgo+ID4+IEkgb25seSBkb2N1bWVudGVkIHRoZSBjYWxsYmFjayBp biBkcm1fbW9kZXNldF9oZWxwZXJfdnRhYmxlcy5oLgo+ID4+Cj4gPj4gRGVzcGl0ZSBhbGwgb2Yg dGhpcywgSSB0aGluayBpdCBkb2Vzbid0IG1ha2VzIHNlbnNlIGRlbGl2ZXJpbmcKPiA+PiBtb2Rl cyB0byB1c2Vyc3BhY2Ugd2hpY2ggY2FuIG5ldmVyIGJlIHVzZWQuCj4gPj4KPiA+PiBUaGlzIGlz IHJlYWxseSBhbm5veWluZyBpbiBhcmNwZ3UuIEltYWdpbmU6IEkgdHJ5IHRvIHVzZSBtcHYgdG8K PiA+PiBwbGF5IGEgdmlkZW8sIHRoZSBmdWxsIHNldCBvZiBtb2RlcyBmcm9tIEVESUQgd2VyZSBw cm9iZWQgc28gaWYgSQo+ID4+IGp1c3Qgc3RhcnQgbXB2IGl0IHdpbGwgcGljayB0aGUgbmF0aXZl IG1vZGUgb2YgdGhlIFRWIGluc3RlYWQgb2YKPiA+PiB0aGUgb25lIHRoYXQgaXMgc3VwcG9ydGVk LCBzbyBtcHYgd2lsbCBmYWlsIHRvIHBsYXkuIEkga25vdyB0aGUKPiA+PiB2YWx1ZSBvZiBjbG9j ayB3aGljaCB3aWxsIHdvcmsgKHNvIEkga25vdyB3aGF0IG1vZGUgc2hhbGwgYmUKPiA+PiB1c2Vk KSwgYnV0IGEgbm9ybWFsIHVzZXIgd2hpY2ggaXMgbm90IGF3YXJlIG9mIHRoZSBIVyB3aWxsIGhh dmUKPiA+PiB0byBjeWNsZSB0aHJvdWdoIHRoZSBsaXN0IG9mIG1vZGVzIGFuZCB0cnkgdGhlbSBh bGwgdW50aWwgaXQgaGl0cwo+ID4+IG9uZSB0aGF0IHdvcmtzLiBJdHMgcmVhbGx5IGJvcmluZy4K PiA+Pgo+ID4+IEZvciB0aGUgbW9kZXMgdGhhdCB1c2VyIHNwZWNpZmllcyBtYW51YWxseSB0aGVy ZSBpcyBub3RoaW5nIHdlCj4gPj4gY2FuIGRvLCBidXQgd2Ugc2hvdWxkIG5vdCB0cmljayB1c2Vy cyBpbnRvIHRoaW5raW5nIHRoYXQgYSBnaXZlbgo+ID4+IG1vZGUgaXMgc3VwcG9ydGVkIHdoZW4g aXQgd2lsbCBhbHdheXMgZmFpbCBhdCBjb21taXQuCj4gPiBZZXMsIHlvdSBhcmUgc3VwcG9zZWQg dG8gZmlsdGVyIHRoZXNlIG91dCBpbiAtPm1vZGVfdmFsaWQuIEJ1dCBteQo+ID4gc3RhbmNlIGlz IHRoYXQgb25seSBhZGRpbmcgYSBoYWxmLWJha2VkIHN1cHBvcnQgZm9yIGEgbmV3IGNhbGxiYWNr IHRvCj4gPiB0aGUgY29yZSBpc24ndCBnb2luZyB0byBtYWtlIGxpZmUgZWFzaWVyIGZvciBkcml2 ZXJzLCBpdCB3aWxsIGp1c3QgYWRkCj4gPiB0byB0aGUgY29uZnVzaW9uLiBUaGVyZSdzIGFscmVh ZHkgcGlsZXMgb2YgZG9jcyBmb3IgYm90aCBAbW9kZV92YWxpZAo+ID4gYW5kIEBtb2RlX2ZpeHVw IGhvb2tzIGV4cGxhaW5pbmcgdGhpcywgSSBkb24ndCB3YW50IHRvIG1ha2UgdGhlCj4gPiBkb2N1 bWVudGF0aW9uIGV2ZW4gbW9yZSBjb21wbGV4LiBBbmQgaGFsZi1iYWtlZCBjcnRjIGNoZWNraW5n IGlzCj4gPiBfbXVjaF8gZWFzaWVyIHRvIGltcGxlbWVudCBpbiB0aGUgZHJpdmVyIGRpcmVjdGx5 IChlLmcuIGk5MTUgY2hlY2tzCj4gPiBmb3IgY3J0YyBjb25zdHJhaW50cyBzaW5jZSBmb3JldmVy LCBhcyBkbyB0aGUgb3RoZXIgYmlnIHg4NiBkcml2ZXJzKS4KPiAKPiBCdXQgaTkxNSBjcnRjIGNo ZWNrcyBhcmUgZG9uZSBhZnRlciBoYW5kaW5nIHRoZSBtb2RlIHRvCj4gdXNlcnNwYWNlLCBhcmNw Z3UgYWxzbyBkb2VzIHRoYXQuIFdlIG11c3QgbGV0IHVzZXJzIHNwZWNpZnkKPiBtYW51YWxseSBh IG1vZGUgYnV0IHRoZXJlIGlzIG5vIHBvaW50IGluIHJldHVybmluZyBtb2RlcyBpbgo+IGdldF9j b25uZWN0b3Igd2hpY2ggd2lsbCBhbHdheXMgZmFpbCB0byBjb21taXQuIEkgZ2V0IHlvdXIgcG9p bnQKPiBhbmQgdGhpcyBjYW4gbGVhZCB0byBjb2RlIGR1cGxpY2F0aW9uLCBidXQgSSBkb24ndCB0 aGluayBpdCB3aWxsCj4gbGVhZCB0byBjb25mdXNpb24gYXMgbG9uZyBhcyBpdCBpcyB3ZWxsIGRv Y3VtZW50ZWQuIEFuZCBiZXNpZGVzLAo+IHRoZSBjYWxsYmFjayBpcyBjb21wbGV0ZWx5IG9wdGlv bmFsLgoKTG9vayBjbG9zZXIsIGUuZy4gaW50ZWxfZHBfbW9kZV92YWxpZCBjYWxscwppbnRlbF9k cF9kb3duc3RyZWFtX21heF9kb3RjbG9jayB3aGljaCBhbHNvIGxvb2tzIGF0CmRldl9wcml2LT5t YXhfZG90Y2xrY19mcmVxICh3aGljaCBpcyB0aGUgc291cmNlIGRvdGNsayBsaW1pdCwgeWVhaCBp dCdzIGEKbWlzbmFtZWQgZnVuY3Rpb24pLgoKQW5kIHRoZSBtYXggZG90Y2xrIGlzIHZlcnkgbXVj aCBhIGNydGMgbGltaXQsIG5vdCBhIHBvcnQgbGltaXQuIE5vdGUgdGhhdAphIGJ1bmNoIG9mIG90 aGVyIHBvcnRzIGhhdmUgcG9ydCBsaW1pdHMgd2hpY2ggYXJlIGd1YXJhbnRlZWQgdG8gYmUgbG93 ZXIKdGhhbiB0aGUgY3J0YyBsaW1pdCwgaGVuY2UgdGhlIGFic2VuY2Ugb2YgdGhlIGNoZWNrcy4K Cj4gPiBTbyBhbGwgdGFrZW4gdG9nZXRoZXIsIGlmIHdlIGFkZCBhIC0+bW9kZV92YWxpZCB0byBj cnRjcywgdGhlbiBpbW8gd2UKPiA+IHNob3VsZCBkbyBpdCByaWdodCBhbmQgYWN0dWFsbHkgbWFr ZSBsaWZlIGVhc2llciBmb3IgZHJpdmVycy4gQSBnb29kCj4gPiBwcm9vZiB3b3VsZCBiZSBpZiB5 b3VyIHBhdGNoIHdvdWxkIGFsbG93IHVzIHRvIGRyb3AgYSBsb3Qgb2YgdGhlCj4gPiBsZW5naHR5 IGxhbmd1YWdlIGZyb20gdGhlIEBtb2RlX3ZhbGlkIGhvb2tzLgo+IAo+IEkgY29tcGxldGVseSBh Z3JlZSB0aGF0IGl0IHNob3VsZCBtYWtlIGxpZmUgZWFzaWVyIGZvciBkcml2ZXJzCj4gYnV0IHVu Zm9ydHVuYXRlbHkgSSBkb24ndCByZWFsbHkgc2VlIGhvdyA6Lwo+IAo+IFNvLCBpbiBzdW1tYXJ5 Ogo+ICAgICBEaXNhZHZhbnRhZ2UgMTogQ29kZSBkdXBsaWNhdGlvbgo+ICAgICBEaXNhZHZhbnRh Z2UgMjogQ29uZnVzaW5nIGRvY3VtZW50YXRpb24gY2FuIGxlYWQgdG8gY2FsbGJhY2sKPiBtaXN1 c2UKPiAKPiAgICAgQWR2YW50YWdlIDE6IFVzZXIgd2lsbCBnZXQgbGlmZSBzaW1wbGVyCgpPaywg bGV0IG1lIHRyeSB0byBleHBsYWluIGEgYml0IGluIG1vcmUgZGV0YWlsIHdoYXQgSSB0aGluayB3 b3VsZCBiZSBhCnJlYWwgaW1wcm92ZW1lbnQ6Ci0gQWRkIC0+bW9kZV92YWxpZCBjaGVja3MgdG8g YWxsIHRoZSBwbGFjZXMgd2hlcmUgd2UgY3VycmVudGx5IGhhdmUKICAtPm1vZGVfZml4dXAuIFRo YXQnZCBiZSBjcnRjLCBlbmNvZGVyIGFuZCBicmlkZ2VzLgoKLSBQaW1wIHRoZSBwcm9iZSBoZWxw ZXIgY29kZSB0byBnbyB0aHJvdWdoIGFsbCBvZiB0aGUgY29tYmluYXRpb25zLAogIGZpbHRlcmlu ZyBvdXQgdGhvc2UgdGhhdCBhcmVuJ3QgYWxsb3dlZCBieSBwb3NzaWJsZV8qIG1hc2tzIChlc3Nl bnRpYWxseQogIGRvIHRoZSBzYW1lIHRoaW5nIHRoYXQgdXNlcnNwYWNlIGlzIHN1cHBvc2VkIHRv IGRvKS4KCi0gQ2FsbCBhbGwgdGhlc2UgLT5tb2RlX3ZhbGlkIGNoZWNrcyBmcm9tIHRoZSBhdG9t aWMgY2hlY2sgZnVuY3Rpb25zIChJCiAgdGhpbmsgd2UgY2FuIGZvcmdldCBhYm91dCB0aGUgbGVn YWN5IGNydGMgaGVscGVycyBmb3Igb2xkIGRyaXZlcnMpLiBEbwogIHRoaXMgYWxzbyBmb3IgY29u bmVjdG9yLT5tb2RlX3ZhbGlkLgoKVGFrZW4gYWxsIHRvZ2V0aGVyIHRoaXMgZ2l2ZXMgdXMgdGhl IGd1YXJhbnRlZSB0aGF0IHRoYXQgYW55IG1vZGUgd2hpY2gKZmFpbHMgdGhlIGNoZWNrIGluIHRo ZSBwcm9iZSBwYXRoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgcGFzcyBpbiBhbiBhdG9taWMKY29t bWl0LiBBbmQgc2luY2UgdGhlIHByb2JlZCBtb2RlIGxpc3QgaXMgd2hhdCBkZXZlbG9wZXJzIGdl bmVyYWxseSBzZWUsCnRoYXQncyBob3BlZnVsbHkgZW5vdWdoIHRvIG1ha2Ugc3VyZSB0aGUgZmls dGVyaW5nIGlzIGNvcnJlY3QuCgpJdCBpcyBhIGJpdCBtb3JlIGNvZGUgdGhhbiB3aGF0IHlvdSd2 ZSB0eXBlZCBoZXJlLCBidXQgbm90IGEgbG90OgotIHByb2JlIHBhdGggbmVlZHMgdG8gbG9vcCBv dmVyIGFsbCBDUlRDeEVuY29kZXIgY29tYm9zICh0aGUKICBlbmNvZGVyLT5icmlkZ2Ugcm91dGlu ZyBpcyBmaXhlZCkgaW5zdGVhZCBvdmVyIGp1c3QgQ1JUQ3MuCi0gQ2FsbCAtPm1vZGVfdmFsaWQg aW4gYWxsIHRoZSBwbGFjZXMgd2UgYWxyZWFkeSBjYWxsIC0+bW9kZV9maXh1cC4gWW91CiAgZG9u J3QgbmVlZCBhIG5ldyBsb29wIG92ZXIgYWxsIGNvbm5lY3RvcnMgdG8gYmUgYWJsZSB0byBjYWxs CiAgLT5tb2RlX3ZhbGlkIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGF0IGNvbm5lY3RvciBsb29w IGluCiAgY2hlY2tfbW9kZXNldHMoKS4KCldpdGggdGhhdCB3ZSBzaG91bGQgYWxzbyBiZSBhYmxl IHRvIHNpbXBsaWZ5IHRoZSBkb2N1bWVudGF0aW9uIGFuZCByaXAgb3V0CmFsbCB0aGUgd2Fybmlu Z3MgYWJvdXQgaG93IHRoaXMgaXMgdHJpY2t5LgotRGFuaWVsCi0tIApEYW5pZWwgVmV0dGVyClNv ZnR3YXJlIEVuZ2luZWVyLCBJbnRlbCBDb3Jwb3JhdGlvbgpodHRwOi8vYmxvZy5mZndsbC5jaApf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwg bWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0 cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK