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 B4689C43334 for ; Thu, 9 Jun 2022 07:55:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240365AbiFIHza (ORCPT ); Thu, 9 Jun 2022 03:55:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59720 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238994AbiFIHz1 (ORCPT ); Thu, 9 Jun 2022 03:55:27 -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 43D3B2F0 for ; Thu, 9 Jun 2022 00:55:25 -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 1nzD0c-0002lU-Le; Thu, 09 Jun 2022 09:55:14 +0200 Message-ID: Subject: Re: [PATCH v9 6/8] PCI: imx6: Disable clocks and regulators after link is down From: Lucas Stach To: Hongxing Zhu , "bhelgaas@google.com" , "robh+dt@kernel.org" , "broonie@kernel.org" , "lorenzo.pieralisi@arm.com" , "jingoohan1@gmail.com" , "festevam@gmail.com" , "francesco.dolcini@toradex.com" Cc: "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Date: Thu, 09 Jun 2022 09:55:13 +0200 In-Reply-To: References: <1651801629-30223-1-git-send-email-hongxing.zhu@nxp.com> <1651801629-30223-7-git-send-email-hongxing.zhu@nxp.com> <5be4f4322e00e33fa9417280b0d74ecb7aab913e.camel@pengutronix.de> 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 Am Donnerstag, dem 09.06.2022 um 06:17 +0000 schrieb Hongxing Zhu: > > -----Original Message----- > > From: Lucas Stach > > Sent: 2022年6月8日 15:35 > > To: Hongxing Zhu ; bhelgaas@google.com; > > robh+dt@kernel.org; broonie@kernel.org; lorenzo.pieralisi@arm.com; > > jingoohan1@gmail.com; festevam@gmail.com; > > francesco.dolcini@toradex.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 v9 6/8] PCI: imx6: Disable clocks and > > regulators after link is > > down > > > > Am Freitag, dem 06.05.2022 um 09:47 +0800 schrieb Richard Zhu: > > > Since i.MX PCIe doesn't support hot-plug, reduce power > > > consumption as > > > much as possible by disabling clocks and regulators and returning > > > error when the link is down. > > > > > > Signed-off-by: Richard Zhu > > > --- > > >  drivers/pci/controller/dwc/pci-imx6.c | 19 +++++++++++++++---- > > >  1 file changed, 15 insertions(+), 4 deletions(-) > > > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c > > > b/drivers/pci/controller/dwc/pci-imx6.c > > > index 3ce3993d5797..d122c12193a6 100644 > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > > @@ -845,7 +845,9 @@ static int imx6_pcie_start_link(struct > > > dw_pcie *pci) > > >   /* Start LTSSM. */ > > >   imx6_pcie_ltssm_enable(dev); > > > > > > - dw_pcie_wait_for_link(pci); > > > + ret = dw_pcie_wait_for_link(pci); > > > + if (ret) > > > + goto err_out; > > > > This adds back error handling that has been intentionally removed > > in > > f81f095e8771 ("PCI: imx6: Allow to probe when > > dw_pcie_wait_for_link() fails"). > > While I agree that disabling the clocks and regulators is the right > > thing to do > > when we don't manage to get a link, we should still allow the > > driver to probe, > > so please add a "ret = 0" to this newly added non-fatal error > > paths. > > > Thanks for your review comments. > There would be a long latency if the link is down and probe is > finished >  successfully. > Since the dw_pcie_wait_for_link() would be invoked twice in every > driver probe >  and resume operation later. Each dw_pcie_wait_for_link() would > consume about >  90,000*10 ~ 100,000*10 u-seconds. I'm afraid that such a long > latency would >  bring bad user experience. > > Here are the logs when probe is allowed when PCIe link is down: > [ 55.045954][ T1835] imx6q-pcie 5f000000.pcie: PM: calling > imx6_pcie_resume_noirq.742dfa074b40dca7ca925f0c49c905ec.cfi_jt+0x0/0x > 8 @ 1835, parent: bus@5f000000 > ... > [ 56.074566][ T1835] imx6q-pcie 5f000000.pcie: Phy link never came > up > [ 57.074816][ T1835] imx6q-pcie 5f000000.pcie: Phy link never came > up > ... > [ 57.182300][ T1835] imx6q-pcie 5f000000.pcie: PM: > imx6_pcie_resume_noirq.742dfa074b40dca7ca925f0c49c905ec.cfi_jt+0x0/0x > 8 returned 0 after 2136334 usecs > > [ 57.182347][ T1835] imx6q-pcie 5f010000.pcie: PM: calling > imx6_pcie_resume_noirq.742dfa074b40dca7ca925f0c49c905ec.cfi_jt+0x0/0x > 8 @ 1835, parent: bus@5f000000 > ... > [ 58.210584][ T1835] imx6q-pcie 5f010000.pcie: Phy link never came > up > [ 59.210831][ T1835] imx6q-pcie 5f010000.pcie: Phy link never came > up > ... > [ 59.318313][ T1835] imx6q-pcie 5f010000.pcie: PM: > imx6_pcie_resume_noirq.742dfa074b40dca7ca925f0c49c905ec.cfi_jt+0x0/0x > 8 returned 0 after 2135949 usecs > > So, I'm prefer that it's better to let the probe failed when link is > down. > How do you think about that? It different from the behavior of other platforms, that still show the root bridge in lspci, even if the link is down. I've seen people confused by this behavior. Come to think about it: does lspci work when all the clocks are disabled? The latency in the probe path is not that relevant, as it is done asynchronous, so it doesn't stall the boot process. You have a point on the suspend/resume path however. Maybe we need to remember the link state in suspend to know if resume should even do anything useful? Regards, Lucas > > > > > > >   if (pci->link_gen == 2) { > > >   /* Allow Gen2 mode after the link is up. */ @@ - > > > 876,12 +878,14 > > @@ > > > static int imx6_pcie_start_link(struct dw_pcie *pci) > > >   ret = > > > imx6_pcie_wait_for_speed_change(imx6_pcie); > > >   if (ret) { > > >   dev_err(dev, "Failed to bring > > > link up!\n"); > > > - goto err_reset_phy; > > > + goto err_out; > > >   } > > >   } > > > > > >   /* Make sure link training is finished as well! > > > */ > > > - dw_pcie_wait_for_link(pci); > > > + ret = dw_pcie_wait_for_link(pci); > > > + if (ret) > > > + goto err_out; > > >   } else { > > >   dev_info(dev, "Link: Gen2 disabled\n"); > > >   } > > > @@ -890,11 +894,18 @@ static int imx6_pcie_start_link(struct > > > dw_pcie > > *pci) > > >   dev_info(dev, "Link up, Gen%i\n", tmp & > > > PCI_EXP_LNKSTA_CLS); > > >   return 0; > > > > > > -err_reset_phy: > > > +err_out: > > >   dev_dbg(dev, "PHY DEBUG_R0=0x%08x DEBUG_R1=0x%08x\n", > > >   dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG0), > > >   dw_pcie_readl_dbi(pci, PCIE_PORT_DEBUG1)); > > >   imx6_pcie_reset_phy(imx6_pcie); > > > + imx6_pcie_clk_disable(imx6_pcie); > > > + if (imx6_pcie->phy != NULL) { > > > > Please use the more common if (imx6_pcie->phy) here. > > > Okay. Thanks. > > Best Regards > Richard Zhu > > > Regards, > > Lucas > > > > > + phy_power_off(imx6_pcie->phy); > > > + phy_exit(imx6_pcie->phy); > > > + } > > > + if (imx6_pcie->vpcie) > > > + regulator_disable(imx6_pcie->vpcie); > > >   return ret; > > >  } > > > > > > 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 CBF44C433EF for ; Thu, 9 Jun 2022 07:56:35 +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: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=JZncTW96PH7F+Fb54lrFKDTpIEakTc3glTrrVFRSmHI=; b=S2H7BlW4Fcrd0P OKtPpdKjqtLHW7mdRzkGAJNSqdTX15iiXrOi+UUn7nbLNtiHVzy+m2wr3rjYHSuSgtt7kamE7rC18 C7KbHwKAdoetIc2HRX0fwjKE51WJekgSMuLICzt5Pi1cL01IHCfzyETDok8SiSZzZMWnvtaVIas6W 3byKmgjZB1moLw0spbPh1Ft1fHPRKRvAyuB0TDtzjvJKKqwJ+rtoQ5kIXWkCFnW+R4OBG4aRWsegG UAl0jSGCikVk+h2L85PNdFwsBNvuyJfJSOmX2YA9gaBBx+yvS9vnKHxENUMqs7YASPddo6p7QUPw8 9u/ImKRbmDSVHj5XwIXw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nzD0r-0001cL-SG; Thu, 09 Jun 2022 07:55:30 +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 1nzD0l-0001Z8-Ho for linux-arm-kernel@lists.infradead.org; Thu, 09 Jun 2022 07:55:25 +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 1nzD0c-0002lU-Le; Thu, 09 Jun 2022 09:55:14 +0200 Message-ID: Subject: Re: [PATCH v9 6/8] PCI: imx6: Disable clocks and regulators after link is down From: Lucas Stach To: Hongxing Zhu , "bhelgaas@google.com" , "robh+dt@kernel.org" , "broonie@kernel.org" , "lorenzo.pieralisi@arm.com" , "jingoohan1@gmail.com" , "festevam@gmail.com" , "francesco.dolcini@toradex.com" Cc: "linux-pci@vger.kernel.org" , "linux-arm-kernel@lists.infradead.org" , "linux-kernel@vger.kernel.org" , "kernel@pengutronix.de" , dl-linux-imx Date: Thu, 09 Jun 2022 09:55:13 +0200 In-Reply-To: References: <1651801629-30223-1-git-send-email-hongxing.zhu@nxp.com> <1651801629-30223-7-git-send-email-hongxing.zhu@nxp.com> <5be4f4322e00e33fa9417280b0d74ecb7aab913e.camel@pengutronix.de> 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-20220609_005523_621583_CE7170E2 X-CRM114-Status: GOOD ( 41.03 ) 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 QW0gRG9ubmVyc3RhZywgZGVtIDA5LjA2LjIwMjIgdW0gMDY6MTcgKzAwMDAgc2NocmllYiBIb25n eGluZyBaaHU6Cj4gPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+ID4gRnJvbTogTHVjYXMg U3RhY2ggPGwuc3RhY2hAcGVuZ3V0cm9uaXguZGU+Cj4gPiBTZW50OiAyMDIy5bm0NuaciDjml6Ug MTU6MzUKPiA+IFRvOiBIb25neGluZyBaaHUgPGhvbmd4aW5nLnpodUBueHAuY29tPjsgYmhlbGdh YXNAZ29vZ2xlLmNvbTsKPiA+IHJvYmgrZHRAa2VybmVsLm9yZzsgYnJvb25pZUBrZXJuZWwub3Jn OyBsb3JlbnpvLnBpZXJhbGlzaUBhcm0uY29tOwo+ID4gamluZ29vaGFuMUBnbWFpbC5jb207IGZl c3RldmFtQGdtYWlsLmNvbTsKPiA+IGZyYW5jZXNjby5kb2xjaW5pQHRvcmFkZXguY29tCj4gPiBD YzogbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsKPiA+IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZzsKPiA+IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGtlcm5lbEBw ZW5ndXRyb25peC5kZTsgZGwtbGludXgtaW14Cj4gPiA8bGludXgtaW14QG54cC5jb20+Cj4gPiBT dWJqZWN0OiBSZTogW1BBVENIIHY5IDYvOF0gUENJOiBpbXg2OiBEaXNhYmxlIGNsb2NrcyBhbmQK PiA+IHJlZ3VsYXRvcnMgYWZ0ZXIgbGluayBpcwo+ID4gZG93bgo+ID4gCj4gPiBBbSBGcmVpdGFn LCBkZW0gMDYuMDUuMjAyMiB1bSAwOTo0NyArMDgwMCBzY2hyaWViIFJpY2hhcmQgWmh1Ogo+ID4g PiBTaW5jZSBpLk1YIFBDSWUgZG9lc24ndCBzdXBwb3J0IGhvdC1wbHVnLCByZWR1Y2UgcG93ZXIK PiA+ID4gY29uc3VtcHRpb24gYXMKPiA+ID4gbXVjaCBhcyBwb3NzaWJsZSBieSBkaXNhYmxpbmcg Y2xvY2tzIGFuZCByZWd1bGF0b3JzIGFuZCByZXR1cm5pbmcKPiA+ID4gZXJyb3Igd2hlbiB0aGUg bGluayBpcyBkb3duLgo+ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogUmljaGFyZCBaaHUgPGhv bmd4aW5nLnpodUBueHAuY29tPgo+ID4gPiAtLS0KPiA+ID4gwqBkcml2ZXJzL3BjaS9jb250cm9s bGVyL2R3Yy9wY2ktaW14Ni5jIHwgMTkgKysrKysrKysrKysrKysrLS0tLQo+ID4gPiDCoDEgZmls ZSBjaGFuZ2VkLCAxNSBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQo+ID4gPiAKPiA+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIvZHdjL3BjaS1pbXg2LmMKPiA+ID4g Yi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+IGluZGV4IDNjZTM5 OTNkNTc5Ny4uZDEyMmMxMjE5M2E2IDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL3BjaS9jb250 cm9sbGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+ICsrKyBiL2RyaXZlcnMvcGNpL2NvbnRyb2xsZXIv ZHdjL3BjaS1pbXg2LmMKPiA+ID4gQEAgLTg0NSw3ICs4NDUsOSBAQCBzdGF0aWMgaW50IGlteDZf cGNpZV9zdGFydF9saW5rKHN0cnVjdAo+ID4gPiBkd19wY2llICpwY2kpCj4gPiA+IMKgCS8qIFN0 YXJ0IExUU1NNLiAqLwo+ID4gPiDCoAlpbXg2X3BjaWVfbHRzc21fZW5hYmxlKGRldik7Cj4gPiA+ IAo+ID4gPiAtCWR3X3BjaWVfd2FpdF9mb3JfbGluayhwY2kpOwo+ID4gPiArCXJldCA9IGR3X3Bj aWVfd2FpdF9mb3JfbGluayhwY2kpOwo+ID4gPiArCWlmIChyZXQpCj4gPiA+ICsJCWdvdG8gZXJy X291dDsKPiA+IAo+ID4gVGhpcyBhZGRzIGJhY2sgZXJyb3IgaGFuZGxpbmcgdGhhdCBoYXMgYmVl biBpbnRlbnRpb25hbGx5IHJlbW92ZWQKPiA+IGluCj4gPiBmODFmMDk1ZTg3NzEgKCJQQ0k6IGlt eDY6IEFsbG93IHRvIHByb2JlIHdoZW4KPiA+IGR3X3BjaWVfd2FpdF9mb3JfbGluaygpIGZhaWxz IikuCj4gPiBXaGlsZSBJIGFncmVlIHRoYXQgZGlzYWJsaW5nIHRoZSBjbG9ja3MgYW5kIHJlZ3Vs YXRvcnMgaXMgdGhlIHJpZ2h0Cj4gPiB0aGluZyB0byBkbwo+ID4gd2hlbiB3ZSBkb24ndCBtYW5h Z2UgdG8gZ2V0IGEgbGluaywgd2Ugc2hvdWxkIHN0aWxsIGFsbG93IHRoZQo+ID4gZHJpdmVyIHRv IHByb2JlLAo+ID4gc28gcGxlYXNlIGFkZCBhICJyZXQgPSAwIiB0byB0aGlzIG5ld2x5IGFkZGVk IG5vbi1mYXRhbCBlcnJvcgo+ID4gcGF0aHMuCj4gPiAKPiBUaGFua3MgZm9yIHlvdXIgcmV2aWV3 IGNvbW1lbnRzLgo+IFRoZXJlIHdvdWxkIGJlIGEgbG9uZyBsYXRlbmN5IGlmIHRoZSBsaW5rIGlz IGRvd24gYW5kIHByb2JlIGlzCj4gZmluaXNoZWQKPiDCoHN1Y2Nlc3NmdWxseS4KPiBTaW5jZSB0 aGUgZHdfcGNpZV93YWl0X2Zvcl9saW5rKCkgd291bGQgYmUgaW52b2tlZCB0d2ljZSBpbiBldmVy eQo+IGRyaXZlciBwcm9iZQo+IMKgYW5kIHJlc3VtZSBvcGVyYXRpb24gbGF0ZXIuIEVhY2ggZHdf cGNpZV93YWl0X2Zvcl9saW5rKCkgd291bGQKPiBjb25zdW1lIGFib3V0Cj4gwqA5MCwwMDAqMTAg fiAxMDAsMDAwKjEwIHUtc2Vjb25kcy4gSSdtIGFmcmFpZCB0aGF0IHN1Y2ggYSBsb25nCj4gbGF0 ZW5jeSB3b3VsZAo+IMKgYnJpbmcgYmFkIHVzZXIgZXhwZXJpZW5jZS4KPiAKPiBIZXJlIGFyZSB0 aGUgbG9ncyB3aGVuIHByb2JlIGlzIGFsbG93ZWQgd2hlbiBQQ0llIGxpbmsgaXMgZG93bjoKPiBb ICAgNTUuMDQ1OTU0XVsgVDE4MzVdIGlteDZxLXBjaWUgNWYwMDAwMDAucGNpZTogUE06IGNhbGxp bmcKPiBpbXg2X3BjaWVfcmVzdW1lX25vaXJxLjc0MmRmYTA3NGI0MGRjYTdjYTkyNWYwYzQ5Yzkw NWVjLmNmaV9qdCsweDAvMHgKPiA4IEAgMTgzNSwgcGFyZW50OiBidXNANWYwMDAwMDAKPiAuLi4K PiBbICAgNTYuMDc0NTY2XVsgVDE4MzVdIGlteDZxLXBjaWUgNWYwMDAwMDAucGNpZTogUGh5IGxp bmsgbmV2ZXIgY2FtZQo+IHVwCj4gWyAgIDU3LjA3NDgxNl1bIFQxODM1XSBpbXg2cS1wY2llIDVm MDAwMDAwLnBjaWU6IFBoeSBsaW5rIG5ldmVyIGNhbWUKPiB1cAo+IC4uLgo+IFsgICA1Ny4xODIz MDBdWyBUMTgzNV0gaW14NnEtcGNpZSA1ZjAwMDAwMC5wY2llOiBQTToKPiBpbXg2X3BjaWVfcmVz dW1lX25vaXJxLjc0MmRmYTA3NGI0MGRjYTdjYTkyNWYwYzQ5YzkwNWVjLmNmaV9qdCsweDAvMHgK PiA4IHJldHVybmVkIDAgYWZ0ZXIgMjEzNjMzNCB1c2Vjcwo+IAo+IFsgICA1Ny4xODIzNDddWyBU MTgzNV0gaW14NnEtcGNpZSA1ZjAxMDAwMC5wY2llOiBQTTogY2FsbGluZwo+IGlteDZfcGNpZV9y ZXN1bWVfbm9pcnEuNzQyZGZhMDc0YjQwZGNhN2NhOTI1ZjBjNDljOTA1ZWMuY2ZpX2p0KzB4MC8w eAo+IDggQCAxODM1LCBwYXJlbnQ6IGJ1c0A1ZjAwMDAwMAo+IC4uLgo+IFsgICA1OC4yMTA1ODRd WyBUMTgzNV0gaW14NnEtcGNpZSA1ZjAxMDAwMC5wY2llOiBQaHkgbGluayBuZXZlciBjYW1lCj4g dXAKPiBbICAgNTkuMjEwODMxXVsgVDE4MzVdIGlteDZxLXBjaWUgNWYwMTAwMDAucGNpZTogUGh5 IGxpbmsgbmV2ZXIgY2FtZQo+IHVwCj4gLi4uCj4gWyAgIDU5LjMxODMxM11bIFQxODM1XSBpbXg2 cS1wY2llIDVmMDEwMDAwLnBjaWU6IFBNOgo+IGlteDZfcGNpZV9yZXN1bWVfbm9pcnEuNzQyZGZh MDc0YjQwZGNhN2NhOTI1ZjBjNDljOTA1ZWMuY2ZpX2p0KzB4MC8weAo+IDggcmV0dXJuZWQgMCBh ZnRlciAyMTM1OTQ5IHVzZWNzCj4gCj4gU28sIEknbSBwcmVmZXIgdGhhdCBpdCdzIGJldHRlciB0 byBsZXQgdGhlIHByb2JlIGZhaWxlZCB3aGVuIGxpbmsgaXMKPiBkb3duLiAKPiBIb3cgZG8geW91 IHRoaW5rIGFib3V0IHRoYXQ/CgpJdCBkaWZmZXJlbnQgZnJvbSB0aGUgYmVoYXZpb3Igb2Ygb3Ro ZXIgcGxhdGZvcm1zLCB0aGF0IHN0aWxsIHNob3cgdGhlCnJvb3QgYnJpZGdlIGluIGxzcGNpLCBl dmVuIGlmIHRoZSBsaW5rIGlzIGRvd24uIEkndmUgc2VlbiBwZW9wbGUKY29uZnVzZWQgYnkgdGhp cyBiZWhhdmlvci4gQ29tZSB0byB0aGluayBhYm91dCBpdDogZG9lcyBsc3BjaSB3b3JrIHdoZW4K YWxsIHRoZSBjbG9ja3MgYXJlIGRpc2FibGVkPwoKVGhlIGxhdGVuY3kgaW4gdGhlIHByb2JlIHBh dGggaXMgbm90IHRoYXQgcmVsZXZhbnQsIGFzIGl0IGlzIGRvbmUKYXN5bmNocm9ub3VzLCBzbyBp dCBkb2Vzbid0IHN0YWxsIHRoZSBib290IHByb2Nlc3MuIFlvdSBoYXZlIGEgcG9pbnQgb24KdGhl IHN1c3BlbmQvcmVzdW1lIHBhdGggaG93ZXZlci4gTWF5YmUgd2UgbmVlZCB0byByZW1lbWJlciB0 aGUgbGluawpzdGF0ZSBpbiBzdXNwZW5kIHRvIGtub3cgaWYgcmVzdW1lIHNob3VsZCBldmVuIGRv IGFueXRoaW5nIHVzZWZ1bD8KClJlZ2FyZHMsCkx1Y2FzCgo+IAo+ID4gPiAKPiA+ID4gwqAJaWYg KHBjaS0+bGlua19nZW4gPT0gMikgewo+ID4gPiDCoAkJLyogQWxsb3cgR2VuMiBtb2RlIGFmdGVy IHRoZSBsaW5rIGlzIHVwLiAqLyBAQCAtCj4gPiA+IDg3NiwxMiArODc4LDE0Cj4gPiBAQAo+ID4g PiBzdGF0aWMgaW50IGlteDZfcGNpZV9zdGFydF9saW5rKHN0cnVjdCBkd19wY2llICpwY2kpCj4g PiA+IMKgCQkJcmV0ID0KPiA+ID4gaW14Nl9wY2llX3dhaXRfZm9yX3NwZWVkX2NoYW5nZShpbXg2 X3BjaWUpOwo+ID4gPiDCoAkJCWlmIChyZXQpIHsKPiA+ID4gwqAJCQkJZGV2X2VycihkZXYsICJG YWlsZWQgdG8gYnJpbmcKPiA+ID4gbGluayB1cCFcbiIpOwo+ID4gPiAtCQkJCWdvdG8gZXJyX3Jl c2V0X3BoeTsKPiA+ID4gKwkJCQlnb3RvIGVycl9vdXQ7Cj4gPiA+IMKgCQkJfQo+ID4gPiDCoAkJ fQo+ID4gPiAKPiA+ID4gwqAJCS8qIE1ha2Ugc3VyZSBsaW5rIHRyYWluaW5nIGlzIGZpbmlzaGVk IGFzIHdlbGwhCj4gPiA+ICovCj4gPiA+IC0JCWR3X3BjaWVfd2FpdF9mb3JfbGluayhwY2kpOwo+ ID4gPiArCQlyZXQgPSBkd19wY2llX3dhaXRfZm9yX2xpbmsocGNpKTsKPiA+ID4gKwkJaWYgKHJl dCkKPiA+ID4gKwkJCWdvdG8gZXJyX291dDsKPiA+ID4gwqAJfSBlbHNlIHsKPiA+ID4gwqAJCWRl dl9pbmZvKGRldiwgIkxpbms6IEdlbjIgZGlzYWJsZWRcbiIpOwo+ID4gPiDCoAl9Cj4gPiA+IEBA IC04OTAsMTEgKzg5NCwxOCBAQCBzdGF0aWMgaW50IGlteDZfcGNpZV9zdGFydF9saW5rKHN0cnVj dAo+ID4gPiBkd19wY2llCj4gPiAqcGNpKQo+ID4gPiDCoAlkZXZfaW5mbyhkZXYsICJMaW5rIHVw LCBHZW4laVxuIiwgdG1wICYKPiA+ID4gUENJX0VYUF9MTktTVEFfQ0xTKTsKPiA+ID4gwqAJcmV0 dXJuIDA7Cj4gPiA+IAo+ID4gPiAtZXJyX3Jlc2V0X3BoeToKPiA+ID4gK2Vycl9vdXQ6Cj4gPiA+ IMKgCWRldl9kYmcoZGV2LCAiUEhZIERFQlVHX1IwPTB4JTA4eCBERUJVR19SMT0weCUwOHhcbiIs Cj4gPiA+IMKgCQlkd19wY2llX3JlYWRsX2RiaShwY2ksIFBDSUVfUE9SVF9ERUJVRzApLAo+ID4g PiDCoAkJZHdfcGNpZV9yZWFkbF9kYmkocGNpLCBQQ0lFX1BPUlRfREVCVUcxKSk7Cj4gPiA+IMKg CWlteDZfcGNpZV9yZXNldF9waHkoaW14Nl9wY2llKTsKPiA+ID4gKwlpbXg2X3BjaWVfY2xrX2Rp c2FibGUoaW14Nl9wY2llKTsKPiA+ID4gKwlpZiAoaW14Nl9wY2llLT5waHkgIT0gTlVMTCkgewo+ ID4gCj4gPiBQbGVhc2UgdXNlIHRoZSBtb3JlIGNvbW1vbiBpZiAoaW14Nl9wY2llLT5waHkpIGhl cmUuCj4gPiAKPiBPa2F5LiBUaGFua3MuCj4gCj4gQmVzdCBSZWdhcmRzCj4gUmljaGFyZCBaaHUK PiAKPiA+IFJlZ2FyZHMsCj4gPiBMdWNhcwo+ID4gCj4gPiA+ICsJCXBoeV9wb3dlcl9vZmYoaW14 Nl9wY2llLT5waHkpOwo+ID4gPiArCQlwaHlfZXhpdChpbXg2X3BjaWUtPnBoeSk7Cj4gPiA+ICsJ fQo+ID4gPiArCWlmIChpbXg2X3BjaWUtPnZwY2llKQo+ID4gPiArCQlyZWd1bGF0b3JfZGlzYWJs ZShpbXg2X3BjaWUtPnZwY2llKTsKPiA+ID4gwqAJcmV0dXJuIHJldDsKPiA+ID4gwqB9Cj4gPiA+ IAo+ID4gCj4gCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK