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 CB552EB64D9 for ; Mon, 10 Jul 2023 07:38:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231230AbjGJHim (ORCPT ); Mon, 10 Jul 2023 03:38:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43312 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229834AbjGJHii (ORCPT ); Mon, 10 Jul 2023 03:38:38 -0400 Received: from madras.collabora.co.uk (madras.collabora.co.uk [IPv6:2a00:1098:0:82:1000:25:2eeb:e5ab]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C5D0F95 for ; Mon, 10 Jul 2023 00:38:36 -0700 (PDT) Received: from [192.168.1.100] (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by madras.collabora.co.uk (Postfix) with ESMTPSA id B81236606FF3; Mon, 10 Jul 2023 08:38:34 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1688974715; bh=LOXc+6Sqq2SjuM4ZCBO1k8rnrrk3ScMPXrSUxS0CCuE=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=iNE1sJ53UJG7JThYzk3vZyGbX3LodamTt5AcFLXPDLZtowxiXEgaeH4JdralBhJPp XugpSEzAqLSOrwg3ORcljgb8vJIk90v8Pc7pny3Z0E6w55h+DHac3pDQbTh70+JZ5f si2VcCK0bzBONTIAsWq2tN3LQPXdQ+6bRbxfjIZIpMHBhMTYE9XoTwqJ5utxJsw0v2 7E8FwkkufVJatjHiJnJ7F8dILMLB8aw4NA7N70ryufi4hprpNePY9XT3k1Kzc8ynmr 7aI38MKT9IwbuZnla3AwTW5IIK1+OboP8oUG6XXSSX8NvjFdlCzSm3413bLNWRwo7x zuJ6z1l/ljQEQ== Message-ID: Date: Mon, 10 Jul 2023 09:38:31 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v4 0/9] MediaTek DisplayPort: support eDP and aux-bus To: Chen-Yu Tsai Cc: chunkuang.hu@kernel.org, p.zabel@pengutronix.de, airlied@gmail.com, daniel@ffwll.ch, matthias.bgg@gmail.com, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, nfraprado@collabora.com References: <20230706123025.208408-1-angelogioacchino.delregno@collabora.com> Content-Language: en-US From: AngeloGioacchino Del Regno In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Il 07/07/23 10:23, Chen-Yu Tsai ha scritto: > On Thu, Jul 6, 2023 at 8:30 PM AngeloGioacchino Del Regno > wrote: >> >> Changes in v4: >> - Set data lanes to idle to prevent stalls if bootloader didn't >> properly close the eDP port >> - Now using the .done_probing() callback for AUX bus to prevent >> probe deferral loops in case the panel-edp driver is a module >> as previously seen with another bridge driver (ANX7625) on >> some other SoCs (MT8192 and others) >> - Rebased over next-20230706 >> - Dropped Chen-Yu's T-b tag on last patch as some logic changed >> (before, I wasn't using the .done_probing() callback). >> >> Changes in v3: >> - Added DPTX AUX block initialization before trying to communicate >> to stop relying on the bootloader keeping it initialized before >> booting Linux. >> - Fixed commit description for patch [09/09] and removed commented >> out code (that slipped from dev phase.. sorry!). >> >> This series adds "real" support for eDP in the mtk-dp DisplayPort driver. >> >> Explaining the "real": >> Before this change, the DisplayPort driver did support eDP to some >> extent, but it was treating it entirely like a regular DP interface >> which is partially fine, after all, embedded DisplayPort *is* actually >> DisplayPort, but there might be some differences to account for... and >> this is for both small performance improvements and, more importantly, >> for correct functionality in some systems. >> >> Functionality first: >> >> One of the common differences found in various boards implementing eDP >> and machines using an eDP panel is that many times the HPD line is not >> connected. This *must* be accounted for: at startup, this specific IP >> will raise a HPD interrupt (which should maybe be ignored... as it does >> not appear to be a "real" event...) that will make the eDP panel to be >> detected and to actually work but, after a suspend-resume cycle, there >> will be no HPD interrupt (as there's no HPD line in my case!) producing >> a functionality issue - specifically, the DP Link Training fails because >> the panel doesn't get powered up, then it stays black and won't work >> until rebooting the machine (or removing and reinserting the module I >> think, but I haven't tried that). >> >> Now for.. both: >> eDP panels are *e*DP because they are *not* removable (in the sense that >> you can't unplug the cable without disassembling the machine, in which >> case, the machine shall be powered down..!): this (correct) assumption >> makes us able to solve some issues and to also gain a little performance >> during PM operations. >> >> What was done here is: >> - Caching the EDID if the panel is eDP: we're always going to read the >> same data everytime, so we can just cache that (as it's small enough) >> shortening PM resume times for the eDP driver instance; >> - Always return connector_status_connected if it's eDP: non-removable >> means connector_status_disconnected can't happen during runtime... >> this also saves us some time and even power, as we won't have to >> perform yet another power cycle of the HW; >> - Added aux-bus support! >> This makes us able to rely on panel autodetection from the EDID, >> avoiding to add more and more panel timings to panel-edp and, even >> better, allowing to use one panel node in devicetrees for multiple >> variants of the same machine since, at that point, it's not important >> to "preventively know" what panel we have (eh, it's autodetected...!). >> >> This was tested on a MT8195 Cherry Tomato Chromebook (panel-edp on aux-bus) > > Do you have panel-edp built as a module? If I have it built in, the panel > can correctly display stuff. If I have it built as a module, the panel is > correctly detected, but the panel stays black even if DRM thinks it is > displaying stuff. > I tested both. I'll recheck on a clean tree just to be sure... > And it looks like EDID reading and panel power sequencing is still not > working correctly, i.e. needs regulator-always-on? Yeah that's still needed with this version, I'm still trying to get *at least* some support upstreamed before refining it. Cheers, Angelo > > ChenYu > >> P.S.: For your own testing commodity, here's a reference devicetree: >> &edp_tx { >> status = "okay"; >> >> pinctrl-names = "default"; >> pinctrl-0 = <&edptx_pins_default>; >> >> ports { >> #address-cells = <1>; >> #size-cells = <0>; >> >> port@0 { >> reg = <0>; >> edp_in: endpoint { >> remote-endpoint = <&dp_intf0_out>; >> }; >> }; >> >> port@1 { >> reg = <1>; >> edp_out: endpoint { >> data-lanes = <0 1 2 3>; >> remote-endpoint = <&panel_in>; >> }; >> }; >> }; >> >> aux-bus { >> panel: panel { >> compatible = "edp-panel"; >> power-supply = <&pp3300_disp_x>; >> backlight = <&backlight_lcd0>; >> port { >> panel_in: endpoint { >> remote-endpoint = <&edp_out>; >> }; >> }; >> }; >> }; >> }; >> >> >> AngeloGioacchino Del Regno (9): >> drm/mediatek: dp: Cache EDID for eDP panel >> drm/mediatek: dp: Move AUX and panel poweron/off sequence to function >> drm/mediatek: dp: Always return connected status for eDP in .detect() >> drm/mediatek: dp: Always set cable_plugged_in at resume for eDP panel >> drm/mediatek: dp: Change logging to dev for mtk_dp_aux_transfer() >> drm/mediatek: dp: Enable event interrupt only when bridge attached >> drm/mediatek: dp: Use devm variant of drm_bridge_add() >> drm/mediatek: dp: Move AUX_P0 setting to >> mtk_dp_initialize_aux_settings() >> drm/mediatek: dp: Add support for embedded DisplayPort aux-bus >> >> drivers/gpu/drm/mediatek/mtk_dp.c | 197 +++++++++++++++++++----------- >> 1 file changed, 127 insertions(+), 70 deletions(-) >> >> -- >> 2.40.1 >> 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 6107AEB64DA for ; Mon, 10 Jul 2023 07:38:41 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5DB0C10E1FC; Mon, 10 Jul 2023 07:38:40 +0000 (UTC) Received: from madras.collabora.co.uk (madras.collabora.co.uk [46.235.227.172]) by gabe.freedesktop.org (Postfix) with ESMTPS id 30CAE10E1FC for ; Mon, 10 Jul 2023 07:38:38 +0000 (UTC) Received: from [192.168.1.100] (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by madras.collabora.co.uk (Postfix) with ESMTPSA id B81236606FF3; Mon, 10 Jul 2023 08:38:34 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1688974715; bh=LOXc+6Sqq2SjuM4ZCBO1k8rnrrk3ScMPXrSUxS0CCuE=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=iNE1sJ53UJG7JThYzk3vZyGbX3LodamTt5AcFLXPDLZtowxiXEgaeH4JdralBhJPp XugpSEzAqLSOrwg3ORcljgb8vJIk90v8Pc7pny3Z0E6w55h+DHac3pDQbTh70+JZ5f si2VcCK0bzBONTIAsWq2tN3LQPXdQ+6bRbxfjIZIpMHBhMTYE9XoTwqJ5utxJsw0v2 7E8FwkkufVJatjHiJnJ7F8dILMLB8aw4NA7N70ryufi4hprpNePY9XT3k1Kzc8ynmr 7aI38MKT9IwbuZnla3AwTW5IIK1+OboP8oUG6XXSSX8NvjFdlCzSm3413bLNWRwo7x zuJ6z1l/ljQEQ== Message-ID: Date: Mon, 10 Jul 2023 09:38:31 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v4 0/9] MediaTek DisplayPort: support eDP and aux-bus To: Chen-Yu Tsai References: <20230706123025.208408-1-angelogioacchino.delregno@collabora.com> Content-Language: en-US From: AngeloGioacchino Del Regno In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 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: chunkuang.hu@kernel.org, nfraprado@collabora.com, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, matthias.bgg@gmail.com, kernel@collabora.com, linux-arm-kernel@lists.infradead.org Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Il 07/07/23 10:23, Chen-Yu Tsai ha scritto: > On Thu, Jul 6, 2023 at 8:30 PM AngeloGioacchino Del Regno > wrote: >> >> Changes in v4: >> - Set data lanes to idle to prevent stalls if bootloader didn't >> properly close the eDP port >> - Now using the .done_probing() callback for AUX bus to prevent >> probe deferral loops in case the panel-edp driver is a module >> as previously seen with another bridge driver (ANX7625) on >> some other SoCs (MT8192 and others) >> - Rebased over next-20230706 >> - Dropped Chen-Yu's T-b tag on last patch as some logic changed >> (before, I wasn't using the .done_probing() callback). >> >> Changes in v3: >> - Added DPTX AUX block initialization before trying to communicate >> to stop relying on the bootloader keeping it initialized before >> booting Linux. >> - Fixed commit description for patch [09/09] and removed commented >> out code (that slipped from dev phase.. sorry!). >> >> This series adds "real" support for eDP in the mtk-dp DisplayPort driver. >> >> Explaining the "real": >> Before this change, the DisplayPort driver did support eDP to some >> extent, but it was treating it entirely like a regular DP interface >> which is partially fine, after all, embedded DisplayPort *is* actually >> DisplayPort, but there might be some differences to account for... and >> this is for both small performance improvements and, more importantly, >> for correct functionality in some systems. >> >> Functionality first: >> >> One of the common differences found in various boards implementing eDP >> and machines using an eDP panel is that many times the HPD line is not >> connected. This *must* be accounted for: at startup, this specific IP >> will raise a HPD interrupt (which should maybe be ignored... as it does >> not appear to be a "real" event...) that will make the eDP panel to be >> detected and to actually work but, after a suspend-resume cycle, there >> will be no HPD interrupt (as there's no HPD line in my case!) producing >> a functionality issue - specifically, the DP Link Training fails because >> the panel doesn't get powered up, then it stays black and won't work >> until rebooting the machine (or removing and reinserting the module I >> think, but I haven't tried that). >> >> Now for.. both: >> eDP panels are *e*DP because they are *not* removable (in the sense that >> you can't unplug the cable without disassembling the machine, in which >> case, the machine shall be powered down..!): this (correct) assumption >> makes us able to solve some issues and to also gain a little performance >> during PM operations. >> >> What was done here is: >> - Caching the EDID if the panel is eDP: we're always going to read the >> same data everytime, so we can just cache that (as it's small enough) >> shortening PM resume times for the eDP driver instance; >> - Always return connector_status_connected if it's eDP: non-removable >> means connector_status_disconnected can't happen during runtime... >> this also saves us some time and even power, as we won't have to >> perform yet another power cycle of the HW; >> - Added aux-bus support! >> This makes us able to rely on panel autodetection from the EDID, >> avoiding to add more and more panel timings to panel-edp and, even >> better, allowing to use one panel node in devicetrees for multiple >> variants of the same machine since, at that point, it's not important >> to "preventively know" what panel we have (eh, it's autodetected...!). >> >> This was tested on a MT8195 Cherry Tomato Chromebook (panel-edp on aux-bus) > > Do you have panel-edp built as a module? If I have it built in, the panel > can correctly display stuff. If I have it built as a module, the panel is > correctly detected, but the panel stays black even if DRM thinks it is > displaying stuff. > I tested both. I'll recheck on a clean tree just to be sure... > And it looks like EDID reading and panel power sequencing is still not > working correctly, i.e. needs regulator-always-on? Yeah that's still needed with this version, I'm still trying to get *at least* some support upstreamed before refining it. Cheers, Angelo > > ChenYu > >> P.S.: For your own testing commodity, here's a reference devicetree: >> &edp_tx { >> status = "okay"; >> >> pinctrl-names = "default"; >> pinctrl-0 = <&edptx_pins_default>; >> >> ports { >> #address-cells = <1>; >> #size-cells = <0>; >> >> port@0 { >> reg = <0>; >> edp_in: endpoint { >> remote-endpoint = <&dp_intf0_out>; >> }; >> }; >> >> port@1 { >> reg = <1>; >> edp_out: endpoint { >> data-lanes = <0 1 2 3>; >> remote-endpoint = <&panel_in>; >> }; >> }; >> }; >> >> aux-bus { >> panel: panel { >> compatible = "edp-panel"; >> power-supply = <&pp3300_disp_x>; >> backlight = <&backlight_lcd0>; >> port { >> panel_in: endpoint { >> remote-endpoint = <&edp_out>; >> }; >> }; >> }; >> }; >> }; >> >> >> AngeloGioacchino Del Regno (9): >> drm/mediatek: dp: Cache EDID for eDP panel >> drm/mediatek: dp: Move AUX and panel poweron/off sequence to function >> drm/mediatek: dp: Always return connected status for eDP in .detect() >> drm/mediatek: dp: Always set cable_plugged_in at resume for eDP panel >> drm/mediatek: dp: Change logging to dev for mtk_dp_aux_transfer() >> drm/mediatek: dp: Enable event interrupt only when bridge attached >> drm/mediatek: dp: Use devm variant of drm_bridge_add() >> drm/mediatek: dp: Move AUX_P0 setting to >> mtk_dp_initialize_aux_settings() >> drm/mediatek: dp: Add support for embedded DisplayPort aux-bus >> >> drivers/gpu/drm/mediatek/mtk_dp.c | 197 +++++++++++++++++++----------- >> 1 file changed, 127 insertions(+), 70 deletions(-) >> >> -- >> 2.40.1 >> 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 9D511EB64D9 for ; Mon, 10 Jul 2023 07:39:12 +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=ZtkyBvJorxiGByWwHCFzJ5FB2wnPEQeB6FsrfUlH+m0=; b=HkM6g6itxvMLJx r1YalEYBj7r+Iyz3XNo7CcW/SivSX2gvhYT2zyVlB5rKNTJyvMhYhz9XsxVHrzSU9EWLGKKcPAlYE p1alMesFyI1aLzo/fwGAaARzShoidwHu1XS2v5hX8zQI80b0lL9nGyC5HxemXrLJZ/kNtRALPA5Dd Xad5e6BomJV3JkRJ1k54PnESWeWh+A3GyVySJhM1VP5T+xBvDiCt/egv5AkcuVpU21C+FemJucOpx eAGucv5ENfnT+VUyzFxNBQeOHReF63jlX4BEq2i3pl+jm/a4BSTJUakXKAKY+C3QOjjTzh6Pn7IVV BG/0FdoI7chOtnAA1oCw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qIlTo-00AilI-2f; Mon, 10 Jul 2023 07:38:44 +0000 Received: from madras.collabora.co.uk ([2a00:1098:0:82:1000:25:2eeb:e5ab]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qIlTk-00Aiiu-2M; Mon, 10 Jul 2023 07:38:42 +0000 Received: from [192.168.1.100] (2-237-20-237.ip236.fastwebnet.it [2.237.20.237]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: kholk11) by madras.collabora.co.uk (Postfix) with ESMTPSA id B81236606FF3; Mon, 10 Jul 2023 08:38:34 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1688974715; bh=LOXc+6Sqq2SjuM4ZCBO1k8rnrrk3ScMPXrSUxS0CCuE=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=iNE1sJ53UJG7JThYzk3vZyGbX3LodamTt5AcFLXPDLZtowxiXEgaeH4JdralBhJPp XugpSEzAqLSOrwg3ORcljgb8vJIk90v8Pc7pny3Z0E6w55h+DHac3pDQbTh70+JZ5f si2VcCK0bzBONTIAsWq2tN3LQPXdQ+6bRbxfjIZIpMHBhMTYE9XoTwqJ5utxJsw0v2 7E8FwkkufVJatjHiJnJ7F8dILMLB8aw4NA7N70ryufi4hprpNePY9XT3k1Kzc8ynmr 7aI38MKT9IwbuZnla3AwTW5IIK1+OboP8oUG6XXSSX8NvjFdlCzSm3413bLNWRwo7x zuJ6z1l/ljQEQ== Message-ID: Date: Mon, 10 Jul 2023 09:38:31 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.12.0 Subject: Re: [PATCH v4 0/9] MediaTek DisplayPort: support eDP and aux-bus To: Chen-Yu Tsai Cc: chunkuang.hu@kernel.org, p.zabel@pengutronix.de, airlied@gmail.com, daniel@ffwll.ch, matthias.bgg@gmail.com, dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kernel@collabora.com, nfraprado@collabora.com References: <20230706123025.208408-1-angelogioacchino.delregno@collabora.com> Content-Language: en-US From: AngeloGioacchino Del Regno In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230710_003841_107509_EF441199 X-CRM114-Status: GOOD ( 31.91 ) 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 SWwgMDcvMDcvMjMgMTA6MjMsIENoZW4tWXUgVHNhaSBoYSBzY3JpdHRvOgo+IE9uIFRodSwgSnVs IDYsIDIwMjMgYXQgODozMOKAr1BNIEFuZ2Vsb0dpb2FjY2hpbm8gRGVsIFJlZ25vCj4gPGFuZ2Vs b2dpb2FjY2hpbm8uZGVscmVnbm9AY29sbGFib3JhLmNvbT4gd3JvdGU6Cj4+Cj4+IENoYW5nZXMg aW4gdjQ6Cj4+ICAgLSBTZXQgZGF0YSBsYW5lcyB0byBpZGxlIHRvIHByZXZlbnQgc3RhbGxzIGlm IGJvb3Rsb2FkZXIgZGlkbid0Cj4+ICAgICBwcm9wZXJseSBjbG9zZSB0aGUgZURQIHBvcnQKPj4g ICAtIE5vdyB1c2luZyB0aGUgLmRvbmVfcHJvYmluZygpIGNhbGxiYWNrIGZvciBBVVggYnVzIHRv IHByZXZlbnQKPj4gICAgIHByb2JlIGRlZmVycmFsIGxvb3BzIGluIGNhc2UgdGhlIHBhbmVsLWVk cCBkcml2ZXIgaXMgYSBtb2R1bGUKPj4gICAgIGFzIHByZXZpb3VzbHkgc2VlbiB3aXRoIGFub3Ro ZXIgYnJpZGdlIGRyaXZlciAoQU5YNzYyNSkgb24KPj4gICAgIHNvbWUgb3RoZXIgU29DcyAoTVQ4 MTkyIGFuZCBvdGhlcnMpCj4+ICAgLSBSZWJhc2VkIG92ZXIgbmV4dC0yMDIzMDcwNgo+PiAgIC0g RHJvcHBlZCBDaGVuLVl1J3MgVC1iIHRhZyBvbiBsYXN0IHBhdGNoIGFzIHNvbWUgbG9naWMgY2hh bmdlZAo+PiAgICAgKGJlZm9yZSwgSSB3YXNuJ3QgdXNpbmcgdGhlIC5kb25lX3Byb2JpbmcoKSBj YWxsYmFjaykuCj4+Cj4+IENoYW5nZXMgaW4gdjM6Cj4+ICAgLSBBZGRlZCBEUFRYIEFVWCBibG9j ayBpbml0aWFsaXphdGlvbiBiZWZvcmUgdHJ5aW5nIHRvIGNvbW11bmljYXRlCj4+ICAgICB0byBz dG9wIHJlbHlpbmcgb24gdGhlIGJvb3Rsb2FkZXIga2VlcGluZyBpdCBpbml0aWFsaXplZCBiZWZv cmUKPj4gICAgIGJvb3RpbmcgTGludXguCj4+ICAgLSBGaXhlZCBjb21taXQgZGVzY3JpcHRpb24g Zm9yIHBhdGNoIFswOS8wOV0gYW5kIHJlbW92ZWQgY29tbWVudGVkCj4+ICAgICBvdXQgY29kZSAo dGhhdCBzbGlwcGVkIGZyb20gZGV2IHBoYXNlLi4gc29ycnkhKS4KPj4KPj4gVGhpcyBzZXJpZXMg YWRkcyAicmVhbCIgc3VwcG9ydCBmb3IgZURQIGluIHRoZSBtdGstZHAgRGlzcGxheVBvcnQgZHJp dmVyLgo+Pgo+PiBFeHBsYWluaW5nIHRoZSAicmVhbCI6Cj4+IEJlZm9yZSB0aGlzIGNoYW5nZSwg dGhlIERpc3BsYXlQb3J0IGRyaXZlciBkaWQgc3VwcG9ydCBlRFAgdG8gc29tZQo+PiBleHRlbnQs IGJ1dCBpdCB3YXMgdHJlYXRpbmcgaXQgZW50aXJlbHkgbGlrZSBhIHJlZ3VsYXIgRFAgaW50ZXJm YWNlCj4+IHdoaWNoIGlzIHBhcnRpYWxseSBmaW5lLCBhZnRlciBhbGwsIGVtYmVkZGVkIERpc3Bs YXlQb3J0ICppcyogYWN0dWFsbHkKPj4gRGlzcGxheVBvcnQsIGJ1dCB0aGVyZSBtaWdodCBiZSBz b21lIGRpZmZlcmVuY2VzIHRvIGFjY291bnQgZm9yLi4uIGFuZAo+PiB0aGlzIGlzIGZvciBib3Ro IHNtYWxsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBhbmQsIG1vcmUgaW1wb3J0YW50bHksCj4+ IGZvciBjb3JyZWN0IGZ1bmN0aW9uYWxpdHkgaW4gc29tZSBzeXN0ZW1zLgo+Pgo+PiBGdW5jdGlv bmFsaXR5IGZpcnN0Ogo+Pgo+PiBPbmUgb2YgdGhlIGNvbW1vbiBkaWZmZXJlbmNlcyBmb3VuZCBp biB2YXJpb3VzIGJvYXJkcyBpbXBsZW1lbnRpbmcgZURQCj4+IGFuZCBtYWNoaW5lcyB1c2luZyBh biBlRFAgcGFuZWwgaXMgdGhhdCBtYW55IHRpbWVzIHRoZSBIUEQgbGluZSBpcyBub3QKPj4gY29u bmVjdGVkLiBUaGlzICptdXN0KiBiZSBhY2NvdW50ZWQgZm9yOiBhdCBzdGFydHVwLCB0aGlzIHNw ZWNpZmljIElQCj4+IHdpbGwgcmFpc2UgYSBIUEQgaW50ZXJydXB0ICh3aGljaCBzaG91bGQgbWF5 YmUgYmUgaWdub3JlZC4uLiBhcyBpdCBkb2VzCj4+IG5vdCBhcHBlYXIgdG8gYmUgYSAicmVhbCIg ZXZlbnQuLi4pIHRoYXQgd2lsbCBtYWtlIHRoZSBlRFAgcGFuZWwgdG8gYmUKPj4gZGV0ZWN0ZWQg YW5kIHRvIGFjdHVhbGx5IHdvcmsgYnV0LCBhZnRlciBhIHN1c3BlbmQtcmVzdW1lIGN5Y2xlLCB0 aGVyZQo+PiB3aWxsIGJlIG5vIEhQRCBpbnRlcnJ1cHQgKGFzIHRoZXJlJ3Mgbm8gSFBEIGxpbmUg aW4gbXkgY2FzZSEpIHByb2R1Y2luZwo+PiBhIGZ1bmN0aW9uYWxpdHkgaXNzdWUgLSBzcGVjaWZp Y2FsbHksIHRoZSBEUCBMaW5rIFRyYWluaW5nIGZhaWxzIGJlY2F1c2UKPj4gdGhlIHBhbmVsIGRv ZXNuJ3QgZ2V0IHBvd2VyZWQgdXAsIHRoZW4gaXQgc3RheXMgYmxhY2sgYW5kIHdvbid0IHdvcmsK Pj4gdW50aWwgcmVib290aW5nIHRoZSBtYWNoaW5lIChvciByZW1vdmluZyBhbmQgcmVpbnNlcnRp bmcgdGhlIG1vZHVsZSBJCj4+IHRoaW5rLCBidXQgSSBoYXZlbid0IHRyaWVkIHRoYXQpLgo+Pgo+ PiBOb3cgZm9yLi4gYm90aDoKPj4gZURQIHBhbmVscyBhcmUgKmUqRFAgYmVjYXVzZSB0aGV5IGFy ZSAqbm90KiByZW1vdmFibGUgKGluIHRoZSBzZW5zZSB0aGF0Cj4+IHlvdSBjYW4ndCB1bnBsdWcg dGhlIGNhYmxlIHdpdGhvdXQgZGlzYXNzZW1ibGluZyB0aGUgbWFjaGluZSwgaW4gd2hpY2gKPj4g Y2FzZSwgdGhlIG1hY2hpbmUgc2hhbGwgYmUgcG93ZXJlZCBkb3duLi4hKTogdGhpcyAoY29ycmVj dCkgYXNzdW1wdGlvbgo+PiBtYWtlcyB1cyBhYmxlIHRvIHNvbHZlIHNvbWUgaXNzdWVzIGFuZCB0 byBhbHNvIGdhaW4gYSBsaXR0bGUgcGVyZm9ybWFuY2UKPj4gZHVyaW5nIFBNIG9wZXJhdGlvbnMu Cj4+Cj4+IFdoYXQgd2FzIGRvbmUgaGVyZSBpczoKPj4gICAtIENhY2hpbmcgdGhlIEVESUQgaWYg dGhlIHBhbmVsIGlzIGVEUDogd2UncmUgYWx3YXlzIGdvaW5nIHRvIHJlYWQgdGhlCj4+ICAgICBz YW1lIGRhdGEgZXZlcnl0aW1lLCBzbyB3ZSBjYW4ganVzdCBjYWNoZSB0aGF0IChhcyBpdCdzIHNt YWxsIGVub3VnaCkKPj4gICAgIHNob3J0ZW5pbmcgUE0gcmVzdW1lIHRpbWVzIGZvciB0aGUgZURQ IGRyaXZlciBpbnN0YW5jZTsKPj4gICAtIEFsd2F5cyByZXR1cm4gY29ubmVjdG9yX3N0YXR1c19j b25uZWN0ZWQgaWYgaXQncyBlRFA6IG5vbi1yZW1vdmFibGUKPj4gICAgIG1lYW5zIGNvbm5lY3Rv cl9zdGF0dXNfZGlzY29ubmVjdGVkIGNhbid0IGhhcHBlbiBkdXJpbmcgcnVudGltZS4uLgo+PiAg ICAgdGhpcyBhbHNvIHNhdmVzIHVzIHNvbWUgdGltZSBhbmQgZXZlbiBwb3dlciwgYXMgd2Ugd29u J3QgaGF2ZSB0bwo+PiAgICAgcGVyZm9ybSB5ZXQgYW5vdGhlciBwb3dlciBjeWNsZSBvZiB0aGUg SFc7Cj4+ICAgLSBBZGRlZCBhdXgtYnVzIHN1cHBvcnQhCj4+ICAgICBUaGlzIG1ha2VzIHVzIGFi bGUgdG8gcmVseSBvbiBwYW5lbCBhdXRvZGV0ZWN0aW9uIGZyb20gdGhlIEVESUQsCj4+ICAgICBh dm9pZGluZyB0byBhZGQgbW9yZSBhbmQgbW9yZSBwYW5lbCB0aW1pbmdzIHRvIHBhbmVsLWVkcCBh bmQsIGV2ZW4KPj4gICAgIGJldHRlciwgYWxsb3dpbmcgdG8gdXNlIG9uZSBwYW5lbCBub2RlIGlu IGRldmljZXRyZWVzIGZvciBtdWx0aXBsZQo+PiAgICAgdmFyaWFudHMgb2YgdGhlIHNhbWUgbWFj aGluZSBzaW5jZSwgYXQgdGhhdCBwb2ludCwgaXQncyBub3QgaW1wb3J0YW50Cj4+ICAgICB0byAi cHJldmVudGl2ZWx5IGtub3ciIHdoYXQgcGFuZWwgd2UgaGF2ZSAoZWgsIGl0J3MgYXV0b2RldGVj dGVkLi4uISkuCj4+Cj4+IFRoaXMgd2FzIHRlc3RlZCBvbiBhIE1UODE5NSBDaGVycnkgVG9tYXRv IENocm9tZWJvb2sgKHBhbmVsLWVkcCBvbiBhdXgtYnVzKQo+IAo+IERvIHlvdSBoYXZlIHBhbmVs LWVkcCBidWlsdCBhcyBhIG1vZHVsZT8gSWYgSSBoYXZlIGl0IGJ1aWx0IGluLCB0aGUgcGFuZWwK PiBjYW4gY29ycmVjdGx5IGRpc3BsYXkgc3R1ZmYuIElmIEkgaGF2ZSBpdCBidWlsdCBhcyBhIG1v ZHVsZSwgdGhlIHBhbmVsIGlzCj4gY29ycmVjdGx5IGRldGVjdGVkLCBidXQgdGhlIHBhbmVsIHN0 YXlzIGJsYWNrIGV2ZW4gaWYgRFJNIHRoaW5rcyBpdCBpcwo+IGRpc3BsYXlpbmcgc3R1ZmYuCj4g CgpJIHRlc3RlZCBib3RoLiBJJ2xsIHJlY2hlY2sgb24gYSBjbGVhbiB0cmVlIGp1c3QgdG8gYmUg c3VyZS4uLgoKPiBBbmQgaXQgbG9va3MgbGlrZSBFRElEIHJlYWRpbmcgYW5kIHBhbmVsIHBvd2Vy IHNlcXVlbmNpbmcgaXMgc3RpbGwgbm90Cj4gd29ya2luZyBjb3JyZWN0bHksIGkuZS4gbmVlZHMg cmVndWxhdG9yLWFsd2F5cy1vbj8KClllYWggdGhhdCdzIHN0aWxsIG5lZWRlZCB3aXRoIHRoaXMg dmVyc2lvbiwgSSdtIHN0aWxsIHRyeWluZyB0byBnZXQgKmF0IGxlYXN0Kgpzb21lIHN1cHBvcnQg dXBzdHJlYW1lZCBiZWZvcmUgcmVmaW5pbmcgaXQuCgpDaGVlcnMsCkFuZ2VsbwoKPiAKPiBDaGVu WXUKPiAKPj4gUC5TLjogRm9yIHlvdXIgb3duIHRlc3RpbmcgY29tbW9kaXR5LCBoZXJlJ3MgYSBy ZWZlcmVuY2UgZGV2aWNldHJlZToKPj4gJmVkcF90eCB7Cj4+ICAgICAgICAgIHN0YXR1cyA9ICJv a2F5IjsKPj4KPj4gICAgICAgICAgcGluY3RybC1uYW1lcyA9ICJkZWZhdWx0IjsKPj4gICAgICAg ICAgcGluY3RybC0wID0gPCZlZHB0eF9waW5zX2RlZmF1bHQ+Owo+Pgo+PiAgICAgICAgICBwb3J0 cyB7Cj4+ICAgICAgICAgICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47Cj4+ICAgICAgICAg ICAgICAgICAgI3NpemUtY2VsbHMgPSA8MD47Cj4+Cj4+ICAgICAgICAgICAgICAgICAgcG9ydEAw IHsKPj4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwwPjsKPj4gICAgICAgICAgICAg ICAgICAgICAgICAgIGVkcF9pbjogZW5kcG9pbnQgewo+PiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICByZW1vdGUtZW5kcG9pbnQgPSA8JmRwX2ludGYwX291dD47Cj4+ICAgICAgICAg ICAgICAgICAgICAgICAgICB9Owo+PiAgICAgICAgICAgICAgICAgIH07Cj4+Cj4+ICAgICAgICAg ICAgICAgICAgcG9ydEAxIHsKPj4gICAgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwxPjsK Pj4gICAgICAgICAgICAgICAgICAgICAgICAgIGVkcF9vdXQ6IGVuZHBvaW50IHsKPj4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1sYW5lcyA9IDwwIDEgMiAzPjsKPj4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3RlLWVuZHBvaW50ID0gPCZwYW5lbF9p bj47Cj4+ICAgICAgICAgICAgICAgICAgICAgICAgICB9Owo+PiAgICAgICAgICAgICAgICAgIH07 Cj4+ICAgICAgICAgIH07Cj4+Cj4+ICAgICAgICAgIGF1eC1idXMgewo+PiAgICAgICAgICAgICAg ICAgIHBhbmVsOiBwYW5lbCB7Cj4+ICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmxl ID0gImVkcC1wYW5lbCI7Cj4+ICAgICAgICAgICAgICAgICAgICAgICAgICBwb3dlci1zdXBwbHkg PSA8JnBwMzMwMF9kaXNwX3g+Owo+PiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2xpZ2h0 ID0gPCZiYWNrbGlnaHRfbGNkMD47Cj4+ICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IHsK Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxfaW46IGVuZHBvaW50IHsK Pj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtZW5kcG9p bnQgPSA8JmVkcF9vdXQ+Owo+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Owo+ PiAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKPj4gICAgICAgICAgICAgICAgICB9Owo+PiAg ICAgICAgICB9Owo+PiB9Owo+Pgo+Pgo+PiBBbmdlbG9HaW9hY2NoaW5vIERlbCBSZWdubyAoOSk6 Cj4+ICAgIGRybS9tZWRpYXRlazogZHA6IENhY2hlIEVESUQgZm9yIGVEUCBwYW5lbAo+PiAgICBk cm0vbWVkaWF0ZWs6IGRwOiBNb3ZlIEFVWCBhbmQgcGFuZWwgcG93ZXJvbi9vZmYgc2VxdWVuY2Ug dG8gZnVuY3Rpb24KPj4gICAgZHJtL21lZGlhdGVrOiBkcDogQWx3YXlzIHJldHVybiBjb25uZWN0 ZWQgc3RhdHVzIGZvciBlRFAgaW4gLmRldGVjdCgpCj4+ICAgIGRybS9tZWRpYXRlazogZHA6IEFs d2F5cyBzZXQgY2FibGVfcGx1Z2dlZF9pbiBhdCByZXN1bWUgZm9yIGVEUCBwYW5lbAo+PiAgICBk cm0vbWVkaWF0ZWs6IGRwOiBDaGFuZ2UgbG9nZ2luZyB0byBkZXYgZm9yIG10a19kcF9hdXhfdHJh bnNmZXIoKQo+PiAgICBkcm0vbWVkaWF0ZWs6IGRwOiBFbmFibGUgZXZlbnQgaW50ZXJydXB0IG9u bHkgd2hlbiBicmlkZ2UgYXR0YWNoZWQKPj4gICAgZHJtL21lZGlhdGVrOiBkcDogVXNlIGRldm0g dmFyaWFudCBvZiBkcm1fYnJpZGdlX2FkZCgpCj4+ICAgIGRybS9tZWRpYXRlazogZHA6IE1vdmUg QVVYX1AwIHNldHRpbmcgdG8KPj4gICAgICBtdGtfZHBfaW5pdGlhbGl6ZV9hdXhfc2V0dGluZ3Mo KQo+PiAgICBkcm0vbWVkaWF0ZWs6IGRwOiBBZGQgc3VwcG9ydCBmb3IgZW1iZWRkZWQgRGlzcGxh eVBvcnQgYXV4LWJ1cwo+Pgo+PiAgIGRyaXZlcnMvZ3B1L2RybS9tZWRpYXRlay9tdGtfZHAuYyB8 IDE5NyArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0KPj4gICAxIGZpbGUgY2hhbmdlZCwg MTI3IGluc2VydGlvbnMoKyksIDcwIGRlbGV0aW9ucygtKQo+Pgo+PiAtLQo+PiAyLjQwLjEKPj4K CgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4 LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFy bS1rZXJuZWwK