From mboxrd@z Thu Jan 1 00:00:00 1970 From: seanpaul@chromium.org (Sean Paul) Date: Thu, 10 Nov 2016 20:45:44 -0500 Subject: [PATCH v6 7/9] drm/hisilicon/hibmc: Add connector for VDAC In-Reply-To: <1477639682-22520-8-git-send-email-zourongrong@gmail.com> References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-8-git-send-email-zourongrong@gmail.com> Message-ID: To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org On Fri, Oct 28, 2016 at 3:28 AM, Rongrong Zou wrote: > Add connector funcs and helper funcs for VDAC. > > Signed-off-by: Rongrong Zou > --- > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c | 8 +++ > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h | 2 + > drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c | 76 ++++++++++++++++++++++++ > 3 files changed, 86 insertions(+) > > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > index ba191e1..4253603 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c > @@ -131,6 +131,14 @@ static int hibmc_kms_init(struct hibmc_drm_device *hidev) > return ret; > } > > + ret = hibmc_connector_init(hidev); > + if (ret) { > + DRM_ERROR("failed to init connector\n"); > + return ret; > + } > + > + drm_mode_connector_attach_encoder(&hidev->connector, > + &hidev->encoder); The connector should be initialized in the vdac driver with the encoder, not in the drv file (same as plane/crtc) > return 0; > } > > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > index 401cea4..450247d 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.h > @@ -48,6 +48,7 @@ struct hibmc_drm_device { > struct drm_plane plane; > struct drm_crtc crtc; > struct drm_encoder encoder; > + struct drm_connector connector; No need to keep track here > bool mode_config_initialized; > > /* ttm */ > @@ -89,6 +90,7 @@ static inline struct hibmc_bo *gem_to_hibmc_bo(struct drm_gem_object *gem) > int hibmc_plane_init(struct hibmc_drm_device *hidev); > int hibmc_crtc_init(struct hibmc_drm_device *hidev); > int hibmc_encoder_init(struct hibmc_drm_device *hidev); > +int hibmc_connector_init(struct hibmc_drm_device *hidev); > int hibmc_fbdev_init(struct hibmc_drm_device *hidev); > void hibmc_fbdev_fini(struct hibmc_drm_device *hidev); > > diff --git a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c > index 953f659..ebefcd1 100644 > --- a/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c > +++ b/drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_vdac.c > @@ -87,3 +87,79 @@ int hibmc_encoder_init(struct hibmc_drm_device *hidev) > drm_encoder_helper_add(encoder, &hibmc_encoder_helper_funcs); > return 0; > } > + > +static int hibmc_connector_get_modes(struct drm_connector *connector) > +{ > + int count; > + > + count = drm_add_modes_noedid(connector, 800, 600); > + drm_set_preferred_mode(connector, defx, defy); So you have defx/defy as module parameters, but then hardcode the 800x600 mode. If defx/defy is anything other than 800/600, this won't work. I think you should just remove the defx/defy module params and rely on userspace adding modes as appropriate. > + return count; > +} > + > +static int hibmc_connector_mode_valid(struct drm_connector *connector, > + struct drm_display_mode *mode) > +{ > + struct hibmc_drm_device *hiprivate = > + container_of(connector, struct hibmc_drm_device, connector); > + unsigned long size = mode->hdisplay * mode->vdisplay * 4; Why * 4 here and why * 2 below? You support formats less than 32 bpp, so the * 4 isn't necessarily correct for all formats. Is the * 2 to account for front & back buffer? > + > + if (size * 2 > hiprivate->fb_size) > + return MODE_BAD; > + > + return MODE_OK; > +} > + > +static struct drm_encoder * > +hibmc_connector_best_encoder(struct drm_connector *connector) > +{ > + int enc_id = connector->encoder_ids[0]; > + > + /* pick the encoder ids */ > + if (enc_id) > + return drm_encoder_find(connector->dev, enc_id); Can't you just do return drm_encoder_find(connector->dev, connector->encoder_ids[0]); ? ie: won't drm_encoder_find do the right thing if you pass in id == 0? > + > + return NULL; > +} > + > +static enum drm_connector_status hibmc_connector_detect(struct drm_connector > + *connector, bool force) > +{ > + return connector_status_connected; Perhaps this should be connector_status_unknown, since you don't necessarily know it's connected. > +} > + > +static const struct drm_connector_helper_funcs > + hibmc_connector_connector_helper_funcs = { > + .get_modes = hibmc_connector_get_modes, > + .mode_valid = hibmc_connector_mode_valid, > + .best_encoder = hibmc_connector_best_encoder, > +}; > + > +static const struct drm_connector_funcs hibmc_connector_connector_funcs = { > + .dpms = drm_atomic_helper_connector_dpms, > + .detect = hibmc_connector_detect, > + .fill_modes = drm_helper_probe_single_connector_modes, > + .destroy = drm_connector_cleanup, > + .reset = drm_atomic_helper_connector_reset, > + .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state, > + .atomic_destroy_state = drm_atomic_helper_connector_destroy_state, > +}; > + > +int hibmc_connector_init(struct hibmc_drm_device *hidev) > +{ > + struct drm_device *dev = hidev->dev; > + struct drm_connector *connector = &hidev->connector; > + int ret; > + > + ret = drm_connector_init(dev, connector, > + &hibmc_connector_connector_funcs, > + DRM_MODE_CONNECTOR_VGA); > + if (ret) { > + DRM_ERROR("failed to init connector\n"); > + return ret; > + } > + drm_connector_helper_add(connector, > + &hibmc_connector_connector_helper_funcs); > + > + return 0; > +} > -- > 1.9.1 > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel at lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Sean Paul Subject: Re: [PATCH v6 7/9] drm/hisilicon/hibmc: Add connector for VDAC Date: Thu, 10 Nov 2016 20:45:44 -0500 Message-ID: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-8-git-send-email-zourongrong@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-yb0-x22b.google.com (mail-yb0-x22b.google.com [IPv6:2607:f8b0:4002:c09::22b]) by gabe.freedesktop.org (Postfix) with ESMTPS id 80AF46E154 for ; Fri, 11 Nov 2016 01:46:07 +0000 (UTC) Received: by mail-yb0-x22b.google.com with SMTP id a184so1034070ybb.0 for ; Thu, 10 Nov 2016 17:46:07 -0800 (PST) Received: from mail-yw0-f180.google.com (mail-yw0-f180.google.com. [209.85.161.180]) by smtp.gmail.com with ESMTPSA id f187sm2645118ywe.47.2016.11.10.17.46.05 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 10 Nov 2016 17:46:05 -0800 (PST) Received: by mail-yw0-f180.google.com with SMTP id r204so2012743ywb.0 for ; Thu, 10 Nov 2016 17:46:05 -0800 (PST) In-Reply-To: <1477639682-22520-8-git-send-email-zourongrong@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Rongrong Zou Cc: Mark Rutland , shenhui@huawei.com, Tomeu Vizoso , Jonathan Corbet , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , guohanjun@huawei.com, Will Deacon , lijianhua@huawei.com, Linux ARM Kernel , james.xiong@huawei.com List-Id: dri-devel@lists.freedesktop.org T24gRnJpLCBPY3QgMjgsIDIwMTYgYXQgMzoyOCBBTSwgUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9u Z0BnbWFpbC5jb20+IHdyb3RlOgo+IEFkZCBjb25uZWN0b3IgZnVuY3MgYW5kIGhlbHBlciBmdW5j cyBmb3IgVkRBQy4KPgo+IFNpZ25lZC1vZmYtYnk6IFJvbmdyb25nIFpvdSA8em91cm9uZ3JvbmdA Z21haWwuY29tPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1j X2RybV9kcnYuYyAgfCAgOCArKysKPiAgZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9o aWJtY19kcm1fZHJ2LmggIHwgIDIgKwo+ICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV92ZGFjLmMgfCA3NiArKysrKysrKysrKysrKysrKysrKysrKysKPiAgMyBmaWxl cyBjaGFuZ2VkLCA4NiBpbnNlcnRpb25zKCspCj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMgYi9kcml2ZXJzL2dwdS9kcm0vaGlz aWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuYwo+IGluZGV4IGJhMTkxZTEuLjQyNTM2MDMgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2 LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYu Ywo+IEBAIC0xMzEsNiArMTMxLDE0IEBAIHN0YXRpYyBpbnQgaGlibWNfa21zX2luaXQoc3RydWN0 IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2KQo+ICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ ICAgICAgICAgfQo+Cj4gKyAgICAgICByZXQgPSBoaWJtY19jb25uZWN0b3JfaW5pdChoaWRldik7 Cj4gKyAgICAgICBpZiAocmV0KSB7Cj4gKyAgICAgICAgICAgICAgIERSTV9FUlJPUigiZmFpbGVk IHRvIGluaXQgY29ubmVjdG9yXG4iKTsKPiArICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAr ICAgICAgIH0KPiArCj4gKyAgICAgICBkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2VuY29kZXIo JmhpZGV2LT5jb25uZWN0b3IsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgJmhpZGV2LT5lbmNvZGVyKTsKClRoZSBjb25uZWN0b3Igc2hvdWxkIGJlIGluaXRpYWxp emVkIGluIHRoZSB2ZGFjIGRyaXZlciB3aXRoIHRoZQplbmNvZGVyLCBub3QgaW4gdGhlIGRydiBm aWxlIChzYW1lIGFzIHBsYW5lL2NydGMpCgo+ICAgICAgICAgcmV0dXJuIDA7Cj4gIH0KPgo+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYu aCBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5oCj4gaW5k ZXggNDAxY2VhNC4uNDUwMjQ3ZCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxp Y29uL2hpYm1jL2hpYm1jX2RybV9kcnYuaAo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGlj b24vaGlibWMvaGlibWNfZHJtX2Rydi5oCj4gQEAgLTQ4LDYgKzQ4LDcgQEAgc3RydWN0IGhpYm1j X2RybV9kZXZpY2Ugewo+ICAgICAgICAgc3RydWN0IGRybV9wbGFuZSBwbGFuZTsKPiAgICAgICAg IHN0cnVjdCBkcm1fY3J0YyBjcnRjOwo+ICAgICAgICAgc3RydWN0IGRybV9lbmNvZGVyIGVuY29k ZXI7Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7CgpObyBuZWVkIHRv IGtlZXAgdHJhY2sgaGVyZQoKPiAgICAgICAgIGJvb2wgbW9kZV9jb25maWdfaW5pdGlhbGl6ZWQ7 Cj4KPiAgICAgICAgIC8qIHR0bSAqLwo+IEBAIC04OSw2ICs5MCw3IEBAIHN0YXRpYyBpbmxpbmUg c3RydWN0IGhpYm1jX2JvICpnZW1fdG9faGlibWNfYm8oc3RydWN0IGRybV9nZW1fb2JqZWN0ICpn ZW0pCj4gIGludCBoaWJtY19wbGFuZV9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRl dik7Cj4gIGludCBoaWJtY19jcnRjX2luaXQoc3RydWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2 KTsKPiAgaW50IGhpYm1jX2VuY29kZXJfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlk ZXYpOwo+ICtpbnQgaGlibWNfY29ubmVjdG9yX2luaXQoc3RydWN0IGhpYm1jX2RybV9kZXZpY2Ug KmhpZGV2KTsKPiAgaW50IGhpYm1jX2ZiZGV2X2luaXQoc3RydWN0IGhpYm1jX2RybV9kZXZpY2Ug KmhpZGV2KTsKPiAgdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJtY19kcm1fZGV2aWNl ICpoaWRldik7Cj4KPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJt Yy9oaWJtY19kcm1fdmRhYy5jIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJt Y19kcm1fdmRhYy5jCj4gaW5kZXggOTUzZjY1OS4uZWJlZmNkMSAxMDA2NDQKPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV92ZGFjLmMKPiArKysgYi9kcml2 ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV92ZGFjLmMKPiBAQCAtODcsMyAr ODcsNzkgQEAgaW50IGhpYm1jX2VuY29kZXJfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAq aGlkZXYpCj4gICAgICAgICBkcm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZoaWJtY19l bmNvZGVyX2hlbHBlcl9mdW5jcyk7Cj4gICAgICAgICByZXR1cm4gMDsKPiAgfQo+ICsKPiArc3Rh dGljIGludCBoaWJtY19jb25uZWN0b3JfZ2V0X21vZGVzKHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IpCj4gK3sKPiArICAgICAgIGludCBjb3VudDsKPiArCj4gKyAgICAgICBjb3VudCA9 IGRybV9hZGRfbW9kZXNfbm9lZGlkKGNvbm5lY3RvciwgODAwLCA2MDApOwo+ICsgICAgICAgZHJt X3NldF9wcmVmZXJyZWRfbW9kZShjb25uZWN0b3IsIGRlZngsIGRlZnkpOwoKU28geW91IGhhdmUg ZGVmeC9kZWZ5IGFzIG1vZHVsZSBwYXJhbWV0ZXJzLCBidXQgdGhlbiBoYXJkY29kZSB0aGUKODAw eDYwMCBtb2RlLiBJZiBkZWZ4L2RlZnkgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiA4MDAvNjAwLCB0 aGlzIHdvbid0CndvcmsuIEkgdGhpbmsgeW91IHNob3VsZCBqdXN0IHJlbW92ZSB0aGUgZGVmeC9k ZWZ5IG1vZHVsZSBwYXJhbXMgYW5kCnJlbHkgb24gdXNlcnNwYWNlIGFkZGluZyBtb2RlcyBhcyBh cHByb3ByaWF0ZS4KCj4gKyAgICAgICByZXR1cm4gY291bnQ7Cj4gK30KPiArCj4gK3N0YXRpYyBp bnQgaGlibWNfY29ubmVjdG9yX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICptb2RlKQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgaGlibWNfZHJtX2Rldmlj ZSAqaGlwcml2YXRlID0KPiArICAgICAgICBjb250YWluZXJfb2YoY29ubmVjdG9yLCBzdHJ1Y3Qg aGlibWNfZHJtX2RldmljZSwgY29ubmVjdG9yKTsKPiArICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6 ZSA9IG1vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXkgKiA0OwoKV2h5ICogNCBoZXJlIGFu ZCB3aHkgKiAyIGJlbG93PyBZb3Ugc3VwcG9ydCBmb3JtYXRzIGxlc3MgdGhhbiAzMiBicHAsCnNv IHRoZSAqIDQgaXNuJ3QgbmVjZXNzYXJpbHkgY29ycmVjdCBmb3IgYWxsIGZvcm1hdHMuIElzIHRo ZSAqIDIgdG8KYWNjb3VudCBmb3IgZnJvbnQgJiBiYWNrIGJ1ZmZlcj8KCgo+ICsKPiArICAgICAg IGlmIChzaXplICogMiA+IGhpcHJpdmF0ZS0+ZmJfc2l6ZSkKPiArICAgICAgICAgICAgICAgcmV0 dXJuIE1PREVfQkFEOwo+ICsKPiArICAgICAgIHJldHVybiBNT0RFX09LOwo+ICt9Cj4gKwo+ICtz dGF0aWMgc3RydWN0IGRybV9lbmNvZGVyICoKPiAraGlibWNfY29ubmVjdG9yX2Jlc3RfZW5jb2Rl cihzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+ICt7Cj4gKyAgICAgICBpbnQgZW5j X2lkID0gY29ubmVjdG9yLT5lbmNvZGVyX2lkc1swXTsKPiArCj4gKyAgICAgICAvKiBwaWNrIHRo ZSBlbmNvZGVyIGlkcyAqLwo+ICsgICAgICAgaWYgKGVuY19pZCkKPiArICAgICAgICAgICAgICAg cmV0dXJuIGRybV9lbmNvZGVyX2ZpbmQoY29ubmVjdG9yLT5kZXYsIGVuY19pZCk7CgpDYW4ndCB5 b3UganVzdCBkbyByZXR1cm4gZHJtX2VuY29kZXJfZmluZChjb25uZWN0b3ItPmRldiwKY29ubmVj dG9yLT5lbmNvZGVyX2lkc1swXSk7ID8KCmllOiB3b24ndCBkcm1fZW5jb2Rlcl9maW5kIGRvIHRo ZSByaWdodCB0aGluZyBpZiB5b3UgcGFzcyBpbiBpZCA9PSAwPwoKPiArCj4gKyAgICAgICByZXR1 cm4gTlVMTDsKPiArfQo+ICsKPiArc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgaGli bWNfY29ubmVjdG9yX2RldGVjdChzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcgo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY29ubmVjdG9yLCBib29sIGZvcmNl KQo+ICt7Cj4gKyAgICAgICByZXR1cm4gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CgpQZXJo YXBzIHRoaXMgc2hvdWxkIGJlIGNvbm5lY3Rvcl9zdGF0dXNfdW5rbm93biwgc2luY2UgeW91IGRv bid0Cm5lY2Vzc2FyaWx5IGtub3cgaXQncyBjb25uZWN0ZWQuCgo+ICt9Cj4gKwo+ICtzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3JfaGVscGVyX2Z1bmNzCj4gKyAgICAgICBoaWJtY19j b25uZWN0b3JfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyA9IHsKPiArICAgICAgIC5nZXRfbW9kZXMg PSBoaWJtY19jb25uZWN0b3JfZ2V0X21vZGVzLAo+ICsgICAgICAgLm1vZGVfdmFsaWQgPSBoaWJt Y19jb25uZWN0b3JfbW9kZV92YWxpZCwKPiArICAgICAgIC5iZXN0X2VuY29kZXIgPSBoaWJtY19j b25uZWN0b3JfYmVzdF9lbmNvZGVyLAo+ICt9Owo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBk cm1fY29ubmVjdG9yX2Z1bmNzIGhpYm1jX2Nvbm5lY3Rvcl9jb25uZWN0b3JfZnVuY3MgPSB7Cj4g KyAgICAgICAuZHBtcyA9IGRybV9hdG9taWNfaGVscGVyX2Nvbm5lY3Rvcl9kcG1zLAo+ICsgICAg ICAgLmRldGVjdCA9IGhpYm1jX2Nvbm5lY3Rvcl9kZXRlY3QsCj4gKyAgICAgICAuZmlsbF9tb2Rl cyA9IGRybV9oZWxwZXJfcHJvYmVfc2luZ2xlX2Nvbm5lY3Rvcl9tb2RlcywKPiArICAgICAgIC5k ZXN0cm95ID0gZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwLAo+ICsgICAgICAgLnJlc2V0ID0gZHJtX2F0 b21pY19oZWxwZXJfY29ubmVjdG9yX3Jlc2V0LAo+ICsgICAgICAgLmF0b21pY19kdXBsaWNhdGVf c3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZHVwbGljYXRlX3N0YXRlLAo+ICsg ICAgICAgLmF0b21pY19kZXN0cm95X3N0YXRlID0gZHJtX2F0b21pY19oZWxwZXJfY29ubmVjdG9y X2Rlc3Ryb3lfc3RhdGUsCj4gK307Cj4gKwo+ICtpbnQgaGlibWNfY29ubmVjdG9yX2luaXQoc3Ry dWN0IGhpYm1jX2RybV9kZXZpY2UgKmhpZGV2KQo+ICt7Cj4gKyAgICAgICBzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2ID0gaGlkZXYtPmRldjsKPiArICAgICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IgPSAmaGlkZXYtPmNvbm5lY3RvcjsKPiArICAgICAgIGludCByZXQ7Cj4gKwo+ICsg ICAgICAgcmV0ID0gZHJtX2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLAo+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICZoaWJtY19jb25uZWN0b3JfY29ubmVjdG9yX2Z1bmNz LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSTV9NT0RFX0NPTk5FQ1RPUl9W R0EpOwo+ICsgICAgICAgaWYgKHJldCkgewo+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZh aWxlZCB0byBpbml0IGNvbm5lY3RvclxuIik7Cj4gKyAgICAgICAgICAgICAgIHJldHVybiByZXQ7 Cj4gKyAgICAgICB9Cj4gKyAgICAgICBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVjdG9y LAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoaWJtY19jb25uZWN0b3JfY29u bmVjdG9yX2hlbHBlcl9mdW5jcyk7Cj4gKwo+ICsgICAgICAgcmV0dXJuIDA7Cj4gK30KPiAtLQo+ IDEuOS4xCj4KPgo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCj4gbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKPiBsaW51eC1hcm0ta2VybmVsQGxp c3RzLmluZnJhZGVhZC5vcmcKPiBodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xp c3RpbmZvL2xpbnV4LWFybS1rZXJuZWwKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJl ZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGlu Zm8vZHJpLWRldmVsCg==