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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D44A4C433FE for ; Sat, 19 Nov 2022 14:15:55 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230073AbiKSOPx (ORCPT ); Sat, 19 Nov 2022 09:15:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34214 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229689AbiKSOPw (ORCPT ); Sat, 19 Nov 2022 09:15:52 -0500 Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 52ED986FDE for ; Sat, 19 Nov 2022 06:15:51 -0800 (PST) Received: from [127.0.0.1] (p578adb1c.dip0.t-ipconnect.de [87.138.219.28]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 90E0184BD2; Sat, 19 Nov 2022 15:15:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1668867348; bh=7rx9uYnh+rj1G/UCVB8b/JfIpu6ljTHswUOoG1lLnmc=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=KHP0+nN89H9kkhl3044qB6VyyWIKWnxmUhThXyO13ab13MLHEsuapyf68GQFy4DdA 3kTVYeFEWse9cT9d6CPEXekXejYLF6gHkgAfRy1QBCE3EtwhotkNQl0iAXYJIH3QCM nS0YkEUOCt3nw/7EeHO2fq09Qe5iNrp3qNS5/L60hQUvclzcW7+Or/gLtrhs3e9+eZ 4QgagZYg813BmpsbYffONWGW1AO/5W79u7gF7gmL4Wt9EBAVDvj4tFwP116WjuXwYV AZ0rITROVQw+8Lj8AiuHFr6sL2M0ESsHiwI2XbUvin3yM4sGBvMPwHqYrzXZ9FOiSu LZlp26nz6CXwQ== Message-ID: Date: Sat, 19 Nov 2022 14:36:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH v8 06/14] drm: bridge: samsung-dsim: Handle proper DSI host initialization To: Marek Szyprowski , Jagan Teki , Andrzej Hajda , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai Cc: Matteo Lisi , dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula References: <20221110183853.3678209-1-jagan@amarulasolutions.com> <20221110183853.3678209-7-jagan@amarulasolutions.com> <04fb17e2-1b55-fbd9-d846-da3e3da4edb8@denx.de> Content-Language: en-US From: Marek Vasut In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org On 11/17/22 14:04, Marek Szyprowski wrote: > On 17.11.2022 05:58, Marek Vasut wrote: >> On 11/10/22 19:38, Jagan Teki wrote: >>> DSI host initialization handling in previous exynos dsi driver has >>> some pitfalls. It initializes the host during host transfer() hook >>> that is indeed not the desired call flow for I2C and any other DSI >>> configured downstream bridges. >>> >>> Host transfer() is usually triggered for downstream DSI panels or >>> bridges and I2C-configured-DSI bridges miss these host initialization >>> as these downstream bridges use bridge operations hooks like pre_enable, >>> and enable in order to initialize or set up the host. >>> >>> This patch is trying to handle the host init handler to satisfy all >>> downstream panels and bridges. Added the DSIM_STATE_REINITIALIZED state >>> flag to ensure that host init is also done on first cmd transfer, this >>> helps existing DSI panels work on exynos platform (form Marek >>> Szyprowski). >>> >>> v8, v7, v6, v5: >>> * none >>> >>> v4: >>> * update init handling to ensure host init done on first cmd transfer >>> >>> v3: >>> * none >>> >>> v2: >>> * check initialized state in samsung_dsim_init >>> >>> v1: >>> * keep DSI init in host transfer >>> >>> Signed-off-by: Marek Szyprowski >>> Signed-off-by: Jagan Teki >>> --- >>>   drivers/gpu/drm/bridge/samsung-dsim.c | 25 +++++++++++++++++-------- >>>   include/drm/bridge/samsung-dsim.h     |  5 +++-- >>>   2 files changed, 20 insertions(+), 10 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>> index bb1f45fd5a88..ec7e01ae02ea 100644 >>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>> @@ -1234,12 +1234,17 @@ static void samsung_dsim_disable_irq(struct >>> samsung_dsim *dsi) >>>       disable_irq(dsi->irq); >>>   } >>>   -static int samsung_dsim_init(struct samsung_dsim *dsi) >>> +static int samsung_dsim_init(struct samsung_dsim *dsi, unsigned int >>> flag) >>>   { >>>       const struct samsung_dsim_driver_data *driver_data = >>> dsi->driver_data; >>>   +    if (dsi->state & flag) >>> +        return 0; >>> + >>>       samsung_dsim_reset(dsi); >>> -    samsung_dsim_enable_irq(dsi); >>> + >>> +    if (!(dsi->state & DSIM_STATE_INITIALIZED)) >>> +        samsung_dsim_enable_irq(dsi); >>>         if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) >>>           samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); >>> @@ -1250,6 +1255,8 @@ static int samsung_dsim_init(struct >>> samsung_dsim *dsi) >>>       samsung_dsim_set_phy_ctrl(dsi); >>>       samsung_dsim_init_link(dsi); >>>   +    dsi->state |= flag; >>> + >>>       return 0; >>>   } >>>   @@ -1269,6 +1276,10 @@ static void >>> samsung_dsim_atomic_pre_enable(struct drm_bridge *bridge, >>>       } >>>         dsi->state |= DSIM_STATE_ENABLED; >>> + >>> +    ret = samsung_dsim_init(dsi, DSIM_STATE_INITIALIZED); >>> +    if (ret) >>> +        return; >>>   } >>>     static void samsung_dsim_atomic_enable(struct drm_bridge *bridge, >>> @@ -1458,12 +1469,9 @@ static ssize_t >>> samsung_dsim_host_transfer(struct mipi_dsi_host *host, >>>       if (!(dsi->state & DSIM_STATE_ENABLED)) >>>           return -EINVAL; >>>   -    if (!(dsi->state & DSIM_STATE_INITIALIZED)) { >>> -        ret = samsung_dsim_init(dsi); >>> -        if (ret) >>> -            return ret; >>> -        dsi->state |= DSIM_STATE_INITIALIZED; >>> -    } >>> +    ret = samsung_dsim_init(dsi, DSIM_STATE_REINITIALIZED); >> >> This triggers full controller reset and reprogramming upon first >> command transfer, is such heavy handed reload really necessary ? > > Yes it is, otherwise the proper DSI panels doesn't work with Exynos DRM > DSI. If this is a real issue for you, then maybe the driver could do the > initialization conditionally, in prepare() callback in case of IMX and > on the first transfer in case of Exynos? That's odd , it does actually break panel support for me, without this double reset the panel works again. But I have to wonder, why would such a full reset be necessary at all , even on the exynos ? 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 331B9C43217 for ; Sat, 19 Nov 2022 14:15:57 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id CF91310E08B; Sat, 19 Nov 2022 14:15:55 +0000 (UTC) Received: from phobos.denx.de (phobos.denx.de [85.214.62.61]) by gabe.freedesktop.org (Postfix) with ESMTPS id D834310E08B for ; Sat, 19 Nov 2022 14:15:51 +0000 (UTC) Received: from [127.0.0.1] (p578adb1c.dip0.t-ipconnect.de [87.138.219.28]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 90E0184BD2; Sat, 19 Nov 2022 15:15:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1668867348; bh=7rx9uYnh+rj1G/UCVB8b/JfIpu6ljTHswUOoG1lLnmc=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=KHP0+nN89H9kkhl3044qB6VyyWIKWnxmUhThXyO13ab13MLHEsuapyf68GQFy4DdA 3kTVYeFEWse9cT9d6CPEXekXejYLF6gHkgAfRy1QBCE3EtwhotkNQl0iAXYJIH3QCM nS0YkEUOCt3nw/7EeHO2fq09Qe5iNrp3qNS5/L60hQUvclzcW7+Or/gLtrhs3e9+eZ 4QgagZYg813BmpsbYffONWGW1AO/5W79u7gF7gmL4Wt9EBAVDvj4tFwP116WjuXwYV AZ0rITROVQw+8Lj8AiuHFr6sL2M0ESsHiwI2XbUvin3yM4sGBvMPwHqYrzXZ9FOiSu LZlp26nz6CXwQ== Message-ID: Date: Sat, 19 Nov 2022 14:36:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH v8 06/14] drm: bridge: samsung-dsim: Handle proper DSI host initialization To: Marek Szyprowski , Jagan Teki , Andrzej Hajda , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai References: <20221110183853.3678209-1-jagan@amarulasolutions.com> <20221110183853.3678209-7-jagan@amarulasolutions.com> <04fb17e2-1b55-fbd9-d846-da3e3da4edb8@denx.de> Content-Language: en-US From: Marek Vasut In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: linux-samsung-soc@vger.kernel.org, Matteo Lisi , dri-devel@lists.freedesktop.org, NXP Linux Team , linux-amarula , linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" On 11/17/22 14:04, Marek Szyprowski wrote: > On 17.11.2022 05:58, Marek Vasut wrote: >> On 11/10/22 19:38, Jagan Teki wrote: >>> DSI host initialization handling in previous exynos dsi driver has >>> some pitfalls. It initializes the host during host transfer() hook >>> that is indeed not the desired call flow for I2C and any other DSI >>> configured downstream bridges. >>> >>> Host transfer() is usually triggered for downstream DSI panels or >>> bridges and I2C-configured-DSI bridges miss these host initialization >>> as these downstream bridges use bridge operations hooks like pre_enable, >>> and enable in order to initialize or set up the host. >>> >>> This patch is trying to handle the host init handler to satisfy all >>> downstream panels and bridges. Added the DSIM_STATE_REINITIALIZED state >>> flag to ensure that host init is also done on first cmd transfer, this >>> helps existing DSI panels work on exynos platform (form Marek >>> Szyprowski). >>> >>> v8, v7, v6, v5: >>> * none >>> >>> v4: >>> * update init handling to ensure host init done on first cmd transfer >>> >>> v3: >>> * none >>> >>> v2: >>> * check initialized state in samsung_dsim_init >>> >>> v1: >>> * keep DSI init in host transfer >>> >>> Signed-off-by: Marek Szyprowski >>> Signed-off-by: Jagan Teki >>> --- >>>   drivers/gpu/drm/bridge/samsung-dsim.c | 25 +++++++++++++++++-------- >>>   include/drm/bridge/samsung-dsim.h     |  5 +++-- >>>   2 files changed, 20 insertions(+), 10 deletions(-) >>> >>> diff --git a/drivers/gpu/drm/bridge/samsung-dsim.c >>> b/drivers/gpu/drm/bridge/samsung-dsim.c >>> index bb1f45fd5a88..ec7e01ae02ea 100644 >>> --- a/drivers/gpu/drm/bridge/samsung-dsim.c >>> +++ b/drivers/gpu/drm/bridge/samsung-dsim.c >>> @@ -1234,12 +1234,17 @@ static void samsung_dsim_disable_irq(struct >>> samsung_dsim *dsi) >>>       disable_irq(dsi->irq); >>>   } >>>   -static int samsung_dsim_init(struct samsung_dsim *dsi) >>> +static int samsung_dsim_init(struct samsung_dsim *dsi, unsigned int >>> flag) >>>   { >>>       const struct samsung_dsim_driver_data *driver_data = >>> dsi->driver_data; >>>   +    if (dsi->state & flag) >>> +        return 0; >>> + >>>       samsung_dsim_reset(dsi); >>> -    samsung_dsim_enable_irq(dsi); >>> + >>> +    if (!(dsi->state & DSIM_STATE_INITIALIZED)) >>> +        samsung_dsim_enable_irq(dsi); >>>         if (driver_data->reg_values[RESET_TYPE] == DSIM_FUNCRST) >>>           samsung_dsim_enable_lane(dsi, BIT(dsi->lanes) - 1); >>> @@ -1250,6 +1255,8 @@ static int samsung_dsim_init(struct >>> samsung_dsim *dsi) >>>       samsung_dsim_set_phy_ctrl(dsi); >>>       samsung_dsim_init_link(dsi); >>>   +    dsi->state |= flag; >>> + >>>       return 0; >>>   } >>>   @@ -1269,6 +1276,10 @@ static void >>> samsung_dsim_atomic_pre_enable(struct drm_bridge *bridge, >>>       } >>>         dsi->state |= DSIM_STATE_ENABLED; >>> + >>> +    ret = samsung_dsim_init(dsi, DSIM_STATE_INITIALIZED); >>> +    if (ret) >>> +        return; >>>   } >>>     static void samsung_dsim_atomic_enable(struct drm_bridge *bridge, >>> @@ -1458,12 +1469,9 @@ static ssize_t >>> samsung_dsim_host_transfer(struct mipi_dsi_host *host, >>>       if (!(dsi->state & DSIM_STATE_ENABLED)) >>>           return -EINVAL; >>>   -    if (!(dsi->state & DSIM_STATE_INITIALIZED)) { >>> -        ret = samsung_dsim_init(dsi); >>> -        if (ret) >>> -            return ret; >>> -        dsi->state |= DSIM_STATE_INITIALIZED; >>> -    } >>> +    ret = samsung_dsim_init(dsi, DSIM_STATE_REINITIALIZED); >> >> This triggers full controller reset and reprogramming upon first >> command transfer, is such heavy handed reload really necessary ? > > Yes it is, otherwise the proper DSI panels doesn't work with Exynos DRM > DSI. If this is a real issue for you, then maybe the driver could do the > initialization conditionally, in prepare() callback in case of IMX and > on the first transfer in case of Exynos? That's odd , it does actually break panel support for me, without this double reset the panel works again. But I have to wonder, why would such a full reset be necessary at all , even on the exynos ? 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E96BDC433FE for ; Sat, 19 Nov 2022 14:17:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To:Subject: MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0ssWvfLl/9nuH6fuoIBx5mS0ydQTa+eTKLkZ6dzWyc0=; b=18K1tT9MnLsdh/ P4Awr+zjcDaiZgS4Fk61LSAKv4ZO2Wverxp9Xc1KvWctcEobsMnBFHA59seBIDFAmw2OdO8K90wpF RGjMisturfiMxIgcmiDkd8cUCBIIqZ5Jki4SQ+Cgtxg9CrB2z9i9cZ7Sz8Zq/vMCNjGT0DYRe2Yo0 SRKOyNb1MNRY2nmeIHJKF4/qiR1irheLCQCZ7TIAFOdGa7HGyHUfnyBfbxqvorpwLaMO+2IF3seKq ioscp9B/kqFtZEIB+kwVu92jOLbIUvUIgCWmA+XHojLrkwUOX0qQIL2Cv8irLFquZLjDVMVTRr+QJ pmYxFVWctPOlVge+RB5w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1owOdR-00E7Ho-OG; Sat, 19 Nov 2022 14:15:57 +0000 Received: from phobos.denx.de ([85.214.62.61]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1owOdO-00E79W-At for linux-arm-kernel@lists.infradead.org; Sat, 19 Nov 2022 14:15:56 +0000 Received: from [127.0.0.1] (p578adb1c.dip0.t-ipconnect.de [87.138.219.28]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: marex@denx.de) by phobos.denx.de (Postfix) with ESMTPSA id 90E0184BD2; Sat, 19 Nov 2022 15:15:44 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1668867348; bh=7rx9uYnh+rj1G/UCVB8b/JfIpu6ljTHswUOoG1lLnmc=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=KHP0+nN89H9kkhl3044qB6VyyWIKWnxmUhThXyO13ab13MLHEsuapyf68GQFy4DdA 3kTVYeFEWse9cT9d6CPEXekXejYLF6gHkgAfRy1QBCE3EtwhotkNQl0iAXYJIH3QCM nS0YkEUOCt3nw/7EeHO2fq09Qe5iNrp3qNS5/L60hQUvclzcW7+Or/gLtrhs3e9+eZ 4QgagZYg813BmpsbYffONWGW1AO/5W79u7gF7gmL4Wt9EBAVDvj4tFwP116WjuXwYV AZ0rITROVQw+8Lj8AiuHFr6sL2M0ESsHiwI2XbUvin3yM4sGBvMPwHqYrzXZ9FOiSu LZlp26nz6CXwQ== Message-ID: Date: Sat, 19 Nov 2022 14:36:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.4.1 Subject: Re: [PATCH v8 06/14] drm: bridge: samsung-dsim: Handle proper DSI host initialization To: Marek Szyprowski , Jagan Teki , Andrzej Hajda , Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , Frieder Schrempf , Fancy Fang , Tim Harvey , Michael Nazzareno Trimarchi , Adam Ford , Neil Armstrong , Robert Foss , Laurent Pinchart , Tommaso Merciai Cc: Matteo Lisi , dri-devel@lists.freedesktop.org, linux-samsung-soc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, NXP Linux Team , linux-amarula References: <20221110183853.3678209-1-jagan@amarulasolutions.com> <20221110183853.3678209-7-jagan@amarulasolutions.com> <04fb17e2-1b55-fbd9-d846-da3e3da4edb8@denx.de> Content-Language: en-US From: Marek Vasut In-Reply-To: X-Virus-Scanned: clamav-milter 0.103.6 at phobos.denx.de X-Virus-Status: Clean X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221119_061554_800742_1181577B X-CRM114-Status: GOOD ( 21.83 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMTEvMTcvMjIgMTQ6MDQsIE1hcmVrIFN6eXByb3dza2kgd3JvdGU6Cj4gT24gMTcuMTEuMjAy MiAwNTo1OCwgTWFyZWsgVmFzdXQgd3JvdGU6Cj4+IE9uIDExLzEwLzIyIDE5OjM4LCBKYWdhbiBU ZWtpIHdyb3RlOgo+Pj4gRFNJIGhvc3QgaW5pdGlhbGl6YXRpb24gaGFuZGxpbmcgaW4gcHJldmlv dXMgZXh5bm9zIGRzaSBkcml2ZXIgaGFzCj4+PiBzb21lIHBpdGZhbGxzLiBJdCBpbml0aWFsaXpl cyB0aGUgaG9zdCBkdXJpbmcgaG9zdCB0cmFuc2ZlcigpIGhvb2sKPj4+IHRoYXQgaXMgaW5kZWVk IG5vdCB0aGUgZGVzaXJlZCBjYWxsIGZsb3cgZm9yIEkyQyBhbmQgYW55IG90aGVyIERTSQo+Pj4g Y29uZmlndXJlZCBkb3duc3RyZWFtIGJyaWRnZXMuCj4+Pgo+Pj4gSG9zdCB0cmFuc2ZlcigpIGlz IHVzdWFsbHkgdHJpZ2dlcmVkIGZvciBkb3duc3RyZWFtIERTSSBwYW5lbHMgb3IKPj4+IGJyaWRn ZXMgYW5kIEkyQy1jb25maWd1cmVkLURTSSBicmlkZ2VzIG1pc3MgdGhlc2UgaG9zdCBpbml0aWFs aXphdGlvbgo+Pj4gYXMgdGhlc2UgZG93bnN0cmVhbSBicmlkZ2VzIHVzZSBicmlkZ2Ugb3BlcmF0 aW9ucyBob29rcyBsaWtlIHByZV9lbmFibGUsCj4+PiBhbmQgZW5hYmxlIGluIG9yZGVyIHRvIGlu aXRpYWxpemUgb3Igc2V0IHVwIHRoZSBob3N0Lgo+Pj4KPj4+IFRoaXMgcGF0Y2ggaXMgdHJ5aW5n IHRvIGhhbmRsZSB0aGUgaG9zdCBpbml0IGhhbmRsZXIgdG8gc2F0aXNmeSBhbGwKPj4+IGRvd25z dHJlYW0gcGFuZWxzIGFuZCBicmlkZ2VzLiBBZGRlZCB0aGUgRFNJTV9TVEFURV9SRUlOSVRJQUxJ WkVEIHN0YXRlCj4+PiBmbGFnIHRvIGVuc3VyZSB0aGF0IGhvc3QgaW5pdCBpcyBhbHNvIGRvbmUg b24gZmlyc3QgY21kIHRyYW5zZmVyLCB0aGlzCj4+PiBoZWxwcyBleGlzdGluZyBEU0kgcGFuZWxz IHdvcmsgb24gZXh5bm9zIHBsYXRmb3JtIChmb3JtIE1hcmVrCj4+PiBTenlwcm93c2tpKS4KPj4+ Cj4+PiB2OCwgdjcsIHY2LCB2NToKPj4+ICogbm9uZQo+Pj4KPj4+IHY0Ogo+Pj4gKiB1cGRhdGUg aW5pdCBoYW5kbGluZyB0byBlbnN1cmUgaG9zdCBpbml0IGRvbmUgb24gZmlyc3QgY21kIHRyYW5z ZmVyCj4+Pgo+Pj4gdjM6Cj4+PiAqIG5vbmUKPj4+Cj4+PiB2MjoKPj4+ICogY2hlY2sgaW5pdGlh bGl6ZWQgc3RhdGUgaW4gc2Ftc3VuZ19kc2ltX2luaXQKPj4+Cj4+PiB2MToKPj4+ICoga2VlcCBE U0kgaW5pdCBpbiBob3N0IHRyYW5zZmVyCj4+Pgo+Pj4gU2lnbmVkLW9mZi1ieTogTWFyZWsgU3p5 cHJvd3NraSA8bS5zenlwcm93c2tpQHNhbXN1bmcuY29tPgo+Pj4gU2lnbmVkLW9mZi1ieTogSmFn YW4gVGVraSA8amFnYW5AYW1hcnVsYXNvbHV0aW9ucy5jb20+Cj4+PiAtLS0KPj4+ICDCoCBkcml2 ZXJzL2dwdS9kcm0vYnJpZGdlL3NhbXN1bmctZHNpbS5jIHwgMjUgKysrKysrKysrKysrKysrKyst LS0tLS0tLQo+Pj4gIMKgIGluY2x1ZGUvZHJtL2JyaWRnZS9zYW1zdW5nLWRzaW0uaMKgwqDCoMKg IHzCoCA1ICsrKy0tCj4+PiAgwqAgMiBmaWxlcyBjaGFuZ2VkLCAyMCBpbnNlcnRpb25zKCspLCAx MCBkZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2JyaWRn ZS9zYW1zdW5nLWRzaW0uYwo+Pj4gYi9kcml2ZXJzL2dwdS9kcm0vYnJpZGdlL3NhbXN1bmctZHNp bS5jCj4+PiBpbmRleCBiYjFmNDVmZDVhODguLmVjN2UwMWFlMDJlYSAxMDA2NDQKPj4+IC0tLSBh L2RyaXZlcnMvZ3B1L2RybS9icmlkZ2Uvc2Ftc3VuZy1kc2ltLmMKPj4+ICsrKyBiL2RyaXZlcnMv Z3B1L2RybS9icmlkZ2Uvc2Ftc3VuZy1kc2ltLmMKPj4+IEBAIC0xMjM0LDEyICsxMjM0LDE3IEBA IHN0YXRpYyB2b2lkIHNhbXN1bmdfZHNpbV9kaXNhYmxlX2lycShzdHJ1Y3QKPj4+IHNhbXN1bmdf ZHNpbSAqZHNpKQo+Pj4gIMKgwqDCoMKgwqAgZGlzYWJsZV9pcnEoZHNpLT5pcnEpOwo+Pj4gIMKg IH0KPj4+ICDCoCAtc3RhdGljIGludCBzYW1zdW5nX2RzaW1faW5pdChzdHJ1Y3Qgc2Ftc3VuZ19k c2ltICpkc2kpCj4+PiArc3RhdGljIGludCBzYW1zdW5nX2RzaW1faW5pdChzdHJ1Y3Qgc2Ftc3Vu Z19kc2ltICpkc2ksIHVuc2lnbmVkIGludAo+Pj4gZmxhZykKPj4+ICDCoCB7Cj4+PiAgwqDCoMKg wqDCoCBjb25zdCBzdHJ1Y3Qgc2Ftc3VuZ19kc2ltX2RyaXZlcl9kYXRhICpkcml2ZXJfZGF0YSA9 Cj4+PiBkc2ktPmRyaXZlcl9kYXRhOwo+Pj4gIMKgICvCoMKgwqAgaWYgKGRzaS0+c3RhdGUgJiBm bGFnKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+Pj4gKwo+Pj4gIMKgwqDCoMKgwqAg c2Ftc3VuZ19kc2ltX3Jlc2V0KGRzaSk7Cj4+PiAtwqDCoMKgIHNhbXN1bmdfZHNpbV9lbmFibGVf aXJxKGRzaSk7Cj4+PiArCj4+PiArwqDCoMKgIGlmICghKGRzaS0+c3RhdGUgJiBEU0lNX1NUQVRF X0lOSVRJQUxJWkVEKSkKPj4+ICvCoMKgwqDCoMKgwqDCoCBzYW1zdW5nX2RzaW1fZW5hYmxlX2ly cShkc2kpOwo+Pj4gIMKgIMKgwqDCoMKgwqAgaWYgKGRyaXZlcl9kYXRhLT5yZWdfdmFsdWVzW1JF U0VUX1RZUEVdID09IERTSU1fRlVOQ1JTVCkKPj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgc2Ftc3Vu Z19kc2ltX2VuYWJsZV9sYW5lKGRzaSwgQklUKGRzaS0+bGFuZXMpIC0gMSk7Cj4+PiBAQCAtMTI1 MCw2ICsxMjU1LDggQEAgc3RhdGljIGludCBzYW1zdW5nX2RzaW1faW5pdChzdHJ1Y3QKPj4+IHNh bXN1bmdfZHNpbSAqZHNpKQo+Pj4gIMKgwqDCoMKgwqAgc2Ftc3VuZ19kc2ltX3NldF9waHlfY3Ry bChkc2kpOwo+Pj4gIMKgwqDCoMKgwqAgc2Ftc3VuZ19kc2ltX2luaXRfbGluayhkc2kpOwo+Pj4g IMKgICvCoMKgwqAgZHNpLT5zdGF0ZSB8PSBmbGFnOwo+Pj4gKwo+Pj4gIMKgwqDCoMKgwqAgcmV0 dXJuIDA7Cj4+PiAgwqAgfQo+Pj4gIMKgIEBAIC0xMjY5LDYgKzEyNzYsMTAgQEAgc3RhdGljIHZv aWQKPj4+IHNhbXN1bmdfZHNpbV9hdG9taWNfcHJlX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAq YnJpZGdlLAo+Pj4gIMKgwqDCoMKgwqAgfQo+Pj4gIMKgIMKgwqDCoMKgwqAgZHNpLT5zdGF0ZSB8 PSBEU0lNX1NUQVRFX0VOQUJMRUQ7Cj4+PiArCj4+PiArwqDCoMKgIHJldCA9IHNhbXN1bmdfZHNp bV9pbml0KGRzaSwgRFNJTV9TVEFURV9JTklUSUFMSVpFRCk7Cj4+PiArwqDCoMKgIGlmIChyZXQp Cj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+Pj4gIMKgIH0KPj4+ICDCoCDCoCBzdGF0aWMg dm9pZCBzYW1zdW5nX2RzaW1fYXRvbWljX2VuYWJsZShzdHJ1Y3QgZHJtX2JyaWRnZSAqYnJpZGdl LAo+Pj4gQEAgLTE0NTgsMTIgKzE0NjksOSBAQCBzdGF0aWMgc3NpemVfdAo+Pj4gc2Ftc3VuZ19k c2ltX2hvc3RfdHJhbnNmZXIoc3RydWN0IG1pcGlfZHNpX2hvc3QgKmhvc3QsCj4+PiAgwqDCoMKg wqDCoCBpZiAoIShkc2ktPnN0YXRlICYgRFNJTV9TVEFURV9FTkFCTEVEKSkKPj4+ICDCoMKgwqDC oMKgwqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4+PiAgwqAgLcKgwqDCoCBpZiAoIShkc2ktPnN0 YXRlICYgRFNJTV9TVEFURV9JTklUSUFMSVpFRCkpIHsKPj4+IC3CoMKgwqDCoMKgwqDCoCByZXQg PSBzYW1zdW5nX2RzaW1faW5pdChkc2kpOwo+Pj4gLcKgwqDCoMKgwqDCoMKgIGlmIChyZXQpCj4+ PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+Pj4gLcKgwqDCoMKgwqDCoMKg IGRzaS0+c3RhdGUgfD0gRFNJTV9TVEFURV9JTklUSUFMSVpFRDsKPj4+IC3CoMKgwqAgfQo+Pj4g K8KgwqDCoCByZXQgPSBzYW1zdW5nX2RzaW1faW5pdChkc2ksIERTSU1fU1RBVEVfUkVJTklUSUFM SVpFRCk7Cj4+Cj4+IFRoaXMgdHJpZ2dlcnMgZnVsbCBjb250cm9sbGVyIHJlc2V0IGFuZCByZXBy b2dyYW1taW5nIHVwb24gZmlyc3QKPj4gY29tbWFuZCB0cmFuc2ZlciwgaXMgc3VjaCBoZWF2eSBo YW5kZWQgcmVsb2FkIHJlYWxseSBuZWNlc3NhcnkgPwo+IAo+IFllcyBpdCBpcywgb3RoZXJ3aXNl IHRoZSBwcm9wZXIgRFNJIHBhbmVscyBkb2Vzbid0IHdvcmsgd2l0aCBFeHlub3MgRFJNCj4gRFNJ LiBJZiB0aGlzIGlzIGEgcmVhbCBpc3N1ZSBmb3IgeW91LCB0aGVuIG1heWJlIHRoZSBkcml2ZXIg Y291bGQgZG8gdGhlCj4gaW5pdGlhbGl6YXRpb24gY29uZGl0aW9uYWxseSwgaW4gcHJlcGFyZSgp IGNhbGxiYWNrIGluIGNhc2Ugb2YgSU1YIGFuZAo+IG9uIHRoZSBmaXJzdCB0cmFuc2ZlciBpbiBj YXNlIG9mIEV4eW5vcz8KClRoYXQncyBvZGQgLCBpdCBkb2VzIGFjdHVhbGx5IGJyZWFrIHBhbmVs IHN1cHBvcnQgZm9yIG1lLCB3aXRob3V0IHRoaXMgCmRvdWJsZSByZXNldCB0aGUgcGFuZWwgd29y a3MgYWdhaW4uIEJ1dCBJIGhhdmUgdG8gd29uZGVyLCB3aHkgd291bGQgc3VjaCAKYSBmdWxsIHJl c2V0IGJlIG5lY2Vzc2FyeSBhdCBhbGwgLCBldmVuIG9uIHRoZSBleHlub3MgPwoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBt YWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=