From mboxrd@z Thu Jan 1 00:00:00 1970 From: zourongrong@huawei.com (Rongrong Zou) Date: Mon, 14 Nov 2016 22:07:30 +0800 Subject: [PATCH v6 7/9] drm/hisilicon/hibmc: Add connector for VDAC In-Reply-To: References: <1477639682-22520-1-git-send-email-zourongrong@gmail.com> <1477639682-22520-8-git-send-email-zourongrong@gmail.com> Message-ID: <5829C522.1040908@huawei.com> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org ? 2016/11/11 9:45, Sean Paul ??: > 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) applied, thanks. > >> 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 will allocate with devm_kzalloc(), thanks. > >> 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. will remove them, thanks. > >> + 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? > it is from bochs, the original comments below: /* * Make sure we can fit two framebuffers into video memory. * This allows up to 1600x1200 with 16 MB (default size). * If you want more try this: * 'qemu -vga std -global VGA.vgamem_mb=32 $otherargs' */ i think it is not necessary for hibmc, so will remove it and return MODE_OK, thanks. > >> + >> + 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? hibmc_connector_best_encoder(struct drm_connector *connector) { return drm_encoder_find(connector->dev, connector->encoder_ids[0]); } looks more simple, i like it, thanks:) > >> + >> + 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. it is always connected in hibmc's scenario, usually it is used as a management chip on server, we use KVM(keyboard, mouse, video) rather than a directly connected monitor. I will modify if a phisical monitor is connected later. > >> +} >> + >> +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 > _______________________________________________ > linuxarm mailing list > linuxarm at huawei.com > http://rnd-openeuler.huawei.com/mailman/listinfo/linuxarm > > . > -- Regards, Rongrong From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rongrong Zou Subject: Re: [PATCH v6 7/9] drm/hisilicon/hibmc: Add connector for VDAC Date: Mon, 14 Nov 2016 22:07:30 +0800 Message-ID: <5829C522.1040908@huawei.com> 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"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: Sean Paul , Rongrong Zou Cc: Mark Rutland , Archit , shenhui@huawei.com, Tomeu Vizoso , Jonathan Corbet , Dave Airlie , catalin.marinas@arm.com, Emil Velikov , linuxarm@huawei.com, dri-devel , Xinliang Liu , james.xiong@huawei.com, Daniel Stone , Daniel Vetter , Will Deacon , lijianhua@huawei.com, Linux ARM Kernel , Benjamin Gaignard List-Id: dri-devel@lists.freedesktop.org 5ZyoIDIwMTYvMTEvMTEgOTo0NSwgU2VhbiBQYXVsIOWGmemBkzoKPiBPbiBGcmksIE9jdCAyOCwg MjAxNiBhdCAzOjI4IEFNLCBSb25ncm9uZyBab3UgPHpvdXJvbmdyb25nQGdtYWlsLmNvbT4gd3Jv dGU6Cj4+IEFkZCBjb25uZWN0b3IgZnVuY3MgYW5kIGhlbHBlciBmdW5jcyBmb3IgVkRBQy4KPj4K Pj4gU2lnbmVkLW9mZi1ieTogUm9uZ3JvbmcgWm91IDx6b3Vyb25ncm9uZ0BnbWFpbC5jb20+Cj4+ IC0tLQo+PiAgIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5j ICB8ICA4ICsrKwo+PiAgIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJt X2Rydi5oICB8ICAyICsKPj4gICBkcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1j X2RybV92ZGFjLmMgfCA3NiArKysrKysrKysrKysrKysrKysrKysrKysKPj4gICAzIGZpbGVzIGNo YW5nZWQsIDg2IGluc2VydGlvbnMoKykKPj4KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2hpc2ls aWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmMKPj4gaW5kZXggYmExOTFlMS4uNDI1MzYwMyAxMDA2 NDQKPj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2 LmMKPj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2 LmMKPj4gQEAgLTEzMSw2ICsxMzEsMTQgQEAgc3RhdGljIGludCBoaWJtY19rbXNfaW5pdChzdHJ1 Y3QgaGlibWNfZHJtX2RldmljZSAqaGlkZXYpCj4+ICAgICAgICAgICAgICAgICAgcmV0dXJuIHJl dDsKPj4gICAgICAgICAgfQo+Pgo+PiArICAgICAgIHJldCA9IGhpYm1jX2Nvbm5lY3Rvcl9pbml0 KGhpZGV2KTsKPj4gKyAgICAgICBpZiAocmV0KSB7Cj4+ICsgICAgICAgICAgICAgICBEUk1fRVJS T1IoImZhaWxlZCB0byBpbml0IGNvbm5lY3RvclxuIik7Cj4+ICsgICAgICAgICAgICAgICByZXR1 cm4gcmV0Owo+PiArICAgICAgIH0KPj4gKwo+PiArICAgICAgIGRybV9tb2RlX2Nvbm5lY3Rvcl9h dHRhY2hfZW5jb2RlcigmaGlkZXYtPmNvbm5lY3RvciwKPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJmhpZGV2LT5lbmNvZGVyKTsKPgo+IFRoZSBjb25uZWN0b3Ig c2hvdWxkIGJlIGluaXRpYWxpemVkIGluIHRoZSB2ZGFjIGRyaXZlciB3aXRoIHRoZQo+IGVuY29k ZXIsIG5vdCBpbiB0aGUgZHJ2IGZpbGUgKHNhbWUgYXMgcGxhbmUvY3J0YykKCmFwcGxpZWQsIHRo YW5rcy4KCj4KPj4gICAgICAgICAgcmV0dXJuIDA7Cj4+ICAgfQo+Pgo+PiBkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fZHJ2LmggYi9kcml2ZXJz L2dwdS9kcm0vaGlzaWxpY29uL2hpYm1jL2hpYm1jX2RybV9kcnYuaAo+PiBpbmRleCA0MDFjZWE0 Li40NTAyNDdkIDEwMDY0NAo+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kcnYuaAo+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29uL2hpYm1j L2hpYm1jX2RybV9kcnYuaAo+PiBAQCAtNDgsNiArNDgsNyBAQCBzdHJ1Y3QgaGlibWNfZHJtX2Rl dmljZSB7Cj4+ICAgICAgICAgIHN0cnVjdCBkcm1fcGxhbmUgcGxhbmU7Cj4+ICAgICAgICAgIHN0 cnVjdCBkcm1fY3J0YyBjcnRjOwo+PiAgICAgICAgICBzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2Rl cjsKPj4gKyAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciBjb25uZWN0b3I7Cj4KPiBObyBuZWVk IHRvIGtlZXAgdHJhY2sgaGVyZQoKd2lsbCBhbGxvY2F0ZSB3aXRoIGRldm1fa3phbGxvYygpLCB0 aGFua3MuCgo+Cj4+ICAgICAgICAgIGJvb2wgbW9kZV9jb25maWdfaW5pdGlhbGl6ZWQ7Cj4+Cj4+ ICAgICAgICAgIC8qIHR0bSAqLwo+PiBAQCAtODksNiArOTAsNyBAQCBzdGF0aWMgaW5saW5lIHN0 cnVjdCBoaWJtY19ibyAqZ2VtX3RvX2hpYm1jX2JvKHN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2Vt KQo+PiAgIGludCBoaWJtY19wbGFuZV9pbml0KHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlICpoaWRl dik7Cj4+ICAgaW50IGhpYm1jX2NydGNfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2RldmljZSAqaGlk ZXYpOwo+PiAgIGludCBoaWJtY19lbmNvZGVyX2luaXQoc3RydWN0IGhpYm1jX2RybV9kZXZpY2Ug KmhpZGV2KTsKPj4gK2ludCBoaWJtY19jb25uZWN0b3JfaW5pdChzdHJ1Y3QgaGlibWNfZHJtX2Rl dmljZSAqaGlkZXYpOwo+PiAgIGludCBoaWJtY19mYmRldl9pbml0KHN0cnVjdCBoaWJtY19kcm1f ZGV2aWNlICpoaWRldik7Cj4+ICAgdm9pZCBoaWJtY19mYmRldl9maW5pKHN0cnVjdCBoaWJtY19k cm1fZGV2aWNlICpoaWRldik7Cj4+Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaGlz aWxpY29uL2hpYm1jL2hpYm1jX2RybV92ZGFjLmMgYi9kcml2ZXJzL2dwdS9kcm0vaGlzaWxpY29u L2hpYm1jL2hpYm1jX2RybV92ZGFjLmMKPj4gaW5kZXggOTUzZjY1OS4uZWJlZmNkMSAxMDA2NDQK Pj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2hpc2lsaWNvbi9oaWJtYy9oaWJtY19kcm1fdmRhYy5j Cj4+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24vaGlibWMvaGlibWNfZHJtX3ZkYWMu Ywo+PiBAQCAtODcsMyArODcsNzkgQEAgaW50IGhpYm1jX2VuY29kZXJfaW5pdChzdHJ1Y3QgaGli bWNfZHJtX2RldmljZSAqaGlkZXYpCj4+ICAgICAgICAgIGRybV9lbmNvZGVyX2hlbHBlcl9hZGQo ZW5jb2RlciwgJmhpYm1jX2VuY29kZXJfaGVscGVyX2Z1bmNzKTsKPj4gICAgICAgICAgcmV0dXJu IDA7Cj4+ICAgfQo+PiArCj4+ICtzdGF0aWMgaW50IGhpYm1jX2Nvbm5lY3Rvcl9nZXRfbW9kZXMo c3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPj4gK3sKPj4gKyAgICAgICBpbnQgY291 bnQ7Cj4+ICsKPj4gKyAgICAgICBjb3VudCA9IGRybV9hZGRfbW9kZXNfbm9lZGlkKGNvbm5lY3Rv ciwgODAwLCA2MDApOwo+PiArICAgICAgIGRybV9zZXRfcHJlZmVycmVkX21vZGUoY29ubmVjdG9y LCBkZWZ4LCBkZWZ5KTsKPgo+IFNvIHlvdSBoYXZlIGRlZngvZGVmeSBhcyBtb2R1bGUgcGFyYW1l dGVycywgYnV0IHRoZW4gaGFyZGNvZGUgdGhlCj4gODAweDYwMCBtb2RlLiBJZiBkZWZ4L2RlZnkg aXMgYW55dGhpbmcgb3RoZXIgdGhhbiA4MDAvNjAwLCB0aGlzIHdvbid0Cj4gd29yay4gSSB0aGlu ayB5b3Ugc2hvdWxkIGp1c3QgcmVtb3ZlIHRoZSBkZWZ4L2RlZnkgbW9kdWxlIHBhcmFtcyBhbmQK PiByZWx5IG9uIHVzZXJzcGFjZSBhZGRpbmcgbW9kZXMgYXMgYXBwcm9wcmlhdGUuCgp3aWxsIHJl bW92ZSB0aGVtLCB0aGFua3MuCgo+Cj4+ICsgICAgICAgcmV0dXJuIGNvdW50Owo+PiArfQo+PiAr Cj4+ICtzdGF0aWMgaW50IGhpYm1jX2Nvbm5lY3Rvcl9tb2RlX3ZhbGlkKHN0cnVjdCBkcm1fY29u bmVjdG9yICpjb25uZWN0b3IsCj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCj4+ICt7Cj4+ICsgICAgICAgc3RydWN0 IGhpYm1jX2RybV9kZXZpY2UgKmhpcHJpdmF0ZSA9Cj4+ICsgICAgICAgIGNvbnRhaW5lcl9vZihj b25uZWN0b3IsIHN0cnVjdCBoaWJtY19kcm1fZGV2aWNlLCBjb25uZWN0b3IpOwo+PiArICAgICAg IHVuc2lnbmVkIGxvbmcgc2l6ZSA9IG1vZGUtPmhkaXNwbGF5ICogbW9kZS0+dmRpc3BsYXkgKiA0 Owo+Cj4gV2h5ICogNCBoZXJlIGFuZCB3aHkgKiAyIGJlbG93PyBZb3Ugc3VwcG9ydCBmb3JtYXRz IGxlc3MgdGhhbiAzMiBicHAsCj4gc28gdGhlICogNCBpc24ndCBuZWNlc3NhcmlseSBjb3JyZWN0 IGZvciBhbGwgZm9ybWF0cy4gSXMgdGhlICogMiB0bwo+IGFjY291bnQgZm9yIGZyb250ICYgYmFj ayBidWZmZXI/Cj4KCml0IGlzIGZyb20gYm9jaHMsIHRoZSBvcmlnaW5hbCBjb21tZW50cyBiZWxv dzoKCS8qCgkgKiBNYWtlIHN1cmUgd2UgY2FuIGZpdCB0d28gZnJhbWVidWZmZXJzIGludG8gdmlk ZW8gbWVtb3J5LgoJICogVGhpcyBhbGxvd3MgdXAgdG8gMTYwMHgxMjAwIHdpdGggMTYgTUIgKGRl ZmF1bHQgc2l6ZSkuCgkgKiBJZiB5b3Ugd2FudCBtb3JlIHRyeSB0aGlzOgoJICogICAgICdxZW11 IC12Z2Egc3RkIC1nbG9iYWwgVkdBLnZnYW1lbV9tYj0zMiAkb3RoZXJhcmdzJwoJICovCmkgdGhp bmsgaXQgaXMgbm90IG5lY2Vzc2FyeSBmb3IgaGlibWMsIHNvIHdpbGwgcmVtb3ZlIGl0IGFuZCBy ZXR1cm4KTU9ERV9PSywgdGhhbmtzLgoKPgo+PiArCj4+ICsgICAgICAgaWYgKHNpemUgKiAyID4g aGlwcml2YXRlLT5mYl9zaXplKQo+PiArICAgICAgICAgICAgICAgcmV0dXJuIE1PREVfQkFEOwo+ PiArCj4+ICsgICAgICAgcmV0dXJuIE1PREVfT0s7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBzdHJ1 Y3QgZHJtX2VuY29kZXIgKgo+PiAraGlibWNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlcihzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQo+PiArewo+PiArICAgICAgIGludCBlbmNfaWQgPSBj b25uZWN0b3ItPmVuY29kZXJfaWRzWzBdOwo+PiArCj4+ICsgICAgICAgLyogcGljayB0aGUgZW5j b2RlciBpZHMgKi8KPj4gKyAgICAgICBpZiAoZW5jX2lkKQo+PiArICAgICAgICAgICAgICAgcmV0 dXJuIGRybV9lbmNvZGVyX2ZpbmQoY29ubmVjdG9yLT5kZXYsIGVuY19pZCk7Cj4KPiBDYW4ndCB5 b3UganVzdCBkbyByZXR1cm4gZHJtX2VuY29kZXJfZmluZChjb25uZWN0b3ItPmRldiwKPiBjb25u ZWN0b3ItPmVuY29kZXJfaWRzWzBdKTsgPwo+Cj4gaWU6IHdvbid0IGRybV9lbmNvZGVyX2ZpbmQg ZG8gdGhlIHJpZ2h0IHRoaW5nIGlmIHlvdSBwYXNzIGluIGlkID09IDA/CgpoaWJtY19jb25uZWN0 b3JfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCnsKCXJldHVy biBkcm1fZW5jb2Rlcl9maW5kKGNvbm5lY3Rvci0+ZGV2LCBjb25uZWN0b3ItPmVuY29kZXJfaWRz WzBdKTsKfQpsb29rcyBtb3JlIHNpbXBsZSwgaSBsaWtlIGl0LCB0aGFua3M6KQoKPgo+PiArCj4+ ICsgICAgICAgcmV0dXJuIE5VTEw7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBlbnVtIGRybV9jb25u ZWN0b3Jfc3RhdHVzIGhpYm1jX2Nvbm5lY3Rvcl9kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IK Pj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjb25u ZWN0b3IsIGJvb2wgZm9yY2UpCj4+ICt7Cj4+ICsgICAgICAgcmV0dXJuIGNvbm5lY3Rvcl9zdGF0 dXNfY29ubmVjdGVkOwo+Cj4gUGVyaGFwcyB0aGlzIHNob3VsZCBiZSBjb25uZWN0b3Jfc3RhdHVz X3Vua25vd24sIHNpbmNlIHlvdSBkb24ndAo+IG5lY2Vzc2FyaWx5IGtub3cgaXQncyBjb25uZWN0 ZWQuCgppdCBpcyBhbHdheXMgY29ubmVjdGVkIGluIGhpYm1jJ3Mgc2NlbmFyaW8sIHVzdWFsbHkg aXQgaXMgdXNlZCBhcyBhCm1hbmFnZW1lbnQgY2hpcCBvbiBzZXJ2ZXIsIHdlIHVzZSBLVk0oa2V5 Ym9hcmQsIG1vdXNlLCB2aWRlbykgcmF0aGVyIHRoYW4KYSBkaXJlY3RseSBjb25uZWN0ZWQgbW9u aXRvci4gSSB3aWxsIG1vZGlmeSBpZiBhIHBoaXNpY2FsIG1vbml0b3IKaXMgY29ubmVjdGVkIGxh dGVyLgoKPgo+PiArfQo+PiArCj4+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf aGVscGVyX2Z1bmNzCj4+ICsgICAgICAgaGlibWNfY29ubmVjdG9yX2Nvbm5lY3Rvcl9oZWxwZXJf ZnVuY3MgPSB7Cj4+ICsgICAgICAgLmdldF9tb2RlcyA9IGhpYm1jX2Nvbm5lY3Rvcl9nZXRfbW9k ZXMsCj4+ICsgICAgICAgLm1vZGVfdmFsaWQgPSBoaWJtY19jb25uZWN0b3JfbW9kZV92YWxpZCwK Pj4gKyAgICAgICAuYmVzdF9lbmNvZGVyID0gaGlibWNfY29ubmVjdG9yX2Jlc3RfZW5jb2RlciwK Pj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9mdW5jcyBo aWJtY19jb25uZWN0b3JfY29ubmVjdG9yX2Z1bmNzID0gewo+PiArICAgICAgIC5kcG1zID0gZHJt X2F0b21pY19oZWxwZXJfY29ubmVjdG9yX2RwbXMsCj4+ICsgICAgICAgLmRldGVjdCA9IGhpYm1j X2Nvbm5lY3Rvcl9kZXRlY3QsCj4+ICsgICAgICAgLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3By b2JlX3NpbmdsZV9jb25uZWN0b3JfbW9kZXMsCj4+ICsgICAgICAgLmRlc3Ryb3kgPSBkcm1fY29u bmVjdG9yX2NsZWFudXAsCj4+ICsgICAgICAgLnJlc2V0ID0gZHJtX2F0b21pY19oZWxwZXJfY29u bmVjdG9yX3Jlc2V0LAo+PiArICAgICAgIC5hdG9taWNfZHVwbGljYXRlX3N0YXRlID0gZHJtX2F0 b21pY19oZWxwZXJfY29ubmVjdG9yX2R1cGxpY2F0ZV9zdGF0ZSwKPj4gKyAgICAgICAuYXRvbWlj X2Rlc3Ryb3lfc3RhdGUgPSBkcm1fYXRvbWljX2hlbHBlcl9jb25uZWN0b3JfZGVzdHJveV9zdGF0 ZSwKPj4gK307Cj4+ICsKPj4gK2ludCBoaWJtY19jb25uZWN0b3JfaW5pdChzdHJ1Y3QgaGlibWNf ZHJtX2RldmljZSAqaGlkZXYpCj4+ICt7Cj4+ICsgICAgICAgc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGhpZGV2LT5kZXY7Cj4+ICsgICAgICAgc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rv ciA9ICZoaWRldi0+Y29ubmVjdG9yOwo+PiArICAgICAgIGludCByZXQ7Cj4+ICsKPj4gKyAgICAg ICByZXQgPSBkcm1fY29ubmVjdG9yX2luaXQoZGV2LCBjb25uZWN0b3IsCj4+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZoaWJtY19jb25uZWN0b3JfY29ubmVjdG9yX2Z1bmNzLAo+ PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEUk1fTU9ERV9DT05ORUNUT1JfVkdB KTsKPj4gKyAgICAgICBpZiAocmV0KSB7Cj4+ICsgICAgICAgICAgICAgICBEUk1fRVJST1IoImZh aWxlZCB0byBpbml0IGNvbm5lY3RvclxuIik7Cj4+ICsgICAgICAgICAgICAgICByZXR1cm4gcmV0 Owo+PiArICAgICAgIH0KPj4gKyAgICAgICBkcm1fY29ubmVjdG9yX2hlbHBlcl9hZGQoY29ubmVj dG9yLAo+PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGlibWNfY29ubmVjdG9y X2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOwo+PiArCj4+ICsgICAgICAgcmV0dXJuIDA7Cj4+ICt9 Cj4+IC0tCj4+IDEuOS4xCj4+Cj4+Cj4+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCj4+IGxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0Cj4+IGxpbnV4 LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwo+PiBodHRwOi8vbGlzdHMuaW5mcmFkZWFk Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwKPiBfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+IGxpbnV4YXJtIG1haWxpbmcgbGlzdAo+ IGxpbnV4YXJtQGh1YXdlaS5jb20KPiBodHRwOi8vcm5kLW9wZW5ldWxlci5odWF3ZWkuY29tL21h aWxtYW4vbGlzdGluZm8vbGludXhhcm0KPgo+IC4KPgoKCi0tIApSZWdhcmRzLCBSb25ncm9uZwoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=