From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.3 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85D1BC432C0 for ; Sun, 24 Nov 2019 10:24:47 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 474C120748 for ; Sun, 24 Nov 2019 10:24:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="PjhfSVbR" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726090AbfKXKYq (ORCPT ); Sun, 24 Nov 2019 05:24:46 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:36120 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725980AbfKXKYq (ORCPT ); Sun, 24 Nov 2019 05:24:46 -0500 Received: from pendragon.ideasonboard.com (fs96f9c64d.tkyc509.ap.nuro.jp [150.249.198.77]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B18F7A38; Sun, 24 Nov 2019 11:24:41 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1574591082; bh=fZLEqB6edoT6m4Sy2FIpsRDrARqeeMQHYKMiococpS8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=PjhfSVbRA4tB8bC1OhY12Pi6SwRHOfkb0g0KqfxZKI3/fLhM/PehSi9vPC7T6CQ0E /EO5RnRsv54cYSGHwK99fOo9b3s9IAiwFkrpbnxvuvXS5YhAE/HNB4snOXY0pV2BsJ vkKsErVwlBvemyjzSC92bxhwnNgxO2MAM6SKb6rE= Date: Sun, 24 Nov 2019 12:24:33 +0200 From: Laurent Pinchart To: Boris Brezillon Cc: dri-devel@lists.freedesktop.org, Lucas Stach , Chris Healy , Andrey Smirnov , Nikita Yushchenko , kernel@collabora.com, Daniel Vetter , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Thierry Reding , Sam Ravnborg , Philipp Zabel , Rob Clark , Andrzej Hajda , Neil Armstrong , Jonas Karlman , Jernej Skrabec , Rob Herring , Mark Rutland , devicetree@vger.kernel.org Subject: Re: [PATCH v3 03/21] drm/exynos: Declare the DSI encoder as a bridge element Message-ID: <20191124102433.GD4727@pendragon.ideasonboard.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-4-boris.brezillon@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20191023154512.9762-4-boris.brezillon@collabora.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Boris, Thank you for the patch. On Wed, Oct 23, 2019 at 05:44:54PM +0200, Boris Brezillon wrote: > Encoder drivers will progressively transition to the drm_bridge > interface in place of the drm_encoder one. > > Converting the Exynos DSI encoder driver to this approach allows us to > use the ->pre_{enable,disable}() hooks and get rid of the hack > resetting encoder->bridge.next (which was needed to control the > encoder/bridge enable/disable sequence). > > Signed-off-by: Boris Brezillon > --- > Changes in v3: > * Embed a drm_bridge object in exynos_dsi since drm_encoder no longer > has a dummy bridge > > Changes in v2: > * New patch (replacement for "drm/exynos: Get rid of exynos_dsi->out_bridge") > --- > drivers/gpu/drm/exynos/exynos_drm_dsi.c | 89 +++++++++++++++---------- > 1 file changed, 55 insertions(+), 34 deletions(-) > > diff --git a/drivers/gpu/drm/exynos/exynos_drm_dsi.c b/drivers/gpu/drm/exynos/exynos_drm_dsi.c > index 72726f2c7a9f..3915f50b005e 100644 > --- a/drivers/gpu/drm/exynos/exynos_drm_dsi.c > +++ b/drivers/gpu/drm/exynos/exynos_drm_dsi.c > @@ -252,10 +252,10 @@ struct exynos_dsi_driver_data { > > struct exynos_dsi { > struct drm_encoder encoder; > + struct drm_bridge bridge; > struct mipi_dsi_host dsi_host; > struct drm_connector connector; > struct drm_panel *panel; > - struct drm_bridge *out_bridge; > struct device *dev; > > void __iomem *reg_base; > @@ -291,6 +291,11 @@ static inline struct exynos_dsi *encoder_to_dsi(struct drm_encoder *e) > return container_of(e, struct exynos_dsi, encoder); > } > > +static inline struct exynos_dsi *bridge_to_dsi(struct drm_bridge *b) > +{ > + return container_of(b, struct exynos_dsi, bridge); > +} > + > enum reg_idx { > DSIM_STATUS_REG, /* Status register */ > DSIM_SWRST_REG, /* Software reset register */ > @@ -1374,25 +1379,38 @@ static void exynos_dsi_unregister_te_irq(struct exynos_dsi *dsi) > } > } > > -static void exynos_dsi_enable(struct drm_encoder *encoder) > +static void exynos_dsi_pre_enable(struct drm_bridge *bridge) > { > - struct exynos_dsi *dsi = encoder_to_dsi(encoder); > + struct exynos_dsi *dsi = bridge_to_dsi(bridge); > int ret; > > if (dsi->state & DSIM_STATE_ENABLED) > return; This can probably be removed now as the core should ensure that double-enable or double-disable never occurs, but it can be done in a separate patch. > > pm_runtime_get_sync(dsi->dev); > - dsi->state |= DSIM_STATE_ENABLED; > > if (dsi->panel) { > ret = drm_panel_prepare(dsi->panel); > if (ret < 0) > goto err_put_sync; > - } else { > - drm_bridge_pre_enable(dsi->out_bridge); > } It would be nice to switch to the drm panel bridge, but that can also be done on top of this series. > > + dsi->state |= DSIM_STATE_ENABLED; > + return; > + > +err_put_sync: > + pm_runtime_put(dsi->dev); > +} > + > +static void exynos_dsi_enable(struct drm_bridge *bridge) > +{ > + struct exynos_dsi *dsi = bridge_to_dsi(bridge); > + int ret; > + > + if (!(dsi->state & DSIM_STATE_ENABLED) || > + (dsi->state & DSIM_STATE_VIDOUT_AVAILABLE)) > + return; > + > exynos_dsi_set_display_mode(dsi); > exynos_dsi_set_display_enable(dsi, true); > > @@ -1400,8 +1418,6 @@ static void exynos_dsi_enable(struct drm_encoder *encoder) > ret = drm_panel_enable(dsi->panel); > if (ret < 0) > goto err_display_disable; > - } else { > - drm_bridge_enable(dsi->out_bridge); > } > > dsi->state |= DSIM_STATE_VIDOUT_AVAILABLE; > @@ -1410,28 +1426,30 @@ static void exynos_dsi_enable(struct drm_encoder *encoder) > err_display_disable: > exynos_dsi_set_display_enable(dsi, false); > drm_panel_unprepare(dsi->panel); Does this belong here, as drm_panel_prepare() was called in exynos_dsi_pre_enable() ? > - > -err_put_sync: > - dsi->state &= ~DSIM_STATE_ENABLED; > - pm_runtime_put(dsi->dev); > } > > -static void exynos_dsi_disable(struct drm_encoder *encoder) > +static void exynos_dsi_disable(struct drm_bridge *bridge) > { > - struct exynos_dsi *dsi = encoder_to_dsi(encoder); > + struct exynos_dsi *dsi = bridge_to_dsi(bridge); > + > + if (!(dsi->state & DSIM_STATE_VIDOUT_AVAILABLE)) > + return; > + > + drm_panel_disable(dsi->panel); > + exynos_dsi_set_display_enable(dsi, false); > + dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; > +} > + > +static void exynos_dsi_post_disable(struct drm_bridge *bridge) > +{ > + struct exynos_dsi *dsi = bridge_to_dsi(bridge); > > if (!(dsi->state & DSIM_STATE_ENABLED)) > return; > > - dsi->state &= ~DSIM_STATE_VIDOUT_AVAILABLE; > - > - drm_panel_disable(dsi->panel); > - drm_bridge_disable(dsi->out_bridge); > - exynos_dsi_set_display_enable(dsi, false); > drm_panel_unprepare(dsi->panel); > - drm_bridge_post_disable(dsi->out_bridge); > - dsi->state &= ~DSIM_STATE_ENABLED; > pm_runtime_put_sync(dsi->dev); > + dsi->state &= ~DSIM_STATE_ENABLED; > } > > static enum drm_connector_status > @@ -1499,9 +1517,11 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder) > return 0; > } > > -static const struct drm_encoder_helper_funcs exynos_dsi_encoder_helper_funcs = { > +static const struct drm_bridge_funcs exynos_dsi_bridge_funcs = { > + .pre_enable = exynos_dsi_pre_enable, > .enable = exynos_dsi_enable, > .disable = exynos_dsi_disable, > + .post_disable = exynos_dsi_post_disable, > }; > > static const struct drm_encoder_funcs exynos_dsi_encoder_funcs = { > @@ -1520,9 +1540,7 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host, > > out_bridge = of_drm_find_bridge(device->dev.of_node); > if (out_bridge) { > - drm_bridge_attach(encoder, out_bridge, NULL); > - dsi->out_bridge = out_bridge; > - encoder->bridge = NULL; > + drm_bridge_attach(encoder, out_bridge, &dsi->bridge); > } else { > int ret = exynos_dsi_create_connector(encoder); > > @@ -1575,19 +1593,19 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host, > struct mipi_dsi_device *device) > { > struct exynos_dsi *dsi = host_to_dsi(host); > + struct drm_bridge *out_bridge = dsi->bridge.next; > struct drm_device *drm = dsi->encoder.dev; > > if (dsi->panel) { > mutex_lock(&drm->mode_config.mutex); > - exynos_dsi_disable(&dsi->encoder); > + exynos_dsi_disable(&dsi->bridge); > + exynos_dsi_post_disable(&dsi->bridge); > drm_panel_detach(dsi->panel); > dsi->panel = NULL; > dsi->connector.status = connector_status_disconnected; > mutex_unlock(&drm->mode_config.mutex); > - } else { > - if (dsi->out_bridge->funcs->detach) > - dsi->out_bridge->funcs->detach(dsi->out_bridge); > - dsi->out_bridge = NULL; > + } else if (out_bridge && out_bridge->funcs->detach) { > + out_bridge->funcs->detach(out_bridge); Maybe drm_bridge_detach() ? > } > > if (drm->mode_config.poll_enabled) > @@ -1687,16 +1705,18 @@ static int exynos_dsi_bind(struct device *dev, struct device *master, > drm_encoder_init(drm_dev, encoder, &exynos_dsi_encoder_funcs, > DRM_MODE_ENCODER_TMDS, NULL); > > - drm_encoder_helper_add(encoder, &exynos_dsi_encoder_helper_funcs); > - > ret = exynos_drm_set_possible_crtcs(encoder, EXYNOS_DISPLAY_TYPE_LCD); > if (ret < 0) > return ret; > > + /* Declare ourself as the first bridge element. */ > + dsi->bridge.funcs = &exynos_dsi_bridge_funcs; > + drm_bridge_attach(encoder, &dsi->bridge, NULL); > + > if (dsi->in_bridge_node) { > in_bridge = of_drm_find_bridge(dsi->in_bridge_node); > if (in_bridge) > - drm_bridge_attach(encoder, in_bridge, NULL); > + drm_bridge_attach(encoder, in_bridge, &dsi->bridge); > } Same as for patch 01/21, maybe this could be moved to this bridge's attach operation ? Actually, now that I've read the code, this in_bridge part looks weird. Why would the DSI encoder have an input bridge that is has to manage itself ? I don't feel confident enough to ack this patch. It goes in the right direction as far as the API evolution is concerned, so if you get an ack from the Exynos maintainers, I'm happy enough to see it merged. > > return mipi_dsi_host_register(&dsi->dsi_host); > @@ -1708,7 +1728,8 @@ static void exynos_dsi_unbind(struct device *dev, struct device *master, > struct drm_encoder *encoder = dev_get_drvdata(dev); > struct exynos_dsi *dsi = encoder_to_dsi(encoder); > > - exynos_dsi_disable(encoder); > + exynos_dsi_disable(&dsi->bridge); > + exynos_dsi_post_disable(&dsi->bridge); > > mipi_dsi_host_unregister(&dsi->dsi_host); > } -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 03/21] drm/exynos: Declare the DSI encoder as a bridge element Date: Sun, 24 Nov 2019 12:24:33 +0200 Message-ID: <20191124102433.GD4727@pendragon.ideasonboard.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-4-boris.brezillon@collabora.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647]) by gabe.freedesktop.org (Postfix) with ESMTPS id 4818A89CDD for ; Sun, 24 Nov 2019 10:24:45 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20191023154512.9762-4-boris.brezillon@collabora.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Boris Brezillon Cc: Mark Rutland , Neil Armstrong , dri-devel@lists.freedesktop.org, Thierry Reding , kernel@collabora.com, Sam Ravnborg , Nikita Yushchenko , Andrey Smirnov , Kyungmin Park , Chris Healy , devicetree@vger.kernel.org, Jonas Karlman , Rob Herring , Jernej Skrabec , Seung-Woo Kim List-Id: dri-devel@lists.freedesktop.org SGkgQm9yaXMsCgpUaGFuayB5b3UgZm9yIHRoZSBwYXRjaC4KCk9uIFdlZCwgT2N0IDIzLCAyMDE5 IGF0IDA1OjQ0OjU0UE0gKzAyMDAsIEJvcmlzIEJyZXppbGxvbiB3cm90ZToKPiBFbmNvZGVyIGRy aXZlcnMgd2lsbCBwcm9ncmVzc2l2ZWx5IHRyYW5zaXRpb24gdG8gdGhlIGRybV9icmlkZ2UKPiBp bnRlcmZhY2UgaW4gcGxhY2Ugb2YgdGhlIGRybV9lbmNvZGVyIG9uZS4KPiAKPiBDb252ZXJ0aW5n IHRoZSBFeHlub3MgRFNJIGVuY29kZXIgZHJpdmVyIHRvIHRoaXMgYXBwcm9hY2ggYWxsb3dzIHVz IHRvCj4gdXNlIHRoZSAtPnByZV97ZW5hYmxlLGRpc2FibGV9KCkgIGhvb2tzIGFuZCBnZXQgcmlk IG9mIHRoZSBoYWNrCj4gcmVzZXR0aW5nIGVuY29kZXItPmJyaWRnZS5uZXh0ICh3aGljaCB3YXMg bmVlZGVkIHRvIGNvbnRyb2wgdGhlCj4gZW5jb2Rlci9icmlkZ2UgZW5hYmxlL2Rpc2FibGUgc2Vx dWVuY2UpLgo+IAo+IFNpZ25lZC1vZmYtYnk6IEJvcmlzIEJyZXppbGxvbiA8Ym9yaXMuYnJlemls bG9uQGNvbGxhYm9yYS5jb20+Cj4gLS0tCj4gQ2hhbmdlcyBpbiB2MzoKPiAqIEVtYmVkIGEgZHJt X2JyaWRnZSBvYmplY3QgaW4gZXh5bm9zX2RzaSBzaW5jZSBkcm1fZW5jb2RlciBubyBsb25nZXIK PiAgIGhhcyBhIGR1bW15IGJyaWRnZQo+IAo+IENoYW5nZXMgaW4gdjI6Cj4gKiBOZXcgcGF0Y2gg KHJlcGxhY2VtZW50IGZvciAiZHJtL2V4eW5vczogR2V0IHJpZCBvZiBleHlub3NfZHNpLT5vdXRf YnJpZGdlIikKPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2V4eW5vcy9leHlub3NfZHJtX2RzaS5j IHwgODkgKysrKysrKysrKysrKysrLS0tLS0tLS0tLQo+ICAxIGZpbGUgY2hhbmdlZCwgNTUgaW5z ZXJ0aW9ucygrKSwgMzQgZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYyBiL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5 bm9zX2RybV9kc2kuYwo+IGluZGV4IDcyNzI2ZjJjN2E5Zi4uMzkxNWY1MGIwMDVlIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYwo+ICsrKyBiL2Ry aXZlcnMvZ3B1L2RybS9leHlub3MvZXh5bm9zX2RybV9kc2kuYwo+IEBAIC0yNTIsMTAgKzI1Miwx MCBAQCBzdHJ1Y3QgZXh5bm9zX2RzaV9kcml2ZXJfZGF0YSB7Cj4gIAo+ICBzdHJ1Y3QgZXh5bm9z X2RzaSB7Cj4gIAlzdHJ1Y3QgZHJtX2VuY29kZXIgZW5jb2RlcjsKPiArCXN0cnVjdCBkcm1fYnJp ZGdlIGJyaWRnZTsKPiAgCXN0cnVjdCBtaXBpX2RzaV9ob3N0IGRzaV9ob3N0Owo+ICAJc3RydWN0 IGRybV9jb25uZWN0b3IgY29ubmVjdG9yOwo+ICAJc3RydWN0IGRybV9wYW5lbCAqcGFuZWw7Cj4g LQlzdHJ1Y3QgZHJtX2JyaWRnZSAqb3V0X2JyaWRnZTsKPiAgCXN0cnVjdCBkZXZpY2UgKmRldjsK PiAgCj4gIAl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwo+IEBAIC0yOTEsNiArMjkxLDExIEBAIHN0 YXRpYyBpbmxpbmUgc3RydWN0IGV4eW5vc19kc2kgKmVuY29kZXJfdG9fZHNpKHN0cnVjdCBkcm1f ZW5jb2RlciAqZSkKPiAgCXJldHVybiBjb250YWluZXJfb2YoZSwgc3RydWN0IGV4eW5vc19kc2ks IGVuY29kZXIpOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW5saW5lIHN0cnVjdCBleHlub3NfZHNpICpi cmlkZ2VfdG9fZHNpKHN0cnVjdCBkcm1fYnJpZGdlICpiKQo+ICt7Cj4gKwlyZXR1cm4gY29udGFp bmVyX29mKGIsIHN0cnVjdCBleHlub3NfZHNpLCBicmlkZ2UpOwo+ICt9Cj4gKwo+ICBlbnVtIHJl Z19pZHggewo+ICAJRFNJTV9TVEFUVVNfUkVHLAkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KPiAgCURT SU1fU1dSU1RfUkVHLAkJLyogU29mdHdhcmUgcmVzZXQgcmVnaXN0ZXIgKi8KPiBAQCAtMTM3NCwy NSArMTM3OSwzOCBAQCBzdGF0aWMgdm9pZCBleHlub3NfZHNpX3VucmVnaXN0ZXJfdGVfaXJxKHN0 cnVjdCBleHlub3NfZHNpICpkc2kpCj4gIAl9Cj4gIH0KPiAgCj4gLXN0YXRpYyB2b2lkIGV4eW5v c19kc2lfZW5hYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKPiArc3RhdGljIHZvaWQg ZXh5bm9zX2RzaV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gIHsKPiAt CXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBlbmNvZGVyX3RvX2RzaShlbmNvZGVyKTsKPiArCXN0 cnVjdCBleHlub3NfZHNpICpkc2kgPSBicmlkZ2VfdG9fZHNpKGJyaWRnZSk7Cj4gIAlpbnQgcmV0 Owo+ICAKPiAgCWlmIChkc2ktPnN0YXRlICYgRFNJTV9TVEFURV9FTkFCTEVEKQo+ICAJCXJldHVy bjsKClRoaXMgY2FuIHByb2JhYmx5IGJlIHJlbW92ZWQgbm93IGFzIHRoZSBjb3JlIHNob3VsZCBl bnN1cmUgdGhhdApkb3VibGUtZW5hYmxlIG9yIGRvdWJsZS1kaXNhYmxlIG5ldmVyIG9jY3Vycywg YnV0IGl0IGNhbiBiZSBkb25lIGluIGEKc2VwYXJhdGUgcGF0Y2guCgo+ICAKPiAgCXBtX3J1bnRp bWVfZ2V0X3N5bmMoZHNpLT5kZXYpOwo+IC0JZHNpLT5zdGF0ZSB8PSBEU0lNX1NUQVRFX0VOQUJM RUQ7Cj4gIAo+ICAJaWYgKGRzaS0+cGFuZWwpIHsKPiAgCQlyZXQgPSBkcm1fcGFuZWxfcHJlcGFy ZShkc2ktPnBhbmVsKTsKPiAgCQlpZiAocmV0IDwgMCkKPiAgCQkJZ290byBlcnJfcHV0X3N5bmM7 Cj4gLQl9IGVsc2Ugewo+IC0JCWRybV9icmlkZ2VfcHJlX2VuYWJsZShkc2ktPm91dF9icmlkZ2Up Owo+ICAJfQoKSXQgd291bGQgYmUgbmljZSB0byBzd2l0Y2ggdG8gdGhlIGRybSBwYW5lbCBicmlk Z2UsIGJ1dCB0aGF0IGNhbiBhbHNvIGJlCmRvbmUgb24gdG9wIG9mIHRoaXMgc2VyaWVzLgoKPiAg Cj4gKwlkc2ktPnN0YXRlIHw9IERTSU1fU1RBVEVfRU5BQkxFRDsKPiArCXJldHVybjsKPiArCj4g K2Vycl9wdXRfc3luYzoKPiArCXBtX3J1bnRpbWVfcHV0KGRzaS0+ZGV2KTsKPiArfQo+ICsKPiAr c3RhdGljIHZvaWQgZXh5bm9zX2RzaV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkK PiArewo+ICsJc3RydWN0IGV4eW5vc19kc2kgKmRzaSA9IGJyaWRnZV90b19kc2koYnJpZGdlKTsK PiArCWludCByZXQ7Cj4gKwo+ICsJaWYgKCEoZHNpLT5zdGF0ZSAmIERTSU1fU1RBVEVfRU5BQkxF RCkgfHwKPiArCSAgICAoZHNpLT5zdGF0ZSAmIERTSU1fU1RBVEVfVklET1VUX0FWQUlMQUJMRSkp Cj4gKwkJcmV0dXJuOwo+ICsKPiAgCWV4eW5vc19kc2lfc2V0X2Rpc3BsYXlfbW9kZShkc2kpOwo+ ICAJZXh5bm9zX2RzaV9zZXRfZGlzcGxheV9lbmFibGUoZHNpLCB0cnVlKTsKPiAgCj4gQEAgLTE0 MDAsOCArMTQxOCw2IEBAIHN0YXRpYyB2b2lkIGV4eW5vc19kc2lfZW5hYmxlKHN0cnVjdCBkcm1f ZW5jb2RlciAqZW5jb2RlcikKPiAgCQlyZXQgPSBkcm1fcGFuZWxfZW5hYmxlKGRzaS0+cGFuZWwp Owo+ICAJCWlmIChyZXQgPCAwKQo+ICAJCQlnb3RvIGVycl9kaXNwbGF5X2Rpc2FibGU7Cj4gLQl9 IGVsc2Ugewo+IC0JCWRybV9icmlkZ2VfZW5hYmxlKGRzaS0+b3V0X2JyaWRnZSk7Cj4gIAl9Cj4g IAo+ICAJZHNpLT5zdGF0ZSB8PSBEU0lNX1NUQVRFX1ZJRE9VVF9BVkFJTEFCTEU7Cj4gQEAgLTE0 MTAsMjggKzE0MjYsMzAgQEAgc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9lbmFibGUoc3RydWN0IGRy bV9lbmNvZGVyICplbmNvZGVyKQo+ICBlcnJfZGlzcGxheV9kaXNhYmxlOgo+ICAJZXh5bm9zX2Rz aV9zZXRfZGlzcGxheV9lbmFibGUoZHNpLCBmYWxzZSk7Cj4gIAlkcm1fcGFuZWxfdW5wcmVwYXJl KGRzaS0+cGFuZWwpOwoKRG9lcyB0aGlzIGJlbG9uZyBoZXJlLCBhcyBkcm1fcGFuZWxfcHJlcGFy ZSgpIHdhcyBjYWxsZWQgaW4KZXh5bm9zX2RzaV9wcmVfZW5hYmxlKCkgPwoKPiAtCj4gLWVycl9w dXRfc3luYzoKPiAtCWRzaS0+c3RhdGUgJj0gfkRTSU1fU1RBVEVfRU5BQkxFRDsKPiAtCXBtX3J1 bnRpbWVfcHV0KGRzaS0+ZGV2KTsKPiAgfQo+ICAKPiAtc3RhdGljIHZvaWQgZXh5bm9zX2RzaV9k aXNhYmxlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKPiArc3RhdGljIHZvaWQgZXh5bm9z X2RzaV9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gIHsKPiAtCXN0cnVjdCBl eHlub3NfZHNpICpkc2kgPSBlbmNvZGVyX3RvX2RzaShlbmNvZGVyKTsKPiArCXN0cnVjdCBleHlu b3NfZHNpICpkc2kgPSBicmlkZ2VfdG9fZHNpKGJyaWRnZSk7Cj4gKwo+ICsJaWYgKCEoZHNpLT5z dGF0ZSAmIERTSU1fU1RBVEVfVklET1VUX0FWQUlMQUJMRSkpCj4gKwkJcmV0dXJuOwo+ICsKPiAr CWRybV9wYW5lbF9kaXNhYmxlKGRzaS0+cGFuZWwpOwo+ICsJZXh5bm9zX2RzaV9zZXRfZGlzcGxh eV9lbmFibGUoZHNpLCBmYWxzZSk7Cj4gKwlkc2ktPnN0YXRlICY9IH5EU0lNX1NUQVRFX1ZJRE9V VF9BVkFJTEFCTEU7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIGV4eW5vc19kc2lfcG9zdF9kaXNh YmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gK3sKPiArCXN0cnVjdCBleHlub3NfZHNp ICpkc2kgPSBicmlkZ2VfdG9fZHNpKGJyaWRnZSk7Cj4gIAo+ICAJaWYgKCEoZHNpLT5zdGF0ZSAm IERTSU1fU1RBVEVfRU5BQkxFRCkpCj4gIAkJcmV0dXJuOwo+ICAKPiAtCWRzaS0+c3RhdGUgJj0g fkRTSU1fU1RBVEVfVklET1VUX0FWQUlMQUJMRTsKPiAtCj4gLQlkcm1fcGFuZWxfZGlzYWJsZShk c2ktPnBhbmVsKTsKPiAtCWRybV9icmlkZ2VfZGlzYWJsZShkc2ktPm91dF9icmlkZ2UpOwo+IC0J ZXh5bm9zX2RzaV9zZXRfZGlzcGxheV9lbmFibGUoZHNpLCBmYWxzZSk7Cj4gIAlkcm1fcGFuZWxf dW5wcmVwYXJlKGRzaS0+cGFuZWwpOwo+IC0JZHJtX2JyaWRnZV9wb3N0X2Rpc2FibGUoZHNpLT5v dXRfYnJpZGdlKTsKPiAtCWRzaS0+c3RhdGUgJj0gfkRTSU1fU1RBVEVfRU5BQkxFRDsKPiAgCXBt X3J1bnRpbWVfcHV0X3N5bmMoZHNpLT5kZXYpOwo+ICsJZHNpLT5zdGF0ZSAmPSB+RFNJTV9TVEFU RV9FTkFCTEVEOwo+ICB9Cj4gIAo+ICBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwo+ IEBAIC0xNDk5LDkgKzE1MTcsMTEgQEAgc3RhdGljIGludCBleHlub3NfZHNpX2NyZWF0ZV9jb25u ZWN0b3Ioc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAg Cj4gLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzIGV4eW5vc19k c2lfZW5jb2Rlcl9oZWxwZXJfZnVuY3MgPSB7Cj4gK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2Jy aWRnZV9mdW5jcyBleHlub3NfZHNpX2JyaWRnZV9mdW5jcyA9IHsKPiArCS5wcmVfZW5hYmxlID0g ZXh5bm9zX2RzaV9wcmVfZW5hYmxlLAo+ICAJLmVuYWJsZSA9IGV4eW5vc19kc2lfZW5hYmxlLAo+ ICAJLmRpc2FibGUgPSBleHlub3NfZHNpX2Rpc2FibGUsCj4gKwkucG9zdF9kaXNhYmxlID0gZXh5 bm9zX2RzaV9wb3N0X2Rpc2FibGUsCj4gIH07Cj4gIAo+ICBzdGF0aWMgY29uc3Qgc3RydWN0IGRy bV9lbmNvZGVyX2Z1bmNzIGV4eW5vc19kc2lfZW5jb2Rlcl9mdW5jcyA9IHsKPiBAQCAtMTUyMCw5 ICsxNTQwLDcgQEAgc3RhdGljIGludCBleHlub3NfZHNpX2hvc3RfYXR0YWNoKHN0cnVjdCBtaXBp X2RzaV9ob3N0ICpob3N0LAo+ICAKPiAgCW91dF9icmlkZ2UgID0gb2ZfZHJtX2ZpbmRfYnJpZGdl KGRldmljZS0+ZGV2Lm9mX25vZGUpOwo+ICAJaWYgKG91dF9icmlkZ2UpIHsKPiAtCQlkcm1fYnJp ZGdlX2F0dGFjaChlbmNvZGVyLCBvdXRfYnJpZGdlLCBOVUxMKTsKPiAtCQlkc2ktPm91dF9icmlk Z2UgPSBvdXRfYnJpZGdlOwo+IC0JCWVuY29kZXItPmJyaWRnZSA9IE5VTEw7Cj4gKwkJZHJtX2Jy aWRnZV9hdHRhY2goZW5jb2Rlciwgb3V0X2JyaWRnZSwgJmRzaS0+YnJpZGdlKTsKPiAgCX0gZWxz ZSB7Cj4gIAkJaW50IHJldCA9IGV4eW5vc19kc2lfY3JlYXRlX2Nvbm5lY3RvcihlbmNvZGVyKTsK PiAgCj4gQEAgLTE1NzUsMTkgKzE1OTMsMTkgQEAgc3RhdGljIGludCBleHlub3NfZHNpX2hvc3Rf ZGV0YWNoKHN0cnVjdCBtaXBpX2RzaV9ob3N0ICpob3N0LAo+ICAJCQkJICBzdHJ1Y3QgbWlwaV9k c2lfZGV2aWNlICpkZXZpY2UpCj4gIHsKPiAgCXN0cnVjdCBleHlub3NfZHNpICpkc2kgPSBob3N0 X3RvX2RzaShob3N0KTsKPiArCXN0cnVjdCBkcm1fYnJpZGdlICpvdXRfYnJpZGdlID0gZHNpLT5i cmlkZ2UubmV4dDsKPiAgCXN0cnVjdCBkcm1fZGV2aWNlICpkcm0gPSBkc2ktPmVuY29kZXIuZGV2 Owo+ICAKPiAgCWlmIChkc2ktPnBhbmVsKSB7Cj4gIAkJbXV0ZXhfbG9jaygmZHJtLT5tb2RlX2Nv bmZpZy5tdXRleCk7Cj4gLQkJZXh5bm9zX2RzaV9kaXNhYmxlKCZkc2ktPmVuY29kZXIpOwo+ICsJ CWV4eW5vc19kc2lfZGlzYWJsZSgmZHNpLT5icmlkZ2UpOwo+ICsJCWV4eW5vc19kc2lfcG9zdF9k aXNhYmxlKCZkc2ktPmJyaWRnZSk7Cj4gIAkJZHJtX3BhbmVsX2RldGFjaChkc2ktPnBhbmVsKTsK PiAgCQlkc2ktPnBhbmVsID0gTlVMTDsKPiAgCQlkc2ktPmNvbm5lY3Rvci5zdGF0dXMgPSBjb25u ZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKPiAgCQltdXRleF91bmxvY2soJmRybS0+bW9kZV9j b25maWcubXV0ZXgpOwo+IC0JfSBlbHNlIHsKPiAtCQlpZiAoZHNpLT5vdXRfYnJpZGdlLT5mdW5j cy0+ZGV0YWNoKQo+IC0JCQlkc2ktPm91dF9icmlkZ2UtPmZ1bmNzLT5kZXRhY2goZHNpLT5vdXRf YnJpZGdlKTsKPiAtCQlkc2ktPm91dF9icmlkZ2UgPSBOVUxMOwo+ICsJfSBlbHNlIGlmIChvdXRf YnJpZGdlICYmIG91dF9icmlkZ2UtPmZ1bmNzLT5kZXRhY2gpIHsKPiArCQlvdXRfYnJpZGdlLT5m dW5jcy0+ZGV0YWNoKG91dF9icmlkZ2UpOwoKTWF5YmUgZHJtX2JyaWRnZV9kZXRhY2goKSA/Cgo+ ICAJfQo+ICAKPiAgCWlmIChkcm0tPm1vZGVfY29uZmlnLnBvbGxfZW5hYmxlZCkKPiBAQCAtMTY4 NywxNiArMTcwNSwxOCBAQCBzdGF0aWMgaW50IGV4eW5vc19kc2lfYmluZChzdHJ1Y3QgZGV2aWNl ICpkZXYsIHN0cnVjdCBkZXZpY2UgKm1hc3RlciwKPiAgCWRybV9lbmNvZGVyX2luaXQoZHJtX2Rl diwgZW5jb2RlciwgJmV4eW5vc19kc2lfZW5jb2Rlcl9mdW5jcywKPiAgCQkJIERSTV9NT0RFX0VO Q09ERVJfVE1EUywgTlVMTCk7Cj4gIAo+IC0JZHJtX2VuY29kZXJfaGVscGVyX2FkZChlbmNvZGVy LCAmZXh5bm9zX2RzaV9lbmNvZGVyX2hlbHBlcl9mdW5jcyk7Cj4gLQo+ICAJcmV0ID0gZXh5bm9z X2RybV9zZXRfcG9zc2libGVfY3J0Y3MoZW5jb2RlciwgRVhZTk9TX0RJU1BMQVlfVFlQRV9MQ0Qp Owo+ICAJaWYgKHJldCA8IDApCj4gIAkJcmV0dXJuIHJldDsKPiAgCj4gKwkvKiBEZWNsYXJlIG91 cnNlbGYgYXMgdGhlIGZpcnN0IGJyaWRnZSBlbGVtZW50LiAqLwo+ICsJZHNpLT5icmlkZ2UuZnVu Y3MgPSAmZXh5bm9zX2RzaV9icmlkZ2VfZnVuY3M7Cj4gKwlkcm1fYnJpZGdlX2F0dGFjaChlbmNv ZGVyLCAmZHNpLT5icmlkZ2UsIE5VTEwpOwo+ICsKPiAgCWlmIChkc2ktPmluX2JyaWRnZV9ub2Rl KSB7Cj4gIAkJaW5fYnJpZGdlID0gb2ZfZHJtX2ZpbmRfYnJpZGdlKGRzaS0+aW5fYnJpZGdlX25v ZGUpOwo+ICAJCWlmIChpbl9icmlkZ2UpCj4gLQkJCWRybV9icmlkZ2VfYXR0YWNoKGVuY29kZXIs IGluX2JyaWRnZSwgTlVMTCk7Cj4gKwkJCWRybV9icmlkZ2VfYXR0YWNoKGVuY29kZXIsIGluX2Jy aWRnZSwgJmRzaS0+YnJpZGdlKTsKPiAgCX0KClNhbWUgYXMgZm9yIHBhdGNoIDAxLzIxLCBtYXli ZSB0aGlzIGNvdWxkIGJlIG1vdmVkIHRvIHRoaXMgYnJpZGdlJ3MKYXR0YWNoIG9wZXJhdGlvbiA/ IEFjdHVhbGx5LCBub3cgdGhhdCBJJ3ZlIHJlYWQgdGhlIGNvZGUsIHRoaXMgaW5fYnJpZGdlCnBh cnQgbG9va3Mgd2VpcmQuIFdoeSB3b3VsZCB0aGUgRFNJIGVuY29kZXIgaGF2ZSBhbiBpbnB1dCBi cmlkZ2UgdGhhdCBpcwpoYXMgdG8gbWFuYWdlIGl0c2VsZiA/CgpJIGRvbid0IGZlZWwgY29uZmlk ZW50IGVub3VnaCB0byBhY2sgdGhpcyBwYXRjaC4gSXQgZ29lcyBpbiB0aGUgcmlnaHQKZGlyZWN0 aW9uIGFzIGZhciBhcyB0aGUgQVBJIGV2b2x1dGlvbiBpcyBjb25jZXJuZWQsIHNvIGlmIHlvdSBn ZXQgYW4gYWNrCmZyb20gdGhlIEV4eW5vcyBtYWludGFpbmVycywgSSdtIGhhcHB5IGVub3VnaCB0 byBzZWUgaXQgbWVyZ2VkLgoKPiAgCj4gIAlyZXR1cm4gbWlwaV9kc2lfaG9zdF9yZWdpc3Rlcigm ZHNpLT5kc2lfaG9zdCk7Cj4gQEAgLTE3MDgsNyArMTcyOCw4IEBAIHN0YXRpYyB2b2lkIGV4eW5v c19kc2lfdW5iaW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZSAqbWFzdGVyLAo+ ICAJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gZGV2X2dldF9kcnZkYXRhKGRldik7Cj4g IAlzdHJ1Y3QgZXh5bm9zX2RzaSAqZHNpID0gZW5jb2Rlcl90b19kc2koZW5jb2Rlcik7Cj4gIAo+ IC0JZXh5bm9zX2RzaV9kaXNhYmxlKGVuY29kZXIpOwo+ICsJZXh5bm9zX2RzaV9kaXNhYmxlKCZk c2ktPmJyaWRnZSk7Cj4gKwlleHlub3NfZHNpX3Bvc3RfZGlzYWJsZSgmZHNpLT5icmlkZ2UpOwo+ ICAKPiAgCW1pcGlfZHNpX2hvc3RfdW5yZWdpc3RlcigmZHNpLT5kc2lfaG9zdCk7Cj4gIH0KCi0t IApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9kcmktZGV2ZWw=