From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4FF29C64EC4 for ; Fri, 10 Mar 2023 16:19:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231766AbjCJQTY (ORCPT ); Fri, 10 Mar 2023 11:19:24 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51536 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232869AbjCJQSm (ORCPT ); Fri, 10 Mar 2023 11:18:42 -0500 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BA4A11D09A; Fri, 10 Mar 2023 08:14:04 -0800 (PST) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id BC98B61A55; Fri, 10 Mar 2023 16:14:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 365B5C433D2; Fri, 10 Mar 2023 16:13:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678464841; bh=SdJT48pgc55q+97r4QIUR5Ti78tRUtjjYX4LSxKMjw8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=j34HYphsqG7xv3mGnAdN/TcMjnD/3nh6wolAOf+Xp+8jhuP2lqzIU0hXn6bd/w0l6 +CEprugPD1ouuUNV6XGn+5vWv3MkuVdrnhp2hqa9WKO3u8UqXWo8g9Qr80og/3PFGA qbnva7T1Qvk0jr3FE8mhYUCYj0LCk7QdOt8Tt9xowWBadeXnGnKwEjzHIfxruTr/ky b7DJ8cna3IqDMT/rfdz6iraDqFvgK1R2UWA8UDYbwWJz2iDPr48TwteIAD2MHJdq4q TAslpG3DVzCW+cUr7kilKN6BHQva1zLTSCcPNWqOfzomICgXxaOxvlS/6vs9Nsiq5r QgH/gU9mHdQ2Q== Date: Fri, 10 Mar 2023 17:13:56 +0100 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <1670479534-22154-1-git-send-email-hongxing.zhu@nxp.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Mon, Jan 09, 2023 at 02:08:06AM +0000, Hongxing Zhu wrote: > > -----Original Message----- > > From: Lorenzo Pieralisi > > Sent: 2022年12月30日 23:06 > > To: Hongxing Zhu ; l.stach@pengutronix.de; > > bhelgaas@google.com > > Cc: linux-pci@vger.kernel.org; linux-arm-kernel@lists.infradead.org; > > linux-kernel@vger.kernel.org; kernel@pengutronix.de; dl-linux-imx > > > > Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in > > suspend and resume > > > > On Thu, Dec 08, 2022 at 02:05:34PM +0800, Richard Zhu wrote: > > > The MSI Enable bit controls delivery of MSI interrupts from components > > > below the Root Port. This bit might lost during the suspend, should be > > > re-stored during resume. > > > > > > Save the MSI control during suspend, and restore it in resume. > > > > I believe that what Lucas and Bjorn asked on v1 is still not answered. > > > > The root port is a PCI device, why do we need to save and restore the MSI cap > > on top of what PCI core already does ? The RP should be enumerated as a PCI > > device and therefore I expect the MSI cap to be saved/restored in the > > suspend/resume execution. > > > > I don't think there is anything iMX6 specific in this. > Hi Lorenzo: > Thanks for your comments. > Sorry to reply late, since I got a high fever in the past days. > > Based on i.MX6QP SABRESD board and XHCI PCIe2USB3.0 device, the MSI cap > save/restore of PCI core is not executed(dev->msi_enabled is zero) > during my suspend/resume tests. I still do not understand. The register you are saving/restoring in the RC is not the root port Message control field in the root port MSI capability, it is a separate register that controls the root complex MSI forwarding, is that correct ? The root port MSI capability does not control the root complex forwarding of MSIs TLPs. So the bits you are saving and restoring IIUC should be MMIO space in the root complex, dressed as an MSI capability, that has nothing to do with the root port MSI capability. Is that correct ? Thanks, Lorenzo > > It seems that some device might shutdown msi when do the suspend operations. > > > > Would you mind investigating it please ? > Sure, I did further investigation on i.MX6QP platform. > The MSI_EN bit of RC MSI capability would be cleared to zero, when > PCIE_RESET(BIT29 of IOMUXC_GPR1) is toggled (assertion 1b'1, > then de-assertion 1b'0). > > Verification steps: > MSI_EN of RC is set to 1b'1 when system is boot up. > ./memtool 1ffc050 1 > 0x01FFC050: 01017005 > > Toggle PCIe reset of i.MX6QP. > root@imx6qpdlsolox:~# ./memtool 20e0004=68691005 > Writing 32-bit value 0x68691005 to address 0x020E0004 > root@imx6qpdlsolox:~# ./memtool 20e0004=48691005 > Writing 32-bit value 0x48691005 to address 0x020E0004 > > The MSI_EN bit of RC had been cleared to 1b'0. > ./memtool 1ffc050 1 > 0x01FFC050: 01807005 > > This is why I used to reply to Bjorn the MSI_EN of RC is cleared when > RESETs are toggled during the imx6_pcie_host_init() in > imx6_pcie_resume_noirq() callback. > > Best Regards > Richard Zhu > > > > Lorenzo > > > > > Signed-off-by: Richard Zhu > > > --- > > > Changes v1-->v2: > > > New create one save/restore function, used save the setting in suspend > > > and restore the configuration in resume. > > > v1 > > > https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpatc > > > > > hwork.kernel.org%2Fproject%2Flinux-pci%2Fpatch%2F1667289595-12440-1-g > > i > > > > > t-send-email-hongxing.zhu%40nxp.com%2F&data=05%7C01%7Chongxing.zhu > > %40n > > > > > xp.com%7C3aeb1d128f854dad1a5608daea77706d%7C686ea1d3bc2b4c6fa92 > > cd99c5c > > > > > 301635%7C0%7C0%7C638080095954881374%7CUnknown%7CTWFpbGZsb3 > > d8eyJWIjoiMC > > > > > 4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000% > > 7C%7C% > > > > > 7C&sdata=V8yVvvpTKGoR1UyQP5HD2IdlSjJdznBeD12bdI67dEI%3D&reserved= > > 0 > > > > > > --- > > > drivers/pci/controller/dwc/pci-imx6.c | 23 +++++++++++++++++++++++ > > > 1 file changed, 23 insertions(+) > > > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c > > > b/drivers/pci/controller/dwc/pci-imx6.c > > > index 1dde5c579edc..aa3096890c3b 100644 > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > > @@ -76,6 +76,7 @@ struct imx6_pcie { > > > struct clk *pcie; > > > struct clk *pcie_aux; > > > struct regmap *iomuxc_gpr; > > > + u16 msi_ctrl; > > > u32 controller_id; > > > struct reset_control *pciephy_reset; > > > struct reset_control *apps_reset; > > > @@ -1042,6 +1043,26 @@ static void imx6_pcie_pm_turnoff(struct > > imx6_pcie *imx6_pcie) > > > usleep_range(1000, 10000); > > > } > > > > > > +static void imx6_pcie_msi_save_restore(struct imx6_pcie *imx6_pcie, > > > +bool save) { > > > + u8 offset; > > > + u16 val; > > > + struct dw_pcie *pci = imx6_pcie->pci; > > > + > > > + if (pci_msi_enabled()) { > > > + offset = dw_pcie_find_capability(pci, PCI_CAP_ID_MSI); > > > + if (save) { > > > + val = dw_pcie_readw_dbi(pci, offset + PCI_MSI_FLAGS); > > > + imx6_pcie->msi_ctrl = val; > > > + } else { > > > + dw_pcie_dbi_ro_wr_en(pci); > > > + val = imx6_pcie->msi_ctrl; > > > + dw_pcie_writew_dbi(pci, offset + PCI_MSI_FLAGS, val); > > > + dw_pcie_dbi_ro_wr_dis(pci); > > > + } > > > + } > > > +} > > > + > > > static int imx6_pcie_suspend_noirq(struct device *dev) { > > > struct imx6_pcie *imx6_pcie = dev_get_drvdata(dev); @@ -1050,6 > > > +1071,7 @@ static int imx6_pcie_suspend_noirq(struct device *dev) > > > if (!(imx6_pcie->drvdata->flags & > > IMX6_PCIE_FLAG_SUPPORTS_SUSPEND)) > > > return 0; > > > > > > + imx6_pcie_msi_save_restore(imx6_pcie, true); > > > imx6_pcie_pm_turnoff(imx6_pcie); > > > imx6_pcie_stop_link(imx6_pcie->pci); > > > imx6_pcie_host_exit(pp); > > > @@ -1069,6 +1091,7 @@ static int imx6_pcie_resume_noirq(struct device > > *dev) > > > ret = imx6_pcie_host_init(pp); > > > if (ret) > > > return ret; > > > + imx6_pcie_msi_save_restore(imx6_pcie, false); > > > dw_pcie_setup_rc(pp); > > > > > > if (imx6_pcie->link_is_up) > > > -- > > > 2.25.1 > > > > _______________________________________________ > linux-arm-kernel mailing list > linux-arm-kernel@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-arm-kernel 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 9653FC64EC4 for ; Fri, 10 Mar 2023 16:15:09 +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=PVD2tFiw6n6atciYe4WOtwanclx9PWKnieQrkDg6HR4=; b=kmF89uosRZBl+3 YU4CbtsCgggDV8HD3byu5lDAR6GTspHBsTBbKF28tQYF2tKWy0Uwexk+xckuIoYqz1n75LMSMe8Ys RZj+rJOidzSNwppJByg2THAmXRo3hpQlw5TwAc7Rg8OLr50wXY9oDdWiSZBrMvjL7ajzRbA9zJZn0 /ik5Jn6SClc+rOmA0Jghn5a2GV3qiY0OPJ8MdjAx0IkjV9cOu9s7Dx4216WmMEeF/zRGk2AN5OynE hyHuXmbfdOYLMJGbEiSOD6YVEr0NnS3z1Wit9L0st/HUGuElo7CAjifW94CgiLqGGm1Qvvs3biObO HRcMVggoSZ0uyQ/05KKQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pafNf-00FFcC-My; Fri, 10 Mar 2023 16:14:07 +0000 Received: from dfw.source.kernel.org ([139.178.84.217]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pafNb-00FFah-FN for linux-arm-kernel@lists.infradead.org; Fri, 10 Mar 2023 16:14:05 +0000 Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id C02AD61B68; Fri, 10 Mar 2023 16:14:01 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 365B5C433D2; Fri, 10 Mar 2023 16:13:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1678464841; bh=SdJT48pgc55q+97r4QIUR5Ti78tRUtjjYX4LSxKMjw8=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=j34HYphsqG7xv3mGnAdN/TcMjnD/3nh6wolAOf+Xp+8jhuP2lqzIU0hXn6bd/w0l6 +CEprugPD1ouuUNV6XGn+5vWv3MkuVdrnhp2hqa9WKO3u8UqXWo8g9Qr80og/3PFGA qbnva7T1Qvk0jr3FE8mhYUCYj0LCk7QdOt8Tt9xowWBadeXnGnKwEjzHIfxruTr/ky b7DJ8cna3IqDMT/rfdz6iraDqFvgK1R2UWA8UDYbwWJz2iDPr48TwteIAD2MHJdq4q TAslpG3DVzCW+cUr7kilKN6BHQva1zLTSCcPNWqOfzomICgXxaOxvlS/6vs9Nsiq5r QgH/gU9mHdQ2Q== Date: Fri, 10 Mar 2023 17:13:56 +0100 From: Lorenzo Pieralisi To: Hongxing Zhu Cc: "l.stach@pengutronix.de" , "bhelgaas@google.com" , "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Subject: Re: [PATCH v2] PCI: imx6: Save and restore MSI control of RC in suspend and resume Message-ID: References: <1670479534-22154-1-git-send-email-hongxing.zhu@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-20230310_081403_616179_21F46FD1 X-CRM114-Status: GOOD ( 44.99 ) 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 T24gTW9uLCBKYW4gMDksIDIwMjMgYXQgMDI6MDg6MDZBTSArMDAwMCwgSG9uZ3hpbmcgWmh1IHdy b3RlOgo+ID4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPiA+IEZyb206IExvcmVuem8gUGll cmFsaXNpIDxscGllcmFsaXNpQGtlcm5lbC5vcmc+Cj4gPiBTZW50OiAyMDIy5bm0MTLmnIgzMOaX pSAyMzowNgo+ID4gVG86IEhvbmd4aW5nIFpodSA8aG9uZ3hpbmcuemh1QG54cC5jb20+OyBsLnN0 YWNoQHBlbmd1dHJvbml4LmRlOwo+ID4gYmhlbGdhYXNAZ29vZ2xlLmNvbQo+ID4gQ2M6IGxpbnV4 LXBjaUB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZzsKPiA+IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGtlcm5lbEBwZW5ndXRyb25peC5k ZTsgZGwtbGludXgtaW14Cj4gPiA8bGludXgtaW14QG54cC5jb20+Cj4gPiBTdWJqZWN0OiBSZTog W1BBVENIIHYyXSBQQ0k6IGlteDY6IFNhdmUgYW5kIHJlc3RvcmUgTVNJIGNvbnRyb2wgb2YgUkMg aW4KPiA+IHN1c3BlbmQgYW5kIHJlc3VtZQo+ID4gCj4gPiBPbiBUaHUsIERlYyAwOCwgMjAyMiBh dCAwMjowNTozNFBNICswODAwLCBSaWNoYXJkIFpodSB3cm90ZToKPiA+ID4gVGhlIE1TSSBFbmFi bGUgYml0IGNvbnRyb2xzIGRlbGl2ZXJ5IG9mIE1TSSBpbnRlcnJ1cHRzIGZyb20gY29tcG9uZW50 cwo+ID4gPiBiZWxvdyB0aGUgUm9vdCBQb3J0LiBUaGlzIGJpdCBtaWdodCBsb3N0IGR1cmluZyB0 aGUgc3VzcGVuZCwgc2hvdWxkIGJlCj4gPiA+IHJlLXN0b3JlZCBkdXJpbmcgcmVzdW1lLgo+ID4g Pgo+ID4gPiBTYXZlIHRoZSBNU0kgY29udHJvbCBkdXJpbmcgc3VzcGVuZCwgYW5kIHJlc3RvcmUg aXQgaW4gcmVzdW1lLgo+ID4gCj4gPiBJIGJlbGlldmUgdGhhdCB3aGF0IEx1Y2FzIGFuZCBCam9y biBhc2tlZCBvbiB2MSBpcyBzdGlsbCBub3QgYW5zd2VyZWQuCj4gPiAKPiA+IFRoZSByb290IHBv cnQgaXMgYSBQQ0kgZGV2aWNlLCB3aHkgZG8gd2UgbmVlZCB0byBzYXZlIGFuZCByZXN0b3JlIHRo ZSBNU0kgY2FwCj4gPiBvbiB0b3Agb2Ygd2hhdCBQQ0kgY29yZSBhbHJlYWR5IGRvZXMgPyBUaGUg UlAgc2hvdWxkIGJlIGVudW1lcmF0ZWQgYXMgYSBQQ0kKPiA+IGRldmljZSBhbmQgdGhlcmVmb3Jl IEkgZXhwZWN0IHRoZSBNU0kgY2FwIHRvIGJlIHNhdmVkL3Jlc3RvcmVkIGluIHRoZQo+ID4gc3Vz cGVuZC9yZXN1bWUgZXhlY3V0aW9uLgo+ID4gCj4gPiBJIGRvbid0IHRoaW5rIHRoZXJlIGlzIGFu eXRoaW5nIGlNWDYgc3BlY2lmaWMgaW4gdGhpcy4KPiBIaSBMb3JlbnpvOgo+IFRoYW5rcyBmb3Ig eW91ciBjb21tZW50cy4KPiBTb3JyeSB0byByZXBseSBsYXRlLCBzaW5jZSBJIGdvdCBhIGhpZ2gg ZmV2ZXIgaW4gdGhlIHBhc3QgZGF5cy4KPiAKPiBCYXNlZCBvbiBpLk1YNlFQIFNBQlJFU0QgYm9h cmQgYW5kIFhIQ0kgUENJZTJVU0IzLjAgZGV2aWNlLCB0aGUgTVNJIGNhcAo+ICBzYXZlL3Jlc3Rv cmUgb2YgUENJIGNvcmUgaXMgbm90IGV4ZWN1dGVkKGRldi0+bXNpX2VuYWJsZWQgaXMgemVybykK PiAgZHVyaW5nIG15IHN1c3BlbmQvcmVzdW1lIHRlc3RzLgoKSSBzdGlsbCBkbyBub3QgdW5kZXJz dGFuZC4gVGhlIHJlZ2lzdGVyIHlvdSBhcmUgc2F2aW5nL3Jlc3RvcmluZyBpbiB0aGUKUkMgaXMg bm90IHRoZSByb290IHBvcnQgTWVzc2FnZSBjb250cm9sIGZpZWxkIGluIHRoZSByb290IHBvcnQg TVNJIApjYXBhYmlsaXR5LCBpdCBpcyBhIHNlcGFyYXRlIHJlZ2lzdGVyIHRoYXQgY29udHJvbHMg dGhlIHJvb3QgY29tcGxleApNU0kgZm9yd2FyZGluZywgaXMgdGhhdCBjb3JyZWN0ID8KClRoZSBy b290IHBvcnQgTVNJIGNhcGFiaWxpdHkgZG9lcyBub3QgY29udHJvbCB0aGUgcm9vdCBjb21wbGV4 CmZvcndhcmRpbmcgb2YgTVNJcyBUTFBzLgoKU28gdGhlIGJpdHMgeW91IGFyZSBzYXZpbmcgYW5k IHJlc3RvcmluZyBJSVVDIHNob3VsZCBiZSBNTUlPIHNwYWNlIGluCnRoZSByb290IGNvbXBsZXgs IGRyZXNzZWQgYXMgYW4gTVNJIGNhcGFiaWxpdHksIHRoYXQgaGFzIG5vdGhpbmcgdG8KZG8gd2l0 aCB0aGUgcm9vdCBwb3J0IE1TSSBjYXBhYmlsaXR5LgoKSXMgdGhhdCBjb3JyZWN0ID8KClRoYW5r cywKTG9yZW56bwo+IAo+IEl0IHNlZW1zIHRoYXQgc29tZSBkZXZpY2UgbWlnaHQgc2h1dGRvd24g bXNpIHdoZW4gZG8gdGhlIHN1c3BlbmQgb3BlcmF0aW9ucy4KPiA+IAo+ID4gV291bGQgeW91IG1p bmQgaW52ZXN0aWdhdGluZyBpdCBwbGVhc2UgPwo+IFN1cmUsIEkgZGlkIGZ1cnRoZXIgaW52ZXN0 aWdhdGlvbiBvbiBpLk1YNlFQIHBsYXRmb3JtLgo+IFRoZSBNU0lfRU4gYml0IG9mIFJDIE1TSSBj YXBhYmlsaXR5IHdvdWxkIGJlIGNsZWFyZWQgdG8gemVybywgd2hlbgo+ICBQQ0lFX1JFU0VUKEJJ VDI5IG9mIElPTVVYQ19HUFIxKSBpcyB0b2dnbGVkIChhc3NlcnRpb24gMWInMSwKPiAgdGhlbiBk ZS1hc3NlcnRpb24gMWInMCkuCj4gCj4gVmVyaWZpY2F0aW9uIHN0ZXBzOgo+IE1TSV9FTiBvZiBS QyBpcyBzZXQgdG8gMWInMSB3aGVuIHN5c3RlbSBpcyBib290IHVwLgo+ICAuL21lbXRvb2wgMWZm YzA1MCAxCj4gMHgwMUZGQzA1MDogIDAxMDE3MDA1Cj4gCj4gVG9nZ2xlIFBDSWUgcmVzZXQgb2Yg aS5NWDZRUC4KPiByb290QGlteDZxcGRsc29sb3g6fiMgLi9tZW10b29sIDIwZTAwMDQ9Njg2OTEw MDUKPiBXcml0aW5nIDMyLWJpdCB2YWx1ZSAweDY4NjkxMDA1IHRvIGFkZHJlc3MgMHgwMjBFMDAw NAo+IHJvb3RAaW14NnFwZGxzb2xveDp+IyAuL21lbXRvb2wgMjBlMDAwND00ODY5MTAwNQo+IFdy aXRpbmcgMzItYml0IHZhbHVlIDB4NDg2OTEwMDUgdG8gYWRkcmVzcyAweDAyMEUwMDA0Cj4gCj4g VGhlIE1TSV9FTiBiaXQgb2YgUkMgaGFkIGJlZW4gY2xlYXJlZCB0byAxYicwLgo+IC4vbWVtdG9v bCAxZmZjMDUwIDEKPiAweDAxRkZDMDUwOiAgMDE4MDcwMDUKPiAKPiBUaGlzIGlzIHdoeSBJIHVz ZWQgdG8gcmVwbHkgdG8gQmpvcm4gdGhlIE1TSV9FTiBvZiBSQyBpcyBjbGVhcmVkIHdoZW4KPiAg UkVTRVRzIGFyZSB0b2dnbGVkIGR1cmluZyB0aGUgaW14Nl9wY2llX2hvc3RfaW5pdCgpIGluCj4g IGlteDZfcGNpZV9yZXN1bWVfbm9pcnEoKSBjYWxsYmFjay4KPiAKPiBCZXN0IFJlZ2FyZHMKPiBS aWNoYXJkIFpodQo+ID4gCj4gPiBMb3JlbnpvCj4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogUmlj aGFyZCBaaHUgPGhvbmd4aW5nLnpodUBueHAuY29tPgo+ID4gPiAtLS0KPiA+ID4gQ2hhbmdlcyB2 MS0tPnYyOgo+ID4gPiBOZXcgY3JlYXRlIG9uZSBzYXZlL3Jlc3RvcmUgZnVuY3Rpb24sIHVzZWQg c2F2ZSB0aGUgc2V0dGluZyBpbiBzdXNwZW5kCj4gPiA+IGFuZCByZXN0b3JlIHRoZSBjb25maWd1 cmF0aW9uIGluIHJlc3VtZS4KPiA+ID4gdjEKPiA+ID4gaHR0cHM6Ly9ldXIwMS5zYWZlbGlua3Mu cHJvdGVjdGlvbi5vdXRsb29rLmNvbS8/dXJsPWh0dHBzJTNBJTJGJTJGcGF0Ywo+ID4gPgo+ID4g aHdvcmsua2VybmVsLm9yZyUyRnByb2plY3QlMkZsaW51eC1wY2klMkZwYXRjaCUyRjE2NjcyODk1 OTUtMTI0NDAtMS1nCj4gPiBpCj4gPiA+Cj4gPiB0LXNlbmQtZW1haWwtaG9uZ3hpbmcuemh1JTQw bnhwLmNvbSUyRiZkYXRhPTA1JTdDMDElN0Nob25neGluZy56aHUKPiA+ICU0MG4KPiA+ID4KPiA+ IHhwLmNvbSU3QzNhZWIxZDEyOGY4NTRkYWQxYTU2MDhkYWVhNzc3MDZkJTdDNjg2ZWExZDNiYzJi NGM2ZmE5Mgo+ID4gY2Q5OWM1Ywo+ID4gPgo+ID4gMzAxNjM1JTdDMCU3QzAlN0M2MzgwODAwOTU5 NTQ4ODEzNzQlN0NVbmtub3duJTdDVFdGcGJHWnNiMwo+ID4gZDhleUpXSWpvaU1DCj4gPiA+Cj4g PiA0d0xqQXdNREFpTENKUUlqb2lWMmx1TXpJaUxDSkJUaUk2SWsxaGFXd2lMQ0pYVkNJNk1uMCUz RCU3QzMwMDAlCj4gPiA3QyU3QyUKPiA+ID4KPiA+IDdDJnNkYXRhPVY4eVZ2dnBUS0dvUjFVeVFQ NUhEMklkbFNqSmR6bkJlRDEyYmRJNjdkRUklM0QmcmVzZXJ2ZWQ9Cj4gPiAwCj4gPiA+Cj4gPiA+ IC0tLQo+ID4gPiAgZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWlteDYuYyB8IDIzICsr KysrKysrKysrKysrKysrKysrKysrCj4gPiA+ICAxIGZpbGUgY2hhbmdlZCwgMjMgaW5zZXJ0aW9u cygrKQo+ID4gPgo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2Mv cGNpLWlteDYuYwo+ID4gPiBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1pbXg2LmMK PiA+ID4gaW5kZXggMWRkZTVjNTc5ZWRjLi5hYTMwOTY4OTBjM2IgMTAwNjQ0Cj4gPiA+IC0tLSBh L2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1pbXg2LmMKPiA+ID4gKysrIGIvZHJpdmVy cy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWlteDYuYwo+ID4gPiBAQCAtNzYsNiArNzYsNyBAQCBz dHJ1Y3QgaW14Nl9wY2llIHsKPiA+ID4gIAlzdHJ1Y3QgY2xrCQkqcGNpZTsKPiA+ID4gIAlzdHJ1 Y3QgY2xrCQkqcGNpZV9hdXg7Cj4gPiA+ICAJc3RydWN0IHJlZ21hcAkJKmlvbXV4Y19ncHI7Cj4g PiA+ICsJdTE2CQkJbXNpX2N0cmw7Cj4gPiA+ICAJdTMyCQkJY29udHJvbGxlcl9pZDsKPiA+ID4g IAlzdHJ1Y3QgcmVzZXRfY29udHJvbAkqcGNpZXBoeV9yZXNldDsKPiA+ID4gIAlzdHJ1Y3QgcmVz ZXRfY29udHJvbAkqYXBwc19yZXNldDsKPiA+ID4gQEAgLTEwNDIsNiArMTA0MywyNiBAQCBzdGF0 aWMgdm9pZCBpbXg2X3BjaWVfcG1fdHVybm9mZihzdHJ1Y3QKPiA+IGlteDZfcGNpZSAqaW14Nl9w Y2llKQo+ID4gPiAgCXVzbGVlcF9yYW5nZSgxMDAwLCAxMDAwMCk7Cj4gPiA+ICB9Cj4gPiA+Cj4g PiA+ICtzdGF0aWMgdm9pZCBpbXg2X3BjaWVfbXNpX3NhdmVfcmVzdG9yZShzdHJ1Y3QgaW14Nl9w Y2llICppbXg2X3BjaWUsCj4gPiA+ICtib29sIHNhdmUpIHsKPiA+ID4gKwl1OCBvZmZzZXQ7Cj4g PiA+ICsJdTE2IHZhbDsKPiA+ID4gKwlzdHJ1Y3QgZHdfcGNpZSAqcGNpID0gaW14Nl9wY2llLT5w Y2k7Cj4gPiA+ICsKPiA+ID4gKwlpZiAocGNpX21zaV9lbmFibGVkKCkpIHsKPiA+ID4gKwkJb2Zm c2V0ID0gZHdfcGNpZV9maW5kX2NhcGFiaWxpdHkocGNpLCBQQ0lfQ0FQX0lEX01TSSk7Cj4gPiA+ ICsJCWlmIChzYXZlKSB7Cj4gPiA+ICsJCQl2YWwgPSBkd19wY2llX3JlYWR3X2RiaShwY2ksIG9m ZnNldCArIFBDSV9NU0lfRkxBR1MpOwo+ID4gPiArCQkJaW14Nl9wY2llLT5tc2lfY3RybCA9IHZh bDsKPiA+ID4gKwkJfSBlbHNlIHsKPiA+ID4gKwkJCWR3X3BjaWVfZGJpX3JvX3dyX2VuKHBjaSk7 Cj4gPiA+ICsJCQl2YWwgPSBpbXg2X3BjaWUtPm1zaV9jdHJsOwo+ID4gPiArCQkJZHdfcGNpZV93 cml0ZXdfZGJpKHBjaSwgb2Zmc2V0ICsgUENJX01TSV9GTEFHUywgdmFsKTsKPiA+ID4gKwkJCWR3 X3BjaWVfZGJpX3JvX3dyX2RpcyhwY2kpOwo+ID4gPiArCQl9Cj4gPiA+ICsJfQo+ID4gPiArfQo+ ID4gPiArCj4gPiA+ICBzdGF0aWMgaW50IGlteDZfcGNpZV9zdXNwZW5kX25vaXJxKHN0cnVjdCBk ZXZpY2UgKmRldikgIHsKPiA+ID4gIAlzdHJ1Y3QgaW14Nl9wY2llICppbXg2X3BjaWUgPSBkZXZf Z2V0X2RydmRhdGEoZGV2KTsgQEAgLTEwNTAsNgo+ID4gPiArMTA3MSw3IEBAIHN0YXRpYyBpbnQg aW14Nl9wY2llX3N1c3BlbmRfbm9pcnEoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gPiAgCWlmICgh KGlteDZfcGNpZS0+ZHJ2ZGF0YS0+ZmxhZ3MgJgo+ID4gSU1YNl9QQ0lFX0ZMQUdfU1VQUE9SVFNf U1VTUEVORCkpCj4gPiA+ICAJCXJldHVybiAwOwo+ID4gPgo+ID4gPiArCWlteDZfcGNpZV9tc2lf c2F2ZV9yZXN0b3JlKGlteDZfcGNpZSwgdHJ1ZSk7Cj4gPiA+ICAJaW14Nl9wY2llX3BtX3R1cm5v ZmYoaW14Nl9wY2llKTsKPiA+ID4gIAlpbXg2X3BjaWVfc3RvcF9saW5rKGlteDZfcGNpZS0+cGNp KTsKPiA+ID4gIAlpbXg2X3BjaWVfaG9zdF9leGl0KHBwKTsKPiA+ID4gQEAgLTEwNjksNiArMTA5 MSw3IEBAIHN0YXRpYyBpbnQgaW14Nl9wY2llX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlCj4g PiAqZGV2KQo+ID4gPiAgCXJldCA9IGlteDZfcGNpZV9ob3N0X2luaXQocHApOwo+ID4gPiAgCWlm IChyZXQpCj4gPiA+ICAJCXJldHVybiByZXQ7Cj4gPiA+ICsJaW14Nl9wY2llX21zaV9zYXZlX3Jl c3RvcmUoaW14Nl9wY2llLCBmYWxzZSk7Cj4gPiA+ICAJZHdfcGNpZV9zZXR1cF9yYyhwcCk7Cj4g PiA+Cj4gPiA+ICAJaWYgKGlteDZfcGNpZS0+bGlua19pc191cCkKPiA+ID4gLS0KPiA+ID4gMi4y NS4xCj4gPiA+Cj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KPiBsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAo+IGxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlz dGluZm8vbGludXgtYXJtLWtlcm5lbAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtl cm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxt YW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=