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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E28F0C433F5 for ; Thu, 18 Nov 2021 12:58:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id CBB9261B31 for ; Thu, 18 Nov 2021 12:58:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234069AbhKRNBS convert rfc822-to-8bit (ORCPT ); Thu, 18 Nov 2021 08:01:18 -0500 Received: from mail.kernel.org ([198.145.29.99]:51994 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234168AbhKRNAv (ORCPT ); Thu, 18 Nov 2021 08:00:51 -0500 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9322E61ABA; Thu, 18 Nov 2021 12:57:48 +0000 (UTC) Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mngz4-006Jov-FN; Thu, 18 Nov 2021 12:57:46 +0000 Date: Thu, 18 Nov 2021 12:57:46 +0000 Message-ID: <87k0h57h9x.wl-maz@kernel.org> From: Marc Zyngier To: Pali =?UTF-8?B?Um9ow6Fy?= Cc: Bjorn Helgaas , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, kernel-team@android.com, Alyssa Rosenzweig , Lorenzo Pieralisi , Bjorn Helgaas Subject: Re: [PATCH] PCI: apple: Reset the port for 100ms on probe In-Reply-To: <20211118103156.r66aso2bklm7jnns@pali> References: <20211117160053.232158-1-maz@kernel.org> <20211117201245.GA1768803@bhelgaas> <20211117202859.2m5sqwz6xsjgldji@pali> <87o86h7pex.wl-maz@kernel.org> <20211118103156.r66aso2bklm7jnns@pali> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8BIT X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: pali@kernel.org, helgaas@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, kernel-team@android.com, alyssa@rosenzweig.io, lorenzo.pieralisi@arm.com, bhelgaas@google.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Thu, 18 Nov 2021 10:31:56 +0000, Pali Rohár wrote: > > On Thursday 18 November 2021 10:01:58 Marc Zyngier wrote: > > On Wed, 17 Nov 2021 20:28:59 +0000, > > Pali Rohár wrote: > > > > > > Hello! > > > > > > On Wednesday 17 November 2021 14:12:45 Bjorn Helgaas wrote: > > > > [+cc Pali] > > > > > > > > On Wed, Nov 17, 2021 at 04:00:53PM +0000, Marc Zyngier wrote: > > > > > While the Apple PCIe driver works correctly when directly booted > > > > > from the firmware, it fails to initialise when the kernel is booted > > > > > from a bootloader using PCIe such as u-boot. > > > > > > > > > > That's beacuse we're missing a proper reset of the port (we only > > > > > clear the reset, but never assert it). > > > > > > > > s/beacuse/because/ > > > > > > > > > Bring the port back to life by wiggling the #PERST pin for 100ms > > > > > (as per the spec). > > > > > > > > I cc'd Pali because I think he's interested in consolidating or > > > > somehow rationalizing delays like this. > > > > > > > > If we have a specific spec reference here, I think it would help that > > > > effort. I *think* it's PCIe r5.0, sec 6.6.1, which mentions the 100ms > > > > along with some additional constraints, like waiting 100ms after Link > > > > training completes for ports that support > 5.0 GT/s, whether > > > > Readiness Notifications are used, and CRS Software Visiblity. > > > > > > This is not 100ms timeout "after link training completes". > > > > > > Timeout in this patch is between flipping PERST# signal, so timeout > > > means how long needs to be endpoint card in reset state. And this > > > timeout cannot be controller specific. In past I have tried to find this > > > timeout in specifications, I was not able. Some summary is in my email: > > > https://lore.kernel.org/linux-pci/20210310110535.zh4pnn4vpmvzwl5q@pali/ > > > > > > So I would like to know, why was chosen 100ms for msleep() in this > > > patch? > > > > Excellent question. I went back to my notes (and the spec), and it > > looks like I have mistakenly conflated *two* delays here: > > > > - The post-#PERST delay, which is 100ms, and which is *not* what this > > patch is doing while it really should be doing it. This is > > documented in the base PCIe spec (in Rev 2.0, this is part of > > 6.6.1). The amusing part is that on this HW, it seems that only the > > delay from the falling edge matters (which is why I didn't spot the > > issue). > > > > - The duration of the power-on #PERST assertion (Tpvperl), which is > > also 100ms, and documented in the PCIe Card Electromechanical > > Specification (Rev 1.0a, 2.2 and 2.2.1). > > I think that your patch is doing also something different. It uses > PERST# signal to reset card _after_ card was fully powered on and > _maybe_ link was already established (depends on bootloader if it > initialized PCIe, etc...). Yes, and that's what I have said above. > Important is that this reset is really needed for some cards (e.g. lot > of Atheros wifi cards as they can be stuck somewhere in broken state) > and I do not think it is Tpvperl delay. More controller drivers add some > delay between flipping PERST# signal. In past I wrote summary of it: > https://lore.kernel.org/linux-pci/20200424092546.25p3hdtkehohe3xw@pali/ I don't think any of this applies here. > > There is also a third delay (Tperst-clk) which represents the time > > required for the clock to ramp up before releasing #PERST. No, there > > is no value associated with this. > > But there is minimal value for Tperst-clk which is 100us defined in PCIe > CEM spec (3.0) and also in M.2 CEM spec. Which is what I have pointed out in my followup to my original email. > > > Having come to my senses, and with these constraints in mind, this is > > what I currently have in my tree: > > > > /* Engage #PERST */ > > gpiod_set_value(reset, 0); > > > > ret = apple_pcie_setup_refclk(pcie, port); > > if (ret < 0) > > return ret; > > > > /* Hold #PERST for 100ms as per the electromechanical spec */ > > msleep(100); > > rmw_set(PORT_PERST_OFF, port->base + PORT_PERST); > > gpiod_set_value(reset, 1); > > /* Wait for 100ms after #PERST deassertion before anothing else */ > > msleep(100); > > > > Yes, this is totally overkill, as I assume that each port has gone > > through a complete power-off and is only slowly coming back from the > > dead. > > For power-on it is probably overkill, but I think that delay between > flipping PERST# should be there. IIRC Compex WLE1216 wifi card needs to > be at least 10-11ms in reset. Last year, during testing of this card I > saw that if PERST#-based reset was shorter then card was completely > undetected. The only delay we really need is Tperst-clk. Random bugs on random devices don't apply here, as the system is completely closed (there is no slot to add anything). Once we have TB running one of these days, we will see whether this still holds. > > In practice, I can completely remove the initial Tpvperl delay (we > > have been powered-on for a long time already, and the clock is stable > > when we come back from setting it up), and cut the second one by half > > without observing any ill effect (though I feel safer keeping it to > > its nominal value). > > My opinion is that this patch does not power on/off card in PCIe slot. > And because card is powered-on for a long time (as you wrote), it means > that Tpvperl delay does not apply here. That is why I think that > different delay (How long should be PCIe card in Warm Reset state) > should be used _between_ flipping PERST# signal. My reading of the spec is that the only thing we need while #PERST is asserted is Tperst-clk. The value you keep arguing about doesn't seem to exist as such in the spec, because it appears to be endpoint specific. > And of course after the releasing PERST# that 100ms post-PERST# delay is > required. That we agree on. > I have an idea to move PERST# handling (with all delays) from controller > drivers to pci core functions. Because basically every driver > re-implements these delays in its probe function. I wrote this idea with > some details in email. If you have a time, could you look at it? I > summarized here also details about delays (like Tpvperl, Tperstclk, ..): > https://lore.kernel.org/linux-pci/20211022183808.jdeo7vntnagqkg7g@pali/ That's a laudable goal. What isn't clear to me is whether you intend to move the whole state machine into core code, or just have a set of helpers that the driver calls into. IMO, the former is what we really need, while the latter only rids us of the simple stuff. M. -- Without deviation from the norm, progress is not possible. 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2DAD2C433F5 for ; Thu, 18 Nov 2021 12:59:22 +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 E31C961351 for ; Thu, 18 Nov 2021 12:59:21 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E31C961351 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=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:MIME-Version:References:In-Reply-To: Subject:Cc:To:From:Message-ID:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=k5c6yNDc+pYtUBO+BEv+88i4sFBSonJQj1srqV07xw0=; b=qTc410n2jPX606 6PIA103C/afwO66YX9vIFCIW8IAcaMUfCwgLi+ilpJx8l3Gmb5hnVMmrqtEurAE0Nj1K9XnkAT9mM EbauWhjY3PNg7BpzOKsuxOCZTO7PiWemWgPiviHgF6AE2TkVgNbyqMUFmPe6+Do7r3gwOewxGohse lF8VsmPKwCaHQ32YYvL+ciwDlnIswOulrI90U/oegGrWImhmYoKJxyEh+XtV1JVEd8xzcqXULj4eA /FASjv09a5KFSsbe32mLMHtrDTQYv3nNkE14wBRsyKg2BHExUtdNSewAHT5+pQPgA3+KSf98hKKhn SggzxNKQXD8SGgL1x3vg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mngzB-007nvr-MX; Thu, 18 Nov 2021 12:57:53 +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 1mngz7-007nut-Fw for linux-arm-kernel@lists.infradead.org; Thu, 18 Nov 2021 12:57:51 +0000 Received: from disco-boy.misterjones.org (disco-boy.misterjones.org [51.254.78.96]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 9322E61ABA; Thu, 18 Nov 2021 12:57:48 +0000 (UTC) Received: from sofa.misterjones.org ([185.219.108.64] helo=why.misterjones.org) by disco-boy.misterjones.org with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1mngz4-006Jov-FN; Thu, 18 Nov 2021 12:57:46 +0000 Date: Thu, 18 Nov 2021 12:57:46 +0000 Message-ID: <87k0h57h9x.wl-maz@kernel.org> From: Marc Zyngier To: Pali =?UTF-8?B?Um9ow6Fy?= Cc: Bjorn Helgaas , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, kernel-team@android.com, Alyssa Rosenzweig , Lorenzo Pieralisi , Bjorn Helgaas Subject: Re: [PATCH] PCI: apple: Reset the port for 100ms on probe In-Reply-To: <20211118103156.r66aso2bklm7jnns@pali> References: <20211117160053.232158-1-maz@kernel.org> <20211117201245.GA1768803@bhelgaas> <20211117202859.2m5sqwz6xsjgldji@pali> <87o86h7pex.wl-maz@kernel.org> <20211118103156.r66aso2bklm7jnns@pali> User-Agent: Wanderlust/2.15.9 (Almost Unreal) SEMI-EPG/1.14.7 (Harue) FLIM-LB/1.14.9 (=?UTF-8?B?R29qxY0=?=) APEL-LB/10.8 EasyPG/1.0.0 Emacs/27.1 (x86_64-pc-linux-gnu) MULE/6.0 (HANACHIRUSATO) MIME-Version: 1.0 (generated by SEMI-EPG 1.14.7 - "Harue") X-SA-Exim-Connect-IP: 185.219.108.64 X-SA-Exim-Rcpt-To: pali@kernel.org, helgaas@kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-pci@vger.kernel.org, kernel-team@android.com, alyssa@rosenzweig.io, lorenzo.pieralisi@arm.com, bhelgaas@google.com X-SA-Exim-Mail-From: maz@kernel.org X-SA-Exim-Scanned: No (on disco-boy.misterjones.org); SAEximRunCond expanded to false X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20211118_045749_593067_529FE281 X-CRM114-Status: GOOD ( 58.78 ) 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 T24gVGh1LCAxOCBOb3YgMjAyMSAxMDozMTo1NiArMDAwMCwKUGFsaSBSb2jDoXIgPHBhbGlAa2Vy bmVsLm9yZz4gd3JvdGU6Cj4gCj4gT24gVGh1cnNkYXkgMTggTm92ZW1iZXIgMjAyMSAxMDowMTo1 OCBNYXJjIFp5bmdpZXIgd3JvdGU6Cj4gPiBPbiBXZWQsIDE3IE5vdiAyMDIxIDIwOjI4OjU5ICsw MDAwLAo+ID4gUGFsaSBSb2jDoXIgPHBhbGlAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPiA+IAo+ID4g PiBIZWxsbyEKPiA+ID4gCj4gPiA+IE9uIFdlZG5lc2RheSAxNyBOb3ZlbWJlciAyMDIxIDE0OjEy OjQ1IEJqb3JuIEhlbGdhYXMgd3JvdGU6Cj4gPiA+ID4gWytjYyBQYWxpXQo+ID4gPiA+IAo+ID4g PiA+IE9uIFdlZCwgTm92IDE3LCAyMDIxIGF0IDA0OjAwOjUzUE0gKzAwMDAsIE1hcmMgWnluZ2ll ciB3cm90ZToKPiA+ID4gPiA+IFdoaWxlIHRoZSBBcHBsZSBQQ0llIGRyaXZlciB3b3JrcyBjb3Jy ZWN0bHkgd2hlbiBkaXJlY3RseSBib290ZWQKPiA+ID4gPiA+IGZyb20gdGhlIGZpcm13YXJlLCBp dCBmYWlscyB0byBpbml0aWFsaXNlIHdoZW4gdGhlIGtlcm5lbCBpcyBib290ZWQKPiA+ID4gPiA+ IGZyb20gYSBib290bG9hZGVyIHVzaW5nIFBDSWUgc3VjaCBhcyB1LWJvb3QuCj4gPiA+ID4gPiAK PiA+ID4gPiA+IFRoYXQncyBiZWFjdXNlIHdlJ3JlIG1pc3NpbmcgYSBwcm9wZXIgcmVzZXQgb2Yg dGhlIHBvcnQgKHdlIG9ubHkKPiA+ID4gPiA+IGNsZWFyIHRoZSByZXNldCwgYnV0IG5ldmVyIGFz c2VydCBpdCkuCj4gPiA+ID4gCj4gPiA+ID4gcy9iZWFjdXNlL2JlY2F1c2UvCj4gPiA+ID4gCj4g PiA+ID4gPiBCcmluZyB0aGUgcG9ydCBiYWNrIHRvIGxpZmUgYnkgd2lnZ2xpbmcgdGhlICNQRVJT VCBwaW4gZm9yIDEwMG1zCj4gPiA+ID4gPiAoYXMgcGVyIHRoZSBzcGVjKS4KPiA+ID4gPiAKPiA+ ID4gPiBJIGNjJ2QgUGFsaSBiZWNhdXNlIEkgdGhpbmsgaGUncyBpbnRlcmVzdGVkIGluIGNvbnNv bGlkYXRpbmcgb3IKPiA+ID4gPiBzb21laG93IHJhdGlvbmFsaXppbmcgZGVsYXlzIGxpa2UgdGhp cy4KPiA+ID4gPiAKPiA+ID4gPiBJZiB3ZSBoYXZlIGEgc3BlY2lmaWMgc3BlYyByZWZlcmVuY2Ug aGVyZSwgSSB0aGluayBpdCB3b3VsZCBoZWxwIHRoYXQKPiA+ID4gPiBlZmZvcnQuICBJICp0aGlu ayogaXQncyBQQ0llIHI1LjAsIHNlYyA2LjYuMSwgd2hpY2ggbWVudGlvbnMgdGhlIDEwMG1zCj4g PiA+ID4gYWxvbmcgd2l0aCBzb21lIGFkZGl0aW9uYWwgY29uc3RyYWludHMsIGxpa2Ugd2FpdGlu ZyAxMDBtcyBhZnRlciBMaW5rCj4gPiA+ID4gdHJhaW5pbmcgY29tcGxldGVzIGZvciBwb3J0cyB0 aGF0IHN1cHBvcnQgPiA1LjAgR1Qvcywgd2hldGhlcgo+ID4gPiA+IFJlYWRpbmVzcyBOb3RpZmlj YXRpb25zIGFyZSB1c2VkLCBhbmQgQ1JTIFNvZnR3YXJlIFZpc2libGl0eS4KPiA+ID4gCj4gPiA+ IFRoaXMgaXMgbm90IDEwMG1zIHRpbWVvdXQgImFmdGVyIGxpbmsgdHJhaW5pbmcgY29tcGxldGVz Ii4KPiA+ID4gCj4gPiA+IFRpbWVvdXQgaW4gdGhpcyBwYXRjaCBpcyBiZXR3ZWVuIGZsaXBwaW5n IFBFUlNUIyBzaWduYWwsIHNvIHRpbWVvdXQKPiA+ID4gbWVhbnMgaG93IGxvbmcgbmVlZHMgdG8g YmUgZW5kcG9pbnQgY2FyZCBpbiByZXNldCBzdGF0ZS4gQW5kIHRoaXMKPiA+ID4gdGltZW91dCBj YW5ub3QgYmUgY29udHJvbGxlciBzcGVjaWZpYy4gSW4gcGFzdCBJIGhhdmUgdHJpZWQgdG8gZmlu ZCB0aGlzCj4gPiA+IHRpbWVvdXQgaW4gc3BlY2lmaWNhdGlvbnMsIEkgd2FzIG5vdCBhYmxlLiBT b21lIHN1bW1hcnkgaXMgaW4gbXkgZW1haWw6Cj4gPiA+IGh0dHBzOi8vbG9yZS5rZXJuZWwub3Jn L2xpbnV4LXBjaS8yMDIxMDMxMDExMDUzNS56aDRwbm40dnBtdnp3bDVxQHBhbGkvCj4gPiA+IAo+ ID4gPiBTbyBJIHdvdWxkIGxpa2UgdG8ga25vdywgd2h5IHdhcyBjaG9zZW4gMTAwbXMgZm9yIG1z bGVlcCgpIGluIHRoaXMKPiA+ID4gcGF0Y2g/Cj4gPiAKPiA+IEV4Y2VsbGVudCBxdWVzdGlvbi4g SSB3ZW50IGJhY2sgdG8gbXkgbm90ZXMgKGFuZCB0aGUgc3BlYyksIGFuZCBpdAo+ID4gbG9va3Mg bGlrZSBJIGhhdmUgbWlzdGFrZW5seSBjb25mbGF0ZWQgKnR3byogZGVsYXlzIGhlcmU6Cj4gPiAK PiA+IC0gVGhlIHBvc3QtI1BFUlNUIGRlbGF5LCB3aGljaCBpcyAxMDBtcywgYW5kIHdoaWNoIGlz ICpub3QqIHdoYXQgdGhpcwo+ID4gICBwYXRjaCBpcyBkb2luZyB3aGlsZSBpdCByZWFsbHkgc2hv dWxkIGJlIGRvaW5nIGl0LiBUaGlzIGlzCj4gPiAgIGRvY3VtZW50ZWQgaW4gdGhlIGJhc2UgUENJ ZSBzcGVjIChpbiBSZXYgMi4wLCB0aGlzIGlzIHBhcnQgb2YKPiA+ICAgNi42LjEpLiBUaGUgYW11 c2luZyBwYXJ0IGlzIHRoYXQgb24gdGhpcyBIVywgaXQgc2VlbXMgdGhhdCBvbmx5IHRoZQo+ID4g ICBkZWxheSBmcm9tIHRoZSBmYWxsaW5nIGVkZ2UgbWF0dGVycyAod2hpY2ggaXMgd2h5IEkgZGlk bid0IHNwb3QgdGhlCj4gPiAgIGlzc3VlKS4KPiA+IAo+ID4gLSBUaGUgZHVyYXRpb24gb2YgdGhl IHBvd2VyLW9uICNQRVJTVCBhc3NlcnRpb24gKFRwdnBlcmwpLCB3aGljaCBpcwo+ID4gICBhbHNv IDEwMG1zLCBhbmQgZG9jdW1lbnRlZCBpbiB0aGUgUENJZSBDYXJkIEVsZWN0cm9tZWNoYW5pY2Fs Cj4gPiAgIFNwZWNpZmljYXRpb24gKFJldiAxLjBhLCAyLjIgYW5kIDIuMi4xKS4KPiAKPiBJIHRo aW5rIHRoYXQgeW91ciBwYXRjaCBpcyBkb2luZyBhbHNvIHNvbWV0aGluZyBkaWZmZXJlbnQuIEl0 IHVzZXMKPiBQRVJTVCMgc2lnbmFsIHRvIHJlc2V0IGNhcmQgX2FmdGVyXyBjYXJkIHdhcyBmdWxs eSBwb3dlcmVkIG9uIGFuZAo+IF9tYXliZV8gbGluayB3YXMgYWxyZWFkeSBlc3RhYmxpc2hlZCAo ZGVwZW5kcyBvbiBib290bG9hZGVyIGlmIGl0Cj4gaW5pdGlhbGl6ZWQgUENJZSwgZXRjLi4uKS4K ClllcywgYW5kIHRoYXQncyB3aGF0IEkgaGF2ZSBzYWlkIGFib3ZlLgoKPiBJbXBvcnRhbnQgaXMg dGhhdCB0aGlzIHJlc2V0IGlzIHJlYWxseSBuZWVkZWQgZm9yIHNvbWUgY2FyZHMgKGUuZy4gbG90 Cj4gb2YgQXRoZXJvcyB3aWZpIGNhcmRzIGFzIHRoZXkgY2FuIGJlIHN0dWNrIHNvbWV3aGVyZSBp biBicm9rZW4gc3RhdGUpCj4gYW5kIEkgZG8gbm90IHRoaW5rIGl0IGlzIFRwdnBlcmwgZGVsYXku IE1vcmUgY29udHJvbGxlciBkcml2ZXJzIGFkZCBzb21lCj4gZGVsYXkgYmV0d2VlbiBmbGlwcGlu ZyBQRVJTVCMgc2lnbmFsLiBJbiBwYXN0IEkgd3JvdGUgc3VtbWFyeSBvZiBpdDoKPiBodHRwczov L2xvcmUua2VybmVsLm9yZy9saW51eC1wY2kvMjAyMDA0MjQwOTI1NDYuMjVwM2hkdGtlaG9oZTN4 d0BwYWxpLwoKSSBkb24ndCB0aGluayBhbnkgb2YgdGhpcyBhcHBsaWVzIGhlcmUuCgo+ID4gVGhl cmUgaXMgYWxzbyBhIHRoaXJkIGRlbGF5IChUcGVyc3QtY2xrKSB3aGljaCByZXByZXNlbnRzIHRo ZSB0aW1lCj4gPiByZXF1aXJlZCBmb3IgdGhlIGNsb2NrIHRvIHJhbXAgdXAgYmVmb3JlIHJlbGVh c2luZyAjUEVSU1QuIE5vLCB0aGVyZQo+ID4gaXMgbm8gdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRo aXMuCj4gCj4gQnV0IHRoZXJlIGlzIG1pbmltYWwgdmFsdWUgZm9yIFRwZXJzdC1jbGsgd2hpY2gg aXMgMTAwdXMgZGVmaW5lZCBpbiBQQ0llCj4gQ0VNIHNwZWMgKDMuMCkgYW5kIGFsc28gaW4gTS4y IENFTSBzcGVjLgoKV2hpY2ggaXMgd2hhdCBJIGhhdmUgcG9pbnRlZCBvdXQgaW4gbXkgZm9sbG93 dXAgdG8gbXkgb3JpZ2luYWwgZW1haWwuCgo+IAo+ID4gSGF2aW5nIGNvbWUgdG8gbXkgc2Vuc2Vz LCBhbmQgd2l0aCB0aGVzZSBjb25zdHJhaW50cyBpbiBtaW5kLCB0aGlzIGlzCj4gPiB3aGF0IEkg Y3VycmVudGx5IGhhdmUgaW4gbXkgdHJlZToKPiA+IAo+ID4gCS8qIEVuZ2FnZSAjUEVSU1QgKi8K PiA+IAlncGlvZF9zZXRfdmFsdWUocmVzZXQsIDApOwo+ID4gCj4gPiAJcmV0ID0gYXBwbGVfcGNp ZV9zZXR1cF9yZWZjbGsocGNpZSwgcG9ydCk7Cj4gPiAJaWYgKHJldCA8IDApCj4gPiAJCXJldHVy biByZXQ7Cj4gPiAKPiA+IAkvKiBIb2xkICNQRVJTVCBmb3IgMTAwbXMgYXMgcGVyIHRoZSBlbGVj dHJvbWVjaGFuaWNhbCBzcGVjICovCj4gPiAJbXNsZWVwKDEwMCk7Cj4gPiAJcm13X3NldChQT1JU X1BFUlNUX09GRiwgcG9ydC0+YmFzZSArIFBPUlRfUEVSU1QpOwo+ID4gCWdwaW9kX3NldF92YWx1 ZShyZXNldCwgMSk7Cj4gPiAJLyogV2FpdCBmb3IgMTAwbXMgYWZ0ZXIgI1BFUlNUIGRlYXNzZXJ0 aW9uIGJlZm9yZSBhbm90aGluZyBlbHNlICovCj4gPiAJbXNsZWVwKDEwMCk7Cj4gPiAKPiA+IFll cywgdGhpcyBpcyB0b3RhbGx5IG92ZXJraWxsLCBhcyBJIGFzc3VtZSB0aGF0IGVhY2ggcG9ydCBo YXMgZ29uZQo+ID4gdGhyb3VnaCBhIGNvbXBsZXRlIHBvd2VyLW9mZiBhbmQgaXMgb25seSBzbG93 bHkgY29taW5nIGJhY2sgZnJvbSB0aGUKPiA+IGRlYWQuCj4gCj4gRm9yIHBvd2VyLW9uIGl0IGlz IHByb2JhYmx5IG92ZXJraWxsLCBidXQgSSB0aGluayB0aGF0IGRlbGF5IGJldHdlZW4KPiBmbGlw cGluZyBQRVJTVCMgc2hvdWxkIGJlIHRoZXJlLiBJSVJDIENvbXBleCBXTEUxMjE2IHdpZmkgY2Fy ZCBuZWVkcyB0bwo+IGJlIGF0IGxlYXN0IDEwLTExbXMgaW4gcmVzZXQuIExhc3QgeWVhciwgZHVy aW5nIHRlc3Rpbmcgb2YgdGhpcyBjYXJkIEkKPiBzYXcgdGhhdCBpZiBQRVJTVCMtYmFzZWQgcmVz ZXQgd2FzIHNob3J0ZXIgdGhlbiBjYXJkIHdhcyBjb21wbGV0ZWx5Cj4gdW5kZXRlY3RlZC4KClRo ZSBvbmx5IGRlbGF5IHdlIHJlYWxseSBuZWVkIGlzIFRwZXJzdC1jbGsuIFJhbmRvbSBidWdzIG9u IHJhbmRvbQpkZXZpY2VzIGRvbid0IGFwcGx5IGhlcmUsIGFzIHRoZSBzeXN0ZW0gaXMgY29tcGxl dGVseSBjbG9zZWQgKHRoZXJlIGlzCm5vIHNsb3QgdG8gYWRkIGFueXRoaW5nKS4gT25jZSB3ZSBo YXZlIFRCIHJ1bm5pbmcgb25lIG9mIHRoZXNlIGRheXMsCndlIHdpbGwgc2VlIHdoZXRoZXIgdGhp cyBzdGlsbCBob2xkcy4KCj4gPiBJbiBwcmFjdGljZSwgSSBjYW4gY29tcGxldGVseSByZW1vdmUg dGhlIGluaXRpYWwgVHB2cGVybCBkZWxheSAod2UKPiA+IGhhdmUgYmVlbiBwb3dlcmVkLW9uIGZv ciBhIGxvbmcgdGltZSBhbHJlYWR5LCBhbmQgdGhlIGNsb2NrIGlzIHN0YWJsZQo+ID4gd2hlbiB3 ZSBjb21lIGJhY2sgZnJvbSBzZXR0aW5nIGl0IHVwKSwgYW5kIGN1dCB0aGUgc2Vjb25kIG9uZSBi eSBoYWxmCj4gPiB3aXRob3V0IG9ic2VydmluZyBhbnkgaWxsIGVmZmVjdCAodGhvdWdoIEkgZmVl bCBzYWZlciBrZWVwaW5nIGl0IHRvCj4gPiBpdHMgbm9taW5hbCB2YWx1ZSkuCj4gCj4gTXkgb3Bp bmlvbiBpcyB0aGF0IHRoaXMgcGF0Y2ggZG9lcyBub3QgcG93ZXIgb24vb2ZmIGNhcmQgaW4gUENJ ZSBzbG90Lgo+IEFuZCBiZWNhdXNlIGNhcmQgaXMgcG93ZXJlZC1vbiBmb3IgYSBsb25nIHRpbWUg KGFzIHlvdSB3cm90ZSksIGl0IG1lYW5zCj4gdGhhdCBUcHZwZXJsIGRlbGF5IGRvZXMgbm90IGFw cGx5IGhlcmUuIFRoYXQgaXMgd2h5IEkgdGhpbmsgdGhhdAo+IGRpZmZlcmVudCBkZWxheSAoSG93 IGxvbmcgc2hvdWxkIGJlIFBDSWUgY2FyZCBpbiBXYXJtIFJlc2V0IHN0YXRlKQo+IHNob3VsZCBi ZSB1c2VkIF9iZXR3ZWVuXyBmbGlwcGluZyBQRVJTVCMgc2lnbmFsLgoKTXkgcmVhZGluZyBvZiB0 aGUgc3BlYyBpcyB0aGF0IHRoZSBvbmx5IHRoaW5nIHdlIG5lZWQgd2hpbGUgI1BFUlNUIGlzCmFz c2VydGVkIGlzIFRwZXJzdC1jbGsuIFRoZSB2YWx1ZSB5b3Uga2VlcCBhcmd1aW5nIGFib3V0IGRv ZXNuJ3Qgc2VlbQp0byBleGlzdCBhcyBzdWNoIGluIHRoZSBzcGVjLCBiZWNhdXNlIGl0IGFwcGVh cnMgdG8gYmUgZW5kcG9pbnQKc3BlY2lmaWMuCgo+IEFuZCBvZiBjb3Vyc2UgYWZ0ZXIgdGhlIHJl bGVhc2luZyBQRVJTVCMgdGhhdCAxMDBtcyBwb3N0LVBFUlNUIyBkZWxheSBpcwo+IHJlcXVpcmVk LgoKVGhhdCB3ZSBhZ3JlZSBvbi4KCj4gSSBoYXZlIGFuIGlkZWEgdG8gbW92ZSBQRVJTVCMgaGFu ZGxpbmcgKHdpdGggYWxsIGRlbGF5cykgZnJvbSBjb250cm9sbGVyCj4gZHJpdmVycyB0byBwY2kg Y29yZSBmdW5jdGlvbnMuIEJlY2F1c2UgYmFzaWNhbGx5IGV2ZXJ5IGRyaXZlcgo+IHJlLWltcGxl bWVudHMgdGhlc2UgZGVsYXlzIGluIGl0cyBwcm9iZSBmdW5jdGlvbi4gSSB3cm90ZSB0aGlzIGlk ZWEgd2l0aAo+IHNvbWUgZGV0YWlscyBpbiBlbWFpbC4gSWYgeW91IGhhdmUgYSB0aW1lLCBjb3Vs ZCB5b3UgbG9vayBhdCBpdD8gSQo+IHN1bW1hcml6ZWQgaGVyZSBhbHNvIGRldGFpbHMgYWJvdXQg ZGVsYXlzIChsaWtlIFRwdnBlcmwsIFRwZXJzdGNsaywgLi4pOgo+IGh0dHBzOi8vbG9yZS5rZXJu ZWwub3JnL2xpbnV4LXBjaS8yMDIxMTAyMjE4MzgwOC5qZGVvN3ZudG5hZ3FrZzdnQHBhbGkvCgpU aGF0J3MgYSBsYXVkYWJsZSBnb2FsLiBXaGF0IGlzbid0IGNsZWFyIHRvIG1lIGlzIHdoZXRoZXIg eW91IGludGVuZAp0byBtb3ZlIHRoZSB3aG9sZSBzdGF0ZSBtYWNoaW5lIGludG8gY29yZSBjb2Rl LCBvciBqdXN0IGhhdmUgYSBzZXQgb2YKaGVscGVycyB0aGF0IHRoZSBkcml2ZXIgY2FsbHMgaW50 by4gSU1PLCB0aGUgZm9ybWVyIGlzIHdoYXQgd2UgcmVhbGx5Cm5lZWQsIHdoaWxlIHRoZSBsYXR0 ZXIgb25seSByaWRzIHVzIG9mIHRoZSBzaW1wbGUgc3R1ZmYuCgoJTS4KCi0tIApXaXRob3V0IGRl dmlhdGlvbiBmcm9tIHRoZSBub3JtLCBwcm9ncmVzcyBpcyBub3QgcG9zc2libGUuCgpfX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVs IG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==