From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp.codeaurora.org ([198.145.29.96]:44172 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757115AbcK2K1U (ORCPT ); Tue, 29 Nov 2016 05:27:20 -0500 Subject: Re: [PATCH v3 03/13] drm: bridge: Link encoder and bridge in core code To: Laurent Pinchart , dri-devel@lists.freedesktop.org References: <1480410283-28698-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1480410283-28698-4-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Cc: linux-renesas-soc@vger.kernel.org, Boris Brezillon , Jingoo Han , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Stefan Agner , Alison Wang , Xinliang Liu , Rongrong Zou , Xinwei Kong , Chen Feng , Philipp Zabel , CK Hu , Rob Clark , Benjamin Gaignard , Vincent Abriou , Maxime Ripard From: Archit Taneja Message-ID: <94e6b51f-71bf-8734-a843-e236ea1e8ff1@codeaurora.org> Date: Tue, 29 Nov 2016 15:57:06 +0530 MIME-Version: 1.0 In-Reply-To: <1480410283-28698-4-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-renesas-soc-owner@vger.kernel.org List-ID: On 11/29/2016 02:34 PM, Laurent Pinchart wrote: > Instead of linking encoders and bridges in every driver (and getting it > wrong half of the time, as many drivers forget to set the drm_bridge > encoder pointer), do so in core code. The drm_bridge_attach() function > needs the encoder and optional previous bridge to perform that task, > update all the callers. > > Signed-off-by: Laurent Pinchart > --- > drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c | 4 +- > drivers/gpu/drm/bridge/analogix/analogix_dp_core.c | 4 +- > drivers/gpu/drm/bridge/dw-hdmi.c | 3 +- > drivers/gpu/drm/drm_bridge.c | 46 ++++++++++++++++------ > drivers/gpu/drm/drm_simple_kms_helper.c | 4 +- > drivers/gpu/drm/exynos/exynos_dp.c | 5 +-- > drivers/gpu/drm/exynos/exynos_drm_dsi.c | 6 +-- > drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_rgb.c | 5 +-- > drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 5 +-- > drivers/gpu/drm/imx/imx-ldb.c | 6 +-- > drivers/gpu/drm/imx/parallel-display.c | 4 +- > drivers/gpu/drm/mediatek/mtk_dpi.c | 8 ++-- > drivers/gpu/drm/mediatek/mtk_dsi.c | 24 ++--------- > drivers/gpu/drm/mediatek/mtk_hdmi.c | 11 +++--- > drivers/gpu/drm/msm/dsi/dsi_manager.c | 17 +++++--- > drivers/gpu/drm/msm/edp/edp_bridge.c | 2 +- > drivers/gpu/drm/msm/hdmi/hdmi_bridge.c | 2 +- > drivers/gpu/drm/rcar-du/rcar_du_hdmienc.c | 5 +-- > drivers/gpu/drm/sti/sti_dvo.c | 3 +- > drivers/gpu/drm/sti/sti_hda.c | 3 +- > drivers/gpu/drm/sti/sti_hdmi.c | 3 +- > drivers/gpu/drm/sun4i/sun4i_rgb.c | 13 +++--- > include/drm/drm_bridge.h | 3 +- > 23 files changed, 83 insertions(+), 103 deletions(-) > > diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c > index 6119b5085501..e7799b6ee829 100644 > --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c > +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_output.c > @@ -230,9 +230,7 @@ static int atmel_hlcdc_attach_endpoint(struct drm_device *dev, > of_node_put(np); > > if (bridge) { > - output->encoder.bridge = bridge; > - bridge->encoder = &output->encoder; > - ret = drm_bridge_attach(dev, bridge); > + ret = drm_bridge_attach(&output->encoder, bridge, NULL); > if (!ret) > return 0; > } > diff --git a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > index 6e0447f329a2..1835f1fdad19 100644 > --- a/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > +++ b/drivers/gpu/drm/bridge/analogix/analogix_dp_core.c > @@ -1227,12 +1227,10 @@ static int analogix_dp_create_bridge(struct drm_device *drm_dev, > > dp->bridge = bridge; > > - dp->encoder->bridge = bridge; > bridge->driver_private = dp; > - bridge->encoder = dp->encoder; > bridge->funcs = &analogix_dp_bridge_funcs; > > - ret = drm_bridge_attach(drm_dev, bridge); > + ret = drm_bridge_attach(dp->encoder, bridge, NULL); > if (ret) { > DRM_ERROR("failed to attach drm bridge\n"); > return -EINVAL; > diff --git a/drivers/gpu/drm/bridge/dw-hdmi.c b/drivers/gpu/drm/bridge/dw-hdmi.c > index b71088dab268..432e0e3fff72 100644 > --- a/drivers/gpu/drm/bridge/dw-hdmi.c > +++ b/drivers/gpu/drm/bridge/dw-hdmi.c > @@ -1841,13 +1841,12 @@ static int dw_hdmi_register(struct drm_device *drm, struct dw_hdmi *hdmi) > hdmi->bridge = bridge; > bridge->driver_private = hdmi; > bridge->funcs = &dw_hdmi_bridge_funcs; > - ret = drm_bridge_attach(drm, bridge); > + ret = drm_bridge_attach(encoder, bridge, NULL); > if (ret) { > DRM_ERROR("Failed to initialize bridge with drm\n"); > return -EINVAL; > } > > - encoder->bridge = bridge; > hdmi->connector.polled = DRM_CONNECTOR_POLL_HPD; > > drm_connector_helper_add(&hdmi->connector, > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index 0ee052b7c21a..850bd6509ef1 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -26,6 +26,7 @@ > #include > > #include > +#include > > /** > * DOC: overview > @@ -92,32 +93,53 @@ void drm_bridge_remove(struct drm_bridge *bridge) > EXPORT_SYMBOL(drm_bridge_remove); > > /** > - * drm_bridge_attach - associate given bridge to our DRM device > + * drm_bridge_attach - attach the bridge to an encoder's chain > * > - * @dev: DRM device > - * @bridge: bridge control structure > + * @encoder: DRM encoder > + * @bridge: bridge to attach > + * @previous: previous bridge in the chain (optional) > * > - * Called by a kms driver to link one of our encoder/bridge to the given > - * bridge. > + * Called by a kms driver to link the bridge to an encoder's chain. The previous > + * argument specifies the previous bridge in the chain. If NULL, the bridge is > + * linked directly at the encoder's output. Otherwise it is linked at the > + * previous bridge's output. > * > - * Note that setting up links between the bridge and our encoder/bridge > - * objects needs to be handled by the kms driver itself. > + * If non-NULL the previous bridge must be already attached by a call to this > + * function. > * > * RETURNS: > * Zero on success, error code on failure > */ > -int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge) > +int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, > + struct drm_bridge *previous) > { > - if (!dev || !bridge) > + int ret; > + > + if (!encoder || !bridge) > + return -EINVAL; I think we could derive previous from the encoder itself. Something like: previous = encoder->bridge; while (previous && previous->next) previous = previous->next; > + > + if (previous && (!previous->dev || previous->encoder != encoder)) > return -EINVAL; > > if (bridge->dev) > return -EBUSY; > > - bridge->dev = dev; > + bridge->dev = encoder->dev; > + bridge->encoder = encoder; > + > + if (bridge->funcs->attach) { > + ret = bridge->funcs->attach(bridge); > + if (ret < 0) { > + bridge->dev = NULL; > + bridge->encoder = NULL; > + return ret; > + } > + } > > - if (bridge->funcs->attach) > - return bridge->funcs->attach(bridge); > + if (previous) > + previous->next = bridge; > + else > + encoder->bridge = bridge; > > return 0; > } Archit -- Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project From mboxrd@z Thu Jan 1 00:00:00 1970 From: Archit Taneja Subject: Re: [PATCH v3 03/13] drm: bridge: Link encoder and bridge in core code Date: Tue, 29 Nov 2016 15:57:06 +0530 Message-ID: <94e6b51f-71bf-8734-a843-e236ea1e8ff1@codeaurora.org> References: <1480410283-28698-1-git-send-email-laurent.pinchart+renesas@ideasonboard.com> <1480410283-28698-4-git-send-email-laurent.pinchart+renesas@ideasonboard.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8"; Format="flowed" Content-Transfer-Encoding: base64 Return-path: Received: from smtp.codeaurora.org (smtp.codeaurora.org [198.145.29.96]) by gabe.freedesktop.org (Postfix) with ESMTPS id B85CB89FE6 for ; Tue, 29 Nov 2016 10:27:18 +0000 (UTC) In-Reply-To: <1480410283-28698-4-git-send-email-laurent.pinchart+renesas@ideasonboard.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laurent Pinchart , dri-devel@lists.freedesktop.org Cc: Alison Wang , Jingoo Han , Seung-Woo Kim , Xinwei Kong , linux-renesas-soc@vger.kernel.org, Kyungmin Park , Xinliang Liu , Chen Feng , Rongrong Zou , Maxime Ripard , Vincent Abriou List-Id: dri-devel@lists.freedesktop.org CgpPbiAxMS8yOS8yMDE2IDAyOjM0IFBNLCBMYXVyZW50IFBpbmNoYXJ0IHdyb3RlOgo+IEluc3Rl YWQgb2YgbGlua2luZyBlbmNvZGVycyBhbmQgYnJpZGdlcyBpbiBldmVyeSBkcml2ZXIgKGFuZCBn ZXR0aW5nIGl0Cj4gd3JvbmcgaGFsZiBvZiB0aGUgdGltZSwgYXMgbWFueSBkcml2ZXJzIGZvcmdl dCB0byBzZXQgdGhlIGRybV9icmlkZ2UKPiBlbmNvZGVyIHBvaW50ZXIpLCBkbyBzbyBpbiBjb3Jl IGNvZGUuIFRoZSBkcm1fYnJpZGdlX2F0dGFjaCgpIGZ1bmN0aW9uCj4gbmVlZHMgdGhlIGVuY29k ZXIgYW5kIG9wdGlvbmFsIHByZXZpb3VzIGJyaWRnZSB0byBwZXJmb3JtIHRoYXQgdGFzaywKPiB1 cGRhdGUgYWxsIHRoZSBjYWxsZXJzLgo+Cj4gU2lnbmVkLW9mZi1ieTogTGF1cmVudCBQaW5jaGFy dCA8bGF1cmVudC5waW5jaGFydCtyZW5lc2FzQGlkZWFzb25ib2FyZC5jb20+Cj4gLS0tCj4gIGRy aXZlcnMvZ3B1L2RybS9hdG1lbC1obGNkYy9hdG1lbF9obGNkY19vdXRwdXQuYyAgIHwgIDQgKy0K PiAgZHJpdmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMgfCAg NCArLQo+ICBkcml2ZXJzL2dwdS9kcm0vYnJpZGdlL2R3LWhkbWkuYyAgICAgICAgICAgICAgICAg ICB8ICAzICstCj4gIGRyaXZlcnMvZ3B1L2RybS9kcm1fYnJpZGdlLmMgICAgICAgICAgICAgICAg ICAgICAgIHwgNDYgKysrKysrKysrKysrKysrKy0tLS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJt X3NpbXBsZV9rbXNfaGVscGVyLmMgICAgICAgICAgICB8ICA0ICstCj4gIGRyaXZlcnMvZ3B1L2Ry bS9leHlub3MvZXh5bm9zX2RwLmMgICAgICAgICAgICAgICAgIHwgIDUgKy0tCj4gIGRyaXZlcnMv Z3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYyAgICAgICAgICAgIHwgIDYgKy0tCj4gIGRy aXZlcnMvZ3B1L2RybS9mc2wtZGN1L2ZzbF9kY3VfZHJtX3JnYi5jICAgICAgICAgIHwgIDUgKy0t Cj4gIGRyaXZlcnMvZ3B1L2RybS9oaXNpbGljb24va2lyaW4vZHdfZHJtX2RzaS5jICAgICAgIHwg IDUgKy0tCj4gIGRyaXZlcnMvZ3B1L2RybS9pbXgvaW14LWxkYi5jICAgICAgICAgICAgICAgICAg ICAgIHwgIDYgKy0tCj4gIGRyaXZlcnMvZ3B1L2RybS9pbXgvcGFyYWxsZWwtZGlzcGxheS5jICAg ICAgICAgICAgIHwgIDQgKy0KPiAgZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19kcGkuYyAg ICAgICAgICAgICAgICAgfCAgOCArKy0tCj4gIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtf ZHNpLmMgICAgICAgICAgICAgICAgIHwgMjQgKystLS0tLS0tLS0KPiAgZHJpdmVycy9ncHUvZHJt L21lZGlhdGVrL210a19oZG1pLmMgICAgICAgICAgICAgICAgfCAxMSArKystLS0KPiAgZHJpdmVy cy9ncHUvZHJtL21zbS9kc2kvZHNpX21hbmFnZXIuYyAgICAgICAgICAgICAgfCAxNyArKysrKy0t LQo+ICBkcml2ZXJzL2dwdS9kcm0vbXNtL2VkcC9lZHBfYnJpZGdlLmMgICAgICAgICAgICAgICB8 ICAyICstCj4gIGRyaXZlcnMvZ3B1L2RybS9tc20vaGRtaS9oZG1pX2JyaWRnZS5jICAgICAgICAg ICAgIHwgIDIgKy0KPiAgZHJpdmVycy9ncHUvZHJtL3JjYXItZHUvcmNhcl9kdV9oZG1pZW5jLmMg ICAgICAgICAgfCAgNSArLS0KPiAgZHJpdmVycy9ncHUvZHJtL3N0aS9zdGlfZHZvLmMgICAgICAg ICAgICAgICAgICAgICAgfCAgMyArLQo+ICBkcml2ZXJzL2dwdS9kcm0vc3RpL3N0aV9oZGEuYyAg ICAgICAgICAgICAgICAgICAgICB8ICAzICstCj4gIGRyaXZlcnMvZ3B1L2RybS9zdGkvc3RpX2hk bWkuYyAgICAgICAgICAgICAgICAgICAgIHwgIDMgKy0KPiAgZHJpdmVycy9ncHUvZHJtL3N1bjRp L3N1bjRpX3JnYi5jICAgICAgICAgICAgICAgICAgfCAxMyArKystLS0KPiAgaW5jbHVkZS9kcm0v ZHJtX2JyaWRnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMyArLQo+ICAyMyBmaWxl cyBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspLCAxMDMgZGVsZXRpb25zKC0pCj4KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX291dHB1dC5jIGIv ZHJpdmVycy9ncHUvZHJtL2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX291dHB1dC5jCj4gaW5kZXgg NjExOWI1MDg1NTAxLi5lNzc5OWI2ZWU4MjkgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJt L2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX291dHB1dC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJt L2F0bWVsLWhsY2RjL2F0bWVsX2hsY2RjX291dHB1dC5jCj4gQEAgLTIzMCw5ICsyMzAsNyBAQCBz dGF0aWMgaW50IGF0bWVsX2hsY2RjX2F0dGFjaF9lbmRwb2ludChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LAo+ICAJb2Zfbm9kZV9wdXQobnApOwo+Cj4gIAlpZiAoYnJpZGdlKSB7Cj4gLQkJb3V0cHV0 LT5lbmNvZGVyLmJyaWRnZSA9IGJyaWRnZTsKPiAtCQlicmlkZ2UtPmVuY29kZXIgPSAmb3V0cHV0 LT5lbmNvZGVyOwo+IC0JCXJldCA9IGRybV9icmlkZ2VfYXR0YWNoKGRldiwgYnJpZGdlKTsKPiAr CQlyZXQgPSBkcm1fYnJpZGdlX2F0dGFjaCgmb3V0cHV0LT5lbmNvZGVyLCBicmlkZ2UsIE5VTEwp Owo+ICAJCWlmICghcmV0KQo+ICAJCQlyZXR1cm4gMDsKPiAgCX0KPiBkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMgYi9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL2FuYWxvZ2l4L2FuYWxvZ2l4X2RwX2NvcmUuYwo+IGluZGV4IDZlMDQ0 N2YzMjlhMi4uMTgzNWYxZmRhZDE5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9icmlk Z2UvYW5hbG9naXgvYW5hbG9naXhfZHBfY29yZS5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2Jy aWRnZS9hbmFsb2dpeC9hbmFsb2dpeF9kcF9jb3JlLmMKPiBAQCAtMTIyNywxMiArMTIyNywxMCBA QCBzdGF0aWMgaW50IGFuYWxvZ2l4X2RwX2NyZWF0ZV9icmlkZ2Uoc3RydWN0IGRybV9kZXZpY2Ug KmRybV9kZXYsCj4KPiAgCWRwLT5icmlkZ2UgPSBicmlkZ2U7Cj4KPiAtCWRwLT5lbmNvZGVyLT5i cmlkZ2UgPSBicmlkZ2U7Cj4gIAlicmlkZ2UtPmRyaXZlcl9wcml2YXRlID0gZHA7Cj4gLQlicmlk Z2UtPmVuY29kZXIgPSBkcC0+ZW5jb2RlcjsKPiAgCWJyaWRnZS0+ZnVuY3MgPSAmYW5hbG9naXhf ZHBfYnJpZGdlX2Z1bmNzOwo+Cj4gLQlyZXQgPSBkcm1fYnJpZGdlX2F0dGFjaChkcm1fZGV2LCBi cmlkZ2UpOwo+ICsJcmV0ID0gZHJtX2JyaWRnZV9hdHRhY2goZHAtPmVuY29kZXIsIGJyaWRnZSwg TlVMTCk7Cj4gIAlpZiAocmV0KSB7Cj4gIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIGRy bSBicmlkZ2VcbiIpOwo+ICAJCXJldHVybiAtRUlOVkFMOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vYnJpZGdlL2R3LWhkbWkuYyBiL2RyaXZlcnMvZ3B1L2RybS9icmlkZ2UvZHctaGRt aS5jCj4gaW5kZXggYjcxMDg4ZGFiMjY4Li40MzJlMGUzZmZmNzIgMTAwNjQ0Cj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2JyaWRnZS9kdy1oZG1pLmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYnJp ZGdlL2R3LWhkbWkuYwo+IEBAIC0xODQxLDEzICsxODQxLDEyIEBAIHN0YXRpYyBpbnQgZHdfaGRt aV9yZWdpc3RlcihzdHJ1Y3QgZHJtX2RldmljZSAqZHJtLCBzdHJ1Y3QgZHdfaGRtaSAqaGRtaSkK PiAgCWhkbWktPmJyaWRnZSA9IGJyaWRnZTsKPiAgCWJyaWRnZS0+ZHJpdmVyX3ByaXZhdGUgPSBo ZG1pOwo+ICAJYnJpZGdlLT5mdW5jcyA9ICZkd19oZG1pX2JyaWRnZV9mdW5jczsKPiAtCXJldCA9 IGRybV9icmlkZ2VfYXR0YWNoKGRybSwgYnJpZGdlKTsKPiArCXJldCA9IGRybV9icmlkZ2VfYXR0 YWNoKGVuY29kZXIsIGJyaWRnZSwgTlVMTCk7Cj4gIAlpZiAocmV0KSB7Cj4gIAkJRFJNX0VSUk9S KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBicmlkZ2Ugd2l0aCBkcm1cbiIpOwo+ICAJCXJldHVybiAt RUlOVkFMOwo+ICAJfQo+Cj4gLQllbmNvZGVyLT5icmlkZ2UgPSBicmlkZ2U7Cj4gIAloZG1pLT5j b25uZWN0b3IucG9sbGVkID0gRFJNX0NPTk5FQ1RPUl9QT0xMX0hQRDsKPgo+ICAJZHJtX2Nvbm5l Y3Rvcl9oZWxwZXJfYWRkKCZoZG1pLT5jb25uZWN0b3IsCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9kcm1fYnJpZGdlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2JyaWRnZS5jCj4gaW5k ZXggMGVlMDUyYjdjMjFhLi44NTBiZDY1MDllZjEgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUv ZHJtL2RybV9icmlkZ2UuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnJpZGdlLmMKPiBA QCAtMjYsNiArMjYsNyBAQAo+ICAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KPgo+ICAjaW5jbHVk ZSA8ZHJtL2RybV9icmlkZ2UuaD4KPiArI2luY2x1ZGUgPGRybS9kcm1fZW5jb2Rlci5oPgo+Cj4g IC8qKgo+ICAgKiBET0M6IG92ZXJ2aWV3Cj4gQEAgLTkyLDMyICs5Myw1MyBAQCB2b2lkIGRybV9i cmlkZ2VfcmVtb3ZlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gIEVYUE9SVF9TWU1CT0wo ZHJtX2JyaWRnZV9yZW1vdmUpOwo+Cj4gIC8qKgo+IC0gKiBkcm1fYnJpZGdlX2F0dGFjaCAtIGFz c29jaWF0ZSBnaXZlbiBicmlkZ2UgdG8gb3VyIERSTSBkZXZpY2UKPiArICogZHJtX2JyaWRnZV9h dHRhY2ggLSBhdHRhY2ggdGhlIGJyaWRnZSB0byBhbiBlbmNvZGVyJ3MgY2hhaW4KPiAgICoKPiAt ICogQGRldjogRFJNIGRldmljZQo+IC0gKiBAYnJpZGdlOiBicmlkZ2UgY29udHJvbCBzdHJ1Y3R1 cmUKPiArICogQGVuY29kZXI6IERSTSBlbmNvZGVyCj4gKyAqIEBicmlkZ2U6IGJyaWRnZSB0byBh dHRhY2gKPiArICogQHByZXZpb3VzOiBwcmV2aW91cyBicmlkZ2UgaW4gdGhlIGNoYWluIChvcHRp b25hbCkKPiAgICoKPiAtICogQ2FsbGVkIGJ5IGEga21zIGRyaXZlciB0byBsaW5rIG9uZSBvZiBv dXIgZW5jb2Rlci9icmlkZ2UgdG8gdGhlIGdpdmVuCj4gLSAqIGJyaWRnZS4KPiArICogQ2FsbGVk IGJ5IGEga21zIGRyaXZlciB0byBsaW5rIHRoZSBicmlkZ2UgdG8gYW4gZW5jb2RlcidzIGNoYWlu LiBUaGUgcHJldmlvdXMKPiArICogYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBwcmV2aW91cyBicmlk Z2UgaW4gdGhlIGNoYWluLiBJZiBOVUxMLCB0aGUgYnJpZGdlIGlzCj4gKyAqIGxpbmtlZCBkaXJl Y3RseSBhdCB0aGUgZW5jb2RlcidzIG91dHB1dC4gT3RoZXJ3aXNlIGl0IGlzIGxpbmtlZCBhdCB0 aGUKPiArICogcHJldmlvdXMgYnJpZGdlJ3Mgb3V0cHV0Lgo+ICAgKgo+IC0gKiBOb3RlIHRoYXQg c2V0dGluZyB1cCBsaW5rcyBiZXR3ZWVuIHRoZSBicmlkZ2UgYW5kIG91ciBlbmNvZGVyL2JyaWRn ZQo+IC0gKiBvYmplY3RzIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGttcyBkcml2ZXIgaXRz ZWxmLgo+ICsgKiBJZiBub24tTlVMTCB0aGUgcHJldmlvdXMgYnJpZGdlIG11c3QgYmUgYWxyZWFk eSBhdHRhY2hlZCBieSBhIGNhbGwgdG8gdGhpcwo+ICsgKiBmdW5jdGlvbi4KPiAgICoKPiAgICog UkVUVVJOUzoKPiAgICogWmVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGZhaWx1cmUKPiAg ICovCj4gLWludCBkcm1fYnJpZGdlX2F0dGFjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1 Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICtpbnQgZHJtX2JyaWRnZV9hdHRhY2goc3RydWN0IGRy bV9lbmNvZGVyICplbmNvZGVyLCBzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCSAgICAg IHN0cnVjdCBkcm1fYnJpZGdlICpwcmV2aW91cykKPiAgewo+IC0JaWYgKCFkZXYgfHwgIWJyaWRn ZSkKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKCFlbmNvZGVyIHx8ICFicmlkZ2UpCj4gKwkJcmV0 dXJuIC1FSU5WQUw7CgpJIHRoaW5rIHdlIGNvdWxkIGRlcml2ZSBwcmV2aW91cyBmcm9tIHRoZSBl bmNvZGVyIGl0c2VsZi4gU29tZXRoaW5nIGxpa2U6CgoJcHJldmlvdXMgPSBlbmNvZGVyLT5icmlk Z2U7Cgl3aGlsZSAocHJldmlvdXMgJiYgcHJldmlvdXMtPm5leHQpCgkJcHJldmlvdXMgPSBwcmV2 aW91cy0+bmV4dDsKCQkKPiArCj4gKwlpZiAocHJldmlvdXMgJiYgKCFwcmV2aW91cy0+ZGV2IHx8 IHByZXZpb3VzLT5lbmNvZGVyICE9IGVuY29kZXIpKQo+ICAJCXJldHVybiAtRUlOVkFMOwo+Cj4g IAlpZiAoYnJpZGdlLT5kZXYpCj4gIAkJcmV0dXJuIC1FQlVTWTsKPgo+IC0JYnJpZGdlLT5kZXYg PSBkZXY7Cj4gKwlicmlkZ2UtPmRldiA9IGVuY29kZXItPmRldjsKPiArCWJyaWRnZS0+ZW5jb2Rl ciA9IGVuY29kZXI7Cj4gKwo+ICsJaWYgKGJyaWRnZS0+ZnVuY3MtPmF0dGFjaCkgewo+ICsJCXJl dCA9IGJyaWRnZS0+ZnVuY3MtPmF0dGFjaChicmlkZ2UpOwo+ICsJCWlmIChyZXQgPCAwKSB7Cj4g KwkJCWJyaWRnZS0+ZGV2ID0gTlVMTDsKPiArCQkJYnJpZGdlLT5lbmNvZGVyID0gTlVMTDsKPiAr CQkJcmV0dXJuIHJldDsKPiArCQl9Cj4gKwl9Cj4KPiAtCWlmIChicmlkZ2UtPmZ1bmNzLT5hdHRh Y2gpCj4gLQkJcmV0dXJuIGJyaWRnZS0+ZnVuY3MtPmF0dGFjaChicmlkZ2UpOwo+ICsJaWYgKHBy ZXZpb3VzKQo+ICsJCXByZXZpb3VzLT5uZXh0ID0gYnJpZGdlOwo+ICsJZWxzZQo+ICsJCWVuY29k ZXItPmJyaWRnZSA9IGJyaWRnZTsKPgo+ICAJcmV0dXJuIDA7Cj4gIH0KCjxzbmlwPgoKQXJjaGl0 CgotLSAKUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gaXMgYSBtZW1iZXIgb2YgQ29k ZSBBdXJvcmEgRm9ydW0sCmEgTGludXggRm91bmRhdGlvbiBDb2xsYWJvcmF0aXZlIFByb2plY3QK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVs IG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==