From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from galahad.ideasonboard.com ([185.26.127.97]:49772 "EHLO galahad.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751336AbdCDNH3 (ORCPT ); Sat, 4 Mar 2017 08:07:29 -0500 From: Laurent Pinchart To: Kieran Bingham Cc: linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: Re: [PATCH v2 3/3] drm: rcar-du: Register a completion callback with VSP1 Date: Sat, 04 Mar 2017 15:07:09 +0200 Message-ID: <4036908.C45uQTknvk@avalon> In-Reply-To: References: 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, Thank you for the patch. On Saturday 04 Mar 2017 02:01:19 Kieran Bingham wrote: > Currently we process page flip events on every display interrupt, > however this does not take into consideration the processing time needed > by the VSP1 utilised in the pipeline. > > Register a callback with the VSP driver to obtain completion events, and > track them so that we only perform page flips when the full display > pipeline has completed for the frame. > > Signed-off-by: Kieran Bingham > > --- > v2: > - Commit message completely re-worded for patch re-work. > - drm_crtc_handle_vblank() re-instated in event of rcrtc->pending > - removed passing of unnecessary 'data' through callbacks > - perform page flips from the VSP completion handler > - add locking around pending flags > > drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 10 +++++++-- > drivers/gpu/drm/rcar-du/rcar_du_crtc.h | 2 ++- > drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 29 +++++++++++++++++++++++++++- > 3 files changed, 39 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c index 7391dd95c733..b7ff00bb45de > 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.c > @@ -299,7 +299,7 @@ static void rcar_du_crtc_update_planes(struct > rcar_du_crtc *rcrtc) * Page Flip > */ > > -static void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc) > +void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc) > { > struct drm_pending_vblank_event *event; > struct drm_device *dev = rcrtc->crtc.dev; > @@ -328,7 +328,7 @@ static bool rcar_du_crtc_page_flip_pending(struct > rcar_du_crtc *rcrtc) bool pending; > > spin_lock_irqsave(&dev->event_lock, flags); > - pending = rcrtc->event != NULL; > + pending = (rcrtc->event != NULL) || (rcrtc->pending); No need for parenthesis. > spin_unlock_irqrestore(&dev->event_lock, flags); > > return pending; > @@ -579,6 +579,12 @@ static irqreturn_t rcar_du_crtc_irq(int irq, void *arg) > > if (status & DSSR_FRM) { > drm_crtc_handle_vblank(&rcrtc->crtc); > + > + if (rcrtc->pending) { > + trace_printk("VBlank loss due to VSP Overrun\n"); > + return IRQ_HANDLED; > + } > + More than that, now that the VSP completion handler finishes the page flip, you should skip the rcar_du_crtc_finish_page_flip() call here unconditionally on Gen3. Something like struct rcar_du_crtc *rcrtc = arg; struct rcar_du_device *rcdu = rcrtc->group->dev; ... if (status & DSSR_FRM) { drm_crtc_handle_vblank(&rcrtc->crtc); if (rcdu->info->gen < 3) rcar_du_crtc_finish_page_flip(rcrtc); ret = IRQ_HANDLED; } > rcar_du_crtc_finish_page_flip(rcrtc); > ret = IRQ_HANDLED; > } > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h > b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h index a7194812997e..b73ec6de7af4 > 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_crtc.h > +++ b/drivers/gpu/drm/rcar-du/rcar_du_crtc.h > @@ -47,6 +47,7 @@ struct rcar_du_crtc { > > struct drm_pending_vblank_event *event; > wait_queue_head_t flip_wait; > + bool pending; > > unsigned int outputs; > > @@ -71,5 +72,6 @@ void rcar_du_crtc_resume(struct rcar_du_crtc *rcrtc); > > void rcar_du_crtc_route_output(struct drm_crtc *crtc, > enum rcar_du_output output); > +void rcar_du_crtc_finish_page_flip(struct rcar_du_crtc *rcrtc); > > #endif /* __RCAR_DU_CRTC_H__ */ > diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c index b0ff304ce3dc..1fcd311badb1 > 100644 > --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c > @@ -28,6 +28,22 @@ > #include "rcar_du_kms.h" > #include "rcar_du_vsp.h" > > +static void rcar_du_vsp_complete(void *private) > +{ > + struct rcar_du_crtc *crtc = (struct rcar_du_crtc *)private; > + struct drm_device *dev = crtc->crtc.dev; > + unsigned long flags; > + bool pending; > + > + spin_lock_irqsave(&dev->event_lock, flags); > + pending = crtc->pending; > + crtc->pending = false; > + spin_unlock_irqrestore(&dev->event_lock, flags); > + > + if (pending) > + rcar_du_crtc_finish_page_flip(crtc); This seems to duplicate the synchronization mechanism based on events in rcar_du_crtc_atomic_begin(). I need to check that in more details. > +} > + > void rcar_du_vsp_enable(struct rcar_du_crtc *crtc) > { > const struct drm_display_mode *mode = &crtc->crtc.state- >adjusted_mode; > @@ -35,6 +51,8 @@ void rcar_du_vsp_enable(struct rcar_du_crtc *crtc) > struct vsp1_du_lif_config cfg = { > .width = mode->hdisplay, > .height = mode->vdisplay, > + .callback = rcar_du_vsp_complete, > + .callback_data = crtc, > }; > struct rcar_du_plane_state state = { > .state = { > @@ -85,6 +103,17 @@ void rcar_du_vsp_atomic_begin(struct rcar_du_crtc *crtc) > > void rcar_du_vsp_atomic_flush(struct rcar_du_crtc *crtc) > { > + struct drm_device *dev = crtc->crtc.dev; > + unsigned long flags; > + bool pending; > + > + spin_lock_irqsave(&dev->event_lock, flags); > + pending = crtc->pending; > + crtc->pending = true; > + spin_unlock_irqrestore(&dev->event_lock, flags); > + > + WARN_ON(pending); > + > vsp1_du_atomic_flush(crtc->vsp->vsp); > } -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 3/3] drm: rcar-du: Register a completion callback with VSP1 Date: Sat, 04 Mar 2017 15:07:09 +0200 Message-ID: <4036908.C45uQTknvk@avalon> References: 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 0322D6E019 for ; Sat, 4 Mar 2017 13:06:37 +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, dri-devel@lists.freedesktop.org, linux-media@vger.kernel.org List-Id: dri-devel@lists.freedesktop.org SGkgS2llcmFuLAoKVGhhbmsgeW91IGZvciB0aGUgcGF0Y2guCgpPbiBTYXR1cmRheSAwNCBNYXIg MjAxNyAwMjowMToxOSBLaWVyYW4gQmluZ2hhbSB3cm90ZToKPiBDdXJyZW50bHkgd2UgcHJvY2Vz cyBwYWdlIGZsaXAgZXZlbnRzIG9uIGV2ZXJ5IGRpc3BsYXkgaW50ZXJydXB0LAo+IGhvd2V2ZXIg dGhpcyBkb2VzIG5vdCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGUgcHJvY2Vzc2luZyB0aW1l IG5lZWRlZAo+IGJ5IHRoZSBWU1AxIHV0aWxpc2VkIGluIHRoZSBwaXBlbGluZS4KPiAKPiBSZWdp c3RlciBhIGNhbGxiYWNrIHdpdGggdGhlIFZTUCBkcml2ZXIgdG8gb2J0YWluIGNvbXBsZXRpb24g ZXZlbnRzLCBhbmQKPiB0cmFjayB0aGVtIHNvIHRoYXQgd2Ugb25seSBwZXJmb3JtIHBhZ2UgZmxp cHMgd2hlbiB0aGUgZnVsbCBkaXNwbGF5Cj4gcGlwZWxpbmUgaGFzIGNvbXBsZXRlZCBmb3IgdGhl IGZyYW1lLgo+IAo+IFNpZ25lZC1vZmYtYnk6IEtpZXJhbiBCaW5naGFtIDxraWVyYW4uYmluZ2hh bStyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gCj4gLS0tCj4gdjI6Cj4gIC0gQ29tbWl0IG1l c3NhZ2UgY29tcGxldGVseSByZS13b3JkZWQgZm9yIHBhdGNoIHJlLXdvcmsuCj4gIC0gZHJtX2Ny dGNfaGFuZGxlX3ZibGFuaygpIHJlLWluc3RhdGVkIGluIGV2ZW50IG9mIHJjcnRjLT5wZW5kaW5n Cj4gIC0gcmVtb3ZlZCBwYXNzaW5nIG9mIHVubmVjZXNzYXJ5ICdkYXRhJyB0aHJvdWdoIGNhbGxi YWNrcwo+ICAtIHBlcmZvcm0gcGFnZSBmbGlwcyBmcm9tIHRoZSBWU1AgY29tcGxldGlvbiBoYW5k bGVyCj4gIC0gYWRkIGxvY2tpbmcgYXJvdW5kIHBlbmRpbmcgZmxhZ3MKPiAKPiAgZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMgfCAxMCArKysrKysrLS0KPiAgZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmggfCAgMiArKy0KPiAgZHJpdmVycy9ncHUvZHJt L3JjYXItZHUvcmNhcl9kdV92c3AuYyAgfCAyOSArKysrKysrKysrKysrKysrKysrKysrKysrKyst Cj4gIDMgZmlsZXMgY2hhbmdlZCwgMzkgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiAK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9jcnRjLmMKPiBi L2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5jIGluZGV4IDczOTFkZDk1Yzcz My4uYjdmZjAwYmI0NWRlCj4gMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUv cmNhcl9kdV9jcnRjLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2Ny dGMuYwo+IEBAIC0yOTksNyArMjk5LDcgQEAgc3RhdGljIHZvaWQgcmNhcl9kdV9jcnRjX3VwZGF0 ZV9wbGFuZXMoc3RydWN0Cj4gcmNhcl9kdV9jcnRjICpyY3J0YykgKiBQYWdlIEZsaXAKPiAgICov Cj4gCj4gLXN0YXRpYyB2b2lkIHJjYXJfZHVfY3J0Y19maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBy Y2FyX2R1X2NydGMgKnJjcnRjKQo+ICt2b2lkIHJjYXJfZHVfY3J0Y19maW5pc2hfcGFnZV9mbGlw KHN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRjKQo+ICB7Cj4gIAlzdHJ1Y3QgZHJtX3BlbmRpbmdf dmJsYW5rX2V2ZW50ICpldmVudDsKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSByY3J0Yy0+ Y3J0Yy5kZXY7Cj4gQEAgLTMyOCw3ICszMjgsNyBAQCBzdGF0aWMgYm9vbCByY2FyX2R1X2NydGNf cGFnZV9mbGlwX3BlbmRpbmcoc3RydWN0Cj4gcmNhcl9kdV9jcnRjICpyY3J0YykgYm9vbCBwZW5k aW5nOwo+IAo+ICAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwo+ IC0JcGVuZGluZyA9IHJjcnRjLT5ldmVudCAhPSBOVUxMOwo+ICsJcGVuZGluZyA9IChyY3J0Yy0+ ZXZlbnQgIT0gTlVMTCkgfHwgKHJjcnRjLT5wZW5kaW5nKTsKCk5vIG5lZWQgZm9yIHBhcmVudGhl c2lzLgoKPiAgCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3Mp Owo+IAo+ICAJcmV0dXJuIHBlbmRpbmc7Cj4gQEAgLTU3OSw2ICs1NzksMTIgQEAgc3RhdGljIGly cXJldHVybl90IHJjYXJfZHVfY3J0Y19pcnEoaW50IGlycSwgdm9pZCAqYXJnKQo+IAo+ICAJaWYg KHN0YXR1cyAmIERTU1JfRlJNKSB7Cj4gIAkJZHJtX2NydGNfaGFuZGxlX3ZibGFuaygmcmNydGMt PmNydGMpOwo+ICsKPiArCQlpZiAocmNydGMtPnBlbmRpbmcpIHsKPiArCQkJdHJhY2VfcHJpbnRr KCJWQmxhbmsgbG9zcyBkdWUgdG8gVlNQIE92ZXJydW5cbiIpOwo+ICsJCQlyZXR1cm4gSVJRX0hB TkRMRUQ7Cj4gKwkJfQo+ICsKCk1vcmUgdGhhbiB0aGF0LCBub3cgdGhhdCB0aGUgVlNQIGNvbXBs ZXRpb24gaGFuZGxlciBmaW5pc2hlcyB0aGUgcGFnZSBmbGlwLCAKeW91IHNob3VsZCBza2lwIHRo ZSByY2FyX2R1X2NydGNfZmluaXNoX3BhZ2VfZmxpcCgpIGNhbGwgaGVyZSB1bmNvbmRpdGlvbmFs bHkgCm9uIEdlbjMuCgpTb21ldGhpbmcgbGlrZQoKCXN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRj ID0gYXJnOwoJc3RydWN0IHJjYXJfZHVfZGV2aWNlICpyY2R1ID0gcmNydGMtPmdyb3VwLT5kZXY7 CgkuLi4KCglpZiAoc3RhdHVzICYgRFNTUl9GUk0pIHsKCQlkcm1fY3J0Y19oYW5kbGVfdmJsYW5r KCZyY3J0Yy0+Y3J0Yyk7CgoJCWlmIChyY2R1LT5pbmZvLT5nZW4gPCAzKQoJCQlyY2FyX2R1X2Ny dGNfZmluaXNoX3BhZ2VfZmxpcChyY3J0Yyk7CgoJCXJldCA9IElSUV9IQU5ETEVEOwoJfQoKPiAg CQlyY2FyX2R1X2NydGNfZmluaXNoX3BhZ2VfZmxpcChyY3J0Yyk7Cj4gIAkJcmV0ID0gSVJRX0hB TkRMRUQ7Cj4gIAl9Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJf ZHVfY3J0Yy5oCj4gYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2R1X2NydGMuaCBpbmRl eCBhNzE5NDgxMjk5N2UuLmI3M2VjNmRlN2FmNAo+IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9yY2FyLWR1L3JjYXJfZHVfY3J0Yy5oCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL3JjYXIt ZHUvcmNhcl9kdV9jcnRjLmgKPiBAQCAtNDcsNiArNDcsNyBAQCBzdHJ1Y3QgcmNhcl9kdV9jcnRj IHsKPiAKPiAgCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50Owo+ICAJd2Fp dF9xdWV1ZV9oZWFkX3QgZmxpcF93YWl0Owo+ICsJYm9vbCBwZW5kaW5nOwo+IAo+ICAJdW5zaWdu ZWQgaW50IG91dHB1dHM7Cj4gCj4gQEAgLTcxLDUgKzcyLDYgQEAgdm9pZCByY2FyX2R1X2NydGNf cmVzdW1lKHN0cnVjdCByY2FyX2R1X2NydGMgKnJjcnRjKTsKPiAKPiAgdm9pZCByY2FyX2R1X2Ny dGNfcm91dGVfb3V0cHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKPiAgCQkJICAgICAgIGVudW0g cmNhcl9kdV9vdXRwdXQgb3V0cHV0KTsKPiArdm9pZCByY2FyX2R1X2NydGNfZmluaXNoX3BhZ2Vf ZmxpcChzdHJ1Y3QgcmNhcl9kdV9jcnRjICpyY3J0Yyk7Cj4gCj4gICNlbmRpZiAvKiBfX1JDQVJf RFVfQ1JUQ19IX18gKi8KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNh cl9kdV92c3AuYwo+IGIvZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV92c3AuYyBpbmRl eCBiMGZmMzA0Y2UzZGMuLjFmY2QzMTFiYWRiMQo+IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9yY2FyLWR1L3JjYXJfZHVfdnNwLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1k dS9yY2FyX2R1X3ZzcC5jCj4gQEAgLTI4LDYgKzI4LDIyIEBACj4gICNpbmNsdWRlICJyY2FyX2R1 X2ttcy5oIgo+ICAjaW5jbHVkZSAicmNhcl9kdV92c3AuaCIKPiAKPiArc3RhdGljIHZvaWQgcmNh cl9kdV92c3BfY29tcGxldGUodm9pZCAqcHJpdmF0ZSkKPiArewo+ICsJc3RydWN0IHJjYXJfZHVf Y3J0YyAqY3J0YyA9IChzdHJ1Y3QgcmNhcl9kdV9jcnRjICopcHJpdmF0ZTsKPiArCXN0cnVjdCBk cm1fZGV2aWNlICpkZXYgPSBjcnRjLT5jcnRjLmRldjsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 Cj4gKwlib29sIHBlbmRpbmc7Cj4gKwo+ICsJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRf bG9jaywgZmxhZ3MpOwo+ICsJcGVuZGluZyA9IGNydGMtPnBlbmRpbmc7Cj4gKwljcnRjLT5wZW5k aW5nID0gZmFsc2U7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ss IGZsYWdzKTsKPiArCj4gKwlpZiAocGVuZGluZykKPiArCQlyY2FyX2R1X2NydGNfZmluaXNoX3Bh Z2VfZmxpcChjcnRjKTsKClRoaXMgc2VlbXMgdG8gZHVwbGljYXRlIHRoZSBzeW5jaHJvbml6YXRp b24gbWVjaGFuaXNtIGJhc2VkIG9uIGV2ZW50cyBpbiAKcmNhcl9kdV9jcnRjX2F0b21pY19iZWdp bigpLiBJIG5lZWQgdG8gY2hlY2sgdGhhdCBpbiBtb3JlIGRldGFpbHMuCgo+ICt9Cj4gKwo+ICB2 b2lkIHJjYXJfZHVfdnNwX2VuYWJsZShzdHJ1Y3QgcmNhcl9kdV9jcnRjICpjcnRjKQo+ICB7Cj4g IAljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSA9ICZjcnRjLT5jcnRjLnN0YXRl LQo+YWRqdXN0ZWRfbW9kZTsKPiBAQCAtMzUsNiArNTEsOCBAQCB2b2lkIHJjYXJfZHVfdnNwX2Vu YWJsZShzdHJ1Y3QgcmNhcl9kdV9jcnRjICpjcnRjKQo+ICAJc3RydWN0IHZzcDFfZHVfbGlmX2Nv bmZpZyBjZmcgPSB7Cj4gIAkJLndpZHRoID0gbW9kZS0+aGRpc3BsYXksCj4gIAkJLmhlaWdodCA9 IG1vZGUtPnZkaXNwbGF5LAo+ICsJCS5jYWxsYmFjayA9IHJjYXJfZHVfdnNwX2NvbXBsZXRlLAo+ ICsJCS5jYWxsYmFja19kYXRhID0gY3J0YywKPiAgCX07Cj4gIAlzdHJ1Y3QgcmNhcl9kdV9wbGFu ZV9zdGF0ZSBzdGF0ZSA9IHsKPiAgCQkuc3RhdGUgPSB7Cj4gQEAgLTg1LDYgKzEwMywxNyBAQCB2 b2lkIHJjYXJfZHVfdnNwX2F0b21pY19iZWdpbihzdHJ1Y3QgcmNhcl9kdV9jcnRjICpjcnRjKQo+ IAo+ICB2b2lkIHJjYXJfZHVfdnNwX2F0b21pY19mbHVzaChzdHJ1Y3QgcmNhcl9kdV9jcnRjICpj cnRjKQo+ICB7Cj4gKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+Y3J0Yy5kZXY7Cj4g Kwl1bnNpZ25lZCBsb25nIGZsYWdzOwo+ICsJYm9vbCBwZW5kaW5nOwo+ICsKPiArCXNwaW5fbG9j a19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKPiArCXBlbmRpbmcgPSBjcnRjLT5w ZW5kaW5nOwo+ICsJY3J0Yy0+cGVuZGluZyA9IHRydWU7Cj4gKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKPiArCj4gKwlXQVJOX09OKHBlbmRpbmcpOwo+ ICsKPiAgCXZzcDFfZHVfYXRvbWljX2ZsdXNoKGNydGMtPnZzcC0+dnNwKTsKPiAgfQoKLS0gClJl Z2FyZHMsCgpMYXVyZW50IFBpbmNoYXJ0CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5m cmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0 aW5mby9kcmktZGV2ZWwK