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 A2E20C432C0 for ; Thu, 21 Nov 2019 19:49:49 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 79186206D7 for ; Thu, 21 Nov 2019 19:49:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726947AbfKUTts (ORCPT ); Thu, 21 Nov 2019 14:49:48 -0500 Received: from mga12.intel.com ([192.55.52.136]:61330 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726379AbfKUTts (ORCPT ); Thu, 21 Nov 2019 14:49:48 -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 fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Nov 2019 11:49:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,226,1571727600"; d="scan'208";a="216204277" Received: from lahna.fi.intel.com (HELO lahna) ([10.237.72.163]) by fmsmga001.fm.intel.com with SMTP; 21 Nov 2019 11:49:43 -0800 Received: by lahna (sSMTP sendmail emulation); Thu, 21 Nov 2019 21:49:43 +0200 Date: Thu, 21 Nov 2019 21:49:42 +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: <20191121194942.GY11621@lahna.fi.intel.com> References: <20191120155301.GL11621@lahna.fi.intel.com> <20191121112821.GU11621@lahna.fi.intel.com> <20191121114610.GW11621@lahna.fi.intel.com> <20191121125236.GX11621@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-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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. > > > 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. > > 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. > 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. > > 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 reminds me, ASPM may have something to do with this as well. > 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 :) 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,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 3A0A1C43215 for ; Thu, 21 Nov 2019 19:49:50 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 19D4E20643 for ; Thu, 21 Nov 2019 19:49:50 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 19D4E20643 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=intel.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 499786E17B; Thu, 21 Nov 2019 19:49:49 +0000 (UTC) Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by gabe.freedesktop.org (Postfix) with ESMTPS id 224CB6E17B; Thu, 21 Nov 2019 19:49:48 +0000 (UTC) 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 fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Nov 2019 11:49:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,226,1571727600"; d="scan'208";a="216204277" Received: from lahna.fi.intel.com (HELO lahna) ([10.237.72.163]) by fmsmga001.fm.intel.com with SMTP; 21 Nov 2019 11:49:43 -0800 Received: by lahna (sSMTP sendmail emulation); Thu, 21 Nov 2019 21:49:43 +0200 Date: Thu, 21 Nov 2019 21:49:42 +0200 From: Mika Westerberg To: "Rafael J. Wysocki" Subject: Re: [PATCH v4] pci: prevent putting nvidia GPUs into lower device states on certain intel bridges Message-ID: <20191121194942.GY11621@lahna.fi.intel.com> References: <20191120155301.GL11621@lahna.fi.intel.com> <20191121112821.GU11621@lahna.fi.intel.com> <20191121114610.GW11621@lahna.fi.intel.com> <20191121125236.GX11621@lahna.fi.intel.com> MIME-Version: 1.0 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) X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Karol Herbst , Linux PM , Linux PCI , Mario Limonciello , "Rafael J . Wysocki" , LKML , dri-devel , Bjorn Helgaas , nouveau Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Message-ID: <20191121194942.N7KPjDi4W2dKSjkPUoph83MAKwk2TKn5TfBsjZxW0zU@z> T24gVGh1LCBOb3YgMjEsIDIwMTkgYXQgMDQ6NDM6MjRQTSArMDEwMCwgUmFmYWVsIEouIFd5c29j a2kgd3JvdGU6Cj4gT24gVGh1LCBOb3YgMjEsIDIwMTkgYXQgMTo1MiBQTSBNaWthIFdlc3RlcmJl cmcKPiA8bWlrYS53ZXN0ZXJiZXJnQGludGVsLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gVGh1LCBO b3YgMjEsIDIwMTkgYXQgMDE6NDY6MTRQTSArMDIwMCwgTWlrYSBXZXN0ZXJiZXJnIHdyb3RlOgo+ ID4gPiBPbiBUaHUsIE5vdiAyMSwgMjAxOSBhdCAxMjozNDoyMlBNICswMTAwLCBSYWZhZWwgSi4g V3lzb2NraSB3cm90ZToKPiA+ID4gPiBPbiBUaHUsIE5vdiAyMSwgMjAxOSBhdCAxMjoyOCBQTSBN aWthIFdlc3RlcmJlcmcKPiA+ID4gPiA8bWlrYS53ZXN0ZXJiZXJnQGludGVsLmNvbT4gd3JvdGU6 Cj4gPiA+ID4gPgo+ID4gPiA+ID4gT24gV2VkLCBOb3YgMjAsIDIwMTkgYXQgMTE6Mjk6MzNQTSAr MDEwMCwgUmFmYWVsIEouIFd5c29ja2kgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gbGFzdCB3ZWVrIG9y IHNvIEkgZm91bmQgc3lzdGVtcyB3aGVyZSB0aGUgR1BVIHdhcyB1bmRlciB0aGUgIlBDSQo+ID4g PiA+ID4gPiA+IEV4cHJlc3MgUm9vdCBQb3J0IiAobmFtZSBmcm9tIGxzcGNpKSBhbmQgb24gdGhv c2Ugc3lzdGVtcyBhbGwgb2YgdGhhdAo+ID4gPiA+ID4gPiA+IHNlZW1zIHRvIHdvcmsuIFNvIEkg YW0gd29uZGVyaW5nIGlmIGl0J3MgaW5kZWVkIGp1c3QgdGhlIDB4MTkwMSBvbmUsCj4gPiA+ID4g PiA+ID4gd2hpY2ggYWxzbyBleHBsYWlucyBNaWthcyBjYXNlIHRoYXQgVGh1bmRlcmJvbHQgc3R1 ZmYgd29ya3MgYXMgZGV2aWNlcwo+ID4gPiA+ID4gPiA+IG5ldmVyIGdldCBwb3B1bGF0ZWQgdW5k ZXIgdGhpcyBwYXJ0aWN1bGFyIGJyaWRnZSBjb250cm9sbGVyLCBidXQgdW5kZXIKPiA+ID4gPiA+ ID4gPiB0aG9zZSAiUm9vdCBQb3J0InMKPiA+ID4gPiA+ID4KPiA+ID4gPiA+ID4gSXQgYWx3YXlz IGlzIGEgUENJZSBwb3J0LCBidXQgaXRzIGxvY2F0aW9uIHdpdGhpbiB0aGUgU29DIG1heSBtYXR0 ZXIuCj4gPiA+ID4gPgo+ID4gPiA+ID4gRXhhY3RseS4gSW50ZWwgaGFyZHdhcmUgaGFzIFBDSWUg cG9ydHMgb24gQ1BVIHNpZGUgKHRoZXNlIGFyZSBjYWxsZWQKPiA+ID4gPiA+IFBFRywgUENJIEV4 cHJlc3MgR3JhcGhpY3MsIHBvcnRzKSwgYW5kIHRoZSBQQ0ggc2lkZS4gSSB0aGluayB0aGUgSVAg aXMKPiA+ID4gPiA+IHN0aWxsIHRoZSBzYW1lLgo+ID4gPiA+ID4KPiA+ID4gPiA+ID4gQWxzbyBz b21lIGN1c3RvbSBBTUwtYmFzZWQgcG93ZXIgbWFuYWdlbWVudCBpcyBpbnZvbHZlZCBhbmQgdGhh dCBtYXkKPiA+ID4gPiA+ID4gYmUgbWFraW5nIHNwZWNpZmljIGFzc3VtcHRpb25zIG9uIHRoZSBj b25maWd1cmF0aW9uIG9mIHRoZSBTb0MgYW5kIHRoZQo+ID4gPiA+ID4gPiBHUFUgYXQgdGhlIHRp bWUgb2YgaXRzIGludm9jYXRpb24gd2hpY2ggdW5mb3J0dW5hdGVseSBhcmUgbm90IGtub3duIHRv Cj4gPiA+ID4gPiA+IHVzLgo+ID4gPiA+ID4gPgo+ID4gPiA+ID4gPiBIb3dldmVyLCBpdCBsb29r cyBsaWtlIHRoZSBBTUwgaW52b2tlZCB0byBwb3dlciBkb3duIHRoZSBHUFUgZnJvbQo+ID4gPiA+ ID4gPiBhY3BpX3BjaV9zZXRfcG93ZXJfc3RhdGUoKSBnZXRzIGNvbmZ1c2VkIGlmIGl0IGlzIG5v dCBpbiBQQ0kgRDAgYXQKPiA+ID4gPiA+ID4gdGhhdCBwb2ludCwgc28gaXQgbG9va3MgbGlrZSB0 aGF0IEFNTCB0cmllcyB0byBhY2Nlc3MgZGV2aWNlIG1lbW9yeSBvbgo+ID4gPiA+ID4gPiB0aGUg R1BVIChiZXlvbmQgdGhlIFBDSSBjb25maWcgc3BhY2UpIG9yIHNpbWlsYXIgd2hpY2ggaXMgbm90 Cj4gPiA+ID4gPiA+IGFjY2Vzc2libGUgaW4gUENJIHBvd2VyIHN0YXRlcyBiZWxvdyBEMC4KPiA+ ID4gPiA+Cj4gPiA+ID4gPiBPciB0aGUgUENJIGNvbmZpZyBzcGFjZSBvZiB0aGUgR1BVIHdoZW4g dGhlIHBhcmVudCByb290IHBvcnQgaXMgaW4gRDNob3QKPiA+ID4gPiA+IChhcyBpdCBpcyB0aGUg Y2FzZSBoZXJlKS4gQWxzbyB0aGVuIHRoZSBHUFUgY29uZmlnIHNwYWNlIGlzIG5vdAo+ID4gPiA+ ID4gYWNjZXNzaWJsZS4KPiA+ID4gPgo+ID4gPiA+IFdoeSB3b3VsZCB0aGUgcGFyZW50IHBvcnQg YmUgaW4gRDNob3QgYXQgdGhhdCBwb2ludD8gIFdvdWxkbid0IHRoYXQgYmUKPiA+ID4gPiBhIHN1 c3BlbmQgb3JkZXJpbmcgdmlvbGF0aW9uPwo+ID4gPgo+ID4gPiBOby4gV2UgcHV0IHRoZSBHUFUg aW50byBEM2hvdCBmaXJzdCwKPiAKPiBPSwo+IAo+IERvZXMgdGhpcyBpbnZvbHZlIGFueSBBTUws IGxpa2UgYSBfUFMzIHVuZGVyIHRoZSBHUFUgb2JqZWN0PwoKSSBkb24ndCBzZWUgX1BTMyAobm9y IF9QUzApIGZvciB0aGF0IG9iamVjdC4gSWYgSSByZWFkIGl0IHJpZ2h0IHRoZSBHUFUKaXRzZWxm IGlzIG5vdCBkZXNjcmliZWQgaW4gQUNQSSB0YWJsZXMgYXQgYWxsLgoKPiA+ID4gdGhlbiB0aGUg cm9vdCBwb3J0IGFuZCB0aGVuIHR1cm4KPiA+ID4gb2ZmIHRoZSBwb3dlciByZXNvdXJjZSAod2hp Y2ggaXMgYXR0YWNoZWQgdG8gdGhlIHJvb3QgcG9ydCkgcmVzdWx0aW5nCj4gPiA+IHRoZSB0b3Bv bG9neSBlbnRlcmluZyBEM2NvbGQuCj4gPgo+ID4gSSBkb24ndCBzZWUgdGhhdCBoYXBwZW5pbmcg aW4gdGhlIEFNTCB0aG91Z2guCj4gCj4gV2hpY2ggQU1MIGRvIHlvdSBtZWFuLCBzcGVjaWZpY2Fs bHk/ICBUaGUgX09GRiBtZXRob2QgZm9yIHRoZSByb290Cj4gcG9ydCdzIF9QUjMgcG93ZXIgcmVz b3VyY2Ugb3Igc29tZXRoaW5nIGVsc2U/CgpUaGUgcm9vdCBwb3J0J3MgX09GRiBtZXRob2QgZm9y IHRoZSBwb3dlciByZXNvdXJjZSByZXR1cm5lZCBieSBpdHMgX1BSMy4KCj4gPiBCYXNpY2FsbHkg dGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3aGVuIFdpbmRvd3MgNyBvciBMaW51eCAodGhlIF9SRVY9 PTUKPiA+IGNoZWNrKSB0aGVuIHdlIGRpcmVjdGx5IGRvIGxpbmsgZGlzYWJsZSB3aGVyZWFzIGlu IFdpbmRvd3MgOCsgd2UgaW52b2tlCj4gPiBMS0RTKCkgbWV0aG9kIHRoYXQgcHV0cyB0aGUgbGlu ayBpbnRvIEwyL0wzLiBOb25lIG9mIHRoZSBmaWVsZHMgdGhleQo+ID4gYWNjZXNzIHNlZW0gdG8g dG91Y2ggdGhlIEdQVSBpdHNlbGYuCj4gCj4gU28gdGhhdCBtYXkgYmUgd2hlcmUgdGhlIHByb2Js ZW0gaXMuCj4gCj4gUHV0dGluZyB0aGUgZG93bnN0cmVhbSBjb21wb25lbnQgaW50byBQQ0kgRFsx LTNdIGlzIGV4cGVjdGVkIHRvIHB1dAo+IHRoZSBsaW5rIGludG8gTDEsIHNvIEknbSBub3Qgc3Vy ZSBob3cgdGhhdCBwbGF5cyB3aXRoIHRoZSBsYXRlcgo+IGF0dGVtcHQgdG8gcHV0IGl0IGludG8g TDIvTDMgUmVhZHkuCgpUaGF0IHNob3VsZCBiZSBmaW5lLiBXaGF0IEkndmUgc2VlbiB0aGUgbGlu ayBnb2VzIGludG8gTDEgd2hlbgpkb3duc3RyZWFtIGNvbXBvbmVudCBpcyBwdXQgdG8gRC1zdGF0 ZSAobm90IEQwKSBhbmQgdGhlbiBpdCBpcyBwdXQgYmFjawp0byBMMCB3aGVuIEwyLzMgcmVhZHkg aXMgcHJvcGFnYXRlZC4gRXZlbnR1YWxseSBpdCBnb2VzIGludG8gTDIgb3IgTDMuCgo+IEFsc28s IEwyL0wzIFJlYWR5IGlzIGV4cGVjdGVkIHRvIGJlIHRyYW5zaWVudCwgc28gZmluYWxseSBwb3dl ciBzaG91bGQKPiBiZSByZW1vdmVkIHNvbWVob3cuCgpUaGVyZSBpcyBHUElPIGZvciBib3RoIHBv d2VyIGFuZCBQRVJTVCwgSSB0aGluayB0aGUgbGluZSBoZXJlOgoKICBcX1NCLlNHT1YgKDB4MDEw MTAwMDQsIFplcm8pCgppcyB0aGUgb25lIHRoYXQgcmVtb3ZlcyBwb3dlci4KCj4gPiBMS0RTKCkg Zm9yIHRoZSBmaXJzdCBQRUcgcG9ydCBsb29rcyBsaWtlIHRoaXM6Cj4gPgo+ID4gICAgUDBMMiA9 IE9uZQo+ID4gICAgU2xlZXAgKDB4MTApCj4gPiAgICBMb2NhbDAgPSBaZXJvCj4gPiAgICBXaGls ZSAoUDBMMikKPiA+ICAgIHsKPiA+ICAgICAgICAgSWYgKChMb2NhbDAgPiAweDA0KSkKPiA+ICAg ICAgICAgewo+ID4gICAgICAgICAgICAgQnJlYWsKPiA+ICAgICAgICAgfQo+ID4KPiA+ICAgICAg ICAgU2xlZXAgKDB4MTApCj4gPiAgICAgICAgIExvY2FsMCsrCj4gPiAgICB9Cj4gPgo+ID4gT25l IHRoaW5nIHRoYXQgY29tZXMgdG8gbWluZCBpcyB0aGF0IHRoZSBsb29wIGNhbiBlbmQgZXZlbiBp ZiBQMEwyIGlzCj4gPiBub3QgY2xlYXJlZCBhcyBpdCBkb2VzIG9ubHkgNSBpdGVyYXRpb25zIHdp dGggMTYgbXMgc2xlZXAgYmV0d2Vlbi4gTWF5YmUKPiA+IFNsZWVwKCkgaXMgaW1wbGVtZW50ZWQg ZGlmZmVyZW50bHkgaW4gV2luZG93cz8gSSBtZWFuIExpbnV4IG1heSBiZQo+ID4gImZhc3RlciIg aGVyZSBhbmQgcmV0dXJuIHByZW1hdHVyZWx5IGFuZCBpZiB3ZSBsZWF2ZSB0aGUgcG9ydCBpbnRv IEQwCj4gPiB0aGlzIGRvZXMgbm90IGhhcHBlbiwgb3Igc29tZXRoaW5nLiBJJ20ganVzdCB0aHJv d2luZyBvdXQgaWRlYXMgOikKPiAKPiBCdXQgdGhpcyBhY3R1YWxseSB3b3JrcyBmb3IgdGhlIGRv d25zdHJlYW0gY29tcG9uZW50IGluIEQwLCBkb2Vzbid0IGl0PwoKSXQgZG9lcyBhbmQgdGhhdCBs ZWF2ZXMgdGhlIGxpbmsgaW4gTDAgc28gaXQgY291bGQgYmUgdGhhdCB0aGVuIHRoZQphYm92ZSBB TUwgd29ya3MgYmV0dGVyIG9yIHNvbWV0aGluZy4KClRoYXQgcmVtaW5kcyBtZSwgQVNQTSBtYXkg aGF2ZSBzb21ldGhpbmcgdG8gZG8gd2l0aCB0aGlzIGFzIHdlbGwuCgo+IEFsc28sIGlmIHRoZSBk b3duc3RyZWFtIGNvbXBvbmVudCBpcyBpbiBEMCwgdGhlIHBvcnQgYWN0dWFsbHkgc2hvdWxkCj4g c3RheSBpbiBEMCB0b28sIHNvIHdoYXQgd291bGQgaGFwcGVuIHdpdGggdGhlICRzdWJqZWN0IHBh dGNoIGFwcGxpZWQ/CgpQYXJlbnQgcG9ydCBjYW5ub3QgYmUgbG93ZXIgRC1zdGF0ZSB0aGFuIHRo ZSBjaGlsZCBzbyBJIGFncmVlIGl0IHNob3VsZApzdGF5IGluIEQwIGFzIHdlbGwuIEhvd2V2ZXIs IGl0IHNlZW1zIHRoYXQgd2hhdCBoYXBwZW5zIGlzIHRoYXQgdGhlCmlzc3VlIGdvZXMgYXdheSA6 KQpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2 ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9s aXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=