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=-3.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=no 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 C91A9C432C3 for ; Tue, 3 Dec 2019 13:50:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A0FEA2073F for ; Tue, 3 Dec 2019 13:50:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726482AbfLCNui (ORCPT ); Tue, 3 Dec 2019 08:50:38 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:46191 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726474AbfLCNuh (ORCPT ); Tue, 3 Dec 2019 08:50:37 -0500 Received: from lupine.hi.pengutronix.de ([2001:67c:670:100:3ad5:47ff:feaf:1a17] helo=lupine) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1ic8ZE-0005mC-G9; Tue, 03 Dec 2019 14:50:16 +0100 Message-ID: Subject: Re: [PATCH v3 15/21] drm/imx: pd: Use bus format/flags provided by the bridge when available From: Philipp Zabel To: Boris Brezillon , dri-devel@lists.freedesktop.org Cc: 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 , Rob Clark , Andrzej Hajda , Neil Armstrong , Laurent Pinchart , Jonas Karlman , Jernej Skrabec , Rob Herring , Mark Rutland , devicetree@vger.kernel.org Date: Tue, 03 Dec 2019 14:50:13 +0100 In-Reply-To: <20191023154512.9762-16-boris.brezillon@collabora.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-16-boris.brezillon@collabora.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:3ad5:47ff:feaf:1a17 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: devicetree@vger.kernel.org Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Hi Boris, On Wed, 2019-10-23 at 17:45 +0200, Boris Brezillon wrote: > Now that bridges can expose the bus format/flags they expect, we can > use those instead of the relying on the display_info provided by the > connector (which is only valid if the encoder is directly connected > to bridge element driving the panel/display). > > We also explicitly expose the bus formats supported by our encoder by > filling encoder->output_bus_caps with proper info. > > Signed-off-by: Boris Brezillon > --- > Hi Philipp, > > I think I addressed all your comments except the addition of > SYNC_DRIVE_POSEDGE/NEGEDGE flags, which would require changing > ipu_crtc_mode_set_nofb() to take those flags into account or > turning those flags into their PIXDATA counterpart. If you don't mind, > I'd like to leave that for later. I'm fine with this. I think it was phrased as a suggestion, too. [...] > -static int imx_pd_encoder_atomic_check(struct drm_encoder *encoder, > - struct drm_crtc_state *crtc_state, > - struct drm_connector_state *conn_state) > +static const u32 imx_pd_bus_fmts[] = { > + MEDIA_BUS_FMT_RGB888_1X24, > + MEDIA_BUS_FMT_BGR888_1X24, > + MEDIA_BUS_FMT_GBR888_1X24, GBR888 likely isn't useful (it's only used for the internal TV Encoder on i.MX5 so far), but it doesn't really hurt to include it either. > + MEDIA_BUS_FMT_RGB666_1X18, > + MEDIA_BUS_FMT_RGB666_1X24_CPADHI, > + MEDIA_BUS_FMT_RGB565_1X16, > +}; > + > +static u32 * > +imx_pd_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state, > + unsigned int *num_output_fmts) > +{ > + struct drm_display_info *di = &conn_state->connector->display_info; > + struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); > + u32 *output_fmts; > + > + if (!imxpd->bus_format && !di->num_bus_formats) > + *num_output_fmts = ARRAY_SIZE(imx_pd_bus_fmts); In this case we could just: return kmemdup(imx_pd_bus_fmts, sizeof(imx_pd_bus_fmts)); and simplify the remaining function a tiny bit. > + else > + *num_output_fmts = 1; > + > + output_fmts = kcalloc(*num_output_fmts, sizeof(*output_fmts), > + GFP_KERNEL); > + if (!output_fmts) > + return NULL; > + > + if (!imxpd->bus_format && di->num_bus_formats) > + output_fmts[0] = di->bus_formats[0]; > + else if (!imxpd->bus_format) > + memcpy(output_fmts, imx_pd_bus_fmts, > + ARRAY_SIZE(imx_pd_bus_fmts)); > + else > + output_fmts[0] = imxpd->bus_format; > + > + return output_fmts; > +} > + > +static u32 * > +imx_pd_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state, > + u32 output_fmt, > + unsigned int *num_input_fmts) > +{ > + struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); > + u32 *input_fmts; > + > + *num_input_fmts = 0; > + if (output_fmt == MEDIA_BUS_FMT_FIXED) { > + /* > + * The next bridge does not support bus format negotiation, > + * let's use the default RGB888 value. > + */ > + *num_input_fmts = 1; > + output_fmt = MEDIA_BUS_FMT_RGB888_1X24; > + } else if (!imxpd->bus_format) { > + unsigned int i; > + > + for (i = 0; i < ARRAY_SIZE(imx_pd_bus_fmts); i++) { > + if (imx_pd_bus_fmts[i] == output_fmt) { > + *num_input_fmts = 1; > + break; > + } > + } If this loop was split out into a helper function, it could be reused in .atomic_check below, for example: if (imx_pd_format_supported(output_fmt)) *num_input_fmts = 1; > + } else if (imxpd->bus_format == output_fmt) { > + *num_input_fmts = 1; > + } > + > + if (!*num_input_fmts) > + return NULL; > + > + input_fmts = kcalloc(*num_input_fmts, sizeof(*input_fmts), > + GFP_KERNEL); > + if (!input_fmts) > + return NULL; > + > + input_fmts[0] = output_fmt; > + return input_fmts; > +} > + > +static int imx_pd_bridge_atomic_check(struct drm_bridge *bridge, > + struct drm_bridge_state *bridge_state, > + struct drm_crtc_state *crtc_state, > + struct drm_connector_state *conn_state) > { > struct imx_crtc_state *imx_crtc_state = to_imx_crtc_state(crtc_state); > struct drm_display_info *di = &conn_state->connector->display_info; > - struct imx_parallel_display *imxpd = enc_to_imxpd(encoder); > + struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge); > + struct drm_bridge_state *next_bridge_state = NULL; > + struct drm_bridge *next_bridge; > + u32 bus_flags, bus_fmt; > + unsigned int i; > > - if (!imxpd->bus_format && di->num_bus_formats) { > - imx_crtc_state->bus_flags = di->bus_flags; > - imx_crtc_state->bus_format = di->bus_formats[0]; > - } else { > - imx_crtc_state->bus_flags = imxpd->bus_flags; > - imx_crtc_state->bus_format = imxpd->bus_format; > + next_bridge = drm_bridge_chain_get_next_bridge(bridge); > + if (next_bridge) > + next_bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, > + next_bridge); > + > + if (next_bridge_state) > + bus_flags = next_bridge_state->input_bus_cfg.flags; > + else if (!imxpd->bus_format && di->num_bus_formats) > + bus_flags = di->bus_flags; > + else > + bus_flags = imxpd->bus_flags; > + > + bus_fmt = bridge_state->input_bus_cfg.fmt; > + for (i = 0; i < ARRAY_SIZE(imx_pd_bus_fmts); i++) { > + if (imx_pd_bus_fmts[i] == bus_fmt) > + break; > } > + > + if (i == ARRAY_SIZE(imx_pd_bus_fmts)) > + return -EINVAL; See above, this could just reuse: if (!imx_pd_format_supported(bus_fmt)) return -EINVAL; > + > + if (bus_flags & > + ~(DRM_BUS_FLAG_DE_LOW | DRM_BUS_FLAG_DE_HIGH | > + DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE | > + DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)) > + return -EINVAL; > + > + bridge_state->output_bus_cfg.flags = bus_flags; > + bridge_state->input_bus_cfg.flags = bus_flags; > + imx_crtc_state->bus_flags = bus_flags; > + imx_crtc_state->bus_format = bridge_state->input_bus_cfg.fmt; > imx_crtc_state->di_hsync_pin = 2; > imx_crtc_state->di_vsync_pin = 3; [...] Otherwise this looks good to me. regards Philipp 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=-3.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=no 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 B7A8EC432C0 for ; Tue, 3 Dec 2019 13:50:20 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 958172073F for ; Tue, 3 Dec 2019 13:50:20 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 958172073F Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2137F6E55E; Tue, 3 Dec 2019 13:50:20 +0000 (UTC) Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id 557D96E52E for ; Tue, 3 Dec 2019 13:50:18 +0000 (UTC) Received: from lupine.hi.pengutronix.de ([2001:67c:670:100:3ad5:47ff:feaf:1a17] helo=lupine) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1ic8ZE-0005mC-G9; Tue, 03 Dec 2019 14:50:16 +0100 Message-ID: Subject: Re: [PATCH v3 15/21] drm/imx: pd: Use bus format/flags provided by the bridge when available From: Philipp Zabel To: Boris Brezillon , dri-devel@lists.freedesktop.org Date: Tue, 03 Dec 2019 14:50:13 +0100 In-Reply-To: <20191023154512.9762-16-boris.brezillon@collabora.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-16-boris.brezillon@collabora.com> User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:100:3ad5:47ff:feaf:1a17 X-SA-Exim-Mail-From: p.zabel@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: dri-devel@lists.freedesktop.org X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nikita Yushchenko , Mark Rutland , Jernej Skrabec , Neil Armstrong , Andrey Smirnov , Jonas Karlman , Seung-Woo Kim , Rob Herring , Kyungmin Park , Thierry Reding , Laurent Pinchart , kernel@collabora.com, Sam Ravnborg , devicetree@vger.kernel.org, Chris Healy Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" SGkgQm9yaXMsCgpPbiBXZWQsIDIwMTktMTAtMjMgYXQgMTc6NDUgKzAyMDAsIEJvcmlzIEJyZXpp bGxvbiB3cm90ZToKPiBOb3cgdGhhdCBicmlkZ2VzIGNhbiBleHBvc2UgdGhlIGJ1cyBmb3JtYXQv ZmxhZ3MgdGhleSBleHBlY3QsIHdlIGNhbgo+IHVzZSB0aG9zZSBpbnN0ZWFkIG9mIHRoZSByZWx5 aW5nIG9uIHRoZSBkaXNwbGF5X2luZm8gcHJvdmlkZWQgYnkgdGhlCj4gY29ubmVjdG9yICh3aGlj aCBpcyBvbmx5IHZhbGlkIGlmIHRoZSBlbmNvZGVyIGlzIGRpcmVjdGx5IGNvbm5lY3RlZAo+IHRv IGJyaWRnZSBlbGVtZW50IGRyaXZpbmcgdGhlIHBhbmVsL2Rpc3BsYXkpLgo+IAo+IFdlIGFsc28g ZXhwbGljaXRseSBleHBvc2UgdGhlIGJ1cyBmb3JtYXRzIHN1cHBvcnRlZCBieSBvdXIgZW5jb2Rl ciBieQo+IGZpbGxpbmcgZW5jb2Rlci0+b3V0cHV0X2J1c19jYXBzIHdpdGggcHJvcGVyIGluZm8u Cj4gCj4gU2lnbmVkLW9mZi1ieTogQm9yaXMgQnJlemlsbG9uIDxib3Jpcy5icmV6aWxsb25AY29s bGFib3JhLmNvbT4KPiAtLS0KPiBIaSBQaGlsaXBwLAo+IAo+IEkgdGhpbmsgSSBhZGRyZXNzZWQg YWxsIHlvdXIgY29tbWVudHMgZXhjZXB0IHRoZSBhZGRpdGlvbiBvZgo+IFNZTkNfRFJJVkVfUE9T RURHRS9ORUdFREdFIGZsYWdzLCB3aGljaCB3b3VsZCByZXF1aXJlIGNoYW5naW5nCj4gaXB1X2Ny dGNfbW9kZV9zZXRfbm9mYigpIHRvIHRha2UgdGhvc2UgZmxhZ3MgaW50byBhY2NvdW50IG9yCj4g dHVybmluZyB0aG9zZSBmbGFncyBpbnRvIHRoZWlyIFBJWERBVEEgY291bnRlcnBhcnQuIElmIHlv dSBkb24ndCBtaW5kLAo+IEknZCBsaWtlIHRvIGxlYXZlIHRoYXQgZm9yIGxhdGVyLgoKSSdtIGZp bmUgd2l0aCB0aGlzLiBJIHRoaW5rIGl0IHdhcyBwaHJhc2VkIGFzIGEgc3VnZ2VzdGlvbiwgdG9v LgoKWy4uLl0KPiAtc3RhdGljIGludCBpbXhfcGRfZW5jb2Rlcl9hdG9taWNfY2hlY2soc3RydWN0 IGRybV9lbmNvZGVyICplbmNvZGVyLAo+IC0JCQkJICAgICAgIHN0cnVjdCBkcm1fY3J0Y19zdGF0 ZSAqY3J0Y19zdGF0ZSwKPiAtCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2Nvbm5lY3Rvcl9zdGF0ZSAq Y29ubl9zdGF0ZSkKPiArc3RhdGljIGNvbnN0IHUzMiBpbXhfcGRfYnVzX2ZtdHNbXSA9IHsKPiAr CU1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQsCj4gKwlNRURJQV9CVVNfRk1UX0JHUjg4OF8xWDI0 LAo+ICsJTUVESUFfQlVTX0ZNVF9HQlI4ODhfMVgyNCwKCkdCUjg4OCBsaWtlbHkgaXNuJ3QgdXNl ZnVsIChpdCdzIG9ubHkgdXNlZCBmb3IgdGhlIGludGVybmFsIFRWIEVuY29kZXIKb24gaS5NWDUg c28gZmFyKSwgYnV0IGl0IGRvZXNuJ3QgcmVhbGx5IGh1cnQgdG8gaW5jbHVkZSBpdCBlaXRoZXIu Cgo+ICsJTUVESUFfQlVTX0ZNVF9SR0I2NjZfMVgxOCwKPiArCU1FRElBX0JVU19GTVRfUkdCNjY2 XzFYMjRfQ1BBREhJLAo+ICsJTUVESUFfQlVTX0ZNVF9SR0I1NjVfMVgxNiwKPiArfTsKPiArCj4g K3N0YXRpYyB1MzIgKgo+ICtpbXhfcGRfYnJpZGdlX2F0b21pY19nZXRfb3V0cHV0X2J1c19mbXRz KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gKwkJCQkJIHN0cnVjdCBkcm1fYnJpZGdlX3N0 YXRlICpicmlkZ2Vfc3RhdGUsCj4gKwkJCQkJIHN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3J0Y19z dGF0ZSwKPiArCQkJCQkgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUgKmNvbm5fc3RhdGUsCj4g KwkJCQkJIHVuc2lnbmVkIGludCAqbnVtX291dHB1dF9mbXRzKQo+ICt7Cj4gKwlzdHJ1Y3QgZHJt X2Rpc3BsYXlfaW5mbyAqZGkgPSAmY29ubl9zdGF0ZS0+Y29ubmVjdG9yLT5kaXNwbGF5X2luZm87 Cj4gKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gYnJpZGdlX3RvX2lteHBk KGJyaWRnZSk7Cj4gKwl1MzIgKm91dHB1dF9mbXRzOwo+ICsKPiArCWlmICghaW14cGQtPmJ1c19m b3JtYXQgJiYgIWRpLT5udW1fYnVzX2Zvcm1hdHMpCj4gKwkJKm51bV9vdXRwdXRfZm10cyA9IEFS UkFZX1NJWkUoaW14X3BkX2J1c19mbXRzKTsKCkluIHRoaXMgY2FzZSB3ZSBjb3VsZCBqdXN0OgoK CQlyZXR1cm4ga21lbWR1cChpbXhfcGRfYnVzX2ZtdHMsIHNpemVvZihpbXhfcGRfYnVzX2ZtdHMp KTsKCmFuZCBzaW1wbGlmeSB0aGUgcmVtYWluaW5nIGZ1bmN0aW9uIGEgdGlueSBiaXQuCgo+ICsJ ZWxzZQo+ICsJCSpudW1fb3V0cHV0X2ZtdHMgPSAxOwo+ICsKPiArCW91dHB1dF9mbXRzID0ga2Nh bGxvYygqbnVtX291dHB1dF9mbXRzLCBzaXplb2YoKm91dHB1dF9mbXRzKSwKPiArCQkJICAgICAg R0ZQX0tFUk5FTCk7Cj4gKwlpZiAoIW91dHB1dF9mbXRzKQo+ICsJCXJldHVybiBOVUxMOwo+ICsK PiArCWlmICghaW14cGQtPmJ1c19mb3JtYXQgJiYgZGktPm51bV9idXNfZm9ybWF0cykKPiArCQlv dXRwdXRfZm10c1swXSA9IGRpLT5idXNfZm9ybWF0c1swXTsKPiArCWVsc2UgaWYgKCFpbXhwZC0+ YnVzX2Zvcm1hdCkKPiArCQltZW1jcHkob3V0cHV0X2ZtdHMsIGlteF9wZF9idXNfZm10cywKPiAr CQkgICAgICAgQVJSQVlfU0laRShpbXhfcGRfYnVzX2ZtdHMpKTsKPiArCWVsc2UKPiArCQlvdXRw dXRfZm10c1swXSA9IGlteHBkLT5idXNfZm9ybWF0Owo+ICsKPiArCXJldHVybiBvdXRwdXRfZm10 czsKPiArfQo+ICsKPiArc3RhdGljIHUzMiAqCj4gK2lteF9wZF9icmlkZ2VfYXRvbWljX2dldF9p bnB1dF9idXNfZm10cyhzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJCXN0cnVjdCBk cm1fYnJpZGdlX3N0YXRlICpicmlkZ2Vfc3RhdGUsCj4gKwkJCQkJc3RydWN0IGRybV9jcnRjX3N0 YXRlICpjcnRjX3N0YXRlLAo+ICsJCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yX3N0YXRlICpjb25u X3N0YXRlLAo+ICsJCQkJCXUzMiBvdXRwdXRfZm10LAo+ICsJCQkJCXVuc2lnbmVkIGludCAqbnVt X2lucHV0X2ZtdHMpCj4gK3sKPiArCXN0cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQg PSBicmlkZ2VfdG9faW14cGQoYnJpZGdlKTsKPiArCXUzMiAqaW5wdXRfZm10czsKPiArCj4gKwkq bnVtX2lucHV0X2ZtdHMgPSAwOwo+ICsJaWYgKG91dHB1dF9mbXQgPT0gTUVESUFfQlVTX0ZNVF9G SVhFRCkgewo+ICsJCS8qCj4gKwkJICogVGhlIG5leHQgYnJpZGdlIGRvZXMgbm90IHN1cHBvcnQg YnVzIGZvcm1hdCBuZWdvdGlhdGlvbiwKPiArCQkgKiBsZXQncyB1c2UgdGhlIGRlZmF1bHQgUkdC ODg4IHZhbHVlLgo+ICsJCSAqLwo+ICsJCSpudW1faW5wdXRfZm10cyA9IDE7Cj4gKwkJb3V0cHV0 X2ZtdCA9IE1FRElBX0JVU19GTVRfUkdCODg4XzFYMjQ7Cj4gKwl9IGVsc2UgaWYgKCFpbXhwZC0+ YnVzX2Zvcm1hdCkgewo+ICsJCXVuc2lnbmVkIGludCBpOwo+ICsKPiArCQlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShpbXhfcGRfYnVzX2ZtdHMpOyBpKyspIHsKPiArCQkJaWYgKGlteF9wZF9i dXNfZm10c1tpXSA9PSBvdXRwdXRfZm10KSB7Cj4gKwkJCQkqbnVtX2lucHV0X2ZtdHMgPSAxOwo+ ICsJCQkJYnJlYWs7Cj4gKwkJCX0KPiArCQl9CgpJZiB0aGlzIGxvb3Agd2FzIHNwbGl0IG91dCBp bnRvIGEgaGVscGVyIGZ1bmN0aW9uLCBpdCBjb3VsZCBiZSByZXVzZWQgaW4KLmF0b21pY19jaGVj ayBiZWxvdywgZm9yIGV4YW1wbGU6CgoJCWlmIChpbXhfcGRfZm9ybWF0X3N1cHBvcnRlZChvdXRw dXRfZm10KSkKCQkJKm51bV9pbnB1dF9mbXRzID0gMTsKCj4gKwl9IGVsc2UgaWYgKGlteHBkLT5i dXNfZm9ybWF0ID09IG91dHB1dF9mbXQpIHsKPiArCQkqbnVtX2lucHV0X2ZtdHMgPSAxOwo+ICsJ fQo+ICsKPiArCWlmICghKm51bV9pbnB1dF9mbXRzKQo+ICsJCXJldHVybiBOVUxMOwo+ICsKPiAr CWlucHV0X2ZtdHMgPSBrY2FsbG9jKCpudW1faW5wdXRfZm10cywgc2l6ZW9mKCppbnB1dF9mbXRz KSwKPiArCQkJICAgICBHRlBfS0VSTkVMKTsKPiArCWlmICghaW5wdXRfZm10cykKPiArCQlyZXR1 cm4gTlVMTDsKPiArCj4gKwlpbnB1dF9mbXRzWzBdID0gb3V0cHV0X2ZtdDsKPiArCXJldHVybiBp bnB1dF9mbXRzOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IGlteF9wZF9icmlkZ2VfYXRvbWljX2No ZWNrKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gKwkJCQkgICAgICBzdHJ1Y3QgZHJtX2Jy aWRnZV9zdGF0ZSAqYnJpZGdlX3N0YXRlLAo+ICsJCQkJICAgICAgc3RydWN0IGRybV9jcnRjX3N0 YXRlICpjcnRjX3N0YXRlLAo+ICsJCQkJICAgICAgc3RydWN0IGRybV9jb25uZWN0b3Jfc3RhdGUg KmNvbm5fc3RhdGUpCj4gIHsKPiAgCXN0cnVjdCBpbXhfY3J0Y19zdGF0ZSAqaW14X2NydGNfc3Rh dGUgPSB0b19pbXhfY3J0Y19zdGF0ZShjcnRjX3N0YXRlKTsKPiAgCXN0cnVjdCBkcm1fZGlzcGxh eV9pbmZvICpkaSA9ICZjb25uX3N0YXRlLT5jb25uZWN0b3ItPmRpc3BsYXlfaW5mbzsKPiAtCXN0 cnVjdCBpbXhfcGFyYWxsZWxfZGlzcGxheSAqaW14cGQgPSBlbmNfdG9faW14cGQoZW5jb2Rlcik7 Cj4gKwlzdHJ1Y3QgaW14X3BhcmFsbGVsX2Rpc3BsYXkgKmlteHBkID0gYnJpZGdlX3RvX2lteHBk KGJyaWRnZSk7Cj4gKwlzdHJ1Y3QgZHJtX2JyaWRnZV9zdGF0ZSAqbmV4dF9icmlkZ2Vfc3RhdGUg PSBOVUxMOwo+ICsJc3RydWN0IGRybV9icmlkZ2UgKm5leHRfYnJpZGdlOwo+ICsJdTMyIGJ1c19m bGFncywgYnVzX2ZtdDsKPiArCXVuc2lnbmVkIGludCBpOwo+ICAKPiAtCWlmICghaW14cGQtPmJ1 c19mb3JtYXQgJiYgZGktPm51bV9idXNfZm9ybWF0cykgewo+IC0JCWlteF9jcnRjX3N0YXRlLT5i dXNfZmxhZ3MgPSBkaS0+YnVzX2ZsYWdzOwo+IC0JCWlteF9jcnRjX3N0YXRlLT5idXNfZm9ybWF0 ID0gZGktPmJ1c19mb3JtYXRzWzBdOwo+IC0JfSBlbHNlIHsKPiAtCQlpbXhfY3J0Y19zdGF0ZS0+ YnVzX2ZsYWdzID0gaW14cGQtPmJ1c19mbGFnczsKPiAtCQlpbXhfY3J0Y19zdGF0ZS0+YnVzX2Zv cm1hdCA9IGlteHBkLT5idXNfZm9ybWF0Owo+ICsJbmV4dF9icmlkZ2UgPSBkcm1fYnJpZGdlX2No YWluX2dldF9uZXh0X2JyaWRnZShicmlkZ2UpOwo+ICsJaWYgKG5leHRfYnJpZGdlKQo+ICsJCW5l eHRfYnJpZGdlX3N0YXRlID0gZHJtX2F0b21pY19nZXRfbmV3X2JyaWRnZV9zdGF0ZShjcnRjX3N0 YXRlLT5zdGF0ZSwKPiArCQkJCQkJCQkgICAgbmV4dF9icmlkZ2UpOwo+ICsKPiArCWlmIChuZXh0 X2JyaWRnZV9zdGF0ZSkKPiArCQlidXNfZmxhZ3MgPSBuZXh0X2JyaWRnZV9zdGF0ZS0+aW5wdXRf YnVzX2NmZy5mbGFnczsKPiArCWVsc2UgaWYgKCFpbXhwZC0+YnVzX2Zvcm1hdCAmJiBkaS0+bnVt X2J1c19mb3JtYXRzKQo+ICsJCWJ1c19mbGFncyA9IGRpLT5idXNfZmxhZ3M7Cj4gKwllbHNlCj4g KwkJYnVzX2ZsYWdzID0gaW14cGQtPmJ1c19mbGFnczsKPiArCj4gKwlidXNfZm10ID0gYnJpZGdl X3N0YXRlLT5pbnB1dF9idXNfY2ZnLmZtdDsKPiArCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KGlteF9wZF9idXNfZm10cyk7IGkrKykgewo+ICsJCWlmIChpbXhfcGRfYnVzX2ZtdHNbaV0gPT0g YnVzX2ZtdCkKPiArCQkJYnJlYWs7Cj4gIAl9Cj4gKwo+ICsJaWYgKGkgPT0gQVJSQVlfU0laRShp bXhfcGRfYnVzX2ZtdHMpKQo+ICsJCXJldHVybiAtRUlOVkFMOwoKU2VlIGFib3ZlLCB0aGlzIGNv dWxkIGp1c3QgcmV1c2U6CgoJaWYgKCFpbXhfcGRfZm9ybWF0X3N1cHBvcnRlZChidXNfZm10KSkK CQlyZXR1cm4gLUVJTlZBTDsKCj4gKwo+ICsJaWYgKGJ1c19mbGFncyAmCj4gKwkgICAgfihEUk1f QlVTX0ZMQUdfREVfTE9XIHwgRFJNX0JVU19GTEFHX0RFX0hJR0ggfAo+ICsJICAgICAgRFJNX0JV U19GTEFHX1BJWERBVEFfRFJJVkVfUE9TRURHRSB8Cj4gKwkgICAgICBEUk1fQlVTX0ZMQUdfUElY REFUQV9EUklWRV9ORUdFREdFKSkKPiArCQlyZXR1cm4gLUVJTlZBTDsKPiArCj4gKwlicmlkZ2Vf c3RhdGUtPm91dHB1dF9idXNfY2ZnLmZsYWdzID0gYnVzX2ZsYWdzOwo+ICsJYnJpZGdlX3N0YXRl LT5pbnB1dF9idXNfY2ZnLmZsYWdzID0gYnVzX2ZsYWdzOwo+ICsJaW14X2NydGNfc3RhdGUtPmJ1 c19mbGFncyA9IGJ1c19mbGFnczsKPiArCWlteF9jcnRjX3N0YXRlLT5idXNfZm9ybWF0ID0gYnJp ZGdlX3N0YXRlLT5pbnB1dF9idXNfY2ZnLmZtdDsKPiAgCWlteF9jcnRjX3N0YXRlLT5kaV9oc3lu Y19waW4gPSAyOwo+ICAJaW14X2NydGNfc3RhdGUtPmRpX3ZzeW5jX3BpbiA9IDM7ClsuLi5dIAoK T3RoZXJ3aXNlIHRoaXMgbG9va3MgZ29vZCB0byBtZS4KCnJlZ2FyZHMKUGhpbGlwcAoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxp bmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVs