From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:36555 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751237AbeDBMfs (ORCPT ); Mon, 2 Apr 2018 08:35:48 -0400 From: Laurent Pinchart To: Kieran Bingham Cc: Laurent Pinchart , linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org Subject: Re: [PATCH 10/15] v4l: vsp1: Move DRM pipeline output setup code to a function Date: Mon, 02 Apr 2018 15:35:54 +0300 Message-ID: <3938270.yYcQyIxAEm@avalon> In-Reply-To: References: <20180226214516.11559-1-laurent.pinchart+renesas@ideasonboard.com> <20180226214516.11559-11-laurent.pinchart+renesas@ideasonboard.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 Kieran, On Thursday, 29 March 2018 14:49:12 EEST Kieran Bingham wrote: > Hi Laurent, > > Thank you for another patch :D You're welcome, there will be more ;-) > On 26/02/18 21:45, Laurent Pinchart wrote: > > In order to make the vsp1_du_setup_lif() easier to read, and for > > symmetry with the DRM pipeline input setup, move the pipeline output > > setup code to a separate function. > > > > Signed-off-by: Laurent Pinchart > > > > Just an easy code move. And I agree it improves things. > > Small question below, but otherwise: > > Reviewed-by: Kieran Bingham > > > --- > > > > drivers/media/platform/vsp1/vsp1_drm.c | 107 ++++++++++++++++------------ > > 1 file changed, 61 insertions(+), 46 deletions(-) > > > > diff --git a/drivers/media/platform/vsp1/vsp1_drm.c > > b/drivers/media/platform/vsp1/vsp1_drm.c index 00ce99bd1605..1c8adda47440 > > 100644 > > --- a/drivers/media/platform/vsp1/vsp1_drm.c > > +++ b/drivers/media/platform/vsp1/vsp1_drm.c > > @@ -276,6 +276,66 @@ static int vsp1_du_pipeline_setup_input(struct > > vsp1_device *vsp1, > > return 0; > > > > } > > > > +/* Setup the output side of the pipeline (WPF and LIF). */ > > +static int vsp1_du_pipeline_setup_output(struct vsp1_device *vsp1, > > + struct vsp1_pipeline *pipe) > > +{ > > + struct vsp1_drm_pipeline *drm_pipe = to_vsp1_drm_pipeline(pipe); > > + struct v4l2_subdev_format format = { > > + .which = V4L2_SUBDEV_FORMAT_ACTIVE, > > Why do you initialise this .which here, but all the other member variables > below. > > Wouldn't it make more sense to group all of this initialisation together? or > is there a distinction in keeping the .which separate. > > (Perhaps this is just a way to initialise the rest of the structure to 0, > without using the memset?) The initialization of the .which field is indeed there to avoid the memset, but other than that there's no particular reason. I find it clearer to keep the initialization of the structure close to the code that makes use of it (the next v4l2_subdev_call in this case). As initializing all members when declaring the variable doesn't make a change in code size (gcc 6.4.0) but increases .rodata by 18 bytes and decreases __modver by the same amount, I'm tempted to leave it as-is unless you think it should be changed. > > + }; > > + int ret; > > + > > + format.pad = RWPF_PAD_SINK; > > + format.format.width = drm_pipe->width; > > + format.format.height = drm_pipe->height; > > + format.format.code = MEDIA_BUS_FMT_ARGB8888_1X32; > > + format.format.field = V4L2_FIELD_NONE; > > + > > + ret = v4l2_subdev_call(&pipe->output->entity.subdev, pad, set_fmt, NULL, > > + &format); > > + if (ret < 0) > > + return ret; > > + > > + dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on WPF%u sink\n", > > + __func__, format.format.width, format.format.height, > > + format.format.code, pipe->output->entity.index); > > + > > + format.pad = RWPF_PAD_SOURCE; > > + ret = v4l2_subdev_call(&pipe->output->entity.subdev, pad, get_fmt, NULL, > > + &format); > > + if (ret < 0) > > + return ret; > > + > > + dev_dbg(vsp1->dev, "%s: got format %ux%u (%x) on WPF%u source\n", > > + __func__, format.format.width, format.format.height, > > + format.format.code, pipe->output->entity.index); > > + > > + format.pad = LIF_PAD_SINK; > > + ret = v4l2_subdev_call(&pipe->lif->subdev, pad, set_fmt, NULL, > > + &format); > > + if (ret < 0) > > + return ret; > > + > > + dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on LIF%u sink\n", > > + __func__, format.format.width, format.format.height, > > + format.format.code, pipe->lif->index); > > + > > + /* > > + * Verify that the format at the output of the pipeline matches the > > + * requested frame size and media bus code. > > + */ > > + if (format.format.width != drm_pipe->width || > > + format.format.height != drm_pipe->height || > > + format.format.code != MEDIA_BUS_FMT_ARGB8888_1X32) { > > + dev_dbg(vsp1->dev, "%s: format mismatch on LIF%u\n", __func__, > > + pipe->lif->index); > > + return -EPIPE; > > + } > > + > > + return 0; > > +} > > + > > > > /* Configure all entities in the pipeline. */ > > static void vsp1_du_pipeline_configure(struct vsp1_pipeline *pipe) > > { > > > > @@ -356,7 +416,6 @@ int vsp1_du_setup_lif(struct device *dev, unsigned int > > pipe_index,> > > struct vsp1_drm_pipeline *drm_pipe; > > struct vsp1_pipeline *pipe; > > struct vsp1_bru *bru; > > > > - struct v4l2_subdev_format format; > > > > unsigned long flags; > > unsigned int i; > > int ret; > > > > @@ -417,54 +476,10 @@ int vsp1_du_setup_lif(struct device *dev, unsigned > > int pipe_index,> > > if (ret < 0) > > > > return ret; > > > > - memset(&format, 0, sizeof(format)); > > - format.which = V4L2_SUBDEV_FORMAT_ACTIVE; > > - format.pad = RWPF_PAD_SINK; > > - format.format.width = cfg->width; > > - format.format.height = cfg->height; > > - format.format.code = MEDIA_BUS_FMT_ARGB8888_1X32; > > - format.format.field = V4L2_FIELD_NONE; > > - > > - ret = v4l2_subdev_call(&pipe->output->entity.subdev, pad, set_fmt, NULL, > > - &format); > > + ret = vsp1_du_pipeline_setup_output(vsp1, pipe); > > > > if (ret < 0) > > > > return ret; > > > > - dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on WPF%u sink\n", > > - __func__, format.format.width, format.format.height, > > - format.format.code, pipe->output->entity.index); > > - > > - format.pad = RWPF_PAD_SOURCE; > > - ret = v4l2_subdev_call(&pipe->output->entity.subdev, pad, get_fmt, NULL, > > - &format); > > - if (ret < 0) > > - return ret; > > - > > - dev_dbg(vsp1->dev, "%s: got format %ux%u (%x) on WPF%u source\n", > > - __func__, format.format.width, format.format.height, > > - format.format.code, pipe->output->entity.index); > > - > > - format.pad = LIF_PAD_SINK; > > - ret = v4l2_subdev_call(&pipe->lif->subdev, pad, set_fmt, NULL, > > - &format); > > - if (ret < 0) > > - return ret; > > - > > - dev_dbg(vsp1->dev, "%s: set format %ux%u (%x) on LIF%u sink\n", > > - __func__, format.format.width, format.format.height, > > - format.format.code, pipe_index); > > - > > - /* > > - * Verify that the format at the output of the pipeline matches the > > - * requested frame size and media bus code. > > - */ > > - if (format.format.width != cfg->width || > > - format.format.height != cfg->height || > > - format.format.code != MEDIA_BUS_FMT_ARGB8888_1X32) { > > - dev_dbg(vsp1->dev, "%s: format mismatch\n", __func__); > > - return -EPIPE; > > - } > > - > > > > /* Enable the VSP1. */ > > ret = vsp1_device_get(vsp1); > > if (ret < 0) -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH 10/15] v4l: vsp1: Move DRM pipeline output setup code to a function Date: Mon, 02 Apr 2018 15:35:54 +0300 Message-ID: <3938270.yYcQyIxAEm@avalon> References: <20180226214516.11559-1-laurent.pinchart+renesas@ideasonboard.com> <20180226214516.11559-11-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from galahad.ideasonboard.com (galahad.ideasonboard.com [185.26.127.97]) by gabe.freedesktop.org (Postfix) with ESMTPS id 6246A6E02D for ; Mon, 2 Apr 2018 12:35:48 +0000 (UTC) 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: Kieran Bingham Cc: linux-renesas-soc@vger.kernel.org, Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgS2llcmFuLAoKT24gVGh1cnNkYXksIDI5IE1hcmNoIDIwMTggMTQ6NDk6MTIgRUVTVCBLaWVy YW4gQmluZ2hhbSB3cm90ZToKPiBIaSBMYXVyZW50LAo+IAo+IFRoYW5rIHlvdSBmb3IgYW5vdGhl ciBwYXRjaCA6RAoKWW91J3JlIHdlbGNvbWUsIHRoZXJlIHdpbGwgYmUgbW9yZSA7LSkKCj4gT24g MjYvMDIvMTggMjE6NDUsIExhdXJlbnQgUGluY2hhcnQgd3JvdGU6Cj4gPiBJbiBvcmRlciB0byBt YWtlIHRoZSB2c3AxX2R1X3NldHVwX2xpZigpIGVhc2llciB0byByZWFkLCBhbmQgZm9yCj4gPiBz eW1tZXRyeSB3aXRoIHRoZSBEUk0gcGlwZWxpbmUgaW5wdXQgc2V0dXAsIG1vdmUgdGhlIHBpcGVs aW5lIG91dHB1dAo+ID4gc2V0dXAgY29kZSB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uLgo+ID4gCj4g PiBTaWduZWQtb2ZmLWJ5OiBMYXVyZW50IFBpbmNoYXJ0Cj4gPiA8bGF1cmVudC5waW5jaGFydCty ZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gCj4gSnVzdCBhbiBlYXN5IGNvZGUgbW92ZS4gQW5k IEkgYWdyZWUgaXQgaW1wcm92ZXMgdGhpbmdzLgo+IAo+IFNtYWxsIHF1ZXN0aW9uIGJlbG93LCBi dXQgb3RoZXJ3aXNlOgo+IAo+IFJldmlld2VkLWJ5OiBLaWVyYW4gQmluZ2hhbSA8a2llcmFuLmJp bmdoYW0rcmVuZXNhc0BpZGVhc29uYm9hcmQuY29tPgo+IAo+ID4gLS0tCj4gPiAKPiA+ICBkcml2 ZXJzL21lZGlhL3BsYXRmb3JtL3ZzcDEvdnNwMV9kcm0uYyB8IDEwNyArKysrKysrKysrKysrKysr LS0tLS0tLS0tLS0tCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDYxIGluc2VydGlvbnMoKyksIDQ2IGRl bGV0aW9ucygtKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92 c3AxL3ZzcDFfZHJtLmMKPiA+IGIvZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJt LmMgaW5kZXggMDBjZTk5YmQxNjA1Li4xYzhhZGRhNDc0NDAKPiA+IDEwMDY0NAo+ID4gLS0tIGEv ZHJpdmVycy9tZWRpYS9wbGF0Zm9ybS92c3AxL3ZzcDFfZHJtLmMKPiA+ICsrKyBiL2RyaXZlcnMv bWVkaWEvcGxhdGZvcm0vdnNwMS92c3AxX2RybS5jCj4gPiBAQCAtMjc2LDYgKzI3Niw2NiBAQCBz dGF0aWMgaW50IHZzcDFfZHVfcGlwZWxpbmVfc2V0dXBfaW5wdXQoc3RydWN0Cj4gPiB2c3AxX2Rl dmljZSAqdnNwMSwKPiA+ICAJcmV0dXJuIDA7Cj4gPiAgCj4gPiAgfQo+ID4gCj4gPiArLyogU2V0 dXAgdGhlIG91dHB1dCBzaWRlIG9mIHRoZSBwaXBlbGluZSAoV1BGIGFuZCBMSUYpLiAqLwo+ID4g K3N0YXRpYyBpbnQgdnNwMV9kdV9waXBlbGluZV9zZXR1cF9vdXRwdXQoc3RydWN0IHZzcDFfZGV2 aWNlICp2c3AxLAo+ID4gKwkJCQkJIHN0cnVjdCB2c3AxX3BpcGVsaW5lICpwaXBlKQo+ID4gK3sK PiA+ICsJc3RydWN0IHZzcDFfZHJtX3BpcGVsaW5lICpkcm1fcGlwZSA9IHRvX3ZzcDFfZHJtX3Bp cGVsaW5lKHBpcGUpOwo+ID4gKwlzdHJ1Y3QgdjRsMl9zdWJkZXZfZm9ybWF0IGZvcm1hdCA9IHsK PiA+ICsJCS53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkUsCj4gCj4gV2h5IGRvIHlv dSBpbml0aWFsaXNlIHRoaXMgLndoaWNoIGhlcmUsIGJ1dCBhbGwgdGhlIG90aGVyIG1lbWJlciB2 YXJpYWJsZXMKPiBiZWxvdy4KPiAKPiBXb3VsZG4ndCBpdCBtYWtlIG1vcmUgc2Vuc2UgdG8gZ3Jv dXAgYWxsIG9mIHRoaXMgaW5pdGlhbGlzYXRpb24gdG9nZXRoZXI/IG9yCj4gaXMgdGhlcmUgYSBk aXN0aW5jdGlvbiBpbiBrZWVwaW5nIHRoZSAud2hpY2ggc2VwYXJhdGUuCj4gCj4gKFBlcmhhcHMg dGhpcyBpcyBqdXN0IGEgd2F5IHRvIGluaXRpYWxpc2UgdGhlIHJlc3Qgb2YgdGhlIHN0cnVjdHVy ZSB0byAwLAo+IHdpdGhvdXQgdXNpbmcgdGhlIG1lbXNldD8pCgpUaGUgaW5pdGlhbGl6YXRpb24g b2YgdGhlIC53aGljaCBmaWVsZCBpcyBpbmRlZWQgdGhlcmUgdG8gYXZvaWQgdGhlIG1lbXNldCwg CmJ1dCBvdGhlciB0aGFuIHRoYXQgdGhlcmUncyBubyBwYXJ0aWN1bGFyIHJlYXNvbi4gSSBmaW5k IGl0IGNsZWFyZXIgdG8ga2VlcCAKdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUg Y2xvc2UgdG8gdGhlIGNvZGUgdGhhdCBtYWtlcyB1c2Ugb2YgaXQgCih0aGUgbmV4dCB2NGwyX3N1 YmRldl9jYWxsIGluIHRoaXMgY2FzZSkuCgpBcyBpbml0aWFsaXppbmcgYWxsIG1lbWJlcnMgd2hl biBkZWNsYXJpbmcgdGhlIHZhcmlhYmxlIGRvZXNuJ3QgbWFrZSBhIGNoYW5nZSAKaW4gY29kZSBz aXplIChnY2MgNi40LjApIGJ1dCBpbmNyZWFzZXMgLnJvZGF0YSBieSAxOCBieXRlcyBhbmQgZGVj cmVhc2VzIApfX21vZHZlciBieSB0aGUgc2FtZSBhbW91bnQsIEknbSB0ZW1wdGVkIHRvIGxlYXZl IGl0IGFzLWlzIHVubGVzcyB5b3UgdGhpbmsgaXQgCnNob3VsZCBiZSBjaGFuZ2VkLgoKPiA+ICsJ fTsKPiA+ICsJaW50IHJldDsKPiA+ICsKPiA+ICsJZm9ybWF0LnBhZCA9IFJXUEZfUEFEX1NJTks7 Cj4gPiArCWZvcm1hdC5mb3JtYXQud2lkdGggPSBkcm1fcGlwZS0+d2lkdGg7Cj4gPiArCWZvcm1h dC5mb3JtYXQuaGVpZ2h0ID0gZHJtX3BpcGUtPmhlaWdodDsKPiA+ICsJZm9ybWF0LmZvcm1hdC5j b2RlID0gTUVESUFfQlVTX0ZNVF9BUkdCODg4OF8xWDMyOwo+ID4gKwlmb3JtYXQuZm9ybWF0LmZp ZWxkID0gVjRMMl9GSUVMRF9OT05FOwo+ID4gKwo+ID4gKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxs KCZwaXBlLT5vdXRwdXQtPmVudGl0eS5zdWJkZXYsIHBhZCwgc2V0X2ZtdCwgCk5VTEwsCj4gPiAr CQkJICAgICAgICZmb3JtYXQpOwo+ID4gKwlpZiAocmV0IDwgMCkKPiA+ICsJCXJldHVybiByZXQ7 Cj4gPiArCj4gPiArCWRldl9kYmcodnNwMS0+ZGV2LCAiJXM6IHNldCBmb3JtYXQgJXV4JXUgKCV4 KSBvbiBXUEYldSBzaW5rXG4iLAo+ID4gKwkJX19mdW5jX18sIGZvcm1hdC5mb3JtYXQud2lkdGgs IGZvcm1hdC5mb3JtYXQuaGVpZ2h0LAo+ID4gKwkJZm9ybWF0LmZvcm1hdC5jb2RlLCBwaXBlLT5v dXRwdXQtPmVudGl0eS5pbmRleCk7Cj4gPiArCj4gPiArCWZvcm1hdC5wYWQgPSBSV1BGX1BBRF9T T1VSQ0U7Cj4gPiArCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoJnBpcGUtPm91dHB1dC0+ZW50aXR5 LnN1YmRldiwgcGFkLCBnZXRfZm10LCAKTlVMTCwKPiA+ICsJCQkgICAgICAgJmZvcm1hdCk7Cj4g PiArCWlmIChyZXQgPCAwKQo+ID4gKwkJcmV0dXJuIHJldDsKPiA+ICsKPiA+ICsJZGV2X2RiZyh2 c3AxLT5kZXYsICIlczogZ290IGZvcm1hdCAldXgldSAoJXgpIG9uIFdQRiV1IHNvdXJjZVxuIiwK PiA+ICsJCV9fZnVuY19fLCBmb3JtYXQuZm9ybWF0LndpZHRoLCBmb3JtYXQuZm9ybWF0LmhlaWdo dCwKPiA+ICsJCWZvcm1hdC5mb3JtYXQuY29kZSwgcGlwZS0+b3V0cHV0LT5lbnRpdHkuaW5kZXgp Owo+ID4gKwo+ID4gKwlmb3JtYXQucGFkID0gTElGX1BBRF9TSU5LOwo+ID4gKwlyZXQgPSB2NGwy X3N1YmRldl9jYWxsKCZwaXBlLT5saWYtPnN1YmRldiwgcGFkLCBzZXRfZm10LCBOVUxMLAo+ID4g KwkJCSAgICAgICAmZm9ybWF0KTsKPiA+ICsJaWYgKHJldCA8IDApCj4gPiArCQlyZXR1cm4gcmV0 Owo+ID4gKwo+ID4gKwlkZXZfZGJnKHZzcDEtPmRldiwgIiVzOiBzZXQgZm9ybWF0ICV1eCV1ICgl eCkgb24gTElGJXUgc2lua1xuIiwKPiA+ICsJCV9fZnVuY19fLCBmb3JtYXQuZm9ybWF0LndpZHRo LCBmb3JtYXQuZm9ybWF0LmhlaWdodCwKPiA+ICsJCWZvcm1hdC5mb3JtYXQuY29kZSwgcGlwZS0+ bGlmLT5pbmRleCk7Cj4gPiArCj4gPiArCS8qCj4gPiArCSAqIFZlcmlmeSB0aGF0IHRoZSBmb3Jt YXQgYXQgdGhlIG91dHB1dCBvZiB0aGUgcGlwZWxpbmUgbWF0Y2hlcyB0aGUKPiA+ICsJICogcmVx dWVzdGVkIGZyYW1lIHNpemUgYW5kIG1lZGlhIGJ1cyBjb2RlLgo+ID4gKwkgKi8KPiA+ICsJaWYg KGZvcm1hdC5mb3JtYXQud2lkdGggIT0gZHJtX3BpcGUtPndpZHRoIHx8Cj4gPiArCSAgICBmb3Jt YXQuZm9ybWF0LmhlaWdodCAhPSBkcm1fcGlwZS0+aGVpZ2h0IHx8Cj4gPiArCSAgICBmb3JtYXQu Zm9ybWF0LmNvZGUgIT0gTUVESUFfQlVTX0ZNVF9BUkdCODg4OF8xWDMyKSB7Cj4gPiArCQlkZXZf ZGJnKHZzcDEtPmRldiwgIiVzOiBmb3JtYXQgbWlzbWF0Y2ggb24gTElGJXVcbiIsIF9fZnVuY19f LAo+ID4gKwkJCXBpcGUtPmxpZi0+aW5kZXgpOwo+ID4gKwkJcmV0dXJuIC1FUElQRTsKPiA+ICsJ fQo+ID4gKwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiAKPiA+ICAvKiBDb25maWd1 cmUgYWxsIGVudGl0aWVzIGluIHRoZSBwaXBlbGluZS4gKi8KPiA+ICBzdGF0aWMgdm9pZCB2c3Ax X2R1X3BpcGVsaW5lX2NvbmZpZ3VyZShzdHJ1Y3QgdnNwMV9waXBlbGluZSAqcGlwZSkKPiA+ICB7 Cj4gPiAKPiA+IEBAIC0zNTYsNyArNDE2LDYgQEAgaW50IHZzcDFfZHVfc2V0dXBfbGlmKHN0cnVj dCBkZXZpY2UgKmRldiwgdW5zaWduZWQgaW50Cj4gPiBwaXBlX2luZGV4LD4gCj4gPiAgCXN0cnVj dCB2c3AxX2RybV9waXBlbGluZSAqZHJtX3BpcGU7Cj4gPiAgCXN0cnVjdCB2c3AxX3BpcGVsaW5l ICpwaXBlOwo+ID4gIAlzdHJ1Y3QgdnNwMV9icnUgKmJydTsKPiA+IAo+ID4gLQlzdHJ1Y3QgdjRs Ml9zdWJkZXZfZm9ybWF0IGZvcm1hdDsKPiA+IAo+ID4gIAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ ID4gIAl1bnNpZ25lZCBpbnQgaTsKPiA+ICAJaW50IHJldDsKPiA+IAo+ID4gQEAgLTQxNyw1NCAr NDc2LDEwIEBAIGludCB2c3AxX2R1X3NldHVwX2xpZihzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2ln bmVkCj4gPiBpbnQgcGlwZV9pbmRleCw+IAo+ID4gIAlpZiAocmV0IDwgMCkKPiA+ICAJCj4gPiAg CQlyZXR1cm4gcmV0Owo+ID4gCj4gPiAtCW1lbXNldCgmZm9ybWF0LCAwLCBzaXplb2YoZm9ybWF0 KSk7Cj4gPiAtCWZvcm1hdC53aGljaCA9IFY0TDJfU1VCREVWX0ZPUk1BVF9BQ1RJVkU7Cj4gPiAt CWZvcm1hdC5wYWQgPSBSV1BGX1BBRF9TSU5LOwo+ID4gLQlmb3JtYXQuZm9ybWF0LndpZHRoID0g Y2ZnLT53aWR0aDsKPiA+IC0JZm9ybWF0LmZvcm1hdC5oZWlnaHQgPSBjZmctPmhlaWdodDsKPiA+ IC0JZm9ybWF0LmZvcm1hdC5jb2RlID0gTUVESUFfQlVTX0ZNVF9BUkdCODg4OF8xWDMyOwo+ID4g LQlmb3JtYXQuZm9ybWF0LmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwo+ID4gLQo+ID4gLQlyZXQg PSB2NGwyX3N1YmRldl9jYWxsKCZwaXBlLT5vdXRwdXQtPmVudGl0eS5zdWJkZXYsIHBhZCwgc2V0 X2ZtdCwgCk5VTEwsCj4gPiAtCQkJICAgICAgICZmb3JtYXQpOwo+ID4gKwlyZXQgPSB2c3AxX2R1 X3BpcGVsaW5lX3NldHVwX291dHB1dCh2c3AxLCBwaXBlKTsKPiA+IAo+ID4gIAlpZiAocmV0IDwg MCkKPiA+ICAJCj4gPiAgCQlyZXR1cm4gcmV0Owo+ID4gCj4gPiAtCWRldl9kYmcodnNwMS0+ZGV2 LCAiJXM6IHNldCBmb3JtYXQgJXV4JXUgKCV4KSBvbiBXUEYldSBzaW5rXG4iLAo+ID4gLQkJX19m dW5jX18sIGZvcm1hdC5mb3JtYXQud2lkdGgsIGZvcm1hdC5mb3JtYXQuaGVpZ2h0LAo+ID4gLQkJ Zm9ybWF0LmZvcm1hdC5jb2RlLCBwaXBlLT5vdXRwdXQtPmVudGl0eS5pbmRleCk7Cj4gPiAtCj4g PiAtCWZvcm1hdC5wYWQgPSBSV1BGX1BBRF9TT1VSQ0U7Cj4gPiAtCXJldCA9IHY0bDJfc3ViZGV2 X2NhbGwoJnBpcGUtPm91dHB1dC0+ZW50aXR5LnN1YmRldiwgcGFkLCBnZXRfZm10LCAKTlVMTCwK PiA+IC0JCQkgICAgICAgJmZvcm1hdCk7Cj4gPiAtCWlmIChyZXQgPCAwKQo+ID4gLQkJcmV0dXJu IHJldDsKPiA+IC0KPiA+IC0JZGV2X2RiZyh2c3AxLT5kZXYsICIlczogZ290IGZvcm1hdCAldXgl dSAoJXgpIG9uIFdQRiV1IHNvdXJjZVxuIiwKPiA+IC0JCV9fZnVuY19fLCBmb3JtYXQuZm9ybWF0 LndpZHRoLCBmb3JtYXQuZm9ybWF0LmhlaWdodCwKPiA+IC0JCWZvcm1hdC5mb3JtYXQuY29kZSwg cGlwZS0+b3V0cHV0LT5lbnRpdHkuaW5kZXgpOwo+ID4gLQo+ID4gLQlmb3JtYXQucGFkID0gTElG X1BBRF9TSU5LOwo+ID4gLQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKCZwaXBlLT5saWYtPnN1YmRl diwgcGFkLCBzZXRfZm10LCBOVUxMLAo+ID4gLQkJCSAgICAgICAmZm9ybWF0KTsKPiA+IC0JaWYg KHJldCA8IDApCj4gPiAtCQlyZXR1cm4gcmV0Owo+ID4gLQo+ID4gLQlkZXZfZGJnKHZzcDEtPmRl diwgIiVzOiBzZXQgZm9ybWF0ICV1eCV1ICgleCkgb24gTElGJXUgc2lua1xuIiwKPiA+IC0JCV9f ZnVuY19fLCBmb3JtYXQuZm9ybWF0LndpZHRoLCBmb3JtYXQuZm9ybWF0LmhlaWdodCwKPiA+IC0J CWZvcm1hdC5mb3JtYXQuY29kZSwgcGlwZV9pbmRleCk7Cj4gPiAtCj4gPiAtCS8qCj4gPiAtCSAq IFZlcmlmeSB0aGF0IHRoZSBmb3JtYXQgYXQgdGhlIG91dHB1dCBvZiB0aGUgcGlwZWxpbmUgbWF0 Y2hlcyB0aGUKPiA+IC0JICogcmVxdWVzdGVkIGZyYW1lIHNpemUgYW5kIG1lZGlhIGJ1cyBjb2Rl Lgo+ID4gLQkgKi8KPiA+IC0JaWYgKGZvcm1hdC5mb3JtYXQud2lkdGggIT0gY2ZnLT53aWR0aCB8 fAo+ID4gLQkgICAgZm9ybWF0LmZvcm1hdC5oZWlnaHQgIT0gY2ZnLT5oZWlnaHQgfHwKPiA+IC0J ICAgIGZvcm1hdC5mb3JtYXQuY29kZSAhPSBNRURJQV9CVVNfRk1UX0FSR0I4ODg4XzFYMzIpIHsK PiA+IC0JCWRldl9kYmcodnNwMS0+ZGV2LCAiJXM6IGZvcm1hdCBtaXNtYXRjaFxuIiwgX19mdW5j X18pOwo+ID4gLQkJcmV0dXJuIC1FUElQRTsKPiA+IC0JfQo+ID4gLQo+ID4gCj4gPiAgCS8qIEVu YWJsZSB0aGUgVlNQMS4gKi8KPiA+ICAJcmV0ID0gdnNwMV9kZXZpY2VfZ2V0KHZzcDEpOwo+ID4g IAlpZiAocmV0IDwgMCkKCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydAoKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGlu ZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVl ZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK