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 88126C432C0 for ; Sun, 24 Nov 2019 10:29:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 349AC2068F for ; Sun, 24 Nov 2019 10:29:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="RbQrVHZi" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726090AbfKXK3A (ORCPT ); Sun, 24 Nov 2019 05:29:00 -0500 Received: from perceval.ideasonboard.com ([213.167.242.64]:36172 "EHLO perceval.ideasonboard.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725980AbfKXK3A (ORCPT ); Sun, 24 Nov 2019 05:29:00 -0500 Received: from pendragon.ideasonboard.com (fs96f9c64d.tkyc509.ap.nuro.jp [150.249.198.77]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id B2E6AA38; Sun, 24 Nov 2019 11:28:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1574591337; bh=xA+A/mEulzIiRlemYJ2Jq9SFhPS+qPfZBgyg4AMIlOs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=RbQrVHZiZNKP50uebdIwJSJrK6i58zW9cX8ZngrMpAtJUqLlewqPJVwPECzpR0yVC exgb+6DHD0XxUnujr16rIHYrGLaTNk0tujbVAR9tFc784wmDczplvehwFYh28D+xvb xTnn7um0G2sbD4YuRJioqqFTVKE322wZrSlZoxfU= Date: Sun, 24 Nov 2019 12:28:47 +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 04/21] drm/bridge: Rename bridge helpers targeting a bridge chain Message-ID: <20191124102847.GE4727@pendragon.ideasonboard.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-5-boris.brezillon@collabora.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20191023154512.9762-5-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:55PM +0200, Boris Brezillon wrote: > Change the prefix of bridge helpers targeting a bridge chain from > drm_bridge_ to drm_bridge_chain_ to better reflect the fact that > the operation will happen on all elements of chain, starting at the > bridge passed in argument. > > Signed-off-by: Boris Brezillon I haven't reviewed this in details but the renaming looks sensible, so Acked-by: Laurent Pinchart > --- > Changes in v3: > * None > > Changes in v2: > * Pass te bridge, not the encoder, so we can later act on a sub-chain > instead of the whole chain > --- > drivers/gpu/drm/drm_atomic_helper.c | 19 +++-- > drivers/gpu/drm/drm_bridge.c | 125 ++++++++++++++-------------- > drivers/gpu/drm/drm_probe_helper.c | 2 +- > drivers/gpu/drm/mediatek/mtk_hdmi.c | 4 +- > include/drm/drm_bridge.h | 64 +++++++------- > 5 files changed, 112 insertions(+), 102 deletions(-) > > diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c > index 587052751b48..cf678be58fa4 100644 > --- a/drivers/gpu/drm/drm_atomic_helper.c > +++ b/drivers/gpu/drm/drm_atomic_helper.c > @@ -435,8 +435,9 @@ mode_fixup(struct drm_atomic_state *state) > encoder = new_conn_state->best_encoder; > funcs = encoder->helper_private; > > - ret = drm_bridge_mode_fixup(encoder->bridge, &new_crtc_state->mode, > - &new_crtc_state->adjusted_mode); > + ret = drm_bridge_chain_mode_fixup(encoder->bridge, > + &new_crtc_state->mode, > + &new_crtc_state->adjusted_mode); > if (!ret) { > DRM_DEBUG_ATOMIC("Bridge fixup failed\n"); > return -EINVAL; > @@ -501,7 +502,7 @@ static enum drm_mode_status mode_valid_path(struct drm_connector *connector, > return ret; > } > > - ret = drm_bridge_mode_valid(encoder->bridge, mode); > + ret = drm_bridge_chain_mode_valid(encoder->bridge, mode); > if (ret != MODE_OK) { > DRM_DEBUG_ATOMIC("[BRIDGE] mode_valid() failed\n"); > return ret; > @@ -1020,7 +1021,7 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) > * Each encoder has at most one connector (since we always steal > * it away), so we won't call disable hooks twice. > */ > - drm_atomic_bridge_disable(encoder->bridge, old_state); > + drm_atomic_bridge_chain_disable(encoder->bridge, old_state); > > /* Right function depends upon target state. */ > if (funcs) { > @@ -1034,7 +1035,8 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *old_state) > funcs->dpms(encoder, DRM_MODE_DPMS_OFF); > } > > - drm_atomic_bridge_post_disable(encoder->bridge, old_state); > + drm_atomic_bridge_chain_post_disable(encoder->bridge, > + old_state); > } > > for_each_oldnew_crtc_in_state(old_state, crtc, old_crtc_state, new_crtc_state, i) { > @@ -1215,7 +1217,8 @@ crtc_set_mode(struct drm_device *dev, struct drm_atomic_state *old_state) > funcs->mode_set(encoder, mode, adjusted_mode); > } > > - drm_bridge_mode_set(encoder->bridge, mode, adjusted_mode); > + drm_bridge_chain_mode_set(encoder->bridge, mode, > + adjusted_mode); > } > } > > @@ -1332,7 +1335,7 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, > * Each encoder has at most one connector (since we always steal > * it away), so we won't call enable hooks twice. > */ > - drm_atomic_bridge_pre_enable(encoder->bridge, old_state); > + drm_atomic_bridge_chain_pre_enable(encoder->bridge, old_state); > > if (funcs) { > if (funcs->atomic_enable) > @@ -1343,7 +1346,7 @@ void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev, > funcs->commit(encoder); > } > > - drm_atomic_bridge_enable(encoder->bridge, old_state); > + drm_atomic_bridge_chain_enable(encoder->bridge, old_state); > } > > drm_atomic_helper_commit_writebacks(dev, old_state); > diff --git a/drivers/gpu/drm/drm_bridge.c b/drivers/gpu/drm/drm_bridge.c > index cba537c99e43..54c874493c57 100644 > --- a/drivers/gpu/drm/drm_bridge.c > +++ b/drivers/gpu/drm/drm_bridge.c > @@ -172,8 +172,8 @@ void drm_bridge_detach(struct drm_bridge *bridge) > */ > > /** > - * drm_bridge_mode_fixup - fixup proposed mode for all bridges in the > - * encoder chain > + * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the > + * encoder chain > * @bridge: bridge control structure > * @mode: desired mode to be set for the bridge > * @adjusted_mode: updated mode that works for this bridge > @@ -186,9 +186,9 @@ void drm_bridge_detach(struct drm_bridge *bridge) > * RETURNS: > * true on success, false on failure > */ > -bool drm_bridge_mode_fixup(struct drm_bridge *bridge, > - const struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode) > +bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode) > { > bool ret = true; > > @@ -198,15 +198,16 @@ bool drm_bridge_mode_fixup(struct drm_bridge *bridge, > if (bridge->funcs->mode_fixup) > ret = bridge->funcs->mode_fixup(bridge, mode, adjusted_mode); > > - ret = ret && drm_bridge_mode_fixup(bridge->next, mode, adjusted_mode); > + ret = ret && drm_bridge_chain_mode_fixup(bridge->next, mode, > + adjusted_mode); > > return ret; > } > -EXPORT_SYMBOL(drm_bridge_mode_fixup); > +EXPORT_SYMBOL(drm_bridge_chain_mode_fixup); > > /** > - * drm_bridge_mode_valid - validate the mode against all bridges in the > - * encoder chain. > + * drm_bridge_chain_mode_valid - validate the mode against all bridges in the > + * encoder chain. > * @bridge: bridge control structure > * @mode: desired mode to be validated > * > @@ -219,8 +220,9 @@ EXPORT_SYMBOL(drm_bridge_mode_fixup); > * RETURNS: > * MODE_OK on success, drm_mode_status Enum error code on failure > */ > -enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge, > - const struct drm_display_mode *mode) > +enum drm_mode_status > +drm_bridge_chain_mode_valid(struct drm_bridge *bridge, > + const struct drm_display_mode *mode) > { > enum drm_mode_status ret = MODE_OK; > > @@ -233,12 +235,12 @@ enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge, > if (ret != MODE_OK) > return ret; > > - return drm_bridge_mode_valid(bridge->next, mode); > + return drm_bridge_chain_mode_valid(bridge->next, mode); > } > -EXPORT_SYMBOL(drm_bridge_mode_valid); > +EXPORT_SYMBOL(drm_bridge_chain_mode_valid); > > /** > - * drm_bridge_disable - disables all bridges in the encoder chain > + * drm_bridge_chain_disable - disables all bridges in the encoder chain > * @bridge: bridge control structure > * > * Calls &drm_bridge_funcs.disable op for all the bridges in the encoder > @@ -247,20 +249,21 @@ EXPORT_SYMBOL(drm_bridge_mode_valid); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_bridge_disable(struct drm_bridge *bridge) > +void drm_bridge_chain_disable(struct drm_bridge *bridge) > { > if (!bridge) > return; > > - drm_bridge_disable(bridge->next); > + drm_bridge_chain_disable(bridge->next); > > if (bridge->funcs->disable) > bridge->funcs->disable(bridge); > } > -EXPORT_SYMBOL(drm_bridge_disable); > +EXPORT_SYMBOL(drm_bridge_chain_disable); > > /** > - * drm_bridge_post_disable - cleans up after disabling all bridges in the encoder chain > + * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the > + * encoder chain > * @bridge: bridge control structure > * > * Calls &drm_bridge_funcs.post_disable op for all the bridges in the > @@ -269,7 +272,7 @@ EXPORT_SYMBOL(drm_bridge_disable); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_bridge_post_disable(struct drm_bridge *bridge) > +void drm_bridge_chain_post_disable(struct drm_bridge *bridge) > { > if (!bridge) > return; > @@ -277,25 +280,25 @@ void drm_bridge_post_disable(struct drm_bridge *bridge) > if (bridge->funcs->post_disable) > bridge->funcs->post_disable(bridge); > > - drm_bridge_post_disable(bridge->next); > + drm_bridge_chain_post_disable(bridge->next); > } > -EXPORT_SYMBOL(drm_bridge_post_disable); > +EXPORT_SYMBOL(drm_bridge_chain_post_disable); > > /** > - * drm_bridge_mode_set - set proposed mode for all bridges in the > - * encoder chain > + * drm_bridge_chain_mode_set - set proposed mode for all bridges in the > + * encoder chain > * @bridge: bridge control structure > - * @mode: desired mode to be set for the bridge > - * @adjusted_mode: updated mode that works for this bridge > + * @mode: desired mode to be set for the encoder chain > + * @adjusted_mode: updated mode that works for this encoder chain > * > * Calls &drm_bridge_funcs.mode_set op for all the bridges in the > * encoder chain, starting from the first bridge to the last. > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_bridge_mode_set(struct drm_bridge *bridge, > - const struct drm_display_mode *mode, > - const struct drm_display_mode *adjusted_mode) > +void drm_bridge_chain_mode_set(struct drm_bridge *bridge, > + const struct drm_display_mode *mode, > + const struct drm_display_mode *adjusted_mode) > { > if (!bridge) > return; > @@ -303,13 +306,13 @@ void drm_bridge_mode_set(struct drm_bridge *bridge, > if (bridge->funcs->mode_set) > bridge->funcs->mode_set(bridge, mode, adjusted_mode); > > - drm_bridge_mode_set(bridge->next, mode, adjusted_mode); > + drm_bridge_chain_mode_set(bridge->next, mode, adjusted_mode); > } > -EXPORT_SYMBOL(drm_bridge_mode_set); > +EXPORT_SYMBOL(drm_bridge_chain_mode_set); > > /** > - * drm_bridge_pre_enable - prepares for enabling all > - * bridges in the encoder chain > + * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the > + * encoder chain > * @bridge: bridge control structure > * > * Calls &drm_bridge_funcs.pre_enable op for all the bridges in the encoder > @@ -318,20 +321,20 @@ EXPORT_SYMBOL(drm_bridge_mode_set); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_bridge_pre_enable(struct drm_bridge *bridge) > +void drm_bridge_chain_pre_enable(struct drm_bridge *bridge) > { > if (!bridge) > return; > > - drm_bridge_pre_enable(bridge->next); > + drm_bridge_chain_pre_enable(bridge->next); > > if (bridge->funcs->pre_enable) > bridge->funcs->pre_enable(bridge); > } > -EXPORT_SYMBOL(drm_bridge_pre_enable); > +EXPORT_SYMBOL(drm_bridge_chain_pre_enable); > > /** > - * drm_bridge_enable - enables all bridges in the encoder chain > + * drm_bridge_chain_enable - enables all bridges in the encoder chain > * @bridge: bridge control structure > * > * Calls &drm_bridge_funcs.enable op for all the bridges in the encoder > @@ -340,7 +343,7 @@ EXPORT_SYMBOL(drm_bridge_pre_enable); > * > * Note that the bridge passed should be the one closest to the encoder > */ > -void drm_bridge_enable(struct drm_bridge *bridge) > +void drm_bridge_chain_enable(struct drm_bridge *bridge) > { > if (!bridge) > return; > @@ -348,12 +351,12 @@ void drm_bridge_enable(struct drm_bridge *bridge) > if (bridge->funcs->enable) > bridge->funcs->enable(bridge); > > - drm_bridge_enable(bridge->next); > + drm_bridge_chain_enable(bridge->next); > } > -EXPORT_SYMBOL(drm_bridge_enable); > +EXPORT_SYMBOL(drm_bridge_chain_enable); > > /** > - * drm_atomic_bridge_disable - disables all bridges in the encoder chain > + * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain > * @bridge: bridge control structure > * @state: atomic state being committed > * > @@ -364,24 +367,24 @@ EXPORT_SYMBOL(drm_bridge_enable); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_atomic_bridge_disable(struct drm_bridge *bridge, > - struct drm_atomic_state *state) > +void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge, > + struct drm_atomic_state *state) > { > if (!bridge) > return; > > - drm_atomic_bridge_disable(bridge->next, state); > + drm_atomic_bridge_chain_disable(bridge->next, state); > > if (bridge->funcs->atomic_disable) > bridge->funcs->atomic_disable(bridge, state); > else if (bridge->funcs->disable) > bridge->funcs->disable(bridge); > } > -EXPORT_SYMBOL(drm_atomic_bridge_disable); > +EXPORT_SYMBOL(drm_atomic_bridge_chain_disable); > > /** > - * drm_atomic_bridge_post_disable - cleans up after disabling all bridges in the > - * encoder chain > + * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges > + * in the encoder chain > * @bridge: bridge control structure > * @state: atomic state being committed > * > @@ -392,8 +395,8 @@ EXPORT_SYMBOL(drm_atomic_bridge_disable); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_atomic_bridge_post_disable(struct drm_bridge *bridge, > - struct drm_atomic_state *state) > +void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge, > + struct drm_atomic_state *state) > { > if (!bridge) > return; > @@ -403,13 +406,13 @@ void drm_atomic_bridge_post_disable(struct drm_bridge *bridge, > else if (bridge->funcs->post_disable) > bridge->funcs->post_disable(bridge); > > - drm_atomic_bridge_post_disable(bridge->next, state); > + drm_atomic_bridge_chain_post_disable(bridge->next, state); > } > -EXPORT_SYMBOL(drm_atomic_bridge_post_disable); > +EXPORT_SYMBOL(drm_atomic_bridge_chain_post_disable); > > /** > - * drm_atomic_bridge_pre_enable - prepares for enabling all bridges in the > - * encoder chain > + * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in > + * the encoder chain > * @bridge: bridge control structure > * @state: atomic state being committed > * > @@ -420,23 +423,23 @@ EXPORT_SYMBOL(drm_atomic_bridge_post_disable); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_atomic_bridge_pre_enable(struct drm_bridge *bridge, > - struct drm_atomic_state *state) > +void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge, > + struct drm_atomic_state *state) > { > if (!bridge) > return; > > - drm_atomic_bridge_pre_enable(bridge->next, state); > + drm_atomic_bridge_chain_pre_enable(bridge->next, state); > > if (bridge->funcs->atomic_pre_enable) > bridge->funcs->atomic_pre_enable(bridge, state); > else if (bridge->funcs->pre_enable) > bridge->funcs->pre_enable(bridge); > } > -EXPORT_SYMBOL(drm_atomic_bridge_pre_enable); > +EXPORT_SYMBOL(drm_atomic_bridge_chain_pre_enable); > > /** > - * drm_atomic_bridge_enable - enables all bridges in the encoder chain > + * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain > * @bridge: bridge control structure > * @state: atomic state being committed > * > @@ -447,8 +450,8 @@ EXPORT_SYMBOL(drm_atomic_bridge_pre_enable); > * > * Note: the bridge passed should be the one closest to the encoder > */ > -void drm_atomic_bridge_enable(struct drm_bridge *bridge, > - struct drm_atomic_state *state) > +void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge, > + struct drm_atomic_state *state) > { > if (!bridge) > return; > @@ -458,9 +461,9 @@ void drm_atomic_bridge_enable(struct drm_bridge *bridge, > else if (bridge->funcs->enable) > bridge->funcs->enable(bridge); > > - drm_atomic_bridge_enable(bridge->next, state); > + drm_atomic_bridge_chain_enable(bridge->next, state); > } > -EXPORT_SYMBOL(drm_atomic_bridge_enable); > +EXPORT_SYMBOL(drm_atomic_bridge_chain_enable); > > #ifdef CONFIG_OF > /** > diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c > index a7c87abe88d0..c3ea722065c4 100644 > --- a/drivers/gpu/drm/drm_probe_helper.c > +++ b/drivers/gpu/drm/drm_probe_helper.c > @@ -112,7 +112,7 @@ drm_mode_validate_pipeline(struct drm_display_mode *mode, > continue; > } > > - ret = drm_bridge_mode_valid(encoder->bridge, mode); > + ret = drm_bridge_chain_mode_valid(encoder->bridge, mode); > if (ret != MODE_OK) { > /* There is also no point in continuing for crtc check > * here. */ > diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c > index c79b1f855d89..ea68b5adccbe 100644 > --- a/drivers/gpu/drm/mediatek/mtk_hdmi.c > +++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c > @@ -1247,8 +1247,8 @@ static int mtk_hdmi_conn_mode_valid(struct drm_connector *conn, > struct drm_display_mode adjusted_mode; > > drm_mode_copy(&adjusted_mode, mode); > - if (!drm_bridge_mode_fixup(hdmi->bridge.next, mode, > - &adjusted_mode)) > + if (!drm_bridge_chain_mode_fixup(hdmi->bridge.next, mode, > + &adjusted_mode)) > return MODE_BAD; > } > > diff --git a/include/drm/drm_bridge.h b/include/drm/drm_bridge.h > index c0a2286a81e9..726435baf4ad 100644 > --- a/include/drm/drm_bridge.h > +++ b/include/drm/drm_bridge.h > @@ -254,9 +254,10 @@ struct drm_bridge_funcs { > * there is one) when this callback is called. > * > * Note that this function will only be invoked in the context of an > - * atomic commit. It will not be invoked from &drm_bridge_pre_enable. It > - * would be prudent to also provide an implementation of @pre_enable if > - * you are expecting driver calls into &drm_bridge_pre_enable. > + * atomic commit. It will not be invoked from > + * &drm_bridge_chain_pre_enable. It would be prudent to also provide an > + * implementation of @pre_enable if you are expecting driver calls into > + * &drm_bridge_chain_pre_enable. > * > * The @atomic_pre_enable callback is optional. > */ > @@ -279,9 +280,9 @@ struct drm_bridge_funcs { > * chain if there is one. > * > * Note that this function will only be invoked in the context of an > - * atomic commit. It will not be invoked from &drm_bridge_enable. It > - * would be prudent to also provide an implementation of @enable if > - * you are expecting driver calls into &drm_bridge_enable. > + * atomic commit. It will not be invoked from &drm_bridge_chain_enable. > + * It would be prudent to also provide an implementation of @enable if > + * you are expecting driver calls into &drm_bridge_chain_enable. > * > * The @atomic_enable callback is optional. > */ > @@ -301,9 +302,10 @@ struct drm_bridge_funcs { > * signals) feeding it is still running when this callback is called. > * > * Note that this function will only be invoked in the context of an > - * atomic commit. It will not be invoked from &drm_bridge_disable. It > - * would be prudent to also provide an implementation of @disable if > - * you are expecting driver calls into &drm_bridge_disable. > + * atomic commit. It will not be invoked from > + * &drm_bridge_chain_disable. It would be prudent to also provide an > + * implementation of @disable if you are expecting driver calls into > + * &drm_bridge_chain_disable. > * > * The @atomic_disable callback is optional. > */ > @@ -325,10 +327,11 @@ struct drm_bridge_funcs { > * called. > * > * Note that this function will only be invoked in the context of an > - * atomic commit. It will not be invoked from &drm_bridge_post_disable. > + * atomic commit. It will not be invoked from > + * &drm_bridge_chain_post_disable. > * It would be prudent to also provide an implementation of > * @post_disable if you are expecting driver calls into > - * &drm_bridge_post_disable. > + * &drm_bridge_chain_post_disable. > * > * The @atomic_post_disable callback is optional. > */ > @@ -406,27 +409,28 @@ struct drm_bridge *of_drm_find_bridge(struct device_node *np); > int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge, > struct drm_bridge *previous); > > -bool drm_bridge_mode_fixup(struct drm_bridge *bridge, > - const struct drm_display_mode *mode, > - struct drm_display_mode *adjusted_mode); > -enum drm_mode_status drm_bridge_mode_valid(struct drm_bridge *bridge, > - const struct drm_display_mode *mode); > -void drm_bridge_disable(struct drm_bridge *bridge); > -void drm_bridge_post_disable(struct drm_bridge *bridge); > -void drm_bridge_mode_set(struct drm_bridge *bridge, > - const struct drm_display_mode *mode, > - const struct drm_display_mode *adjusted_mode); > -void drm_bridge_pre_enable(struct drm_bridge *bridge); > -void drm_bridge_enable(struct drm_bridge *bridge); > +bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge, > + const struct drm_display_mode *mode, > + struct drm_display_mode *adjusted_mode); > +enum drm_mode_status > +drm_bridge_chain_mode_valid(struct drm_bridge *bridge, > + const struct drm_display_mode *mode); > +void drm_bridge_chain_disable(struct drm_bridge *bridge); > +void drm_bridge_chain_post_disable(struct drm_bridge *bridge); > +void drm_bridge_chain_mode_set(struct drm_bridge *bridge, > + const struct drm_display_mode *mode, > + const struct drm_display_mode *adjusted_mode); > +void drm_bridge_chain_pre_enable(struct drm_bridge *bridge); > +void drm_bridge_chain_enable(struct drm_bridge *bridge); > > -void drm_atomic_bridge_disable(struct drm_bridge *bridge, > - struct drm_atomic_state *state); > -void drm_atomic_bridge_post_disable(struct drm_bridge *bridge, > +void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge, > + struct drm_atomic_state *state); > +void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge, > + struct drm_atomic_state *state); > +void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge, > + struct drm_atomic_state *state); > +void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge, > struct drm_atomic_state *state); > -void drm_atomic_bridge_pre_enable(struct drm_bridge *bridge, > - struct drm_atomic_state *state); > -void drm_atomic_bridge_enable(struct drm_bridge *bridge, > - struct drm_atomic_state *state); > > #ifdef CONFIG_DRM_PANEL_BRIDGE > struct drm_bridge *drm_panel_bridge_add(struct drm_panel *panel); -- Regards, Laurent Pinchart From mboxrd@z Thu Jan 1 00:00:00 1970 From: Laurent Pinchart Subject: Re: [PATCH v3 04/21] drm/bridge: Rename bridge helpers targeting a bridge chain Date: Sun, 24 Nov 2019 12:28:47 +0200 Message-ID: <20191124102847.GE4727@pendragon.ideasonboard.com> References: <20191023154512.9762-1-boris.brezillon@collabora.com> <20191023154512.9762-5-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 [213.167.242.64]) by gabe.freedesktop.org (Postfix) with ESMTPS id 870C689D63 for ; Sun, 24 Nov 2019 10:28:59 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20191023154512.9762-5-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 IGF0IDA1OjQ0OjU1UE0gKzAyMDAsIEJvcmlzIEJyZXppbGxvbiB3cm90ZToKPiBDaGFuZ2UgdGhl IHByZWZpeCBvZiBicmlkZ2UgaGVscGVycyB0YXJnZXRpbmcgYSBicmlkZ2UgY2hhaW4gZnJvbQo+ IGRybV9icmlkZ2VfIHRvIGRybV9icmlkZ2VfY2hhaW5fIHRvIGJldHRlciByZWZsZWN0IHRoZSBm YWN0IHRoYXQKPiB0aGUgb3BlcmF0aW9uIHdpbGwgaGFwcGVuIG9uIGFsbCBlbGVtZW50cyBvZiBj aGFpbiwgc3RhcnRpbmcgYXQgdGhlCj4gYnJpZGdlIHBhc3NlZCBpbiBhcmd1bWVudC4KPiAKPiBT aWduZWQtb2ZmLWJ5OiBCb3JpcyBCcmV6aWxsb24gPGJvcmlzLmJyZXppbGxvbkBjb2xsYWJvcmEu Y29tPgoKSSBoYXZlbid0IHJldmlld2VkIHRoaXMgaW4gZGV0YWlscyBidXQgdGhlIHJlbmFtaW5n IGxvb2tzIHNlbnNpYmxlLCBzbwoKQWNrZWQtYnk6IExhdXJlbnQgUGluY2hhcnQgPGxhdXJlbnQu cGluY2hhcnRAaWRlYXNvbmJvYXJkLmNvbT4KCj4gLS0tCj4gQ2hhbmdlcyBpbiB2MzoKPiAqIE5v bmUKPiAKPiBDaGFuZ2VzIGluIHYyOgo+ICogUGFzcyB0ZSBicmlkZ2UsIG5vdCB0aGUgZW5jb2Rl ciwgc28gd2UgY2FuIGxhdGVyIGFjdCBvbiBhIHN1Yi1jaGFpbgo+ICAgaW5zdGVhZCBvZiB0aGUg d2hvbGUgY2hhaW4KPiAtLS0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmMg fCAgMTkgKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL2RybV9icmlkZ2UuYyAgICAgICAgfCAxMjUg KysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vZHJtX3Byb2Jl X2hlbHBlci5jICB8ICAgMiArLQo+ICBkcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2hkbWku YyB8ICAgNCArLQo+ICBpbmNsdWRlL2RybS9kcm1fYnJpZGdlLmggICAgICAgICAgICB8ICA2NCAr KysrKysrLS0tLS0tLQo+ICA1IGZpbGVzIGNoYW5nZWQsIDExMiBpbnNlcnRpb25zKCspLCAxMDIg ZGVsZXRpb25zKC0pCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWlj X2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9hdG9taWNfaGVscGVyLmMKPiBpbmRleCA1 ODcwNTI3NTFiNDguLmNmNjc4YmU1OGZhNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v ZHJtX2F0b21pY19oZWxwZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fYXRvbWljX2hl bHBlci5jCj4gQEAgLTQzNSw4ICs0MzUsOSBAQCBtb2RlX2ZpeHVwKHN0cnVjdCBkcm1fYXRvbWlj X3N0YXRlICpzdGF0ZSkKPiAgCQllbmNvZGVyID0gbmV3X2Nvbm5fc3RhdGUtPmJlc3RfZW5jb2Rl cjsKPiAgCQlmdW5jcyA9IGVuY29kZXItPmhlbHBlcl9wcml2YXRlOwo+ICAKPiAtCQlyZXQgPSBk cm1fYnJpZGdlX21vZGVfZml4dXAoZW5jb2Rlci0+YnJpZGdlLCAmbmV3X2NydGNfc3RhdGUtPm1v ZGUsCj4gLQkJCQkmbmV3X2NydGNfc3RhdGUtPmFkanVzdGVkX21vZGUpOwo+ICsJCXJldCA9IGRy bV9icmlkZ2VfY2hhaW5fbW9kZV9maXh1cChlbmNvZGVyLT5icmlkZ2UsCj4gKwkJCQkJJm5ld19j cnRjX3N0YXRlLT5tb2RlLAo+ICsJCQkJCSZuZXdfY3J0Y19zdGF0ZS0+YWRqdXN0ZWRfbW9kZSk7 Cj4gIAkJaWYgKCFyZXQpIHsKPiAgCQkJRFJNX0RFQlVHX0FUT01JQygiQnJpZGdlIGZpeHVwIGZh aWxlZFxuIik7Cj4gIAkJCXJldHVybiAtRUlOVkFMOwo+IEBAIC01MDEsNyArNTAyLDcgQEAgc3Rh dGljIGVudW0gZHJtX21vZGVfc3RhdHVzIG1vZGVfdmFsaWRfcGF0aChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLAo+ICAJCXJldHVybiByZXQ7Cj4gIAl9Cj4gIAo+IC0JcmV0ID0gZHJt X2JyaWRnZV9tb2RlX3ZhbGlkKGVuY29kZXItPmJyaWRnZSwgbW9kZSk7Cj4gKwlyZXQgPSBkcm1f YnJpZGdlX2NoYWluX21vZGVfdmFsaWQoZW5jb2Rlci0+YnJpZGdlLCBtb2RlKTsKPiAgCWlmIChy ZXQgIT0gTU9ERV9PSykgewo+ICAJCURSTV9ERUJVR19BVE9NSUMoIltCUklER0VdIG1vZGVfdmFs aWQoKSBmYWlsZWRcbiIpOwo+ICAJCXJldHVybiByZXQ7Cj4gQEAgLTEwMjAsNyArMTAyMSw3IEBA IGRpc2FibGVfb3V0cHV0cyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2F0b21p Y19zdGF0ZSAqb2xkX3N0YXRlKQo+ICAJCSAqIEVhY2ggZW5jb2RlciBoYXMgYXQgbW9zdCBvbmUg Y29ubmVjdG9yIChzaW5jZSB3ZSBhbHdheXMgc3RlYWwKPiAgCQkgKiBpdCBhd2F5KSwgc28gd2Ug d29uJ3QgY2FsbCBkaXNhYmxlIGhvb2tzIHR3aWNlLgo+ICAJCSAqLwo+IC0JCWRybV9hdG9taWNf YnJpZGdlX2Rpc2FibGUoZW5jb2Rlci0+YnJpZGdlLCBvbGRfc3RhdGUpOwo+ICsJCWRybV9hdG9t aWNfYnJpZGdlX2NoYWluX2Rpc2FibGUoZW5jb2Rlci0+YnJpZGdlLCBvbGRfc3RhdGUpOwo+ICAK PiAgCQkvKiBSaWdodCBmdW5jdGlvbiBkZXBlbmRzIHVwb24gdGFyZ2V0IHN0YXRlLiAqLwo+ICAJ CWlmIChmdW5jcykgewo+IEBAIC0xMDM0LDcgKzEwMzUsOCBAQCBkaXNhYmxlX291dHB1dHMoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkK PiAgCQkJCWZ1bmNzLT5kcG1zKGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKPiAgCQl9Cj4g IAo+IC0JCWRybV9hdG9taWNfYnJpZGdlX3Bvc3RfZGlzYWJsZShlbmNvZGVyLT5icmlkZ2UsIG9s ZF9zdGF0ZSk7Cj4gKwkJZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcG9zdF9kaXNhYmxlKGVuY29k ZXItPmJyaWRnZSwKPiArCQkJCQkJICAgICBvbGRfc3RhdGUpOwo+ICAJfQo+ICAKPiAgCWZvcl9l YWNoX29sZG5ld19jcnRjX2luX3N0YXRlKG9sZF9zdGF0ZSwgY3J0Yywgb2xkX2NydGNfc3RhdGUs IG5ld19jcnRjX3N0YXRlLCBpKSB7Cj4gQEAgLTEyMTUsNyArMTIxNyw4IEBAIGNydGNfc2V0X21v ZGUoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9z dGF0ZSkKPiAgCQkJZnVuY3MtPm1vZGVfc2V0KGVuY29kZXIsIG1vZGUsIGFkanVzdGVkX21vZGUp Owo+ICAJCX0KPiAgCj4gLQkJZHJtX2JyaWRnZV9tb2RlX3NldChlbmNvZGVyLT5icmlkZ2UsIG1v ZGUsIGFkanVzdGVkX21vZGUpOwo+ICsJCWRybV9icmlkZ2VfY2hhaW5fbW9kZV9zZXQoZW5jb2Rl ci0+YnJpZGdlLCBtb2RlLAo+ICsJCQkJCSAgYWRqdXN0ZWRfbW9kZSk7Cj4gIAl9Cj4gIH0KPiAg Cj4gQEAgLTEzMzIsNyArMTMzNSw3IEBAIHZvaWQgZHJtX2F0b21pY19oZWxwZXJfY29tbWl0X21v ZGVzZXRfZW5hYmxlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+ICAJCSAqIEVhY2ggZW5jb2Rl ciBoYXMgYXQgbW9zdCBvbmUgY29ubmVjdG9yIChzaW5jZSB3ZSBhbHdheXMgc3RlYWwKPiAgCQkg KiBpdCBhd2F5KSwgc28gd2Ugd29uJ3QgY2FsbCBlbmFibGUgaG9va3MgdHdpY2UuCj4gIAkJICov Cj4gLQkJZHJtX2F0b21pY19icmlkZ2VfcHJlX2VuYWJsZShlbmNvZGVyLT5icmlkZ2UsIG9sZF9z dGF0ZSk7Cj4gKwkJZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcHJlX2VuYWJsZShlbmNvZGVyLT5i cmlkZ2UsIG9sZF9zdGF0ZSk7Cj4gIAo+ICAJCWlmIChmdW5jcykgewo+ICAJCQlpZiAoZnVuY3Mt PmF0b21pY19lbmFibGUpCj4gQEAgLTEzNDMsNyArMTM0Niw3IEBAIHZvaWQgZHJtX2F0b21pY19o ZWxwZXJfY29tbWl0X21vZGVzZXRfZW5hYmxlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAo+ICAJ CQkJZnVuY3MtPmNvbW1pdChlbmNvZGVyKTsKPiAgCQl9Cj4gIAo+IC0JCWRybV9hdG9taWNfYnJp ZGdlX2VuYWJsZShlbmNvZGVyLT5icmlkZ2UsIG9sZF9zdGF0ZSk7Cj4gKwkJZHJtX2F0b21pY19i cmlkZ2VfY2hhaW5fZW5hYmxlKGVuY29kZXItPmJyaWRnZSwgb2xkX3N0YXRlKTsKPiAgCX0KPiAg Cj4gIAlkcm1fYXRvbWljX2hlbHBlcl9jb21taXRfd3JpdGViYWNrcyhkZXYsIG9sZF9zdGF0ZSk7 Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fYnJpZGdlLmMgYi9kcml2ZXJzL2dw dS9kcm0vZHJtX2JyaWRnZS5jCj4gaW5kZXggY2JhNTM3Yzk5ZTQzLi41NGM4NzQ0OTNjNTcgMTAw NjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL2RybV9icmlkZ2UuYwo+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fYnJpZGdlLmMKPiBAQCAtMTcyLDggKzE3Miw4IEBAIHZvaWQgZHJtX2JyaWRn ZV9kZXRhY2goc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiAgICovCj4gIAo+ICAvKioKPiAt ICogZHJtX2JyaWRnZV9tb2RlX2ZpeHVwIC0gZml4dXAgcHJvcG9zZWQgbW9kZSBmb3IgYWxsIGJy aWRnZXMgaW4gdGhlCj4gLSAqCQkJICAgZW5jb2RlciBjaGFpbgo+ICsgKiBkcm1fYnJpZGdlX2No YWluX21vZGVfZml4dXAgLSBmaXh1cCBwcm9wb3NlZCBtb2RlIGZvciBhbGwgYnJpZGdlcyBpbiB0 aGUKPiArICoJCQkJIGVuY29kZXIgY2hhaW4KPiAgICogQGJyaWRnZTogYnJpZGdlIGNvbnRyb2wg c3RydWN0dXJlCj4gICAqIEBtb2RlOiBkZXNpcmVkIG1vZGUgdG8gYmUgc2V0IGZvciB0aGUgYnJp ZGdlCj4gICAqIEBhZGp1c3RlZF9tb2RlOiB1cGRhdGVkIG1vZGUgdGhhdCB3b3JrcyBmb3IgdGhp cyBicmlkZ2UKPiBAQCAtMTg2LDkgKzE4Niw5IEBAIHZvaWQgZHJtX2JyaWRnZV9kZXRhY2goc3Ry dWN0IGRybV9icmlkZ2UgKmJyaWRnZSkKPiAgICogUkVUVVJOUzoKPiAgICogdHJ1ZSBvbiBzdWNj ZXNzLCBmYWxzZSBvbiBmYWlsdXJlCj4gICAqLwo+IC1ib29sIGRybV9icmlkZ2VfbW9kZV9maXh1 cChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+IC0JCQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3Bs YXlfbW9kZSAqbW9kZSwKPiAtCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21v ZGUpCj4gK2Jvb2wgZHJtX2JyaWRnZV9jaGFpbl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fYnJpZGdl ICpicmlkZ2UsCj4gKwkJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4g KwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCj4gIHsKPiAgCWJv b2wgcmV0ID0gdHJ1ZTsKPiAgCj4gQEAgLTE5OCwxNSArMTk4LDE2IEBAIGJvb2wgZHJtX2JyaWRn ZV9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAlpZiAoYnJpZGdlLT5m dW5jcy0+bW9kZV9maXh1cCkKPiAgCQlyZXQgPSBicmlkZ2UtPmZ1bmNzLT5tb2RlX2ZpeHVwKGJy aWRnZSwgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7Cj4gIAo+IC0JcmV0ID0gcmV0ICYmIGRybV9icmlk Z2VfbW9kZV9maXh1cChicmlkZ2UtPm5leHQsIG1vZGUsIGFkanVzdGVkX21vZGUpOwo+ICsJcmV0 ID0gcmV0ICYmIGRybV9icmlkZ2VfY2hhaW5fbW9kZV9maXh1cChicmlkZ2UtPm5leHQsIG1vZGUs Cj4gKwkJCQkJCSBhZGp1c3RlZF9tb2RlKTsKPiAgCj4gIAlyZXR1cm4gcmV0Owo+ICB9Cj4gLUVY UE9SVF9TWU1CT0woZHJtX2JyaWRnZV9tb2RlX2ZpeHVwKTsKPiArRVhQT1JUX1NZTUJPTChkcm1f YnJpZGdlX2NoYWluX21vZGVfZml4dXApOwo+ICAKPiAgLyoqCj4gLSAqIGRybV9icmlkZ2VfbW9k ZV92YWxpZCAtIHZhbGlkYXRlIHRoZSBtb2RlIGFnYWluc3QgYWxsIGJyaWRnZXMgaW4gdGhlCj4g LSAqIAkJCSAgIGVuY29kZXIgY2hhaW4uCj4gKyAqIGRybV9icmlkZ2VfY2hhaW5fbW9kZV92YWxp ZCAtIHZhbGlkYXRlIHRoZSBtb2RlIGFnYWluc3QgYWxsIGJyaWRnZXMgaW4gdGhlCj4gKyAqCQkJ CSBlbmNvZGVyIGNoYWluLgo+ICAgKiBAYnJpZGdlOiBicmlkZ2UgY29udHJvbCBzdHJ1Y3R1cmUK PiAgICogQG1vZGU6IGRlc2lyZWQgbW9kZSB0byBiZSB2YWxpZGF0ZWQKPiAgICoKPiBAQCAtMjE5 LDggKzIyMCw5IEBAIEVYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9tb2RlX2ZpeHVwKTsKPiAgICog UkVUVVJOUzoKPiAgICogTU9ERV9PSyBvbiBzdWNjZXNzLCBkcm1fbW9kZV9zdGF0dXMgRW51bSBl cnJvciBjb2RlIG9uIGZhaWx1cmUKPiAgICovCj4gLWVudW0gZHJtX21vZGVfc3RhdHVzIGRybV9i cmlkZ2VfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+IC0JCQkJCSAgIGNv bnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICtlbnVtIGRybV9tb2RlX3N0YXR1 cwo+ICtkcm1fYnJpZGdlX2NoYWluX21vZGVfdmFsaWQoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZSwKPiArCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQo+ICB7Cj4g IAllbnVtIGRybV9tb2RlX3N0YXR1cyByZXQgPSBNT0RFX09LOwo+ICAKPiBAQCAtMjMzLDEyICsy MzUsMTIgQEAgZW51bSBkcm1fbW9kZV9zdGF0dXMgZHJtX2JyaWRnZV9tb2RlX3ZhbGlkKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAlpZiAocmV0ICE9IE1PREVfT0spCj4gIAkJcmV0dXJu IHJldDsKPiAgCj4gLQlyZXR1cm4gZHJtX2JyaWRnZV9tb2RlX3ZhbGlkKGJyaWRnZS0+bmV4dCwg bW9kZSk7Cj4gKwlyZXR1cm4gZHJtX2JyaWRnZV9jaGFpbl9tb2RlX3ZhbGlkKGJyaWRnZS0+bmV4 dCwgbW9kZSk7Cj4gIH0KPiAtRVhQT1JUX1NZTUJPTChkcm1fYnJpZGdlX21vZGVfdmFsaWQpOwo+ ICtFWFBPUlRfU1lNQk9MKGRybV9icmlkZ2VfY2hhaW5fbW9kZV92YWxpZCk7Cj4gIAo+ICAvKioK PiAtICogZHJtX2JyaWRnZV9kaXNhYmxlIC0gZGlzYWJsZXMgYWxsIGJyaWRnZXMgaW4gdGhlIGVu Y29kZXIgY2hhaW4KPiArICogZHJtX2JyaWRnZV9jaGFpbl9kaXNhYmxlIC0gZGlzYWJsZXMgYWxs IGJyaWRnZXMgaW4gdGhlIGVuY29kZXIgY2hhaW4KPiAgICogQGJyaWRnZTogYnJpZGdlIGNvbnRy b2wgc3RydWN0dXJlCj4gICAqCj4gICAqIENhbGxzICZkcm1fYnJpZGdlX2Z1bmNzLmRpc2FibGUg b3AgZm9yIGFsbCB0aGUgYnJpZGdlcyBpbiB0aGUgZW5jb2Rlcgo+IEBAIC0yNDcsMjAgKzI0OSwy MSBAQCBFWFBPUlRfU1lNQk9MKGRybV9icmlkZ2VfbW9kZV92YWxpZCk7Cj4gICAqCj4gICAqIE5v dGU6IHRoZSBicmlkZ2UgcGFzc2VkIHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8gdGhlIGVu Y29kZXIKPiAgICovCj4gLXZvaWQgZHJtX2JyaWRnZV9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdl ICpicmlkZ2UpCj4gK3ZvaWQgZHJtX2JyaWRnZV9jaGFpbl9kaXNhYmxlKHN0cnVjdCBkcm1fYnJp ZGdlICpicmlkZ2UpCj4gIHsKPiAgCWlmICghYnJpZGdlKQo+ICAJCXJldHVybjsKPiAgCj4gLQlk cm1fYnJpZGdlX2Rpc2FibGUoYnJpZGdlLT5uZXh0KTsKPiArCWRybV9icmlkZ2VfY2hhaW5fZGlz YWJsZShicmlkZ2UtPm5leHQpOwo+ICAKPiAgCWlmIChicmlkZ2UtPmZ1bmNzLT5kaXNhYmxlKQo+ ICAJCWJyaWRnZS0+ZnVuY3MtPmRpc2FibGUoYnJpZGdlKTsKPiAgfQo+IC1FWFBPUlRfU1lNQk9M KGRybV9icmlkZ2VfZGlzYWJsZSk7Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9jaGFpbl9k aXNhYmxlKTsKPiAgCj4gIC8qKgo+IC0gKiBkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZSAtIGNsZWFu cyB1cCBhZnRlciBkaXNhYmxpbmcgYWxsIGJyaWRnZXMgaW4gdGhlIGVuY29kZXIgY2hhaW4KPiAr ICogZHJtX2JyaWRnZV9jaGFpbl9wb3N0X2Rpc2FibGUgLSBjbGVhbnMgdXAgYWZ0ZXIgZGlzYWJs aW5nIGFsbCBicmlkZ2VzIGluIHRoZQo+ICsgKgkJCQkgICBlbmNvZGVyIGNoYWluCj4gICAqIEBi cmlkZ2U6IGJyaWRnZSBjb250cm9sIHN0cnVjdHVyZQo+ICAgKgo+ICAgKiBDYWxscyAmZHJtX2Jy aWRnZV9mdW5jcy5wb3N0X2Rpc2FibGUgb3AgZm9yIGFsbCB0aGUgYnJpZGdlcyBpbiB0aGUKPiBA QCAtMjY5LDcgKzI3Miw3IEBAIEVYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9kaXNhYmxlKTsKPiAg ICoKPiAgICogTm90ZTogdGhlIGJyaWRnZSBwYXNzZWQgc2hvdWxkIGJlIHRoZSBvbmUgY2xvc2Vz dCB0byB0aGUgZW5jb2Rlcgo+ICAgKi8KPiAtdm9pZCBkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZShz dHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt2b2lkIGRybV9icmlkZ2VfY2hhaW5fcG9zdF9k aXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gIHsKPiAgCWlmICghYnJpZGdlKQo+ ICAJCXJldHVybjsKPiBAQCAtMjc3LDI1ICsyODAsMjUgQEAgdm9pZCBkcm1fYnJpZGdlX3Bvc3Rf ZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICAJaWYgKGJyaWRnZS0+ZnVuY3Mt PnBvc3RfZGlzYWJsZSkKPiAgCQlicmlkZ2UtPmZ1bmNzLT5wb3N0X2Rpc2FibGUoYnJpZGdlKTsK PiAgCj4gLQlkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZShicmlkZ2UtPm5leHQpOwo+ICsJZHJtX2Jy aWRnZV9jaGFpbl9wb3N0X2Rpc2FibGUoYnJpZGdlLT5uZXh0KTsKPiAgfQo+IC1FWFBPUlRfU1lN Qk9MKGRybV9icmlkZ2VfcG9zdF9kaXNhYmxlKTsKPiArRVhQT1JUX1NZTUJPTChkcm1fYnJpZGdl X2NoYWluX3Bvc3RfZGlzYWJsZSk7Cj4gIAo+ICAvKioKPiAtICogZHJtX2JyaWRnZV9tb2RlX3Nl dCAtIHNldCBwcm9wb3NlZCBtb2RlIGZvciBhbGwgYnJpZGdlcyBpbiB0aGUKPiAtICoJCQkgZW5j b2RlciBjaGFpbgo+ICsgKiBkcm1fYnJpZGdlX2NoYWluX21vZGVfc2V0IC0gc2V0IHByb3Bvc2Vk IG1vZGUgZm9yIGFsbCBicmlkZ2VzIGluIHRoZQo+ICsgKgkJCSAgICAgICBlbmNvZGVyIGNoYWlu Cj4gICAqIEBicmlkZ2U6IGJyaWRnZSBjb250cm9sIHN0cnVjdHVyZQo+IC0gKiBAbW9kZTogZGVz aXJlZCBtb2RlIHRvIGJlIHNldCBmb3IgdGhlIGJyaWRnZQo+IC0gKiBAYWRqdXN0ZWRfbW9kZTog dXBkYXRlZCBtb2RlIHRoYXQgd29ya3MgZm9yIHRoaXMgYnJpZGdlCj4gKyAqIEBtb2RlOiBkZXNp cmVkIG1vZGUgdG8gYmUgc2V0IGZvciB0aGUgZW5jb2RlciBjaGFpbgo+ICsgKiBAYWRqdXN0ZWRf bW9kZTogdXBkYXRlZCBtb2RlIHRoYXQgd29ya3MgZm9yIHRoaXMgZW5jb2RlciBjaGFpbgo+ICAg Kgo+ICAgKiBDYWxscyAmZHJtX2JyaWRnZV9mdW5jcy5tb2RlX3NldCBvcCBmb3IgYWxsIHRoZSBi cmlkZ2VzIGluIHRoZQo+ICAgKiBlbmNvZGVyIGNoYWluLCBzdGFydGluZyBmcm9tIHRoZSBmaXJz dCBicmlkZ2UgdG8gdGhlIGxhc3QuCj4gICAqCj4gICAqIE5vdGU6IHRoZSBicmlkZ2UgcGFzc2Vk IHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8gdGhlIGVuY29kZXIKPiAgICovCj4gLXZvaWQg ZHJtX2JyaWRnZV9tb2RlX3NldChzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+IC0JCQkgY29u c3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gLQkJCSBjb25zdCBzdHJ1Y3QgZHJt X2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRfbW9kZSkKPiArdm9pZCBkcm1fYnJpZGdlX2NoYWluX21v ZGVfc2V0KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gKwkJCSAgICAgICBjb25zdCBzdHJ1 Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKPiArCQkJICAgICAgIGNvbnN0IHN0cnVjdCBkcm1f ZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQo+ICB7Cj4gIAlpZiAoIWJyaWRnZSkKPiAgCQly ZXR1cm47Cj4gQEAgLTMwMywxMyArMzA2LDEzIEBAIHZvaWQgZHJtX2JyaWRnZV9tb2RlX3NldChz dHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICAJaWYgKGJyaWRnZS0+ZnVuY3MtPm1vZGVfc2V0 KQo+ICAJCWJyaWRnZS0+ZnVuY3MtPm1vZGVfc2V0KGJyaWRnZSwgbW9kZSwgYWRqdXN0ZWRfbW9k ZSk7Cj4gIAo+IC0JZHJtX2JyaWRnZV9tb2RlX3NldChicmlkZ2UtPm5leHQsIG1vZGUsIGFkanVz dGVkX21vZGUpOwo+ICsJZHJtX2JyaWRnZV9jaGFpbl9tb2RlX3NldChicmlkZ2UtPm5leHQsIG1v ZGUsIGFkanVzdGVkX21vZGUpOwo+ICB9Cj4gLUVYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9tb2Rl X3NldCk7Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9jaGFpbl9tb2RlX3NldCk7Cj4gIAo+ ICAvKioKPiAtICogZHJtX2JyaWRnZV9wcmVfZW5hYmxlIC0gcHJlcGFyZXMgZm9yIGVuYWJsaW5n IGFsbAo+IC0gKgkJCSAgIGJyaWRnZXMgaW4gdGhlIGVuY29kZXIgY2hhaW4KPiArICogZHJtX2Jy aWRnZV9jaGFpbl9wcmVfZW5hYmxlIC0gcHJlcGFyZXMgZm9yIGVuYWJsaW5nIGFsbCBicmlkZ2Vz IGluIHRoZQo+ICsgKgkJCQkgZW5jb2RlciBjaGFpbgo+ICAgKiBAYnJpZGdlOiBicmlkZ2UgY29u dHJvbCBzdHJ1Y3R1cmUKPiAgICoKPiAgICogQ2FsbHMgJmRybV9icmlkZ2VfZnVuY3MucHJlX2Vu YWJsZSBvcCBmb3IgYWxsIHRoZSBicmlkZ2VzIGluIHRoZSBlbmNvZGVyCj4gQEAgLTMxOCwyMCAr MzIxLDIwIEBAIEVYUE9SVF9TWU1CT0woZHJtX2JyaWRnZV9tb2RlX3NldCk7Cj4gICAqCj4gICAq IE5vdGU6IHRoZSBicmlkZ2UgcGFzc2VkIHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8gdGhl IGVuY29kZXIKPiAgICovCj4gLXZvaWQgZHJtX2JyaWRnZV9wcmVfZW5hYmxlKHN0cnVjdCBkcm1f YnJpZGdlICpicmlkZ2UpCj4gK3ZvaWQgZHJtX2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UpCj4gIHsKPiAgCWlmICghYnJpZGdlKQo+ICAJCXJldHVybjsK PiAgCj4gLQlkcm1fYnJpZGdlX3ByZV9lbmFibGUoYnJpZGdlLT5uZXh0KTsKPiArCWRybV9icmlk Z2VfY2hhaW5fcHJlX2VuYWJsZShicmlkZ2UtPm5leHQpOwo+ICAKPiAgCWlmIChicmlkZ2UtPmZ1 bmNzLT5wcmVfZW5hYmxlKQo+ICAJCWJyaWRnZS0+ZnVuY3MtPnByZV9lbmFibGUoYnJpZGdlKTsK PiAgfQo+IC1FWFBPUlRfU1lNQk9MKGRybV9icmlkZ2VfcHJlX2VuYWJsZSk7Cj4gK0VYUE9SVF9T WU1CT0woZHJtX2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlKTsKPiAgCj4gIC8qKgo+IC0gKiBkcm1f YnJpZGdlX2VuYWJsZSAtIGVuYWJsZXMgYWxsIGJyaWRnZXMgaW4gdGhlIGVuY29kZXIgY2hhaW4K PiArICogZHJtX2JyaWRnZV9jaGFpbl9lbmFibGUgLSBlbmFibGVzIGFsbCBicmlkZ2VzIGluIHRo ZSBlbmNvZGVyIGNoYWluCj4gICAqIEBicmlkZ2U6IGJyaWRnZSBjb250cm9sIHN0cnVjdHVyZQo+ ICAgKgo+ICAgKiBDYWxscyAmZHJtX2JyaWRnZV9mdW5jcy5lbmFibGUgb3AgZm9yIGFsbCB0aGUg YnJpZGdlcyBpbiB0aGUgZW5jb2Rlcgo+IEBAIC0zNDAsNyArMzQzLDcgQEAgRVhQT1JUX1NZTUJP TChkcm1fYnJpZGdlX3ByZV9lbmFibGUpOwo+ICAgKgo+ICAgKiBOb3RlIHRoYXQgdGhlIGJyaWRn ZSBwYXNzZWQgc2hvdWxkIGJlIHRoZSBvbmUgY2xvc2VzdCB0byB0aGUgZW5jb2Rlcgo+ICAgKi8K PiAtdm9pZCBkcm1fYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICt2 b2lkIGRybV9icmlkZ2VfY2hhaW5fZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpCj4g IHsKPiAgCWlmICghYnJpZGdlKQo+ICAJCXJldHVybjsKPiBAQCAtMzQ4LDEyICszNTEsMTIgQEAg dm9pZCBkcm1fYnJpZGdlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlKQo+ICAJaWYg KGJyaWRnZS0+ZnVuY3MtPmVuYWJsZSkKPiAgCQlicmlkZ2UtPmZ1bmNzLT5lbmFibGUoYnJpZGdl KTsKPiAgCj4gLQlkcm1fYnJpZGdlX2VuYWJsZShicmlkZ2UtPm5leHQpOwo+ICsJZHJtX2JyaWRn ZV9jaGFpbl9lbmFibGUoYnJpZGdlLT5uZXh0KTsKPiAgfQo+IC1FWFBPUlRfU1lNQk9MKGRybV9i cmlkZ2VfZW5hYmxlKTsKPiArRVhQT1JUX1NZTUJPTChkcm1fYnJpZGdlX2NoYWluX2VuYWJsZSk7 Cj4gIAo+ICAvKioKPiAtICogZHJtX2F0b21pY19icmlkZ2VfZGlzYWJsZSAtIGRpc2FibGVzIGFs bCBicmlkZ2VzIGluIHRoZSBlbmNvZGVyIGNoYWluCj4gKyAqIGRybV9hdG9taWNfYnJpZGdlX2No YWluX2Rpc2FibGUgLSBkaXNhYmxlcyBhbGwgYnJpZGdlcyBpbiB0aGUgZW5jb2RlciBjaGFpbgo+ ICAgKiBAYnJpZGdlOiBicmlkZ2UgY29udHJvbCBzdHJ1Y3R1cmUKPiAgICogQHN0YXRlOiBhdG9t aWMgc3RhdGUgYmVpbmcgY29tbWl0dGVkCj4gICAqCj4gQEAgLTM2NCwyNCArMzY3LDI0IEBAIEVY UE9SVF9TWU1CT0woZHJtX2JyaWRnZV9lbmFibGUpOwo+ICAgKgo+ICAgKiBOb3RlOiB0aGUgYnJp ZGdlIHBhc3NlZCBzaG91bGQgYmUgdGhlIG9uZSBjbG9zZXN0IHRvIHRoZSBlbmNvZGVyCj4gICAq Lwo+IC12b2lkIGRybV9hdG9taWNfYnJpZGdlX2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSwKPiAtCQkJICAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiArdm9p ZCBkcm1fYXRvbWljX2JyaWRnZV9jaGFpbl9kaXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlk Z2UsCj4gKwkJCQkgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiAgewo+ICAJ aWYgKCFicmlkZ2UpCj4gIAkJcmV0dXJuOwo+ICAKPiAtCWRybV9hdG9taWNfYnJpZGdlX2Rpc2Fi bGUoYnJpZGdlLT5uZXh0LCBzdGF0ZSk7Cj4gKwlkcm1fYXRvbWljX2JyaWRnZV9jaGFpbl9kaXNh YmxlKGJyaWRnZS0+bmV4dCwgc3RhdGUpOwo+ICAKPiAgCWlmIChicmlkZ2UtPmZ1bmNzLT5hdG9t aWNfZGlzYWJsZSkKPiAgCQlicmlkZ2UtPmZ1bmNzLT5hdG9taWNfZGlzYWJsZShicmlkZ2UsIHN0 YXRlKTsKPiAgCWVsc2UgaWYgKGJyaWRnZS0+ZnVuY3MtPmRpc2FibGUpCj4gIAkJYnJpZGdlLT5m dW5jcy0+ZGlzYWJsZShicmlkZ2UpOwo+ICB9Cj4gLUVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19i cmlkZ2VfZGlzYWJsZSk7Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2F0b21pY19icmlkZ2VfY2hhaW5f ZGlzYWJsZSk7Cj4gIAo+ICAvKioKPiAtICogZHJtX2F0b21pY19icmlkZ2VfcG9zdF9kaXNhYmxl IC0gY2xlYW5zIHVwIGFmdGVyIGRpc2FibGluZyBhbGwgYnJpZGdlcyBpbiB0aGUKPiAtICoJCQkJ ICAgIGVuY29kZXIgY2hhaW4KPiArICogZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcG9zdF9kaXNh YmxlIC0gY2xlYW5zIHVwIGFmdGVyIGRpc2FibGluZyBhbGwgYnJpZGdlcwo+ICsgKgkJCQkJICBp biB0aGUgZW5jb2RlciBjaGFpbgo+ICAgKiBAYnJpZGdlOiBicmlkZ2UgY29udHJvbCBzdHJ1Y3R1 cmUKPiAgICogQHN0YXRlOiBhdG9taWMgc3RhdGUgYmVpbmcgY29tbWl0dGVkCj4gICAqCj4gQEAg LTM5Miw4ICszOTUsOCBAQCBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfYnJpZGdlX2Rpc2FibGUp Owo+ICAgKgo+ICAgKiBOb3RlOiB0aGUgYnJpZGdlIHBhc3NlZCBzaG91bGQgYmUgdGhlIG9uZSBj bG9zZXN0IHRvIHRoZSBlbmNvZGVyCj4gICAqLwo+IC12b2lkIGRybV9hdG9taWNfYnJpZGdlX3Bv c3RfZGlzYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+IC0JCQkJICAgIHN0cnVjdCBk cm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiArdm9pZCBkcm1fYXRvbWljX2JyaWRnZV9jaGFpbl9w b3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiArCQkJCQkgIHN0cnVjdCBk cm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiAgewo+ICAJaWYgKCFicmlkZ2UpCj4gIAkJcmV0dXJu Owo+IEBAIC00MDMsMTMgKzQwNiwxMyBAQCB2b2lkIGRybV9hdG9taWNfYnJpZGdlX3Bvc3RfZGlz YWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICAJZWxzZSBpZiAoYnJpZGdlLT5mdW5j cy0+cG9zdF9kaXNhYmxlKQo+ICAJCWJyaWRnZS0+ZnVuY3MtPnBvc3RfZGlzYWJsZShicmlkZ2Up Owo+ICAKPiAtCWRybV9hdG9taWNfYnJpZGdlX3Bvc3RfZGlzYWJsZShicmlkZ2UtPm5leHQsIHN0 YXRlKTsKPiArCWRybV9hdG9taWNfYnJpZGdlX2NoYWluX3Bvc3RfZGlzYWJsZShicmlkZ2UtPm5l eHQsIHN0YXRlKTsKPiAgfQo+IC1FWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfYnJpZGdlX3Bvc3Rf ZGlzYWJsZSk7Cj4gK0VYUE9SVF9TWU1CT0woZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcG9zdF9k aXNhYmxlKTsKPiAgCj4gIC8qKgo+IC0gKiBkcm1fYXRvbWljX2JyaWRnZV9wcmVfZW5hYmxlIC0g cHJlcGFyZXMgZm9yIGVuYWJsaW5nIGFsbCBicmlkZ2VzIGluIHRoZQo+IC0gKgkJCQkgIGVuY29k ZXIgY2hhaW4KPiArICogZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcHJlX2VuYWJsZSAtIHByZXBh cmVzIGZvciBlbmFibGluZyBhbGwgYnJpZGdlcyBpbgo+ICsgKgkJCQkJdGhlIGVuY29kZXIgY2hh aW4KPiAgICogQGJyaWRnZTogYnJpZGdlIGNvbnRyb2wgc3RydWN0dXJlCj4gICAqIEBzdGF0ZTog YXRvbWljIHN0YXRlIGJlaW5nIGNvbW1pdHRlZAo+ICAgKgo+IEBAIC00MjAsMjMgKzQyMywyMyBA QCBFWFBPUlRfU1lNQk9MKGRybV9hdG9taWNfYnJpZGdlX3Bvc3RfZGlzYWJsZSk7Cj4gICAqCj4g ICAqIE5vdGU6IHRoZSBicmlkZ2UgcGFzc2VkIHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8g dGhlIGVuY29kZXIKPiAgICovCj4gLXZvaWQgZHJtX2F0b21pY19icmlkZ2VfcHJlX2VuYWJsZShz dHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+IC0JCQkJICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0 ZSAqc3RhdGUpCj4gK3ZvaWQgZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcHJlX2VuYWJsZShzdHJ1 Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpz dGF0ZSkKPiAgewo+ICAJaWYgKCFicmlkZ2UpCj4gIAkJcmV0dXJuOwo+ICAKPiAtCWRybV9hdG9t aWNfYnJpZGdlX3ByZV9lbmFibGUoYnJpZGdlLT5uZXh0LCBzdGF0ZSk7Cj4gKwlkcm1fYXRvbWlj X2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlKGJyaWRnZS0+bmV4dCwgc3RhdGUpOwo+ICAKPiAgCWlm IChicmlkZ2UtPmZ1bmNzLT5hdG9taWNfcHJlX2VuYWJsZSkKPiAgCQlicmlkZ2UtPmZ1bmNzLT5h dG9taWNfcHJlX2VuYWJsZShicmlkZ2UsIHN0YXRlKTsKPiAgCWVsc2UgaWYgKGJyaWRnZS0+ZnVu Y3MtPnByZV9lbmFibGUpCj4gIAkJYnJpZGdlLT5mdW5jcy0+cHJlX2VuYWJsZShicmlkZ2UpOwo+ ICB9Cj4gLUVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19icmlkZ2VfcHJlX2VuYWJsZSk7Cj4gK0VY UE9SVF9TWU1CT0woZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fcHJlX2VuYWJsZSk7Cj4gIAo+ICAv KioKPiAtICogZHJtX2F0b21pY19icmlkZ2VfZW5hYmxlIC0gZW5hYmxlcyBhbGwgYnJpZGdlcyBp biB0aGUgZW5jb2RlciBjaGFpbgo+ICsgKiBkcm1fYXRvbWljX2JyaWRnZV9jaGFpbl9lbmFibGUg LSBlbmFibGVzIGFsbCBicmlkZ2VzIGluIHRoZSBlbmNvZGVyIGNoYWluCj4gICAqIEBicmlkZ2U6 IGJyaWRnZSBjb250cm9sIHN0cnVjdHVyZQo+ICAgKiBAc3RhdGU6IGF0b21pYyBzdGF0ZSBiZWlu ZyBjb21taXR0ZWQKPiAgICoKPiBAQCAtNDQ3LDggKzQ1MCw4IEBAIEVYUE9SVF9TWU1CT0woZHJt X2F0b21pY19icmlkZ2VfcHJlX2VuYWJsZSk7Cj4gICAqCj4gICAqIE5vdGU6IHRoZSBicmlkZ2Ug cGFzc2VkIHNob3VsZCBiZSB0aGUgb25lIGNsb3Nlc3QgdG8gdGhlIGVuY29kZXIKPiAgICovCj4g LXZvaWQgZHJtX2F0b21pY19icmlkZ2VfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2Us Cj4gLQkJCSAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKPiArdm9pZCBkcm1f YXRvbWljX2JyaWRnZV9jaGFpbl9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiAr CQkJCSAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCj4gIHsKPiAgCWlmICghYnJp ZGdlKQo+ICAJCXJldHVybjsKPiBAQCAtNDU4LDkgKzQ2MSw5IEBAIHZvaWQgZHJtX2F0b21pY19i cmlkZ2VfZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAllbHNlIGlmIChicmlk Z2UtPmZ1bmNzLT5lbmFibGUpCj4gIAkJYnJpZGdlLT5mdW5jcy0+ZW5hYmxlKGJyaWRnZSk7Cj4g IAo+IC0JZHJtX2F0b21pY19icmlkZ2VfZW5hYmxlKGJyaWRnZS0+bmV4dCwgc3RhdGUpOwo+ICsJ ZHJtX2F0b21pY19icmlkZ2VfY2hhaW5fZW5hYmxlKGJyaWRnZS0+bmV4dCwgc3RhdGUpOwo+ICB9 Cj4gLUVYUE9SVF9TWU1CT0woZHJtX2F0b21pY19icmlkZ2VfZW5hYmxlKTsKPiArRVhQT1JUX1NZ TUJPTChkcm1fYXRvbWljX2JyaWRnZV9jaGFpbl9lbmFibGUpOwo+ICAKPiAgI2lmZGVmIENPTkZJ R19PRgo+ICAvKioKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxw ZXIuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fcHJvYmVfaGVscGVyLmMKPiBpbmRleCBhN2M4N2Fi ZTg4ZDAuLmMzZWE3MjIwNjVjNCAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX3By b2JlX2hlbHBlci5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2RybV9wcm9iZV9oZWxwZXIuYwo+ IEBAIC0xMTIsNyArMTEyLDcgQEAgZHJtX21vZGVfdmFsaWRhdGVfcGlwZWxpbmUoc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gIAkJCWNvbnRpbnVlOwo+ICAJCX0KPiAgCj4gLQkJcmV0 ID0gZHJtX2JyaWRnZV9tb2RlX3ZhbGlkKGVuY29kZXItPmJyaWRnZSwgbW9kZSk7Cj4gKwkJcmV0 ID0gZHJtX2JyaWRnZV9jaGFpbl9tb2RlX3ZhbGlkKGVuY29kZXItPmJyaWRnZSwgbW9kZSk7Cj4g IAkJaWYgKHJldCAhPSBNT0RFX09LKSB7Cj4gIAkJCS8qIFRoZXJlIGlzIGFsc28gbm8gcG9pbnQg aW4gY29udGludWluZyBmb3IgY3J0YyBjaGVjawo+ICAJCQkgKiBoZXJlLiAqLwo+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2hkbWkuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9tZWRpYXRlay9tdGtfaGRtaS5jCj4gaW5kZXggYzc5YjFmODU1ZDg5Li5lYTY4YjVhZGNjYmUg MTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL21lZGlhdGVrL210a19oZG1pLmMKPiArKysg Yi9kcml2ZXJzL2dwdS9kcm0vbWVkaWF0ZWsvbXRrX2hkbWkuYwo+IEBAIC0xMjQ3LDggKzEyNDcs OCBAQCBzdGF0aWMgaW50IG10a19oZG1pX2Nvbm5fbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubiwKPiAgCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBhZGp1c3RlZF9tb2RlOwo+ ICAKPiAgCQlkcm1fbW9kZV9jb3B5KCZhZGp1c3RlZF9tb2RlLCBtb2RlKTsKPiAtCQlpZiAoIWRy bV9icmlkZ2VfbW9kZV9maXh1cChoZG1pLT5icmlkZ2UubmV4dCwgbW9kZSwKPiAtCQkJCQkgICAm YWRqdXN0ZWRfbW9kZSkpCj4gKwkJaWYgKCFkcm1fYnJpZGdlX2NoYWluX21vZGVfZml4dXAoaGRt aS0+YnJpZGdlLm5leHQsIG1vZGUsCj4gKwkJCQkJCSAmYWRqdXN0ZWRfbW9kZSkpCj4gIAkJCXJl dHVybiBNT0RFX0JBRDsKPiAgCX0KPiAgCj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9i cmlkZ2UuaCBiL2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAo+IGluZGV4IGMwYTIyODZhODFlOS4u NzI2NDM1YmFmNGFkIDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAo+ICsr KyBiL2luY2x1ZGUvZHJtL2RybV9icmlkZ2UuaAo+IEBAIC0yNTQsOSArMjU0LDEwIEBAIHN0cnVj dCBkcm1fYnJpZGdlX2Z1bmNzIHsKPiAgCSAqIHRoZXJlIGlzIG9uZSkgd2hlbiB0aGlzIGNhbGxi YWNrIGlzIGNhbGxlZC4KPiAgCSAqCj4gIAkgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxs IG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgY29udGV4dCBvZiBhbgo+IC0JICogYXRvbWljIGNvbW1p dC4gSXQgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tICZkcm1fYnJpZGdlX3ByZV9lbmFibGUuIEl0 Cj4gLQkgKiB3b3VsZCBiZSBwcnVkZW50IHRvIGFsc28gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlv biBvZiBAcHJlX2VuYWJsZSBpZgo+IC0JICogeW91IGFyZSBleHBlY3RpbmcgZHJpdmVyIGNhbGxz IGludG8gJmRybV9icmlkZ2VfcHJlX2VuYWJsZS4KPiArCSAqIGF0b21pYyBjb21taXQuIEl0IHdp bGwgbm90IGJlIGludm9rZWQgZnJvbQo+ICsJICogJmRybV9icmlkZ2VfY2hhaW5fcHJlX2VuYWJs ZS4gSXQgd291bGQgYmUgcHJ1ZGVudCB0byBhbHNvIHByb3ZpZGUgYW4KPiArCSAqIGltcGxlbWVu dGF0aW9uIG9mIEBwcmVfZW5hYmxlIGlmIHlvdSBhcmUgZXhwZWN0aW5nIGRyaXZlciBjYWxscyBp bnRvCj4gKwkgKiAmZHJtX2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlLgo+ICAJICoKPiAgCSAqIFRo ZSBAYXRvbWljX3ByZV9lbmFibGUgY2FsbGJhY2sgaXMgb3B0aW9uYWwuCj4gIAkgKi8KPiBAQCAt Mjc5LDkgKzI4MCw5IEBAIHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIHsKPiAgCSAqIGNoYWluIGlm IHRoZXJlIGlzIG9uZS4KPiAgCSAqCj4gIAkgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxs IG9ubHkgYmUgaW52b2tlZCBpbiB0aGUgY29udGV4dCBvZiBhbgo+IC0JICogYXRvbWljIGNvbW1p dC4gSXQgd2lsbCBub3QgYmUgaW52b2tlZCBmcm9tICZkcm1fYnJpZGdlX2VuYWJsZS4gSXQKPiAt CSAqIHdvdWxkIGJlIHBydWRlbnQgdG8gYWxzbyBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9m IEBlbmFibGUgaWYKPiAtCSAqIHlvdSBhcmUgZXhwZWN0aW5nIGRyaXZlciBjYWxscyBpbnRvICZk cm1fYnJpZGdlX2VuYWJsZS4KPiArCSAqIGF0b21pYyBjb21taXQuIEl0IHdpbGwgbm90IGJlIGlu dm9rZWQgZnJvbSAmZHJtX2JyaWRnZV9jaGFpbl9lbmFibGUuCj4gKwkgKiBJdCB3b3VsZCBiZSBw cnVkZW50IHRvIGFsc28gcHJvdmlkZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBAZW5hYmxlIGlmCj4g KwkgKiB5b3UgYXJlIGV4cGVjdGluZyBkcml2ZXIgY2FsbHMgaW50byAmZHJtX2JyaWRnZV9jaGFp bl9lbmFibGUuCj4gIAkgKgo+ICAJICogVGhlIEBhdG9taWNfZW5hYmxlIGNhbGxiYWNrIGlzIG9w dGlvbmFsLgo+ICAJICovCj4gQEAgLTMwMSw5ICszMDIsMTAgQEAgc3RydWN0IGRybV9icmlkZ2Vf ZnVuY3Mgewo+ICAJICogc2lnbmFscykgZmVlZGluZyBpdCBpcyBzdGlsbCBydW5uaW5nIHdoZW4g dGhpcyBjYWxsYmFjayBpcyBjYWxsZWQuCj4gIAkgKgo+ICAJICogTm90ZSB0aGF0IHRoaXMgZnVu Y3Rpb24gd2lsbCBvbmx5IGJlIGludm9rZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4KPiAtCSAqIGF0 b21pYyBjb21taXQuIEl0IHdpbGwgbm90IGJlIGludm9rZWQgZnJvbSAmZHJtX2JyaWRnZV9kaXNh YmxlLiBJdAo+IC0JICogd291bGQgYmUgcHJ1ZGVudCB0byBhbHNvIHByb3ZpZGUgYW4gaW1wbGVt ZW50YXRpb24gb2YgQGRpc2FibGUgaWYKPiAtCSAqIHlvdSBhcmUgZXhwZWN0aW5nIGRyaXZlciBj YWxscyBpbnRvICZkcm1fYnJpZGdlX2Rpc2FibGUuCj4gKwkgKiBhdG9taWMgY29tbWl0LiBJdCB3 aWxsIG5vdCBiZSBpbnZva2VkIGZyb20KPiArCSAqICZkcm1fYnJpZGdlX2NoYWluX2Rpc2FibGUu IEl0IHdvdWxkIGJlIHBydWRlbnQgdG8gYWxzbyBwcm92aWRlIGFuCj4gKwkgKiBpbXBsZW1lbnRh dGlvbiBvZiBAZGlzYWJsZSBpZiB5b3UgYXJlIGV4cGVjdGluZyBkcml2ZXIgY2FsbHMgaW50bwo+ ICsJICogJmRybV9icmlkZ2VfY2hhaW5fZGlzYWJsZS4KPiAgCSAqCj4gIAkgKiBUaGUgQGF0b21p Y19kaXNhYmxlIGNhbGxiYWNrIGlzIG9wdGlvbmFsLgo+ICAJICovCj4gQEAgLTMyNSwxMCArMzI3 LDExIEBAIHN0cnVjdCBkcm1fYnJpZGdlX2Z1bmNzIHsKPiAgCSAqIGNhbGxlZC4KPiAgCSAqCj4g IAkgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgYmUgaW52b2tlZCBpbiB0aGUg Y29udGV4dCBvZiBhbgo+IC0JICogYXRvbWljIGNvbW1pdC4gSXQgd2lsbCBub3QgYmUgaW52b2tl ZCBmcm9tICZkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZS4KPiArCSAqIGF0b21pYyBjb21taXQuIEl0 IHdpbGwgbm90IGJlIGludm9rZWQgZnJvbQo+ICsJICogJmRybV9icmlkZ2VfY2hhaW5fcG9zdF9k aXNhYmxlLgo+ICAJICogSXQgd291bGQgYmUgcHJ1ZGVudCB0byBhbHNvIHByb3ZpZGUgYW4gaW1w bGVtZW50YXRpb24gb2YKPiAgCSAqIEBwb3N0X2Rpc2FibGUgaWYgeW91IGFyZSBleHBlY3Rpbmcg ZHJpdmVyIGNhbGxzIGludG8KPiAtCSAqICZkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZS4KPiArCSAq ICZkcm1fYnJpZGdlX2NoYWluX3Bvc3RfZGlzYWJsZS4KPiAgCSAqCj4gIAkgKiBUaGUgQGF0b21p Y19wb3N0X2Rpc2FibGUgY2FsbGJhY2sgaXMgb3B0aW9uYWwuCj4gIAkgKi8KPiBAQCAtNDA2LDI3 ICs0MDksMjggQEAgc3RydWN0IGRybV9icmlkZ2UgKm9mX2RybV9maW5kX2JyaWRnZShzdHJ1Y3Qg ZGV2aWNlX25vZGUgKm5wKTsKPiAgaW50IGRybV9icmlkZ2VfYXR0YWNoKHN0cnVjdCBkcm1fZW5j b2RlciAqZW5jb2Rlciwgc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiAgCQkgICAgICBzdHJ1 Y3QgZHJtX2JyaWRnZSAqcHJldmlvdXMpOwo+ICAKPiAtYm9vbCBkcm1fYnJpZGdlX21vZGVfZml4 dXAoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiAtCQkJICAgY29uc3Qgc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKm1vZGUsCj4gLQkJCSAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1 c3RlZF9tb2RlKTsKPiAtZW51bSBkcm1fbW9kZV9zdGF0dXMgZHJtX2JyaWRnZV9tb2RlX3ZhbGlk KHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gLQkJCQkJICAgY29uc3Qgc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKm1vZGUpOwo+IC12b2lkIGRybV9icmlkZ2VfZGlzYWJsZShzdHJ1Y3QgZHJt X2JyaWRnZSAqYnJpZGdlKTsKPiAtdm9pZCBkcm1fYnJpZGdlX3Bvc3RfZGlzYWJsZShzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlKTsKPiAtdm9pZCBkcm1fYnJpZGdlX21vZGVfc2V0KHN0cnVjdCBk cm1fYnJpZGdlICpicmlkZ2UsCj4gLQkJCSBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq bW9kZSwKPiAtCQkJIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2Rl KTsKPiAtdm9pZCBkcm1fYnJpZGdlX3ByZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRn ZSk7Cj4gLXZvaWQgZHJtX2JyaWRnZV9lbmFibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSk7 Cj4gK2Jvb2wgZHJtX2JyaWRnZV9jaGFpbl9tb2RlX2ZpeHVwKHN0cnVjdCBkcm1fYnJpZGdlICpi cmlkZ2UsCj4gKwkJCQkgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCj4gKwkJ CQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpOwo+ICtlbnVtIGRybV9t b2RlX3N0YXR1cwo+ICtkcm1fYnJpZGdlX2NoYWluX21vZGVfdmFsaWQoc3RydWN0IGRybV9icmlk Z2UgKmJyaWRnZSwKPiArCQkJICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2Rl KTsKPiArdm9pZCBkcm1fYnJpZGdlX2NoYWluX2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJy aWRnZSk7Cj4gK3ZvaWQgZHJtX2JyaWRnZV9jaGFpbl9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9i cmlkZ2UgKmJyaWRnZSk7Cj4gK3ZvaWQgZHJtX2JyaWRnZV9jaGFpbl9tb2RlX3NldChzdHJ1Y3Qg ZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkgICAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUsCj4gKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAq YWRqdXN0ZWRfbW9kZSk7Cj4gK3ZvaWQgZHJtX2JyaWRnZV9jaGFpbl9wcmVfZW5hYmxlKHN0cnVj dCBkcm1fYnJpZGdlICpicmlkZ2UpOwo+ICt2b2lkIGRybV9icmlkZ2VfY2hhaW5fZW5hYmxlKHN0 cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UpOwo+ICAKPiAtdm9pZCBkcm1fYXRvbWljX2JyaWRnZV9k aXNhYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gLQkJCSAgICAgICBzdHJ1Y3QgZHJt X2F0b21pY19zdGF0ZSAqc3RhdGUpOwo+IC12b2lkIGRybV9hdG9taWNfYnJpZGdlX3Bvc3RfZGlz YWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICt2b2lkIGRybV9hdG9taWNfYnJpZGdl X2NoYWluX2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiArCQkJCSAgICAgc3Ry dWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKPiArdm9pZCBkcm1fYXRvbWljX2JyaWRnZV9j aGFpbl9wb3N0X2Rpc2FibGUoc3RydWN0IGRybV9icmlkZ2UgKmJyaWRnZSwKPiArCQkJCQkgIHN0 cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7Cj4gK3ZvaWQgZHJtX2F0b21pY19icmlkZ2Vf Y2hhaW5fcHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdlLAo+ICsJCQkJCXN0cnVj dCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSk7Cj4gK3ZvaWQgZHJtX2F0b21pY19icmlkZ2VfY2hh aW5fZW5hYmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gIAkJCQkgICAgc3RydWN0IGRy bV9hdG9taWNfc3RhdGUgKnN0YXRlKTsKPiAtdm9pZCBkcm1fYXRvbWljX2JyaWRnZV9wcmVfZW5h YmxlKHN0cnVjdCBkcm1fYnJpZGdlICpicmlkZ2UsCj4gLQkJCQkgIHN0cnVjdCBkcm1fYXRvbWlj X3N0YXRlICpzdGF0ZSk7Cj4gLXZvaWQgZHJtX2F0b21pY19icmlkZ2VfZW5hYmxlKHN0cnVjdCBk cm1fYnJpZGdlICpicmlkZ2UsCj4gLQkJCSAgICAgIHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpz dGF0ZSk7Cj4gIAo+ICAjaWZkZWYgQ09ORklHX0RSTV9QQU5FTF9CUklER0UKPiAgc3RydWN0IGRy bV9icmlkZ2UgKmRybV9wYW5lbF9icmlkZ2VfYWRkKHN0cnVjdCBkcm1fcGFuZWwgKnBhbmVsKTsK Ci0tIApSZWdhcmRzLAoKTGF1cmVudCBQaW5jaGFydApfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBs aXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1h bi9saXN0aW5mby9kcmktZGV2ZWw=