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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 579E7C433F5 for ; Tue, 28 Sep 2021 08:44:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 33C4961159 for ; Tue, 28 Sep 2021 08:44:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239703AbhI1Ipw (ORCPT ); Tue, 28 Sep 2021 04:45:52 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55008 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239573AbhI1Ipv (ORCPT ); Tue, 28 Sep 2021 04:45:51 -0400 Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D2FDFC061575 for ; Tue, 28 Sep 2021 01:44:11 -0700 (PDT) Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mV8iS-00022c-EN; Tue, 28 Sep 2021 10:43:56 +0200 Message-ID: <2126add7b505fb27c4eb3fef459ac925b20818f8.camel@pengutronix.de> Subject: Re: [PATCH v2 4/4] phy: freescale: pcie: initialize the imx8 pcie standalone phy driver From: Lucas Stach To: Richard Zhu , "kishon@ti.com" , "vkoul@kernel.org" , "robh@kernel.org" , "galak@kernel.crashing.org" , "shawnguo@kernel.org" Cc: "linux-phy@lists.infradead.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Date: Tue, 28 Sep 2021 10:43:54 +0200 In-Reply-To: References: <1632641983-1455-1-git-send-email-hongxing.zhu@nxp.com> <1632641983-1455-5-git-send-email-hongxing.zhu@nxp.com> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.40.4 (3.40.4-1.fc34) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Richard, Am Dienstag, dem 28.09.2021 um 07:09 +0000 schrieb Richard Zhu: > > -----Original Message----- > > From: Lucas Stach > > Sent: Monday, September 27, 2021 4:43 PM > > To: Richard Zhu ; kishon@ti.com; vkoul@kernel.org; > > robh@kernel.org; galak@kernel.crashing.org; shawnguo@kernel.org > > Cc: linux-phy@lists.infradead.org; devicetree@vger.kernel.org; > > linux-arm-kernel@lists.infradead.org; linux-kernel@vger.kernel.org; > > kernel@pengutronix.de; dl-linux-imx > > Subject: Re: [PATCH v2 4/4] phy: freescale: pcie: initialize the imx8 pcie > > standalone phy driver > > > > Am Sonntag, dem 26.09.2021 um 15:39 +0800 schrieb Richard Zhu: > > > Add the standalone i.MX8 PCIe PHY driver. > > > Some reset bits should be manipulated between PHY configurations and > > > status check(internal PLL is locked or not). > > > So, do the PHY configuration in the phy_calibrate(). > > > And check the PHY is ready or not in the phy_init(). > > > > I would really like to see the PCIe controller driver side of this also, as it's hard > > to review standalone. For example I'm not sure if some of those reset bits > > should also be driven from the PHY driver, even if they are currently hooked > > up to the controller driver. > > > > Also I think the IOMUX GPR register handling belongs in the PHY driver, as it's > > configuring the reference clock routing. > > > [Richard Zhu] Sorry to bring inconvenience to you. I would send out the v3 >  patch-set and the i.MX8MM PCIe controller driver patches after I'm back from the >  national holiday tomorrow(about one week). No problem. :) I'm just pointing out that I probably won't be able to invest more time reviewing this before I can get the full picture. > Although most of the IOMUX GPR bits are related to PHY, but there are some bits are >  defined only for controller. For example, the device_type of the controller, the clkreq# >  signal control in L1SS, and so on. We can't encapsulate all the GPR bits setting into PHY driver. > So, it's better to let controller driver to handle the general register bits manipulations. > How do you think about that? I still think we should split the drivers along the functional boundaries. It's quite confusing and probably going to be a maintenance issues when some of the PHY handling bits are still located in the controller driver, while we have a separate PHY driver. As the GPR region is handled by a regmap we should have no issues accessing even the same register from different drivers. So my vote is on moving the GPR bits related to PHY clocking to this driver. > > > > > > > Signed-off-by: Richard Zhu > > > --- > > >  drivers/phy/freescale/Kconfig | 9 ++ > > >  drivers/phy/freescale/Makefile | 1 + > > >  drivers/phy/freescale/phy-fsl-imx8-pcie.c | 167 > > > ++++++++++++++++++++++ > > >  3 files changed, 177 insertions(+) > > >  create mode 100644 drivers/phy/freescale/phy-fsl-imx8-pcie.c > > > > From what I know, there are several quite different PCIe PHYs used in the > > different i.MX8 variants. I'm not sure if we want to stuff them all into one file. > > I guess we should be more specific here and call this imx8m-phy, or even > > imx8mm-phy. > [Richard Zhu] Good suggestions, I think imx8m-phy is better, since the i.MX8MQ/MM/MP >  have the similar architecture of the PCIe PHY implementation. > > > > > > > > > diff --git a/drivers/phy/freescale/Kconfig > > > b/drivers/phy/freescale/Kconfig index 320630ffe3cd..da078a676fbc > > > 100644 > > > --- a/drivers/phy/freescale/Kconfig > > > +++ b/drivers/phy/freescale/Kconfig > > > @@ -14,3 +14,12 @@ config PHY_MIXEL_MIPI_DPHY > > >   help > > >   Enable this to add support for the Mixel DSI PHY as found > > >   on NXP's i.MX8 family of SOCs. > > > + > > > +config PHY_FSL_IMX8_PCIE > > > + tristate "Freescale i.MX8 PCIE PHY" > > > + depends on OF && HAS_IOMEM > > > + select GENERIC_PHY > > > + default ARCH_MXC > > > + help > > > + Enable this to add support for the PCIE PHY as found on i.MX8 > > > + family of SOCs. > > > diff --git a/drivers/phy/freescale/Makefile > > > b/drivers/phy/freescale/Makefile index 1d02e3869b45..9fd467b58621 > > > 100644 > > > --- a/drivers/phy/freescale/Makefile > > > +++ b/drivers/phy/freescale/Makefile > > > @@ -1,3 +1,4 @@ > > >  # SPDX-License-Identifier: GPL-2.0-only > > >  obj-$(CONFIG_PHY_FSL_IMX8MQ_USB) += phy-fsl-imx8mq-usb.o > > >  obj-$(CONFIG_PHY_MIXEL_MIPI_DPHY) += phy-fsl-imx8-mipi-dphy.o > > > +obj-$(CONFIG_PHY_FSL_IMX8_PCIE) += phy-fsl-imx8-pcie.o > > > diff --git a/drivers/phy/freescale/phy-fsl-imx8-pcie.c > > > b/drivers/phy/freescale/phy-fsl-imx8-pcie.c > > > new file mode 100644 > > > index 000000000000..ff47d6b83686 > > > --- /dev/null > > > +++ b/drivers/phy/freescale/phy-fsl-imx8-pcie.c > > > @@ -0,0 +1,167 @@ > > > +// SPDX-License-Identifier: GPL-2.0+ > > > +/* > > > + * Copyright 2021 NXP > > > + */ > > > + > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > +#include > > > + > > > +#define IMX8MM_PCIE_PHY_CMN_REG061 0x184 > > > +#define ANA_PLL_CLK_OUT_TO_EXT_IO_EN BIT(0) > > > +#define IMX8MM_PCIE_PHY_CMN_REG062 0x188 > > > +#define ANA_PLL_CLK_OUT_TO_EXT_IO_SEL BIT(3) > > > +#define IMX8MM_PCIE_PHY_CMN_REG063 0x18C > > > +#define AUX_PLL_REFCLK_SEL_SYS_PLL GENMASK(7, 6) > > > +#define IMX8MM_PCIE_PHY_CMN_REG064 0x190 > > > +#define ANA_AUX_RX_TX_SEL_TX BIT(7) > > > +#define ANA_AUX_RX_TERM_GND_EN BIT(3) > > > +#define ANA_AUX_TX_TERM BIT(2) > > > +#define IMX8MM_PCIE_PHY_CMN_REG065 0x194 > > > +#define ANA_AUX_RX_TERM (BIT(7) | BIT(4)) > > > +#define ANA_AUX_TX_LVL GENMASK(3, 0) > > > +#define IMX8MM_PCIE_PHY_CMN_REG75 0x1D4 > > > +#define PCIE_PHY_CMN_REG75_PLL_DONE 0x3 > > > +#define PCIE_PHY_TRSV_REG5 0x414 > > > +#define PCIE_PHY_TRSV_REG5_GEN1_DEEMP 0x2D > > > +#define PCIE_PHY_TRSV_REG6 0x418 > > > +#define PCIE_PHY_TRSV_REG6_GEN2_DEEMP 0xF > > > + > > > +struct imx8_pcie_phy { > > > + u32 refclk_pad_mode; > > > + void __iomem *base; > > > + struct clk *clk; > > > + struct phy *phy; > > > +}; > > > + > > > +static int imx8_pcie_phy_init(struct phy *phy) { > > > + int ret; > > > + u32 val; > > > + struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); > > > + > > > + ret = readl_poll_timeout(imx8_phy->base + > > IMX8MM_PCIE_PHY_CMN_REG75, > > > + val, val == PCIE_PHY_CMN_REG75_PLL_DONE, > > > + 10, 20000); > > > + return ret; > > > +} > > > + > > > +static int imx8_pcie_phy_cal(struct phy *phy) { > > > + u32 value, pad_mode; > > > + struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); > > > + > > > + pad_mode = imx8_phy->refclk_pad_mode; > > > + if (pad_mode == IMX8_PCIE_REFCLK_PAD_INPUT) { > > > + /* Configure the pad as input */ > > > + value = readl(imx8_phy->base + > > IMX8MM_PCIE_PHY_CMN_REG061); > > > + writel(value & ~ANA_PLL_CLK_OUT_TO_EXT_IO_EN, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG061); > > > + } else if (pad_mode == IMX8_PCIE_REFCLK_PAD_OUTPUT) { > > > + /* Configure the PHY to output the refclock via pad */ > > > + writel(ANA_PLL_CLK_OUT_TO_EXT_IO_EN, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG061); > > > + writel(ANA_PLL_CLK_OUT_TO_EXT_IO_SEL, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG062); > > > + writel(AUX_PLL_REFCLK_SEL_SYS_PLL, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG063); > > > + value = ANA_AUX_RX_TX_SEL_TX | ANA_AUX_TX_TERM; > > > + writel(value | ANA_AUX_RX_TERM_GND_EN, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG064); > > > + writel(ANA_AUX_RX_TERM | ANA_AUX_TX_LVL, > > > + imx8_phy->base + IMX8MM_PCIE_PHY_CMN_REG065); > > > + } > > > + > > > + /* Tune PHY de-emphasis setting to pass PCIe compliance. */ > > > + writel(PCIE_PHY_TRSV_REG5_GEN1_DEEMP, > > > + imx8_phy->base + PCIE_PHY_TRSV_REG5); > > > + writel(PCIE_PHY_TRSV_REG6_GEN2_DEEMP, > > > + imx8_phy->base + PCIE_PHY_TRSV_REG6); > > > + > > > + return 0; > > > +} > > > + > > > +static int imx8_pcie_phy_power_on(struct phy *phy) { > > > + struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); > > > + > > > + return clk_prepare_enable(imx8_phy->clk); > > > > Do we need to enable this clock when the refclock is supplied externally via > > the pad? > > > [Richard Zhu] Good question. I think this clock is not needed anymore if the refclock is sourced from external OSC. > I just enable the PLL2_100Mhz here, since when internal PLL is used as refclock, the pll2_100Mhz should be turned on. > Shall I remove the setting and just keep the callback for further extend usage(internal PLL used as refclk)? > Yes, we should avoid turning on clocks that aren't needed. So the clock enable here should be dependent on the pad-mode. When the clock is supplied externally we don't want to enable the internal clock. Regards, Lucas > > > +} > > > + > > > +static int imx8_pcie_phy_power_off(struct phy *phy) { > > > + struct imx8_pcie_phy *imx8_phy = phy_get_drvdata(phy); > > > + > > > + clk_disable_unprepare(imx8_phy->clk); > > > + > > > + return 0; > > > +} > > > + > > > +static const struct phy_ops imx8_pcie_phy_ops = { > > > + .init = imx8_pcie_phy_init, > > > + .calibrate = imx8_pcie_phy_cal, > > > + .power_on = imx8_pcie_phy_power_on, > > > + .power_off = imx8_pcie_phy_power_off, > > > + .owner = THIS_MODULE, > > > +}; > > > + > > > +static int imx8_pcie_phy_probe(struct platform_device *pdev) { > > > + struct phy_provider *phy_provider; > > > + struct device *dev = &pdev->dev; > > > + struct device_node *np = dev->of_node; > > > + struct imx8_pcie_phy *imx8_phy; > > > + struct resource *res; > > > + > > > + imx8_phy = devm_kzalloc(dev, sizeof(*imx8_phy), GFP_KERNEL); > > > + if (!imx8_phy) > > > + return -ENOMEM; > > > + > > > + /* get PHY refclk pad mode */ > > > + of_property_read_u32(np, "fsl,refclk-pad-mode", > > > + &imx8_phy->refclk_pad_mode); > > > + > > > + imx8_phy->clk = devm_clk_get(dev, "phy"); > > > + if (IS_ERR(imx8_phy->clk)) { > > > + dev_err(dev, "failed to get imx pcie phy clock\n"); > > > + return PTR_ERR(imx8_phy->clk); > > > + } > > > + > > > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > > > + imx8_phy->base = devm_ioremap_resource(dev, res); > > > + if (IS_ERR(imx8_phy->base)) > > > + return PTR_ERR(imx8_phy->base); > > > + > > > + imx8_phy->phy = devm_phy_create(dev, NULL, &imx8_pcie_phy_ops); > > > + if (IS_ERR(imx8_phy->phy)) > > > + return PTR_ERR(imx8_phy->phy); > > > + > > > + phy_set_drvdata(imx8_phy->phy, imx8_phy); > > > + > > > + phy_provider = devm_of_phy_provider_register(dev, > > > +of_phy_simple_xlate); > > > + > > > + return PTR_ERR_OR_ZERO(phy_provider); } > > > + > > > +static const struct of_device_id imx8_pcie_phy_of_match[] = { > > > + {.compatible = "fsl,imx8mm-pcie-phy",}, > > > + { }, > > > +}; > > > +MODULE_DEVICE_TABLE(of, imx8_pcie_phy_of_match); > > > + > > > +static struct platform_driver imx8_pcie_phy_driver = { > > > + .probe = imx8_pcie_phy_probe, > > > + .driver = { > > > + .name = "imx8-pcie-phy", > > > + .of_match_table = imx8_pcie_phy_of_match, > > > + } > > > +}; > > > +module_platform_driver(imx8_pcie_phy_driver); > > > + > > > +MODULE_DESCRIPTION("FSL IMX8 PCIE PHY driver"); > > > +MODULE_LICENSE("GPL"); > > > 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 72579C433EF for ; Tue, 28 Sep 2021 08:44:12 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 08EBE60F12 for ; Tue, 28 Sep 2021 08:44:12 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 08EBE60F12 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=WRKiDjhcPxsVhtP4b+P56ZolzeeLBDoX5841Mt+IaQc=; b=GvV/g4HpoI/Bjo IYkKAanWNN0dYQn5/WoCy52ekrP1JjLNK5EO7uSxls8x6HU/H2VlNbECFs2CTrHLLHVuFvPF6vbdm Kzq8SuAj4wEhKgL81T8cyb9mOznFRGomkBlcW1Xi1Ks8T/u1go+nIsnC6NuWFQL/M6ENJB2ilHj2E FTRtvPIT2cfXSrlJB5QF01eD3XqY8vRonuLxQ82wtKBaZ8Pevr57Cgy/yid8t5zFcI19dqxDPYqSJ hfS5AOXmfCCHSephyL6XeWKArQMdaOJvfgIrsLLe+ExlIivg0PWHhhEf2eLVCdfkBotn8RJL1QCgH 0PJ/KVKvIHksWHaNLV7A==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mV8ih-006IkF-IE; Tue, 28 Sep 2021 08:44:11 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mV8id-006IfQ-Db for linux-phy@lists.infradead.org; Tue, 28 Sep 2021 08:44:10 +0000 Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mV8iS-00022c-EN; Tue, 28 Sep 2021 10:43:56 +0200 Message-ID: <2126add7b505fb27c4eb3fef459ac925b20818f8.camel@pengutronix.de> Subject: Re: [PATCH v2 4/4] phy: freescale: pcie: initialize the imx8 pcie standalone phy driver From: Lucas Stach To: Richard Zhu , "kishon@ti.com" , "vkoul@kernel.org" , "robh@kernel.org" , "galak@kernel.crashing.org" , "shawnguo@kernel.org" Cc: "linux-phy@lists.infradead.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Date: Tue, 28 Sep 2021 10:43:54 +0200 In-Reply-To: References: <1632641983-1455-1-git-send-email-hongxing.zhu@nxp.com> <1632641983-1455-5-git-send-email-hongxing.zhu@nxp.com> User-Agent: Evolution 3.40.4 (3.40.4-1.fc34) MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-phy@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210928_014407_837195_0A740928 X-CRM114-Status: GOOD ( 54.63 ) X-BeenThere: linux-phy@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux Phy Mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-phy" Errors-To: linux-phy-bounces+linux-phy=archiver.kernel.org@lists.infradead.org SGkgUmljaGFyZCwKCkFtIERpZW5zdGFnLCBkZW0gMjguMDkuMjAyMSB1bSAwNzowOSArMDAwMCBz Y2hyaWViIFJpY2hhcmQgWmh1Ogo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+IEZy b206IEx1Y2FzIFN0YWNoIDxsLnN0YWNoQHBlbmd1dHJvbml4LmRlPgo+ID4gU2VudDogTW9uZGF5 LCBTZXB0ZW1iZXIgMjcsIDIwMjEgNDo0MyBQTQo+ID4gVG86IFJpY2hhcmQgWmh1IDxob25neGlu Zy56aHVAbnhwLmNvbT47IGtpc2hvbkB0aS5jb207IHZrb3VsQGtlcm5lbC5vcmc7Cj4gPiByb2Jo QGtlcm5lbC5vcmc7IGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc7IHNoYXduZ3VvQGtlcm5lbC5v cmcKPiA+IENjOiBsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZzsgZGV2aWNldHJlZUB2Z2Vy Lmtlcm5lbC5vcmc7Cj4gPiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGxp bnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7Cj4gPiBrZXJuZWxAcGVuZ3V0cm9uaXguZGU7IGRs LWxpbnV4LWlteCA8bGludXgtaW14QG54cC5jb20+Cj4gPiBTdWJqZWN0OiBSZTogW1BBVENIIHYy IDQvNF0gcGh5OiBmcmVlc2NhbGU6IHBjaWU6IGluaXRpYWxpemUgdGhlIGlteDggcGNpZQo+ID4g c3RhbmRhbG9uZSBwaHkgZHJpdmVyCj4gPiAKPiA+IEFtIFNvbm50YWcsIGRlbSAyNi4wOS4yMDIx IHVtIDE1OjM5ICswODAwIHNjaHJpZWIgUmljaGFyZCBaaHU6Cj4gPiA+IEFkZCB0aGUgc3RhbmRh bG9uZSBpLk1YOCBQQ0llIFBIWSBkcml2ZXIuCj4gPiA+IFNvbWUgcmVzZXQgYml0cyBzaG91bGQg YmUgbWFuaXB1bGF0ZWQgYmV0d2VlbiBQSFkgY29uZmlndXJhdGlvbnMgYW5kCj4gPiA+IHN0YXR1 cyBjaGVjayhpbnRlcm5hbCBQTEwgaXMgbG9ja2VkIG9yIG5vdCkuCj4gPiA+IFNvLCBkbyB0aGUg UEhZIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHBoeV9jYWxpYnJhdGUoKS4KPiA+ID4gQW5kIGNoZWNr IHRoZSBQSFkgaXMgcmVhZHkgb3Igbm90IGluIHRoZSBwaHlfaW5pdCgpLgo+ID4gCj4gPiBJIHdv dWxkIHJlYWxseSBsaWtlIHRvIHNlZSB0aGUgUENJZSBjb250cm9sbGVyIGRyaXZlciBzaWRlIG9m IHRoaXMgYWxzbywgYXMgaXQncyBoYXJkCj4gPiB0byByZXZpZXcgc3RhbmRhbG9uZS4gRm9yIGV4 YW1wbGUgSSdtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhvc2UgcmVzZXQgYml0cwo+ID4gc2hvdWxk IGFsc28gYmUgZHJpdmVuIGZyb20gdGhlIFBIWSBkcml2ZXIsIGV2ZW4gaWYgdGhleSBhcmUgY3Vy cmVudGx5IGhvb2tlZAo+ID4gdXAgdG8gdGhlIGNvbnRyb2xsZXIgZHJpdmVyLgo+ID4gCj4gPiBB bHNvIEkgdGhpbmsgdGhlIElPTVVYIEdQUiByZWdpc3RlciBoYW5kbGluZyBiZWxvbmdzIGluIHRo ZSBQSFkgZHJpdmVyLCBhcyBpdCdzCj4gPiBjb25maWd1cmluZyB0aGUgcmVmZXJlbmNlIGNsb2Nr IHJvdXRpbmcuCj4gPiAKPiBbUmljaGFyZCBaaHVdIFNvcnJ5IHRvIGJyaW5nIGluY29udmVuaWVu Y2UgdG8geW91LiBJIHdvdWxkIHNlbmQgb3V0IHRoZSB2Mwo+IMKgcGF0Y2gtc2V0IGFuZCB0aGUg aS5NWDhNTSBQQ0llIGNvbnRyb2xsZXIgZHJpdmVyIHBhdGNoZXMgYWZ0ZXIgSSdtIGJhY2sgZnJv bSB0aGUKPiDCoG5hdGlvbmFsIGhvbGlkYXkgdG9tb3Jyb3coYWJvdXQgb25lIHdlZWspLiAKCk5v IHByb2JsZW0uIDopIEknbSBqdXN0IHBvaW50aW5nIG91dCB0aGF0IEkgcHJvYmFibHkgd29uJ3Qg YmUgYWJsZSB0bwppbnZlc3QgbW9yZSB0aW1lIHJldmlld2luZyB0aGlzIGJlZm9yZSBJIGNhbiBn ZXQgdGhlIGZ1bGwgcGljdHVyZS4KCj4gQWx0aG91Z2ggbW9zdCBvZiB0aGUgSU9NVVggR1BSIGJp dHMgYXJlIHJlbGF0ZWQgdG8gUEhZLCBidXQgdGhlcmUgYXJlIHNvbWUgYml0cyBhcmUKPiDCoGRl ZmluZWQgb25seSBmb3IgY29udHJvbGxlci4gRm9yIGV4YW1wbGUsIHRoZSBkZXZpY2VfdHlwZSBv ZiB0aGUgY29udHJvbGxlciwgdGhlIGNsa3JlcSMKPiDCoHNpZ25hbCBjb250cm9sIGluIEwxU1Ms IGFuZCBzbyBvbi4gV2UgY2FuJ3QgZW5jYXBzdWxhdGUgYWxsIHRoZSBHUFIgYml0cyBzZXR0aW5n IGludG8gUEhZIGRyaXZlci4KPiBTbywgaXQncyBiZXR0ZXIgdG8gbGV0IGNvbnRyb2xsZXIgZHJp dmVyIHRvIGhhbmRsZSB0aGUgZ2VuZXJhbCByZWdpc3RlciBiaXRzIG1hbmlwdWxhdGlvbnMuCj4g SG93IGRvIHlvdSB0aGluayBhYm91dCB0aGF0PwoKSSBzdGlsbCB0aGluayB3ZSBzaG91bGQgc3Bs aXQgdGhlIGRyaXZlcnMgYWxvbmcgdGhlIGZ1bmN0aW9uYWwKYm91bmRhcmllcy4gSXQncyBxdWl0 ZSBjb25mdXNpbmcgYW5kIHByb2JhYmx5IGdvaW5nIHRvIGJlIGEgbWFpbnRlbmFuY2UKaXNzdWVz IHdoZW4gc29tZSBvZiB0aGUgUEhZIGhhbmRsaW5nIGJpdHMgYXJlIHN0aWxsIGxvY2F0ZWQgaW4g dGhlCmNvbnRyb2xsZXIgZHJpdmVyLCB3aGlsZSB3ZSBoYXZlIGEgc2VwYXJhdGUgUEhZIGRyaXZl ci4KCkFzIHRoZSBHUFIgcmVnaW9uIGlzIGhhbmRsZWQgYnkgYSByZWdtYXAgd2Ugc2hvdWxkIGhh dmUgbm8gaXNzdWVzCmFjY2Vzc2luZyBldmVuIHRoZSBzYW1lIHJlZ2lzdGVyIGZyb20gZGlmZmVy ZW50IGRyaXZlcnMuIFNvIG15IHZvdGUgaXMKb24gbW92aW5nIHRoZSBHUFIgYml0cyByZWxhdGVk IHRvIFBIWSBjbG9ja2luZyB0byB0aGlzIGRyaXZlci4KCj4gCj4gPiA+IAo+ID4gPiBTaWduZWQt b2ZmLWJ5OiBSaWNoYXJkIFpodSA8aG9uZ3hpbmcuemh1QG54cC5jb20+Cj4gPiA+IC0tLQo+ID4g PiDCoGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnICAgICAgICAgICAgIHwgICA5ICsrCj4g PiA+IMKgZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlICAgICAgICAgICAgfCAgIDEgKwo+ ID4gPiDCoGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9waHktZnNsLWlteDgtcGNpZS5jIHwgMTY3Cj4g PiA+ICsrKysrKysrKysrKysrKysrKysrKysKPiA+ID4gwqAzIGZpbGVzIGNoYW5nZWQsIDE3NyBp bnNlcnRpb25zKCspCj4gPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2ZyZWVz Y2FsZS9waHktZnNsLWlteDgtcGNpZS5jCj4gPiAKPiA+IEZyb20gd2hhdCBJIGtub3csIHRoZXJl IGFyZSBzZXZlcmFsIHF1aXRlIGRpZmZlcmVudCBQQ0llIFBIWXMgdXNlZCBpbiB0aGUKPiA+IGRp ZmZlcmVudCBpLk1YOCB2YXJpYW50cy4gSSdtIG5vdCBzdXJlIGlmIHdlIHdhbnQgdG8gc3R1ZmYg dGhlbSBhbGwgaW50byBvbmUgZmlsZS4KPiA+IEkgZ3Vlc3Mgd2Ugc2hvdWxkIGJlIG1vcmUgc3Bl Y2lmaWMgaGVyZSBhbmQgY2FsbCB0aGlzIGlteDhtLXBoeSwgb3IgZXZlbgo+ID4gaW14OG1tLXBo eS4KPiBbUmljaGFyZCBaaHVdIEdvb2Qgc3VnZ2VzdGlvbnMsIEkgdGhpbmsgaW14OG0tcGh5IGlz IGJldHRlciwgc2luY2UgdGhlIGkuTVg4TVEvTU0vTVAKPiDCoGhhdmUgdGhlIHNpbWlsYXIgYXJj aGl0ZWN0dXJlIG9mIHRoZSBQQ0llIFBIWSBpbXBsZW1lbnRhdGlvbi4KPiAKPiA+IAo+ID4gPiAK PiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gPiA+IGIv ZHJpdmVycy9waHkvZnJlZXNjYWxlL0tjb25maWcgaW5kZXggMzIwNjMwZmZlM2NkLi5kYTA3OGE2 NzZmYmMKPiA+ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29u ZmlnCj4gPiA+ICsrKyBiL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gPiA+IEBAIC0x NCwzICsxNCwxMiBAQCBjb25maWcgUEhZX01JWEVMX01JUElfRFBIWQo+ID4gPiDCoAloZWxwCj4g PiA+IMKgCSAgRW5hYmxlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBNaXhlbCBEU0kgUEhZ IGFzIGZvdW5kCj4gPiA+IMKgCSAgb24gTlhQJ3MgaS5NWDggZmFtaWx5IG9mIFNPQ3MuCj4gPiA+ ICsKPiA+ID4gK2NvbmZpZyBQSFlfRlNMX0lNWDhfUENJRQo+ID4gPiArCXRyaXN0YXRlICJGcmVl c2NhbGUgaS5NWDggUENJRSBQSFkiCj4gPiA+ICsJZGVwZW5kcyBvbiBPRiAmJiBIQVNfSU9NRU0K PiA+ID4gKwlzZWxlY3QgR0VORVJJQ19QSFkKPiA+ID4gKwlkZWZhdWx0IEFSQ0hfTVhDCj4gPiA+ ICsJaGVscAo+ID4gPiArCSAgRW5hYmxlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBQQ0lF IFBIWSBhcyBmb3VuZCBvbiBpLk1YOAo+ID4gPiArCSAgZmFtaWx5IG9mIFNPQ3MuCj4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKPiA+ID4gYi9kcml2ZXJz L3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUgaW5kZXggMWQwMmUzODY5YjQ1Li45ZmQ0NjdiNTg2MjEK PiA+ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9NYWtlZmlsZQo+ ID4gPiArKysgYi9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKPiA+ID4gQEAgLTEsMyAr MSw0IEBACj4gPiA+IMKgIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4g PiA+IMKgb2JqLSQoQ09ORklHX1BIWV9GU0xfSU1YOE1RX1VTQikJKz0gcGh5LWZzbC1pbXg4bXEt dXNiLm8KPiA+ID4gwqBvYmotJChDT05GSUdfUEhZX01JWEVMX01JUElfRFBIWSkJKz0gcGh5LWZz bC1pbXg4LW1pcGktZHBoeS5vCj4gPiA+ICtvYmotJChDT05GSUdfUEhZX0ZTTF9JTVg4X1BDSUUp CQkrPSBwaHktZnNsLWlteDgtcGNpZS5vCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9m cmVlc2NhbGUvcGh5LWZzbC1pbXg4LXBjaWUuYwo+ID4gPiBiL2RyaXZlcnMvcGh5L2ZyZWVzY2Fs ZS9waHktZnNsLWlteDgtcGNpZS5jCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiA+IGlu ZGV4IDAwMDAwMDAwMDAwMC4uZmY0N2Q2YjgzNjg2Cj4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4g KysrIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL3BoeS1mc2wtaW14OC1wY2llLmMKPiA+ID4gQEAg LTAsMCArMSwxNjcgQEAKPiA+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w Kwo+ID4gPiArLyoKPiA+ID4gKyAqIENvcHlyaWdodCAyMDIxIE5YUAo+ID4gPiArICovCj4gPiA+ ICsKPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9p by5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ID4gPiArI2luY2x1ZGUgPGxp bnV4L2RlbGF5Lmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiA+ICsjaW5j bHVkZSA8bGludXgvcGh5L3BoeS5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgo+ID4gPiArI2luY2x1ZGUgPGR0LWJpbmRpbmcvcGh5L3BoeS1mc2wtaW14OC1wY2ll Lmg+Cj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjEJMHgx ODQKPiA+ID4gKyNkZWZpbmUgIEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4JQklUKDApCj4g PiA+ICsjZGVmaW5lIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYyCTB4MTg4Cj4gPiA+ICsjZGVm aW5lICBBTkFfUExMX0NMS19PVVRfVE9fRVhUX0lPX1NFTAlCSVQoMykKPiA+ID4gKyNkZWZpbmUg SU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjMJMHgxOEMKPiA+ID4gKyNkZWZpbmUgIEFVWF9QTExf UkVGQ0xLX1NFTF9TWVNfUExMCUdFTk1BU0soNywgNikKPiA+ID4gKyNkZWZpbmUgSU1YOE1NX1BD SUVfUEhZX0NNTl9SRUcwNjQJMHgxOTAKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfUlhfVFhfU0VM X1RYCQlCSVQoNykKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfUlhfVEVSTV9HTkRfRU4JCUJJVCgz KQo+ID4gPiArI2RlZmluZSAgQU5BX0FVWF9UWF9URVJNCQlCSVQoMikKPiA+ID4gKyNkZWZpbmUg SU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjUJMHgxOTQKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhf UlhfVEVSTQkJKEJJVCg3KSB8IEJJVCg0KSkKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfVFhfTFZM CQkJR0VOTUFTSygzLCAwKQo+ID4gPiArI2RlZmluZSBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzc1 CTB4MUQ0Cj4gPiA+ICsjZGVmaW5lICBQQ0lFX1BIWV9DTU5fUkVHNzVfUExMX0RPTkUJMHgzCj4g PiA+ICsjZGVmaW5lIFBDSUVfUEhZX1RSU1ZfUkVHNQkJMHg0MTQKPiA+ID4gKyNkZWZpbmUgIFBD SUVfUEhZX1RSU1ZfUkVHNV9HRU4xX0RFRU1QCTB4MkQKPiA+ID4gKyNkZWZpbmUgUENJRV9QSFlf VFJTVl9SRUc2CQkweDQxOAo+ID4gPiArI2RlZmluZSAgUENJRV9QSFlfVFJTVl9SRUc2X0dFTjJf REVFTVAJMHhGCj4gPiA+ICsKPiA+ID4gK3N0cnVjdCBpbXg4X3BjaWVfcGh5IHsKPiA+ID4gKwl1 MzIJCXJlZmNsa19wYWRfbW9kZTsKPiA+ID4gKwl2b2lkIF9faW9tZW0JKmJhc2U7Cj4gPiA+ICsJ c3RydWN0IGNsawkqY2xrOwo+ID4gPiArCXN0cnVjdCBwaHkJKnBoeTsKPiA+ID4gK307Cj4gPiA+ ICsKPiA+ID4gK3N0YXRpYyBpbnQgaW14OF9wY2llX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkg ewo+ID4gPiArCWludCByZXQ7Cj4gPiA+ICsJdTMyIHZhbDsKPiA+ID4gKwlzdHJ1Y3QgaW14OF9w Y2llX3BoeSAqaW14OF9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKPiA+ID4gKwo+ID4gPiAr CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dChpbXg4X3BoeS0+YmFzZSArCj4gPiBJTVg4TU1fUENJ RV9QSFlfQ01OX1JFRzc1LAo+ID4gPiArCQkJCSB2YWwsIHZhbCA9PSBQQ0lFX1BIWV9DTU5fUkVH NzVfUExMX0RPTkUsCj4gPiA+ICsJCQkJIDEwLCAyMDAwMCk7Cj4gPiA+ICsJcmV0dXJuIHJldDsK PiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X2NhbChzdHJ1 Y3QgcGh5ICpwaHkpIHsKPiA+ID4gKwl1MzIgdmFsdWUsIHBhZF9tb2RlOwo+ID4gPiArCXN0cnVj dCBpbXg4X3BjaWVfcGh5ICppbXg4X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ID4gPiAr Cj4gPiA+ICsJcGFkX21vZGUgPSBpbXg4X3BoeS0+cmVmY2xrX3BhZF9tb2RlOwo+ID4gPiArCWlm IChwYWRfbW9kZSA9PSBJTVg4X1BDSUVfUkVGQ0xLX1BBRF9JTlBVVCkgewo+ID4gPiArCQkvKiBD b25maWd1cmUgdGhlIHBhZCBhcyBpbnB1dCAqLwo+ID4gPiArCQl2YWx1ZSA9IHJlYWRsKGlteDhf cGh5LT5iYXNlICsKPiA+IElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ID4gKwkJd3Jp dGVsKHZhbHVlICYgfkFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4sCj4gPiA+ICsJCSAgICAg ICBpbXg4X3BoeS0+YmFzZSArIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ID4gKwl9 IGVsc2UgaWYgKHBhZF9tb2RlID09IElNWDhfUENJRV9SRUZDTEtfUEFEX09VVFBVVCkgewo+ID4g PiArCQkvKiBDb25maWd1cmUgdGhlIFBIWSB0byBvdXRwdXQgdGhlIHJlZmNsb2NrIHZpYSBwYWQg Ki8KPiA+ID4gKwkJd3JpdGVsKEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4sCj4gPiA+ICsJ CSAgICAgICBpbXg4X3BoeS0+YmFzZSArIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ ID4gKwkJd3JpdGVsKEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fU0VMLAo+ID4gPiArCQkgICAg ICAgaW14OF9waHktPmJhc2UgKyBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzA2Mik7Cj4gPiA+ICsJ CXdyaXRlbChBVVhfUExMX1JFRkNMS19TRUxfU1lTX1BMTCwKPiA+ID4gKwkJICAgICAgIGlteDhf cGh5LT5iYXNlICsgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjMpOwo+ID4gPiArCQl2YWx1ZSA9 IEFOQV9BVVhfUlhfVFhfU0VMX1RYIHwgQU5BX0FVWF9UWF9URVJNOwo+ID4gPiArCQl3cml0ZWwo dmFsdWUgfCBBTkFfQVVYX1JYX1RFUk1fR05EX0VOLAo+ID4gPiArCQkgICAgICAgaW14OF9waHkt PmJhc2UgKyBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzA2NCk7Cj4gPiA+ICsJCXdyaXRlbChBTkFf QVVYX1JYX1RFUk0gfCBBTkFfQVVYX1RYX0xWTCwKPiA+ID4gKwkJICAgICAgIGlteDhfcGh5LT5i YXNlICsgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjUpOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4g PiArCS8qIFR1bmUgUEhZIGRlLWVtcGhhc2lzIHNldHRpbmcgdG8gcGFzcyBQQ0llIGNvbXBsaWFu Y2UuICovCj4gPiA+ICsJd3JpdGVsKFBDSUVfUEhZX1RSU1ZfUkVHNV9HRU4xX0RFRU1QLAo+ID4g PiArCSAgICAgICBpbXg4X3BoeS0+YmFzZSArIFBDSUVfUEhZX1RSU1ZfUkVHNSk7Cj4gPiA+ICsJ d3JpdGVsKFBDSUVfUEhZX1RSU1ZfUkVHNl9HRU4yX0RFRU1QLAo+ID4gPiArCSAgICAgICBpbXg4 X3BoeS0+YmFzZSArIFBDSUVfUEhZX1RSU1ZfUkVHNik7Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4g MDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X3Bvd2Vy X29uKHN0cnVjdCBwaHkgKnBoeSkgewo+ID4gPiArCXN0cnVjdCBpbXg4X3BjaWVfcGh5ICppbXg4 X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ID4gPiArCj4gPiA+ICsJcmV0dXJuIGNsa19w cmVwYXJlX2VuYWJsZShpbXg4X3BoeS0+Y2xrKTsKPiA+IAo+ID4gRG8gd2UgbmVlZCB0byBlbmFi bGUgdGhpcyBjbG9jayB3aGVuIHRoZSByZWZjbG9jayBpcyBzdXBwbGllZCBleHRlcm5hbGx5IHZp YQo+ID4gdGhlIHBhZD8KPiA+IAo+IFtSaWNoYXJkIFpodV0gR29vZCBxdWVzdGlvbi4gSSB0aGlu ayB0aGlzIGNsb2NrIGlzIG5vdCBuZWVkZWQgYW55bW9yZSBpZiB0aGUgcmVmY2xvY2sgaXMgc291 cmNlZCBmcm9tIGV4dGVybmFsIE9TQy4KPiBJIGp1c3QgZW5hYmxlIHRoZSBQTEwyXzEwME1oeiBo ZXJlLCBzaW5jZSB3aGVuIGludGVybmFsIFBMTCBpcyB1c2VkIGFzIHJlZmNsb2NrLCB0aGUgcGxs Ml8xMDBNaHogc2hvdWxkIGJlIHR1cm5lZCBvbi4KPiBTaGFsbCBJIHJlbW92ZSB0aGUgc2V0dGlu ZyBhbmQganVzdCBrZWVwIHRoZSBjYWxsYmFjayBmb3IgZnVydGhlciBleHRlbmQgdXNhZ2UoaW50 ZXJuYWwgUExMIHVzZWQgYXMgcmVmY2xrKT8KPiAKWWVzLCB3ZSBzaG91bGQgYXZvaWQgdHVybmlu ZyBvbiBjbG9ja3MgdGhhdCBhcmVuJ3QgbmVlZGVkLiBTbyB0aGUgY2xvY2sKZW5hYmxlIGhlcmUg c2hvdWxkIGJlIGRlcGVuZGVudCBvbiB0aGUgcGFkLW1vZGUuIFdoZW4gdGhlIGNsb2NrIGlzCnN1 cHBsaWVkIGV4dGVybmFsbHkgd2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIGludGVybmFsIGNs b2NrLgoKUmVnYXJkcywKTHVjYXMKCj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQg aW14OF9wY2llX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KSB7Cj4gPiA+ICsJc3RydWN0 IGlteDhfcGNpZV9waHkgKmlteDhfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7Cj4gPiA+ICsK PiA+ID4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14OF9waHktPmNsayk7Cj4gPiA+ICsKPiA+ ID4gKwlyZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVj dCBwaHlfb3BzIGlteDhfcGNpZV9waHlfb3BzID0gewo+ID4gPiArCS5pbml0CQk9IGlteDhfcGNp ZV9waHlfaW5pdCwKPiA+ID4gKwkuY2FsaWJyYXRlCT0gaW14OF9wY2llX3BoeV9jYWwsCj4gPiA+ ICsJLnBvd2VyX29uCT0gaW14OF9wY2llX3BoeV9wb3dlcl9vbiwKPiA+ID4gKwkucG93ZXJfb2Zm CT0gaW14OF9wY2llX3BoeV9wb3dlcl9vZmYsCj4gPiA+ICsJLm93bmVyCQk9IFRISVNfTU9EVUxF LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHsKPiA+ID4gKwlzdHJ1Y3QgcGh5X3Byb3Zp ZGVyICpwaHlfcHJvdmlkZXI7Cj4gPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRl djsKPiA+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwo+ID4gPiAr CXN0cnVjdCBpbXg4X3BjaWVfcGh5ICppbXg4X3BoeTsKPiA+ID4gKwlzdHJ1Y3QgcmVzb3VyY2Ug KnJlczsKPiA+ID4gKwo+ID4gPiArCWlteDhfcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9m KCppbXg4X3BoeSksIEdGUF9LRVJORUwpOwo+ID4gPiArCWlmICghaW14OF9waHkpCj4gPiA+ICsJ CXJldHVybiAtRU5PTUVNOwo+ID4gPiArCj4gPiA+ICsJLyogZ2V0IFBIWSByZWZjbGsgcGFkIG1v ZGUgKi8KPiA+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxyZWZjbGstcGFkLW1v ZGUiLAo+ID4gPiArCQkJICAgICAmaW14OF9waHktPnJlZmNsa19wYWRfbW9kZSk7Cj4gPiA+ICsK PiA+ID4gKwlpbXg4X3BoeS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInBoeSIpOwo+ID4gPiAr CWlmIChJU19FUlIoaW14OF9waHktPmNsaykpIHsKPiA+ID4gKwkJZGV2X2VycihkZXYsICJmYWls ZWQgdG8gZ2V0IGlteCBwY2llIHBoeSBjbG9ja1xuIik7Cj4gPiA+ICsJCXJldHVybiBQVFJfRVJS KGlteDhfcGh5LT5jbGspOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Cj4gPiA+ICsJaW14OF9waHkt PmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwo+ID4gPiArCWlmIChJU19F UlIoaW14OF9waHktPmJhc2UpKQo+ID4gPiArCQlyZXR1cm4gUFRSX0VSUihpbXg4X3BoeS0+YmFz ZSk7Cj4gPiA+ICsKPiA+ID4gKwlpbXg4X3BoeS0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwg TlVMTCwgJmlteDhfcGNpZV9waHlfb3BzKTsKPiA+ID4gKwlpZiAoSVNfRVJSKGlteDhfcGh5LT5w aHkpKQo+ID4gPiArCQlyZXR1cm4gUFRSX0VSUihpbXg4X3BoeS0+cGh5KTsKPiA+ID4gKwo+ID4g PiArCXBoeV9zZXRfZHJ2ZGF0YShpbXg4X3BoeS0+cGh5LCBpbXg4X3BoeSk7Cj4gPiA+ICsKPiA+ ID4gKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsCj4g PiA+ICtvZl9waHlfc2ltcGxlX3hsYXRlKTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiBQVFJfRVJS X09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsgfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IG9mX2RldmljZV9pZCBpbXg4X3BjaWVfcGh5X29mX21hdGNoW10gPSB7Cj4gPiA+ICsJey5j b21wYXRpYmxlID0gImZzbCxpbXg4bW0tcGNpZS1waHkiLH0sCj4gPiA+ICsJeyB9LAo+ID4gPiAr fTsKPiA+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteDhfcGNpZV9waHlfb2ZfbWF0Y2gp Owo+ID4gPiArCj4gPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXg4X3BjaWVf cGh5X2RyaXZlciA9IHsKPiA+ID4gKwkucHJvYmUJPSBpbXg4X3BjaWVfcGh5X3Byb2JlLAo+ID4g PiArCS5kcml2ZXIgPSB7Cj4gPiA+ICsJCS5uYW1lCT0gImlteDgtcGNpZS1waHkiLAo+ID4gPiAr CQkub2ZfbWF0Y2hfdGFibGUJPSBpbXg4X3BjaWVfcGh5X29mX21hdGNoLAo+ID4gPiArCX0KPiA+ ID4gK307Cj4gPiA+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGlteDhfcGNpZV9waHlfZHJpdmVy KTsKPiA+ID4gKwo+ID4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJGU0wgSU1YOCBQQ0lFIFBIWSBk cml2ZXIiKTsKPiA+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiA+IAo+IAoKCgotLSAKbGlu dXgtcGh5IG1haWxpbmcgbGlzdApsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwczov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1waHkK 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8666C433F5 for ; Tue, 28 Sep 2021 08:46:26 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 9498260F12 for ; Tue, 28 Sep 2021 08:46:26 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 9498260F12 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:Cc:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=0xNzET+I3UnNOypb2Dh0Hang36dpVnLui1/r4B8jCLE=; b=U3GagHVzEZMTJd 9+KtIDKnNZy5ZTijlQLmbzs3GT5GTuqthwRCT3MAY0FroLHve1l2o5mfYuIGRM8uCRBQvsblVflPt efiA8EamchN2LDY1Ev90U9ttb+FP+S9epk0jVD1L+cHP0BZniE/kosAOgrhhcUrYgFi6MM7xNVBKR DVH6nk7O9l0gcYwiDKj12JmtKQz2hxOnAPuIWKPfCSVJpTfruL8IwRqPenpnmcZAsSlen8ceDed2m Djk/3UuDazIZsbWttm0/XlwNMwJpNRBUdxPvt3PAst0qlODvSCw6Okq5seuEhMqk1eE6Rry8zl8kx M1EKBhK3WVbmcw+a/QiA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mV8im-006IlP-GV; Tue, 28 Sep 2021 08:44:17 +0000 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mV8if-006IiL-LY for linux-arm-kernel@lists.infradead.org; Tue, 28 Sep 2021 08:44:12 +0000 Received: from gallifrey.ext.pengutronix.de ([2001:67c:670:201:5054:ff:fe8d:eefb] helo=[IPv6:::1]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mV8iS-00022c-EN; Tue, 28 Sep 2021 10:43:56 +0200 Message-ID: <2126add7b505fb27c4eb3fef459ac925b20818f8.camel@pengutronix.de> Subject: Re: [PATCH v2 4/4] phy: freescale: pcie: initialize the imx8 pcie standalone phy driver From: Lucas Stach To: Richard Zhu , "kishon@ti.com" , "vkoul@kernel.org" , "robh@kernel.org" , "galak@kernel.crashing.org" , "shawnguo@kernel.org" Cc: "linux-phy@lists.infradead.org" , "devicetree@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Date: Tue, 28 Sep 2021 10:43:54 +0200 In-Reply-To: References: <1632641983-1455-1-git-send-email-hongxing.zhu@nxp.com> <1632641983-1455-5-git-send-email-hongxing.zhu@nxp.com> User-Agent: Evolution 3.40.4 (3.40.4-1.fc34) MIME-Version: 1.0 X-SA-Exim-Connect-IP: 2001:67c:670:201:5054:ff:fe8d:eefb X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210928_014410_048613_193932E8 X-CRM114-Status: GOOD ( 55.76 ) 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-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgUmljaGFyZCwKCkFtIERpZW5zdGFnLCBkZW0gMjguMDkuMjAyMSB1bSAwNzowOSArMDAwMCBz Y2hyaWViIFJpY2hhcmQgWmh1Ogo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+IEZy b206IEx1Y2FzIFN0YWNoIDxsLnN0YWNoQHBlbmd1dHJvbml4LmRlPgo+ID4gU2VudDogTW9uZGF5 LCBTZXB0ZW1iZXIgMjcsIDIwMjEgNDo0MyBQTQo+ID4gVG86IFJpY2hhcmQgWmh1IDxob25neGlu Zy56aHVAbnhwLmNvbT47IGtpc2hvbkB0aS5jb207IHZrb3VsQGtlcm5lbC5vcmc7Cj4gPiByb2Jo QGtlcm5lbC5vcmc7IGdhbGFrQGtlcm5lbC5jcmFzaGluZy5vcmc7IHNoYXduZ3VvQGtlcm5lbC5v cmcKPiA+IENjOiBsaW51eC1waHlAbGlzdHMuaW5mcmFkZWFkLm9yZzsgZGV2aWNldHJlZUB2Z2Vy Lmtlcm5lbC5vcmc7Cj4gPiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGxp bnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7Cj4gPiBrZXJuZWxAcGVuZ3V0cm9uaXguZGU7IGRs LWxpbnV4LWlteCA8bGludXgtaW14QG54cC5jb20+Cj4gPiBTdWJqZWN0OiBSZTogW1BBVENIIHYy IDQvNF0gcGh5OiBmcmVlc2NhbGU6IHBjaWU6IGluaXRpYWxpemUgdGhlIGlteDggcGNpZQo+ID4g c3RhbmRhbG9uZSBwaHkgZHJpdmVyCj4gPiAKPiA+IEFtIFNvbm50YWcsIGRlbSAyNi4wOS4yMDIx IHVtIDE1OjM5ICswODAwIHNjaHJpZWIgUmljaGFyZCBaaHU6Cj4gPiA+IEFkZCB0aGUgc3RhbmRh bG9uZSBpLk1YOCBQQ0llIFBIWSBkcml2ZXIuCj4gPiA+IFNvbWUgcmVzZXQgYml0cyBzaG91bGQg YmUgbWFuaXB1bGF0ZWQgYmV0d2VlbiBQSFkgY29uZmlndXJhdGlvbnMgYW5kCj4gPiA+IHN0YXR1 cyBjaGVjayhpbnRlcm5hbCBQTEwgaXMgbG9ja2VkIG9yIG5vdCkuCj4gPiA+IFNvLCBkbyB0aGUg UEhZIGNvbmZpZ3VyYXRpb24gaW4gdGhlIHBoeV9jYWxpYnJhdGUoKS4KPiA+ID4gQW5kIGNoZWNr IHRoZSBQSFkgaXMgcmVhZHkgb3Igbm90IGluIHRoZSBwaHlfaW5pdCgpLgo+ID4gCj4gPiBJIHdv dWxkIHJlYWxseSBsaWtlIHRvIHNlZSB0aGUgUENJZSBjb250cm9sbGVyIGRyaXZlciBzaWRlIG9m IHRoaXMgYWxzbywgYXMgaXQncyBoYXJkCj4gPiB0byByZXZpZXcgc3RhbmRhbG9uZS4gRm9yIGV4 YW1wbGUgSSdtIG5vdCBzdXJlIGlmIHNvbWUgb2YgdGhvc2UgcmVzZXQgYml0cwo+ID4gc2hvdWxk IGFsc28gYmUgZHJpdmVuIGZyb20gdGhlIFBIWSBkcml2ZXIsIGV2ZW4gaWYgdGhleSBhcmUgY3Vy cmVudGx5IGhvb2tlZAo+ID4gdXAgdG8gdGhlIGNvbnRyb2xsZXIgZHJpdmVyLgo+ID4gCj4gPiBB bHNvIEkgdGhpbmsgdGhlIElPTVVYIEdQUiByZWdpc3RlciBoYW5kbGluZyBiZWxvbmdzIGluIHRo ZSBQSFkgZHJpdmVyLCBhcyBpdCdzCj4gPiBjb25maWd1cmluZyB0aGUgcmVmZXJlbmNlIGNsb2Nr IHJvdXRpbmcuCj4gPiAKPiBbUmljaGFyZCBaaHVdIFNvcnJ5IHRvIGJyaW5nIGluY29udmVuaWVu Y2UgdG8geW91LiBJIHdvdWxkIHNlbmQgb3V0IHRoZSB2Mwo+IMKgcGF0Y2gtc2V0IGFuZCB0aGUg aS5NWDhNTSBQQ0llIGNvbnRyb2xsZXIgZHJpdmVyIHBhdGNoZXMgYWZ0ZXIgSSdtIGJhY2sgZnJv bSB0aGUKPiDCoG5hdGlvbmFsIGhvbGlkYXkgdG9tb3Jyb3coYWJvdXQgb25lIHdlZWspLiAKCk5v IHByb2JsZW0uIDopIEknbSBqdXN0IHBvaW50aW5nIG91dCB0aGF0IEkgcHJvYmFibHkgd29uJ3Qg YmUgYWJsZSB0bwppbnZlc3QgbW9yZSB0aW1lIHJldmlld2luZyB0aGlzIGJlZm9yZSBJIGNhbiBn ZXQgdGhlIGZ1bGwgcGljdHVyZS4KCj4gQWx0aG91Z2ggbW9zdCBvZiB0aGUgSU9NVVggR1BSIGJp dHMgYXJlIHJlbGF0ZWQgdG8gUEhZLCBidXQgdGhlcmUgYXJlIHNvbWUgYml0cyBhcmUKPiDCoGRl ZmluZWQgb25seSBmb3IgY29udHJvbGxlci4gRm9yIGV4YW1wbGUsIHRoZSBkZXZpY2VfdHlwZSBv ZiB0aGUgY29udHJvbGxlciwgdGhlIGNsa3JlcSMKPiDCoHNpZ25hbCBjb250cm9sIGluIEwxU1Ms IGFuZCBzbyBvbi4gV2UgY2FuJ3QgZW5jYXBzdWxhdGUgYWxsIHRoZSBHUFIgYml0cyBzZXR0aW5n IGludG8gUEhZIGRyaXZlci4KPiBTbywgaXQncyBiZXR0ZXIgdG8gbGV0IGNvbnRyb2xsZXIgZHJp dmVyIHRvIGhhbmRsZSB0aGUgZ2VuZXJhbCByZWdpc3RlciBiaXRzIG1hbmlwdWxhdGlvbnMuCj4g SG93IGRvIHlvdSB0aGluayBhYm91dCB0aGF0PwoKSSBzdGlsbCB0aGluayB3ZSBzaG91bGQgc3Bs aXQgdGhlIGRyaXZlcnMgYWxvbmcgdGhlIGZ1bmN0aW9uYWwKYm91bmRhcmllcy4gSXQncyBxdWl0 ZSBjb25mdXNpbmcgYW5kIHByb2JhYmx5IGdvaW5nIHRvIGJlIGEgbWFpbnRlbmFuY2UKaXNzdWVz IHdoZW4gc29tZSBvZiB0aGUgUEhZIGhhbmRsaW5nIGJpdHMgYXJlIHN0aWxsIGxvY2F0ZWQgaW4g dGhlCmNvbnRyb2xsZXIgZHJpdmVyLCB3aGlsZSB3ZSBoYXZlIGEgc2VwYXJhdGUgUEhZIGRyaXZl ci4KCkFzIHRoZSBHUFIgcmVnaW9uIGlzIGhhbmRsZWQgYnkgYSByZWdtYXAgd2Ugc2hvdWxkIGhh dmUgbm8gaXNzdWVzCmFjY2Vzc2luZyBldmVuIHRoZSBzYW1lIHJlZ2lzdGVyIGZyb20gZGlmZmVy ZW50IGRyaXZlcnMuIFNvIG15IHZvdGUgaXMKb24gbW92aW5nIHRoZSBHUFIgYml0cyByZWxhdGVk IHRvIFBIWSBjbG9ja2luZyB0byB0aGlzIGRyaXZlci4KCj4gCj4gPiA+IAo+ID4gPiBTaWduZWQt b2ZmLWJ5OiBSaWNoYXJkIFpodSA8aG9uZ3hpbmcuemh1QG54cC5jb20+Cj4gPiA+IC0tLQo+ID4g PiDCoGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnICAgICAgICAgICAgIHwgICA5ICsrCj4g PiA+IMKgZHJpdmVycy9waHkvZnJlZXNjYWxlL01ha2VmaWxlICAgICAgICAgICAgfCAgIDEgKwo+ ID4gPiDCoGRyaXZlcnMvcGh5L2ZyZWVzY2FsZS9waHktZnNsLWlteDgtcGNpZS5jIHwgMTY3Cj4g PiA+ICsrKysrKysrKysrKysrKysrKysrKysKPiA+ID4gwqAzIGZpbGVzIGNoYW5nZWQsIDE3NyBp bnNlcnRpb25zKCspCj4gPiA+IMKgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvcGh5L2ZyZWVz Y2FsZS9waHktZnNsLWlteDgtcGNpZS5jCj4gPiAKPiA+IEZyb20gd2hhdCBJIGtub3csIHRoZXJl IGFyZSBzZXZlcmFsIHF1aXRlIGRpZmZlcmVudCBQQ0llIFBIWXMgdXNlZCBpbiB0aGUKPiA+IGRp ZmZlcmVudCBpLk1YOCB2YXJpYW50cy4gSSdtIG5vdCBzdXJlIGlmIHdlIHdhbnQgdG8gc3R1ZmYg dGhlbSBhbGwgaW50byBvbmUgZmlsZS4KPiA+IEkgZ3Vlc3Mgd2Ugc2hvdWxkIGJlIG1vcmUgc3Bl Y2lmaWMgaGVyZSBhbmQgY2FsbCB0aGlzIGlteDhtLXBoeSwgb3IgZXZlbgo+ID4gaW14OG1tLXBo eS4KPiBbUmljaGFyZCBaaHVdIEdvb2Qgc3VnZ2VzdGlvbnMsIEkgdGhpbmsgaW14OG0tcGh5IGlz IGJldHRlciwgc2luY2UgdGhlIGkuTVg4TVEvTU0vTVAKPiDCoGhhdmUgdGhlIHNpbWlsYXIgYXJj aGl0ZWN0dXJlIG9mIHRoZSBQQ0llIFBIWSBpbXBsZW1lbnRhdGlvbi4KPiAKPiA+IAo+ID4gPiAK PiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gPiA+IGIv ZHJpdmVycy9waHkvZnJlZXNjYWxlL0tjb25maWcgaW5kZXggMzIwNjMwZmZlM2NkLi5kYTA3OGE2 NzZmYmMKPiA+ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29u ZmlnCj4gPiA+ICsrKyBiL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9LY29uZmlnCj4gPiA+IEBAIC0x NCwzICsxNCwxMiBAQCBjb25maWcgUEhZX01JWEVMX01JUElfRFBIWQo+ID4gPiDCoAloZWxwCj4g PiA+IMKgCSAgRW5hYmxlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBNaXhlbCBEU0kgUEhZ IGFzIGZvdW5kCj4gPiA+IMKgCSAgb24gTlhQJ3MgaS5NWDggZmFtaWx5IG9mIFNPQ3MuCj4gPiA+ ICsKPiA+ID4gK2NvbmZpZyBQSFlfRlNMX0lNWDhfUENJRQo+ID4gPiArCXRyaXN0YXRlICJGcmVl c2NhbGUgaS5NWDggUENJRSBQSFkiCj4gPiA+ICsJZGVwZW5kcyBvbiBPRiAmJiBIQVNfSU9NRU0K PiA+ID4gKwlzZWxlY3QgR0VORVJJQ19QSFkKPiA+ID4gKwlkZWZhdWx0IEFSQ0hfTVhDCj4gPiA+ ICsJaGVscAo+ID4gPiArCSAgRW5hYmxlIHRoaXMgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBQQ0lF IFBIWSBhcyBmb3VuZCBvbiBpLk1YOAo+ID4gPiArCSAgZmFtaWx5IG9mIFNPQ3MuCj4gPiA+IGRp ZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKPiA+ID4gYi9kcml2ZXJz L3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUgaW5kZXggMWQwMmUzODY5YjQ1Li45ZmQ0NjdiNTg2MjEK PiA+ID4gMTAwNjQ0Cj4gPiA+IC0tLSBhL2RyaXZlcnMvcGh5L2ZyZWVzY2FsZS9NYWtlZmlsZQo+ ID4gPiArKysgYi9kcml2ZXJzL3BoeS9mcmVlc2NhbGUvTWFrZWZpbGUKPiA+ID4gQEAgLTEsMyAr MSw0IEBACj4gPiA+IMKgIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5Cj4g PiA+IMKgb2JqLSQoQ09ORklHX1BIWV9GU0xfSU1YOE1RX1VTQikJKz0gcGh5LWZzbC1pbXg4bXEt dXNiLm8KPiA+ID4gwqBvYmotJChDT05GSUdfUEhZX01JWEVMX01JUElfRFBIWSkJKz0gcGh5LWZz bC1pbXg4LW1pcGktZHBoeS5vCj4gPiA+ICtvYmotJChDT05GSUdfUEhZX0ZTTF9JTVg4X1BDSUUp CQkrPSBwaHktZnNsLWlteDgtcGNpZS5vCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BoeS9m cmVlc2NhbGUvcGh5LWZzbC1pbXg4LXBjaWUuYwo+ID4gPiBiL2RyaXZlcnMvcGh5L2ZyZWVzY2Fs ZS9waHktZnNsLWlteDgtcGNpZS5jCj4gPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiA+IGlu ZGV4IDAwMDAwMDAwMDAwMC4uZmY0N2Q2YjgzNjg2Cj4gPiA+IC0tLSAvZGV2L251bGwKPiA+ID4g KysrIGIvZHJpdmVycy9waHkvZnJlZXNjYWxlL3BoeS1mc2wtaW14OC1wY2llLmMKPiA+ID4gQEAg LTAsMCArMSwxNjcgQEAKPiA+ID4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w Kwo+ID4gPiArLyoKPiA+ID4gKyAqIENvcHlyaWdodCAyMDIxIE5YUAo+ID4gPiArICovCj4gPiA+ ICsKPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9p by5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+ID4gPiArI2luY2x1ZGUgPGxp bnV4L2RlbGF5Lmg+Cj4gPiA+ICsjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Cj4gPiA+ICsjaW5j bHVkZSA8bGludXgvcGh5L3BoeS5oPgo+ID4gPiArI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgo+ID4gPiArI2luY2x1ZGUgPGR0LWJpbmRpbmcvcGh5L3BoeS1mc2wtaW14OC1wY2ll Lmg+Cj4gPiA+ICsKPiA+ID4gKyNkZWZpbmUgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjEJMHgx ODQKPiA+ID4gKyNkZWZpbmUgIEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4JQklUKDApCj4g PiA+ICsjZGVmaW5lIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYyCTB4MTg4Cj4gPiA+ICsjZGVm aW5lICBBTkFfUExMX0NMS19PVVRfVE9fRVhUX0lPX1NFTAlCSVQoMykKPiA+ID4gKyNkZWZpbmUg SU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjMJMHgxOEMKPiA+ID4gKyNkZWZpbmUgIEFVWF9QTExf UkVGQ0xLX1NFTF9TWVNfUExMCUdFTk1BU0soNywgNikKPiA+ID4gKyNkZWZpbmUgSU1YOE1NX1BD SUVfUEhZX0NNTl9SRUcwNjQJMHgxOTAKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfUlhfVFhfU0VM X1RYCQlCSVQoNykKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfUlhfVEVSTV9HTkRfRU4JCUJJVCgz KQo+ID4gPiArI2RlZmluZSAgQU5BX0FVWF9UWF9URVJNCQlCSVQoMikKPiA+ID4gKyNkZWZpbmUg SU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjUJMHgxOTQKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhf UlhfVEVSTQkJKEJJVCg3KSB8IEJJVCg0KSkKPiA+ID4gKyNkZWZpbmUgIEFOQV9BVVhfVFhfTFZM CQkJR0VOTUFTSygzLCAwKQo+ID4gPiArI2RlZmluZSBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzc1 CTB4MUQ0Cj4gPiA+ICsjZGVmaW5lICBQQ0lFX1BIWV9DTU5fUkVHNzVfUExMX0RPTkUJMHgzCj4g PiA+ICsjZGVmaW5lIFBDSUVfUEhZX1RSU1ZfUkVHNQkJMHg0MTQKPiA+ID4gKyNkZWZpbmUgIFBD SUVfUEhZX1RSU1ZfUkVHNV9HRU4xX0RFRU1QCTB4MkQKPiA+ID4gKyNkZWZpbmUgUENJRV9QSFlf VFJTVl9SRUc2CQkweDQxOAo+ID4gPiArI2RlZmluZSAgUENJRV9QSFlfVFJTVl9SRUc2X0dFTjJf REVFTVAJMHhGCj4gPiA+ICsKPiA+ID4gK3N0cnVjdCBpbXg4X3BjaWVfcGh5IHsKPiA+ID4gKwl1 MzIJCXJlZmNsa19wYWRfbW9kZTsKPiA+ID4gKwl2b2lkIF9faW9tZW0JKmJhc2U7Cj4gPiA+ICsJ c3RydWN0IGNsawkqY2xrOwo+ID4gPiArCXN0cnVjdCBwaHkJKnBoeTsKPiA+ID4gK307Cj4gPiA+ ICsKPiA+ID4gK3N0YXRpYyBpbnQgaW14OF9wY2llX3BoeV9pbml0KHN0cnVjdCBwaHkgKnBoeSkg ewo+ID4gPiArCWludCByZXQ7Cj4gPiA+ICsJdTMyIHZhbDsKPiA+ID4gKwlzdHJ1Y3QgaW14OF9w Y2llX3BoeSAqaW14OF9waHkgPSBwaHlfZ2V0X2RydmRhdGEocGh5KTsKPiA+ID4gKwo+ID4gPiAr CXJldCA9IHJlYWRsX3BvbGxfdGltZW91dChpbXg4X3BoeS0+YmFzZSArCj4gPiBJTVg4TU1fUENJ RV9QSFlfQ01OX1JFRzc1LAo+ID4gPiArCQkJCSB2YWwsIHZhbCA9PSBQQ0lFX1BIWV9DTU5fUkVH NzVfUExMX0RPTkUsCj4gPiA+ICsJCQkJIDEwLCAyMDAwMCk7Cj4gPiA+ICsJcmV0dXJuIHJldDsK PiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X2NhbChzdHJ1 Y3QgcGh5ICpwaHkpIHsKPiA+ID4gKwl1MzIgdmFsdWUsIHBhZF9tb2RlOwo+ID4gPiArCXN0cnVj dCBpbXg4X3BjaWVfcGh5ICppbXg4X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ID4gPiAr Cj4gPiA+ICsJcGFkX21vZGUgPSBpbXg4X3BoeS0+cmVmY2xrX3BhZF9tb2RlOwo+ID4gPiArCWlm IChwYWRfbW9kZSA9PSBJTVg4X1BDSUVfUkVGQ0xLX1BBRF9JTlBVVCkgewo+ID4gPiArCQkvKiBD b25maWd1cmUgdGhlIHBhZCBhcyBpbnB1dCAqLwo+ID4gPiArCQl2YWx1ZSA9IHJlYWRsKGlteDhf cGh5LT5iYXNlICsKPiA+IElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ID4gKwkJd3Jp dGVsKHZhbHVlICYgfkFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4sCj4gPiA+ICsJCSAgICAg ICBpbXg4X3BoeS0+YmFzZSArIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ID4gKwl9 IGVsc2UgaWYgKHBhZF9tb2RlID09IElNWDhfUENJRV9SRUZDTEtfUEFEX09VVFBVVCkgewo+ID4g PiArCQkvKiBDb25maWd1cmUgdGhlIFBIWSB0byBvdXRwdXQgdGhlIHJlZmNsb2NrIHZpYSBwYWQg Ki8KPiA+ID4gKwkJd3JpdGVsKEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fRU4sCj4gPiA+ICsJ CSAgICAgICBpbXg4X3BoeS0+YmFzZSArIElNWDhNTV9QQ0lFX1BIWV9DTU5fUkVHMDYxKTsKPiA+ ID4gKwkJd3JpdGVsKEFOQV9QTExfQ0xLX09VVF9UT19FWFRfSU9fU0VMLAo+ID4gPiArCQkgICAg ICAgaW14OF9waHktPmJhc2UgKyBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzA2Mik7Cj4gPiA+ICsJ CXdyaXRlbChBVVhfUExMX1JFRkNMS19TRUxfU1lTX1BMTCwKPiA+ID4gKwkJICAgICAgIGlteDhf cGh5LT5iYXNlICsgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjMpOwo+ID4gPiArCQl2YWx1ZSA9 IEFOQV9BVVhfUlhfVFhfU0VMX1RYIHwgQU5BX0FVWF9UWF9URVJNOwo+ID4gPiArCQl3cml0ZWwo dmFsdWUgfCBBTkFfQVVYX1JYX1RFUk1fR05EX0VOLAo+ID4gPiArCQkgICAgICAgaW14OF9waHkt PmJhc2UgKyBJTVg4TU1fUENJRV9QSFlfQ01OX1JFRzA2NCk7Cj4gPiA+ICsJCXdyaXRlbChBTkFf QVVYX1JYX1RFUk0gfCBBTkFfQVVYX1RYX0xWTCwKPiA+ID4gKwkJICAgICAgIGlteDhfcGh5LT5i YXNlICsgSU1YOE1NX1BDSUVfUEhZX0NNTl9SRUcwNjUpOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4g PiArCS8qIFR1bmUgUEhZIGRlLWVtcGhhc2lzIHNldHRpbmcgdG8gcGFzcyBQQ0llIGNvbXBsaWFu Y2UuICovCj4gPiA+ICsJd3JpdGVsKFBDSUVfUEhZX1RSU1ZfUkVHNV9HRU4xX0RFRU1QLAo+ID4g PiArCSAgICAgICBpbXg4X3BoeS0+YmFzZSArIFBDSUVfUEhZX1RSU1ZfUkVHNSk7Cj4gPiA+ICsJ d3JpdGVsKFBDSUVfUEhZX1RSU1ZfUkVHNl9HRU4yX0RFRU1QLAo+ID4gPiArCSAgICAgICBpbXg4 X3BoeS0+YmFzZSArIFBDSUVfUEhZX1RSU1ZfUkVHNik7Cj4gPiA+ICsKPiA+ID4gKwlyZXR1cm4g MDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X3Bvd2Vy X29uKHN0cnVjdCBwaHkgKnBoeSkgewo+ID4gPiArCXN0cnVjdCBpbXg4X3BjaWVfcGh5ICppbXg4 X3BoeSA9IHBoeV9nZXRfZHJ2ZGF0YShwaHkpOwo+ID4gPiArCj4gPiA+ICsJcmV0dXJuIGNsa19w cmVwYXJlX2VuYWJsZShpbXg4X3BoeS0+Y2xrKTsKPiA+IAo+ID4gRG8gd2UgbmVlZCB0byBlbmFi bGUgdGhpcyBjbG9jayB3aGVuIHRoZSByZWZjbG9jayBpcyBzdXBwbGllZCBleHRlcm5hbGx5IHZp YQo+ID4gdGhlIHBhZD8KPiA+IAo+IFtSaWNoYXJkIFpodV0gR29vZCBxdWVzdGlvbi4gSSB0aGlu ayB0aGlzIGNsb2NrIGlzIG5vdCBuZWVkZWQgYW55bW9yZSBpZiB0aGUgcmVmY2xvY2sgaXMgc291 cmNlZCBmcm9tIGV4dGVybmFsIE9TQy4KPiBJIGp1c3QgZW5hYmxlIHRoZSBQTEwyXzEwME1oeiBo ZXJlLCBzaW5jZSB3aGVuIGludGVybmFsIFBMTCBpcyB1c2VkIGFzIHJlZmNsb2NrLCB0aGUgcGxs Ml8xMDBNaHogc2hvdWxkIGJlIHR1cm5lZCBvbi4KPiBTaGFsbCBJIHJlbW92ZSB0aGUgc2V0dGlu ZyBhbmQganVzdCBrZWVwIHRoZSBjYWxsYmFjayBmb3IgZnVydGhlciBleHRlbmQgdXNhZ2UoaW50 ZXJuYWwgUExMIHVzZWQgYXMgcmVmY2xrKT8KPiAKWWVzLCB3ZSBzaG91bGQgYXZvaWQgdHVybmlu ZyBvbiBjbG9ja3MgdGhhdCBhcmVuJ3QgbmVlZGVkLiBTbyB0aGUgY2xvY2sKZW5hYmxlIGhlcmUg c2hvdWxkIGJlIGRlcGVuZGVudCBvbiB0aGUgcGFkLW1vZGUuIFdoZW4gdGhlIGNsb2NrIGlzCnN1 cHBsaWVkIGV4dGVybmFsbHkgd2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhlIGludGVybmFsIGNs b2NrLgoKUmVnYXJkcywKTHVjYXMKCj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK3N0YXRpYyBpbnQg aW14OF9wY2llX3BoeV9wb3dlcl9vZmYoc3RydWN0IHBoeSAqcGh5KSB7Cj4gPiA+ICsJc3RydWN0 IGlteDhfcGNpZV9waHkgKmlteDhfcGh5ID0gcGh5X2dldF9kcnZkYXRhKHBoeSk7Cj4gPiA+ICsK PiA+ID4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoaW14OF9waHktPmNsayk7Cj4gPiA+ICsKPiA+ ID4gKwlyZXR1cm4gMDsKPiA+ID4gK30KPiA+ID4gKwo+ID4gPiArc3RhdGljIGNvbnN0IHN0cnVj dCBwaHlfb3BzIGlteDhfcGNpZV9waHlfb3BzID0gewo+ID4gPiArCS5pbml0CQk9IGlteDhfcGNp ZV9waHlfaW5pdCwKPiA+ID4gKwkuY2FsaWJyYXRlCT0gaW14OF9wY2llX3BoeV9jYWwsCj4gPiA+ ICsJLnBvd2VyX29uCT0gaW14OF9wY2llX3BoeV9wb3dlcl9vbiwKPiA+ID4gKwkucG93ZXJfb2Zm CT0gaW14OF9wY2llX3BoeV9wb3dlcl9vZmYsCj4gPiA+ICsJLm93bmVyCQk9IFRISVNfTU9EVUxF LAo+ID4gPiArfTsKPiA+ID4gKwo+ID4gPiArc3RhdGljIGludCBpbXg4X3BjaWVfcGh5X3Byb2Jl KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpIHsKPiA+ID4gKwlzdHJ1Y3QgcGh5X3Byb3Zp ZGVyICpwaHlfcHJvdmlkZXI7Cj4gPiA+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRl djsKPiA+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gZGV2LT5vZl9ub2RlOwo+ID4gPiAr CXN0cnVjdCBpbXg4X3BjaWVfcGh5ICppbXg4X3BoeTsKPiA+ID4gKwlzdHJ1Y3QgcmVzb3VyY2Ug KnJlczsKPiA+ID4gKwo+ID4gPiArCWlteDhfcGh5ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9m KCppbXg4X3BoeSksIEdGUF9LRVJORUwpOwo+ID4gPiArCWlmICghaW14OF9waHkpCj4gPiA+ICsJ CXJldHVybiAtRU5PTUVNOwo+ID4gPiArCj4gPiA+ICsJLyogZ2V0IFBIWSByZWZjbGsgcGFkIG1v ZGUgKi8KPiA+ID4gKwlvZl9wcm9wZXJ0eV9yZWFkX3UzMihucCwgImZzbCxyZWZjbGstcGFkLW1v ZGUiLAo+ID4gPiArCQkJICAgICAmaW14OF9waHktPnJlZmNsa19wYWRfbW9kZSk7Cj4gPiA+ICsK PiA+ID4gKwlpbXg4X3BoeS0+Y2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgInBoeSIpOwo+ID4gPiAr CWlmIChJU19FUlIoaW14OF9waHktPmNsaykpIHsKPiA+ID4gKwkJZGV2X2VycihkZXYsICJmYWls ZWQgdG8gZ2V0IGlteCBwY2llIHBoeSBjbG9ja1xuIik7Cj4gPiA+ICsJCXJldHVybiBQVFJfRVJS KGlteDhfcGh5LT5jbGspOwo+ID4gPiArCX0KPiA+ID4gKwo+ID4gPiArCXJlcyA9IHBsYXRmb3Jt X2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Cj4gPiA+ICsJaW14OF9waHkt PmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoZGV2LCByZXMpOwo+ID4gPiArCWlmIChJU19F UlIoaW14OF9waHktPmJhc2UpKQo+ID4gPiArCQlyZXR1cm4gUFRSX0VSUihpbXg4X3BoeS0+YmFz ZSk7Cj4gPiA+ICsKPiA+ID4gKwlpbXg4X3BoeS0+cGh5ID0gZGV2bV9waHlfY3JlYXRlKGRldiwg TlVMTCwgJmlteDhfcGNpZV9waHlfb3BzKTsKPiA+ID4gKwlpZiAoSVNfRVJSKGlteDhfcGh5LT5w aHkpKQo+ID4gPiArCQlyZXR1cm4gUFRSX0VSUihpbXg4X3BoeS0+cGh5KTsKPiA+ID4gKwo+ID4g PiArCXBoeV9zZXRfZHJ2ZGF0YShpbXg4X3BoeS0+cGh5LCBpbXg4X3BoeSk7Cj4gPiA+ICsKPiA+ ID4gKwlwaHlfcHJvdmlkZXIgPSBkZXZtX29mX3BoeV9wcm92aWRlcl9yZWdpc3RlcihkZXYsCj4g PiA+ICtvZl9waHlfc2ltcGxlX3hsYXRlKTsKPiA+ID4gKwo+ID4gPiArCXJldHVybiBQVFJfRVJS X09SX1pFUk8ocGh5X3Byb3ZpZGVyKTsgfQo+ID4gPiArCj4gPiA+ICtzdGF0aWMgY29uc3Qgc3Ry dWN0IG9mX2RldmljZV9pZCBpbXg4X3BjaWVfcGh5X29mX21hdGNoW10gPSB7Cj4gPiA+ICsJey5j b21wYXRpYmxlID0gImZzbCxpbXg4bW0tcGNpZS1waHkiLH0sCj4gPiA+ICsJeyB9LAo+ID4gPiAr fTsKPiA+ID4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGlteDhfcGNpZV9waHlfb2ZfbWF0Y2gp Owo+ID4gPiArCj4gPiA+ICtzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXg4X3BjaWVf cGh5X2RyaXZlciA9IHsKPiA+ID4gKwkucHJvYmUJPSBpbXg4X3BjaWVfcGh5X3Byb2JlLAo+ID4g PiArCS5kcml2ZXIgPSB7Cj4gPiA+ICsJCS5uYW1lCT0gImlteDgtcGNpZS1waHkiLAo+ID4gPiAr CQkub2ZfbWF0Y2hfdGFibGUJPSBpbXg4X3BjaWVfcGh5X29mX21hdGNoLAo+ID4gPiArCX0KPiA+ ID4gK307Cj4gPiA+ICttb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGlteDhfcGNpZV9waHlfZHJpdmVy KTsKPiA+ID4gKwo+ID4gPiArTU9EVUxFX0RFU0NSSVBUSU9OKCJGU0wgSU1YOCBQQ0lFIFBIWSBk cml2ZXIiKTsKPiA+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKPiA+IAo+IAoKCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVs IG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==