From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A5C1E1863 for ; Mon, 21 Aug 2023 10:34:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1767DC433C8; Mon, 21 Aug 2023 10:34:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692614055; bh=V8jNWGK/w70MbYYsY5Sv9WvKJR1us7t+YIKDHFfEVFU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=BzKRQSkZS3pcsylS9Xb+eR147O/3mSfYsNTa1bJGyqpgZg/dlEZJc547PrNkbTaHm kjuw1J7vSzfs+AGn9JPQMJ1wKbUxfrY6fO85oFSrdBnIprBSwHZHetYNhwbMkhZrzI QqTabHLZ9lHUO1zfW5CudtwoqV1UGwwNQZoql1/lXcTnunHnzLczuAwGS9reYFFAEu yfOWfj8WtE/IbP4y2z8j6EgqxJKQU41qwZ5wzeGSQ+hsoNrOxsHiKqHYIdaXdtLoAj 5L6Rocg+E979zg0I1X25lgmkUaQO6sE+58K/N067nzlYmQpHuVdXBmiOpF1N96P1us eRs9e4GZEYbwA== Date: Mon, 21 Aug 2023 16:03:57 +0530 From: Manivannan Sadhasivam To: Lorenzo Pieralisi Cc: Frank Li , manivannan.sadhasivam@linaro.org, helgaas@kernel.org, bhelgaas@google.com, devicetree@vger.kernel.org, gustavo.pimentel@synopsys.com, imx@lists.linux.dev, kw@linux.com, leoyang.li@nxp.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, minghuan.lian@nxp.com, mingkai.hu@nxp.com, robh+dt@kernel.org, roy.zang@nxp.com, shawnguo@kernel.org, zhiqiang.hou@nxp.com Subject: Re: [PATCH v11 3/3] PCI: layerscape: Add power management support for ls1028a Message-ID: <20230821103357.GA36455@thinkpad> References: <20230809153540.834653-1-Frank.Li@nxp.com> <20230809153540.834653-4-Frank.Li@nxp.com> Precedence: bulk X-Mailing-List: imx@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Mon, Aug 21, 2023 at 10:21:05AM +0200, Lorenzo Pieralisi wrote: > On Thu, Aug 17, 2023 at 06:42:50PM -0400, Frank Li wrote: > > On Wed, Aug 16, 2023 at 05:30:10PM +0200, Lorenzo Pieralisi wrote: > > > On Wed, Aug 09, 2023 at 11:35:40AM -0400, Frank Li wrote: > > > > From: Hou Zhiqiang > > > > > > > > Add PME_Turn_off/PME_TO_Ack handshake sequence for ls1028a platform. Call > > > > common dwc dw_pcie_suspend(resume)_noirq() function when system enter/exit > > > > suspend state. > > > > > > > > Acked-by: Manivannan Sadhasivam > > > > Signed-off-by: Hou Zhiqiang > > > > Signed-off-by: Frank Li > > > > --- > > > > drivers/pci/controller/dwc/pci-layerscape.c | 130 ++++++++++++++++++-- > > > > 1 file changed, 121 insertions(+), 9 deletions(-) > > > > > > > > diff --git a/drivers/pci/controller/dwc/pci-layerscape.c b/drivers/pci/controller/dwc/pci-layerscape.c > > > > index ed5fb492fe084..b49f654335fd7 100644 > > > > --- a/drivers/pci/controller/dwc/pci-layerscape.c > > > > +++ b/drivers/pci/controller/dwc/pci-layerscape.c > > > > @@ -8,9 +8,11 @@ > > > > * Author: Minghuan Lian > > > > */ > > > > > > > > +#include > > > > #include > > > > #include > > > > #include > > > > +#include > > > > #include > > > > #include > > > > #include > > > > @@ -20,6 +22,7 @@ > > > > #include > > > > #include > > > > > > > > +#include "../../pci.h" > > > > #include "pcie-designware.h" > > > > > > > > /* PEX Internal Configuration Registers */ > > > > @@ -27,12 +30,26 @@ > > > > #define PCIE_ABSERR 0x8d0 /* Bridge Slave Error Response Register */ > > > > #define PCIE_ABSERR_SETTING 0x9401 /* Forward error of non-posted request */ > > > > > > > > +/* PF Message Command Register */ > > > > +#define LS_PCIE_PF_MCR 0x2c > > > > +#define PF_MCR_PTOMR BIT(0) > > > > +#define PF_MCR_EXL2S BIT(1) > > > > + > > > > #define PCIE_IATU_NUM 6 > > > > > > > > +struct ls_pcie_drvdata { > > > > + const u32 pf_off; > > > > + bool pm_support; > > > > +}; > > > > + > > > > struct ls_pcie { > > > > struct dw_pcie *pci; > > > > + const struct ls_pcie_drvdata *drvdata; > > > > + void __iomem *pf_base; > > > > + bool big_endian; > > > > }; > > > > > > > > +#define ls_pcie_pf_readl_addr(addr) ls_pcie_pf_readl(pcie, addr) > > > > #define to_ls_pcie(x) dev_get_drvdata((x)->dev) > > > > > > > > static bool ls_pcie_is_bridge(struct ls_pcie *pcie) > > > > @@ -73,6 +90,60 @@ static void ls_pcie_fix_error_response(struct ls_pcie *pcie) > > > > iowrite32(PCIE_ABSERR_SETTING, pci->dbi_base + PCIE_ABSERR); > > > > } > > > > > > > > +static u32 ls_pcie_pf_readl(struct ls_pcie *pcie, u32 off) > > > > +{ > > > > + if (pcie->big_endian) > > > > + return ioread32be(pcie->pf_base + off); > > > > + > > > > + return ioread32(pcie->pf_base + off); > > > > +} > > > > + > > > > +static void ls_pcie_pf_writel(struct ls_pcie *pcie, u32 off, u32 val) > > > > +{ > > > > + if (pcie->big_endian) > > > > + iowrite32be(val, pcie->pf_base + off); > > > > + else > > > > + iowrite32(val, pcie->pf_base + off); > > > > +} > > > > + > > > > +static void ls_pcie_send_turnoff_msg(struct dw_pcie_rp *pp) > > > > +{ > > > > + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); > > > > + struct ls_pcie *pcie = to_ls_pcie(pci); > > > > + u32 val; > > > > + int ret; > > > > + > > > > + val = ls_pcie_pf_readl(pcie, LS_PCIE_PF_MCR); > > > > + val |= PF_MCR_PTOMR; > > > > + ls_pcie_pf_writel(pcie, LS_PCIE_PF_MCR, val); > > > > + > > > > + ret = readx_poll_timeout(ls_pcie_pf_readl_addr, LS_PCIE_PF_MCR, > > > > + val, !(val & PF_MCR_PTOMR), > > > > + PCIE_PME_TO_L2_TIMEOUT_US/10, > > > > + PCIE_PME_TO_L2_TIMEOUT_US); > > > > + if (ret) > > > > + dev_err(pcie->pci->dev, "PME_Turn_off timeout\n"); > > > > +} > > > > + > > > > +static void ls_pcie_exit_from_l2(struct dw_pcie_rp *pp) > > > > +{ > > > > + struct dw_pcie *pci = to_dw_pcie_from_pp(pp); > > > > + struct ls_pcie *pcie = to_ls_pcie(pci); > > > > + u32 val; > > > > + int ret; > > > > + > > > > + val = ls_pcie_pf_readl(pcie, LS_PCIE_PF_MCR); > > > > + val |= PF_MCR_EXL2S; > > > > + ls_pcie_pf_writel(pcie, LS_PCIE_PF_MCR, val); > > > > > > What is this write transaction generating in HW ? > > > > I don't think send anything to to pci bus because it was called before > > host init. > > > > The spec of ls1028 is not clear enough. > > > > `EXL2S: exit l2 state command. when set to 1, an L2 exit command is > > generated. The bit is self clearing. Once the bit is set. SW needs to wait > > for the bit to selfclear before sending a new command' > > > > > > > > Why is it needed ? Shouldn't L2 exit happen automatically > > > in HW ? > > > > I tried remove this, PCI can't resume. I think this is specific for ls1028 > > chip to clear internal logic. > > Well, if you don't even know what this does how can you write a sane > device driver ? > > Can you ask designers a more detailed description please ? > I often encounter hw quirks like this one and the hw designers will just say that "set bit X to make Y happpen". IMO a comment saying that the driver need to set PF_MCR_EXL2S bit in LS_PCIE_PF_MCR register for the link to exit L2 state is good enough. > > > > + > > > > + ret = readx_poll_timeout(ls_pcie_pf_readl_addr, LS_PCIE_PF_MCR, > > > > + val, !(val & PF_MCR_EXL2S), > > > > + PCIE_PME_TO_L2_TIMEOUT_US/10, > > > > + PCIE_PME_TO_L2_TIMEOUT_US); > > > > > > And why is the timeout value the same used for the PME_turn_off message ? > > > > I think No spec define it, just reused it. use PCIE_PME_TO_L2_TIMEOUT_US > > may cause confuse. What's do you prefered? Just use number,such as 10ms. > > This delay value is misleading, it is not good to reuse a value for > a delay that is most certainly controller specific. > > From this discussion I would say that having pme_turn_off() and > exit_from_l2() hooks is generalizing something we don't know yet > it is needed for all DWC based controllers. > > It is probably worth keeping the layerscape specific changes in > the layerscape driver and from there call the "generic" DWC > suspend/resume functions: > > dw_pcie_suspend_noirq() > dw_pcie_resume_noirq() > > rather than adding hooks that we barely know what they are needed for. > > Mani, what do you think ? > PME_Turn_off procedure may vary between controllers and is really required from core DWC perspective. So I'd prefer to keep the pme_turn_off() callback and leave exit_from_l2() since later seems to be only required for layerscape. - Mani -- மணிவண்ணன் சதாசிவம் 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 3F0DAEE4996 for ; Mon, 21 Aug 2023 10:34:42 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=uGzZ8YGLuY5uRMU94sCOOCV22j4Sxhgu3rxfEW/Tv9s=; b=YodYiBM+2z5kZI WLCTJti4qtOC4jvm1yeIMzQvJ5xeUi3HThPerUXejwxNt9lCx5JCVPSU9AUZl/qXsi6ofTTR7KylC bY/m25k+SwHXWTfasth8t/qjn1KY4sdtrJ8VDbCRHc84UhNcSalgspxlLfLuTouAr7roU9Q/I+7oP NVn/GbHyykM1LVnZH6emBCAJttMMO6cp85d2xsFmQ2Be77ol9SI+gX0E2wSKNK61jYcfnW/lwdNcs 9c9SIiZdCWvCWiHFZSx37Lmud+11ELW8k1lLgxj+UoHmp7VmPA5OQ2gaz12mitYNKsfUoKnoLPUjf OCsbotOebl0FLEDyYwxQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qY2Eo-00DloF-2P; Mon, 21 Aug 2023 10:34:22 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qY2Ei-00DljU-38 for linux-arm-kernel@lists.infradead.org; Mon, 21 Aug 2023 10:34:21 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E033C63040; Mon, 21 Aug 2023 10:34:15 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1767DC433C8; Mon, 21 Aug 2023 10:34:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1692614055; bh=V8jNWGK/w70MbYYsY5Sv9WvKJR1us7t+YIKDHFfEVFU=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=BzKRQSkZS3pcsylS9Xb+eR147O/3mSfYsNTa1bJGyqpgZg/dlEZJc547PrNkbTaHm kjuw1J7vSzfs+AGn9JPQMJ1wKbUxfrY6fO85oFSrdBnIprBSwHZHetYNhwbMkhZrzI QqTabHLZ9lHUO1zfW5CudtwoqV1UGwwNQZoql1/lXcTnunHnzLczuAwGS9reYFFAEu yfOWfj8WtE/IbP4y2z8j6EgqxJKQU41qwZ5wzeGSQ+hsoNrOxsHiKqHYIdaXdtLoAj 5L6Rocg+E979zg0I1X25lgmkUaQO6sE+58K/N067nzlYmQpHuVdXBmiOpF1N96P1us eRs9e4GZEYbwA== Date: Mon, 21 Aug 2023 16:03:57 +0530 From: Manivannan Sadhasivam To: Lorenzo Pieralisi Cc: Frank Li , manivannan.sadhasivam@linaro.org, helgaas@kernel.org, bhelgaas@google.com, devicetree@vger.kernel.org, gustavo.pimentel@synopsys.com, imx@lists.linux.dev, kw@linux.com, leoyang.li@nxp.com, linux-arm-kernel@lists.infradead.org, linux-imx@nxp.com, linux-kernel@vger.kernel.org, linux-pci@vger.kernel.org, lorenzo.pieralisi@arm.com, minghuan.lian@nxp.com, mingkai.hu@nxp.com, robh+dt@kernel.org, roy.zang@nxp.com, shawnguo@kernel.org, zhiqiang.hou@nxp.com Subject: Re: [PATCH v11 3/3] PCI: layerscape: Add power management support for ls1028a Message-ID: <20230821103357.GA36455@thinkpad> References: <20230809153540.834653-1-Frank.Li@nxp.com> <20230809153540.834653-4-Frank.Li@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230821_033417_123733_0931E551 X-CRM114-Status: GOOD ( 46.36 ) 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 T24gTW9uLCBBdWcgMjEsIDIwMjMgYXQgMTA6MjE6MDVBTSArMDIwMCwgTG9yZW56byBQaWVyYWxp c2kgd3JvdGU6Cj4gT24gVGh1LCBBdWcgMTcsIDIwMjMgYXQgMDY6NDI6NTBQTSAtMDQwMCwgRnJh bmsgTGkgd3JvdGU6Cj4gPiBPbiBXZWQsIEF1ZyAxNiwgMjAyMyBhdCAwNTozMDoxMFBNICswMjAw LCBMb3JlbnpvIFBpZXJhbGlzaSB3cm90ZToKPiA+ID4gT24gV2VkLCBBdWcgMDksIDIwMjMgYXQg MTE6MzU6NDBBTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+ID4gRnJvbTogSG91IFpoaXFp YW5nIDxaaGlxaWFuZy5Ib3VAbnhwLmNvbT4KPiA+ID4gPiAKPiA+ID4gPiBBZGQgUE1FX1R1cm5f b2ZmL1BNRV9UT19BY2sgaGFuZHNoYWtlIHNlcXVlbmNlIGZvciBsczEwMjhhIHBsYXRmb3JtLiBD YWxsCj4gPiA+ID4gY29tbW9uIGR3YyBkd19wY2llX3N1c3BlbmQocmVzdW1lKV9ub2lycSgpIGZ1 bmN0aW9uIHdoZW4gc3lzdGVtIGVudGVyL2V4aXQKPiA+ID4gPiBzdXNwZW5kIHN0YXRlLgo+ID4g PiA+IAo+ID4gPiA+IEFja2VkLWJ5OiBNYW5pdmFubmFuIFNhZGhhc2l2YW0gPG1hbmlAa2VybmVs Lm9yZz4KPiA+ID4gPiBTaWduZWQtb2ZmLWJ5OiBIb3UgWmhpcWlhbmcgPFpoaXFpYW5nLkhvdUBu eHAuY29tPgo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEZyYW5rIExpIDxGcmFuay5MaUBueHAuY29t Pgo+ID4gPiA+IC0tLQo+ID4gPiA+ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktbGF5 ZXJzY2FwZS5jIHwgMTMwICsrKysrKysrKysrKysrKysrKy0tCj4gPiA+ID4gIDEgZmlsZSBjaGFu Z2VkLCAxMjEgaW5zZXJ0aW9ucygrKSwgOSBkZWxldGlvbnMoLSkKPiA+ID4gPiAKPiA+ID4gPiBk aWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWxheWVyc2NhcGUuYyBi L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1sYXllcnNjYXBlLmMKPiA+ID4gPiBpbmRl eCBlZDVmYjQ5MmZlMDg0Li5iNDlmNjU0MzM1ZmQ3IDEwMDY0NAo+ID4gPiA+IC0tLSBhL2RyaXZl cnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1sYXllcnNjYXBlLmMKPiA+ID4gPiArKysgYi9kcml2 ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktbGF5ZXJzY2FwZS5jCj4gPiA+ID4gQEAgLTgsOSAr OCwxMSBAQAo+ID4gPiA+ICAgKiBBdXRob3I6IE1pbmdodWFuIExpYW4gPE1pbmdodWFuLkxpYW5A ZnJlZXNjYWxlLmNvbT4KPiA+ID4gPiAgICovCj4gPiA+ID4gIAo+ID4gPiA+ICsjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ID4gPiA+ ICAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cj4gPiA+ID4gICNpbmNsdWRlIDxsaW51eC9p bml0Lmg+Cj4gPiA+ID4gKyNpbmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KPiA+ID4gPiAgI2luY2x1 ZGUgPGxpbnV4L29mX3BjaS5oPgo+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0u aD4KPiA+ID4gPiAgI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KPiA+ID4gPiBAQCAtMjAs NiArMjIsNyBAQAo+ID4gPiA+ICAjaW5jbHVkZSA8bGludXgvbWZkL3N5c2Nvbi5oPgo+ID4gPiA+ ICAjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+Cj4gPiA+ID4gIAo+ID4gPiA+ICsjaW5jbHVkZSAi Li4vLi4vcGNpLmgiCj4gPiA+ID4gICNpbmNsdWRlICJwY2llLWRlc2lnbndhcmUuaCIKPiA+ID4g PiAgCj4gPiA+ID4gIC8qIFBFWCBJbnRlcm5hbCBDb25maWd1cmF0aW9uIFJlZ2lzdGVycyAqLwo+ ID4gPiA+IEBAIC0yNywxMiArMzAsMjYgQEAKPiA+ID4gPiAgI2RlZmluZSBQQ0lFX0FCU0VSUgkJ MHg4ZDAgLyogQnJpZGdlIFNsYXZlIEVycm9yIFJlc3BvbnNlIFJlZ2lzdGVyICovCj4gPiA+ID4g ICNkZWZpbmUgUENJRV9BQlNFUlJfU0VUVElORwkweDk0MDEgLyogRm9yd2FyZCBlcnJvciBvZiBu b24tcG9zdGVkIHJlcXVlc3QgKi8KPiA+ID4gPiAgCj4gPiA+ID4gKy8qIFBGIE1lc3NhZ2UgQ29t bWFuZCBSZWdpc3RlciAqLwo+ID4gPiA+ICsjZGVmaW5lIExTX1BDSUVfUEZfTUNSCQkweDJjCj4g PiA+ID4gKyNkZWZpbmUgUEZfTUNSX1BUT01SCQlCSVQoMCkKPiA+ID4gPiArI2RlZmluZSBQRl9N Q1JfRVhMMlMJCUJJVCgxKQo+ID4gPiA+ICsKPiA+ID4gPiAgI2RlZmluZSBQQ0lFX0lBVFVfTlVN CQk2Cj4gPiA+ID4gIAo+ID4gPiA+ICtzdHJ1Y3QgbHNfcGNpZV9kcnZkYXRhIHsKPiA+ID4gPiAr CWNvbnN0IHUzMiBwZl9vZmY7Cj4gPiA+ID4gKwlib29sIHBtX3N1cHBvcnQ7Cj4gPiA+ID4gK307 Cj4gPiA+ID4gKwo+ID4gPiA+ICBzdHJ1Y3QgbHNfcGNpZSB7Cj4gPiA+ID4gIAlzdHJ1Y3QgZHdf cGNpZSAqcGNpOwo+ID4gPiA+ICsJY29uc3Qgc3RydWN0IGxzX3BjaWVfZHJ2ZGF0YSAqZHJ2ZGF0 YTsKPiA+ID4gPiArCXZvaWQgX19pb21lbSAqcGZfYmFzZTsKPiA+ID4gPiArCWJvb2wgYmlnX2Vu ZGlhbjsKPiA+ID4gPiAgfTsKPiA+ID4gPiAgCj4gPiA+ID4gKyNkZWZpbmUgbHNfcGNpZV9wZl9y ZWFkbF9hZGRyKGFkZHIpCWxzX3BjaWVfcGZfcmVhZGwocGNpZSwgYWRkcikKPiA+ID4gPiAgI2Rl ZmluZSB0b19sc19wY2llKHgpCWRldl9nZXRfZHJ2ZGF0YSgoeCktPmRldikKPiA+ID4gPiAgCj4g PiA+ID4gIHN0YXRpYyBib29sIGxzX3BjaWVfaXNfYnJpZGdlKHN0cnVjdCBsc19wY2llICpwY2ll KQo+ID4gPiA+IEBAIC03Myw2ICs5MCw2MCBAQCBzdGF0aWMgdm9pZCBsc19wY2llX2ZpeF9lcnJv cl9yZXNwb25zZShzdHJ1Y3QgbHNfcGNpZSAqcGNpZSkKPiA+ID4gPiAgCWlvd3JpdGUzMihQQ0lF X0FCU0VSUl9TRVRUSU5HLCBwY2ktPmRiaV9iYXNlICsgUENJRV9BQlNFUlIpOwo+ID4gPiA+ICB9 Cj4gPiA+ID4gIAo+ID4gPiA+ICtzdGF0aWMgdTMyIGxzX3BjaWVfcGZfcmVhZGwoc3RydWN0IGxz X3BjaWUgKnBjaWUsIHUzMiBvZmYpCj4gPiA+ID4gK3sKPiA+ID4gPiArCWlmIChwY2llLT5iaWdf ZW5kaWFuKQo+ID4gPiA+ICsJCXJldHVybiBpb3JlYWQzMmJlKHBjaWUtPnBmX2Jhc2UgKyBvZmYp Owo+ID4gPiA+ICsKPiA+ID4gPiArCXJldHVybiBpb3JlYWQzMihwY2llLT5wZl9iYXNlICsgb2Zm KTsKPiA+ID4gPiArfQo+ID4gPiA+ICsKPiA+ID4gPiArc3RhdGljIHZvaWQgbHNfcGNpZV9wZl93 cml0ZWwoc3RydWN0IGxzX3BjaWUgKnBjaWUsIHUzMiBvZmYsIHUzMiB2YWwpCj4gPiA+ID4gK3sK PiA+ID4gPiArCWlmIChwY2llLT5iaWdfZW5kaWFuKQo+ID4gPiA+ICsJCWlvd3JpdGUzMmJlKHZh bCwgcGNpZS0+cGZfYmFzZSArIG9mZik7Cj4gPiA+ID4gKwllbHNlCj4gPiA+ID4gKwkJaW93cml0 ZTMyKHZhbCwgcGNpZS0+cGZfYmFzZSArIG9mZik7Cj4gPiA+ID4gK30KPiA+ID4gPiArCj4gPiA+ ID4gK3N0YXRpYyB2b2lkIGxzX3BjaWVfc2VuZF90dXJub2ZmX21zZyhzdHJ1Y3QgZHdfcGNpZV9y cCAqcHApCj4gPiA+ID4gK3sKPiA+ID4gPiArCXN0cnVjdCBkd19wY2llICpwY2kgPSB0b19kd19w Y2llX2Zyb21fcHAocHApOwo+ID4gPiA+ICsJc3RydWN0IGxzX3BjaWUgKnBjaWUgPSB0b19sc19w Y2llKHBjaSk7Cj4gPiA+ID4gKwl1MzIgdmFsOwo+ID4gPiA+ICsJaW50IHJldDsKPiA+ID4gPiAr Cj4gPiA+ID4gKwl2YWwgPSBsc19wY2llX3BmX3JlYWRsKHBjaWUsIExTX1BDSUVfUEZfTUNSKTsK PiA+ID4gPiArCXZhbCB8PSBQRl9NQ1JfUFRPTVI7Cj4gPiA+ID4gKwlsc19wY2llX3BmX3dyaXRl bChwY2llLCBMU19QQ0lFX1BGX01DUiwgdmFsKTsKPiA+ID4gPiArCj4gPiA+ID4gKwlyZXQgPSBy ZWFkeF9wb2xsX3RpbWVvdXQobHNfcGNpZV9wZl9yZWFkbF9hZGRyLCBMU19QQ0lFX1BGX01DUiwK PiA+ID4gPiArCQkJCSB2YWwsICEodmFsICYgUEZfTUNSX1BUT01SKSwKPiA+ID4gPiArCQkJCSBQ Q0lFX1BNRV9UT19MMl9USU1FT1VUX1VTLzEwLAo+ID4gPiA+ICsJCQkJIFBDSUVfUE1FX1RPX0wy X1RJTUVPVVRfVVMpOwo+ID4gPiA+ICsJaWYgKHJldCkKPiA+ID4gPiArCQlkZXZfZXJyKHBjaWUt PnBjaS0+ZGV2LCAiUE1FX1R1cm5fb2ZmIHRpbWVvdXRcbiIpOwo+ID4gPiA+ICt9Cj4gPiA+ID4g Kwo+ID4gPiA+ICtzdGF0aWMgdm9pZCBsc19wY2llX2V4aXRfZnJvbV9sMihzdHJ1Y3QgZHdfcGNp ZV9ycCAqcHApCj4gPiA+ID4gK3sKPiA+ID4gPiArCXN0cnVjdCBkd19wY2llICpwY2kgPSB0b19k d19wY2llX2Zyb21fcHAocHApOwo+ID4gPiA+ICsJc3RydWN0IGxzX3BjaWUgKnBjaWUgPSB0b19s c19wY2llKHBjaSk7Cj4gPiA+ID4gKwl1MzIgdmFsOwo+ID4gPiA+ICsJaW50IHJldDsKPiA+ID4g PiArCj4gPiA+ID4gKwl2YWwgPSBsc19wY2llX3BmX3JlYWRsKHBjaWUsIExTX1BDSUVfUEZfTUNS KTsKPiA+ID4gPiArCXZhbCB8PSBQRl9NQ1JfRVhMMlM7Cj4gPiA+ID4gKwlsc19wY2llX3BmX3dy aXRlbChwY2llLCBMU19QQ0lFX1BGX01DUiwgdmFsKTsKPiA+ID4gCj4gPiA+IFdoYXQgaXMgdGhp cyB3cml0ZSB0cmFuc2FjdGlvbiBnZW5lcmF0aW5nIGluIEhXID8KPiA+IAo+ID4gSSBkb24ndCB0 aGluayBzZW5kIGFueXRoaW5nIHRvIHRvIHBjaSBidXMgYmVjYXVzZSBpdCB3YXMgY2FsbGVkIGJl Zm9yZQo+ID4gaG9zdCBpbml0Lgo+ID4gCj4gPiBUaGUgc3BlYyBvZiBsczEwMjggaXMgbm90IGNs ZWFyIGVub3VnaC4KPiA+IAo+ID4gYEVYTDJTOiBleGl0IGwyIHN0YXRlIGNvbW1hbmQuIHdoZW4g c2V0IHRvIDEsIGFuIEwyIGV4aXQgY29tbWFuZCBpcwo+ID4gZ2VuZXJhdGVkLiBUaGUgYml0IGlz IHNlbGYgY2xlYXJpbmcuIE9uY2UgdGhlIGJpdCBpcyBzZXQuIFNXIG5lZWRzIHRvIHdhaXQKPiA+ IGZvciB0aGUgYml0IHRvIHNlbGZjbGVhciBiZWZvcmUgc2VuZGluZyBhIG5ldyBjb21tYW5kJwo+ ID4gCj4gPiA+IAo+ID4gPiBXaHkgaXMgaXQgbmVlZGVkID8gU2hvdWxkbid0IEwyIGV4aXQgaGFw cGVuIGF1dG9tYXRpY2FsbHkKPiA+ID4gaW4gSFcgPwo+ID4gCj4gPiBJIHRyaWVkIHJlbW92ZSB0 aGlzLCBQQ0kgY2FuJ3QgcmVzdW1lLiBJIHRoaW5rIHRoaXMgaXMgc3BlY2lmaWMgZm9yIGxzMTAy OAo+ID4gY2hpcCB0byBjbGVhciBpbnRlcm5hbCBsb2dpYy4KPiAKPiBXZWxsLCBpZiB5b3UgZG9u J3QgZXZlbiBrbm93IHdoYXQgdGhpcyBkb2VzIGhvdyBjYW4geW91IHdyaXRlIGEgc2FuZQo+IGRl dmljZSBkcml2ZXIgPwo+IAo+IENhbiB5b3UgYXNrIGRlc2lnbmVycyBhIG1vcmUgZGV0YWlsZWQg ZGVzY3JpcHRpb24gcGxlYXNlID8KPiAKCkkgb2Z0ZW4gZW5jb3VudGVyIGh3IHF1aXJrcyBsaWtl IHRoaXMgb25lIGFuZCB0aGUgaHcgZGVzaWduZXJzIHdpbGwganVzdCBzYXkKdGhhdCAic2V0IGJp dCBYIHRvIG1ha2UgWSBoYXBwcGVuIi4gSU1PIGEgY29tbWVudCBzYXlpbmcgdGhhdCB0aGUgZHJp dmVyIG5lZWQgdG8Kc2V0IFBGX01DUl9FWEwyUyBiaXQgaW4gTFNfUENJRV9QRl9NQ1IgcmVnaXN0 ZXIgZm9yIHRoZSBsaW5rIHRvIGV4aXQgTDIgc3RhdGUgaXMKZ29vZCBlbm91Z2guCgo+ID4gPiA+ ICsKPiA+ID4gPiArCXJldCA9IHJlYWR4X3BvbGxfdGltZW91dChsc19wY2llX3BmX3JlYWRsX2Fk ZHIsIExTX1BDSUVfUEZfTUNSLAo+ID4gPiA+ICsJCQkJIHZhbCwgISh2YWwgJiBQRl9NQ1JfRVhM MlMpLAo+ID4gPiA+ICsJCQkJIFBDSUVfUE1FX1RPX0wyX1RJTUVPVVRfVVMvMTAsCj4gPiA+ID4g KwkJCVBDSUVfUE1FX1RPX0wyX1RJTUVPVVRfVVMpOwo+ID4gPiAKPiA+ID4gQW5kIHdoeSBpcyB0 aGUgdGltZW91dCB2YWx1ZSB0aGUgc2FtZSB1c2VkIGZvciB0aGUgUE1FX3R1cm5fb2ZmIG1lc3Nh Z2UgPwo+ID4gCj4gPiBJIHRoaW5rIE5vIHNwZWMgZGVmaW5lIGl0LCBqdXN0IHJldXNlZCBpdC4g dXNlIFBDSUVfUE1FX1RPX0wyX1RJTUVPVVRfVVMKPiA+IG1heSBjYXVzZSBjb25mdXNlLiBXaGF0 J3MgZG8geW91IHByZWZlcmVkPyBKdXN0IHVzZSBudW1iZXIsc3VjaCBhcyAxMG1zLgo+IAo+IFRo aXMgZGVsYXkgdmFsdWUgaXMgbWlzbGVhZGluZywgaXQgaXMgbm90IGdvb2QgdG8gcmV1c2UgYSB2 YWx1ZSBmb3IKPiBhIGRlbGF5IHRoYXQgaXMgbW9zdCBjZXJ0YWlubHkgY29udHJvbGxlciBzcGVj aWZpYy4KPiAKPiBGcm9tIHRoaXMgZGlzY3Vzc2lvbiBJIHdvdWxkIHNheSB0aGF0IGhhdmluZyBw bWVfdHVybl9vZmYoKSBhbmQKPiBleGl0X2Zyb21fbDIoKSBob29rcyBpcyBnZW5lcmFsaXppbmcg c29tZXRoaW5nIHdlIGRvbid0IGtub3cgeWV0Cj4gaXQgaXMgbmVlZGVkIGZvciBhbGwgRFdDIGJh c2VkIGNvbnRyb2xsZXJzLgo+IAo+IEl0IGlzIHByb2JhYmx5IHdvcnRoIGtlZXBpbmcgdGhlIGxh eWVyc2NhcGUgc3BlY2lmaWMgY2hhbmdlcyBpbgo+IHRoZSBsYXllcnNjYXBlIGRyaXZlciBhbmQg ZnJvbSB0aGVyZSBjYWxsIHRoZSAiZ2VuZXJpYyIgRFdDCj4gc3VzcGVuZC9yZXN1bWUgZnVuY3Rp b25zOgo+IAo+IGR3X3BjaWVfc3VzcGVuZF9ub2lycSgpCj4gZHdfcGNpZV9yZXN1bWVfbm9pcnEo KQo+IAo+IHJhdGhlciB0aGFuIGFkZGluZyBob29rcyB0aGF0IHdlIGJhcmVseSBrbm93IHdoYXQg dGhleSBhcmUgbmVlZGVkIGZvci4KPiAKPiBNYW5pLCB3aGF0IGRvIHlvdSB0aGluayA/Cj4gCgpQ TUVfVHVybl9vZmYgcHJvY2VkdXJlIG1heSB2YXJ5IGJldHdlZW4gY29udHJvbGxlcnMgYW5kIGlz IHJlYWxseSByZXF1aXJlZApmcm9tIGNvcmUgRFdDIHBlcnNwZWN0aXZlLiBTbyBJJ2QgcHJlZmVy IHRvIGtlZXAgdGhlIHBtZV90dXJuX29mZigpIGNhbGxiYWNrCmFuZCBsZWF2ZSBleGl0X2Zyb21f bDIoKSBzaW5jZSBsYXRlciBzZWVtcyB0byBiZSBvbmx5IHJlcXVpcmVkIGZvciBsYXllcnNjYXBl LgoKLSBNYW5pCgotLSAK4K6u4K6j4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCu v+CuteCuruCvjQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtYXJtLWtlcm5lbAo=