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.6 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,USER_AGENT_MUTT 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 D6432C04AB6 for ; Tue, 28 May 2019 12:47:09 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9E09E20883 for ; Tue, 28 May 2019 12:47:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="iQXzIXXE" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727141AbfE1MrJ (ORCPT ); Tue, 28 May 2019 08:47:09 -0400 Received: from perceval.ideasonboard.com ([213.167.242.64]:48130 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727195AbfE1MrJ (ORCPT ); Tue, 28 May 2019 08:47:09 -0400 Received: from pendragon.ideasonboard.com (85-76-65-42-nat.elisa-mobile.fi [85.76.65.42]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 57979D85; Tue, 28 May 2019 14:47:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1559047626; bh=nnAz8+XkS/sgSzYgWk0RaoOvi7WtJ6ZQ/a38HYAaJ9I=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=iQXzIXXEr341hhkLkr47Kqld1aludjV91QMv5fyZx1AvlMCYdRRv06E9LrdIVFp++ n+moj3b3yZxCun9fh6WE9KI7VOnpUq/ajt+DieG3N/4WGaGHR5kICWWfOyIpIFdUCe FOQrZbJLHiZRiisZbNeGv7D72OZZmoqS464W6+mg= Date: Tue, 28 May 2019 15:46:47 +0300 From: Laurent Pinchart To: Jacopo Mondi Cc: Laurent Pinchart , dri-devel@lists.freedesktop.org, linux-renesas-soc@vger.kernel.org, Kieran Bingham , Jacopo Mondi Subject: Re: [PATCH v2 06/10] drm: rcar-du: lvds: Add support for dual-link mode Message-ID: <20190528124647.GC5916@pendragon.ideasonboard.com> References: <20190511210702.18394-1-laurent.pinchart+renesas@ideasonboard.com> <20190511210702.18394-7-laurent.pinchart+renesas@ideasonboard.com> <20190528093550.iwei6kpcx5hyb2nb@uno.localdomain> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20190528093550.iwei6kpcx5hyb2nb@uno.localdomain> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-renesas-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-renesas-soc@vger.kernel.org Hi Jacopo, On Tue, May 28, 2019 at 11:35:50AM +0200, Jacopo Mondi wrote: > Hi Laurent, > a small note. > > On Sun, May 12, 2019 at 12:06:58AM +0300, Laurent Pinchart wrote: > > In dual-link mode the LVDS0 encoder transmits even-numbered pixels, and > > sends odd-numbered pixels to the LVDS1 encoder for transmission on a > > separate link. > > > > To implement support for this mode of operation, determine if the LVDS > > connection operates in dual-link mode by querying the next device in the > > pipeline, locate the companion encoder, and control it directly through > > its bridge operations. > > > > Signed-off-by: Laurent Pinchart > > Reviewed-by: Jacopo Mondi > > --- > > drivers/gpu/drm/rcar-du/rcar_lvds.c | 104 ++++++++++++++++++++++++---- > > drivers/gpu/drm/rcar-du/rcar_lvds.h | 5 ++ > > 2 files changed, 96 insertions(+), 13 deletions(-) > > > > diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.c b/drivers/gpu/drm/rcar-du/rcar_lvds.c > > index a331f0c32187..f7e4710fe33f 100644 > > --- a/drivers/gpu/drm/rcar-du/rcar_lvds.c > > +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.c > > @@ -66,6 +66,9 @@ struct rcar_lvds { > > > > struct drm_display_mode display_mode; > > enum rcar_lvds_mode mode; > > + > > + struct drm_bridge *companion; > > + bool dual_link; > > }; > > > > #define bridge_to_rcar_lvds(bridge) \ > > @@ -400,11 +403,6 @@ static void rcar_lvds_enable(struct drm_bridge *bridge) > > { > > struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); > > const struct drm_display_mode *mode = &lvds->display_mode; > > - /* > > - * FIXME: We should really retrieve the CRTC through the state, but how > > - * do we get a state pointer? > > - */ > > - struct drm_crtc *crtc = lvds->bridge.encoder->crtc; > > u32 lvdhcr; > > u32 lvdcr0; > > int ret; > > @@ -413,6 +411,10 @@ static void rcar_lvds_enable(struct drm_bridge *bridge) > > if (ret < 0) > > return; > > > > + /* Enable the companion LVDS encoder in dual-link mode. */ > > + if (lvds->dual_link && lvds->companion) > > + lvds->companion->funcs->enable(lvds->companion); > > + > > /* > > * Hardcode the channels and control signals routing for now. > > * > > @@ -435,17 +437,33 @@ static void rcar_lvds_enable(struct drm_bridge *bridge) > > rcar_lvds_write(lvds, LVDCHCR, lvdhcr); > > > > if (lvds->info->quirks & RCAR_LVDS_QUIRK_DUAL_LINK) { > > - /* Disable dual-link mode. */ > > - rcar_lvds_write(lvds, LVDSTRIPE, 0); > > + /* > > + * Configure vertical stripe based on the mode of operation of > > + * the connected device. > > + */ > > + rcar_lvds_write(lvds, LVDSTRIPE, > > + lvds->dual_link ? LVDSTRIPE_ST_ON : 0); > > } > > > > - /* PLL clock configuration. */ > > - lvds->info->pll_setup(lvds, mode->clock * 1000); > > + /* > > + * PLL clock configuration on all instances but the companion in > > + * dual-link mode. > > + */ > > + if (!lvds->dual_link || lvds->companion) > > + lvds->info->pll_setup(lvds, mode->clock * 1000); > > > > /* Set the LVDS mode and select the input. */ > > lvdcr0 = lvds->mode << LVDCR0_LVMD_SHIFT; > > - if (drm_crtc_index(crtc) == 2) > > - lvdcr0 |= LVDCR0_DUSEL; > > + > > + if (lvds->bridge.encoder) { > > + /* > > + * FIXME: We should really retrieve the CRTC through the state, > > + * but how do we get a state pointer? > > + */ > > + if (drm_crtc_index(lvds->bridge.encoder->crtc) == 2) > > + lvdcr0 |= LVDCR0_DUSEL; > > + } > > + > > rcar_lvds_write(lvds, LVDCR0, lvdcr0); > > > > /* Turn all the channels on. */ > > @@ -512,6 +530,10 @@ static void rcar_lvds_disable(struct drm_bridge *bridge) > > rcar_lvds_write(lvds, LVDCR1, 0); > > rcar_lvds_write(lvds, LVDPLLCR, 0); > > > > + /* Disable the companion LVDS encoder in dual-link mode. */ > > + if (lvds->dual_link && lvds->companion) > > + lvds->companion->funcs->disable(lvds->companion); > > + > > clk_disable_unprepare(lvds->clocks.mod); > > } > > > > @@ -628,10 +650,54 @@ static const struct drm_bridge_funcs rcar_lvds_bridge_ops = { > > .mode_set = rcar_lvds_mode_set, > > }; > > > > +bool rcar_lvds_dual_link(struct drm_bridge *bridge) > > +{ > > + struct rcar_lvds *lvds = bridge_to_rcar_lvds(bridge); > > + > > + return lvds->dual_link; > > +} > > +EXPORT_SYMBOL_GPL(rcar_lvds_dual_link); > > + > > /* ----------------------------------------------------------------------------- > > * Probe & Remove > > */ > > > > +static int rcar_lvds_parse_dt_companion(struct rcar_lvds *lvds) > > +{ > > + const struct of_device_id *match; > > + struct device_node *companion; > > + struct device *dev = lvds->dev; > > + int ret = 0; > > + > > + /* Locate the companion LVDS encoder for dual-link operation, if any. */ > > + companion = of_parse_phandle(dev->of_node, "renesas,companion", 0); > > + if (!companion) > > + return -ENODEV; > > + > > + /* > > + * Sanity check: the companion encoder must have the same compatible > > + * string. > > + */ > > + match = of_match_device(dev->driver->of_match_table, dev); > > + if (!of_device_is_compatible(companion, match->compatible)) { > > + ret = -ENODEV; > > + goto done; > > + } > > + > > + lvds->companion = of_drm_find_bridge(companion); > > + if (!lvds->companion) { > > + ret = -EPROBE_DEFER; > > + goto done; > > + } > > + > > + dev_dbg(dev, "Found companion encoder %pOF\n", companion); > > + > > +done: > > + of_node_put(companion); > > + > > + return ret; > > +} > > + > > static int rcar_lvds_parse_dt(struct rcar_lvds *lvds) > > { > > struct device_node *local_output = NULL; > > @@ -682,14 +748,26 @@ static int rcar_lvds_parse_dt(struct rcar_lvds *lvds) > > > > if (is_bridge) { > > lvds->next_bridge = of_drm_find_bridge(remote); > > - if (!lvds->next_bridge) > > + if (!lvds->next_bridge) { > > ret = -EPROBE_DEFER; > > + goto done; > > + } > > + > > + if (lvds->info->quirks & RCAR_LVDS_QUIRK_DUAL_LINK) > > + lvds->dual_link = lvds->next_bridge->timings > > + ? lvds->next_bridge->timings->dual_link > > + : false; > > } else { > > lvds->panel = of_drm_find_panel(remote); > > - if (IS_ERR(lvds->panel)) > > + if (IS_ERR(lvds->panel)) { > > ret = PTR_ERR(lvds->panel); > > + goto done; > > + } > > } > > > > + if (lvds->dual_link) > > + ret = rcar_lvds_parse_dt_companion(lvds); > > Looking at the error path here below, for E3/D3, -ENODEV gets > sanitized to return 0 as we want this method to return success even if > no endpoint is there, when using the LVDS encoder provided clock to > back-feed the DU. > > This is not the case for the companion property imho. If the property is > specified, it should be sane and -ENODEV is worth being propagated to > the caller. But in that case the LVDS encoder will fail to probe, and so the DU channel will not be able to output on the DPAD. Isn't it worth supporting that ? Otherwise I can simply make rcar_lvds_parse_dt_companion() return -EINVAL or -ENXIO and it should be fine with the existing error handling path. > You could move the error handling bits in the error path: > > /* > * On D3/E3 the LVDS encoder provides a clock to the DU, which can be > * used for the DPAD output even when the LVDS output is not connected. > * Don't fail probe in that case as the DU will need the bridge to > * control the clock. > */ > if (lvds->info->quirks & RCAR_LVDS_QUIRK_EXT_PLL) > return ret == -ENODEV ? 0 : ret; > > before the of_node_put() sequences, and add one more label, to skip > the above part in case parse_dt_companion() fails. > > Apart from this you can retain my tag if you like. > Thanks > j > > > + > > done: > > of_node_put(local_output); > > of_node_put(remote_input); > > diff --git a/drivers/gpu/drm/rcar-du/rcar_lvds.h b/drivers/gpu/drm/rcar-du/rcar_lvds.h > > index a709cae1bc32..222ec0e60785 100644 > > --- a/drivers/gpu/drm/rcar-du/rcar_lvds.h > > +++ b/drivers/gpu/drm/rcar-du/rcar_lvds.h > > @@ -15,6 +15,7 @@ struct drm_bridge; > > #if IS_ENABLED(CONFIG_DRM_RCAR_LVDS) > > int rcar_lvds_clk_enable(struct drm_bridge *bridge, unsigned long freq); > > void rcar_lvds_clk_disable(struct drm_bridge *bridge); > > +bool rcar_lvds_dual_link(struct drm_bridge *bridge); > > #else > > static inline int rcar_lvds_clk_enable(struct drm_bridge *bridge, > > unsigned long freq) > > @@ -22,6 +23,10 @@ static inline int rcar_lvds_clk_enable(struct drm_bridge *bridge, > > return -ENOSYS; > > } > > static inline void rcar_lvds_clk_disable(struct drm_bridge *bridge) { } > > +static inline bool rcar_lvds_dual_link(struct drm_bridge *bridge) > > +{ > > + return false; > > +} > > #endif /* CONFIG_DRM_RCAR_LVDS */ > > > > #endif /* __RCAR_LVDS_H__ */ -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v2 06/10] drm: rcar-du: lvds: Add support for dual-link mode Date: Tue, 28 May 2019 15:46:47 +0300 Message-ID: <20190528124647.GC5916@pendragon.ideasonboard.com> References: <20190511210702.18394-1-laurent.pinchart+renesas@ideasonboard.com> <20190511210702.18394-7-laurent.pinchart+renesas@ideasonboard.com> <20190528093550.iwei6kpcx5hyb2nb@uno.localdomain> 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 [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0A8D36E124 for ; Tue, 28 May 2019 12:47:07 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190528093550.iwei6kpcx5hyb2nb@uno.localdomain> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Jacopo Mondi Cc: linux-renesas-soc@vger.kernel.org, Laurent Pinchart , Jacopo Mondi , Kieran Bingham , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org SGkgSmFjb3BvLAoKT24gVHVlLCBNYXkgMjgsIDIwMTkgYXQgMTE6MzU6NTBBTSArMDIwMCwgSmFj b3BvIE1vbmRpIHdyb3RlOgo+IEhpIExhdXJlbnQsCj4gIGEgc21hbGwgbm90ZS4KPiAKPiBPbiBT dW4sIE1heSAxMiwgMjAxOSBhdCAxMjowNjo1OEFNICswMzAwLCBMYXVyZW50IFBpbmNoYXJ0IHdy b3RlOgo+ID4gSW4gZHVhbC1saW5rIG1vZGUgdGhlIExWRFMwIGVuY29kZXIgdHJhbnNtaXRzIGV2 ZW4tbnVtYmVyZWQgcGl4ZWxzLCBhbmQKPiA+IHNlbmRzIG9kZC1udW1iZXJlZCBwaXhlbHMgdG8g dGhlIExWRFMxIGVuY29kZXIgZm9yIHRyYW5zbWlzc2lvbiBvbiBhCj4gPiBzZXBhcmF0ZSBsaW5r Lgo+ID4KPiA+IFRvIGltcGxlbWVudCBzdXBwb3J0IGZvciB0aGlzIG1vZGUgb2Ygb3BlcmF0aW9u LCBkZXRlcm1pbmUgaWYgdGhlIExWRFMKPiA+IGNvbm5lY3Rpb24gb3BlcmF0ZXMgaW4gZHVhbC1s aW5rIG1vZGUgYnkgcXVlcnlpbmcgdGhlIG5leHQgZGV2aWNlIGluIHRoZQo+ID4gcGlwZWxpbmUs IGxvY2F0ZSB0aGUgY29tcGFuaW9uIGVuY29kZXIsIGFuZCBjb250cm9sIGl0IGRpcmVjdGx5IHRo cm91Z2gKPiA+IGl0cyBicmlkZ2Ugb3BlcmF0aW9ucy4KPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBM YXVyZW50IFBpbmNoYXJ0IDxsYXVyZW50LnBpbmNoYXJ0K3JlbmVzYXNAaWRlYXNvbmJvYXJkLmNv bT4KPiA+IFJldmlld2VkLWJ5OiBKYWNvcG8gTW9uZGkgPGphY29wbytyZW5lc2FzQGptb25kaS5v cmc+Cj4gPiAtLS0KPiA+ICBkcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2x2ZHMuYyB8IDEw NCArKysrKysrKysrKysrKysrKysrKysrKystLS0tCj4gPiAgZHJpdmVycy9ncHUvZHJtL3JjYXIt ZHUvcmNhcl9sdmRzLmggfCAgIDUgKysKPiA+ICAyIGZpbGVzIGNoYW5nZWQsIDk2IGluc2VydGlv bnMoKyksIDEzIGRlbGV0aW9ucygtKQo+ID4KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vcmNhci1kdS9yY2FyX2x2ZHMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZk cy5jCj4gPiBpbmRleCBhMzMxZjBjMzIxODcuLmY3ZTQ3MTBmZTMzZiAxMDA2NDQKPiA+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9yY2FyLWR1L3JjYXJfbHZkcy5jCj4gPiArKysgYi9kcml2ZXJzL2dw dS9kcm0vcmNhci1kdS9yY2FyX2x2ZHMuYwo+ID4gQEAgLTY2LDYgKzY2LDkgQEAgc3RydWN0IHJj YXJfbHZkcyB7Cj4gPgo+ID4gIAlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBkaXNwbGF5X21vZGU7 Cj4gPiAgCWVudW0gcmNhcl9sdmRzX21vZGUgbW9kZTsKPiA+ICsKPiA+ICsJc3RydWN0IGRybV9i cmlkZ2UgKmNvbXBhbmlvbjsKPiA+ICsJYm9vbCBkdWFsX2xpbms7Cj4gPiAgfTsKPiA+Cj4gPiAg I2RlZmluZSBicmlkZ2VfdG9fcmNhcl9sdmRzKGJyaWRnZSkgXAo+ID4gQEAgLTQwMCwxMSArNDAz LDYgQEAgc3RhdGljIHZvaWQgcmNhcl9sdmRzX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJp ZGdlKQo+ID4gIHsKPiA+ICAJc3RydWN0IHJjYXJfbHZkcyAqbHZkcyA9IGJyaWRnZV90b19yY2Fy X2x2ZHMoYnJpZGdlKTsKPiA+ICAJY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUg PSAmbHZkcy0+ZGlzcGxheV9tb2RlOwo+ID4gLQkvKgo+ID4gLQkgKiBGSVhNRTogV2Ugc2hvdWxk IHJlYWxseSByZXRyaWV2ZSB0aGUgQ1JUQyB0aHJvdWdoIHRoZSBzdGF0ZSwgYnV0IGhvdwo+ID4g LQkgKiBkbyB3ZSBnZXQgYSBzdGF0ZSBwb2ludGVyPwo+ID4gLQkgKi8KPiA+IC0Jc3RydWN0IGRy bV9jcnRjICpjcnRjID0gbHZkcy0+YnJpZGdlLmVuY29kZXItPmNydGM7Cj4gPiAgCXUzMiBsdmRo Y3I7Cj4gPiAgCXUzMiBsdmRjcjA7Cj4gPiAgCWludCByZXQ7Cj4gPiBAQCAtNDEzLDYgKzQxMSwx MCBAQCBzdGF0aWMgdm9pZCByY2FyX2x2ZHNfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UpCj4gPiAgCWlmIChyZXQgPCAwKQo+ID4gIAkJcmV0dXJuOwo+ID4KPiA+ICsJLyogRW5hYmxl IHRoZSBjb21wYW5pb24gTFZEUyBlbmNvZGVyIGluIGR1YWwtbGluayBtb2RlLiAqLwo+ID4gKwlp ZiAobHZkcy0+ZHVhbF9saW5rICYmIGx2ZHMtPmNvbXBhbmlvbikKPiA+ICsJCWx2ZHMtPmNvbXBh bmlvbi0+ZnVuY3MtPmVuYWJsZShsdmRzLT5jb21wYW5pb24pOwo+ID4gKwo+ID4gIAkvKgo+ID4g IAkgKiBIYXJkY29kZSB0aGUgY2hhbm5lbHMgYW5kIGNvbnRyb2wgc2lnbmFscyByb3V0aW5nIGZv ciBub3cuCj4gPiAgCSAqCj4gPiBAQCAtNDM1LDE3ICs0MzcsMzMgQEAgc3RhdGljIHZvaWQgcmNh cl9sdmRzX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gIAlyY2FyX2x2ZHNf d3JpdGUobHZkcywgTFZEQ0hDUiwgbHZkaGNyKTsKPiA+Cj4gPiAgCWlmIChsdmRzLT5pbmZvLT5x dWlya3MgJiBSQ0FSX0xWRFNfUVVJUktfRFVBTF9MSU5LKSB7Cj4gPiAtCQkvKiBEaXNhYmxlIGR1 YWwtbGluayBtb2RlLiAqLwo+ID4gLQkJcmNhcl9sdmRzX3dyaXRlKGx2ZHMsIExWRFNUUklQRSwg MCk7Cj4gPiArCQkvKgo+ID4gKwkJICogQ29uZmlndXJlIHZlcnRpY2FsIHN0cmlwZSBiYXNlZCBv biB0aGUgbW9kZSBvZiBvcGVyYXRpb24gb2YKPiA+ICsJCSAqIHRoZSBjb25uZWN0ZWQgZGV2aWNl Lgo+ID4gKwkJICovCj4gPiArCQlyY2FyX2x2ZHNfd3JpdGUobHZkcywgTFZEU1RSSVBFLAo+ID4g KwkJCQlsdmRzLT5kdWFsX2xpbmsgPyBMVkRTVFJJUEVfU1RfT04gOiAwKTsKPiA+ICAJfQo+ID4K PiA+IC0JLyogUExMIGNsb2NrIGNvbmZpZ3VyYXRpb24uICovCj4gPiAtCWx2ZHMtPmluZm8tPnBs bF9zZXR1cChsdmRzLCBtb2RlLT5jbG9jayAqIDEwMDApOwo+ID4gKwkvKgo+ID4gKwkgKiBQTEwg Y2xvY2sgY29uZmlndXJhdGlvbiBvbiBhbGwgaW5zdGFuY2VzIGJ1dCB0aGUgY29tcGFuaW9uIGlu Cj4gPiArCSAqIGR1YWwtbGluayBtb2RlLgo+ID4gKwkgKi8KPiA+ICsJaWYgKCFsdmRzLT5kdWFs X2xpbmsgfHwgbHZkcy0+Y29tcGFuaW9uKQo+ID4gKwkJbHZkcy0+aW5mby0+cGxsX3NldHVwKGx2 ZHMsIG1vZGUtPmNsb2NrICogMTAwMCk7Cj4gPgo+ID4gIAkvKiBTZXQgdGhlIExWRFMgbW9kZSBh bmQgc2VsZWN0IHRoZSBpbnB1dC4gKi8KPiA+ICAJbHZkY3IwID0gbHZkcy0+bW9kZSA8PCBMVkRD UjBfTFZNRF9TSElGVDsKPiA+IC0JaWYgKGRybV9jcnRjX2luZGV4KGNydGMpID09IDIpCj4gPiAt CQlsdmRjcjAgfD0gTFZEQ1IwX0RVU0VMOwo+ID4gKwo+ID4gKwlpZiAobHZkcy0+YnJpZGdlLmVu Y29kZXIpIHsKPiA+ICsJCS8qCj4gPiArCQkgKiBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSByZXRy aWV2ZSB0aGUgQ1JUQyB0aHJvdWdoIHRoZSBzdGF0ZSwKPiA+ICsJCSAqIGJ1dCBob3cgZG8gd2Ug Z2V0IGEgc3RhdGUgcG9pbnRlcj8KPiA+ICsJCSAqLwo+ID4gKwkJaWYgKGRybV9jcnRjX2luZGV4 KGx2ZHMtPmJyaWRnZS5lbmNvZGVyLT5jcnRjKSA9PSAyKQo+ID4gKwkJCWx2ZGNyMCB8PSBMVkRD UjBfRFVTRUw7Cj4gPiArCX0KPiA+ICsKPiA+ICAJcmNhcl9sdmRzX3dyaXRlKGx2ZHMsIExWRENS MCwgbHZkY3IwKTsKPiA+Cj4gPiAgCS8qIFR1cm4gYWxsIHRoZSBjaGFubmVscyBvbi4gKi8KPiA+ IEBAIC01MTIsNiArNTMwLDEwIEBAIHN0YXRpYyB2b2lkIHJjYXJfbHZkc19kaXNhYmxlKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gPiAgCXJjYXJfbHZkc193cml0ZShsdmRzLCBMVkRDUjEs IDApOwo+ID4gIAlyY2FyX2x2ZHNfd3JpdGUobHZkcywgTFZEUExMQ1IsIDApOwo+ID4KPiA+ICsJ LyogRGlzYWJsZSB0aGUgY29tcGFuaW9uIExWRFMgZW5jb2RlciBpbiBkdWFsLWxpbmsgbW9kZS4g Ki8KPiA+ICsJaWYgKGx2ZHMtPmR1YWxfbGluayAmJiBsdmRzLT5jb21wYW5pb24pCj4gPiArCQls dmRzLT5jb21wYW5pb24tPmZ1bmNzLT5kaXNhYmxlKGx2ZHMtPmNvbXBhbmlvbik7Cj4gPiArCj4g PiAgCWNsa19kaXNhYmxlX3VucHJlcGFyZShsdmRzLT5jbG9ja3MubW9kKTsKPiA+ICB9Cj4gPgo+ ID4gQEAgLTYyOCwxMCArNjUwLDU0IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2JyaWRnZV9m dW5jcyByY2FyX2x2ZHNfYnJpZGdlX29wcyA9IHsKPiA+ICAJLm1vZGVfc2V0ID0gcmNhcl9sdmRz X21vZGVfc2V0LAo+ID4gIH07Cj4gPgo+ID4gK2Jvb2wgcmNhcl9sdmRzX2R1YWxfbGluayhzdHJ1 Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ID4gK3sKPiA+ICsJc3RydWN0IHJjYXJfbHZkcyAqbHZk cyA9IGJyaWRnZV90b19yY2FyX2x2ZHMoYnJpZGdlKTsKPiA+ICsKPiA+ICsJcmV0dXJuIGx2ZHMt PmR1YWxfbGluazsKPiA+ICt9Cj4gPiArRVhQT1JUX1NZTUJPTF9HUEwocmNhcl9sdmRzX2R1YWxf bGluayk7Cj4gPiArCj4gPiAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiA+ICAgKiBQcm9iZSAm IFJlbW92ZQo+ID4gICAqLwo+ID4KPiA+ICtzdGF0aWMgaW50IHJjYXJfbHZkc19wYXJzZV9kdF9j b21wYW5pb24oc3RydWN0IHJjYXJfbHZkcyAqbHZkcykKPiA+ICt7Cj4gPiArCWNvbnN0IHN0cnVj dCBvZl9kZXZpY2VfaWQgKm1hdGNoOwo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbXBhbmlv bjsKPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gbHZkcy0+ZGV2Owo+ID4gKwlpbnQgcmV0ID0g MDsKPiA+ICsKPiA+ICsJLyogTG9jYXRlIHRoZSBjb21wYW5pb24gTFZEUyBlbmNvZGVyIGZvciBk dWFsLWxpbmsgb3BlcmF0aW9uLCBpZiBhbnkuICovCj4gPiArCWNvbXBhbmlvbiA9IG9mX3BhcnNl X3BoYW5kbGUoZGV2LT5vZl9ub2RlLCAicmVuZXNhcyxjb21wYW5pb24iLCAwKTsKPiA+ICsJaWYg KCFjb21wYW5pb24pCj4gPiArCQlyZXR1cm4gLUVOT0RFVjsKPiA+ICsKPiA+ICsJLyoKPiA+ICsJ ICogU2FuaXR5IGNoZWNrOiB0aGUgY29tcGFuaW9uIGVuY29kZXIgbXVzdCBoYXZlIHRoZSBzYW1l IGNvbXBhdGlibGUKPiA+ICsJICogc3RyaW5nLgo+ID4gKwkgKi8KPiA+ICsJbWF0Y2ggPSBvZl9t YXRjaF9kZXZpY2UoZGV2LT5kcml2ZXItPm9mX21hdGNoX3RhYmxlLCBkZXYpOwo+ID4gKwlpZiAo IW9mX2RldmljZV9pc19jb21wYXRpYmxlKGNvbXBhbmlvbiwgbWF0Y2gtPmNvbXBhdGlibGUpKSB7 Cj4gPiArCQlyZXQgPSAtRU5PREVWOwo+ID4gKwkJZ290byBkb25lOwo+ID4gKwl9Cj4gPiArCj4g PiArCWx2ZHMtPmNvbXBhbmlvbiA9IG9mX2RybV9maW5kX2JyaWRnZShjb21wYW5pb24pOwo+ID4g KwlpZiAoIWx2ZHMtPmNvbXBhbmlvbikgewo+ID4gKwkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKPiA+ ICsJCWdvdG8gZG9uZTsKPiA+ICsJfQo+ID4gKwo+ID4gKwlkZXZfZGJnKGRldiwgIkZvdW5kIGNv bXBhbmlvbiBlbmNvZGVyICVwT0ZcbiIsIGNvbXBhbmlvbik7Cj4gPiArCj4gPiArZG9uZToKPiA+ ICsJb2Zfbm9kZV9wdXQoY29tcGFuaW9uKTsKPiA+ICsKPiA+ICsJcmV0dXJuIHJldDsKPiA+ICt9 Cj4gPiArCj4gPiAgc3RhdGljIGludCByY2FyX2x2ZHNfcGFyc2VfZHQoc3RydWN0IHJjYXJfbHZk cyAqbHZkcykKPiA+ICB7Cj4gPiAgCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbG9jYWxfb3V0cHV0ID0g TlVMTDsKPiA+IEBAIC02ODIsMTQgKzc0OCwyNiBAQCBzdGF0aWMgaW50IHJjYXJfbHZkc19wYXJz ZV9kdChzdHJ1Y3QgcmNhcl9sdmRzICpsdmRzKQo+ID4KPiA+ICAJaWYgKGlzX2JyaWRnZSkgewo+ ID4gIAkJbHZkcy0+bmV4dF9icmlkZ2UgPSBvZl9kcm1fZmluZF9icmlkZ2UocmVtb3RlKTsKPiA+ IC0JCWlmICghbHZkcy0+bmV4dF9icmlkZ2UpCj4gPiArCQlpZiAoIWx2ZHMtPm5leHRfYnJpZGdl KSB7Cj4gPiAgCQkJcmV0ID0gLUVQUk9CRV9ERUZFUjsKPiA+ICsJCQlnb3RvIGRvbmU7Cj4gPiAr CQl9Cj4gPiArCj4gPiArCQlpZiAobHZkcy0+aW5mby0+cXVpcmtzICYgUkNBUl9MVkRTX1FVSVJL X0RVQUxfTElOSykKPiA+ICsJCQlsdmRzLT5kdWFsX2xpbmsgPSBsdmRzLT5uZXh0X2JyaWRnZS0+ dGltaW5ncwo+ID4gKwkJCQkJPyBsdmRzLT5uZXh0X2JyaWRnZS0+dGltaW5ncy0+ZHVhbF9saW5r Cj4gPiArCQkJCQk6IGZhbHNlOwo+ID4gIAl9IGVsc2Ugewo+ID4gIAkJbHZkcy0+cGFuZWwgPSBv Zl9kcm1fZmluZF9wYW5lbChyZW1vdGUpOwo+ID4gLQkJaWYgKElTX0VSUihsdmRzLT5wYW5lbCkp Cj4gPiArCQlpZiAoSVNfRVJSKGx2ZHMtPnBhbmVsKSkgewo+ID4gIAkJCXJldCA9IFBUUl9FUlIo bHZkcy0+cGFuZWwpOwo+ID4gKwkJCWdvdG8gZG9uZTsKPiA+ICsJCX0KPiA+ICAJfQo+ID4KPiA+ ICsJaWYgKGx2ZHMtPmR1YWxfbGluaykKPiA+ICsJCXJldCA9IHJjYXJfbHZkc19wYXJzZV9kdF9j b21wYW5pb24obHZkcyk7Cj4gCj4gTG9va2luZyBhdCB0aGUgZXJyb3IgcGF0aCBoZXJlIGJlbG93 LCBmb3IgRTMvRDMsIC1FTk9ERVYgZ2V0cwo+IHNhbml0aXplZCB0byByZXR1cm4gMCBhcyB3ZSB3 YW50IHRoaXMgbWV0aG9kIHRvIHJldHVybiBzdWNjZXNzIGV2ZW4gaWYKPiBubyBlbmRwb2ludCBp cyB0aGVyZSwgd2hlbiB1c2luZyB0aGUgTFZEUyBlbmNvZGVyIHByb3ZpZGVkIGNsb2NrIHRvCj4g YmFjay1mZWVkIHRoZSBEVS4KPiAKPiBUaGlzIGlzIG5vdCB0aGUgY2FzZSBmb3IgdGhlIGNvbXBh bmlvbiBwcm9wZXJ0eSBpbWhvLiBJZiB0aGUgcHJvcGVydHkgaXMKPiBzcGVjaWZpZWQsIGl0IHNo b3VsZCBiZSBzYW5lIGFuZCAtRU5PREVWIGlzIHdvcnRoIGJlaW5nIHByb3BhZ2F0ZWQgdG8KPiB0 aGUgY2FsbGVyLgoKQnV0IGluIHRoYXQgY2FzZSB0aGUgTFZEUyBlbmNvZGVyIHdpbGwgZmFpbCB0 byBwcm9iZSwgYW5kIHNvIHRoZSBEVQpjaGFubmVsIHdpbGwgbm90IGJlIGFibGUgdG8gb3V0cHV0 IG9uIHRoZSBEUEFELiBJc24ndCBpdCB3b3J0aApzdXBwb3J0aW5nIHRoYXQgPyBPdGhlcndpc2Ug SSBjYW4gc2ltcGx5IG1ha2UKcmNhcl9sdmRzX3BhcnNlX2R0X2NvbXBhbmlvbigpIHJldHVybiAt RUlOVkFMIG9yIC1FTlhJTyBhbmQgaXQgc2hvdWxkIGJlCmZpbmUgd2l0aCB0aGUgZXhpc3Rpbmcg ZXJyb3IgaGFuZGxpbmcgcGF0aC4KCj4gWW91IGNvdWxkIG1vdmUgdGhlIGVycm9yIGhhbmRsaW5n IGJpdHMgaW4gdGhlIGVycm9yIHBhdGg6Cj4gCj4gCS8qCj4gCSAqIE9uIEQzL0UzIHRoZSBMVkRT IGVuY29kZXIgcHJvdmlkZXMgYSBjbG9jayB0byB0aGUgRFUsIHdoaWNoIGNhbiBiZQo+IAkgKiB1 c2VkIGZvciB0aGUgRFBBRCBvdXRwdXQgZXZlbiB3aGVuIHRoZSBMVkRTIG91dHB1dCBpcyBub3Qg Y29ubmVjdGVkLgo+IAkgKiBEb24ndCBmYWlsIHByb2JlIGluIHRoYXQgY2FzZSBhcyB0aGUgRFUg d2lsbCBuZWVkIHRoZSBicmlkZ2UgdG8KPiAJICogY29udHJvbCB0aGUgY2xvY2suCj4gCSAqLwo+ IAlpZiAobHZkcy0+aW5mby0+cXVpcmtzICYgUkNBUl9MVkRTX1FVSVJLX0VYVF9QTEwpCj4gCQly ZXR1cm4gcmV0ID09IC1FTk9ERVYgPyAwIDogcmV0Owo+IAo+IGJlZm9yZSB0aGUgb2Zfbm9kZV9w dXQoKSBzZXF1ZW5jZXMsIGFuZCBhZGQgb25lIG1vcmUgbGFiZWwsIHRvIHNraXAKPiB0aGUgYWJv dmUgcGFydCBpbiBjYXNlIHBhcnNlX2R0X2NvbXBhbmlvbigpIGZhaWxzLgo+IAo+IEFwYXJ0IGZy b20gdGhpcyB5b3UgY2FuIHJldGFpbiBteSB0YWcgaWYgeW91IGxpa2UuCj4gVGhhbmtzCj4gICAg ago+IAo+ID4gKwo+ID4gIGRvbmU6Cj4gPiAgCW9mX25vZGVfcHV0KGxvY2FsX291dHB1dCk7Cj4g PiAgCW9mX25vZGVfcHV0KHJlbW90ZV9pbnB1dCk7Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9n cHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmggYi9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2Fy X2x2ZHMuaAo+ID4gaW5kZXggYTcwOWNhZTFiYzMyLi4yMjJlYzBlNjA3ODUgMTAwNjQ0Cj4gPiAt LS0gYS9kcml2ZXJzL2dwdS9kcm0vcmNhci1kdS9yY2FyX2x2ZHMuaAo+ID4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL3JjYXItZHUvcmNhcl9sdmRzLmgKPiA+IEBAIC0xNSw2ICsxNSw3IEBAIHN0cnVj dCBkcm1fYnJpZGdlOwo+ID4gICNpZiBJU19FTkFCTEVEKENPTkZJR19EUk1fUkNBUl9MVkRTKQo+ ID4gIGludCByY2FyX2x2ZHNfY2xrX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLCB1 bnNpZ25lZCBsb25nIGZyZXEpOwo+ID4gIHZvaWQgcmNhcl9sdmRzX2Nsa19kaXNhYmxlKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UpOwo+ID4gK2Jvb2wgcmNhcl9sdmRzX2R1YWxfbGluayhzdHJ1 Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKTsKPiA+ICAjZWxzZQo+ID4gIHN0YXRpYyBpbmxpbmUgaW50 IHJjYXJfbHZkc19jbGtfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gPiAgCQkJ CSAgICAgICB1bnNpZ25lZCBsb25nIGZyZXEpCj4gPiBAQCAtMjIsNiArMjMsMTAgQEAgc3RhdGlj IGlubGluZSBpbnQgcmNhcl9sdmRzX2Nsa19lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZSwKPiA+ICAJcmV0dXJuIC1FTk9TWVM7Cj4gPiAgfQo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBy Y2FyX2x2ZHNfY2xrX2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkgeyB9Cj4gPiAr c3RhdGljIGlubGluZSBib29sIHJjYXJfbHZkc19kdWFsX2xpbmsoc3RydWN0IGRybV9icmlkZ2Ug KmJyaWRnZSkKPiA+ICt7Cj4gPiArCXJldHVybiBmYWxzZTsKPiA+ICt9Cj4gPiAgI2VuZGlmIC8q IENPTkZJR19EUk1fUkNBUl9MVkRTICovCj4gPgo+ID4gICNlbmRpZiAvKiBfX1JDQVJfTFZEU19I X18gKi8KCi0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1k ZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcv bWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=