From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com ([134.134.136.20]:31315 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S936207AbdKPREa (ORCPT ); Thu, 16 Nov 2017 12:04:30 -0500 Date: Thu, 16 Nov 2017 19:04:26 +0200 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= To: Laurent Pinchart Cc: dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Kieran Bingham Subject: Re: [PATCH v2 2/2] drm: rcar-du: Clip planes to screen boundaries Message-ID: <20171116170426.GA10981@intel.com> References: <20171113084700.12076-1-laurent.pinchart+renesas@ideasonboard.com> <20171113084700.12076-3-laurent.pinchart+renesas@ideasonboard.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20171113084700.12076-3-laurent.pinchart+renesas@ideasonboard.com> Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: On Mon, Nov 13, 2017 at 10:47:00AM +0200, Laurent Pinchart wrote: > Unlike the KMS API, the hardware doesn't support planes exceeding the > screen boundaries or planes being located fully off-screen. We need to > clip plane coordinates to support the use case. > > Fortunately the DRM core offers the drm_plane_helper_check_state() > helper that valides the scaling factor and clips the plane coordinates. > Use it to implement the plane atomic check and use the clipped source > and destination rectangles from the plane state instead of the unclipped > source and CRTC coordinates to configure the device. > > Signed-off-by: Laurent Pinchart > --- > drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 3 ++- > drivers/gpu/drm/rcar-du/rcar_du_plane.c | 37 ++++++++++++++++++++++++++------- > drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 10 ++++++--- > 3 files changed, 39 insertions(+), 11 deletions(-) > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > index b492063a6e1f..5685d5af6998 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > @@ -319,7 +319,8 @@ static void rcar_du_crtc_update_planes(struct rcar_du_crtc *rcrtc) > struct rcar_du_plane *plane = &rcrtc->group->planes[i]; > unsigned int j; > > - if (plane->plane.state->crtc != &rcrtc->crtc) > + if (plane->plane.state->crtc != &rcrtc->crtc || > + !plane->plane.state->visible) > continue; > > /* Insert the plane in the sorted planes array. */ > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c > index 4f076c364f25..9cf02b44902d 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c > @@ -570,16 +570,39 @@ int __rcar_du_plane_atomic_check(struct drm_plane *plane, > const struct rcar_du_format_info **format) > { > struct drm_device *dev = plane->dev; > + struct drm_crtc_state *crtc_state; > + struct drm_rect clip; > + int ret; > > - if (!state->fb || !state->crtc) { > + if (!state->crtc) { > + /* > + * The visible field is not reset by the DRM core but only > + * updated by drm_plane_helper_check_state(), set it manually. > + */ > + state->visible = false; > *format = NULL; > return 0; > - } > + }; spurious ; > > - if (state->src_w >> 16 != state->crtc_w || > - state->src_h >> 16 != state->crtc_h) { > - dev_dbg(dev->dev, "%s: scaling not supported\n", __func__); > - return -EINVAL; > + crtc_state = drm_atomic_get_crtc_state(state->state, state->crtc); > + if (IS_ERR(crtc_state)) > + return PTR_ERR(crtc_state); > + > + clip.x1 = 0; > + clip.y1 = 0; > + clip.x2 = crtc_state->adjusted_mode.hdisplay; > + clip.y2 = crtc_state->adjusted_mode.vdisplay; crtc_state->mode would be more correct. I messed that up too in my recent vmwgfx fix [1]. But this should probably work just as well if you don't have a crtc scaler in your pipeline. Also you may want to leave the clip empty when !crtc_state->enable. That way you'll be guaranteed to get visible==false. The helper is currently a bit broken wrt. the crtc->enable vs. crtc_state->enable. I've fixed that in [1] as well but those patches haven't been pushed yet. After getting that stuff in, I'm going to attempt moving this clipping stuff entirely into the helper to avoid these kinds of mistakes in the future. [1] https://patchwork.freedesktop.org/series/33001/ > + > + ret = drm_plane_helper_check_state(state, &clip, > + DRM_PLANE_HELPER_NO_SCALING, > + DRM_PLANE_HELPER_NO_SCALING, > + true, true); > + if (ret < 0) > + return ret; > + > + if (!state->visible) { > + *format = NULL; > + return 0; > } > > *format = rcar_du_format_info(state->fb->format->format); > @@ -607,7 +630,7 @@ static void rcar_du_plane_atomic_update(struct drm_plane *plane, > struct rcar_du_plane_state *old_rstate; > struct rcar_du_plane_state *new_rstate; > > - if (!plane->state->crtc) > + if (!plane->state->visible) > return; > > rcar_du_plane_setup(rplane); > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > index dd66dcb8da23..6d1a82ee50ed 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > @@ -212,7 +212,11 @@ static int rcar_du_vsp_plane_prepare_fb(struct drm_plane *plane, > unsigned int i; > int ret; > > - if (!state->fb) > + /* > + * There's no need to prepare (and unprepare) the framebuffer when the > + * plane is not visible, as it will not be displayed. > + */ > + if (!state->visible) > return 0; > > for (i = 0; i < rstate->format->planes; ++i) { > @@ -253,7 +257,7 @@ static void rcar_du_vsp_plane_cleanup_fb(struct drm_plane *plane, > struct rcar_du_vsp *vsp = to_rcar_vsp_plane(plane)->vsp; > unsigned int i; > > - if (!state->fb) > + if (!state->visible) > return; > > for (i = 0; i < rstate->format->planes; ++i) { > @@ -278,7 +282,7 @@ static void rcar_du_vsp_plane_atomic_update(struct drm_plane *plane, > struct rcar_du_vsp_plane *rplane = to_rcar_vsp_plane(plane); > struct rcar_du_crtc *crtc = to_rcar_crtc(old_state->crtc); > > - if (plane->state->crtc) > + if (plane->state->visible) > rcar_du_vsp_plane_setup(rplane); > else > vsp1_du_atomic_update(rplane->vsp->vsp, crtc->vsp_pipe, > -- > Regards, > > Laurent Pinchart > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Ville Syrj�l� Intel OTC From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH v2 2/2] drm: rcar-du: Clip planes to screen boundaries Date: Thu, 16 Nov 2017 19:04:26 +0200 Message-ID: <20171116170426.GA10981@intel.com> References: <20171113084700.12076-1-laurent.pinchart+renesas@ideasonboard.com> <20171113084700.12076-3-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by gabe.freedesktop.org (Postfix) with ESMTPS id C560D6E905 for ; Thu, 16 Nov 2017 17:04:30 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20171113084700.12076-3-laurent.pinchart+renesas@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart Cc: linux-renesas-soc@vger.kernel.org, Kieran Bingham , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org T24gTW9uLCBOb3YgMTMsIDIwMTcgYXQgMTA6NDc6MDBBTSArMDIwMCwgTGF1cmVudCBQaW5jaGFy dCB3cm90ZToKPiBVbmxpa2UgdGhlIEtNUyBBUEksIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBv cnQgcGxhbmVzIGV4Y2VlZGluZyB0aGUKPiBzY3JlZW4gYm91bmRhcmllcyBvciBwbGFuZXMgYmVp bmcgbG9jYXRlZCBmdWxseSBvZmYtc2NyZWVuLiBXZSBuZWVkIHRvCj4gY2xpcCBwbGFuZSBjb29y ZGluYXRlcyB0byBzdXBwb3J0IHRoZSB1c2UgY2FzZS4KPiAKPiBGb3J0dW5hdGVseSB0aGUgRFJN IGNvcmUgb2ZmZXJzIHRoZSBkcm1fcGxhbmVfaGVscGVyX2NoZWNrX3N0YXRlKCkKPiBoZWxwZXIg dGhhdCB2YWxpZGVzIHRoZSBzY2FsaW5nIGZhY3RvciBhbmQgY2xpcHMgdGhlIHBsYW5lIGNvb3Jk aW5hdGVzLgo+IFVzZSBpdCB0byBpbXBsZW1lbnQgdGhlIHBsYW5lIGF0b21pYyBjaGVjayBhbmQg dXNlIHRoZSBjbGlwcGVkIHNvdXJjZQo+IGFuZCBkZXN0aW5hdGlvbiByZWN0YW5nbGVzIGZyb20g dGhlIHBsYW5lIHN0YXRlIGluc3RlYWQgb2YgdGhlIHVuY2xpcHBlZAo+IHNvdXJjZSBhbmQgQ1JU QyBjb29yZGluYXRlcyB0byBjb25maWd1cmUgdGhlIGRldmljZS4KPiAKPiBTaWduZWQtb2ZmLWJ5 OiBMYXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0K3JlbmVzYXNAaWRlYXNvbmJvYXJk LmNvbT4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgIHwg IDMgKystCj4gIGRyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfcGxhbmUuYyB8IDM3ICsr KysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vcmNhci1k dS9yY2FyX2R1X3ZzcC5jICAgfCAxMCArKysrKystLS0KPiAgMyBmaWxlcyBjaGFuZ2VkLCAzOSBp bnNlcnRpb25zKCspLCAxMSBkZWxldGlvbnMoLSkKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9y Y2FyX2R1X2NydGMuYwo+IGluZGV4IGI0OTIwNjNhNmUxZi4uNTY4NWQ1YWY2OTk4IDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5jCj4gKysrIGIvZHJp dmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMKPiBAQCAtMzE5LDcgKzMxOSw4IEBA IHN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y191cGRhdGVfcGxhbmVzKHN0cnVjdCByY2FyX2R1X2Ny dGMgKnJjcnRjKQo+ICAJCXN0cnVjdCByY2FyX2R1X3BsYW5lICpwbGFuZSA9ICZyY3J0Yy0+Z3Jv dXAtPnBsYW5lc1tpXTsKPiAgCQl1bnNpZ25lZCBpbnQgajsKPiAgCj4gLQkJaWYgKHBsYW5lLT5w bGFuZS5zdGF0ZS0+Y3J0YyAhPSAmcmNydGMtPmNydGMpCj4gKwkJaWYgKHBsYW5lLT5wbGFuZS5z dGF0ZS0+Y3J0YyAhPSAmcmNydGMtPmNydGMgfHwKPiArCQkgICAgIXBsYW5lLT5wbGFuZS5zdGF0 ZS0+dmlzaWJsZSkKPiAgCQkJY29udGludWU7Cj4gIAo+ICAJCS8qIEluc2VydCB0aGUgcGxhbmUg aW4gdGhlIHNvcnRlZCBwbGFuZXMgYXJyYXkuICovCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9yY2FyLWR1L3JjYXJfZHVfcGxhbmUuYyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3Jj YXJfZHVfcGxhbmUuYwo+IGluZGV4IDRmMDc2YzM2NGYyNS4uOWNmMDJiNDQ5MDJkIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfcGxhbmUuYwo+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfcGxhbmUuYwo+IEBAIC01NzAsMTYgKzU3MCwz OSBAQCBpbnQgX19yY2FyX2R1X3BsYW5lX2F0b21pY19jaGVjayhzdHJ1Y3QgZHJtX3BsYW5lICpw bGFuZSwKPiAgCQkJCSBjb25zdCBzdHJ1Y3QgcmNhcl9kdV9mb3JtYXRfaW5mbyAqKmZvcm1hdCkK PiAgewo+ICAJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHBsYW5lLT5kZXY7Cj4gKwlzdHJ1Y3Qg ZHJtX2NydGNfc3RhdGUgKmNydGNfc3RhdGU7Cj4gKwlzdHJ1Y3QgZHJtX3JlY3QgY2xpcDsKPiAr CWludCByZXQ7Cj4gIAo+IC0JaWYgKCFzdGF0ZS0+ZmIgfHwgIXN0YXRlLT5jcnRjKSB7Cj4gKwlp ZiAoIXN0YXRlLT5jcnRjKSB7Cj4gKwkJLyoKPiArCQkgKiBUaGUgdmlzaWJsZSBmaWVsZCBpcyBu b3QgcmVzZXQgYnkgdGhlIERSTSBjb3JlIGJ1dCBvbmx5Cj4gKwkJICogdXBkYXRlZCBieSBkcm1f cGxhbmVfaGVscGVyX2NoZWNrX3N0YXRlKCksIHNldCBpdCBtYW51YWxseS4KPiArCQkgKi8KPiAr CQlzdGF0ZS0+dmlzaWJsZSA9IGZhbHNlOwo+ICAJCSpmb3JtYXQgPSBOVUxMOwo+ICAJCXJldHVy biAwOwo+IC0JfQo+ICsJfTsKCnNwdXJpb3VzIDsKCj4gIAo+IC0JaWYgKHN0YXRlLT5zcmNfdyA+ PiAxNiAhPSBzdGF0ZS0+Y3J0Y193IHx8Cj4gLQkgICAgc3RhdGUtPnNyY19oID4+IDE2ICE9IHN0 YXRlLT5jcnRjX2gpIHsKPiAtCQlkZXZfZGJnKGRldi0+ZGV2LCAiJXM6IHNjYWxpbmcgbm90IHN1 cHBvcnRlZFxuIiwgX19mdW5jX18pOwo+IC0JCXJldHVybiAtRUlOVkFMOwo+ICsJY3J0Y19zdGF0 ZSA9IGRybV9hdG9taWNfZ2V0X2NydGNfc3RhdGUoc3RhdGUtPnN0YXRlLCBzdGF0ZS0+Y3J0Yyk7 Cj4gKwlpZiAoSVNfRVJSKGNydGNfc3RhdGUpKQo+ICsJCXJldHVybiBQVFJfRVJSKGNydGNfc3Rh dGUpOwo+ICsKPiArCWNsaXAueDEgPSAwOwo+ICsJY2xpcC55MSA9IDA7Cj4gKwljbGlwLngyID0g Y3J0Y19zdGF0ZS0+YWRqdXN0ZWRfbW9kZS5oZGlzcGxheTsKPiArCWNsaXAueTIgPSBjcnRjX3N0 YXRlLT5hZGp1c3RlZF9tb2RlLnZkaXNwbGF5OwoKY3J0Y19zdGF0ZS0+bW9kZSB3b3VsZCBiZSBt b3JlIGNvcnJlY3QuIEkgbWVzc2VkIHRoYXQgdXAgdG9vIGluIG15CnJlY2VudCB2bXdnZnggZml4 IFsxXS4gQnV0IHRoaXMgc2hvdWxkIHByb2JhYmx5IHdvcmsganVzdCBhcyB3ZWxsCmlmIHlvdSBk b24ndCBoYXZlIGEgY3J0YyBzY2FsZXIgaW4geW91ciBwaXBlbGluZS4KCkFsc28geW91IG1heSB3 YW50IHRvIGxlYXZlIHRoZSBjbGlwIGVtcHR5IHdoZW4gIWNydGNfc3RhdGUtPmVuYWJsZS4KVGhh dCB3YXkgeW91J2xsIGJlIGd1YXJhbnRlZWQgdG8gZ2V0IHZpc2libGU9PWZhbHNlLiBUaGUgaGVs cGVyIGlzCmN1cnJlbnRseSBhIGJpdCBicm9rZW4gd3J0LiB0aGUgY3J0Yy0+ZW5hYmxlIHZzLiBj cnRjX3N0YXRlLT5lbmFibGUuCkkndmUgZml4ZWQgdGhhdCBpbiBbMV0gYXMgd2VsbCBidXQgdGhv c2UgcGF0Y2hlcyBoYXZlbid0IGJlZW4gcHVzaGVkCnlldC4KCkFmdGVyIGdldHRpbmcgdGhhdCBz dHVmZiBpbiwgSSdtIGdvaW5nIHRvIGF0dGVtcHQgbW92aW5nIHRoaXMKY2xpcHBpbmcgc3R1ZmYg ZW50aXJlbHkgaW50byB0aGUgaGVscGVyIHRvIGF2b2lkIHRoZXNlIGtpbmRzIG9mCm1pc3Rha2Vz IGluIHRoZSBmdXR1cmUuCgpbMV0gaHR0cHM6Ly9wYXRjaHdvcmsuZnJlZWRlc2t0b3Aub3JnL3Nl cmllcy8zMzAwMS8KCj4gKwo+ICsJcmV0ID0gZHJtX3BsYW5lX2hlbHBlcl9jaGVja19zdGF0ZShz dGF0ZSwgJmNsaXAsCj4gKwkJCQkJICAgRFJNX1BMQU5FX0hFTFBFUl9OT19TQ0FMSU5HLAo+ICsJ CQkJCSAgIERSTV9QTEFORV9IRUxQRVJfTk9fU0NBTElORywKPiArCQkJCQkgICB0cnVlLCB0cnVl KTsKPiArCWlmIChyZXQgPCAwKQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJaWYgKCFzdGF0ZS0+ dmlzaWJsZSkgewo+ICsJCSpmb3JtYXQgPSBOVUxMOwo+ICsJCXJldHVybiAwOwo+ICAJfQo+ICAK PiAgCSpmb3JtYXQgPSByY2FyX2R1X2Zvcm1hdF9pbmZvKHN0YXRlLT5mYi0+Zm9ybWF0LT5mb3Jt YXQpOwo+IEBAIC02MDcsNyArNjMwLDcgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV9wbGFuZV9hdG9t aWNfdXBkYXRlKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+ICAJc3RydWN0IHJjYXJfZHVfcGxh bmVfc3RhdGUgKm9sZF9yc3RhdGU7Cj4gIAlzdHJ1Y3QgcmNhcl9kdV9wbGFuZV9zdGF0ZSAqbmV3 X3JzdGF0ZTsKPiAgCj4gLQlpZiAoIXBsYW5lLT5zdGF0ZS0+Y3J0YykKPiArCWlmICghcGxhbmUt PnN0YXRlLT52aXNpYmxlKQo+ICAJCXJldHVybjsKPiAgCj4gIAlyY2FyX2R1X3BsYW5lX3NldHVw KHJwbGFuZSk7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVf dnNwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X3ZzcC5jCj4gaW5kZXggZGQ2 NmRjYjhkYTIzLi42ZDFhODJlZTUwZWQgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Jj YXItZHUvcmNhcl9kdV92c3AuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJf ZHVfdnNwLmMKPiBAQCAtMjEyLDcgKzIxMiwxMSBAQCBzdGF0aWMgaW50IHJjYXJfZHVfdnNwX3Bs YW5lX3ByZXBhcmVfZmIoc3RydWN0IGRybV9wbGFuZSAqcGxhbmUsCj4gIAl1bnNpZ25lZCBpbnQg aTsKPiAgCWludCByZXQ7Cj4gIAo+IC0JaWYgKCFzdGF0ZS0+ZmIpCj4gKwkvKgo+ICsJICogVGhl cmUncyBubyBuZWVkIHRvIHByZXBhcmUgKGFuZCB1bnByZXBhcmUpIHRoZSBmcmFtZWJ1ZmZlciB3 aGVuIHRoZQo+ICsJICogcGxhbmUgaXMgbm90IHZpc2libGUsIGFzIGl0IHdpbGwgbm90IGJlIGRp c3BsYXllZC4KPiArCSAqLwo+ICsJaWYgKCFzdGF0ZS0+dmlzaWJsZSkKPiAgCQlyZXR1cm4gMDsK PiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgcnN0YXRlLT5mb3JtYXQtPnBsYW5lczsgKytpKSB7Cj4g QEAgLTI1Myw3ICsyNTcsNyBAQCBzdGF0aWMgdm9pZCByY2FyX2R1X3ZzcF9wbGFuZV9jbGVhbnVw X2ZiKHN0cnVjdCBkcm1fcGxhbmUgKnBsYW5lLAo+ICAJc3RydWN0IHJjYXJfZHVfdnNwICp2c3Ag PSB0b19yY2FyX3ZzcF9wbGFuZShwbGFuZSktPnZzcDsKPiAgCXVuc2lnbmVkIGludCBpOwo+ICAK PiAtCWlmICghc3RhdGUtPmZiKQo+ICsJaWYgKCFzdGF0ZS0+dmlzaWJsZSkKPiAgCQlyZXR1cm47 Cj4gIAo+ICAJZm9yIChpID0gMDsgaSA8IHJzdGF0ZS0+Zm9ybWF0LT5wbGFuZXM7ICsraSkgewo+ IEBAIC0yNzgsNyArMjgyLDcgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV92c3BfcGxhbmVfYXRvbWlj X3VwZGF0ZShzdHJ1Y3QgZHJtX3BsYW5lICpwbGFuZSwKPiAgCXN0cnVjdCByY2FyX2R1X3ZzcF9w bGFuZSAqcnBsYW5lID0gdG9fcmNhcl92c3BfcGxhbmUocGxhbmUpOwo+ICAJc3RydWN0IHJjYXJf ZHVfY3J0YyAqY3J0YyA9IHRvX3JjYXJfY3J0YyhvbGRfc3RhdGUtPmNydGMpOwo+ICAKPiAtCWlm IChwbGFuZS0+c3RhdGUtPmNydGMpCj4gKwlpZiAocGxhbmUtPnN0YXRlLT52aXNpYmxlKQo+ICAJ CXJjYXJfZHVfdnNwX3BsYW5lX3NldHVwKHJwbGFuZSk7Cj4gIAllbHNlCj4gIAkJdnNwMV9kdV9h dG9taWNfdXBkYXRlKHJwbGFuZS0+dnNwLT52c3AsIGNydGMtPnZzcF9waXBlLAo+IC0tIAo+IFJl Z2FyZHMsCj4gCj4gTGF1cmVudCBQaW5jaGFydAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCj4gZHJpLWRldmVsIG1haWxpbmcgbGlzdAo+IGRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKPiBodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9y Zy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAoKLS0gClZpbGxlIFN5cmrDpGzDpApJbnRlbCBP VEMKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRl dmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==