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=-8.6 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_MUTT autolearn=ham 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 C6F02C04AAF for ; Tue, 21 May 2019 13:10:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 8926C2173C for ; Tue, 21 May 2019 13:10:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558444237; bh=j9rTOPX0NRTJDPljtmuFaGT+tcihNdCKvZvl2EcuxEs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=yT35P6egdXV5tMFyP44de9rpN9UpPJ68MDdlTDyvOEylEy3oV8hZYWiS+Yfr4q2Z1 Qb8qfUp1/KCb6XXdLK1q19KbAB7SjhXlTYYGzZLMS9/8cwqbSx4ur7+8bUIohtEpqC hkxABGP8TdDK7vyHq0cdsqjwabzvmkohOYgjUSb0= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728053AbfEUNKh (ORCPT ); Tue, 21 May 2019 09:10:37 -0400 Received: from mail.kernel.org ([198.145.29.99]:51230 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726995AbfEUNKg (ORCPT ); Tue, 21 May 2019 09:10:36 -0400 Received: from localhost (173-25-83-245.client.mchsi.com [173.25.83.245]) (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 0554020856; Tue, 21 May 2019 13:10:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558444235; bh=j9rTOPX0NRTJDPljtmuFaGT+tcihNdCKvZvl2EcuxEs=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=mu4ZLbDy/y3NFJsbNdnF+hzrkbs9vLx66CyPvarhEqoGUz7k+JGC1aeTa5c7UpkHY MV/e1OFNy8Zcq4HLLeamARn77bCHJFxcTDYcwkbX3NRapBFaxka1y1blkl5LvNiUXe Cstug+ovzrbp9Pkx+mNLHdq2EM0Wh//YQdNOF1dg= Date: Tue, 21 May 2019 08:10:34 -0500 From: Bjorn Helgaas To: Karol Herbst Cc: nouveau , Lyude Paul , linux-pci@vger.kernel.org Subject: Re: [PATCH v2 4/4] pci: save the boot pcie link speed and restore it on fini Message-ID: <20190521131033.GC57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org On Tue, May 21, 2019 at 12:30:38AM +0200, Karol Herbst wrote: > On Mon, May 20, 2019 at 11:20 PM Bjorn Helgaas wrote: > > On Tue, May 07, 2019 at 10:12:45PM +0200, Karol Herbst wrote: > > > Apperantly things go south if we suspend the device with a different PCIE > > > link speed set than it got booted with. Fixes runtime suspend on my gp107. > > > > > > This all looks like some bug inside the pci subsystem and I would prefer a > > > fix there instead of nouveau, but maybe there is no real nice way of doing > > > that outside of drivers? > > > > I agree it would be nice to fix this in the PCI core if that's > > feasible. > > > > It looks like this driver changes the PCIe link speed using some > > device-specific mechanism. When we suspend, we put the device in > > D3cold, so it loses all its state. When we resume, the link probably > > comes up at the boot speed because nothing did that device-specific > > magic to change it, so you probably end up with the link being slow > > but the driver thinking it's configured to be fast, and maybe that > > combination doesn't work. > > > > If it requires something device-specific to change that link speed, I > > don't know how to put that in the PCI core. But maybe I'm missing > > something? > > > > Per the PCIe spec (r4.0, sec 1.2): > > > > Initialization – During hardware initialization, each PCI Express > > Link is set up following a negotiation of Lane widths and frequency > > of operation by the two agents at each end of the Link. No firmware > > or operating system software is involved. > > > > I have been assuming that this means device-specific link speed > > management is out of spec, but it seems pretty common that devices > > don't come up by themselves at the fastest possible link speed. So > > maybe the spec just intends that devices can operate at *some* valid > > speed. > > I would expect that devices kind of have to figure out what they can > operate on and the operating system kind of just checks what the > current state is and doesn't try to "restore" the old state or > something? The devices at each end of the link negotiate the width and speed of the link. This is done directly by the hardware without any help from the OS. The OS can read the current link state (Current Link Speed and Negotiated Link Width, both in the Link Status register). The OS has very little control over that state. It can't directly restore the state because the hardware has to negotiate a width & speed that result in reliable operation. > We don't do anything in the driver after the device was suspended. And > the 0x88000 is a mirror of the PCI config space, but we also got some > PCIe stuff at 0x8c000 which is used by newer GPUs for gen3 stuff > essentially. I have no idea how much of this is part of the actual pci > standard and how much is driver specific. But the driver also wants to > have some control over the link speed as it's tight to performance > states on GPU. As far as I'm aware, there is no generic PCIe way for the OS to influence the link width or speed. If the GPU driver needs to do that, it would be via some device-specific mechanism. > The big issue here is just, that the GPU boots with 8.0, some on-gpu > init mechanism decreases it to 2.5. If we suspend, the GPU or at least > the communication with the controller is broken. But if we set it to > the boot speed, resuming the GPU just works. So my assumption was, > that _something_ (might it be the controller or the pci subsystem) > tries to force to operate on an invalid link speed and because the > bridge controller is actually powered down as well (as all children > are in D3cold) I could imagine that something in the pci subsystem > actually restores the state which lets the controller fail to > establish communication again? 1) At boot-time, the Port and the GPU hardware negotiate 8.0 GT/s without OS/driver intervention. 2) Some mechanism reduces link speed to 2.5 GT/s. This probably requires driver intervention or at least some ACPI method. 3) Suspend puts GPU into D3cold (powered off). 4) Resume restores GPU to D0, and the Port and GPU hardware again negotiate 8.0 GT/s without OS/driver intervention, just like at initial boot. 5) Now the driver thinks the GPU is at 2.5 GT/s but it's actually at 8.0 GT/s. Without knowing more about the transition to 2.5 GT/s, I can't guess why the GPU wouldn't work after resume. From a PCIe point of view, the link is supposed to work and the device should be reachable independent of the link speed. But maybe there's some weird dependency between the GPU and the driver here. It sounds like things work if you return to 8.0 GT/s before suspend, things work. That would make sense to me because then the driver's idea of the link state after resume would match the actual state. But I don't see a way to deal with this in the PCI core. The PCI core does save and restore most of the architected config space around suspend/resume, but since this appears to be a device-specific thing, the PCI core would have no idea how to save/restore it. > > > Signed-off-by: Karol Herbst > > > Reviewed-by: Lyude Paul > > > --- > > > drm/nouveau/include/nvkm/subdev/pci.h | 5 +++-- > > > drm/nouveau/nvkm/subdev/pci/base.c | 9 +++++++-- > > > drm/nouveau/nvkm/subdev/pci/pcie.c | 24 ++++++++++++++++++++---- > > > drm/nouveau/nvkm/subdev/pci/priv.h | 2 ++ > > > 4 files changed, 32 insertions(+), 8 deletions(-) > > > > > > diff --git a/drm/nouveau/include/nvkm/subdev/pci.h b/drm/nouveau/include/nvkm/subdev/pci.h > > > index 1fdf3098..b23793a2 100644 > > > --- a/drm/nouveau/include/nvkm/subdev/pci.h > > > +++ b/drm/nouveau/include/nvkm/subdev/pci.h > > > @@ -26,8 +26,9 @@ struct nvkm_pci { > > > } agp; > > > > > > struct { > > > - enum nvkm_pcie_speed speed; > > > - u8 width; > > > + enum nvkm_pcie_speed cur_speed; > > > + enum nvkm_pcie_speed def_speed; > > > + u8 cur_width; > > > } pcie; > > > > > > bool msi; > > > diff --git a/drm/nouveau/nvkm/subdev/pci/base.c b/drm/nouveau/nvkm/subdev/pci/base.c > > > index ee2431a7..d9fb5a83 100644 > > > --- a/drm/nouveau/nvkm/subdev/pci/base.c > > > +++ b/drm/nouveau/nvkm/subdev/pci/base.c > > > @@ -90,6 +90,8 @@ nvkm_pci_fini(struct nvkm_subdev *subdev, bool suspend) > > > > > > if (pci->agp.bridge) > > > nvkm_agp_fini(pci); > > > + else if (pci_is_pcie(pci->pdev)) > > > + nvkm_pcie_fini(pci); > > > > > > return 0; > > > } > > > @@ -100,6 +102,8 @@ nvkm_pci_preinit(struct nvkm_subdev *subdev) > > > struct nvkm_pci *pci = nvkm_pci(subdev); > > > if (pci->agp.bridge) > > > nvkm_agp_preinit(pci); > > > + else if (pci_is_pcie(pci->pdev)) > > > + nvkm_pcie_preinit(pci); > > > return 0; > > > } > > > > > > @@ -193,8 +197,9 @@ nvkm_pci_new_(const struct nvkm_pci_func *func, struct nvkm_device *device, > > > pci->func = func; > > > pci->pdev = device->func->pci(device)->pdev; > > > pci->irq = -1; > > > - pci->pcie.speed = -1; > > > - pci->pcie.width = -1; > > > + pci->pcie.cur_speed = -1; > > > + pci->pcie.def_speed = -1; > > > + pci->pcie.cur_width = -1; > > > > > > if (device->type == NVKM_DEVICE_AGP) > > > nvkm_agp_ctor(pci); > > > diff --git a/drm/nouveau/nvkm/subdev/pci/pcie.c b/drm/nouveau/nvkm/subdev/pci/pcie.c > > > index 70ccbe0d..731dd30e 100644 > > > --- a/drm/nouveau/nvkm/subdev/pci/pcie.c > > > +++ b/drm/nouveau/nvkm/subdev/pci/pcie.c > > > @@ -85,6 +85,13 @@ nvkm_pcie_oneinit(struct nvkm_pci *pci) > > > return 0; > > > } > > > > > > +int > > > +nvkm_pcie_preinit(struct nvkm_pci *pci) > > > +{ > > > + pci->pcie.def_speed = nvkm_pcie_get_speed(pci); > > > + return 0; > > > +} > > > + > > > int > > > nvkm_pcie_init(struct nvkm_pci *pci) > > > { > > > @@ -105,12 +112,21 @@ nvkm_pcie_init(struct nvkm_pci *pci) > > > if (pci->func->pcie.init) > > > pci->func->pcie.init(pci); > > > > > > - if (pci->pcie.speed != -1) > > > - nvkm_pcie_set_link(pci, pci->pcie.speed, pci->pcie.width); > > > + if (pci->pcie.cur_speed != -1) > > > + nvkm_pcie_set_link(pci, pci->pcie.cur_speed, > > > + pci->pcie.cur_width); > > > > > > return 0; > > > } > > > > > > +int > > > +nvkm_pcie_fini(struct nvkm_pci *pci) > > > +{ > > > + if (!IS_ERR_VALUE(pci->pcie.def_speed)) > > > + return nvkm_pcie_set_link(pci, pci->pcie.def_speed, 16); > > > + return 0; > > > +} > > > + > > > int > > > nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width) > > > { > > > @@ -146,8 +162,8 @@ nvkm_pcie_set_link(struct nvkm_pci *pci, enum nvkm_pcie_speed speed, u8 width) > > > speed = max_speed; > > > } > > > > > > - pci->pcie.speed = speed; > > > - pci->pcie.width = width; > > > + pci->pcie.cur_speed = speed; > > > + pci->pcie.cur_width = width; > > > > > > if (speed == cur_speed) { > > > nvkm_debug(subdev, "requested matches current speed\n"); > > > diff --git a/drm/nouveau/nvkm/subdev/pci/priv.h b/drm/nouveau/nvkm/subdev/pci/priv.h > > > index a0d4c007..e7744671 100644 > > > --- a/drm/nouveau/nvkm/subdev/pci/priv.h > > > +++ b/drm/nouveau/nvkm/subdev/pci/priv.h > > > @@ -60,5 +60,7 @@ enum nvkm_pcie_speed gk104_pcie_max_speed(struct nvkm_pci *); > > > int gk104_pcie_version_supported(struct nvkm_pci *); > > > > > > int nvkm_pcie_oneinit(struct nvkm_pci *); > > > +int nvkm_pcie_preinit(struct nvkm_pci *); > > > int nvkm_pcie_init(struct nvkm_pci *); > > > +int nvkm_pcie_fini(struct nvkm_pci *); > > > #endif > > > -- > > > 2.21.0 > > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bjorn Helgaas Subject: Re: [PATCH v2 4/4] pci: save the boot pcie link speed and restore it on fini Date: Tue, 21 May 2019 08:10:34 -0500 Message-ID: <20190521131033.GC57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.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: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Karol Herbst Cc: nouveau , linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: nouveau.vger.kernel.org T24gVHVlLCBNYXkgMjEsIDIwMTkgYXQgMTI6MzA6MzhBTSArMDIwMCwgS2Fyb2wgSGVyYnN0IHdy b3RlOgo+IE9uIE1vbiwgTWF5IDIwLCAyMDE5IGF0IDExOjIwIFBNIEJqb3JuIEhlbGdhYXMgPGhl bGdhYXNAa2VybmVsLm9yZz4gd3JvdGU6Cj4gPiBPbiBUdWUsIE1heSAwNywgMjAxOSBhdCAxMDox Mjo0NVBNICswMjAwLCBLYXJvbCBIZXJic3Qgd3JvdGU6Cj4gPiA+IEFwcGVyYW50bHkgdGhpbmdz IGdvIHNvdXRoIGlmIHdlIHN1c3BlbmQgdGhlIGRldmljZSB3aXRoIGEgZGlmZmVyZW50IFBDSUUK PiA+ID4gbGluayBzcGVlZCBzZXQgdGhhbiBpdCBnb3QgYm9vdGVkIHdpdGguIEZpeGVzIHJ1bnRp bWUgc3VzcGVuZCBvbiBteSBncDEwNy4KPiA+ID4KPiA+ID4gVGhpcyBhbGwgbG9va3MgbGlrZSBz b21lIGJ1ZyBpbnNpZGUgdGhlIHBjaSBzdWJzeXN0ZW0gYW5kIEkgd291bGQgcHJlZmVyIGEKPiA+ ID4gZml4IHRoZXJlIGluc3RlYWQgb2Ygbm91dmVhdSwgYnV0IG1heWJlIHRoZXJlIGlzIG5vIHJl YWwgbmljZSB3YXkgb2YgZG9pbmcKPiA+ID4gdGhhdCBvdXRzaWRlIG9mIGRyaXZlcnM/Cj4gPgo+ ID4gSSBhZ3JlZSBpdCB3b3VsZCBiZSBuaWNlIHRvIGZpeCB0aGlzIGluIHRoZSBQQ0kgY29yZSBp ZiB0aGF0J3MKPiA+IGZlYXNpYmxlLgo+ID4KPiA+IEl0IGxvb2tzIGxpa2UgdGhpcyBkcml2ZXIg Y2hhbmdlcyB0aGUgUENJZSBsaW5rIHNwZWVkIHVzaW5nIHNvbWUKPiA+IGRldmljZS1zcGVjaWZp YyBtZWNoYW5pc20uICBXaGVuIHdlIHN1c3BlbmQsIHdlIHB1dCB0aGUgZGV2aWNlIGluCj4gPiBE M2NvbGQsIHNvIGl0IGxvc2VzIGFsbCBpdHMgc3RhdGUuICBXaGVuIHdlIHJlc3VtZSwgdGhlIGxp bmsgcHJvYmFibHkKPiA+IGNvbWVzIHVwIGF0IHRoZSBib290IHNwZWVkIGJlY2F1c2Ugbm90aGlu ZyBkaWQgdGhhdCBkZXZpY2Utc3BlY2lmaWMKPiA+IG1hZ2ljIHRvIGNoYW5nZSBpdCwgc28geW91 IHByb2JhYmx5IGVuZCB1cCB3aXRoIHRoZSBsaW5rIGJlaW5nIHNsb3cKPiA+IGJ1dCB0aGUgZHJp dmVyIHRoaW5raW5nIGl0J3MgY29uZmlndXJlZCB0byBiZSBmYXN0LCBhbmQgbWF5YmUgdGhhdAo+ ID4gY29tYmluYXRpb24gZG9lc24ndCB3b3JrLgo+ID4KPiA+IElmIGl0IHJlcXVpcmVzIHNvbWV0 aGluZyBkZXZpY2Utc3BlY2lmaWMgdG8gY2hhbmdlIHRoYXQgbGluayBzcGVlZCwgSQo+ID4gZG9u J3Qga25vdyBob3cgdG8gcHV0IHRoYXQgaW4gdGhlIFBDSSBjb3JlLiAgQnV0IG1heWJlIEknbSBt aXNzaW5nCj4gPiBzb21ldGhpbmc/Cj4gPgo+ID4gUGVyIHRoZSBQQ0llIHNwZWMgKHI0LjAsIHNl YyAxLjIpOgo+ID4KPiA+ICAgSW5pdGlhbGl6YXRpb24g4oCTIER1cmluZyBoYXJkd2FyZSBpbml0 aWFsaXphdGlvbiwgZWFjaCBQQ0kgRXhwcmVzcwo+ID4gICBMaW5rIGlzIHNldCB1cCBmb2xsb3dp bmcgYSBuZWdvdGlhdGlvbiBvZiBMYW5lIHdpZHRocyBhbmQgZnJlcXVlbmN5Cj4gPiAgIG9mIG9w ZXJhdGlvbiBieSB0aGUgdHdvIGFnZW50cyBhdCBlYWNoIGVuZCBvZiB0aGUgTGluay4gTm8gZmly bXdhcmUKPiA+ICAgb3Igb3BlcmF0aW5nIHN5c3RlbSBzb2Z0d2FyZSBpcyBpbnZvbHZlZC4KPiA+ Cj4gPiBJIGhhdmUgYmVlbiBhc3N1bWluZyB0aGF0IHRoaXMgbWVhbnMgZGV2aWNlLXNwZWNpZmlj IGxpbmsgc3BlZWQKPiA+IG1hbmFnZW1lbnQgaXMgb3V0IG9mIHNwZWMsIGJ1dCBpdCBzZWVtcyBw cmV0dHkgY29tbW9uIHRoYXQgZGV2aWNlcwo+ID4gZG9uJ3QgY29tZSB1cCBieSB0aGVtc2VsdmVz IGF0IHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGxpbmsgc3BlZWQuICBTbwo+ID4gbWF5YmUgdGhlIHNw ZWMganVzdCBpbnRlbmRzIHRoYXQgZGV2aWNlcyBjYW4gb3BlcmF0ZSBhdCAqc29tZSogdmFsaWQK PiA+IHNwZWVkLgo+IAo+IEkgd291bGQgZXhwZWN0IHRoYXQgZGV2aWNlcyBraW5kIG9mIGhhdmUg dG8gZmlndXJlIG91dCB3aGF0IHRoZXkgY2FuCj4gb3BlcmF0ZSBvbiBhbmQgdGhlIG9wZXJhdGlu ZyBzeXN0ZW0ga2luZCBvZiBqdXN0IGNoZWNrcyB3aGF0IHRoZQo+IGN1cnJlbnQgc3RhdGUgaXMg YW5kIGRvZXNuJ3QgdHJ5IHRvICJyZXN0b3JlIiB0aGUgb2xkIHN0YXRlIG9yCj4gc29tZXRoaW5n PwoKVGhlIGRldmljZXMgYXQgZWFjaCBlbmQgb2YgdGhlIGxpbmsgbmVnb3RpYXRlIHRoZSB3aWR0 aCBhbmQgc3BlZWQgb2YKdGhlIGxpbmsuICBUaGlzIGlzIGRvbmUgZGlyZWN0bHkgYnkgdGhlIGhh cmR3YXJlIHdpdGhvdXQgYW55IGhlbHAgZnJvbQp0aGUgT1MuCgpUaGUgT1MgY2FuIHJlYWQgdGhl IGN1cnJlbnQgbGluayBzdGF0ZSAoQ3VycmVudCBMaW5rIFNwZWVkIGFuZApOZWdvdGlhdGVkIExp bmsgV2lkdGgsIGJvdGggaW4gdGhlIExpbmsgU3RhdHVzIHJlZ2lzdGVyKS4gIFRoZSBPUyBoYXMK dmVyeSBsaXR0bGUgY29udHJvbCBvdmVyIHRoYXQgc3RhdGUuICBJdCBjYW4ndCBkaXJlY3RseSBy ZXN0b3JlIHRoZQpzdGF0ZSBiZWNhdXNlIHRoZSBoYXJkd2FyZSBoYXMgdG8gbmVnb3RpYXRlIGEg d2lkdGggJiBzcGVlZCB0aGF0CnJlc3VsdCBpbiByZWxpYWJsZSBvcGVyYXRpb24uCgo+IFdlIGRv bid0IGRvIGFueXRoaW5nIGluIHRoZSBkcml2ZXIgYWZ0ZXIgdGhlIGRldmljZSB3YXMgc3VzcGVu ZGVkLiBBbmQKPiB0aGUgMHg4ODAwMCBpcyBhIG1pcnJvciBvZiB0aGUgUENJIGNvbmZpZyBzcGFj ZSwgYnV0IHdlIGFsc28gZ290IHNvbWUKPiBQQ0llIHN0dWZmIGF0IDB4OGMwMDAgd2hpY2ggaXMg dXNlZCBieSBuZXdlciBHUFVzIGZvciBnZW4zIHN0dWZmCj4gZXNzZW50aWFsbHkuIEkgaGF2ZSBu byBpZGVhIGhvdyBtdWNoIG9mIHRoaXMgaXMgcGFydCBvZiB0aGUgYWN0dWFsIHBjaQo+IHN0YW5k YXJkIGFuZCBob3cgbXVjaCBpcyBkcml2ZXIgc3BlY2lmaWMuIEJ1dCB0aGUgZHJpdmVyIGFsc28g d2FudHMgdG8KPiBoYXZlIHNvbWUgY29udHJvbCBvdmVyIHRoZSBsaW5rIHNwZWVkIGFzIGl0J3Mg dGlnaHQgdG8gcGVyZm9ybWFuY2UKPiBzdGF0ZXMgb24gR1BVLgoKQXMgZmFyIGFzIEknbSBhd2Fy ZSwgdGhlcmUgaXMgbm8gZ2VuZXJpYyBQQ0llIHdheSBmb3IgdGhlIE9TIHRvCmluZmx1ZW5jZSB0 aGUgbGluayB3aWR0aCBvciBzcGVlZC4gIElmIHRoZSBHUFUgZHJpdmVyIG5lZWRzIHRvIGRvCnRo YXQsIGl0IHdvdWxkIGJlIHZpYSBzb21lIGRldmljZS1zcGVjaWZpYyBtZWNoYW5pc20uCgo+IFRo ZSBiaWcgaXNzdWUgaGVyZSBpcyBqdXN0LCB0aGF0IHRoZSBHUFUgYm9vdHMgd2l0aCA4LjAsIHNv bWUgb24tZ3B1Cj4gaW5pdCBtZWNoYW5pc20gZGVjcmVhc2VzIGl0IHRvIDIuNS4gSWYgd2Ugc3Vz cGVuZCwgdGhlIEdQVSBvciBhdCBsZWFzdAo+IHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGNv bnRyb2xsZXIgaXMgYnJva2VuLiBCdXQgaWYgd2Ugc2V0IGl0IHRvCj4gdGhlIGJvb3Qgc3BlZWQs IHJlc3VtaW5nIHRoZSBHUFUganVzdCB3b3Jrcy4gU28gbXkgYXNzdW1wdGlvbiB3YXMsCj4gdGhh dCBfc29tZXRoaW5nXyAobWlnaHQgaXQgYmUgdGhlIGNvbnRyb2xsZXIgb3IgdGhlIHBjaSBzdWJz eXN0ZW0pCj4gdHJpZXMgdG8gZm9yY2UgdG8gb3BlcmF0ZSBvbiBhbiBpbnZhbGlkIGxpbmsgc3Bl ZWQgYW5kIGJlY2F1c2UgdGhlCj4gYnJpZGdlIGNvbnRyb2xsZXIgaXMgYWN0dWFsbHkgcG93ZXJl ZCBkb3duIGFzIHdlbGwgKGFzIGFsbCBjaGlsZHJlbgo+IGFyZSBpbiBEM2NvbGQpIEkgY291bGQg aW1hZ2luZSB0aGF0IHNvbWV0aGluZyBpbiB0aGUgcGNpIHN1YnN5c3RlbQo+IGFjdHVhbGx5IHJl c3RvcmVzIHRoZSBzdGF0ZSB3aGljaCBsZXRzIHRoZSBjb250cm9sbGVyIGZhaWwgdG8KPiBlc3Rh Ymxpc2ggY29tbXVuaWNhdGlvbiBhZ2Fpbj8KCiAgMSkgQXQgYm9vdC10aW1lLCB0aGUgUG9ydCBh bmQgdGhlIEdQVSBoYXJkd2FyZSBuZWdvdGlhdGUgOC4wIEdUL3MKICAgICB3aXRob3V0IE9TL2Ry aXZlciBpbnRlcnZlbnRpb24uCgogIDIpIFNvbWUgbWVjaGFuaXNtIHJlZHVjZXMgbGluayBzcGVl ZCB0byAyLjUgR1Qvcy4gIFRoaXMgcHJvYmFibHkKICAgICByZXF1aXJlcyBkcml2ZXIgaW50ZXJ2 ZW50aW9uIG9yIGF0IGxlYXN0IHNvbWUgQUNQSSBtZXRob2QuCgogIDMpIFN1c3BlbmQgcHV0cyBH UFUgaW50byBEM2NvbGQgKHBvd2VyZWQgb2ZmKS4KCiAgNCkgUmVzdW1lIHJlc3RvcmVzIEdQVSB0 byBEMCwgYW5kIHRoZSBQb3J0IGFuZCBHUFUgaGFyZHdhcmUgYWdhaW4KICAgICBuZWdvdGlhdGUg OC4wIEdUL3Mgd2l0aG91dCBPUy9kcml2ZXIgaW50ZXJ2ZW50aW9uLCBqdXN0IGxpa2UgYXQKICAg ICBpbml0aWFsIGJvb3QuCgogIDUpIE5vdyB0aGUgZHJpdmVyIHRoaW5rcyB0aGUgR1BVIGlzIGF0 IDIuNSBHVC9zIGJ1dCBpdCdzIGFjdHVhbGx5IGF0CiAgICAgOC4wIEdUL3MuCgpXaXRob3V0IGtu b3dpbmcgbW9yZSBhYm91dCB0aGUgdHJhbnNpdGlvbiB0byAyLjUgR1QvcywgSSBjYW4ndCBndWVz cwp3aHkgdGhlIEdQVSB3b3VsZG4ndCB3b3JrIGFmdGVyIHJlc3VtZS4gIEZyb20gYSBQQ0llIHBv aW50IG9mIHZpZXcsCnRoZSBsaW5rIGlzIHN1cHBvc2VkIHRvIHdvcmsgYW5kIHRoZSBkZXZpY2Ug c2hvdWxkIGJlIHJlYWNoYWJsZQppbmRlcGVuZGVudCBvZiB0aGUgbGluayBzcGVlZC4gIEJ1dCBt YXliZSB0aGVyZSdzIHNvbWUgd2VpcmQKZGVwZW5kZW5jeSBiZXR3ZWVuIHRoZSBHUFUgYW5kIHRo ZSBkcml2ZXIgaGVyZS4KCkl0IHNvdW5kcyBsaWtlIHRoaW5ncyB3b3JrIGlmIHlvdSByZXR1cm4g dG8gOC4wIEdUL3MgYmVmb3JlIHN1c3BlbmQsCnRoaW5ncyB3b3JrLiAgVGhhdCB3b3VsZCBtYWtl IHNlbnNlIHRvIG1lIGJlY2F1c2UgdGhlbiB0aGUgZHJpdmVyJ3MKaWRlYSBvZiB0aGUgbGluayBz dGF0ZSBhZnRlciByZXN1bWUgd291bGQgbWF0Y2ggdGhlIGFjdHVhbCBzdGF0ZS4KCkJ1dCBJIGRv bid0IHNlZSBhIHdheSB0byBkZWFsIHdpdGggdGhpcyBpbiB0aGUgUENJIGNvcmUuICBUaGUgUENJ IGNvcmUKZG9lcyBzYXZlIGFuZCByZXN0b3JlIG1vc3Qgb2YgdGhlIGFyY2hpdGVjdGVkIGNvbmZp ZyBzcGFjZSBhcm91bmQKc3VzcGVuZC9yZXN1bWUsIGJ1dCBzaW5jZSB0aGlzIGFwcGVhcnMgdG8g YmUgYSBkZXZpY2Utc3BlY2lmaWMgdGhpbmcsCnRoZSBQQ0kgY29yZSB3b3VsZCBoYXZlIG5vIGlk ZWEgaG93IHRvIHNhdmUvcmVzdG9yZSBpdC4KCj4gPiA+IFNpZ25lZC1vZmYtYnk6IEthcm9sIEhl cmJzdCA8a2hlcmJzdEByZWRoYXQuY29tPgo+ID4gPiBSZXZpZXdlZC1ieTogTHl1ZGUgUGF1bCA8 bHl1ZGVAcmVkaGF0LmNvbT4KPiA+ID4gLS0tCj4gPiA+ICBkcm0vbm91dmVhdS9pbmNsdWRlL252 a20vc3ViZGV2L3BjaS5oIHwgIDUgKysrLS0KPiA+ID4gIGRybS9ub3V2ZWF1L252a20vc3ViZGV2 L3BjaS9iYXNlLmMgICAgfCAgOSArKysrKysrLS0KPiA+ID4gIGRybS9ub3V2ZWF1L252a20vc3Vi ZGV2L3BjaS9wY2llLmMgICAgfCAyNCArKysrKysrKysrKysrKysrKysrKy0tLS0KPiA+ID4gIGRy bS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9wcml2LmggICAgfCAgMiArKwo+ID4gPiAgNCBmaWxl cyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQo+ID4gPgo+ID4gPiBk aWZmIC0tZ2l0IGEvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaCBiL2RybS9u b3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYvcGNpLmgKPiA+ID4gaW5kZXggMWZkZjMwOTguLmIy Mzc5M2EyIDEwMDY0NAo+ID4gPiAtLS0gYS9kcm0vbm91dmVhdS9pbmNsdWRlL252a20vc3ViZGV2 L3BjaS5oCj4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYvcGNpLmgK PiA+ID4gQEAgLTI2LDggKzI2LDkgQEAgc3RydWN0IG52a21fcGNpIHsKPiA+ID4gICAgICAgfSBh Z3A7Cj4gPiA+Cj4gPiA+ICAgICAgIHN0cnVjdCB7Cj4gPiA+IC0gICAgICAgICAgICAgZW51bSBu dmttX3BjaWVfc3BlZWQgc3BlZWQ7Cj4gPiA+IC0gICAgICAgICAgICAgdTggd2lkdGg7Cj4gPiA+ ICsgICAgICAgICAgICAgZW51bSBudmttX3BjaWVfc3BlZWQgY3VyX3NwZWVkOwo+ID4gPiArICAg ICAgICAgICAgIGVudW0gbnZrbV9wY2llX3NwZWVkIGRlZl9zcGVlZDsKPiA+ID4gKyAgICAgICAg ICAgICB1OCBjdXJfd2lkdGg7Cj4gPiA+ICAgICAgIH0gcGNpZTsKPiA+ID4KPiA+ID4gICAgICAg Ym9vbCBtc2k7Cj4gPiA+IGRpZmYgLS1naXQgYS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kv YmFzZS5jIGIvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYwo+ID4gPiBpbmRleCBl ZTI0MzFhNy4uZDlmYjVhODMgMTAwNjQ0Cj4gPiA+IC0tLSBhL2RybS9ub3V2ZWF1L252a20vc3Vi ZGV2L3BjaS9iYXNlLmMKPiA+ID4gKysrIGIvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jh c2UuYwo+ID4gPiBAQCAtOTAsNiArOTAsOCBAQCBudmttX3BjaV9maW5pKHN0cnVjdCBudmttX3N1 YmRldiAqc3ViZGV2LCBib29sIHN1c3BlbmQpCj4gPiA+Cj4gPiA+ICAgICAgIGlmIChwY2ktPmFn cC5icmlkZ2UpCj4gPiA+ICAgICAgICAgICAgICAgbnZrbV9hZ3BfZmluaShwY2kpOwo+ID4gPiAr ICAgICBlbHNlIGlmIChwY2lfaXNfcGNpZShwY2ktPnBkZXYpKQo+ID4gPiArICAgICAgICAgICAg IG52a21fcGNpZV9maW5pKHBjaSk7Cj4gPiA+Cj4gPiA+ICAgICAgIHJldHVybiAwOwo+ID4gPiAg fQo+ID4gPiBAQCAtMTAwLDYgKzEwMiw4IEBAIG52a21fcGNpX3ByZWluaXQoc3RydWN0IG52a21f c3ViZGV2ICpzdWJkZXYpCj4gPiA+ICAgICAgIHN0cnVjdCBudmttX3BjaSAqcGNpID0gbnZrbV9w Y2koc3ViZGV2KTsKPiA+ID4gICAgICAgaWYgKHBjaS0+YWdwLmJyaWRnZSkKPiA+ID4gICAgICAg ICAgICAgICBudmttX2FncF9wcmVpbml0KHBjaSk7Cj4gPiA+ICsgICAgIGVsc2UgaWYgKHBjaV9p c19wY2llKHBjaS0+cGRldikpCj4gPiA+ICsgICAgICAgICAgICAgbnZrbV9wY2llX3ByZWluaXQo cGNpKTsKPiA+ID4gICAgICAgcmV0dXJuIDA7Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+IEBAIC0xOTMs OCArMTk3LDkgQEAgbnZrbV9wY2lfbmV3Xyhjb25zdCBzdHJ1Y3QgbnZrbV9wY2lfZnVuYyAqZnVu Yywgc3RydWN0IG52a21fZGV2aWNlICpkZXZpY2UsCj4gPiA+ICAgICAgIHBjaS0+ZnVuYyA9IGZ1 bmM7Cj4gPiA+ICAgICAgIHBjaS0+cGRldiA9IGRldmljZS0+ZnVuYy0+cGNpKGRldmljZSktPnBk ZXY7Cj4gPiA+ICAgICAgIHBjaS0+aXJxID0gLTE7Cj4gPiA+IC0gICAgIHBjaS0+cGNpZS5zcGVl ZCA9IC0xOwo+ID4gPiAtICAgICBwY2ktPnBjaWUud2lkdGggPSAtMTsKPiA+ID4gKyAgICAgcGNp LT5wY2llLmN1cl9zcGVlZCA9IC0xOwo+ID4gPiArICAgICBwY2ktPnBjaWUuZGVmX3NwZWVkID0g LTE7Cj4gPiA+ICsgICAgIHBjaS0+cGNpZS5jdXJfd2lkdGggPSAtMTsKPiA+ID4KPiA+ID4gICAg ICAgaWYgKGRldmljZS0+dHlwZSA9PSBOVktNX0RFVklDRV9BR1ApCj4gPiA+ICAgICAgICAgICAg ICAgbnZrbV9hZ3BfY3RvcihwY2kpOwo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJtL25vdXZlYXUvbnZr bS9zdWJkZXYvcGNpL3BjaWUuYyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9wY2llLmMK PiA+ID4gaW5kZXggNzBjY2JlMGQuLjczMWRkMzBlIDEwMDY0NAo+ID4gPiAtLS0gYS9kcm0vbm91 dmVhdS9udmttL3N1YmRldi9wY2kvcGNpZS5jCj4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L252a20v c3ViZGV2L3BjaS9wY2llLmMKPiA+ID4gQEAgLTg1LDYgKzg1LDEzIEBAIG52a21fcGNpZV9vbmVp bml0KHN0cnVjdCBudmttX3BjaSAqcGNpKQo+ID4gPiAgICAgICByZXR1cm4gMDsKPiA+ID4gIH0K PiA+ID4KPiA+ID4gK2ludAo+ID4gPiArbnZrbV9wY2llX3ByZWluaXQoc3RydWN0IG52a21fcGNp ICpwY2kpCj4gPiA+ICt7Cj4gPiA+ICsgICAgIHBjaS0+cGNpZS5kZWZfc3BlZWQgPSBudmttX3Bj aWVfZ2V0X3NwZWVkKHBjaSk7Cj4gPiA+ICsgICAgIHJldHVybiAwOwo+ID4gPiArfQo+ID4gPiAr Cj4gPiA+ICBpbnQKPiA+ID4gIG52a21fcGNpZV9pbml0KHN0cnVjdCBudmttX3BjaSAqcGNpKQo+ ID4gPiAgewo+ID4gPiBAQCAtMTA1LDEyICsxMTIsMjEgQEAgbnZrbV9wY2llX2luaXQoc3RydWN0 IG52a21fcGNpICpwY2kpCj4gPiA+ICAgICAgIGlmIChwY2ktPmZ1bmMtPnBjaWUuaW5pdCkKPiA+ ID4gICAgICAgICAgICAgICBwY2ktPmZ1bmMtPnBjaWUuaW5pdChwY2kpOwo+ID4gPgo+ID4gPiAt ICAgICBpZiAocGNpLT5wY2llLnNwZWVkICE9IC0xKQo+ID4gPiAtICAgICAgICAgICAgIG52a21f cGNpZV9zZXRfbGluayhwY2ksIHBjaS0+cGNpZS5zcGVlZCwgcGNpLT5wY2llLndpZHRoKTsKPiA+ ID4gKyAgICAgaWYgKHBjaS0+cGNpZS5jdXJfc3BlZWQgIT0gLTEpCj4gPiA+ICsgICAgICAgICAg ICAgbnZrbV9wY2llX3NldF9saW5rKHBjaSwgcGNpLT5wY2llLmN1cl9zcGVlZCwKPiA+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpLT5wY2llLmN1cl93aWR0aCk7Cj4gPiA+ Cj4gPiA+ICAgICAgIHJldHVybiAwOwo+ID4gPiAgfQo+ID4gPgo+ID4gPiAraW50Cj4gPiA+ICtu dmttX3BjaWVfZmluaShzdHJ1Y3QgbnZrbV9wY2kgKnBjaSkKPiA+ID4gK3sKPiA+ID4gKyAgICAg aWYgKCFJU19FUlJfVkFMVUUocGNpLT5wY2llLmRlZl9zcGVlZCkpCj4gPiA+ICsgICAgICAgICAg ICAgcmV0dXJuIG52a21fcGNpZV9zZXRfbGluayhwY2ksIHBjaS0+cGNpZS5kZWZfc3BlZWQsIDE2 KTsKPiA+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gIGludAo+ID4g PiAgbnZrbV9wY2llX3NldF9saW5rKHN0cnVjdCBudmttX3BjaSAqcGNpLCBlbnVtIG52a21fcGNp ZV9zcGVlZCBzcGVlZCwgdTggd2lkdGgpCj4gPiA+ICB7Cj4gPiA+IEBAIC0xNDYsOCArMTYyLDgg QEAgbnZrbV9wY2llX3NldF9saW5rKHN0cnVjdCBudmttX3BjaSAqcGNpLCBlbnVtIG52a21fcGNp ZV9zcGVlZCBzcGVlZCwgdTggd2lkdGgpCj4gPiA+ICAgICAgICAgICAgICAgc3BlZWQgPSBtYXhf c3BlZWQ7Cj4gPiA+ICAgICAgIH0KPiA+ID4KPiA+ID4gLSAgICAgcGNpLT5wY2llLnNwZWVkID0g c3BlZWQ7Cj4gPiA+IC0gICAgIHBjaS0+cGNpZS53aWR0aCA9IHdpZHRoOwo+ID4gPiArICAgICBw Y2ktPnBjaWUuY3VyX3NwZWVkID0gc3BlZWQ7Cj4gPiA+ICsgICAgIHBjaS0+cGNpZS5jdXJfd2lk dGggPSB3aWR0aDsKPiA+ID4KPiA+ID4gICAgICAgaWYgKHNwZWVkID09IGN1cl9zcGVlZCkgewo+ ID4gPiAgICAgICAgICAgICAgIG52a21fZGVidWcoc3ViZGV2LCAicmVxdWVzdGVkIG1hdGNoZXMg Y3VycmVudCBzcGVlZFxuIik7Cj4gPiA+IGRpZmYgLS1naXQgYS9kcm0vbm91dmVhdS9udmttL3N1 YmRldi9wY2kvcHJpdi5oIGIvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3ByaXYuaAo+ID4g PiBpbmRleCBhMGQ0YzAwNy4uZTc3NDQ2NzEgMTAwNjQ0Cj4gPiA+IC0tLSBhL2RybS9ub3V2ZWF1 L252a20vc3ViZGV2L3BjaS9wcml2LmgKPiA+ID4gKysrIGIvZHJtL25vdXZlYXUvbnZrbS9zdWJk ZXYvcGNpL3ByaXYuaAo+ID4gPiBAQCAtNjAsNSArNjAsNyBAQCBlbnVtIG52a21fcGNpZV9zcGVl ZCBnazEwNF9wY2llX21heF9zcGVlZChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gPiA+ICBpbnQgZ2sx MDRfcGNpZV92ZXJzaW9uX3N1cHBvcnRlZChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gPiA+Cj4gPiA+ ICBpbnQgbnZrbV9wY2llX29uZWluaXQoc3RydWN0IG52a21fcGNpICopOwo+ID4gPiAraW50IG52 a21fcGNpZV9wcmVpbml0KHN0cnVjdCBudmttX3BjaSAqKTsKPiA+ID4gIGludCBudmttX3BjaWVf aW5pdChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gPiA+ICtpbnQgbnZrbV9wY2llX2Zpbmkoc3RydWN0 IG52a21fcGNpICopOwo+ID4gPiAgI2VuZGlmCj4gPiA+IC0tCj4gPiA+IDIuMjEuMAo+ID4gPgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2ZWF1IG1h aWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZy ZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXU=