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 95F32C43334 for ; Thu, 9 Jun 2022 07:47:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240281AbiFIHrm (ORCPT ); Thu, 9 Jun 2022 03:47:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52126 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232338AbiFIHri (ORCPT ); Thu, 9 Jun 2022 03:47:38 -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 396C3220EA for ; Thu, 9 Jun 2022 00:47:35 -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 1nzCsy-0001aH-Ju; Thu, 09 Jun 2022 09:47:20 +0200 Message-ID: Subject: Re: [PATCH v9 5/8] PCI: imx6: Refine the regulator usage 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:47:18 +0200 In-Reply-To: References: <1651801629-30223-1-git-send-email-hongxing.zhu@nxp.com> <1651801629-30223-6-git-send-email-hongxing.zhu@nxp.com> <2427cef355dc1b9d1667a2c80448d2e23b97c447.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:27 > > 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 5/8] PCI: imx6: Refine the regulator usage > > > > Am Freitag, dem 06.05.2022 um 09:47 +0800 schrieb Richard Zhu: > > > The driver should undo any enables it did itself. The regulator > > > disable shouldn't be basing decisions on regulator_is_enabled(). > > > > > > To keep the balance of the regulator usage counter, disable the > > > regulator just behind of imx6_pcie_assert_core_reset() in resume > > > and > > shutdown. > > > > > > Signed-off-by: Richard Zhu > > > --- > > >  drivers/pci/controller/dwc/pci-imx6.c | 19 +++++++------------ > > >  1 file changed, 7 insertions(+), 12 deletions(-) > > > > > > diff --git a/drivers/pci/controller/dwc/pci-imx6.c > > > b/drivers/pci/controller/dwc/pci-imx6.c > > > index 7005a7910003..3ce3993d5797 100644 > > > --- a/drivers/pci/controller/dwc/pci-imx6.c > > > +++ b/drivers/pci/controller/dwc/pci-imx6.c > > > @@ -369,8 +369,6 @@ static int imx6_pcie_attach_pd(struct device > > > *dev) > > > > > >  static void imx6_pcie_assert_core_reset(struct imx6_pcie > > > *imx6_pcie) > > > { > > > - struct device *dev = imx6_pcie->pci->dev; > > > - > > >   switch (imx6_pcie->drvdata->variant) { > > >   case IMX7D: > > >   case IMX8MQ: > > > @@ -400,14 +398,6 @@ static void > > > imx6_pcie_assert_core_reset(struct > > imx6_pcie *imx6_pcie) > > >   IMX6Q_GPR1_PCIE_REF_CLK_EN, 0 > > > << 16); > > >   break; > > >   } > > > - > > > - if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie- > > > >vpcie) > 0) { > > > - int ret = regulator_disable(imx6_pcie->vpcie); > > > - > > > - if (ret) > > > - dev_err(dev, "failed to disable vpcie > > > regulator: %d\n", > > > - ret); > > > - } > > >  } > > > > > >  static unsigned int imx6_pcie_grp_offset(const struct imx6_pcie > > > *imx6_pcie) @@ -580,7 +570,7 @@ static int > > imx6_pcie_deassert_core_reset(struct imx6_pcie *imx6_pcie) > > >   struct device *dev = pci->dev; > > >   int ret, err; > > > > > > - if (imx6_pcie->vpcie && !regulator_is_enabled(imx6_pcie- > > > >vpcie)) { > > > + if (imx6_pcie->vpcie) { > > >   ret = regulator_enable(imx6_pcie->vpcie); > > >   if (ret) { > > >   dev_err(dev, "failed to enable vpcie > > > regulator: %d\n", @@ > > -653,7 > > > +643,7 @@ static int imx6_pcie_deassert_core_reset(struct > > > imx6_pcie > > *imx6_pcie) > > >   return 0; > > > > > >  err_clks: > > > - if (imx6_pcie->vpcie && regulator_is_enabled(imx6_pcie- > > > >vpcie) > 0) { > > > + if (imx6_pcie->vpcie) { > > >   ret = regulator_disable(imx6_pcie->vpcie); > > >   if (ret) > > >   dev_err(dev, "failed to disable vpcie > > > regulator: %d\n", @@ > > -1026,6 > > > +1016,9 @@ static int imx6_pcie_resume_noirq(struct device *dev) > > >   return 0; > > > > > >   imx6_pcie_assert_core_reset(imx6_pcie); > > > + if (imx6_pcie->vpcie) > > > + regulator_disable(imx6_pcie->vpcie); > > > + > > This one looks misplaced. Surely you want the regulator to be on > > when > > resuming the PCIe subsystem. Isn't this just papering over a wrong > > usage count > > here, because there is no regulator_disable in > > imx6_pcie_suspend_noirq, > > where I would expect this to happen? > > > Hi Lucas: > Thanks for your comments. > There was one regulator_disable() operation at the end of the >  imx6_pcie_assert_core_reset() function before. > When create the 5/8 patch, I follow the same behavior to disable the > regulator just behind the imx6_pcie_assert_core_reset() function. > > Yes, it is. Imx6_pcie_suspend_noirq doesn't have the > regulator_disable. > The regulaor_enable is contained in imx6_pcie_deassert_core_reset(). > Both of the regulator_disable and regulator_enabe are invoked once in >  imx6_pcie_resume_noirq. > So, the regulator is on and has a balanced usage count after resume. > Yea, my argument is that when we are moving around the regulator handling anyways, we should move the regulator_disable into the suspend function. It's the right thing to do: we don't want the bus to be powered when the system is in suspend and while the use-count is correct, it's confusing to read the resume function otherwise. Regards, Lucas 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 AF52BC43334 for ; Thu, 9 Jun 2022 07:48:37 +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=Sj3rMIrTd1YNkX/hmk9wFNHliAA7PA+9JvsUyQdnfcE=; b=gkpNTbmiPhQQY1 rt87SrBptVf0A0rrx1D2OVT0TBL/RnWdr4pi3hP22fUghtjB7VXXm7unRdWK8zimcCyTP9lmKBTvN QOlN/mB7VkCRDzuMGLZlX+STbdPrrqitjpj6zXgp3BlyoWpHyScFwNqS+ep3LX9Ff5tpWhVfyhUQS 2wi5UxC9vJyrOHsooAFd75jVqRWEmswBfvYv4x0RU74eSaTktlKojr+QNeKD9XUXotB6UY2eXXmXg C1Jhx/kxl6U17nIZwzR2g15psMLukSJcsOS1/qVmkjL92NBVT4q1/rKeEyENP8ZoJI9j2PsI38IJ/ b/wNGY9ovxJEdVJiNL1Q==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nzCtE-00HXau-0t; Thu, 09 Jun 2022 07:47:36 +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 1nzCtA-00HXVq-Qb for linux-arm-kernel@lists.infradead.org; Thu, 09 Jun 2022 07:47:34 +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 1nzCsy-0001aH-Ju; Thu, 09 Jun 2022 09:47:20 +0200 Message-ID: Subject: Re: [PATCH v9 5/8] PCI: imx6: Refine the regulator usage 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:47:18 +0200 In-Reply-To: References: <1651801629-30223-1-git-send-email-hongxing.zhu@nxp.com> <1651801629-30223-6-git-send-email-hongxing.zhu@nxp.com> <2427cef355dc1b9d1667a2c80448d2e23b97c447.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_004732_900203_742659D4 X-CRM114-Status: GOOD ( 31.70 ) 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 MTU6MjcKPiA+IFRvOiBIb25neGluZyBaaHUgPGhvbmd4aW5nLnpodUBueHAuY29tPjsgYmhlbGdh YXNAZ29vZ2xlLmNvbTsKPiA+IHJvYmgrZHRAa2VybmVsLm9yZzsgYnJvb25pZUBrZXJuZWwub3Jn OyBsb3JlbnpvLnBpZXJhbGlzaUBhcm0uY29tOwo+ID4gamluZ29vaGFuMUBnbWFpbC5jb207IGZl c3RldmFtQGdtYWlsLmNvbTsKPiA+IGZyYW5jZXNjby5kb2xjaW5pQHRvcmFkZXguY29tCj4gPiBD YzogbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsKPiA+IGxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZzsKPiA+IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGtlcm5lbEBw ZW5ndXRyb25peC5kZTsgZGwtbGludXgtaW14Cj4gPiA8bGludXgtaW14QG54cC5jb20+Cj4gPiBT dWJqZWN0OiBSZTogW1BBVENIIHY5IDUvOF0gUENJOiBpbXg2OiBSZWZpbmUgdGhlIHJlZ3VsYXRv ciB1c2FnZQo+ID4gCj4gPiBBbSBGcmVpdGFnLCBkZW0gMDYuMDUuMjAyMiB1bSAwOTo0NyArMDgw MCBzY2hyaWViIFJpY2hhcmQgWmh1Ogo+ID4gPiBUaGUgZHJpdmVyIHNob3VsZCB1bmRvIGFueSBl bmFibGVzIGl0IGRpZCBpdHNlbGYuIFRoZSByZWd1bGF0b3IKPiA+ID4gZGlzYWJsZSBzaG91bGRu J3QgYmUgYmFzaW5nIGRlY2lzaW9ucyBvbiByZWd1bGF0b3JfaXNfZW5hYmxlZCgpLgo+ID4gPiAK PiA+ID4gVG8ga2VlcCB0aGUgYmFsYW5jZSBvZiB0aGUgcmVndWxhdG9yIHVzYWdlIGNvdW50ZXIs IGRpc2FibGUgdGhlCj4gPiA+IHJlZ3VsYXRvciBqdXN0IGJlaGluZCBvZiBpbXg2X3BjaWVfYXNz ZXJ0X2NvcmVfcmVzZXQoKSBpbiByZXN1bWUKPiA+ID4gYW5kCj4gPiBzaHV0ZG93bi4KPiA+ID4g Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IFJpY2hhcmQgWmh1IDxob25neGluZy56aHVAbnhwLmNvbT4K PiA+ID4gLS0tCj4gPiA+IMKgZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWlteDYuYyB8 IDE5ICsrKysrKystLS0tLS0tLS0tLS0KPiA+ID4gwqAxIGZpbGUgY2hhbmdlZCwgNyBpbnNlcnRp b25zKCspLCAxMiBkZWxldGlvbnMoLSkKPiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJz L3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+IGIvZHJpdmVycy9wY2kvY29udHJv bGxlci9kd2MvcGNpLWlteDYuYwo+ID4gPiBpbmRleCA3MDA1YTc5MTAwMDMuLjNjZTM5OTNkNTc5 NyAxMDA2NDQKPiA+ID4gLS0tIGEvZHJpdmVycy9wY2kvY29udHJvbGxlci9kd2MvcGNpLWlteDYu Ywo+ID4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL2R3Yy9wY2ktaW14Ni5jCj4gPiA+ IEBAIC0zNjksOCArMzY5LDYgQEAgc3RhdGljIGludCBpbXg2X3BjaWVfYXR0YWNoX3BkKHN0cnVj dCBkZXZpY2UKPiA+ID4gKmRldikKPiA+ID4gCj4gPiA+IMKgc3RhdGljIHZvaWQgaW14Nl9wY2ll X2Fzc2VydF9jb3JlX3Jlc2V0KHN0cnVjdCBpbXg2X3BjaWUKPiA+ID4gKmlteDZfcGNpZSkKPiA+ ID4gewo+ID4gPiAtCXN0cnVjdCBkZXZpY2UgKmRldiA9IGlteDZfcGNpZS0+cGNpLT5kZXY7Cj4g PiA+IC0KPiA+ID4gwqAJc3dpdGNoIChpbXg2X3BjaWUtPmRydmRhdGEtPnZhcmlhbnQpIHsKPiA+ ID4gwqAJY2FzZSBJTVg3RDoKPiA+ID4gwqAJY2FzZSBJTVg4TVE6Cj4gPiA+IEBAIC00MDAsMTQg KzM5OCw2IEBAIHN0YXRpYyB2b2lkCj4gPiA+IGlteDZfcGNpZV9hc3NlcnRfY29yZV9yZXNldChz dHJ1Y3QKPiA+IGlteDZfcGNpZSAqaW14Nl9wY2llKQo+ID4gPiDCoAkJCQkgICBJTVg2UV9HUFIx X1BDSUVfUkVGX0NMS19FTiwgMAo+ID4gPiA8PCAxNik7Cj4gPiA+IMKgCQlicmVhazsKPiA+ID4g wqAJfQo+ID4gPiAtCj4gPiA+IC0JaWYgKGlteDZfcGNpZS0+dnBjaWUgJiYgcmVndWxhdG9yX2lz X2VuYWJsZWQoaW14Nl9wY2llLQo+ID4gPiA+dnBjaWUpID4gMCkgewo+ID4gPiAtCQlpbnQgcmV0 ID0gcmVndWxhdG9yX2Rpc2FibGUoaW14Nl9wY2llLT52cGNpZSk7Cj4gPiA+IC0KPiA+ID4gLQkJ aWYgKHJldCkKPiA+ID4gLQkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGRpc2FibGUgdnBjaWUK PiA+ID4gcmVndWxhdG9yOiAlZFxuIiwKPiA+ID4gLQkJCQlyZXQpOwo+ID4gPiAtCX0KPiA+ID4g wqB9Cj4gPiA+IAo+ID4gPiDCoHN0YXRpYyB1bnNpZ25lZCBpbnQgaW14Nl9wY2llX2dycF9vZmZz ZXQoY29uc3Qgc3RydWN0IGlteDZfcGNpZQo+ID4gPiAqaW14Nl9wY2llKSBAQCAtNTgwLDcgKzU3 MCw3IEBAIHN0YXRpYyBpbnQKPiA+IGlteDZfcGNpZV9kZWFzc2VydF9jb3JlX3Jlc2V0KHN0cnVj dCBpbXg2X3BjaWUgKmlteDZfcGNpZSkKPiA+ID4gwqAJc3RydWN0IGRldmljZSAqZGV2ID0gcGNp LT5kZXY7Cj4gPiA+IMKgCWludCByZXQsIGVycjsKPiA+ID4gCj4gPiA+IC0JaWYgKGlteDZfcGNp ZS0+dnBjaWUgJiYgIXJlZ3VsYXRvcl9pc19lbmFibGVkKGlteDZfcGNpZS0KPiA+ID4gPnZwY2ll KSkgewo+ID4gPiArCWlmIChpbXg2X3BjaWUtPnZwY2llKSB7Cj4gPiA+IMKgCQlyZXQgPSByZWd1 bGF0b3JfZW5hYmxlKGlteDZfcGNpZS0+dnBjaWUpOwo+ID4gPiDCoAkJaWYgKHJldCkgewo+ID4g PiDCoAkJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSB2cGNpZQo+ID4gPiByZWd1bGF0 b3I6ICVkXG4iLCBAQAo+ID4gLTY1Myw3Cj4gPiA+ICs2NDMsNyBAQCBzdGF0aWMgaW50IGlteDZf cGNpZV9kZWFzc2VydF9jb3JlX3Jlc2V0KHN0cnVjdAo+ID4gPiBpbXg2X3BjaWUKPiA+ICppbXg2 X3BjaWUpCj4gPiA+IMKgCXJldHVybiAwOwo+ID4gPiAKPiA+ID4gwqBlcnJfY2xrczoKPiA+ID4g LQlpZiAoaW14Nl9wY2llLT52cGNpZSAmJiByZWd1bGF0b3JfaXNfZW5hYmxlZChpbXg2X3BjaWUt Cj4gPiA+ID52cGNpZSkgPiAwKSB7Cj4gPiA+ICsJaWYgKGlteDZfcGNpZS0+dnBjaWUpIHsKPiA+ ID4gwqAJCXJldCA9IHJlZ3VsYXRvcl9kaXNhYmxlKGlteDZfcGNpZS0+dnBjaWUpOwo+ID4gPiDC oAkJaWYgKHJldCkKPiA+ID4gwqAJCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBkaXNhYmxlIHZw Y2llCj4gPiA+IHJlZ3VsYXRvcjogJWRcbiIsIEBACj4gPiAtMTAyNiw2Cj4gPiA+ICsxMDE2LDkg QEAgc3RhdGljIGludCBpbXg2X3BjaWVfcmVzdW1lX25vaXJxKHN0cnVjdCBkZXZpY2UgKmRldikK PiA+ID4gwqAJCXJldHVybiAwOwo+ID4gPiAKPiA+ID4gwqAJaW14Nl9wY2llX2Fzc2VydF9jb3Jl X3Jlc2V0KGlteDZfcGNpZSk7Cj4gPiA+ICsJaWYgKGlteDZfcGNpZS0+dnBjaWUpCj4gPiA+ICsJ CXJlZ3VsYXRvcl9kaXNhYmxlKGlteDZfcGNpZS0+dnBjaWUpOwo+ID4gPiArCj4gPiBUaGlzIG9u ZSBsb29rcyBtaXNwbGFjZWQuIFN1cmVseSB5b3Ugd2FudCB0aGUgcmVndWxhdG9yIHRvIGJlIG9u Cj4gPiB3aGVuCj4gPiByZXN1bWluZyB0aGUgUENJZSBzdWJzeXN0ZW0uIElzbid0IHRoaXMganVz dCBwYXBlcmluZyBvdmVyIGEgd3JvbmcKPiA+IHVzYWdlIGNvdW50Cj4gPiBoZXJlLCBiZWNhdXNl IHRoZXJlIGlzIG5vIHJlZ3VsYXRvcl9kaXNhYmxlIGluCj4gPiBpbXg2X3BjaWVfc3VzcGVuZF9u b2lycSwKPiA+IHdoZXJlIEkgd291bGQgZXhwZWN0IHRoaXMgdG8gaGFwcGVuPwo+ID4gCj4gSGkg THVjYXM6Cj4gVGhhbmtzIGZvciB5b3VyIGNvbW1lbnRzLgo+IFRoZXJlIHdhcyBvbmUgcmVndWxh dG9yX2Rpc2FibGUoKSBvcGVyYXRpb24gYXQgdGhlIGVuZCBvZiB0aGUKPiDCoGlteDZfcGNpZV9h c3NlcnRfY29yZV9yZXNldCgpIGZ1bmN0aW9uIGJlZm9yZS4KPiBXaGVuIGNyZWF0ZSB0aGUgNS84 IHBhdGNoLCBJIGZvbGxvdyB0aGUgc2FtZSBiZWhhdmlvciB0byBkaXNhYmxlIHRoZQo+IHJlZ3Vs YXRvciBqdXN0IGJlaGluZCB0aGUgaW14Nl9wY2llX2Fzc2VydF9jb3JlX3Jlc2V0KCkgZnVuY3Rp b24uCj4gCj4gWWVzLCBpdCBpcy4gSW14Nl9wY2llX3N1c3BlbmRfbm9pcnEgZG9lc24ndCBoYXZl IHRoZQo+IHJlZ3VsYXRvcl9kaXNhYmxlLgo+IFRoZSByZWd1bGFvcl9lbmFibGUgaXMgY29udGFp bmVkIGluIGlteDZfcGNpZV9kZWFzc2VydF9jb3JlX3Jlc2V0KCkuCj4gQm90aCBvZiB0aGUgcmVn dWxhdG9yX2Rpc2FibGUgYW5kIHJlZ3VsYXRvcl9lbmFiZSBhcmUgaW52b2tlZCBvbmNlIGluCj4g wqBpbXg2X3BjaWVfcmVzdW1lX25vaXJxLgo+IFNvLCB0aGUgcmVndWxhdG9yIGlzIG9uIGFuZCBo YXMgYSBiYWxhbmNlZCB1c2FnZSBjb3VudCBhZnRlciByZXN1bWUuCj4gCgpZZWEsIG15IGFyZ3Vt ZW50IGlzIHRoYXQgd2hlbiB3ZSBhcmUgbW92aW5nIGFyb3VuZCB0aGUgcmVndWxhdG9yCmhhbmRs aW5nIGFueXdheXMsIHdlIHNob3VsZCBtb3ZlIHRoZSByZWd1bGF0b3JfZGlzYWJsZSBpbnRvIHRo ZSBzdXNwZW5kCmZ1bmN0aW9uLiBJdCdzIHRoZSByaWdodCB0aGluZyB0byBkbzogd2UgZG9uJ3Qg d2FudCB0aGUgYnVzIHRvIGJlCnBvd2VyZWQgd2hlbiB0aGUgc3lzdGVtIGlzIGluIHN1c3BlbmQg YW5kIHdoaWxlIHRoZSB1c2UtY291bnQgaXMKY29ycmVjdCwgaXQncyBjb25mdXNpbmcgdG8gcmVh ZCB0aGUgcmVzdW1lIGZ1bmN0aW9uIG90aGVyd2lzZS4KClJlZ2FyZHMsCkx1Y2FzCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5l bCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=