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 X-Spam-Level: X-Spam-Status: No, score=-7.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,USER_AGENT_SANE_1 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6BB22C48BE5 for ; Tue, 22 Jun 2021 22:23:35 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5665160FF2 for ; Tue, 22 Jun 2021 22:23:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230298AbhFVWZu (ORCPT ); Tue, 22 Jun 2021 18:25:50 -0400 Received: from mail.kernel.org ([198.145.29.99]:59130 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229718AbhFVWZr (ORCPT ); Tue, 22 Jun 2021 18:25:47 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3429E60FF1; Tue, 22 Jun 2021 22:23:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624400611; bh=iqnw0H7/UtpoNSuitDlm9IHI3TDZqcMqMbO9123dzWQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pa7scjEPYzKwbh7np3cUhrvPriM37WrzN11qm2Srew1d7KnnsCWgA4hdD5GVb3DgQ KfOEqLnt7urnwUkHkCuKnV5i8PxhFlbzmwGGV+Nddp+4hYLfiQtnL5LXA2ecMnQ07b Z/dgTFgXACjbfs2NQuemNiAVks2UQSj7Y7u04AuuQilaeL4Dw6EjeQRcIFwGdCVXmw WY6R+3K3KG1d/y0+S2v/Z5cN+/sGDMQQruTAUVjbizNv9vDWMDILPLrCTYBVakCfK5 JPshTG1s45nYuu1gtd+e2ty49bkwUoiWSNR4D1X6sib9X1PHlREDxUgyIKxtIIgQnJ Zwwh7zGuG6W9g== Received: by pali.im (Postfix) id C1726CBA; Wed, 23 Jun 2021 00:23:28 +0200 (CEST) Date: Wed, 23 Jun 2021 00:23:28 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Luca Ceresoli Cc: Kishon Vijay Abraham I , Lorenzo Pieralisi , linus.walleij@linaro.org, linux-pci@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Rob Herring , Bjorn Helgaas Subject: Re: [PATCH v2] PCI: dra7xx: Fix reset behaviour Message-ID: <20210622222328.3lfgkrhsdy6izedv@pali> References: <8207a53c-4de9-d0e5-295a-c165e7237e36@lucaceresoli.net> <20210622110627.aqzxxtf2j3uxfeyl@pali> <20210622115604.GA25503@lpieralisi> <20210622121649.ouiaecdvwutgdyy5@pali> <18a104a9-2cb8-7535-a5b2-f5f049adff47@lucaceresoli.net> <4d4c0d4d-41b4-4756-5189-bffa15f88406@ti.com> <20210622205220.ypu22tuxhpdn2jwz@pali> <2873969e-ac56-a41f-0cc9-38e387542aa1@lucaceresoli.net> <20210622211901.ikulpy32d6qlr4yw@pali> <588741e4-b085-8ae2-3311-27037c040a57@lucaceresoli.net> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <588741e4-b085-8ae2-3311-27037c040a57@lucaceresoli.net> User-Agent: NeoMutt/20180716 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tuesday 22 June 2021 23:36:35 Luca Ceresoli wrote: > Hi Pali, > > On 22/06/21 23:19, Pali Rohár wrote: > > On Tuesday 22 June 2021 23:08:07 Luca Ceresoli wrote: > >> On 22/06/21 22:52, Pali Rohár wrote: > >>> On Tuesday 22 June 2021 19:27:37 Kishon Vijay Abraham I wrote: > >>>> Hi Luca, Pali, > >>>> > >>>> On 22/06/21 7:01 pm, Luca Ceresoli wrote: > >>>>> Hi, > >>>>> > >>>>> On 22/06/21 14:16, Pali Rohár wrote: > >>>>>> On Tuesday 22 June 2021 12:56:04 Lorenzo Pieralisi wrote: > >>>>>>> [Adding Linus for GPIO discussion, thread: > >>>>>>> https://lore.kernel.org/linux-pci/20210531090540.2663171-1-luca@lucaceresoli.net] > >>>>>>> > >>>>>>> On Tue, Jun 22, 2021 at 01:06:27PM +0200, Pali Rohár wrote: > >>>>>>>> Hello! > >>>>>>>> > >>>>>>>> On Tuesday 22 June 2021 12:57:22 Luca Ceresoli wrote: > >>>>>>>>> Nothing happened after a few weeks... I understand that knowing the > >>>>>>>>> correct reset timings is relevant, but unfortunately I cannot help much > >>>>>>>>> in finding out the correct values. > >>>>>>>>> > >>>>>>>>> However I'm wondering what should happen to this patch. It *does* fix a > >>>>>>>>> real bug, but potentially with an incorrect or non-optimal usleep range. > >>>>>>>>> Do we really want to ignore a bugfix because we are not sure about how > >>>>>>>>> long this delay should be? > >>>>>>>> > >>>>>>>> As there is no better solution right now, I'm fine with your patch. But > >>>>>>>> patch needs to be approved by Lorenzo, so please wait for his final > >>>>>>>> answer. > >>>>>>> > >>>>>>> I am not a GPIO expert and I have a feeling this is platform specific > >>>>>>> beyond what the PCI specification can actually define architecturally. > >>>>>> > >>>>>> In my opinion timeout is not platform specific as I wrote in email: > >>>>>> https://lore.kernel.org/linux-pci/20210310110535.zh4pnn4vpmvzwl5q@pali/ > >>>>>> > >>>>>> My experiments already proved that some PCIe cards needs to be in reset > >>>>>> state for some minimal time otherwise they cannot be enumerated. And it > >>>>>> does not matter to which platform you connect those (endpoint) cards. > >>>>>> > >>>>>> I do not think that timeout itself is platform specific. GPIO controls > >>>>>> PERST# pin and therefore specified sleep value directly drives how long > >>>>>> is card on the other end of PCIe slot in Warm Reset state. PCIe CEM spec > >>>>>> directly says that PERST# signal controls PCIe Warm Reset. > >>>>>> > >>>>>> What is here platform specific thing is that PERST# signal is controlled > >>>>>> by GPIO. But value of signal (high / low) and how long is in signal in > >>>>>> which state for me sounds like not an platform specific thing, but as > >>>>>> PCIe / CEM related. > >>>>> > >>>>> That's exactly my understanding of this matter. At least for the dra7xx > >>>>> controller it works exactly like this, PERSTn# is nothing but a GPIO > >>>>> output from the SoC that drives the PERSTn# input of the external chip > >>>>> without affecting the controller directly. > >>>>> > >>>> > >>>> While the patch itself is correct, this kind-of changes the behavior on > >>>> already upstreamed platforms. Previously the driver expected #PERST to > >>>> be asserted be external means (or default power-up state) and only takes > >>>> care of de-asserting the #PERST line. > >>>> > >>>> There are 2 platforms that will be impacted due to this change > >>>> 1) arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi (has an inverter on > >>>> GPIO line) > >>>> 2) arch/arm/boot/dts/am571x-idk.dts (directly connected to #PERST) > >>>> > >>>> For 1), gpiod_set_value(reset, 0) will assert the PERST line due to the > >>>> inverter (and GPIO_ACTIVE_LOW) > >>>> For 2), gpiod_set_value(reset, 0) will assert the PERST line because we > >>>> have GPIO_ACTIVE_HIGH > >>> > >>> Ou! This is a problem in DT. It needs to be defined in a way that state > >>> is same for every DTS device which uses this driver. > >> > >> Why? > > > > I'm starting to be confused by triple or more negations (asserting, > > signal inverter, active low)... > > > > In your patch is GPIO set value to 0 and Kishon wrote that GPIO set > > value to 0 for those two boards assert PERST# line. Asserting PERST# > > line cause endpoint PCIe card to be in reset state. And in pci-dra7xx.c > > driver there is no other code which de-asserts PERST# line. > > > > So based on all this information I deduced that your patch will cause > > putting PCIe cards into reset state (forever) and therefore they would > > not work. > > > > Or do I have here some mistake? > > Uhm, at time time in the night I'm not sure I can do much more than > adding a few notes on top of the commit message. I hope it helps anyway. > > The PCIe PERSTn reset pin is active low and should be asserted, then > deasserted. > > The current implementation only drives the pin once in "HIGH" position, > thus presumably it was intended to deassert the pin. This has two problems: > > 1) it assumes the pin was asserted by other means before loading the > driver [Note: Kishon confirmed so far] This is easily solvable. Just assert PERST# pin explicitly via gpiod_set_value() call prior calling that sleep function. And it would work whatever state that pin has at init time. This has advantage that reader of that code does not need to do too much investigation to check at which state is GPIO at probe time and what implication it has... Some other driver are doing it too, e.g. pci-aardvark.c. Due to fact that also bootloader may use PCIe bus (maybe not now, but in future; like it happened with pci-aardvark after introducing boot support from NVMe disks), initial state may change. > 2) it has the wrong polarity, since "HIGH" means "active", and the pin is > presumably configured as active low coherently with the PCIe > convention, thus it is driven physically to 0, keeping the device > under reset unless the pin is configured as active high. > [Note: the curren 2 DTS files pointed to by Kishon have different > polarities] > > Fix both problems by: > > 1) keeping devm_gpiod_get_optional(dev, NULL, GPIOD_OUT_HIGH) as is, but > assuming the pin is correctly configured as "active low" this now > becomes a reset assertion > 2) adding gpiod_set_value(reset, 0) after a delay to deassert reset > [Note: this is exactly the current idea, but with the additional need to > fix (=invert) the current polarities in DT] Lorenzo asked a good question how GPIO drives PERST#. And maybe it would be a good idea to unify all pci controller drivers to use same GPIO value for asserting PERST# pin. If it is possible. As we can see it is a big mess. Personally I would like to a see two helper functions like void pcie_assert_perst(struct gpio_desc *gpio); void pcie_deassert_perst(struct gpio_desc *gpio); which pci controller driver will use and we will not more handle active high / low state or polarity inversion and meditate if gpio set to zero means assert or de-assert. > > -- > Luca > 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 X-Spam-Level: X-Spam-Status: No, score=-5.7 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id ADD4FC2B9F4 for ; Tue, 22 Jun 2021 22:25:18 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id 792BF60FF1 for ; Tue, 22 Jun 2021 22:25:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 792BF60FF1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org 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=b6tJggnvDlT8psdEU/piFmfzm81ZdlAUwu78LnM7hxo=; b=DhsTkl1fantOzX bOuuu7SzIrQl0+A5wmSPJ71+zsN8JYISMpw2qyfSO2vA497u2jqc8pz2O8wGtiPBbquzH6Im+wFS8 0mH/jwq0tog36qZfQuS0lAMc/Rfwj1MXJbc7M2RiPdg5FVq9+NlGHS4TnMCE2quZCoBYmh6B5VeEN 9uBX7CSRCjG0nbQOy4Tq38HMGUrb0anlSDvxvzDLnp173qKfnBPEtNMv3Caw/2Y0Qy5HriYCBMq6c fEYuWMZUq9exkh3a+POVpAcRooKp5Apr/WiTuqZ26tS2dnObi8BMBPGD6hv7YcjtRYpN5TbaxP1NA ZagXP4QcAG2SOrVqYJJA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lvonw-008bmK-ON; Tue, 22 Jun 2021 22:23:36 +0000 Received: from mail.kernel.org ([198.145.29.99]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lvonr-008blS-Rh for linux-arm-kernel@lists.infradead.org; Tue, 22 Jun 2021 22:23:33 +0000 Received: by mail.kernel.org (Postfix) with ESMTPSA id 3429E60FF1; Tue, 22 Jun 2021 22:23:31 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1624400611; bh=iqnw0H7/UtpoNSuitDlm9IHI3TDZqcMqMbO9123dzWQ=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pa7scjEPYzKwbh7np3cUhrvPriM37WrzN11qm2Srew1d7KnnsCWgA4hdD5GVb3DgQ KfOEqLnt7urnwUkHkCuKnV5i8PxhFlbzmwGGV+Nddp+4hYLfiQtnL5LXA2ecMnQ07b Z/dgTFgXACjbfs2NQuemNiAVks2UQSj7Y7u04AuuQilaeL4Dw6EjeQRcIFwGdCVXmw WY6R+3K3KG1d/y0+S2v/Z5cN+/sGDMQQruTAUVjbizNv9vDWMDILPLrCTYBVakCfK5 JPshTG1s45nYuu1gtd+e2ty49bkwUoiWSNR4D1X6sib9X1PHlREDxUgyIKxtIIgQnJ Zwwh7zGuG6W9g== Received: by pali.im (Postfix) id C1726CBA; Wed, 23 Jun 2021 00:23:28 +0200 (CEST) Date: Wed, 23 Jun 2021 00:23:28 +0200 From: Pali =?utf-8?B?Um9ow6Fy?= To: Luca Ceresoli Cc: Kishon Vijay Abraham I , Lorenzo Pieralisi , linus.walleij@linaro.org, linux-pci@vger.kernel.org, linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, Rob Herring , Bjorn Helgaas Subject: Re: [PATCH v2] PCI: dra7xx: Fix reset behaviour Message-ID: <20210622222328.3lfgkrhsdy6izedv@pali> References: <8207a53c-4de9-d0e5-295a-c165e7237e36@lucaceresoli.net> <20210622110627.aqzxxtf2j3uxfeyl@pali> <20210622115604.GA25503@lpieralisi> <20210622121649.ouiaecdvwutgdyy5@pali> <18a104a9-2cb8-7535-a5b2-f5f049adff47@lucaceresoli.net> <4d4c0d4d-41b4-4756-5189-bffa15f88406@ti.com> <20210622205220.ypu22tuxhpdn2jwz@pali> <2873969e-ac56-a41f-0cc9-38e387542aa1@lucaceresoli.net> <20210622211901.ikulpy32d6qlr4yw@pali> <588741e4-b085-8ae2-3311-27037c040a57@lucaceresoli.net> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <588741e4-b085-8ae2-3311-27037c040a57@lucaceresoli.net> User-Agent: NeoMutt/20180716 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210622_152331_998766_518A3CC1 X-CRM114-Status: GOOD ( 50.44 ) 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 T24gVHVlc2RheSAyMiBKdW5lIDIwMjEgMjM6MzY6MzUgTHVjYSBDZXJlc29saSB3cm90ZToKPiBI aSBQYWxpLAo+IAo+IE9uIDIyLzA2LzIxIDIzOjE5LCBQYWxpIFJvaMOhciB3cm90ZToKPiA+IE9u IFR1ZXNkYXkgMjIgSnVuZSAyMDIxIDIzOjA4OjA3IEx1Y2EgQ2VyZXNvbGkgd3JvdGU6Cj4gPj4g T24gMjIvMDYvMjEgMjI6NTIsIFBhbGkgUm9ow6FyIHdyb3RlOgo+ID4+PiBPbiBUdWVzZGF5IDIy IEp1bmUgMjAyMSAxOToyNzozNyBLaXNob24gVmlqYXkgQWJyYWhhbSBJIHdyb3RlOgo+ID4+Pj4g SGkgTHVjYSwgUGFsaSwKPiA+Pj4+Cj4gPj4+PiBPbiAyMi8wNi8yMSA3OjAxIHBtLCBMdWNhIENl cmVzb2xpIHdyb3RlOgo+ID4+Pj4+IEhpLAo+ID4+Pj4+Cj4gPj4+Pj4gT24gMjIvMDYvMjEgMTQ6 MTYsIFBhbGkgUm9ow6FyIHdyb3RlOgo+ID4+Pj4+PiBPbiBUdWVzZGF5IDIyIEp1bmUgMjAyMSAx Mjo1NjowNCBMb3JlbnpvIFBpZXJhbGlzaSB3cm90ZToKPiA+Pj4+Pj4+IFtBZGRpbmcgTGludXMg Zm9yIEdQSU8gZGlzY3Vzc2lvbiwgdGhyZWFkOgo+ID4+Pj4+Pj4gaHR0cHM6Ly9sb3JlLmtlcm5l bC5vcmcvbGludXgtcGNpLzIwMjEwNTMxMDkwNTQwLjI2NjMxNzEtMS1sdWNhQGx1Y2FjZXJlc29s aS5uZXRdCj4gPj4+Pj4+Pgo+ID4+Pj4+Pj4gT24gVHVlLCBKdW4gMjIsIDIwMjEgYXQgMDE6MDY6 MjdQTSArMDIwMCwgUGFsaSBSb2jDoXIgd3JvdGU6Cj4gPj4+Pj4+Pj4gSGVsbG8hCj4gPj4+Pj4+ Pj4KPiA+Pj4+Pj4+PiBPbiBUdWVzZGF5IDIyIEp1bmUgMjAyMSAxMjo1NzoyMiBMdWNhIENlcmVz b2xpIHdyb3RlOgo+ID4+Pj4+Pj4+PiBOb3RoaW5nIGhhcHBlbmVkIGFmdGVyIGEgZmV3IHdlZWtz Li4uIEkgdW5kZXJzdGFuZCB0aGF0IGtub3dpbmcgdGhlCj4gPj4+Pj4+Pj4+IGNvcnJlY3QgcmVz ZXQgdGltaW5ncyBpcyByZWxldmFudCwgYnV0IHVuZm9ydHVuYXRlbHkgSSBjYW5ub3QgaGVscCBt dWNoCj4gPj4+Pj4+Pj4+IGluIGZpbmRpbmcgb3V0IHRoZSBjb3JyZWN0IHZhbHVlcy4KPiA+Pj4+ Pj4+Pj4KPiA+Pj4+Pj4+Pj4gSG93ZXZlciBJJ20gd29uZGVyaW5nIHdoYXQgc2hvdWxkIGhhcHBl biB0byB0aGlzIHBhdGNoLiBJdCAqZG9lcyogZml4IGEKPiA+Pj4+Pj4+Pj4gcmVhbCBidWcsIGJ1 dCBwb3RlbnRpYWxseSB3aXRoIGFuIGluY29ycmVjdCBvciBub24tb3B0aW1hbCB1c2xlZXAgcmFu Z2UuCj4gPj4+Pj4+Pj4+IERvIHdlIHJlYWxseSB3YW50IHRvIGlnbm9yZSBhIGJ1Z2ZpeCBiZWNh dXNlIHdlIGFyZSBub3Qgc3VyZSBhYm91dCBob3cKPiA+Pj4+Pj4+Pj4gbG9uZyB0aGlzIGRlbGF5 IHNob3VsZCBiZT8KPiA+Pj4+Pj4+Pgo+ID4+Pj4+Pj4+IEFzIHRoZXJlIGlzIG5vIGJldHRlciBz b2x1dGlvbiByaWdodCBub3csIEknbSBmaW5lIHdpdGggeW91ciBwYXRjaC4gQnV0Cj4gPj4+Pj4+ Pj4gcGF0Y2ggbmVlZHMgdG8gYmUgYXBwcm92ZWQgYnkgTG9yZW56bywgc28gcGxlYXNlIHdhaXQg Zm9yIGhpcyBmaW5hbAo+ID4+Pj4+Pj4+IGFuc3dlci4KPiA+Pj4+Pj4+Cj4gPj4+Pj4+PiBJIGFt IG5vdCBhIEdQSU8gZXhwZXJ0IGFuZCBJIGhhdmUgYSBmZWVsaW5nIHRoaXMgaXMgcGxhdGZvcm0g c3BlY2lmaWMKPiA+Pj4+Pj4+IGJleW9uZCB3aGF0IHRoZSBQQ0kgc3BlY2lmaWNhdGlvbiBjYW4g YWN0dWFsbHkgZGVmaW5lIGFyY2hpdGVjdHVyYWxseS4KPiA+Pj4+Pj4KPiA+Pj4+Pj4gSW4gbXkg b3BpbmlvbiB0aW1lb3V0IGlzIG5vdCBwbGF0Zm9ybSBzcGVjaWZpYyBhcyBJIHdyb3RlIGluIGVt YWlsOgo+ID4+Pj4+PiBodHRwczovL2xvcmUua2VybmVsLm9yZy9saW51eC1wY2kvMjAyMTAzMTAx MTA1MzUuemg0cG5uNHZwbXZ6d2w1cUBwYWxpLwo+ID4+Pj4+Pgo+ID4+Pj4+PiBNeSBleHBlcmlt ZW50cyBhbHJlYWR5IHByb3ZlZCB0aGF0IHNvbWUgUENJZSBjYXJkcyBuZWVkcyB0byBiZSBpbiBy ZXNldAo+ID4+Pj4+PiBzdGF0ZSBmb3Igc29tZSBtaW5pbWFsIHRpbWUgb3RoZXJ3aXNlIHRoZXkg Y2Fubm90IGJlIGVudW1lcmF0ZWQuIEFuZCBpdAo+ID4+Pj4+PiBkb2VzIG5vdCBtYXR0ZXIgdG8g d2hpY2ggcGxhdGZvcm0geW91IGNvbm5lY3QgdGhvc2UgKGVuZHBvaW50KSBjYXJkcy4KPiA+Pj4+ Pj4KPiA+Pj4+Pj4gSSBkbyBub3QgdGhpbmsgdGhhdCB0aW1lb3V0IGl0c2VsZiBpcyBwbGF0Zm9y bSBzcGVjaWZpYy4gR1BJTyBjb250cm9scwo+ID4+Pj4+PiBQRVJTVCMgcGluIGFuZCB0aGVyZWZv cmUgc3BlY2lmaWVkIHNsZWVwIHZhbHVlIGRpcmVjdGx5IGRyaXZlcyBob3cgbG9uZwo+ID4+Pj4+ PiBpcyBjYXJkIG9uIHRoZSBvdGhlciBlbmQgb2YgUENJZSBzbG90IGluIFdhcm0gUmVzZXQgc3Rh dGUuIFBDSWUgQ0VNIHNwZWMKPiA+Pj4+Pj4gZGlyZWN0bHkgc2F5cyB0aGF0IFBFUlNUIyBzaWdu YWwgY29udHJvbHMgUENJZSBXYXJtIFJlc2V0Lgo+ID4+Pj4+Pgo+ID4+Pj4+PiBXaGF0IGlzIGhl cmUgcGxhdGZvcm0gc3BlY2lmaWMgdGhpbmcgaXMgdGhhdCBQRVJTVCMgc2lnbmFsIGlzIGNvbnRy b2xsZWQKPiA+Pj4+Pj4gYnkgR1BJTy4gQnV0IHZhbHVlIG9mIHNpZ25hbCAoaGlnaCAvIGxvdykg YW5kIGhvdyBsb25nIGlzIGluIHNpZ25hbCBpbgo+ID4+Pj4+PiB3aGljaCBzdGF0ZSBmb3IgbWUg c291bmRzIGxpa2Ugbm90IGFuIHBsYXRmb3JtIHNwZWNpZmljIHRoaW5nLCBidXQgYXMKPiA+Pj4+ Pj4gUENJZSAvIENFTSByZWxhdGVkLgo+ID4+Pj4+Cj4gPj4+Pj4gVGhhdCdzIGV4YWN0bHkgbXkg dW5kZXJzdGFuZGluZyBvZiB0aGlzIG1hdHRlci4gQXQgbGVhc3QgZm9yIHRoZSBkcmE3eHgKPiA+ Pj4+PiBjb250cm9sbGVyIGl0IHdvcmtzIGV4YWN0bHkgbGlrZSB0aGlzLCBQRVJTVG4jIGlzIG5v dGhpbmcgYnV0IGEgR1BJTwo+ID4+Pj4+IG91dHB1dCBmcm9tIHRoZSBTb0MgdGhhdCBkcml2ZXMg dGhlIFBFUlNUbiMgaW5wdXQgb2YgdGhlIGV4dGVybmFsIGNoaXAKPiA+Pj4+PiB3aXRob3V0IGFm ZmVjdGluZyB0aGUgY29udHJvbGxlciBkaXJlY3RseS4KPiA+Pj4+Pgo+ID4+Pj4KPiA+Pj4+IFdo aWxlIHRoZSBwYXRjaCBpdHNlbGYgaXMgY29ycmVjdCwgdGhpcyBraW5kLW9mIGNoYW5nZXMgdGhl IGJlaGF2aW9yIG9uCj4gPj4+PiBhbHJlYWR5IHVwc3RyZWFtZWQgcGxhdGZvcm1zLiBQcmV2aW91 c2x5IHRoZSBkcml2ZXIgZXhwZWN0ZWQgI1BFUlNUIHRvCj4gPj4+PiBiZSBhc3NlcnRlZCBiZSBl eHRlcm5hbCBtZWFucyAob3IgZGVmYXVsdCBwb3dlci11cCBzdGF0ZSkgYW5kIG9ubHkgdGFrZXMK PiA+Pj4+IGNhcmUgb2YgZGUtYXNzZXJ0aW5nIHRoZSAjUEVSU1QgbGluZS4KPiA+Pj4+Cj4gPj4+ PiBUaGVyZSBhcmUgMiBwbGF0Zm9ybXMgdGhhdCB3aWxsIGJlIGltcGFjdGVkIGR1ZSB0byB0aGlz IGNoYW5nZQo+ID4+Pj4gMSkgYXJjaC9hcm0vYm9vdC9kdHMvYW01N3h4LWJlYWdsZS14MTUtY29t bW9uLmR0c2kgKGhhcyBhbiBpbnZlcnRlciBvbgo+ID4+Pj4gR1BJTyBsaW5lKQo+ID4+Pj4gMikg YXJjaC9hcm0vYm9vdC9kdHMvYW01NzF4LWlkay5kdHMgKGRpcmVjdGx5IGNvbm5lY3RlZCB0byAj UEVSU1QpCj4gPj4+Pgo+ID4+Pj4gRm9yIDEpLCBncGlvZF9zZXRfdmFsdWUocmVzZXQsIDApIHdp bGwgYXNzZXJ0IHRoZSBQRVJTVCBsaW5lIGR1ZSB0byB0aGUKPiA+Pj4+IGludmVydGVyIChhbmQg R1BJT19BQ1RJVkVfTE9XKQo+ID4+Pj4gRm9yIDIpLCBncGlvZF9zZXRfdmFsdWUocmVzZXQsIDAp IHdpbGwgYXNzZXJ0IHRoZSBQRVJTVCBsaW5lIGJlY2F1c2Ugd2UKPiA+Pj4+IGhhdmUgR1BJT19B Q1RJVkVfSElHSAo+ID4+Pgo+ID4+PiBPdSEgVGhpcyBpcyBhIHByb2JsZW0gaW4gRFQuIEl0IG5l ZWRzIHRvIGJlIGRlZmluZWQgaW4gYSB3YXkgdGhhdCBzdGF0ZQo+ID4+PiBpcyBzYW1lIGZvciBl dmVyeSBEVFMgZGV2aWNlIHdoaWNoIHVzZXMgdGhpcyBkcml2ZXIuCj4gPj4KPiA+PiBXaHk/Cj4g PiAKPiA+IEknbSBzdGFydGluZyB0byBiZSBjb25mdXNlZCBieSB0cmlwbGUgb3IgbW9yZSBuZWdh dGlvbnMgKGFzc2VydGluZywKPiA+IHNpZ25hbCBpbnZlcnRlciwgYWN0aXZlIGxvdykuLi4KPiA+ IAo+ID4gSW4geW91ciBwYXRjaCBpcyBHUElPIHNldCB2YWx1ZSB0byAwIGFuZCBLaXNob24gd3Jv dGUgdGhhdCBHUElPIHNldAo+ID4gdmFsdWUgdG8gMCBmb3IgdGhvc2UgdHdvIGJvYXJkcyBhc3Nl cnQgUEVSU1QjIGxpbmUuIEFzc2VydGluZyBQRVJTVCMKPiA+IGxpbmUgY2F1c2UgZW5kcG9pbnQg UENJZSBjYXJkIHRvIGJlIGluIHJlc2V0IHN0YXRlLiBBbmQgaW4gcGNpLWRyYTd4eC5jCj4gPiBk cml2ZXIgdGhlcmUgaXMgbm8gb3RoZXIgY29kZSB3aGljaCBkZS1hc3NlcnRzIFBFUlNUIyBsaW5l Lgo+ID4gCj4gPiBTbyBiYXNlZCBvbiBhbGwgdGhpcyBpbmZvcm1hdGlvbiBJIGRlZHVjZWQgdGhh dCB5b3VyIHBhdGNoIHdpbGwgY2F1c2UKPiA+IHB1dHRpbmcgUENJZSBjYXJkcyBpbnRvIHJlc2V0 IHN0YXRlIChmb3JldmVyKSBhbmQgdGhlcmVmb3JlIHRoZXkgd291bGQKPiA+IG5vdCB3b3JrLgo+ ID4gCj4gPiBPciBkbyBJIGhhdmUgaGVyZSBzb21lIG1pc3Rha2U/Cj4gCj4gVWhtLCBhdCB0aW1l IHRpbWUgaW4gdGhlIG5pZ2h0IEknbSBub3Qgc3VyZSBJIGNhbiBkbyBtdWNoIG1vcmUgdGhhbgo+ IGFkZGluZyBhIGZldyBub3RlcyBvbiB0b3Agb2YgdGhlIGNvbW1pdCBtZXNzYWdlLiBJIGhvcGUg aXQgaGVscHMgYW55d2F5Lgo+IAo+IFRoZSBQQ0llIFBFUlNUbiByZXNldCBwaW4gaXMgYWN0aXZl IGxvdyBhbmQgc2hvdWxkIGJlIGFzc2VydGVkLCB0aGVuCj4gZGVhc3NlcnRlZC4KPiAKPiBUaGUg Y3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5IGRyaXZlcyB0aGUgcGluIG9uY2UgaW4gIkhJR0gi IHBvc2l0aW9uLAo+IHRodXMgcHJlc3VtYWJseSBpdCB3YXMgaW50ZW5kZWQgdG8gZGVhc3NlcnQg dGhlIHBpbi4gVGhpcyBoYXMgdHdvIHByb2JsZW1zOgo+IAo+ICAgMSkgaXQgYXNzdW1lcyB0aGUg cGluIHdhcyBhc3NlcnRlZCBieSBvdGhlciBtZWFucyBiZWZvcmUgbG9hZGluZyB0aGUKPiAgICAg IGRyaXZlciBbTm90ZTogS2lzaG9uIGNvbmZpcm1lZCBzbyBmYXJdCgpUaGlzIGlzIGVhc2lseSBz b2x2YWJsZS4gSnVzdCBhc3NlcnQgUEVSU1QjIHBpbiBleHBsaWNpdGx5IHZpYQpncGlvZF9zZXRf dmFsdWUoKSBjYWxsIHByaW9yIGNhbGxpbmcgdGhhdCBzbGVlcCBmdW5jdGlvbi4gQW5kIGl0IHdv dWxkCndvcmsgd2hhdGV2ZXIgc3RhdGUgdGhhdCBwaW4gaGFzIGF0IGluaXQgdGltZS4gVGhpcyBo YXMgYWR2YW50YWdlIHRoYXQKcmVhZGVyIG9mIHRoYXQgY29kZSBkb2VzIG5vdCBuZWVkIHRvIGRv IHRvbyBtdWNoIGludmVzdGlnYXRpb24gdG8gY2hlY2sKYXQgd2hpY2ggc3RhdGUgaXMgR1BJTyBh dCBwcm9iZSB0aW1lIGFuZCB3aGF0IGltcGxpY2F0aW9uIGl0IGhhcy4uLgoKU29tZSBvdGhlciBk cml2ZXIgYXJlIGRvaW5nIGl0IHRvbywgZS5nLiBwY2ktYWFyZHZhcmsuYy4KCkR1ZSB0byBmYWN0 IHRoYXQgYWxzbyBib290bG9hZGVyIG1heSB1c2UgUENJZSBidXMgKG1heWJlIG5vdCBub3csIGJ1 dCBpbgpmdXR1cmU7IGxpa2UgaXQgaGFwcGVuZWQgd2l0aCBwY2ktYWFyZHZhcmsgYWZ0ZXIgaW50 cm9kdWNpbmcgYm9vdApzdXBwb3J0IGZyb20gTlZNZSBkaXNrcyksIGluaXRpYWwgc3RhdGUgbWF5 IGNoYW5nZS4KCj4gICAyKSBpdCBoYXMgdGhlIHdyb25nIHBvbGFyaXR5LCBzaW5jZSAiSElHSCIg bWVhbnMgImFjdGl2ZSIsIGFuZCB0aGUgcGluIGlzCj4gICAgICBwcmVzdW1hYmx5IGNvbmZpZ3Vy ZWQgYXMgYWN0aXZlIGxvdyBjb2hlcmVudGx5IHdpdGggdGhlIFBDSWUKPiAgICAgIGNvbnZlbnRp b24sIHRodXMgaXQgaXMgZHJpdmVuIHBoeXNpY2FsbHkgdG8gMCwga2VlcGluZyB0aGUgZGV2aWNl Cj4gICAgICB1bmRlciByZXNldCB1bmxlc3MgdGhlIHBpbiBpcyBjb25maWd1cmVkIGFzIGFjdGl2 ZSBoaWdoLgo+ICAgICAgW05vdGU6IHRoZSBjdXJyZW4gMiBEVFMgZmlsZXMgcG9pbnRlZCB0byBi eSBLaXNob24gaGF2ZSBkaWZmZXJlbnQKPiAgICAgICBwb2xhcml0aWVzXQo+IAo+IEZpeCBib3Ro IHByb2JsZW1zIGJ5Ogo+IAo+ICAgMSkga2VlcGluZyBkZXZtX2dwaW9kX2dldF9vcHRpb25hbChk ZXYsIE5VTEwsIEdQSU9EX09VVF9ISUdIKSBhcyBpcywgYnV0Cj4gICAgICBhc3N1bWluZyB0aGUg cGluIGlzIGNvcnJlY3RseSBjb25maWd1cmVkIGFzICJhY3RpdmUgbG93IiB0aGlzIG5vdwo+ICAg ICAgYmVjb21lcyBhIHJlc2V0IGFzc2VydGlvbgo+ICAgMikgYWRkaW5nIGdwaW9kX3NldF92YWx1 ZShyZXNldCwgMCkgYWZ0ZXIgYSBkZWxheSB0byBkZWFzc2VydCByZXNldAo+IFtOb3RlOiB0aGlz IGlzIGV4YWN0bHkgdGhlIGN1cnJlbnQgaWRlYSwgYnV0IHdpdGggdGhlIGFkZGl0aW9uYWwgbmVl ZCB0bwo+IGZpeCAoPWludmVydCkgdGhlIGN1cnJlbnQgcG9sYXJpdGllcyBpbiBEVF0KCkxvcmVu em8gYXNrZWQgYSBnb29kIHF1ZXN0aW9uIGhvdyBHUElPIGRyaXZlcyBQRVJTVCMuIEFuZCBtYXli ZSBpdCB3b3VsZApiZSBhIGdvb2QgaWRlYSB0byB1bmlmeSBhbGwgcGNpIGNvbnRyb2xsZXIgZHJp dmVycyB0byB1c2Ugc2FtZSBHUElPCnZhbHVlIGZvciBhc3NlcnRpbmcgUEVSU1QjIHBpbi4gSWYg aXQgaXMgcG9zc2libGUuIEFzIHdlIGNhbiBzZWUgaXQgaXMgYQpiaWcgbWVzcy4KClBlcnNvbmFs bHkgSSB3b3VsZCBsaWtlIHRvIGEgc2VlIHR3byBoZWxwZXIgZnVuY3Rpb25zIGxpa2UKCiAgdm9p ZCBwY2llX2Fzc2VydF9wZXJzdChzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvKTsKICB2b2lkIHBjaWVf ZGVhc3NlcnRfcGVyc3Qoc3RydWN0IGdwaW9fZGVzYyAqZ3Bpbyk7Cgp3aGljaCBwY2kgY29udHJv bGxlciBkcml2ZXIgd2lsbCB1c2UgYW5kIHdlIHdpbGwgbm90IG1vcmUgaGFuZGxlIGFjdGl2ZQpo aWdoIC8gbG93IHN0YXRlIG9yIHBvbGFyaXR5IGludmVyc2lvbiBhbmQgbWVkaXRhdGUgaWYgZ3Bp byBzZXQgdG8gemVybwptZWFucyBhc3NlcnQgb3IgZGUtYXNzZXJ0LgoKPiAKPiAtLSAKPiBMdWNh Cj4gCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51 eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1h cm0ta2VybmVsCg==