From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from perceval.ideasonboard.com ([213.167.242.64]:53936 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728451AbeI1Vi5 (ORCPT ); Fri, 28 Sep 2018 17:38:57 -0400 From: Laurent Pinchart To: Ulrich Hecht Cc: Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Kieran Bingham Subject: Re: [PATCH v2 06/16] drm: rcar-du: Perform the initial CRTC setup from rcar_du_crtc_get() Date: Fri, 28 Sep 2018 18:14:56 +0300 Message-ID: <4226677.bA2aCy4LWU@avalon> In-Reply-To: <1356094207.327324.1537977314384@webmail.strato.com> References: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> <20180914091046.483-7-laurent.pinchart+renesas@ideasonboard.com> <1356094207.327324.1537977314384@webmail.strato.com> 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 Ulrich, Thank you for the review. Patches have however landed upstream already, so I can't add any Reviewed-by tag anymore. I will submit a follow-up patch, unless you would prefer doing it yourself. On Wednesday, 26 September 2018 18:55:14 EEST Ulrich Hecht wrote: > Thank you for your patch. > > > On September 14, 2018 at 11:10 AM Laurent Pinchart > > wrote: > > > > > > The rcar_du_crtc_get() function is always immediately followed by a call > > to rcar_du_crtc_setup(). Call the later from the former to simplify the > > code, and add a comment to explain how the get and put calls are > > balanced. > > > > Signed-off-by: Laurent Pinchart > > > > Tested-by: Jacopo Mondi > > --- > > > > drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 107 +++++++++++++++------------- > > 1 file changed, 56 insertions(+), 51 deletions(-) > > > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > > b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 6288b9ad9e24..c89751c26f9c > > 100644 > > --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > > +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > > @@ -66,39 +66,6 @@ static void rcar_du_crtc_clr_set(struct rcar_du_crtc > > *rcrtc, u32 reg,> > > rcar_du_write(rcdu, rcrtc->mmio_offset + reg, (value & ~clr) | set); > > > > } > > > > -static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) > > -{ > > - int ret; > > - > > - ret = clk_prepare_enable(rcrtc->clock); > > - if (ret < 0) > > - return ret; > > - > > - ret = clk_prepare_enable(rcrtc->extclock); > > - if (ret < 0) > > - goto error_clock; > > - > > - ret = rcar_du_group_get(rcrtc->group); > > - if (ret < 0) > > - goto error_group; > > - > > - return 0; > > - > > -error_group: > > - clk_disable_unprepare(rcrtc->extclock); > > -error_clock: > > - clk_disable_unprepare(rcrtc->clock); > > - return ret; > > -} > > - > > -static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) > > -{ > > - rcar_du_group_put(rcrtc->group); > > - > > - clk_disable_unprepare(rcrtc->extclock); > > - clk_disable_unprepare(rcrtc->clock); > > -} > > - > > > > /* > > ------------------------------------------------------------------------ > > -----> > > * Hardware Setup > > */ > > > > @@ -546,6 +513,51 @@ static void rcar_du_crtc_setup(struct rcar_du_crtc > > *rcrtc)> > > drm_crtc_vblank_on(&rcrtc->crtc); > > > > } > > > > +static int rcar_du_crtc_get(struct rcar_du_crtc *rcrtc) > > +{ > > + int ret; > > + > > + /* > > + * Guard against double-get, as the function is called from both the > > + * .atomic_enable() and .atomic_begin() handlers. > > + */ > > + if (rcrtc->initialized) > > + return 0; > > + > > + ret = clk_prepare_enable(rcrtc->clock); > > + if (ret < 0) > > + return ret; > > + > > + ret = clk_prepare_enable(rcrtc->extclock); > > + if (ret < 0) > > + goto error_clock; > > + > > + ret = rcar_du_group_get(rcrtc->group); > > + if (ret < 0) > > + goto error_group; > > + > > + rcar_du_crtc_setup(rcrtc); > > + rcrtc->initialized = true; > > + > > + return 0; > > + > > +error_group: > > + clk_disable_unprepare(rcrtc->extclock); > > +error_clock: > > + clk_disable_unprepare(rcrtc->clock); > > + return ret; > > +} > > + > > +static void rcar_du_crtc_put(struct rcar_du_crtc *rcrtc) > > +{ > > + rcar_du_group_put(rcrtc->group); > > + > > + clk_disable_unprepare(rcrtc->extclock); > > + clk_disable_unprepare(rcrtc->clock); > > + > > + rcrtc->initialized = false; > > +} > > + > > > > static void rcar_du_crtc_start(struct rcar_du_crtc *rcrtc) > > { > > > > bool interlaced; > > > > @@ -639,16 +651,7 @@ static void rcar_du_crtc_atomic_enable(struct > > drm_crtc *crtc,> > > { > > > > struct rcar_du_crtc *rcrtc = to_rcar_crtc(crtc); > > > > - /* > > - * If the CRTC has already been setup by the .atomic_begin() handler we > > - * can skip the setup stage. > > - */ > > - if (!rcrtc->initialized) { > > - rcar_du_crtc_get(rcrtc); > > - rcar_du_crtc_setup(rcrtc); > > - rcrtc->initialized = true; > > - } > > - > > + rcar_du_crtc_get(rcrtc); > > > > rcar_du_crtc_start(rcrtc); > > > > } > > > > @@ -667,7 +670,6 @@ static void rcar_du_crtc_atomic_disable(struct > > drm_crtc *crtc,> > > } > > spin_unlock_irq(&crtc->dev->event_lock); > > > > - rcrtc->initialized = false; > > > > rcrtc->outputs = 0; > > > > } > > > > @@ -680,14 +682,17 @@ static void rcar_du_crtc_atomic_begin(struct > > drm_crtc *crtc,> > > /* > > > > * If a mode set is in progress we can be called with the CRTC disabled. > > > > - * We then need to first setup the CRTC in order to configure planes. > > - * The .atomic_enable() handler will notice and skip the CRTC setup. > > + * We thus need to first get and setup the CRTC in order to configure > > + * planes. We must *not* put the CRTC in .atomic_flush(), as it must be > > + * kept awake until the .atomic_enable() call that will follow. The get > > + * operation in .atomic_enable() will in that case be a no-op, and the > > + * CRTC will be put later in .atomic_disable(). > > + * > > + * If a mode set is not in progress the CRTC is enabled, and the > > + * following get call will be a no-op. There is thus no need to belance > > *balance > > > + * it in .atomic_flush() either. > > > > */ > > > > - if (!rcrtc->initialized) { > > - rcar_du_crtc_get(rcrtc); > > - rcar_du_crtc_setup(rcrtc); > > - rcrtc->initialized = true; > > - } > > + rcar_du_crtc_get(rcrtc); > > > > if (rcar_du_has(rcrtc->group->dev, RCAR_DU_FEATURE_VSP1_SOURCE)) > > > > rcar_du_vsp_atomic_begin(rcrtc); > > With typo fixed: > Reviewed-by: Ulrich Hecht -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 06/16] drm: rcar-du: Perform the initial CRTC setup from rcar_du_crtc_get() Date: Fri, 28 Sep 2018 18:14:56 +0300 Message-ID: <4226677.bA2aCy4LWU@avalon> References: <20180914091046.483-1-laurent.pinchart+renesas@ideasonboard.com> <20180914091046.483-7-laurent.pinchart+renesas@ideasonboard.com> <1356094207.327324.1537977314384@webmail.strato.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id A85F36E1C7 for ; Fri, 28 Sep 2018 15:14:43 +0000 (UTC) In-Reply-To: <1356094207.327324.1537977314384@webmail.strato.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Ulrich Hecht Cc: linux-renesas-soc@vger.kernel.org, Laurent Pinchart , Kieran Bingham , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org SGkgVWxyaWNoLAoKVGhhbmsgeW91IGZvciB0aGUgcmV2aWV3LiBQYXRjaGVzIGhhdmUgaG93ZXZl ciBsYW5kZWQgdXBzdHJlYW0gYWxyZWFkeSwgc28gSSAKY2FuJ3QgYWRkIGFueSBSZXZpZXdlZC1i eSB0YWcgYW55bW9yZS4gSSB3aWxsIHN1Ym1pdCBhIGZvbGxvdy11cCBwYXRjaCwgdW5sZXNzIAp5 b3Ugd291bGQgcHJlZmVyIGRvaW5nIGl0IHlvdXJzZWxmLgoKT24gV2VkbmVzZGF5LCAyNiBTZXB0 ZW1iZXIgMjAxOCAxODo1NToxNCBFRVNUIFVscmljaCBIZWNodCB3cm90ZToKPiBUaGFuayB5b3Ug Zm9yIHlvdXIgcGF0Y2guCj4gCj4gPiBPbiBTZXB0ZW1iZXIgMTQsIDIwMTggYXQgMTE6MTAgQU0g TGF1cmVudCBQaW5jaGFydAo+ID4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9h cmQuY29tPiB3cm90ZToKPiA+IAo+ID4gCj4gPiBUaGUgcmNhcl9kdV9jcnRjX2dldCgpIGZ1bmN0 aW9uIGlzIGFsd2F5cyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhIGNhbGwKPiA+IHRvIHJjYXJf ZHVfY3J0Y19zZXR1cCgpLiBDYWxsIHRoZSBsYXRlciBmcm9tIHRoZSBmb3JtZXIgdG8gc2ltcGxp ZnkgdGhlCj4gPiBjb2RlLCBhbmQgYWRkIGEgY29tbWVudCB0byBleHBsYWluIGhvdyB0aGUgZ2V0 IGFuZCBwdXQgY2FsbHMgYXJlCj4gPiBiYWxhbmNlZC4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTog TGF1cmVudCBQaW5jaGFydAo+ID4gPGxhdXJlbnQucGluY2hhcnQrcmVuZXNhc0BpZGVhc29uYm9h cmQuY29tPgo+ID4gVGVzdGVkLWJ5OiBKYWNvcG8gTW9uZGkgPGphY29wbytyZW5lc2FzQGptb25k aS5vcmc+Cj4gPiAtLS0KPiA+IAo+ID4gIGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVf Y3J0Yy5jIHwgMTA3ICsrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiA+ICAxIGZpbGUgY2hh bmdlZCwgNTYgaW5zZXJ0aW9ucygrKSwgNTEgZGVsZXRpb25zKC0pCj4gPiAKPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYwo+ID4gYi9kcml2ZXJz L2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuYyBpbmRleCA2Mjg4YjlhZDllMjQuLmM4OTc1 MWMyNmY5Ywo+ID4gMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2Fy X2R1X2NydGMuYwo+ID4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRj LmMKPiA+IEBAIC02NiwzOSArNjYsNiBAQCBzdGF0aWMgdm9pZCByY2FyX2R1X2NydGNfY2xyX3Nl dChzdHJ1Y3QgcmNhcl9kdV9jcnRjCj4gPiAqcmNydGMsIHUzMiByZWcsPiAKPiA+ICAJcmNhcl9k dV93cml0ZShyY2R1LCByY3J0Yy0+bW1pb19vZmZzZXQgKyByZWcsICh2YWx1ZSAmIH5jbHIpIHwg c2V0KTsKPiA+ICAKPiA+ICB9Cj4gPiAKPiA+IC1zdGF0aWMgaW50IHJjYXJfZHVfY3J0Y19nZXQo c3RydWN0IHJjYXJfZHVfY3J0YyAqcmNydGMpCj4gPiAtewo+ID4gLQlpbnQgcmV0Owo+ID4gLQo+ ID4gLQlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocmNydGMtPmNsb2NrKTsKPiA+IC0JaWYgKHJl dCA8IDApCj4gPiAtCQlyZXR1cm4gcmV0Owo+ID4gLQo+ID4gLQlyZXQgPSBjbGtfcHJlcGFyZV9l bmFibGUocmNydGMtPmV4dGNsb2NrKTsKPiA+IC0JaWYgKHJldCA8IDApCj4gPiAtCQlnb3RvIGVy cm9yX2Nsb2NrOwo+ID4gLQo+ID4gLQlyZXQgPSByY2FyX2R1X2dyb3VwX2dldChyY3J0Yy0+Z3Jv dXApOwo+ID4gLQlpZiAocmV0IDwgMCkKPiA+IC0JCWdvdG8gZXJyb3JfZ3JvdXA7Cj4gPiAtCj4g PiAtCXJldHVybiAwOwo+ID4gLQo+ID4gLWVycm9yX2dyb3VwOgo+ID4gLQljbGtfZGlzYWJsZV91 bnByZXBhcmUocmNydGMtPmV4dGNsb2NrKTsKPiA+IC1lcnJvcl9jbG9jazoKPiA+IC0JY2xrX2Rp c2FibGVfdW5wcmVwYXJlKHJjcnRjLT5jbG9jayk7Cj4gPiAtCXJldHVybiByZXQ7Cj4gPiAtfQo+ ID4gLQo+ID4gLXN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19wdXQoc3RydWN0IHJjYXJfZHVfY3J0 YyAqcmNydGMpCj4gPiAtewo+ID4gLQlyY2FyX2R1X2dyb3VwX3B1dChyY3J0Yy0+Z3JvdXApOwo+ ID4gLQo+ID4gLQljbGtfZGlzYWJsZV91bnByZXBhcmUocmNydGMtPmV4dGNsb2NrKTsKPiA+IC0J Y2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJjcnRjLT5jbG9jayk7Cj4gPiAtfQo+ID4gLQo+ID4gCj4g PiAgLyoKPiA+ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ICAtLS0tLT4gIAo+ID4gICAqIEhhcmR3YXJl IFNldHVwCj4gPiAgICovCj4gPiAKPiA+IEBAIC01NDYsNiArNTEzLDUxIEBAIHN0YXRpYyB2b2lk IHJjYXJfZHVfY3J0Y19zZXR1cChzdHJ1Y3QgcmNhcl9kdV9jcnRjCj4gPiAqcmNydGMpPiAKPiA+ ICAJZHJtX2NydGNfdmJsYW5rX29uKCZyY3J0Yy0+Y3J0Yyk7Cj4gPiAgCj4gPiAgfQo+ID4gCj4g PiArc3RhdGljIGludCByY2FyX2R1X2NydGNfZ2V0KHN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRj KQo+ID4gK3sKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJLyoKPiA+ICsJICogR3VhcmQgYWdh aW5zdCBkb3VibGUtZ2V0LCBhcyB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gYm90aCB0aGUK PiA+ICsJICogLmF0b21pY19lbmFibGUoKSBhbmQgLmF0b21pY19iZWdpbigpIGhhbmRsZXJzLgo+ ID4gKwkgKi8KPiA+ICsJaWYgKHJjcnRjLT5pbml0aWFsaXplZCkKPiA+ICsJCXJldHVybiAwOwo+ ID4gKwo+ID4gKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUocmNydGMtPmNsb2NrKTsKPiA+ICsJ aWYgKHJldCA8IDApCj4gPiArCQlyZXR1cm4gcmV0Owo+ID4gKwo+ID4gKwlyZXQgPSBjbGtfcHJl cGFyZV9lbmFibGUocmNydGMtPmV4dGNsb2NrKTsKPiA+ICsJaWYgKHJldCA8IDApCj4gPiArCQln b3RvIGVycm9yX2Nsb2NrOwo+ID4gKwo+ID4gKwlyZXQgPSByY2FyX2R1X2dyb3VwX2dldChyY3J0 Yy0+Z3JvdXApOwo+ID4gKwlpZiAocmV0IDwgMCkKPiA+ICsJCWdvdG8gZXJyb3JfZ3JvdXA7Cj4g PiArCj4gPiArCXJjYXJfZHVfY3J0Y19zZXR1cChyY3J0Yyk7Cj4gPiArCXJjcnRjLT5pbml0aWFs aXplZCA9IHRydWU7Cj4gPiArCj4gPiArCXJldHVybiAwOwo+ID4gKwo+ID4gK2Vycm9yX2dyb3Vw Ogo+ID4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmNydGMtPmV4dGNsb2NrKTsKPiA+ICtlcnJv cl9jbG9jazoKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJjcnRjLT5jbG9jayk7Cj4gPiAr CXJldHVybiByZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19w dXQoc3RydWN0IHJjYXJfZHVfY3J0YyAqcmNydGMpCj4gPiArewo+ID4gKwlyY2FyX2R1X2dyb3Vw X3B1dChyY3J0Yy0+Z3JvdXApOwo+ID4gKwo+ID4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUocmNy dGMtPmV4dGNsb2NrKTsKPiA+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHJjcnRjLT5jbG9jayk7 Cj4gPiArCj4gPiArCXJjcnRjLT5pbml0aWFsaXplZCA9IGZhbHNlOwo+ID4gK30KPiA+ICsKPiA+ IAo+ID4gIHN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19zdGFydChzdHJ1Y3QgcmNhcl9kdV9jcnRj ICpyY3J0YykKPiA+ICB7Cj4gPiAgCj4gPiAgCWJvb2wgaW50ZXJsYWNlZDsKPiA+IAo+ID4gQEAg LTYzOSwxNiArNjUxLDcgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV9jcnRjX2F0b21pY19lbmFibGUo c3RydWN0Cj4gPiBkcm1fY3J0YyAqY3J0Yyw+IAo+ID4gIHsKPiA+ICAKPiA+ICAJc3RydWN0IHJj YXJfZHVfY3J0YyAqcmNydGMgPSB0b19yY2FyX2NydGMoY3J0Yyk7Cj4gPiAKPiA+IC0JLyoKPiA+ IC0JICogSWYgdGhlIENSVEMgaGFzIGFscmVhZHkgYmVlbiBzZXR1cCBieSB0aGUgLmF0b21pY19i ZWdpbigpIGhhbmRsZXIgd2UKPiA+IC0JICogY2FuIHNraXAgdGhlIHNldHVwIHN0YWdlLgo+ID4g LQkgKi8KPiA+IC0JaWYgKCFyY3J0Yy0+aW5pdGlhbGl6ZWQpIHsKPiA+IC0JCXJjYXJfZHVfY3J0 Y19nZXQocmNydGMpOwo+ID4gLQkJcmNhcl9kdV9jcnRjX3NldHVwKHJjcnRjKTsKPiA+IC0JCXJj cnRjLT5pbml0aWFsaXplZCA9IHRydWU7Cj4gPiAtCX0KPiA+IC0KPiA+ICsJcmNhcl9kdV9jcnRj X2dldChyY3J0Yyk7Cj4gPiAKPiA+ICAJcmNhcl9kdV9jcnRjX3N0YXJ0KHJjcnRjKTsKPiA+ICAK PiA+ICB9Cj4gPiAKPiA+IEBAIC02NjcsNyArNjcwLDYgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV9j cnRjX2F0b21pY19kaXNhYmxlKHN0cnVjdAo+ID4gZHJtX2NydGMgKmNydGMsPiAKPiA+ICAJfQo+ ID4gIAlzcGluX3VubG9ja19pcnEoJmNydGMtPmRldi0+ZXZlbnRfbG9jayk7Cj4gPiAKPiA+IC0J cmNydGMtPmluaXRpYWxpemVkID0gZmFsc2U7Cj4gPiAKPiA+ICAJcmNydGMtPm91dHB1dHMgPSAw Owo+ID4gIAo+ID4gIH0KPiA+IAo+ID4gQEAgLTY4MCwxNCArNjgyLDE3IEBAIHN0YXRpYyB2b2lk IHJjYXJfZHVfY3J0Y19hdG9taWNfYmVnaW4oc3RydWN0Cj4gPiBkcm1fY3J0YyAqY3J0Yyw+IAo+ ID4gIAkvKgo+ID4gIAkKPiA+ICAJICogSWYgYSBtb2RlIHNldCBpcyBpbiBwcm9ncmVzcyB3ZSBj YW4gYmUgY2FsbGVkIHdpdGggdGhlIENSVEMgCmRpc2FibGVkLgo+ID4gCj4gPiAtCSAqIFdlIHRo ZW4gbmVlZCB0byBmaXJzdCBzZXR1cCB0aGUgQ1JUQyBpbiBvcmRlciB0byBjb25maWd1cmUgcGxh bmVzLgo+ID4gLQkgKiBUaGUgLmF0b21pY19lbmFibGUoKSBoYW5kbGVyIHdpbGwgbm90aWNlIGFu ZCBza2lwIHRoZSBDUlRDIHNldHVwLgo+ID4gKwkgKiBXZSB0aHVzIG5lZWQgdG8gZmlyc3QgZ2V0 IGFuZCBzZXR1cCB0aGUgQ1JUQyBpbiBvcmRlciB0byBjb25maWd1cmUKPiA+ICsJICogcGxhbmVz LiBXZSBtdXN0ICpub3QqIHB1dCB0aGUgQ1JUQyBpbiAuYXRvbWljX2ZsdXNoKCksIGFzIGl0IG11 c3QgYmUKPiA+ICsJICoga2VwdCBhd2FrZSB1bnRpbCB0aGUgLmF0b21pY19lbmFibGUoKSBjYWxs IHRoYXQgd2lsbCBmb2xsb3cuIFRoZSBnZXQKPiA+ICsJICogb3BlcmF0aW9uIGluIC5hdG9taWNf ZW5hYmxlKCkgd2lsbCBpbiB0aGF0IGNhc2UgYmUgYSBuby1vcCwgYW5kIHRoZQo+ID4gKwkgKiBD UlRDIHdpbGwgYmUgcHV0IGxhdGVyIGluIC5hdG9taWNfZGlzYWJsZSgpLgo+ID4gKwkgKgo+ID4g KwkgKiBJZiBhIG1vZGUgc2V0IGlzIG5vdCBpbiBwcm9ncmVzcyB0aGUgQ1JUQyBpcyBlbmFibGVk LCBhbmQgdGhlCj4gPiArCSAqIGZvbGxvd2luZyBnZXQgY2FsbCB3aWxsIGJlIGEgbm8tb3AuIFRo ZXJlIGlzIHRodXMgbm8gbmVlZCB0byBiZWxhbmNlCj4gCj4gKmJhbGFuY2UKPiAKPiA+ICsJICog aXQgaW4gLmF0b21pY19mbHVzaCgpIGVpdGhlci4KPiA+IAo+ID4gIAkgKi8KPiA+IAo+ID4gLQlp ZiAoIXJjcnRjLT5pbml0aWFsaXplZCkgewo+ID4gLQkJcmNhcl9kdV9jcnRjX2dldChyY3J0Yyk7 Cj4gPiAtCQlyY2FyX2R1X2NydGNfc2V0dXAocmNydGMpOwo+ID4gLQkJcmNydGMtPmluaXRpYWxp emVkID0gdHJ1ZTsKPiA+IC0JfQo+ID4gKwlyY2FyX2R1X2NydGNfZ2V0KHJjcnRjKTsKPiA+IAo+ ID4gIAlpZiAocmNhcl9kdV9oYXMocmNydGMtPmdyb3VwLT5kZXYsIFJDQVJfRFVfRkVBVFVSRV9W U1AxX1NPVVJDRSkpCj4gPiAgCQo+ID4gIAkJcmNhcl9kdV92c3BfYXRvbWljX2JlZ2luKHJjcnRj KTsKPiAKPiBXaXRoIHR5cG8gZml4ZWQ6Cj4gUmV2aWV3ZWQtYnk6IFVscmljaCBIZWNodCA8dWxp K3JlbmVzYXNAZnBvbmQuZXU+CgotLSAKUmVnYXJkcywKCkxhdXJlbnQgUGluY2hhcnQKCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1h aWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==