From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753455AbdLMQMY (ORCPT ); Wed, 13 Dec 2017 11:12:24 -0500 Received: from mail-wm0-f66.google.com ([74.125.82.66]:37230 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751026AbdLMQMW (ORCPT ); Wed, 13 Dec 2017 11:12:22 -0500 X-Google-Smtp-Source: ACJfBouIM46gCqFFuUs8GEzkTComl4KWmtLpDOqHDC13QOyEIEyh+WwFaQn3e06MQMEJY0ZPJS3QGg== Subject: Re: [PATCH 7/8] drm/sun4i: sun4i_layer: Add a custom atomic_check for the frontend To: Maxime Ripard , Daniel Vetter , David Airlie , Chen-Yu Tsai Cc: linux-arm-kernel@lists.infradead.org, Thomas Petazzoni , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, thomas@vitsch.nl References: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> From: Neil Armstrong Organization: Baylibre Message-ID: Date: Wed, 13 Dec 2017 17:12:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 13/12/2017 16:33, Maxime Ripard wrote: > Now that we have everything in place, we can start enabling the frontend. > This is more difficult than one would assume since there can only be one > plane using the frontend per-backend. > > We therefore need to make sure that the userspace will not try to setup > multiple planes using it, since that would be impossible. In order to > prevent that, we can create an atomic_check callback that will check that > only one plane will effectively make use of the frontend in a given > configuration, and will toggle the switch in that plane state so that the > proper setup function can do their role. > > Signed-off-by: Maxime Ripard > --- > drivers/gpu/drm/sun4i/sun4i_backend.c | 65 ++++++++++++++++++++++++++++- > drivers/gpu/drm/sun4i/sun4i_backend.h | 2 +- > 2 files changed, 67 insertions(+) > > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c > index f1d19767c55d..a7b87a12990e 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_backend.c > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c > @@ -11,6 +11,7 @@ > */ > > #include > +#include > #include > #include > #include > @@ -271,6 +272,69 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, > return 0; > } > > +static bool sun4i_backend_plane_uses_scaler(struct drm_plane_state *state) > +{ > + u16 src_h = state->src_h >> 16; > + u16 src_w = state->src_w >> 16; > + > + DRM_DEBUG_DRIVER("Input size %dx%d, output size %dx%d\n", > + src_w, src_h, state->crtc_w, state->crtc_h); > + > + if ((state->crtc_h != src_h) || (state->crtc_w != src_w)) > + return true; > + > + return false; > +} > + > +static bool sun4i_backend_plane_uses_frontend(struct drm_plane_state *state) > +{ > + struct sun4i_layer *layer = plane_to_sun4i_layer(state->plane); > + struct sun4i_backend *backend = layer->backend; > + > + if (IS_ERR(backend->frontend)) > + return false; > + > + return sun4i_backend_plane_uses_scaler(state); > +} > + > +static int sun4i_backend_atomic_check(struct sunxi_engine *engine, > + struct drm_crtc_state *crtc_state) > +{ > + struct drm_atomic_state *state = crtc_state->state; > + struct drm_device *drm = state->dev; > + struct drm_plane *plane; > + unsigned int num_frontend_planes = 0; > + > + DRM_DEBUG_DRIVER("Starting checking our planes\n"); > + > + if (!crtc_state->planes_changed) > + return 0; > + > + drm_for_each_plane_mask(plane, drm, crtc_state->plane_mask) { > + struct drm_plane_state *plane_state = > + drm_atomic_get_plane_state(state, plane); > + struct sun4i_layer_state *layer_state = > + state_to_sun4i_layer_state(plane_state); > + > + if (sun4i_backend_plane_uses_frontend(plane_state)) { > + DRM_DEBUG_DRIVER("Using the frontend for plane %d\n", > + plane->index); > + > + layer_state->uses_frontend = true; > + num_frontend_planes++; > + } else { > + layer_state->uses_frontend = false; > + } > + } > + > + if (num_frontend_planes > SUN4I_BACKEND_NUM_FRONTEND_LAYERS) { > + DRM_DEBUG_DRIVER("Too many planes going through the frontend, rejecting\n"); > + return -EINVAL; > + } > + > + return 0; > +} > + > static int sun4i_backend_init_sat(struct device *dev) { > struct sun4i_backend *backend = dev_get_drvdata(dev); > int ret; > @@ -384,6 +448,7 @@ static struct sun4i_frontend *sun4i_backend_find_frontend(struct sun4i_drv *drv, > } > > static const struct sunxi_engine_ops sun4i_backend_engine_ops = { > + .atomic_check = sun4i_backend_atomic_check, > .commit = sun4i_backend_commit, > .layers_init = sun4i_layers_init, > .apply_color_correction = sun4i_backend_apply_color_correction, > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.h b/drivers/gpu/drm/sun4i/sun4i_backend.h > index 636a51521e77..3b5531440fa3 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_backend.h > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.h > @@ -144,6 +144,8 @@ > #define SUN4I_BACKEND_HWCCOLORTAB_OFF 0x4c00 > #define SUN4I_BACKEND_PIPE_OFF(p) (0x5000 + (0x400 * (p))) > > +#define SUN4I_BACKEND_NUM_FRONTEND_LAYERS 1 > + > struct sun4i_backend { > struct sunxi_engine engine; > struct sun4i_frontend *frontend; > Reviewed-by: Neil Armstrong From mboxrd@z Thu Jan 1 00:00:00 1970 From: narmstrong@baylibre.com (Neil Armstrong) Date: Wed, 13 Dec 2017 17:12:20 +0100 Subject: [PATCH 7/8] drm/sun4i: sun4i_layer: Add a custom atomic_check for the frontend In-Reply-To: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> References: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On 13/12/2017 16:33, Maxime Ripard wrote: > Now that we have everything in place, we can start enabling the frontend. > This is more difficult than one would assume since there can only be one > plane using the frontend per-backend. > > We therefore need to make sure that the userspace will not try to setup > multiple planes using it, since that would be impossible. In order to > prevent that, we can create an atomic_check callback that will check that > only one plane will effectively make use of the frontend in a given > configuration, and will toggle the switch in that plane state so that the > proper setup function can do their role. > > Signed-off-by: Maxime Ripard > --- > drivers/gpu/drm/sun4i/sun4i_backend.c | 65 ++++++++++++++++++++++++++++- > drivers/gpu/drm/sun4i/sun4i_backend.h | 2 +- > 2 files changed, 67 insertions(+) > > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.c b/drivers/gpu/drm/sun4i/sun4i_backend.c > index f1d19767c55d..a7b87a12990e 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_backend.c > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.c > @@ -11,6 +11,7 @@ > */ > > #include > +#include > #include > #include > #include > @@ -271,6 +272,69 @@ int sun4i_backend_update_layer_buffer(struct sun4i_backend *backend, > return 0; > } > > +static bool sun4i_backend_plane_uses_scaler(struct drm_plane_state *state) > +{ > + u16 src_h = state->src_h >> 16; > + u16 src_w = state->src_w >> 16; > + > + DRM_DEBUG_DRIVER("Input size %dx%d, output size %dx%d\n", > + src_w, src_h, state->crtc_w, state->crtc_h); > + > + if ((state->crtc_h != src_h) || (state->crtc_w != src_w)) > + return true; > + > + return false; > +} > + > +static bool sun4i_backend_plane_uses_frontend(struct drm_plane_state *state) > +{ > + struct sun4i_layer *layer = plane_to_sun4i_layer(state->plane); > + struct sun4i_backend *backend = layer->backend; > + > + if (IS_ERR(backend->frontend)) > + return false; > + > + return sun4i_backend_plane_uses_scaler(state); > +} > + > +static int sun4i_backend_atomic_check(struct sunxi_engine *engine, > + struct drm_crtc_state *crtc_state) > +{ > + struct drm_atomic_state *state = crtc_state->state; > + struct drm_device *drm = state->dev; > + struct drm_plane *plane; > + unsigned int num_frontend_planes = 0; > + > + DRM_DEBUG_DRIVER("Starting checking our planes\n"); > + > + if (!crtc_state->planes_changed) > + return 0; > + > + drm_for_each_plane_mask(plane, drm, crtc_state->plane_mask) { > + struct drm_plane_state *plane_state = > + drm_atomic_get_plane_state(state, plane); > + struct sun4i_layer_state *layer_state = > + state_to_sun4i_layer_state(plane_state); > + > + if (sun4i_backend_plane_uses_frontend(plane_state)) { > + DRM_DEBUG_DRIVER("Using the frontend for plane %d\n", > + plane->index); > + > + layer_state->uses_frontend = true; > + num_frontend_planes++; > + } else { > + layer_state->uses_frontend = false; > + } > + } > + > + if (num_frontend_planes > SUN4I_BACKEND_NUM_FRONTEND_LAYERS) { > + DRM_DEBUG_DRIVER("Too many planes going through the frontend, rejecting\n"); > + return -EINVAL; > + } > + > + return 0; > +} > + > static int sun4i_backend_init_sat(struct device *dev) { > struct sun4i_backend *backend = dev_get_drvdata(dev); > int ret; > @@ -384,6 +448,7 @@ static struct sun4i_frontend *sun4i_backend_find_frontend(struct sun4i_drv *drv, > } > > static const struct sunxi_engine_ops sun4i_backend_engine_ops = { > + .atomic_check = sun4i_backend_atomic_check, > .commit = sun4i_backend_commit, > .layers_init = sun4i_layers_init, > .apply_color_correction = sun4i_backend_apply_color_correction, > diff --git a/drivers/gpu/drm/sun4i/sun4i_backend.h b/drivers/gpu/drm/sun4i/sun4i_backend.h > index 636a51521e77..3b5531440fa3 100644 > --- a/drivers/gpu/drm/sun4i/sun4i_backend.h > +++ b/drivers/gpu/drm/sun4i/sun4i_backend.h > @@ -144,6 +144,8 @@ > #define SUN4I_BACKEND_HWCCOLORTAB_OFF 0x4c00 > #define SUN4I_BACKEND_PIPE_OFF(p) (0x5000 + (0x400 * (p))) > > +#define SUN4I_BACKEND_NUM_FRONTEND_LAYERS 1 > + > struct sun4i_backend { > struct sunxi_engine engine; > struct sun4i_frontend *frontend; > Reviewed-by: Neil Armstrong From mboxrd@z Thu Jan 1 00:00:00 1970 From: Neil Armstrong Subject: Re: [PATCH 7/8] drm/sun4i: sun4i_layer: Add a custom atomic_check for the frontend Date: Wed, 13 Dec 2017 17:12:20 +0100 Message-ID: References: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x241.google.com (mail-wm0-x241.google.com [IPv6:2a00:1450:400c:c09::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 35B706E524 for ; Wed, 13 Dec 2017 16:12:23 +0000 (UTC) Received: by mail-wm0-x241.google.com with SMTP id f9so6242178wmh.0 for ; Wed, 13 Dec 2017 08:12:22 -0800 (PST) In-Reply-To: <4fbc349e2c3aa2efeadb55ea120c64b56c707cb4.1513178989.git-series.maxime.ripard@free-electrons.com> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Maxime Ripard , Daniel Vetter , David Airlie , Chen-Yu Tsai Cc: Thomas Petazzoni , dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, thomas@vitsch.nl List-Id: dri-devel@lists.freedesktop.org T24gMTMvMTIvMjAxNyAxNjozMywgTWF4aW1lIFJpcGFyZCB3cm90ZToKPiBOb3cgdGhhdCB3ZSBo YXZlIGV2ZXJ5dGhpbmcgaW4gcGxhY2UsIHdlIGNhbiBzdGFydCBlbmFibGluZyB0aGUgZnJvbnRl bmQuCj4gVGhpcyBpcyBtb3JlIGRpZmZpY3VsdCB0aGFuIG9uZSB3b3VsZCBhc3N1bWUgc2luY2Ug dGhlcmUgY2FuIG9ubHkgYmUgb25lCj4gcGxhbmUgdXNpbmcgdGhlIGZyb250ZW5kIHBlci1iYWNr ZW5kLgo+IAo+IFdlIHRoZXJlZm9yZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB1c2Vyc3Bh Y2Ugd2lsbCBub3QgdHJ5IHRvIHNldHVwCj4gbXVsdGlwbGUgcGxhbmVzIHVzaW5nIGl0LCBzaW5j ZSB0aGF0IHdvdWxkIGJlIGltcG9zc2libGUuIEluIG9yZGVyIHRvCj4gcHJldmVudCB0aGF0LCB3 ZSBjYW4gY3JlYXRlIGFuIGF0b21pY19jaGVjayBjYWxsYmFjayB0aGF0IHdpbGwgY2hlY2sgdGhh dAo+IG9ubHkgb25lIHBsYW5lIHdpbGwgZWZmZWN0aXZlbHkgbWFrZSB1c2Ugb2YgdGhlIGZyb250 ZW5kIGluIGEgZ2l2ZW4KPiBjb25maWd1cmF0aW9uLCBhbmQgd2lsbCB0b2dnbGUgdGhlIHN3aXRj aCBpbiB0aGF0IHBsYW5lIHN0YXRlIHNvIHRoYXQgdGhlCj4gcHJvcGVyIHNldHVwIGZ1bmN0aW9u IGNhbiBkbyB0aGVpciByb2xlLgo+IAo+IFNpZ25lZC1vZmYtYnk6IE1heGltZSBSaXBhcmQgPG1h eGltZS5yaXBhcmRAZnJlZS1lbGVjdHJvbnMuY29tPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0v c3VuNGkvc3VuNGlfYmFja2VuZC5jIHwgNjUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0K PiAgZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRpX2JhY2tlbmQuaCB8ICAyICstCj4gIDIgZmls ZXMgY2hhbmdlZCwgNjcgaW5zZXJ0aW9ucygrKQo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vc3VuNGkvc3VuNGlfYmFja2VuZC5jIGIvZHJpdmVycy9ncHUvZHJtL3N1bjRpL3N1bjRp X2JhY2tlbmQuYwo+IGluZGV4IGYxZDE5NzY3YzU1ZC4uYTdiODdhMTI5OTBlIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9iYWNrZW5kLmMKPiArKysgYi9kcml2ZXJz L2dwdS9kcm0vc3VuNGkvc3VuNGlfYmFja2VuZC5jCj4gQEAgLTExLDYgKzExLDcgQEAKPiAgICov Cj4gIAo+ICAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fYXRvbWlj Lmg+Cj4gICNpbmNsdWRlIDxkcm0vZHJtX2F0b21pY19oZWxwZXIuaD4KPiAgI2luY2x1ZGUgPGRy bS9kcm1fY3J0Yy5oPgo+ICAjaW5jbHVkZSA8ZHJtL2RybV9jcnRjX2hlbHBlci5oPgo+IEBAIC0y NzEsNiArMjcyLDY5IEBAIGludCBzdW40aV9iYWNrZW5kX3VwZGF0ZV9sYXllcl9idWZmZXIoc3Ry dWN0IHN1bjRpX2JhY2tlbmQgKmJhY2tlbmQsCj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAKPiArc3Rh dGljIGJvb2wgc3VuNGlfYmFja2VuZF9wbGFuZV91c2VzX3NjYWxlcihzdHJ1Y3QgZHJtX3BsYW5l X3N0YXRlICpzdGF0ZSkKPiArewo+ICsJdTE2IHNyY19oID0gc3RhdGUtPnNyY19oID4+IDE2Owo+ ICsJdTE2IHNyY193ID0gc3RhdGUtPnNyY193ID4+IDE2Owo+ICsKPiArCURSTV9ERUJVR19EUklW RVIoIklucHV0IHNpemUgJWR4JWQsIG91dHB1dCBzaXplICVkeCVkXG4iLAo+ICsJCQkgc3JjX3cs IHNyY19oLCBzdGF0ZS0+Y3J0Y193LCBzdGF0ZS0+Y3J0Y19oKTsKPiArCj4gKwlpZiAoKHN0YXRl LT5jcnRjX2ggIT0gc3JjX2gpIHx8IChzdGF0ZS0+Y3J0Y193ICE9IHNyY193KSkKPiArCQlyZXR1 cm4gdHJ1ZTsKPiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBib29sIHN1 bjRpX2JhY2tlbmRfcGxhbmVfdXNlc19mcm9udGVuZChzdHJ1Y3QgZHJtX3BsYW5lX3N0YXRlICpz dGF0ZSkKPiArewo+ICsJc3RydWN0IHN1bjRpX2xheWVyICpsYXllciA9IHBsYW5lX3RvX3N1bjRp X2xheWVyKHN0YXRlLT5wbGFuZSk7Cj4gKwlzdHJ1Y3Qgc3VuNGlfYmFja2VuZCAqYmFja2VuZCA9 IGxheWVyLT5iYWNrZW5kOwo+ICsKPiArCWlmIChJU19FUlIoYmFja2VuZC0+ZnJvbnRlbmQpKQo+ ICsJCXJldHVybiBmYWxzZTsKPiArCj4gKwlyZXR1cm4gc3VuNGlfYmFja2VuZF9wbGFuZV91c2Vz X3NjYWxlcihzdGF0ZSk7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgc3VuNGlfYmFja2VuZF9hdG9t aWNfY2hlY2soc3RydWN0IHN1bnhpX2VuZ2luZSAqZW5naW5lLAo+ICsJCQkJICAgICAgc3RydWN0 IGRybV9jcnRjX3N0YXRlICpjcnRjX3N0YXRlKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJtX2F0b21pY19z dGF0ZSAqc3RhdGUgPSBjcnRjX3N0YXRlLT5zdGF0ZTsKPiArCXN0cnVjdCBkcm1fZGV2aWNlICpk cm0gPSBzdGF0ZS0+ZGV2Owo+ICsJc3RydWN0IGRybV9wbGFuZSAqcGxhbmU7Cj4gKwl1bnNpZ25l ZCBpbnQgbnVtX2Zyb250ZW5kX3BsYW5lcyA9IDA7Cj4gKwo+ICsJRFJNX0RFQlVHX0RSSVZFUigi U3RhcnRpbmcgY2hlY2tpbmcgb3VyIHBsYW5lc1xuIik7Cj4gKwo+ICsJaWYgKCFjcnRjX3N0YXRl LT5wbGFuZXNfY2hhbmdlZCkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlkcm1fZm9yX2VhY2hfcGxh bmVfbWFzayhwbGFuZSwgZHJtLCBjcnRjX3N0YXRlLT5wbGFuZV9tYXNrKSB7Cj4gKwkJc3RydWN0 IGRybV9wbGFuZV9zdGF0ZSAqcGxhbmVfc3RhdGUgPQo+ICsJCQlkcm1fYXRvbWljX2dldF9wbGFu ZV9zdGF0ZShzdGF0ZSwgcGxhbmUpOwo+ICsJCXN0cnVjdCBzdW40aV9sYXllcl9zdGF0ZSAqbGF5 ZXJfc3RhdGUgPQo+ICsJCQlzdGF0ZV90b19zdW40aV9sYXllcl9zdGF0ZShwbGFuZV9zdGF0ZSk7 Cj4gKwo+ICsJCWlmIChzdW40aV9iYWNrZW5kX3BsYW5lX3VzZXNfZnJvbnRlbmQocGxhbmVfc3Rh dGUpKSB7Cj4gKwkJCURSTV9ERUJVR19EUklWRVIoIlVzaW5nIHRoZSBmcm9udGVuZCBmb3IgcGxh bmUgJWRcbiIsCj4gKwkJCQkJIHBsYW5lLT5pbmRleCk7Cj4gKwo+ICsJCQlsYXllcl9zdGF0ZS0+ dXNlc19mcm9udGVuZCA9IHRydWU7Cj4gKwkJCW51bV9mcm9udGVuZF9wbGFuZXMrKzsKPiArCQl9 IGVsc2Ugewo+ICsJCQlsYXllcl9zdGF0ZS0+dXNlc19mcm9udGVuZCA9IGZhbHNlOwo+ICsJCX0K PiArCX0KPiArCj4gKwlpZiAobnVtX2Zyb250ZW5kX3BsYW5lcyA+IFNVTjRJX0JBQ0tFTkRfTlVN X0ZST05URU5EX0xBWUVSUykgewo+ICsJCURSTV9ERUJVR19EUklWRVIoIlRvbyBtYW55IHBsYW5l cyBnb2luZyB0aHJvdWdoIHRoZSBmcm9udGVuZCwgcmVqZWN0aW5nXG4iKTsKPiArCQlyZXR1cm4g LUVJTlZBTDsKPiArCX0KPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiAgc3RhdGljIGludCBz dW40aV9iYWNrZW5kX2luaXRfc2F0KHN0cnVjdCBkZXZpY2UgKmRldikgewo+ICAJc3RydWN0IHN1 bjRpX2JhY2tlbmQgKmJhY2tlbmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKPiAgCWludCByZXQ7 Cj4gQEAgLTM4NCw2ICs0NDgsNyBAQCBzdGF0aWMgc3RydWN0IHN1bjRpX2Zyb250ZW5kICpzdW40 aV9iYWNrZW5kX2ZpbmRfZnJvbnRlbmQoc3RydWN0IHN1bjRpX2RydiAqZHJ2LAo+ICB9Cj4gIAo+ ICBzdGF0aWMgY29uc3Qgc3RydWN0IHN1bnhpX2VuZ2luZV9vcHMgc3VuNGlfYmFja2VuZF9lbmdp bmVfb3BzID0gewo+ICsJLmF0b21pY19jaGVjawkJCT0gc3VuNGlfYmFja2VuZF9hdG9taWNfY2hl Y2ssCj4gIAkuY29tbWl0CQkJCT0gc3VuNGlfYmFja2VuZF9jb21taXQsCj4gIAkubGF5ZXJzX2lu aXQJCQk9IHN1bjRpX2xheWVyc19pbml0LAo+ICAJLmFwcGx5X2NvbG9yX2NvcnJlY3Rpb24JCT0g c3VuNGlfYmFja2VuZF9hcHBseV9jb2xvcl9jb3JyZWN0aW9uLAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfYmFja2VuZC5oIGIvZHJpdmVycy9ncHUvZHJtL3N1bjRp L3N1bjRpX2JhY2tlbmQuaAo+IGluZGV4IDYzNmE1MTUyMWU3Ny4uM2I1NTMxNDQwZmEzIDEwMDY0 NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9zdW40aS9zdW40aV9iYWNrZW5kLmgKPiArKysgYi9k cml2ZXJzL2dwdS9kcm0vc3VuNGkvc3VuNGlfYmFja2VuZC5oCj4gQEAgLTE0NCw2ICsxNDQsOCBA QAo+ICAjZGVmaW5lIFNVTjRJX0JBQ0tFTkRfSFdDQ09MT1JUQUJfT0ZGCQkweDRjMDAKPiAgI2Rl ZmluZSBTVU40SV9CQUNLRU5EX1BJUEVfT0ZGKHApCQkoMHg1MDAwICsgKDB4NDAwICogKHApKSkK PiAgCj4gKyNkZWZpbmUgU1VONElfQkFDS0VORF9OVU1fRlJPTlRFTkRfTEFZRVJTCTEKPiArCj4g IHN0cnVjdCBzdW40aV9iYWNrZW5kIHsKPiAgCXN0cnVjdCBzdW54aV9lbmdpbmUJZW5naW5lOwo+ ICAJc3RydWN0IHN1bjRpX2Zyb250ZW5kCSpmcm9udGVuZDsKPiAKClJldmlld2VkLWJ5OiBOZWls IEFybXN0cm9uZyA8bmFybXN0cm9uZ0BiYXlsaWJyZS5jb20+Cl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=