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=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, 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 B4B06C432C3 for ; Fri, 22 Nov 2019 11:25:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8EE5820708 for ; Fri, 22 Nov 2019 11:25:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728425AbfKVKgp (ORCPT ); Fri, 22 Nov 2019 05:36:45 -0500 Received: from mga05.intel.com ([192.55.52.43]:3822 "EHLO mga05.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728420AbfKVKgm (ORCPT ); Fri, 22 Nov 2019 05:36:42 -0500 X-Amp-Result: UNKNOWN X-Amp-Original-Verdict: FILE UNKNOWN X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Nov 2019 02:36:41 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,229,1571727600"; d="scan'208";a="216340610" Received: from lahna.fi.intel.com (HELO lahna) ([10.237.72.163]) by fmsmga001.fm.intel.com with SMTP; 22 Nov 2019 02:36:38 -0800 Received: by lahna (sSMTP sendmail emulation); Fri, 22 Nov 2019 12:36:37 +0200 Date: Fri, 22 Nov 2019 12:36:37 +0200 From: Mika Westerberg To: "Rafael J. Wysocki" Cc: Karol Herbst , Bjorn Helgaas , LKML , Lyude Paul , "Rafael J . Wysocki" , Linux PCI , Linux PM , dri-devel , nouveau , Dave Airlie , Mario Limonciello Subject: Re: [PATCH v4] pci: prevent putting nvidia GPUs into lower device states on certain intel bridges Message-ID: <20191122103637.GA11621@lahna.fi.intel.com> References: <20191121112821.GU11621@lahna.fi.intel.com> <20191121114610.GW11621@lahna.fi.intel.com> <20191121125236.GX11621@lahna.fi.intel.com> <20191121194942.GY11621@lahna.fi.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo User-Agent: Mutt/1.12.1 (2019-06-15) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Thu, Nov 21, 2019 at 11:39:23PM +0100, Rafael J. Wysocki wrote: > On Thu, Nov 21, 2019 at 8:49 PM Mika Westerberg > wrote: > > > > On Thu, Nov 21, 2019 at 04:43:24PM +0100, Rafael J. Wysocki wrote: > > > On Thu, Nov 21, 2019 at 1:52 PM Mika Westerberg > > > wrote: > > > > > > > > On Thu, Nov 21, 2019 at 01:46:14PM +0200, Mika Westerberg wrote: > > > > > On Thu, Nov 21, 2019 at 12:34:22PM +0100, Rafael J. Wysocki wrote: > > > > > > On Thu, Nov 21, 2019 at 12:28 PM Mika Westerberg > > > > > > wrote: > > > > > > > > > > > > > > On Wed, Nov 20, 2019 at 11:29:33PM +0100, Rafael J. Wysocki wrote: > > > > > > > > > last week or so I found systems where the GPU was under the "PCI > > > > > > > > > Express Root Port" (name from lspci) and on those systems all of that > > > > > > > > > seems to work. So I am wondering if it's indeed just the 0x1901 one, > > > > > > > > > which also explains Mikas case that Thunderbolt stuff works as devices > > > > > > > > > never get populated under this particular bridge controller, but under > > > > > > > > > those "Root Port"s > > > > > > > > > > > > > > > > It always is a PCIe port, but its location within the SoC may matter. > > > > > > > > > > > > > > Exactly. Intel hardware has PCIe ports on CPU side (these are called > > > > > > > PEG, PCI Express Graphics, ports), and the PCH side. I think the IP is > > > > > > > still the same. > > > > > > > > > > > > > > > Also some custom AML-based power management is involved and that may > > > > > > > > be making specific assumptions on the configuration of the SoC and the > > > > > > > > GPU at the time of its invocation which unfortunately are not known to > > > > > > > > us. > > > > > > > > > > > > > > > > However, it looks like the AML invoked to power down the GPU from > > > > > > > > acpi_pci_set_power_state() gets confused if it is not in PCI D0 at > > > > > > > > that point, so it looks like that AML tries to access device memory on > > > > > > > > the GPU (beyond the PCI config space) or similar which is not > > > > > > > > accessible in PCI power states below D0. > > > > > > > > > > > > > > Or the PCI config space of the GPU when the parent root port is in D3hot > > > > > > > (as it is the case here). Also then the GPU config space is not > > > > > > > accessible. > > > > > > > > > > > > Why would the parent port be in D3hot at that point? Wouldn't that be > > > > > > a suspend ordering violation? > > > > > > > > > > No. We put the GPU into D3hot first, > > > > > > OK > > > > > > Does this involve any AML, like a _PS3 under the GPU object? > > > > I don't see _PS3 (nor _PS0) for that object. If I read it right the GPU > > itself is not described in ACPI tables at all. > > OK > > > > > > then the root port and then turn > > > > > off the power resource (which is attached to the root port) resulting > > > > > the topology entering D3cold. > > > > > > > > I don't see that happening in the AML though. > > > > > > Which AML do you mean, specifically? The _OFF method for the root > > > port's _PR3 power resource or something else? > > > > The root port's _OFF method for the power resource returned by its _PR3. > > OK, so without the $subject patch we (1) program the downstream > component (GPU) into D3hot, then we (2) program the port holding it > into D3hot and then we (3) let the AML (_OFF for the power resource > listed by _PR3 under the port object) run. > > Something strange happens at this point (and I guess that _OFF doesn't > even reach the point where it removes power from the port which is why > we see a lock-up). It does not necessary lead to lock-up. Here is dmesg from Karol's system: https://gist.githubusercontent.com/karolherbst/40eb091c7b7b33ef993525de660f1a3b/raw/2380e31f566e93e5ba7c87ef545420965d4c492c/gistfile1.txt what seems to happen is that the GPU never "comes back" from D3cold so the driver starts breaking apart as the hardware is gone now. > We know that skipping (1) makes things work and we kind of suspect > that skipping (3) would make things work either, but what about doing > (1) and (3) without (2)? You mean in this particular case or in general? Because if the port has _PSx methods we need to put it into D3hot AFAIK. > > > > Basically the difference is that when Windows 7 or Linux (the _REV==5 > > > > check) then we directly do link disable whereas in Windows 8+ we invoke > > > > LKDS() method that puts the link into L2/L3. None of the fields they > > > > access seem to touch the GPU itself. > > > > > > So that may be where the problem is. > > > > > > Putting the downstream component into PCI D[1-3] is expected to put > > > the link into L1, so I'm not sure how that plays with the later > > > attempt to put it into L2/L3 Ready. > > > > That should be fine. What I've seen the link goes into L1 when > > downstream component is put to D-state (not D0) and then it is put back > > to L0 when L2/3 ready is propagated. Eventually it goes into L2 or L3. > > Well, that's the expected behavior, but the observed behavior isn't as > expected. :-) Right :) > > > Also, L2/L3 Ready is expected to be transient, so finally power should > > > be removed somehow. > > > > There is GPIO for both power and PERST, I think the line here: > > > > \_SB.SGOV (0x01010004, Zero) > > > > is the one that removes power. > > OK > > > > > LKDS() for the first PEG port looks like this: > > > > > > > > P0L2 = One > > > > Sleep (0x10) > > > > Local0 = Zero > > > > While (P0L2) > > > > { > > > > If ((Local0 > 0x04)) > > > > { > > > > Break > > > > } > > > > > > > > Sleep (0x10) > > > > Local0++ > > > > } > > > > > > > > One thing that comes to mind is that the loop can end even if P0L2 is > > > > not cleared as it does only 5 iterations with 16 ms sleep between. Maybe > > > > Sleep() is implemented differently in Windows? I mean Linux may be > > > > "faster" here and return prematurely and if we leave the port into D0 > > > > this does not happen, or something. I'm just throwing out ideas :) > > > > > > But this actually works for the downstream component in D0, doesn't it? > > > > It does and that leaves the link in L0 so it could be that then the > > above AML works better or something. > > That would be my guess. > > > That reminds me, ASPM may have something to do with this as well. > > Not really if D-states are involved. > > > > Also, if the downstream component is in D0, the port actually should > > > stay in D0 too, so what would happen with the $subject patch applied? > > > > Parent port cannot be lower D-state than the child so I agree it should > > stay in D0 as well. However, it seems that what happens is that the > > issue goes away :) > > Well, at least this is kind of out of the spec. > > Note that pci_pm_suspend_noirq() won't let the port go into D3 if the > downstream device is in D0, so the $subject patch will not work as > expected in the suspend-to-idle case. > > Also we really should make up our minds on whether or not to force > PCIe ports to stay in D0 when downstream devices are in D0 and be > consequent about that. Right now we do one thing during system-wide > suspend and the other one in PM-runtime, which is confusing. > > The current design is mostly based on the PCI PM Spec 1.2, so it would > be consequent to follow system-wide suspend in PM-runtime and avoid > putting PCIe ports holding devices in D0 into any low-power states. > but that would make the approach in the $subject patch ineffective. > > Moreover, the fact that there are separate branches for "Windows 7" > and "Windows 8+" kind of suggest a change in the expected behavior > between Windows 7 and Windows 8, from the AML perspective. I would > guess that Windows 7 followed PCI PM 1.2 and Windows 8 (and later) > does something else. My understanding (which may not be correct) is that up to Windows 7 it never put the devices into D3cold runtime. Only when the system entered Sx states it evaluated the _OFF methods. Starting from Windows 8 it started doing this runtime so devices can enter D3cold even when system is in S0. > Now, the structure of the "Windows 8+" branch > described by you suggests that, at least in the cases when it is going > to remove power from the port eventually, it goes straight for the > link preparation (the L2/L3 Ready transition) and power removal > without bothering to program the downstream device and port into D3hot > (because that's kind of redundant). > > That hypothetical "Windows 8+" approach may really work universally, > because it doesn't seem to break any rules (going straight from D0 to > D3cold is not disallowed and doing that for both a port and a > downstream device at the same time is kind of OK either, as long as > the link is ready for that). I guess it depends on how you interpret the specs ;-) From PCIe 5.0 sec 5.8 we can see the supported PM state transitions and it shows that you get to D3cold through D3hot. Of course the device goes into D3cold if you simply remove its power so I agree with you as well. However, if there is _PS3 method we can't skip the D3hot phase. From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mika Westerberg Subject: Re: [PATCH v4] pci: prevent putting nvidia GPUs into lower device states on certain intel bridges Date: Fri, 22 Nov 2019 12:36:37 +0200 Message-ID: <20191122103637.GA11621@lahna.fi.intel.com> References: <20191121112821.GU11621@lahna.fi.intel.com> <20191121114610.GW11621@lahna.fi.intel.com> <20191121125236.GX11621@lahna.fi.intel.com> <20191121194942.GY11621@lahna.fi.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: "Rafael J. Wysocki" Cc: Karol Herbst , Linux PM , Linux PCI , Mario Limonciello , "Rafael J . Wysocki" , LKML , dri-devel , Bjorn Helgaas , nouveau List-Id: nouveau.vger.kernel.org T24gVGh1LCBOb3YgMjEsIDIwMTkgYXQgMTE6Mzk6MjNQTSArMDEwMCwgUmFmYWVsIEouIFd5c29j a2kgd3JvdGU6Cj4gT24gVGh1LCBOb3YgMjEsIDIwMTkgYXQgODo0OSBQTSBNaWthIFdlc3RlcmJl cmcKPiA8bWlrYS53ZXN0ZXJiZXJnQGludGVsLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gVGh1LCBO b3YgMjEsIDIwMTkgYXQgMDQ6NDM6MjRQTSArMDEwMCwgUmFmYWVsIEouIFd5c29ja2kgd3JvdGU6 Cj4gPiA+IE9uIFRodSwgTm92IDIxLCAyMDE5IGF0IDE6NTIgUE0gTWlrYSBXZXN0ZXJiZXJnCj4g PiA+IDxtaWthLndlc3RlcmJlcmdAaW50ZWwuY29tPiB3cm90ZToKPiA+ID4gPgo+ID4gPiA+IE9u IFRodSwgTm92IDIxLCAyMDE5IGF0IDAxOjQ2OjE0UE0gKzAyMDAsIE1pa2EgV2VzdGVyYmVyZyB3 cm90ZToKPiA+ID4gPiA+IE9uIFRodSwgTm92IDIxLCAyMDE5IGF0IDEyOjM0OjIyUE0gKzAxMDAs IFJhZmFlbCBKLiBXeXNvY2tpIHdyb3RlOgo+ID4gPiA+ID4gPiBPbiBUaHUsIE5vdiAyMSwgMjAx OSBhdCAxMjoyOCBQTSBNaWthIFdlc3RlcmJlcmcKPiA+ID4gPiA+ID4gPG1pa2Eud2VzdGVyYmVy Z0BpbnRlbC5jb20+IHdyb3RlOgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gT24gV2VkLCBO b3YgMjAsIDIwMTkgYXQgMTE6Mjk6MzNQTSArMDEwMCwgUmFmYWVsIEouIFd5c29ja2kgd3JvdGU6 Cj4gPiA+ID4gPiA+ID4gPiA+IGxhc3Qgd2VlayBvciBzbyBJIGZvdW5kIHN5c3RlbXMgd2hlcmUg dGhlIEdQVSB3YXMgdW5kZXIgdGhlICJQQ0kKPiA+ID4gPiA+ID4gPiA+ID4gRXhwcmVzcyBSb290 IFBvcnQiIChuYW1lIGZyb20gbHNwY2kpIGFuZCBvbiB0aG9zZSBzeXN0ZW1zIGFsbCBvZiB0aGF0 Cj4gPiA+ID4gPiA+ID4gPiA+IHNlZW1zIHRvIHdvcmsuIFNvIEkgYW0gd29uZGVyaW5nIGlmIGl0 J3MgaW5kZWVkIGp1c3QgdGhlIDB4MTkwMSBvbmUsCj4gPiA+ID4gPiA+ID4gPiA+IHdoaWNoIGFs c28gZXhwbGFpbnMgTWlrYXMgY2FzZSB0aGF0IFRodW5kZXJib2x0IHN0dWZmIHdvcmtzIGFzIGRl dmljZXMKPiA+ID4gPiA+ID4gPiA+ID4gbmV2ZXIgZ2V0IHBvcHVsYXRlZCB1bmRlciB0aGlzIHBh cnRpY3VsYXIgYnJpZGdlIGNvbnRyb2xsZXIsIGJ1dCB1bmRlcgo+ID4gPiA+ID4gPiA+ID4gPiB0 aG9zZSAiUm9vdCBQb3J0InMKPiA+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gPiBJdCBhbHdh eXMgaXMgYSBQQ0llIHBvcnQsIGJ1dCBpdHMgbG9jYXRpb24gd2l0aGluIHRoZSBTb0MgbWF5IG1h dHRlci4KPiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+IEV4YWN0bHkuIEludGVsIGhhcmR3YXJl IGhhcyBQQ0llIHBvcnRzIG9uIENQVSBzaWRlICh0aGVzZSBhcmUgY2FsbGVkCj4gPiA+ID4gPiA+ ID4gUEVHLCBQQ0kgRXhwcmVzcyBHcmFwaGljcywgcG9ydHMpLCBhbmQgdGhlIFBDSCBzaWRlLiBJ IHRoaW5rIHRoZSBJUCBpcwo+ID4gPiA+ID4gPiA+IHN0aWxsIHRoZSBzYW1lLgo+ID4gPiA+ID4g PiA+Cj4gPiA+ID4gPiA+ID4gPiBBbHNvIHNvbWUgY3VzdG9tIEFNTC1iYXNlZCBwb3dlciBtYW5h Z2VtZW50IGlzIGludm9sdmVkIGFuZCB0aGF0IG1heQo+ID4gPiA+ID4gPiA+ID4gYmUgbWFraW5n IHNwZWNpZmljIGFzc3VtcHRpb25zIG9uIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBTb0MgYW5k IHRoZQo+ID4gPiA+ID4gPiA+ID4gR1BVIGF0IHRoZSB0aW1lIG9mIGl0cyBpbnZvY2F0aW9uIHdo aWNoIHVuZm9ydHVuYXRlbHkgYXJlIG5vdCBrbm93biB0bwo+ID4gPiA+ID4gPiA+ID4gdXMuCj4g PiA+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiA+ID4gSG93ZXZlciwgaXQgbG9va3MgbGlrZSB0aGUg QU1MIGludm9rZWQgdG8gcG93ZXIgZG93biB0aGUgR1BVIGZyb20KPiA+ID4gPiA+ID4gPiA+IGFj cGlfcGNpX3NldF9wb3dlcl9zdGF0ZSgpIGdldHMgY29uZnVzZWQgaWYgaXQgaXMgbm90IGluIFBD SSBEMCBhdAo+ID4gPiA+ID4gPiA+ID4gdGhhdCBwb2ludCwgc28gaXQgbG9va3MgbGlrZSB0aGF0 IEFNTCB0cmllcyB0byBhY2Nlc3MgZGV2aWNlIG1lbW9yeSBvbgo+ID4gPiA+ID4gPiA+ID4gdGhl IEdQVSAoYmV5b25kIHRoZSBQQ0kgY29uZmlnIHNwYWNlKSBvciBzaW1pbGFyIHdoaWNoIGlzIG5v dAo+ID4gPiA+ID4gPiA+ID4gYWNjZXNzaWJsZSBpbiBQQ0kgcG93ZXIgc3RhdGVzIGJlbG93IEQw Lgo+ID4gPiA+ID4gPiA+Cj4gPiA+ID4gPiA+ID4gT3IgdGhlIFBDSSBjb25maWcgc3BhY2Ugb2Yg dGhlIEdQVSB3aGVuIHRoZSBwYXJlbnQgcm9vdCBwb3J0IGlzIGluIEQzaG90Cj4gPiA+ID4gPiA+ ID4gKGFzIGl0IGlzIHRoZSBjYXNlIGhlcmUpLiBBbHNvIHRoZW4gdGhlIEdQVSBjb25maWcgc3Bh Y2UgaXMgbm90Cj4gPiA+ID4gPiA+ID4gYWNjZXNzaWJsZS4KPiA+ID4gPiA+ID4KPiA+ID4gPiA+ ID4gV2h5IHdvdWxkIHRoZSBwYXJlbnQgcG9ydCBiZSBpbiBEM2hvdCBhdCB0aGF0IHBvaW50PyAg V291bGRuJ3QgdGhhdCBiZQo+ID4gPiA+ID4gPiBhIHN1c3BlbmQgb3JkZXJpbmcgdmlvbGF0aW9u Pwo+ID4gPiA+ID4KPiA+ID4gPiA+IE5vLiBXZSBwdXQgdGhlIEdQVSBpbnRvIEQzaG90IGZpcnN0 LAo+ID4gPgo+ID4gPiBPSwo+ID4gPgo+ID4gPiBEb2VzIHRoaXMgaW52b2x2ZSBhbnkgQU1MLCBs aWtlIGEgX1BTMyB1bmRlciB0aGUgR1BVIG9iamVjdD8KPiA+Cj4gPiBJIGRvbid0IHNlZSBfUFMz IChub3IgX1BTMCkgZm9yIHRoYXQgb2JqZWN0LiBJZiBJIHJlYWQgaXQgcmlnaHQgdGhlIEdQVQo+ ID4gaXRzZWxmIGlzIG5vdCBkZXNjcmliZWQgaW4gQUNQSSB0YWJsZXMgYXQgYWxsLgo+IAo+IE9L Cj4gCj4gPiA+ID4gPiB0aGVuIHRoZSByb290IHBvcnQgYW5kIHRoZW4gdHVybgo+ID4gPiA+ID4g b2ZmIHRoZSBwb3dlciByZXNvdXJjZSAod2hpY2ggaXMgYXR0YWNoZWQgdG8gdGhlIHJvb3QgcG9y dCkgcmVzdWx0aW5nCj4gPiA+ID4gPiB0aGUgdG9wb2xvZ3kgZW50ZXJpbmcgRDNjb2xkLgo+ID4g PiA+Cj4gPiA+ID4gSSBkb24ndCBzZWUgdGhhdCBoYXBwZW5pbmcgaW4gdGhlIEFNTCB0aG91Z2gu Cj4gPiA+Cj4gPiA+IFdoaWNoIEFNTCBkbyB5b3UgbWVhbiwgc3BlY2lmaWNhbGx5PyAgVGhlIF9P RkYgbWV0aG9kIGZvciB0aGUgcm9vdAo+ID4gPiBwb3J0J3MgX1BSMyBwb3dlciByZXNvdXJjZSBv ciBzb21ldGhpbmcgZWxzZT8KPiA+Cj4gPiBUaGUgcm9vdCBwb3J0J3MgX09GRiBtZXRob2QgZm9y IHRoZSBwb3dlciByZXNvdXJjZSByZXR1cm5lZCBieSBpdHMgX1BSMy4KPiAKPiBPSywgc28gd2l0 aG91dCB0aGUgJHN1YmplY3QgcGF0Y2ggd2UgKDEpIHByb2dyYW0gdGhlIGRvd25zdHJlYW0KPiBj b21wb25lbnQgKEdQVSkgaW50byBEM2hvdCwgdGhlbiB3ZSAoMikgcHJvZ3JhbSB0aGUgcG9ydCBo b2xkaW5nIGl0Cj4gaW50byBEM2hvdCBhbmQgdGhlbiB3ZSAoMykgbGV0IHRoZSBBTUwgKF9PRkYg Zm9yIHRoZSBwb3dlciByZXNvdXJjZQo+IGxpc3RlZCBieSBfUFIzIHVuZGVyIHRoZSBwb3J0IG9i amVjdCkgcnVuLgo+IAo+IFNvbWV0aGluZyBzdHJhbmdlIGhhcHBlbnMgYXQgdGhpcyBwb2ludCAo YW5kIEkgZ3Vlc3MgdGhhdCBfT0ZGIGRvZXNuJ3QKPiBldmVuIHJlYWNoIHRoZSBwb2ludCB3aGVy ZSBpdCByZW1vdmVzIHBvd2VyIGZyb20gdGhlIHBvcnQgd2hpY2ggaXMgd2h5Cj4gd2Ugc2VlIGEg bG9jay11cCkuCgpJdCBkb2VzIG5vdCBuZWNlc3NhcnkgbGVhZCB0byBsb2NrLXVwLiBIZXJlIGlz IGRtZXNnIGZyb20gS2Fyb2wncwpzeXN0ZW06CgogIGh0dHBzOi8vZ2lzdC5naXRodWJ1c2VyY29u dGVudC5jb20va2Fyb2xoZXJic3QvNDBlYjA5MWM3YjdiMzNlZjk5MzUyNWRlNjYwZjFhM2IvcmF3 LzIzODBlMzFmNTY2ZTkzZTViYTdjODdlZjU0NTQyMDk2NWQ0YzQ5MmMvZ2lzdGZpbGUxLnR4dAoK d2hhdCBzZWVtcyB0byBoYXBwZW4gaXMgdGhhdCB0aGUgR1BVIG5ldmVyICJjb21lcyBiYWNrIiBm cm9tIEQzY29sZCBzbwp0aGUgZHJpdmVyIHN0YXJ0cyBicmVha2luZyBhcGFydCBhcyB0aGUgaGFy ZHdhcmUgaXMgZ29uZSBub3cuCgo+IFdlIGtub3cgdGhhdCBza2lwcGluZyAoMSkgbWFrZXMgdGhp bmdzIHdvcmsgYW5kIHdlIGtpbmQgb2Ygc3VzcGVjdAo+IHRoYXQgc2tpcHBpbmcgKDMpIHdvdWxk IG1ha2UgdGhpbmdzIHdvcmsgZWl0aGVyLCBidXQgd2hhdCBhYm91dCBkb2luZwo+ICgxKSBhbmQg KDMpIHdpdGhvdXQgKDIpPwoKWW91IG1lYW4gaW4gdGhpcyBwYXJ0aWN1bGFyIGNhc2Ugb3IgaW4g Z2VuZXJhbD8gQmVjYXVzZSBpZiB0aGUgcG9ydCBoYXMKX1BTeCBtZXRob2RzIHdlIG5lZWQgdG8g cHV0IGl0IGludG8gRDNob3QgQUZBSUsuCgo+ID4gPiA+IEJhc2ljYWxseSB0aGUgZGlmZmVyZW5j ZSBpcyB0aGF0IHdoZW4gV2luZG93cyA3IG9yIExpbnV4ICh0aGUgX1JFVj09NQo+ID4gPiA+IGNo ZWNrKSB0aGVuIHdlIGRpcmVjdGx5IGRvIGxpbmsgZGlzYWJsZSB3aGVyZWFzIGluIFdpbmRvd3Mg OCsgd2UgaW52b2tlCj4gPiA+ID4gTEtEUygpIG1ldGhvZCB0aGF0IHB1dHMgdGhlIGxpbmsgaW50 byBMMi9MMy4gTm9uZSBvZiB0aGUgZmllbGRzIHRoZXkKPiA+ID4gPiBhY2Nlc3Mgc2VlbSB0byB0 b3VjaCB0aGUgR1BVIGl0c2VsZi4KPiA+ID4KPiA+ID4gU28gdGhhdCBtYXkgYmUgd2hlcmUgdGhl IHByb2JsZW0gaXMuCj4gPiA+Cj4gPiA+IFB1dHRpbmcgdGhlIGRvd25zdHJlYW0gY29tcG9uZW50 IGludG8gUENJIERbMS0zXSBpcyBleHBlY3RlZCB0byBwdXQKPiA+ID4gdGhlIGxpbmsgaW50byBM MSwgc28gSSdtIG5vdCBzdXJlIGhvdyB0aGF0IHBsYXlzIHdpdGggdGhlIGxhdGVyCj4gPiA+IGF0 dGVtcHQgdG8gcHV0IGl0IGludG8gTDIvTDMgUmVhZHkuCj4gPgo+ID4gVGhhdCBzaG91bGQgYmUg ZmluZS4gV2hhdCBJJ3ZlIHNlZW4gdGhlIGxpbmsgZ29lcyBpbnRvIEwxIHdoZW4KPiA+IGRvd25z dHJlYW0gY29tcG9uZW50IGlzIHB1dCB0byBELXN0YXRlIChub3QgRDApIGFuZCB0aGVuIGl0IGlz IHB1dCBiYWNrCj4gPiB0byBMMCB3aGVuIEwyLzMgcmVhZHkgaXMgcHJvcGFnYXRlZC4gRXZlbnR1 YWxseSBpdCBnb2VzIGludG8gTDIgb3IgTDMuCj4gCj4gV2VsbCwgdGhhdCdzIHRoZSBleHBlY3Rl ZCBiZWhhdmlvciwgYnV0IHRoZSBvYnNlcnZlZCBiZWhhdmlvciBpc24ndCBhcwo+IGV4cGVjdGVk LiA6LSkKClJpZ2h0IDopCgo+ID4gPiBBbHNvLCBMMi9MMyBSZWFkeSBpcyBleHBlY3RlZCB0byBi ZSB0cmFuc2llbnQsIHNvIGZpbmFsbHkgcG93ZXIgc2hvdWxkCj4gPiA+IGJlIHJlbW92ZWQgc29t ZWhvdy4KPiA+Cj4gPiBUaGVyZSBpcyBHUElPIGZvciBib3RoIHBvd2VyIGFuZCBQRVJTVCwgSSB0 aGluayB0aGUgbGluZSBoZXJlOgo+ID4KPiA+ICAgXF9TQi5TR09WICgweDAxMDEwMDA0LCBaZXJv KQo+ID4KPiA+IGlzIHRoZSBvbmUgdGhhdCByZW1vdmVzIHBvd2VyLgo+IAo+IE9LCj4gCj4gPiA+ ID4gTEtEUygpIGZvciB0aGUgZmlyc3QgUEVHIHBvcnQgbG9va3MgbGlrZSB0aGlzOgo+ID4gPiA+ Cj4gPiA+ID4gICAgUDBMMiA9IE9uZQo+ID4gPiA+ICAgIFNsZWVwICgweDEwKQo+ID4gPiA+ICAg IExvY2FsMCA9IFplcm8KPiA+ID4gPiAgICBXaGlsZSAoUDBMMikKPiA+ID4gPiAgICB7Cj4gPiA+ ID4gICAgICAgICBJZiAoKExvY2FsMCA+IDB4MDQpKQo+ID4gPiA+ICAgICAgICAgewo+ID4gPiA+ ICAgICAgICAgICAgIEJyZWFrCj4gPiA+ID4gICAgICAgICB9Cj4gPiA+ID4KPiA+ID4gPiAgICAg ICAgIFNsZWVwICgweDEwKQo+ID4gPiA+ICAgICAgICAgTG9jYWwwKysKPiA+ID4gPiAgICB9Cj4g PiA+ID4KPiA+ID4gPiBPbmUgdGhpbmcgdGhhdCBjb21lcyB0byBtaW5kIGlzIHRoYXQgdGhlIGxv b3AgY2FuIGVuZCBldmVuIGlmIFAwTDIgaXMKPiA+ID4gPiBub3QgY2xlYXJlZCBhcyBpdCBkb2Vz IG9ubHkgNSBpdGVyYXRpb25zIHdpdGggMTYgbXMgc2xlZXAgYmV0d2Vlbi4gTWF5YmUKPiA+ID4g PiBTbGVlcCgpIGlzIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGluIFdpbmRvd3M/IEkgbWVhbiBM aW51eCBtYXkgYmUKPiA+ID4gPiAiZmFzdGVyIiBoZXJlIGFuZCByZXR1cm4gcHJlbWF0dXJlbHkg YW5kIGlmIHdlIGxlYXZlIHRoZSBwb3J0IGludG8gRDAKPiA+ID4gPiB0aGlzIGRvZXMgbm90IGhh cHBlbiwgb3Igc29tZXRoaW5nLiBJJ20ganVzdCB0aHJvd2luZyBvdXQgaWRlYXMgOikKPiA+ID4K PiA+ID4gQnV0IHRoaXMgYWN0dWFsbHkgd29ya3MgZm9yIHRoZSBkb3duc3RyZWFtIGNvbXBvbmVu dCBpbiBEMCwgZG9lc24ndCBpdD8KPiA+Cj4gPiBJdCBkb2VzIGFuZCB0aGF0IGxlYXZlcyB0aGUg bGluayBpbiBMMCBzbyBpdCBjb3VsZCBiZSB0aGF0IHRoZW4gdGhlCj4gPiBhYm92ZSBBTUwgd29y a3MgYmV0dGVyIG9yIHNvbWV0aGluZy4KPiAKPiBUaGF0IHdvdWxkIGJlIG15IGd1ZXNzLgo+IAo+ ID4gVGhhdCByZW1pbmRzIG1lLCBBU1BNIG1heSBoYXZlIHNvbWV0aGluZyB0byBkbyB3aXRoIHRo aXMgYXMgd2VsbC4KPiAKPiBOb3QgcmVhbGx5IGlmIEQtc3RhdGVzIGFyZSBpbnZvbHZlZC4KPiAK PiA+ID4gQWxzbywgaWYgdGhlIGRvd25zdHJlYW0gY29tcG9uZW50IGlzIGluIEQwLCB0aGUgcG9y dCBhY3R1YWxseSBzaG91bGQKPiA+ID4gc3RheSBpbiBEMCB0b28sIHNvIHdoYXQgd291bGQgaGFw cGVuIHdpdGggdGhlICRzdWJqZWN0IHBhdGNoIGFwcGxpZWQ/Cj4gPgo+ID4gUGFyZW50IHBvcnQg Y2Fubm90IGJlIGxvd2VyIEQtc3RhdGUgdGhhbiB0aGUgY2hpbGQgc28gSSBhZ3JlZSBpdCBzaG91 bGQKPiA+IHN0YXkgaW4gRDAgYXMgd2VsbC4gSG93ZXZlciwgaXQgc2VlbXMgdGhhdCB3aGF0IGhh cHBlbnMgaXMgdGhhdCB0aGUKPiA+IGlzc3VlIGdvZXMgYXdheSA6KQo+IAo+IFdlbGwsIGF0IGxl YXN0IHRoaXMgaXMga2luZCBvZiBvdXQgb2YgdGhlIHNwZWMuCj4gCj4gTm90ZSB0aGF0IHBjaV9w bV9zdXNwZW5kX25vaXJxKCkgd29uJ3QgbGV0IHRoZSBwb3J0IGdvIGludG8gRDMgaWYgdGhlCj4g ZG93bnN0cmVhbSBkZXZpY2UgaXMgaW4gRDAsIHNvIHRoZSAkc3ViamVjdCBwYXRjaCB3aWxsIG5v dCB3b3JrIGFzCj4gZXhwZWN0ZWQgaW4gdGhlIHN1c3BlbmQtdG8taWRsZSBjYXNlLgo+IAo+IEFs c28gd2UgcmVhbGx5IHNob3VsZCBtYWtlIHVwIG91ciBtaW5kcyBvbiB3aGV0aGVyIG9yIG5vdCB0 byBmb3JjZQo+IFBDSWUgcG9ydHMgdG8gc3RheSBpbiBEMCB3aGVuIGRvd25zdHJlYW0gZGV2aWNl cyBhcmUgaW4gRDAgYW5kIGJlCj4gY29uc2VxdWVudCBhYm91dCB0aGF0LiAgUmlnaHQgbm93IHdl IGRvIG9uZSB0aGluZyBkdXJpbmcgc3lzdGVtLXdpZGUKPiBzdXNwZW5kIGFuZCB0aGUgb3RoZXIg b25lIGluIFBNLXJ1bnRpbWUsIHdoaWNoIGlzIGNvbmZ1c2luZy4KPiAKPiBUaGUgY3VycmVudCBk ZXNpZ24gaXMgbW9zdGx5IGJhc2VkIG9uIHRoZSBQQ0kgUE0gU3BlYyAxLjIsIHNvIGl0IHdvdWxk Cj4gYmUgY29uc2VxdWVudCB0byBmb2xsb3cgc3lzdGVtLXdpZGUgc3VzcGVuZCBpbiBQTS1ydW50 aW1lIGFuZCBhdm9pZAo+IHB1dHRpbmcgUENJZSBwb3J0cyBob2xkaW5nIGRldmljZXMgaW4gRDAg aW50byBhbnkgbG93LXBvd2VyIHN0YXRlcy4KPiBidXQgdGhhdCB3b3VsZCBtYWtlIHRoZSBhcHBy b2FjaCBpbiB0aGUgJHN1YmplY3QgcGF0Y2ggaW5lZmZlY3RpdmUuCj4gCj4gTW9yZW92ZXIsIHRo ZSBmYWN0IHRoYXQgdGhlcmUgYXJlIHNlcGFyYXRlIGJyYW5jaGVzIGZvciAiV2luZG93cyA3Igo+ IGFuZCAiV2luZG93cyA4KyIga2luZCBvZiBzdWdnZXN0IGEgY2hhbmdlIGluIHRoZSBleHBlY3Rl ZCBiZWhhdmlvcgo+IGJldHdlZW4gV2luZG93cyA3IGFuZCBXaW5kb3dzIDgsIGZyb20gdGhlIEFN TCBwZXJzcGVjdGl2ZS4gIEkgd291bGQKPiBndWVzcyB0aGF0IFdpbmRvd3MgNyBmb2xsb3dlZCBQ Q0kgUE0gMS4yIGFuZCBXaW5kb3dzIDggKGFuZCBsYXRlcikKPiBkb2VzIHNvbWV0aGluZyBlbHNl LgoKTXkgdW5kZXJzdGFuZGluZyAod2hpY2ggbWF5IG5vdCBiZSBjb3JyZWN0KSBpcyB0aGF0IHVw IHRvIFdpbmRvd3MgNyBpdApuZXZlciBwdXQgdGhlIGRldmljZXMgaW50byBEM2NvbGQgcnVudGlt ZS4gT25seSB3aGVuIHRoZSBzeXN0ZW0gZW50ZXJlZApTeCBzdGF0ZXMgaXQgZXZhbHVhdGVkIHRo ZSBfT0ZGIG1ldGhvZHMuCgpTdGFydGluZyBmcm9tIFdpbmRvd3MgOCBpdCBzdGFydGVkIGRvaW5n IHRoaXMgcnVudGltZSBzbyBkZXZpY2VzIGNhbgplbnRlciBEM2NvbGQgZXZlbiB3aGVuIHN5c3Rl bSBpcyBpbiBTMC4KCj4gTm93LCB0aGUgc3RydWN0dXJlIG9mIHRoZSAiV2luZG93cyA4KyIgYnJh bmNoCj4gZGVzY3JpYmVkIGJ5IHlvdSBzdWdnZXN0cyB0aGF0LCBhdCBsZWFzdCBpbiB0aGUgY2Fz ZXMgd2hlbiBpdCBpcyBnb2luZwo+IHRvIHJlbW92ZSBwb3dlciBmcm9tIHRoZSBwb3J0IGV2ZW50 dWFsbHksIGl0IGdvZXMgc3RyYWlnaHQgZm9yIHRoZQo+IGxpbmsgcHJlcGFyYXRpb24gKHRoZSBM Mi9MMyBSZWFkeSB0cmFuc2l0aW9uKSBhbmQgcG93ZXIgcmVtb3ZhbAo+IHdpdGhvdXQgYm90aGVy aW5nIHRvIHByb2dyYW0gdGhlIGRvd25zdHJlYW0gZGV2aWNlIGFuZCBwb3J0IGludG8gRDNob3QK PiAoYmVjYXVzZSB0aGF0J3Mga2luZCBvZiByZWR1bmRhbnQpLgo+IAo+IFRoYXQgaHlwb3RoZXRp Y2FsICJXaW5kb3dzIDgrIiBhcHByb2FjaCBtYXkgcmVhbGx5IHdvcmsgdW5pdmVyc2FsbHksCj4g YmVjYXVzZSBpdCBkb2Vzbid0IHNlZW0gdG8gYnJlYWsgYW55IHJ1bGVzIChnb2luZyBzdHJhaWdo dCBmcm9tIEQwIHRvCj4gRDNjb2xkIGlzIG5vdCBkaXNhbGxvd2VkIGFuZCBkb2luZyB0aGF0IGZv ciBib3RoIGEgcG9ydCBhbmQgYQo+IGRvd25zdHJlYW0gZGV2aWNlIGF0IHRoZSBzYW1lIHRpbWUg aXMga2luZCBvZiBPSyBlaXRoZXIsIGFzIGxvbmcgYXMKPiB0aGUgbGluayBpcyByZWFkeSBmb3Ig dGhhdCkuCgpJIGd1ZXNzIGl0IGRlcGVuZHMgb24gaG93IHlvdSBpbnRlcnByZXQgdGhlIHNwZWNz IDstKSBGcm9tIFBDSWUgNS4wIHNlYwo1Ljggd2UgY2FuIHNlZSB0aGUgc3VwcG9ydGVkIFBNIHN0 YXRlIHRyYW5zaXRpb25zIGFuZCBpdCBzaG93cyB0aGF0IHlvdQpnZXQgdG8gRDNjb2xkIHRocm91 Z2ggRDNob3QuIE9mIGNvdXJzZSB0aGUgZGV2aWNlIGdvZXMgaW50byBEM2NvbGQgaWYKeW91IHNp bXBseSByZW1vdmUgaXRzIHBvd2VyIHNvIEkgYWdyZWUgd2l0aCB5b3UgYXMgd2VsbC4gSG93ZXZl ciwgaWYKdGhlcmUgaXMgX1BTMyBtZXRob2Qgd2UgY2FuJ3Qgc2tpcCB0aGUgRDNob3QgcGhhc2Uu Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZl bCBtYWlsaW5nIGxpc3QKZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==