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 43B4DC433F5 for ; Thu, 20 Jan 2022 17:19:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377301AbiATRTW (ORCPT ); Thu, 20 Jan 2022 12:19:22 -0500 Received: from ams.source.kernel.org ([145.40.68.75]:53932 "EHLO ams.source.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S243820AbiATRTV (ORCPT ); Thu, 20 Jan 2022 12:19:21 -0500 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 ams.source.kernel.org (Postfix) with ESMTPS id 04B4CB81DCA; Thu, 20 Jan 2022 17:19:20 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A7B7C340E0; Thu, 20 Jan 2022 17:19:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642699158; bh=0Y/kJB/srmy+r+MEK/5ohc3fkdE7T0+Rn088nWxZJpQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=tlsTCW3Srryxw9CRk5M2HtWOeoYrv8BPvnKoSZ4+Ch22FZDBSltUgNOwN/V0wxOgn 8a0tOHGKxhuMWhaTBGAqB0e/kWnix9Hv3TvGPRP5oDkdpDGx109Cn4tWaRWk8i+jFi oQ+g2z4/oyrj7MZyMwOlilphbV0SY/NDGomPHhXS+bvzhwCBELuDAAIUqRq3HqAeMS AdkXlknIJSOt0LqqsNbMJ4JIjF/tJKMSEC/S6JCxAhnElnrZSOJ65R2Ocv072GYN0M /3TzoQ31ALsAW/1uy+Lg610vHArzmjGEYaK2WKny41i5qCC0GRzXhoW6ixa9JF7U4o YRnzh1rz3pwNw== Received: by pali.im (Postfix) id DFABC791; Thu, 20 Jan 2022 18:19:15 +0100 (CET) Date: Thu, 20 Jan 2022 18:19:15 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Rob Herring Cc: Lorenzo Pieralisi , Bjorn Helgaas , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?utf-8?B?QmVow7pu?= , Russell King , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 05/11] PCI: mvebu: Correctly configure x1/x4 mode Message-ID: <20220120171915.rynfs3hucnfj4kyb@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220112151814.24361-1-pali@kernel.org> <20220112151814.24361-6-pali@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thursday 20 January 2022 11:09:17 Rob Herring wrote: > On Wed, Jan 12, 2022 at 04:18:08PM +0100, Pali Rohár wrote: > > If x1/x4 mode is not set correctly then link with endpoint card is not > > established. > > > > Use DTS property 'num-lanes' to deteriminate x1/x4 mode. > > > > Signed-off-by: Pali Rohár > > --- > > drivers/pci/controller/pci-mvebu.c | 19 ++++++++++++++++++- > > 1 file changed, 18 insertions(+), 1 deletion(-) > > > > diff --git a/drivers/pci/controller/pci-mvebu.c b/drivers/pci/controller/pci-mvebu.c > > index a075ba26cff1..0f2ec0a17874 100644 > > --- a/drivers/pci/controller/pci-mvebu.c > > +++ b/drivers/pci/controller/pci-mvebu.c > > @@ -93,6 +93,7 @@ struct mvebu_pcie_port { > > void __iomem *base; > > u32 port; > > u32 lane; > > + bool is_x4; > > I would just store the number of lanes. > > > int devfn; > > unsigned int mem_target; > > unsigned int mem_attr; > > @@ -233,13 +234,25 @@ static void mvebu_pcie_setup_wins(struct mvebu_pcie_port *port) > > > > static void mvebu_pcie_setup_hw(struct mvebu_pcie_port *port) > > { > > - u32 ctrl, cmd, dev_rev, mask; > > + u32 ctrl, lnkcap, cmd, dev_rev, mask; > > > > /* Setup PCIe controller to Root Complex mode. */ > > ctrl = mvebu_readl(port, PCIE_CTRL_OFF); > > ctrl |= PCIE_CTRL_RC_MODE; > > mvebu_writel(port, ctrl, PCIE_CTRL_OFF); > > > > + /* > > + * Set Maximum Link Width to X1 or X4 in Root Port's PCIe Link > > + * Capability register. This register is defined by PCIe specification > > + * as read-only but this mvebu controller has it as read-write and must > > + * be set to number of SerDes PCIe lanes (1 or 4). If this register is > > + * not set correctly then link with endpoint card is not established. > > + */ > > + lnkcap = mvebu_readl(port, PCIE_CAP_PCIEXP + PCI_EXP_LNKCAP); > > + lnkcap &= ~PCI_EXP_LNKCAP_MLW; > > + lnkcap |= (port->is_x4 ? 4 : 1) << 4; > > then this is just: lanes << 4 As only 1 and 4 are valid valid values, I chose this style (is_x4) to ensure that no other (invalid) value is written into mvebu register. Setting width to smaller number (if incorrect value is provided) still allows controller to work and link should be negotiated. So setting 1 is a sane default when controller does not have configured 4 SerDes lines to PCIe. > > + mvebu_writel(port, lnkcap, PCIE_CAP_PCIEXP + PCI_EXP_LNKCAP); > > + > > /* Disable Root Bridge I/O space, memory space and bus mastering. */ > > cmd = mvebu_readl(port, PCIE_CMD_OFF); > > cmd &= ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER); > > @@ -986,6 +999,7 @@ static int mvebu_pcie_parse_port(struct mvebu_pcie *pcie, > > struct device *dev = &pcie->pdev->dev; > > enum of_gpio_flags flags; > > int reset_gpio, ret; > > + u32 num_lanes; > > > > port->pcie = pcie; > > > > @@ -998,6 +1012,9 @@ static int mvebu_pcie_parse_port(struct mvebu_pcie *pcie, > > if (of_property_read_u32(child, "marvell,pcie-lane", &port->lane)) > > port->lane = 0; > > > > + if (!of_property_read_u32(child, "num-lanes", &num_lanes) && num_lanes == 4) > > + port->is_x4 = true; > > And this can be: > > num_lanes = 1; > of_property_read_u32(child, "num-lanes", &num_lanes); > > If you want to validate the DT is only 1 or 4, make the DT schema do > that. The problem is that there is no schema for this platform and PCIe yet. So adding it would mean to first convert everything to schema and then this constrain can be expressed in schema. I'm planning to look at possibility to write schema for this platform but I do not want to do it before open issues with representation of other pcie properties in dts schema are resolved. > > > + > > port->name = devm_kasprintf(dev, GFP_KERNEL, "pcie%d.%d", port->port, > > port->lane); > > if (!port->name) { > > -- > > 2.20.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 98545C433F5 for ; Thu, 20 Jan 2022 17:20:40 +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=Ef1LqrC5jnoJwb8gkIknDKdKVX795Co9UbMYQMW89lk=; b=T0gxBZoeWRUMoe cAUNPdArlDDAz/3hhIuP1IHx6Zm9O6xZSHfoo6G/lC2lKRGfmrs5x/SUppE2JpBozdTe/HsorjOoK PEDO7clCIGhHCLBJwL0XpmJxLXCc6DtSx8P7E2Jbg8E66md2WjxaLu2dCNynoYzGeQMFQcFhqzx1k 6Fh4qfhIJsIMRE5BBHKPEA/CKTWZaDE9KfKMRbFud3FuCy2OTieCkbmcVY8ZdPMc9KqGnSLmqFXgL InwsQJvPLaV3jPbFmE88DtXrKLN0tbul36nD+KQM8lvWWp2GJmqjFX4Ey9mt/ndyO8RA3HfTTplxv QdQP3W4oIOSYYeooUopA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nAb5p-00CXk2-91; Thu, 20 Jan 2022 17:19:25 +0000 Received: from ams.source.kernel.org ([2604:1380:4601:e00::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1nAb5l-00CXj1-5y for linux-arm-kernel@lists.infradead.org; Thu, 20 Jan 2022 17:19:22 +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 ams.source.kernel.org (Postfix) with ESMTPS id E6250B81DC9; Thu, 20 Jan 2022 17:19:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6A7B7C340E0; Thu, 20 Jan 2022 17:19:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1642699158; bh=0Y/kJB/srmy+r+MEK/5ohc3fkdE7T0+Rn088nWxZJpQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=tlsTCW3Srryxw9CRk5M2HtWOeoYrv8BPvnKoSZ4+Ch22FZDBSltUgNOwN/V0wxOgn 8a0tOHGKxhuMWhaTBGAqB0e/kWnix9Hv3TvGPRP5oDkdpDGx109Cn4tWaRWk8i+jFi oQ+g2z4/oyrj7MZyMwOlilphbV0SY/NDGomPHhXS+bvzhwCBELuDAAIUqRq3HqAeMS AdkXlknIJSOt0LqqsNbMJ4JIjF/tJKMSEC/S6JCxAhnElnrZSOJ65R2Ocv072GYN0M /3TzoQ31ALsAW/1uy+Lg610vHArzmjGEYaK2WKny41i5qCC0GRzXhoW6ixa9JF7U4o YRnzh1rz3pwNw== Received: by pali.im (Postfix) id DFABC791; Thu, 20 Jan 2022 18:19:15 +0100 (CET) Date: Thu, 20 Jan 2022 18:19:15 +0100 From: Pali =?utf-8?B?Um9ow6Fy?= To: Rob Herring Cc: Lorenzo Pieralisi , Bjorn Helgaas , Thomas Petazzoni , Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= , Marek =?utf-8?B?QmVow7pu?= , Russell King , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH v2 05/11] PCI: mvebu: Correctly configure x1/x4 mode Message-ID: <20220120171915.rynfs3hucnfj4kyb@pali> References: <20220105150239.9628-1-pali@kernel.org> <20220112151814.24361-1-pali@kernel.org> <20220112151814.24361-6-pali@kernel.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220120_091921_526949_6AB43177 X-CRM114-Status: GOOD ( 33.02 ) 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 T24gVGh1cnNkYXkgMjAgSmFudWFyeSAyMDIyIDExOjA5OjE3IFJvYiBIZXJyaW5nIHdyb3RlOgo+ IE9uIFdlZCwgSmFuIDEyLCAyMDIyIGF0IDA0OjE4OjA4UE0gKzAxMDAsIFBhbGkgUm9ow6FyIHdy b3RlOgo+ID4gSWYgeDEveDQgbW9kZSBpcyBub3Qgc2V0IGNvcnJlY3RseSB0aGVuIGxpbmsgd2l0 aCBlbmRwb2ludCBjYXJkIGlzIG5vdAo+ID4gZXN0YWJsaXNoZWQuCj4gPiAKPiA+IFVzZSBEVFMg cHJvcGVydHkgJ251bS1sYW5lcycgdG8gZGV0ZXJpbWluYXRlIHgxL3g0IG1vZGUuCj4gPiAKPiA+ IFNpZ25lZC1vZmYtYnk6IFBhbGkgUm9ow6FyIDxwYWxpQGtlcm5lbC5vcmc+Cj4gPiAtLS0KPiA+ ICBkcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5jIHwgMTkgKysrKysrKysrKysrKysr KysrLQo+ID4gIDEgZmlsZSBjaGFuZ2VkLCAxOCBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0p Cj4gPiAKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5j IGIvZHJpdmVycy9wY2kvY29udHJvbGxlci9wY2ktbXZlYnUuYwo+ID4gaW5kZXggYTA3NWJhMjZj ZmYxLi4wZjJlYzBhMTc4NzQgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL3BjaS9jb250cm9sbGVy L3BjaS1tdmVidS5jCj4gPiArKysgYi9kcml2ZXJzL3BjaS9jb250cm9sbGVyL3BjaS1tdmVidS5j Cj4gPiBAQCAtOTMsNiArOTMsNyBAQCBzdHJ1Y3QgbXZlYnVfcGNpZV9wb3J0IHsKPiA+ICAJdm9p ZCBfX2lvbWVtICpiYXNlOwo+ID4gIAl1MzIgcG9ydDsKPiA+ICAJdTMyIGxhbmU7Cj4gPiArCWJv b2wgaXNfeDQ7Cj4gCj4gSSB3b3VsZCBqdXN0IHN0b3JlIHRoZSBudW1iZXIgb2YgbGFuZXMuCj4g Cj4gPiAgCWludCBkZXZmbjsKPiA+ICAJdW5zaWduZWQgaW50IG1lbV90YXJnZXQ7Cj4gPiAgCXVu c2lnbmVkIGludCBtZW1fYXR0cjsKPiA+IEBAIC0yMzMsMTMgKzIzNCwyNSBAQCBzdGF0aWMgdm9p ZCBtdmVidV9wY2llX3NldHVwX3dpbnMoc3RydWN0IG12ZWJ1X3BjaWVfcG9ydCAqcG9ydCkKPiA+ ICAKPiA+ICBzdGF0aWMgdm9pZCBtdmVidV9wY2llX3NldHVwX2h3KHN0cnVjdCBtdmVidV9wY2ll X3BvcnQgKnBvcnQpCj4gPiAgewo+ID4gLQl1MzIgY3RybCwgY21kLCBkZXZfcmV2LCBtYXNrOwo+ ID4gKwl1MzIgY3RybCwgbG5rY2FwLCBjbWQsIGRldl9yZXYsIG1hc2s7Cj4gPiAgCj4gPiAgCS8q IFNldHVwIFBDSWUgY29udHJvbGxlciB0byBSb290IENvbXBsZXggbW9kZS4gKi8KPiA+ICAJY3Ry bCA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfQ1RSTF9PRkYpOwo+ID4gIAljdHJsIHw9IFBDSUVf Q1RSTF9SQ19NT0RFOwo+ID4gIAltdmVidV93cml0ZWwocG9ydCwgY3RybCwgUENJRV9DVFJMX09G Rik7Cj4gPiAgCj4gPiArCS8qCj4gPiArCSAqIFNldCBNYXhpbXVtIExpbmsgV2lkdGggdG8gWDEg b3IgWDQgaW4gUm9vdCBQb3J0J3MgUENJZSBMaW5rCj4gPiArCSAqIENhcGFiaWxpdHkgcmVnaXN0 ZXIuIFRoaXMgcmVnaXN0ZXIgaXMgZGVmaW5lZCBieSBQQ0llIHNwZWNpZmljYXRpb24KPiA+ICsJ ICogYXMgcmVhZC1vbmx5IGJ1dCB0aGlzIG12ZWJ1IGNvbnRyb2xsZXIgaGFzIGl0IGFzIHJlYWQt d3JpdGUgYW5kIG11c3QKPiA+ICsJICogYmUgc2V0IHRvIG51bWJlciBvZiBTZXJEZXMgUENJZSBs YW5lcyAoMSBvciA0KS4gSWYgdGhpcyByZWdpc3RlciBpcwo+ID4gKwkgKiBub3Qgc2V0IGNvcnJl Y3RseSB0aGVuIGxpbmsgd2l0aCBlbmRwb2ludCBjYXJkIGlzIG5vdCBlc3RhYmxpc2hlZC4KPiA+ ICsJICovCj4gPiArCWxua2NhcCA9IG12ZWJ1X3JlYWRsKHBvcnQsIFBDSUVfQ0FQX1BDSUVYUCAr IFBDSV9FWFBfTE5LQ0FQKTsKPiA+ICsJbG5rY2FwICY9IH5QQ0lfRVhQX0xOS0NBUF9NTFc7Cj4g PiArCWxua2NhcCB8PSAocG9ydC0+aXNfeDQgPyA0IDogMSkgPDwgNDsKPiAKPiB0aGVuIHRoaXMg aXMganVzdDogbGFuZXMgPDwgNAoKQXMgb25seSAxIGFuZCA0IGFyZSB2YWxpZCB2YWxpZCB2YWx1 ZXMsIEkgY2hvc2UgdGhpcyBzdHlsZSAoaXNfeDQpIHRvCmVuc3VyZSB0aGF0IG5vIG90aGVyIChp bnZhbGlkKSB2YWx1ZSBpcyB3cml0dGVuIGludG8gbXZlYnUgcmVnaXN0ZXIuClNldHRpbmcgd2lk dGggdG8gc21hbGxlciBudW1iZXIgKGlmIGluY29ycmVjdCB2YWx1ZSBpcyBwcm92aWRlZCkgc3Rp bGwKYWxsb3dzIGNvbnRyb2xsZXIgdG8gd29yayBhbmQgbGluayBzaG91bGQgYmUgbmVnb3RpYXRl ZC4gU28gc2V0dGluZyAxIGlzCmEgc2FuZSBkZWZhdWx0IHdoZW4gY29udHJvbGxlciBkb2VzIG5v dCBoYXZlIGNvbmZpZ3VyZWQgNCBTZXJEZXMgbGluZXMKdG8gUENJZS4KCj4gPiArCW12ZWJ1X3dy aXRlbChwb3J0LCBsbmtjYXAsIFBDSUVfQ0FQX1BDSUVYUCArIFBDSV9FWFBfTE5LQ0FQKTsKPiA+ ICsKPiA+ICAJLyogRGlzYWJsZSBSb290IEJyaWRnZSBJL08gc3BhY2UsIG1lbW9yeSBzcGFjZSBh bmQgYnVzIG1hc3RlcmluZy4gKi8KPiA+ICAJY21kID0gbXZlYnVfcmVhZGwocG9ydCwgUENJRV9D TURfT0ZGKTsKPiA+ICAJY21kICY9IH4oUENJX0NPTU1BTkRfSU8gfCBQQ0lfQ09NTUFORF9NRU1P UlkgfCBQQ0lfQ09NTUFORF9NQVNURVIpOwo+ID4gQEAgLTk4Niw2ICs5OTksNyBAQCBzdGF0aWMg aW50IG12ZWJ1X3BjaWVfcGFyc2VfcG9ydChzdHJ1Y3QgbXZlYnVfcGNpZSAqcGNpZSwKPiA+ICAJ c3RydWN0IGRldmljZSAqZGV2ID0gJnBjaWUtPnBkZXYtPmRldjsKPiA+ICAJZW51bSBvZl9ncGlv X2ZsYWdzIGZsYWdzOwo+ID4gIAlpbnQgcmVzZXRfZ3BpbywgcmV0Owo+ID4gKwl1MzIgbnVtX2xh bmVzOwo+ID4gIAo+ID4gIAlwb3J0LT5wY2llID0gcGNpZTsKPiA+ICAKPiA+IEBAIC05OTgsNiAr MTAxMiw5IEBAIHN0YXRpYyBpbnQgbXZlYnVfcGNpZV9wYXJzZV9wb3J0KHN0cnVjdCBtdmVidV9w Y2llICpwY2llLAo+ID4gIAlpZiAob2ZfcHJvcGVydHlfcmVhZF91MzIoY2hpbGQsICJtYXJ2ZWxs LHBjaWUtbGFuZSIsICZwb3J0LT5sYW5lKSkKPiA+ICAJCXBvcnQtPmxhbmUgPSAwOwo+ID4gIAo+ ID4gKwlpZiAoIW9mX3Byb3BlcnR5X3JlYWRfdTMyKGNoaWxkLCAibnVtLWxhbmVzIiwgJm51bV9s YW5lcykgJiYgbnVtX2xhbmVzID09IDQpCj4gPiArCQlwb3J0LT5pc194NCA9IHRydWU7Cj4gCj4g QW5kIHRoaXMgY2FuIGJlOgo+IAo+IG51bV9sYW5lcyA9IDE7Cj4gb2ZfcHJvcGVydHlfcmVhZF91 MzIoY2hpbGQsICJudW0tbGFuZXMiLCAmbnVtX2xhbmVzKTsKPiAKPiBJZiB5b3Ugd2FudCB0byB2 YWxpZGF0ZSB0aGUgRFQgaXMgb25seSAxIG9yIDQsIG1ha2UgdGhlIERUIHNjaGVtYSBkbyAKPiB0 aGF0LgoKVGhlIHByb2JsZW0gaXMgdGhhdCB0aGVyZSBpcyBubyBzY2hlbWEgZm9yIHRoaXMgcGxh dGZvcm0gYW5kIFBDSWUgeWV0LgpTbyBhZGRpbmcgaXQgd291bGQgbWVhbiB0byBmaXJzdCBjb252 ZXJ0IGV2ZXJ5dGhpbmcgdG8gc2NoZW1hIGFuZCB0aGVuCnRoaXMgY29uc3RyYWluIGNhbiBiZSBl eHByZXNzZWQgaW4gc2NoZW1hLgoKSSdtIHBsYW5uaW5nIHRvIGxvb2sgYXQgcG9zc2liaWxpdHkg dG8gd3JpdGUgc2NoZW1hIGZvciB0aGlzIHBsYXRmb3JtCmJ1dCBJIGRvIG5vdCB3YW50IHRvIGRv IGl0IGJlZm9yZSBvcGVuIGlzc3VlcyB3aXRoIHJlcHJlc2VudGF0aW9uIG9mCm90aGVyIHBjaWUg cHJvcGVydGllcyBpbiBkdHMgc2NoZW1hIGFyZSByZXNvbHZlZC4KCj4gCj4gPiArCj4gPiAgCXBv cnQtPm5hbWUgPSBkZXZtX2thc3ByaW50ZihkZXYsIEdGUF9LRVJORUwsICJwY2llJWQuJWQiLCBw b3J0LT5wb3J0LAo+ID4gIAkJCQkgICAgcG9ydC0+bGFuZSk7Cj4gPiAgCWlmICghcG9ydC0+bmFt ZSkgewo+ID4gLS0gCj4gPiAyLjIwLjEKPiA+IAo+ID4gCgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdAps aW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVh ZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==