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 60E70D51D for ; Mon, 7 Aug 2023 13:35:47 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9428CC433C7; Mon, 7 Aug 2023 13:35:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1691415347; bh=gJOtkQtXecuWCK12Nmw1Cjef3JhnXue4TG090jJoSqg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=G0PRBms6EYNMfwVzMVUT85wVaExvcHx+XMI+gUXLWXcm0YPLUb5Fnm9rLukXHzMDl 6APb7WyPqAS+WiIApmlSgZfaIkQ28OyB2P/d0J7LZDyBmVzTQweIDYb62nAhvlf2TY HAp7IPkJYRZ5cqtL6f69ftV6wlLRjrohU1n90CYfuuJ1mNDUH/OjJBWrqZui6+CyCP lwPlI8JOQkVi7VZhsnFLKlPyddz20Kn6+AGXt+CekGfQVe/OOgPjINBQptDsZ5E8fh YBWF2+JV5YJNvRUbSI0ElaALiKvorvRP7naVf9GpyAVaVaAgdWbqaH83vrkl4FY4cZ nOgMnWQpv3SpQ== Date: Mon, 7 Aug 2023 19:05:29 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: 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, lpieralisi@kernel.org, manivannan.sadhasivam@linaro.org, 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 v9 2/3] PCI: dwc: Implement general suspend/resume functionality for L2/L3 transitions Message-ID: <20230807133529.GD18257@thinkpad> References: <20230804180637.462573-1-Frank.Li@nxp.com> <20230804180637.462573-3-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: <20230804180637.462573-3-Frank.Li@nxp.com> On Fri, Aug 04, 2023 at 02:06:36PM -0400, Frank Li wrote: > Introduce helper function dw_pcie_get_ltssm() to retrieve SMLH_LTSS_STATE. > > Add callback .pme_turn_off and .exit_from_l2 for platform specific PME > handling. > > Add common dw_pcie_suspend(resume)_noirq() API to avoid duplicated code > in dwc pci host controller platform driver. > > Typical L2 entry workflow/dw_pcie_suspend_noirq() > > 1. Transmit PME turn off signal to PCI devices and wait for PME_To_Ack. > 2. Await link entering L2_IDLE state. > > Typical L2 exit workflow/dw_pcie_resume_noirq() > > 1. Issue exit from L2 command. > 2. Reinitialize PCI host. > 3. Wait for link to become active. > > Signed-off-by: Frank Li Minor nits below. With that, Acked-by: Manivannan Sadhasivam - Mani > --- > .../pci/controller/dwc/pcie-designware-host.c | 76 +++++++++++++++++++ > drivers/pci/controller/dwc/pcie-designware.h | 28 +++++++ > 2 files changed, 104 insertions(+) > > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c > index 9952057c8819c..7d87ed61e2bf9 100644 > --- a/drivers/pci/controller/dwc/pcie-designware-host.c > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c > @@ -8,6 +8,7 @@ > * Author: Jingoo Han > */ > > +#include > #include > #include > #include > @@ -16,6 +17,7 @@ > #include > #include > > +#include "../../pci.h" > #include "pcie-designware.h" > > static struct pci_ops dw_pcie_ops; > @@ -807,3 +809,77 @@ int dw_pcie_setup_rc(struct dw_pcie_rp *pp) > return 0; > } > EXPORT_SYMBOL_GPL(dw_pcie_setup_rc); > + > +int dw_pcie_suspend_noirq(struct dw_pcie *pci) > +{ > + u8 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP); > + u32 val; > + int ret; > + > + /* > + * If L1SS is supported, then do not put the link into L2 as some > + * devices such as NVMe expect low resume latency. > + */ > + if (dw_pcie_readw_dbi(pci, offset + PCI_EXP_LNKCTL) & PCI_EXP_LNKCTL_ASPM_L1) > + return 0; > + > + if (dw_pcie_get_ltssm(pci) <= DW_PCIE_LTSSM_DETECT_ACT) > + return 0; > + > + if (!pci->pp.ops->pme_turn_off) > + return 0; > + > + pci->pp.ops->pme_turn_off(&pci->pp); > + > + ret = read_poll_timeout(dw_pcie_get_ltssm, val, val == DW_PCIE_LTSSM_L2_IDLE, > + PCIE_PME_TO_L2_TIMEOUT_US/10, > + PCIE_PME_TO_L2_TIMEOUT_US, false, pci); > + if (ret) { > + dev_err(pci->dev, "Timeout waiting for L2 entry! LTSSM: 0x%x\n", val); > + return ret; > + } > + > + if (pci->pp.ops->host_deinit) > + pci->pp.ops->host_deinit(&pci->pp); > + > + pci->suspended = true; > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(dw_pcie_suspend_noirq); > + > +int dw_pcie_resume_noirq(struct dw_pcie *pci) > +{ > + int ret; > + > + if (!pci->suspended) > + return 0; > + > + pci->suspended = false; > + > + if (!pci->pp.ops->exit_from_l2) > + return 0; > + > + pci->pp.ops->exit_from_l2(&pci->pp); > + > + if (pci->pp.ops->host_init) { > + ret = pci->pp.ops->host_init(&pci->pp); > + if (ret) { > + dev_err(pci->dev, "Host init failed! ret = %d\n", ret); Please remove "ret = " and just print, "Host init failed: %d" > + return ret; > + } > + } > + > + dw_pcie_setup_rc(&pci->pp); > + > + ret = dw_pcie_start_link(pci); > + if (ret) > + return ret; > + > + ret = dw_pcie_wait_for_link(pci); > + if (ret) > + return ret; > + > + return ret; > +} > +EXPORT_SYMBOL_GPL(dw_pcie_resume_noirq); > diff --git a/drivers/pci/controller/dwc/pcie-designware.h b/drivers/pci/controller/dwc/pcie-designware.h > index 79713ce075cc1..cbba3ed19b3c0 100644 > --- a/drivers/pci/controller/dwc/pcie-designware.h > +++ b/drivers/pci/controller/dwc/pcie-designware.h > @@ -288,10 +288,21 @@ enum dw_pcie_core_rst { > DW_PCIE_NUM_CORE_RSTS > }; > > +enum dw_pcie_ltssm { > + DW_PCIE_LTSSM_UNKNOWN = 0xFFFFFFFF, Move this to the end as UNKNOWN doesn't have the value of 0. - Mani > + /* Need to align with PCIE_PORT_DEBUG0 bits 0:5 */ > + DW_PCIE_LTSSM_DETECT_QUIET = 0x0, > + DW_PCIE_LTSSM_DETECT_ACT = 0x1, > + DW_PCIE_LTSSM_L0 = 0x11, > + DW_PCIE_LTSSM_L2_IDLE = 0x15, > +}; > + > struct dw_pcie_host_ops { > int (*host_init)(struct dw_pcie_rp *pp); > void (*host_deinit)(struct dw_pcie_rp *pp); > int (*msi_host_init)(struct dw_pcie_rp *pp); > + void (*pme_turn_off)(struct dw_pcie_rp *pp); > + void (*exit_from_l2)(struct dw_pcie_rp *pp); > }; > > struct dw_pcie_rp { > @@ -364,6 +375,7 @@ struct dw_pcie_ops { > void (*write_dbi2)(struct dw_pcie *pcie, void __iomem *base, u32 reg, > size_t size, u32 val); > int (*link_up)(struct dw_pcie *pcie); > + enum dw_pcie_ltssm (*get_ltssm)(struct dw_pcie *pcie); > int (*start_link)(struct dw_pcie *pcie); > void (*stop_link)(struct dw_pcie *pcie); > }; > @@ -393,6 +405,7 @@ struct dw_pcie { > struct reset_control_bulk_data app_rsts[DW_PCIE_NUM_APP_RSTS]; > struct reset_control_bulk_data core_rsts[DW_PCIE_NUM_CORE_RSTS]; > struct gpio_desc *pe_rst; > + bool suspended; > }; > > #define to_dw_pcie_from_pp(port) container_of((port), struct dw_pcie, pp) > @@ -430,6 +443,9 @@ void dw_pcie_iatu_detect(struct dw_pcie *pci); > int dw_pcie_edma_detect(struct dw_pcie *pci); > void dw_pcie_edma_remove(struct dw_pcie *pci); > > +int dw_pcie_suspend_noirq(struct dw_pcie *pci); > +int dw_pcie_resume_noirq(struct dw_pcie *pci); > + > static inline void dw_pcie_writel_dbi(struct dw_pcie *pci, u32 reg, u32 val) > { > dw_pcie_write_dbi(pci, reg, 0x4, val); > @@ -501,6 +517,18 @@ static inline void dw_pcie_stop_link(struct dw_pcie *pci) > pci->ops->stop_link(pci); > } > > +static inline enum dw_pcie_ltssm dw_pcie_get_ltssm(struct dw_pcie *pci) > +{ > + u32 val; > + > + if (pci->ops && pci->ops->get_ltssm) > + return pci->ops->get_ltssm(pci); > + > + val = dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG0); > + > + return (enum dw_pcie_ltssm)FIELD_GET(PORT_LOGIC_LTSSM_STATE_MASK, val); > +} > + > #ifdef CONFIG_PCIE_DW_HOST > irqreturn_t dw_handle_msi_irq(struct dw_pcie_rp *pp); > int dw_pcie_setup_rc(struct dw_pcie_rp *pp); > -- > 2.34.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 19CCDC001DB for ; Mon, 7 Aug 2023 13:36:13 +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=iiV0PA46Bn8FCrli7mmc0L+4PkjNzjBqt/7x8vh5/AU=; b=DPl81i8/mhejTz g3Dao+hh2dwZ0XALviqmw2kDmHTTzs6spH8PXVc/UDv6tSaC3nqLjfiFoaQjb9KVamZpEFMbfc69j 6jKYYS55kZiOfQFU7x2PGErZFmY+odDmFsFVUC83d4Wz0WW0bgGasmGVaBWnZa7fenmG6wQTM5Uli EtLZHH2GWc8YyQYQl8zsJbyg2zRE6YIY0XoD8WY5/PUM5SaVSiQukzOcyPEzHw/99rQopAEK32Ing bM4Eaxl0df8I7/g3J85h9JgMSx6FdA6lQU1m74+ZIspByhylLHcFy9KBGXcpsBJBd8ie6PjNLGEyk MqBpox19mDoqycxoFCtw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qT0Ol-00HPMt-30; Mon, 07 Aug 2023 13:35:51 +0000 Received: from dfw.source.kernel.org ([2604:1380:4641:c500::1]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qT0Oj-00HPMO-07 for linux-arm-kernel@lists.infradead.org; Mon, 07 Aug 2023 13:35:51 +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 59CA061985; Mon, 7 Aug 2023 13:35:48 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 9428CC433C7; Mon, 7 Aug 2023 13:35:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1691415347; bh=gJOtkQtXecuWCK12Nmw1Cjef3JhnXue4TG090jJoSqg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=G0PRBms6EYNMfwVzMVUT85wVaExvcHx+XMI+gUXLWXcm0YPLUb5Fnm9rLukXHzMDl 6APb7WyPqAS+WiIApmlSgZfaIkQ28OyB2P/d0J7LZDyBmVzTQweIDYb62nAhvlf2TY HAp7IPkJYRZ5cqtL6f69ftV6wlLRjrohU1n90CYfuuJ1mNDUH/OjJBWrqZui6+CyCP lwPlI8JOQkVi7VZhsnFLKlPyddz20Kn6+AGXt+CekGfQVe/OOgPjINBQptDsZ5E8fh YBWF2+JV5YJNvRUbSI0ElaALiKvorvRP7naVf9GpyAVaVaAgdWbqaH83vrkl4FY4cZ nOgMnWQpv3SpQ== Date: Mon, 7 Aug 2023 19:05:29 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: 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, lpieralisi@kernel.org, manivannan.sadhasivam@linaro.org, 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 v9 2/3] PCI: dwc: Implement general suspend/resume functionality for L2/L3 transitions Message-ID: <20230807133529.GD18257@thinkpad> References: <20230804180637.462573-1-Frank.Li@nxp.com> <20230804180637.462573-3-Frank.Li@nxp.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20230804180637.462573-3-Frank.Li@nxp.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230807_063549_437038_7D88DA0F X-CRM114-Status: GOOD ( 24.88 ) 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 T24gRnJpLCBBdWcgMDQsIDIwMjMgYXQgMDI6MDY6MzZQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gSW50cm9kdWNlIGhlbHBlciBmdW5jdGlvbiBkd19wY2llX2dldF9sdHNzbSgpIHRvIHJldHJp ZXZlIFNNTEhfTFRTU19TVEFURS4KPiAKPiBBZGQgY2FsbGJhY2sgLnBtZV90dXJuX29mZiBhbmQg LmV4aXRfZnJvbV9sMiBmb3IgcGxhdGZvcm0gc3BlY2lmaWMgUE1FCj4gaGFuZGxpbmcuCj4gCj4g QWRkIGNvbW1vbiBkd19wY2llX3N1c3BlbmQocmVzdW1lKV9ub2lycSgpIEFQSSB0byBhdm9pZCBk dXBsaWNhdGVkIGNvZGUKPiBpbiBkd2MgcGNpIGhvc3QgY29udHJvbGxlciBwbGF0Zm9ybSBkcml2 ZXIuCj4gCj4gVHlwaWNhbCBMMiBlbnRyeSB3b3JrZmxvdy9kd19wY2llX3N1c3BlbmRfbm9pcnEo KQo+IAo+IDEuIFRyYW5zbWl0IFBNRSB0dXJuIG9mZiBzaWduYWwgdG8gUENJIGRldmljZXMgYW5k IHdhaXQgZm9yIFBNRV9Ub19BY2suCj4gMi4gQXdhaXQgbGluayBlbnRlcmluZyBMMl9JRExFIHN0 YXRlLgo+IAo+IFR5cGljYWwgTDIgZXhpdCB3b3JrZmxvdy9kd19wY2llX3Jlc3VtZV9ub2lycSgp Cj4gCj4gMS4gSXNzdWUgZXhpdCBmcm9tIEwyIGNvbW1hbmQuCj4gMi4gUmVpbml0aWFsaXplIFBD SSBob3N0Lgo+IDMuIFdhaXQgZm9yIGxpbmsgdG8gYmVjb21lIGFjdGl2ZS4KPiAKPiBTaWduZWQt b2ZmLWJ5OiBGcmFuayBMaSA8RnJhbmsuTGlAbnhwLmNvbT4KCk1pbm9yIG5pdHMgYmVsb3cuIFdp dGggdGhhdCwKCkFja2VkLWJ5OiBNYW5pdmFubmFuIFNhZGhhc2l2YW0gPG1hbmlAa2VybmVsLm9y Zz4KCi0gTWFuaQoKPiAtLS0KPiAgLi4uL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLWRlc2lnbndh cmUtaG9zdC5jIHwgNzYgKysrKysrKysrKysrKysrKysrKwo+ICBkcml2ZXJzL3BjaS9jb250cm9s bGVyL2R3Yy9wY2llLWRlc2lnbndhcmUuaCAgfCAyOCArKysrKysrCj4gIDIgZmlsZXMgY2hhbmdl ZCwgMTA0IGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJv bGxlci9kd2MvcGNpZS1kZXNpZ253YXJlLWhvc3QuYyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv ZHdjL3BjaWUtZGVzaWdud2FyZS1ob3N0LmMKPiBpbmRleCA5OTUyMDU3Yzg4MTljLi43ZDg3ZWQ2 MWUyYmY5IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtZGVz aWdud2FyZS1ob3N0LmMKPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2llLWRl c2lnbndhcmUtaG9zdC5jCj4gQEAgLTgsNiArOCw3IEBACj4gICAqIEF1dGhvcjogSmluZ29vIEhh biA8amcxLmhhbkBzYW1zdW5nLmNvbT4KPiAgICovCj4gIAo+ICsjaW5jbHVkZSA8bGludXgvaW9w b2xsLmg+Cj4gICNpbmNsdWRlIDxsaW51eC9pcnFjaGlwL2NoYWluZWRfaXJxLmg+Cj4gICNpbmNs dWRlIDxsaW51eC9pcnFkb21haW4uaD4KPiAgI2luY2x1ZGUgPGxpbnV4L21zaS5oPgo+IEBAIC0x Niw2ICsxNyw3IEBACj4gICNpbmNsdWRlIDxsaW51eC9wY2lfcmVncy5oPgo+ICAjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gIAo+ICsjaW5jbHVkZSAiLi4vLi4vcGNpLmgiCj4g ICNpbmNsdWRlICJwY2llLWRlc2lnbndhcmUuaCIKPiAgCj4gIHN0YXRpYyBzdHJ1Y3QgcGNpX29w cyBkd19wY2llX29wczsKPiBAQCAtODA3LDMgKzgwOSw3NyBAQCBpbnQgZHdfcGNpZV9zZXR1cF9y YyhzdHJ1Y3QgZHdfcGNpZV9ycCAqcHApCj4gIAlyZXR1cm4gMDsKPiAgfQo+ICBFWFBPUlRfU1lN Qk9MX0dQTChkd19wY2llX3NldHVwX3JjKTsKPiArCj4gK2ludCBkd19wY2llX3N1c3BlbmRfbm9p cnEoc3RydWN0IGR3X3BjaWUgKnBjaSkKPiArewo+ICsJdTggb2Zmc2V0ID0gZHdfcGNpZV9maW5k X2NhcGFiaWxpdHkocGNpLCBQQ0lfQ0FQX0lEX0VYUCk7Cj4gKwl1MzIgdmFsOwo+ICsJaW50IHJl dDsKPiArCj4gKwkvKgo+ICsJICogSWYgTDFTUyBpcyBzdXBwb3J0ZWQsIHRoZW4gZG8gbm90IHB1 dCB0aGUgbGluayBpbnRvIEwyIGFzIHNvbWUKPiArCSAqIGRldmljZXMgc3VjaCBhcyBOVk1lIGV4 cGVjdCBsb3cgcmVzdW1lIGxhdGVuY3kuCj4gKwkgKi8KPiArCWlmIChkd19wY2llX3JlYWR3X2Ri aShwY2ksIG9mZnNldCArIFBDSV9FWFBfTE5LQ1RMKSAmIFBDSV9FWFBfTE5LQ1RMX0FTUE1fTDEp Cj4gKwkJcmV0dXJuIDA7Cj4gKwo+ICsJaWYgKGR3X3BjaWVfZ2V0X2x0c3NtKHBjaSkgPD0gRFdf UENJRV9MVFNTTV9ERVRFQ1RfQUNUKQo+ICsJCXJldHVybiAwOwo+ICsKPiArCWlmICghcGNpLT5w cC5vcHMtPnBtZV90dXJuX29mZikKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlwY2ktPnBwLm9wcy0+ cG1lX3R1cm5fb2ZmKCZwY2ktPnBwKTsKPiArCj4gKwlyZXQgPSByZWFkX3BvbGxfdGltZW91dChk d19wY2llX2dldF9sdHNzbSwgdmFsLCB2YWwgPT0gRFdfUENJRV9MVFNTTV9MMl9JRExFLAo+ICsJ CQkJUENJRV9QTUVfVE9fTDJfVElNRU9VVF9VUy8xMCwKPiArCQkJCVBDSUVfUE1FX1RPX0wyX1RJ TUVPVVRfVVMsIGZhbHNlLCBwY2kpOwo+ICsJaWYgKHJldCkgewo+ICsJCWRldl9lcnIocGNpLT5k ZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIEwyIGVudHJ5ISBMVFNTTTogMHgleFxuIiwgdmFsKTsK PiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCWlmIChwY2ktPnBwLm9wcy0+aG9zdF9kZWlu aXQpCj4gKwkJcGNpLT5wcC5vcHMtPmhvc3RfZGVpbml0KCZwY2ktPnBwKTsKPiArCj4gKwlwY2kt PnN1c3BlbmRlZCA9IHRydWU7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICtFWFBPUlRfU1lN Qk9MX0dQTChkd19wY2llX3N1c3BlbmRfbm9pcnEpOwo+ICsKPiAraW50IGR3X3BjaWVfcmVzdW1l X25vaXJxKHN0cnVjdCBkd19wY2llICpwY2kpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJaWYg KCFwY2ktPnN1c3BlbmRlZCkKPiArCQlyZXR1cm4gMDsKPiArCj4gKwlwY2ktPnN1c3BlbmRlZCA9 IGZhbHNlOwo+ICsKPiArCWlmICghcGNpLT5wcC5vcHMtPmV4aXRfZnJvbV9sMikKPiArCQlyZXR1 cm4gMDsKPiArCj4gKwlwY2ktPnBwLm9wcy0+ZXhpdF9mcm9tX2wyKCZwY2ktPnBwKTsKPiArCj4g KwlpZiAocGNpLT5wcC5vcHMtPmhvc3RfaW5pdCkgewo+ICsJCXJldCA9IHBjaS0+cHAub3BzLT5o b3N0X2luaXQoJnBjaS0+cHApOwo+ICsJCWlmIChyZXQpIHsKPiArCQkJZGV2X2VycihwY2ktPmRl diwgIkhvc3QgaW5pdCBmYWlsZWQhIHJldCA9ICVkXG4iLCByZXQpOwoKUGxlYXNlIHJlbW92ZSAi cmV0ID0gIiBhbmQganVzdCBwcmludCwgIkhvc3QgaW5pdCBmYWlsZWQ6ICVkIgoKPiArCQkJcmV0 dXJuIHJldDsKPiArCQl9Cj4gKwl9Cj4gKwo+ICsJZHdfcGNpZV9zZXR1cF9yYygmcGNpLT5wcCk7 Cj4gKwo+ICsJcmV0ID0gZHdfcGNpZV9zdGFydF9saW5rKHBjaSk7Cj4gKwlpZiAocmV0KQo+ICsJ CXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0ID0gZHdfcGNpZV93YWl0X2Zvcl9saW5rKHBjaSk7Cj4g KwlpZiAocmV0KQo+ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICtF WFBPUlRfU1lNQk9MX0dQTChkd19wY2llX3Jlc3VtZV9ub2lycSk7Cj4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaWUtZGVzaWdud2FyZS5oIGIvZHJpdmVycy9wY2kv Y29udHJvbGxlci9kd2MvcGNpZS1kZXNpZ253YXJlLmgKPiBpbmRleCA3OTcxM2NlMDc1Y2MxLi5j YmJhM2VkMTliM2MwIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3Bj aWUtZGVzaWdud2FyZS5oCj4gKysrIGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpZS1k ZXNpZ253YXJlLmgKPiBAQCAtMjg4LDEwICsyODgsMjEgQEAgZW51bSBkd19wY2llX2NvcmVfcnN0 IHsKPiAgCURXX1BDSUVfTlVNX0NPUkVfUlNUUwo+ICB9Owo+ICAKPiArZW51bSBkd19wY2llX2x0 c3NtIHsKPiArCURXX1BDSUVfTFRTU01fVU5LTk9XTiA9IDB4RkZGRkZGRkYsCgpNb3ZlIHRoaXMg dG8gdGhlIGVuZCBhcyBVTktOT1dOIGRvZXNuJ3QgaGF2ZSB0aGUgdmFsdWUgb2YgMC4KCi0gTWFu aQoKPiArCS8qIE5lZWQgdG8gYWxpZ24gd2l0aCBQQ0lFX1BPUlRfREVCVUcwIGJpdHMgMDo1ICov Cj4gKwlEV19QQ0lFX0xUU1NNX0RFVEVDVF9RVUlFVCA9IDB4MCwKPiArCURXX1BDSUVfTFRTU01f REVURUNUX0FDVCA9IDB4MSwKPiArCURXX1BDSUVfTFRTU01fTDAgPSAweDExLAo+ICsJRFdfUENJ RV9MVFNTTV9MMl9JRExFID0gMHgxNSwKPiArfTsKPiArCj4gIHN0cnVjdCBkd19wY2llX2hvc3Rf b3BzIHsKPiAgCWludCAoKmhvc3RfaW5pdCkoc3RydWN0IGR3X3BjaWVfcnAgKnBwKTsKPiAgCXZv aWQgKCpob3N0X2RlaW5pdCkoc3RydWN0IGR3X3BjaWVfcnAgKnBwKTsKPiAgCWludCAoKm1zaV9o b3N0X2luaXQpKHN0cnVjdCBkd19wY2llX3JwICpwcCk7Cj4gKwl2b2lkICgqcG1lX3R1cm5fb2Zm KShzdHJ1Y3QgZHdfcGNpZV9ycCAqcHApOwo+ICsJdm9pZCAoKmV4aXRfZnJvbV9sMikoc3RydWN0 IGR3X3BjaWVfcnAgKnBwKTsKPiAgfTsKPiAgCj4gIHN0cnVjdCBkd19wY2llX3JwIHsKPiBAQCAt MzY0LDYgKzM3NSw3IEBAIHN0cnVjdCBkd19wY2llX29wcyB7Cj4gIAl2b2lkICAgICgqd3JpdGVf ZGJpMikoc3RydWN0IGR3X3BjaWUgKnBjaWUsIHZvaWQgX19pb21lbSAqYmFzZSwgdTMyIHJlZywK PiAgCQkJICAgICAgc2l6ZV90IHNpemUsIHUzMiB2YWwpOwo+ICAJaW50CSgqbGlua191cCkoc3Ry dWN0IGR3X3BjaWUgKnBjaWUpOwo+ICsJZW51bSBkd19wY2llX2x0c3NtICgqZ2V0X2x0c3NtKShz dHJ1Y3QgZHdfcGNpZSAqcGNpZSk7Cj4gIAlpbnQJKCpzdGFydF9saW5rKShzdHJ1Y3QgZHdfcGNp ZSAqcGNpZSk7Cj4gIAl2b2lkCSgqc3RvcF9saW5rKShzdHJ1Y3QgZHdfcGNpZSAqcGNpZSk7Cj4g IH07Cj4gQEAgLTM5Myw2ICs0MDUsNyBAQCBzdHJ1Y3QgZHdfcGNpZSB7Cj4gIAlzdHJ1Y3QgcmVz ZXRfY29udHJvbF9idWxrX2RhdGEJYXBwX3JzdHNbRFdfUENJRV9OVU1fQVBQX1JTVFNdOwo+ICAJ c3RydWN0IHJlc2V0X2NvbnRyb2xfYnVsa19kYXRhCWNvcmVfcnN0c1tEV19QQ0lFX05VTV9DT1JF X1JTVFNdOwo+ICAJc3RydWN0IGdwaW9fZGVzYwkJKnBlX3JzdDsKPiArCWJvb2wJCQlzdXNwZW5k ZWQ7Cj4gIH07Cj4gIAo+ICAjZGVmaW5lIHRvX2R3X3BjaWVfZnJvbV9wcChwb3J0KSBjb250YWlu ZXJfb2YoKHBvcnQpLCBzdHJ1Y3QgZHdfcGNpZSwgcHApCj4gQEAgLTQzMCw2ICs0NDMsOSBAQCB2 b2lkIGR3X3BjaWVfaWF0dV9kZXRlY3Qoc3RydWN0IGR3X3BjaWUgKnBjaSk7Cj4gIGludCBkd19w Y2llX2VkbWFfZGV0ZWN0KHN0cnVjdCBkd19wY2llICpwY2kpOwo+ICB2b2lkIGR3X3BjaWVfZWRt YV9yZW1vdmUoc3RydWN0IGR3X3BjaWUgKnBjaSk7Cj4gIAo+ICtpbnQgZHdfcGNpZV9zdXNwZW5k X25vaXJxKHN0cnVjdCBkd19wY2llICpwY2kpOwo+ICtpbnQgZHdfcGNpZV9yZXN1bWVfbm9pcnEo c3RydWN0IGR3X3BjaWUgKnBjaSk7Cj4gKwo+ICBzdGF0aWMgaW5saW5lIHZvaWQgZHdfcGNpZV93 cml0ZWxfZGJpKHN0cnVjdCBkd19wY2llICpwY2ksIHUzMiByZWcsIHUzMiB2YWwpCj4gIHsKPiAg CWR3X3BjaWVfd3JpdGVfZGJpKHBjaSwgcmVnLCAweDQsIHZhbCk7Cj4gQEAgLTUwMSw2ICs1MTcs MTggQEAgc3RhdGljIGlubGluZSB2b2lkIGR3X3BjaWVfc3RvcF9saW5rKHN0cnVjdCBkd19wY2ll ICpwY2kpCj4gIAkJcGNpLT5vcHMtPnN0b3BfbGluayhwY2kpOwo+ICB9Cj4gIAo+ICtzdGF0aWMg aW5saW5lIGVudW0gZHdfcGNpZV9sdHNzbSBkd19wY2llX2dldF9sdHNzbShzdHJ1Y3QgZHdfcGNp ZSAqcGNpKQo+ICt7Cj4gKwl1MzIgdmFsOwo+ICsKPiArCWlmIChwY2ktPm9wcyAmJiBwY2ktPm9w cy0+Z2V0X2x0c3NtKQo+ICsJCXJldHVybiBwY2ktPm9wcy0+Z2V0X2x0c3NtKHBjaSk7Cj4gKwo+ ICsJdmFsID0gZHdfcGNpZV9yZWFkbF9kYmkocGNpLCBQQ0lFX1BPUlRfREVCVUcwKTsKPiArCj4g KwlyZXR1cm4gKGVudW0gZHdfcGNpZV9sdHNzbSlGSUVMRF9HRVQoUE9SVF9MT0dJQ19MVFNTTV9T VEFURV9NQVNLLCB2YWwpOwo+ICt9Cj4gKwo+ICAjaWZkZWYgQ09ORklHX1BDSUVfRFdfSE9TVAo+ ICBpcnFyZXR1cm5fdCBkd19oYW5kbGVfbXNpX2lycShzdHJ1Y3QgZHdfcGNpZV9ycCAqcHApOwo+ ICBpbnQgZHdfcGNpZV9zZXR1cF9yYyhzdHJ1Y3QgZHdfcGNpZV9ycCAqcHApOwo+IC0tIAo+IDIu MzQuMQo+IAoKLS0gCuCuruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/g rrXgrq7gr40KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK