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 1BE5A2FA20 for ; Thu, 20 Jul 2023 16:43:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E8EFAC433C8; Thu, 20 Jul 2023 16:43:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689871414; bh=OwyRAgPQy2DIEoiNl5+rnP5XfOp6/5Ovx1Ve+Ex+3ko=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pwA8WBwYSlW+g9aCDEQ4p8aH2boK1co0b/oh8YOnofOh9pCisrBQH5ZfwqodASCZt YZS4TnjZ62ZIkV20RJxhF02ZdOHyUk11ledYBHLt3PG/2Uja3TGi0zVsPOD5uDcoPt Q/q27B0RdxnotMfU6knFumTqqTkk1967rg1ZCJPj5yG+gFDFfWaIbrgndKfQHaiAr1 XUblCMHCELNktO5bY9SR1ktcoBalIXOKbsr6pDp1OMTRNUGudR5WPgoEg/LvslSV/p 9JSoW5z6bcTkkALbe/Et+VKI9Z/re1IbSFWxYB09FN4kylbYTZ6CvOXcY95nGlH+H+ 5t/WXTYGFd+1Q== Date: Thu, 20 Jul 2023 22:13:18 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: Manivannan Sadhasivam , helgaas@kernel.org, imx@lists.linux.dev, bhelgaas@google.com, devicetree@vger.kernel.org, gustavo.pimentel@synopsys.com, 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 v3 1/2] PCI: dwc: Implement general suspend/resume functionality for L2/L3 transitions Message-ID: <20230720164318.GE48270@thinkpad> References: <20230419164118.596300-1-Frank.Li@nxp.com> <20230717164526.GC35455@thinkpad> <20230718100400.GB4771@thinkpad> <20230720142509.GB48270@thinkpad> <20230720160738.GC48270@thinkpad> 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 Thu, Jul 20, 2023 at 12:26:38PM -0400, Frank Li wrote: > On Thu, Jul 20, 2023 at 09:37:38PM +0530, Manivannan Sadhasivam wrote: > > On Thu, Jul 20, 2023 at 10:37:36AM -0400, Frank Li wrote: > > > On Thu, Jul 20, 2023 at 07:55:09PM +0530, Manivannan Sadhasivam wrote: > > > > On Tue, Jul 18, 2023 at 03:34:26PM +0530, Manivannan Sadhasivam wrote: > > > > > On Mon, Jul 17, 2023 at 02:36:19PM -0400, Frank Li wrote: > > > > > > On Mon, Jul 17, 2023 at 10:15:26PM +0530, Manivannan Sadhasivam wrote: > > > > > > > On Wed, Apr 19, 2023 at 12:41:17PM -0400, Frank Li wrote: > > > > > > > > Introduced helper function dw_pcie_get_ltssm to retrieve SMLH_LTSS_STATE. > > > > > > > > Added API pme_turn_off and exit_from_l2 for managing L2/L3 state transitions. > > > > > > > > > > > > > > > > Typical L2 entry workflow: > > > > > > > > > > > > > > > > 1. Transmit PME turn off signal to PCI devices. > > > > > > > > 2. Await link entering L2_IDLE state. > > > > > > > > > > > > > > AFAIK, typical workflow is to wait for PME_To_Ack. > > > > > > > > > > > > 1 Already wait for PME_to_ACK, 2, just wait for link actual enter L2. > > > > > > I think PCI RC needs some time to set link enter L2 after get ACK from > > > > > > PME. > > > > > > > > > > > > > > One more comment. If you transition the device to L2/L3, then it can loose power > > > > if Vaux was not provided. In that case, can all the devices work after resume? > > > > Most notably NVMe? > > > > > > I have not hardware to do such test, NVMe driver will reinit everything after > > > resume if no L1.1\L1.2 support. If there are L1.1\L1.2, NVME expect it leave > > > at L1.2 at suspend to get better resume latency. > > > > > > > To be precise, NVMe driver will shutdown the device if there is no ASPM support > > and keep it in low power mode otherwise (there are other cases as well but we do > > not need to worry). > > I supposed this should work. but I have not hardware to test it now. NMVE already > sent shut down command to SSD, which can safely turn off. after resume, that most > likely a cold reset. > NO, it won't work and that's the reason the Qcom platforms are not transitioning the link to L2/L3 state during suspend. This applies to other platforms including layerscape as well. > > > > But here you are not checking for ASPM state in the suspend path, and just > > forcing the link to be in L2/L3 (thereby D3Cold) even though NVMe driver may > > expect it to be in low power state like ASPM/APST. > > This function is not called defaultly and need platform driver to call it as need. > Actually, I think PCI framework should handle L1.2 and L2 case, some devices > or user case want to L1.2 to get better resume latency, some devices want to > L2 to get better power saving, which out of scope of this patches. > I'm referring to the platform where these helper functions are being used which is layerscape. It doesn't matter whether you test this series with NVMe or not, it will not work unless you disable ASPM. > This patch just handle L2 case, I remember L1.2 don't expect send PME at all. > > > > > So you should only put the link to L2/L3 if there is no ASPM support. Otherwise, > > you'll ending up with bug reports when users connect NVMe to it. > > Platform should choose call or no call this function according to their > user case. So far, I have not found a good mathod to let ASPM to affect > suspend/resume. > You are missing my point here. If any platform decides to use these helper functions, they will face problems with NVMe. So please add a check for ASPM state before doing any L2/L3 handling. I agree that it may not be optimal w.r.t power savings, but the PCIe controller driver should work for all devices. - Mani > > > > - Mani > > > > > This API help remove duplicate codes and it can be improved gradually. > > > > > > > > > > > > > > - 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 8D137EB64DA for ; Thu, 20 Jul 2023 16:44:04 +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=kcHUrPLHyxB9SXRqNd6cfV0s7aYbCS1TLUVc4hSYO0I=; b=ViYttAGfDrForR PGK3TlOpry4Cnfp4aw11jWtN8sVYFNFiO6oC2iRQM3/9Nd/gXlr/ZO9OlrEP7wSu/JpHQMod4q7mS v4WrLT7YP7Mi5OvsvsOyj5FulzwBYi+dL2HPANciIHdn8bIO//imjfCxJ8VX4kn16GBc0g6yi9hMP em+baRmg72uNRfQlotkqacnlnCOZLkZYzCe5HIPyXUBiOnAkKEasBMjnRPUlJx3HuBQpmJphEjQ0E qoc0/jAqX5LJmRLaAysPuiOyTfXQYNB/kRaiMJiofzdqSGvmxMsOaNm4xwXgo9MyFj9blpTsoakOx W0r2e4n1fz+4zh9z1n2w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qMWkd-00Bhss-0k; Thu, 20 Jul 2023 16:43:39 +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 1qMWka-00BhsR-0D for linux-arm-kernel@lists.infradead.org; Thu, 20 Jul 2023 16:43:37 +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 8223C61B79; Thu, 20 Jul 2023 16:43:35 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E8EFAC433C8; Thu, 20 Jul 2023 16:43:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1689871414; bh=OwyRAgPQy2DIEoiNl5+rnP5XfOp6/5Ovx1Ve+Ex+3ko=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pwA8WBwYSlW+g9aCDEQ4p8aH2boK1co0b/oh8YOnofOh9pCisrBQH5ZfwqodASCZt YZS4TnjZ62ZIkV20RJxhF02ZdOHyUk11ledYBHLt3PG/2Uja3TGi0zVsPOD5uDcoPt Q/q27B0RdxnotMfU6knFumTqqTkk1967rg1ZCJPj5yG+gFDFfWaIbrgndKfQHaiAr1 XUblCMHCELNktO5bY9SR1ktcoBalIXOKbsr6pDp1OMTRNUGudR5WPgoEg/LvslSV/p 9JSoW5z6bcTkkALbe/Et+VKI9Z/re1IbSFWxYB09FN4kylbYTZ6CvOXcY95nGlH+H+ 5t/WXTYGFd+1Q== Date: Thu, 20 Jul 2023 22:13:18 +0530 From: Manivannan Sadhasivam To: Frank Li Cc: Manivannan Sadhasivam , helgaas@kernel.org, imx@lists.linux.dev, bhelgaas@google.com, devicetree@vger.kernel.org, gustavo.pimentel@synopsys.com, 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 v3 1/2] PCI: dwc: Implement general suspend/resume functionality for L2/L3 transitions Message-ID: <20230720164318.GE48270@thinkpad> References: <20230419164118.596300-1-Frank.Li@nxp.com> <20230717164526.GC35455@thinkpad> <20230718100400.GB4771@thinkpad> <20230720142509.GB48270@thinkpad> <20230720160738.GC48270@thinkpad> 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-20230720_094336_190386_9FA1CCAD X-CRM114-Status: GOOD ( 39.20 ) 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 T24gVGh1LCBKdWwgMjAsIDIwMjMgYXQgMTI6MjY6MzhQTSAtMDQwMCwgRnJhbmsgTGkgd3JvdGU6 Cj4gT24gVGh1LCBKdWwgMjAsIDIwMjMgYXQgMDk6Mzc6MzhQTSArMDUzMCwgTWFuaXZhbm5hbiBT YWRoYXNpdmFtIHdyb3RlOgo+ID4gT24gVGh1LCBKdWwgMjAsIDIwMjMgYXQgMTA6Mzc6MzZBTSAt MDQwMCwgRnJhbmsgTGkgd3JvdGU6Cj4gPiA+IE9uIFRodSwgSnVsIDIwLCAyMDIzIGF0IDA3OjU1 OjA5UE0gKzA1MzAsIE1hbml2YW5uYW4gU2FkaGFzaXZhbSB3cm90ZToKPiA+ID4gPiBPbiBUdWUs IEp1bCAxOCwgMjAyMyBhdCAwMzozNDoyNlBNICswNTMwLCBNYW5pdmFubmFuIFNhZGhhc2l2YW0g d3JvdGU6Cj4gPiA+ID4gPiBPbiBNb24sIEp1bCAxNywgMjAyMyBhdCAwMjozNjoxOVBNIC0wNDAw LCBGcmFuayBMaSB3cm90ZToKPiA+ID4gPiA+ID4gT24gTW9uLCBKdWwgMTcsIDIwMjMgYXQgMTA6 MTU6MjZQTSArMDUzMCwgTWFuaXZhbm5hbiBTYWRoYXNpdmFtIHdyb3RlOgo+ID4gPiA+ID4gPiA+ IE9uIFdlZCwgQXByIDE5LCAyMDIzIGF0IDEyOjQxOjE3UE0gLTA0MDAsIEZyYW5rIExpIHdyb3Rl Ogo+ID4gPiA+ID4gPiA+ID4gSW50cm9kdWNlZCBoZWxwZXIgZnVuY3Rpb24gZHdfcGNpZV9nZXRf bHRzc20gdG8gcmV0cmlldmUgU01MSF9MVFNTX1NUQVRFLgo+ID4gPiA+ID4gPiA+ID4gQWRkZWQg QVBJIHBtZV90dXJuX29mZiBhbmQgZXhpdF9mcm9tX2wyIGZvciBtYW5hZ2luZyBMMi9MMyBzdGF0 ZSB0cmFuc2l0aW9ucy4KPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gVHlwaWNhbCBM MiBlbnRyeSB3b3JrZmxvdzoKPiA+ID4gPiA+ID4gPiA+IAo+ID4gPiA+ID4gPiA+ID4gMS4gVHJh bnNtaXQgUE1FIHR1cm4gb2ZmIHNpZ25hbCB0byBQQ0kgZGV2aWNlcy4KPiA+ID4gPiA+ID4gPiA+ IDIuIEF3YWl0IGxpbmsgZW50ZXJpbmcgTDJfSURMRSBzdGF0ZS4KPiA+ID4gPiA+ID4gPiAKPiA+ ID4gPiA+ID4gPiBBRkFJSywgdHlwaWNhbCB3b3JrZmxvdyBpcyB0byB3YWl0IGZvciBQTUVfVG9f QWNrLgo+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gMSBBbHJlYWR5IHdhaXQgZm9yIFBNRV90b19B Q0ssICAyLCBqdXN0IHdhaXQgZm9yIGxpbmsgYWN0dWFsIGVudGVyIEwyLgo+ID4gPiA+ID4gPiBJ IHRoaW5rIFBDSSBSQyBuZWVkcyBzb21lIHRpbWUgdG8gc2V0IGxpbmsgZW50ZXIgTDIgYWZ0ZXIg Z2V0IEFDSyBmcm9tCj4gPiA+ID4gPiA+IFBNRS4KPiA+ID4gPiA+ID4gCj4gPiA+ID4gCj4gPiA+ ID4gT25lIG1vcmUgY29tbWVudC4gSWYgeW91IHRyYW5zaXRpb24gdGhlIGRldmljZSB0byBMMi9M MywgdGhlbiBpdCBjYW4gbG9vc2UgcG93ZXIKPiA+ID4gPiBpZiBWYXV4IHdhcyBub3QgcHJvdmlk ZWQuIEluIHRoYXQgY2FzZSwgY2FuIGFsbCB0aGUgZGV2aWNlcyB3b3JrIGFmdGVyIHJlc3VtZT8K PiA+ID4gPiBNb3N0IG5vdGFibHkgTlZNZT8KPiA+ID4gCj4gPiA+IEkgaGF2ZSBub3QgaGFyZHdh cmUgdG8gZG8gc3VjaCB0ZXN0LCBOVk1lIGRyaXZlciB3aWxsIHJlaW5pdCBldmVyeXRoaW5nIGFm dGVyCj4gPiA+IHJlc3VtZSBpZiBubyBMMS4xXEwxLjIgc3VwcG9ydC4gSWYgdGhlcmUgYXJlIEwx LjFcTDEuMiwgTlZNRSBleHBlY3QgaXQgbGVhdmUKPiA+ID4gYXQgTDEuMiBhdCBzdXNwZW5kIHRv IGdldCBiZXR0ZXIgcmVzdW1lIGxhdGVuY3kuCj4gPiA+IAo+ID4gCj4gPiBUbyBiZSBwcmVjaXNl LCBOVk1lIGRyaXZlciB3aWxsIHNodXRkb3duIHRoZSBkZXZpY2UgaWYgdGhlcmUgaXMgbm8gQVNQ TSBzdXBwb3J0Cj4gPiBhbmQga2VlcCBpdCBpbiBsb3cgcG93ZXIgbW9kZSBvdGhlcndpc2UgKHRo ZXJlIGFyZSBvdGhlciBjYXNlcyBhcyB3ZWxsIGJ1dCB3ZSBkbwo+ID4gbm90IG5lZWQgdG8gd29y cnkpLgo+IAo+IEkgc3VwcG9zZWQgdGhpcyBzaG91bGQgd29yay4gYnV0IEkgaGF2ZSBub3QgaGFy ZHdhcmUgdG8gdGVzdCBpdCBub3cuIE5NVkUgYWxyZWFkeQo+IHNlbnQgc2h1dCBkb3duIGNvbW1h bmQgdG8gU1NELCB3aGljaCBjYW4gc2FmZWx5IHR1cm4gb2ZmLiBhZnRlciByZXN1bWUsIHRoYXQg bW9zdAo+IGxpa2VseSBhIGNvbGQgcmVzZXQuCj4gCgpOTywgaXQgd29uJ3Qgd29yayBhbmQgdGhh dCdzIHRoZSByZWFzb24gdGhlIFFjb20gcGxhdGZvcm1zIGFyZSBub3QgdHJhbnNpdGlvbmluZwp0 aGUgbGluayB0byBMMi9MMyBzdGF0ZSBkdXJpbmcgc3VzcGVuZC4gVGhpcyBhcHBsaWVzIHRvIG90 aGVyIHBsYXRmb3JtcwppbmNsdWRpbmcgbGF5ZXJzY2FwZSBhcyB3ZWxsLgoKPiA+IAo+ID4gQnV0 IGhlcmUgeW91IGFyZSBub3QgY2hlY2tpbmcgZm9yIEFTUE0gc3RhdGUgaW4gdGhlIHN1c3BlbmQg cGF0aCwgYW5kIGp1c3QKPiA+IGZvcmNpbmcgdGhlIGxpbmsgdG8gYmUgaW4gTDIvTDMgKHRoZXJl YnkgRDNDb2xkKSBldmVuIHRob3VnaCBOVk1lIGRyaXZlciBtYXkKPiA+IGV4cGVjdCBpdCB0byBi ZSBpbiBsb3cgcG93ZXIgc3RhdGUgbGlrZSBBU1BNL0FQU1QuCj4gCj4gVGhpcyBmdW5jdGlvbiBp cyBub3QgY2FsbGVkIGRlZmF1bHRseSBhbmQgbmVlZCBwbGF0Zm9ybSBkcml2ZXIgdG8gY2FsbCBp dCBhcyBuZWVkLgo+IEFjdHVhbGx5LCBJIHRoaW5rIFBDSSBmcmFtZXdvcmsgc2hvdWxkIGhhbmRs ZSBMMS4yIGFuZCBMMiBjYXNlLCBzb21lIGRldmljZXMKPiBvciB1c2VyIGNhc2Ugd2FudCB0byBM MS4yIHRvIGdldCBiZXR0ZXIgcmVzdW1lIGxhdGVuY3ksIHNvbWUgZGV2aWNlcyB3YW50IHRvCj4g TDIgdG8gZ2V0IGJldHRlciBwb3dlciBzYXZpbmcsIHdoaWNoIG91dCBvZiBzY29wZSBvZiB0aGlz IHBhdGNoZXMuCj4gCgpJJ20gcmVmZXJyaW5nIHRvIHRoZSBwbGF0Zm9ybSB3aGVyZSB0aGVzZSBo ZWxwZXIgZnVuY3Rpb25zIGFyZSBiZWluZyB1c2VkIHdoaWNoCmlzIGxheWVyc2NhcGUuIEl0IGRv ZXNuJ3QgbWF0dGVyIHdoZXRoZXIgeW91IHRlc3QgdGhpcyBzZXJpZXMgd2l0aCBOVk1lIG9yIG5v dCwKaXQgd2lsbCBub3Qgd29yayB1bmxlc3MgeW91IGRpc2FibGUgQVNQTS4KCj4gVGhpcyBwYXRj aCBqdXN0IGhhbmRsZSBMMiBjYXNlLCBJIHJlbWVtYmVyIEwxLjIgZG9uJ3QgZXhwZWN0IHNlbmQg UE1FIGF0IGFsbC4KPiAKPiA+IAo+ID4gU28geW91IHNob3VsZCBvbmx5IHB1dCB0aGUgbGluayB0 byBMMi9MMyBpZiB0aGVyZSBpcyBubyBBU1BNIHN1cHBvcnQuIE90aGVyd2lzZSwKPiA+IHlvdSds bCBlbmRpbmcgdXAgd2l0aCBidWcgcmVwb3J0cyB3aGVuIHVzZXJzIGNvbm5lY3QgTlZNZSB0byBp dC4KPiAKPiBQbGF0Zm9ybSBzaG91bGQgY2hvb3NlIGNhbGwgb3Igbm8gY2FsbCB0aGlzIGZ1bmN0 aW9uIGFjY29yZGluZyB0byB0aGVpcgo+IHVzZXIgY2FzZS4gU28gZmFyLCBJIGhhdmUgbm90IGZv dW5kIGEgZ29vZCBtYXRob2QgdG8gbGV0IEFTUE0gdG8gYWZmZWN0Cj4gc3VzcGVuZC9yZXN1bWUu IAo+IAoKWW91IGFyZSBtaXNzaW5nIG15IHBvaW50IGhlcmUuIElmIGFueSBwbGF0Zm9ybSBkZWNp ZGVzIHRvIHVzZSB0aGVzZSBoZWxwZXIKZnVuY3Rpb25zLCB0aGV5IHdpbGwgZmFjZSBwcm9ibGVt cyB3aXRoIE5WTWUuIFNvIHBsZWFzZSBhZGQgYSBjaGVjayBmb3IgQVNQTQpzdGF0ZSBiZWZvcmUg ZG9pbmcgYW55IEwyL0wzIGhhbmRsaW5nLgoKSSBhZ3JlZSB0aGF0IGl0IG1heSBub3QgYmUgb3B0 aW1hbCB3LnIudCBwb3dlciBzYXZpbmdzLCBidXQgdGhlIFBDSWUgY29udHJvbGxlcgpkcml2ZXIg c2hvdWxkIHdvcmsgZm9yIGFsbCBkZXZpY2VzLgoKLSBNYW5pCgo+ID4gCj4gPiAtIE1hbmkKPiA+ IAo+ID4gPiBUaGlzIEFQSSBoZWxwIHJlbW92ZSBkdXBsaWNhdGUgY29kZXMgYW5kIGl0IGNhbiBi ZSBpbXByb3ZlZCBncmFkdWFsbHkuCj4gPiA+IAo+ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiAtIE1h bmkKPiA+ID4gPiAKPiA+ID4gPiAKPiA+ID4gPiAtLSAKPiA+ID4gPiDgrq7grqPgrr/grrXgrqPg r43grqPgrqngr40g4K6a4K6k4K6+4K6a4K6/4K614K6u4K+NCj4gPiAKPiA+IC0tIAo+ID4g4K6u 4K6j4K6/4K614K6j4K+N4K6j4K6p4K+NIOCumuCupOCuvuCumuCuv+CuteCuruCvjQoKLS0gCuCu ruCuo+Cuv+CuteCuo+CvjeCuo+CuqeCvjSDgrprgrqTgrr7grprgrr/grrXgrq7gr40KCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJu ZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRw Oi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK