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 889E6C04AAF for ; Tue, 21 May 2019 14:13:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 46F2321773 for ; Tue, 21 May 2019 14:13:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558448000; bh=SyVKsGwREzZZGkOPILB3RUrWeHrmj1KfgVEx9b0kiN0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=tYuPGFb7YeTvw5hvWCKgHcCNrwL09rer3nhFwfpkcRzm9VSHmU+kX6EXfWrXbvE0t L7qxFeJRNHS+YzBwiZa/+96L/oLtWDMYfvqb8Fg4a56rV3ICe+bGuP5MdmZkcDL9Jd ZmqxaZCJKv3mBm8aHqDjgWLr3mI43PV7ARVocCsc= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727941AbfEUONT (ORCPT ); Tue, 21 May 2019 10:13:19 -0400 Received: from mail.kernel.org ([198.145.29.99]:41200 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726900AbfEUONT (ORCPT ); Tue, 21 May 2019 10:13:19 -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 5A6A72173C; Tue, 21 May 2019 14:13:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558447998; bh=SyVKsGwREzZZGkOPILB3RUrWeHrmj1KfgVEx9b0kiN0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=xdVy/D/T0/iuK8zp3WZ6KcGKrbd+Wzesa4KmGyMcBcX556vESxMFF85rc55aJv2IZ UPRzbbHirtWeOONxWzYTTLphWc0E1IQuZoXEtH40hp5dmx/WQ2NV9sKClm7x5WnDEN 8BCxVvsSP39+S/vjhHWdSYkbn73FszC/X4+5n3PA= Date: Tue, 21 May 2019 09:13:17 -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: <20190521141317.GD57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.com> <20190521131033.GC57618@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 03:28:48PM +0200, Karol Herbst wrote: > On Tue, May 21, 2019 at 3:11 PM Bjorn Helgaas wrote: > > 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. > > there is no driver intervention and Nouveau doesn't care at all. It's > all done on the GPU. We just upload a script and some firmware on to > the GPU. The script runs then on the PMU inside the GPU and this > script also causes changing the PCIe link settings. But from a Nouveau > point of view we don't care about the link before or after that script > was invoked. Also there is no ACPI method involved. > > But if there is something we should notify pci core about, maybe > that's something we have to do then? I don't think there's anything the PCI core could do with that information anyway. The PCI core doesn't care at all about the link speed, and it really can't influence it directly. > > 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. > > No, that negotiation fails apparently as any attempt to read anything > from the device just fails inside pci core. Or something goes wrong > when resuming the bridge controller. I'm surprised the negotiation would fail even after a power cycle of the device. But if you can avoid the issue by running another script on the PMU before suspend, that's probably what you'll have to do. > > 5) Now the driver thinks the GPU is at 2.5 GT/s but it's actually at > > 8.0 GT/s. > > what is actually meant by "driver" here? The pci subsystem or Nouveau? I was thinking Nouveau because the PCI core doesn't care about the link speed. > > 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. > > but the device isn't reachable at all, not even from the pci > subsystem. All reads fail/return a default error value (0xffffffff). Are these PCI config reads that return 0xffffffff? Or MMIO reads? "lspci -vvxxxx" of the bridge and the GPU might have a clue about whether a PCI error occurred. > > 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. > > depends on what is meant by the driver here. Inside Nouveau we don't > care one bit about the current link speed, so I assume you mean > something inside the pci core code? > > > 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. > > if we assume that the negotiation on a device level works as intended, > then I would expect this to be a pci core issue, which might actually > be not fixable there. But if it's not, then we would have to put > something like that inside the runpm documentation to tell drivers > they have to do something about it. > > But again, for me it just sounds like the negotiation on the device > level fails or something inside pci core messes it up. To me it sounds like the PMU script messed something up, and the PCI core has no way to know what that was or how to fix 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 09:13:17 -0500 Message-ID: <20190521141317.GD57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> <20190520211933.GA57618@google.com> <20190521131033.GC57618@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 T24gVHVlLCBNYXkgMjEsIDIwMTkgYXQgMDM6Mjg6NDhQTSArMDIwMCwgS2Fyb2wgSGVyYnN0IHdy b3RlOgo+IE9uIFR1ZSwgTWF5IDIxLCAyMDE5IGF0IDM6MTEgUE0gQmpvcm4gSGVsZ2FhcyA8aGVs Z2Fhc0BrZXJuZWwub3JnPiB3cm90ZToKPiA+IE9uIFR1ZSwgTWF5IDIxLCAyMDE5IGF0IDEyOjMw OjM4QU0gKzAyMDAsIEthcm9sIEhlcmJzdCB3cm90ZToKPiA+ID4gT24gTW9uLCBNYXkgMjAsIDIw MTkgYXQgMTE6MjAgUE0gQmpvcm4gSGVsZ2FhcyA8aGVsZ2Fhc0BrZXJuZWwub3JnPiB3cm90ZToK PiA+ID4gPiBPbiBUdWUsIE1heSAwNywgMjAxOSBhdCAxMDoxMjo0NVBNICswMjAwLCBLYXJvbCBI ZXJic3Qgd3JvdGU6Cj4gPiA+ID4gPiBBcHBlcmFudGx5IHRoaW5ncyBnbyBzb3V0aCBpZiB3ZSBz dXNwZW5kIHRoZSBkZXZpY2Ugd2l0aCBhIGRpZmZlcmVudCBQQ0lFCj4gPiA+ID4gPiBsaW5rIHNw ZWVkIHNldCB0aGFuIGl0IGdvdCBib290ZWQgd2l0aC4gRml4ZXMgcnVudGltZSBzdXNwZW5kIG9u IG15IGdwMTA3Lgo+ID4gPiA+ID4KPiA+ID4gPiA+IFRoaXMgYWxsIGxvb2tzIGxpa2Ugc29tZSBi dWcgaW5zaWRlIHRoZSBwY2kgc3Vic3lzdGVtIGFuZCBJIHdvdWxkIHByZWZlciBhCj4gPiA+ID4g PiBmaXggdGhlcmUgaW5zdGVhZCBvZiBub3V2ZWF1LCBidXQgbWF5YmUgdGhlcmUgaXMgbm8gcmVh bCBuaWNlIHdheSBvZiBkb2luZwo+ID4gPiA+ID4gdGhhdCBvdXRzaWRlIG9mIGRyaXZlcnM/Cj4g PiA+ID4KPiA+ID4gPiBJIGFncmVlIGl0IHdvdWxkIGJlIG5pY2UgdG8gZml4IHRoaXMgaW4gdGhl IFBDSSBjb3JlIGlmIHRoYXQncwo+ID4gPiA+IGZlYXNpYmxlLgo+ID4gPiA+Cj4gPiA+ID4gSXQg bG9va3MgbGlrZSB0aGlzIGRyaXZlciBjaGFuZ2VzIHRoZSBQQ0llIGxpbmsgc3BlZWQgdXNpbmcg c29tZQo+ID4gPiA+IGRldmljZS1zcGVjaWZpYyBtZWNoYW5pc20uICBXaGVuIHdlIHN1c3BlbmQs IHdlIHB1dCB0aGUgZGV2aWNlIGluCj4gPiA+ID4gRDNjb2xkLCBzbyBpdCBsb3NlcyBhbGwgaXRz IHN0YXRlLiAgV2hlbiB3ZSByZXN1bWUsIHRoZSBsaW5rIHByb2JhYmx5Cj4gPiA+ID4gY29tZXMg dXAgYXQgdGhlIGJvb3Qgc3BlZWQgYmVjYXVzZSBub3RoaW5nIGRpZCB0aGF0IGRldmljZS1zcGVj aWZpYwo+ID4gPiA+IG1hZ2ljIHRvIGNoYW5nZSBpdCwgc28geW91IHByb2JhYmx5IGVuZCB1cCB3 aXRoIHRoZSBsaW5rIGJlaW5nIHNsb3cKPiA+ID4gPiBidXQgdGhlIGRyaXZlciB0aGlua2luZyBp dCdzIGNvbmZpZ3VyZWQgdG8gYmUgZmFzdCwgYW5kIG1heWJlIHRoYXQKPiA+ID4gPiBjb21iaW5h dGlvbiBkb2Vzbid0IHdvcmsuCj4gPiA+ID4KPiA+ID4gPiBJZiBpdCByZXF1aXJlcyBzb21ldGhp bmcgZGV2aWNlLXNwZWNpZmljIHRvIGNoYW5nZSB0aGF0IGxpbmsgc3BlZWQsIEkKPiA+ID4gPiBk b24ndCBrbm93IGhvdyB0byBwdXQgdGhhdCBpbiB0aGUgUENJIGNvcmUuICBCdXQgbWF5YmUgSSdt IG1pc3NpbmcKPiA+ID4gPiBzb21ldGhpbmc/Cj4gPiA+ID4KPiA+ID4gPiBQZXIgdGhlIFBDSWUg c3BlYyAocjQuMCwgc2VjIDEuMik6Cj4gPiA+ID4KPiA+ID4gPiAgIEluaXRpYWxpemF0aW9uIOKA kyBEdXJpbmcgaGFyZHdhcmUgaW5pdGlhbGl6YXRpb24sIGVhY2ggUENJIEV4cHJlc3MKPiA+ID4g PiAgIExpbmsgaXMgc2V0IHVwIGZvbGxvd2luZyBhIG5lZ290aWF0aW9uIG9mIExhbmUgd2lkdGhz IGFuZCBmcmVxdWVuY3kKPiA+ID4gPiAgIG9mIG9wZXJhdGlvbiBieSB0aGUgdHdvIGFnZW50cyBh dCBlYWNoIGVuZCBvZiB0aGUgTGluay4gTm8gZmlybXdhcmUKPiA+ID4gPiAgIG9yIG9wZXJhdGlu ZyBzeXN0ZW0gc29mdHdhcmUgaXMgaW52b2x2ZWQuCj4gPiA+ID4KPiA+ID4gPiBJIGhhdmUgYmVl biBhc3N1bWluZyB0aGF0IHRoaXMgbWVhbnMgZGV2aWNlLXNwZWNpZmljIGxpbmsgc3BlZWQKPiA+ ID4gPiBtYW5hZ2VtZW50IGlzIG91dCBvZiBzcGVjLCBidXQgaXQgc2VlbXMgcHJldHR5IGNvbW1v biB0aGF0IGRldmljZXMKPiA+ID4gPiBkb24ndCBjb21lIHVwIGJ5IHRoZW1zZWx2ZXMgYXQgdGhl IGZhc3Rlc3QgcG9zc2libGUgbGluayBzcGVlZC4gIFNvCj4gPiA+ID4gbWF5YmUgdGhlIHNwZWMg anVzdCBpbnRlbmRzIHRoYXQgZGV2aWNlcyBjYW4gb3BlcmF0ZSBhdCAqc29tZSogdmFsaWQKPiA+ ID4gPiBzcGVlZC4KPiA+ID4KPiA+ID4gSSB3b3VsZCBleHBlY3QgdGhhdCBkZXZpY2VzIGtpbmQg b2YgaGF2ZSB0byBmaWd1cmUgb3V0IHdoYXQgdGhleSBjYW4KPiA+ID4gb3BlcmF0ZSBvbiBhbmQg dGhlIG9wZXJhdGluZyBzeXN0ZW0ga2luZCBvZiBqdXN0IGNoZWNrcyB3aGF0IHRoZQo+ID4gPiBj dXJyZW50IHN0YXRlIGlzIGFuZCBkb2Vzbid0IHRyeSB0byAicmVzdG9yZSIgdGhlIG9sZCBzdGF0 ZSBvcgo+ID4gPiBzb21ldGhpbmc/Cj4gPgo+ID4gVGhlIGRldmljZXMgYXQgZWFjaCBlbmQgb2Yg dGhlIGxpbmsgbmVnb3RpYXRlIHRoZSB3aWR0aCBhbmQgc3BlZWQgb2YKPiA+IHRoZSBsaW5rLiAg VGhpcyBpcyBkb25lIGRpcmVjdGx5IGJ5IHRoZSBoYXJkd2FyZSB3aXRob3V0IGFueSBoZWxwIGZy b20KPiA+IHRoZSBPUy4KPiA+Cj4gPiBUaGUgT1MgY2FuIHJlYWQgdGhlIGN1cnJlbnQgbGluayBz dGF0ZSAoQ3VycmVudCBMaW5rIFNwZWVkIGFuZAo+ID4gTmVnb3RpYXRlZCBMaW5rIFdpZHRoLCBi b3RoIGluIHRoZSBMaW5rIFN0YXR1cyByZWdpc3RlcikuICBUaGUgT1MgaGFzCj4gPiB2ZXJ5IGxp dHRsZSBjb250cm9sIG92ZXIgdGhhdCBzdGF0ZS4gIEl0IGNhbid0IGRpcmVjdGx5IHJlc3RvcmUg dGhlCj4gPiBzdGF0ZSBiZWNhdXNlIHRoZSBoYXJkd2FyZSBoYXMgdG8gbmVnb3RpYXRlIGEgd2lk dGggJiBzcGVlZCB0aGF0Cj4gPiByZXN1bHQgaW4gcmVsaWFibGUgb3BlcmF0aW9uLgo+ID4KPiA+ ID4gV2UgZG9uJ3QgZG8gYW55dGhpbmcgaW4gdGhlIGRyaXZlciBhZnRlciB0aGUgZGV2aWNlIHdh cyBzdXNwZW5kZWQuIEFuZAo+ID4gPiB0aGUgMHg4ODAwMCBpcyBhIG1pcnJvciBvZiB0aGUgUENJ IGNvbmZpZyBzcGFjZSwgYnV0IHdlIGFsc28gZ290IHNvbWUKPiA+ID4gUENJZSBzdHVmZiBhdCAw eDhjMDAwIHdoaWNoIGlzIHVzZWQgYnkgbmV3ZXIgR1BVcyBmb3IgZ2VuMyBzdHVmZgo+ID4gPiBl c3NlbnRpYWxseS4gSSBoYXZlIG5vIGlkZWEgaG93IG11Y2ggb2YgdGhpcyBpcyBwYXJ0IG9mIHRo ZSBhY3R1YWwgcGNpCj4gPiA+IHN0YW5kYXJkIGFuZCBob3cgbXVjaCBpcyBkcml2ZXIgc3BlY2lm aWMuIEJ1dCB0aGUgZHJpdmVyIGFsc28gd2FudHMgdG8KPiA+ID4gaGF2ZSBzb21lIGNvbnRyb2wg b3ZlciB0aGUgbGluayBzcGVlZCBhcyBpdCdzIHRpZ2h0IHRvIHBlcmZvcm1hbmNlCj4gPiA+IHN0 YXRlcyBvbiBHUFUuCj4gPgo+ID4gQXMgZmFyIGFzIEknbSBhd2FyZSwgdGhlcmUgaXMgbm8gZ2Vu ZXJpYyBQQ0llIHdheSBmb3IgdGhlIE9TIHRvCj4gPiBpbmZsdWVuY2UgdGhlIGxpbmsgd2lkdGgg b3Igc3BlZWQuICBJZiB0aGUgR1BVIGRyaXZlciBuZWVkcyB0byBkbwo+ID4gdGhhdCwgaXQgd291 bGQgYmUgdmlhIHNvbWUgZGV2aWNlLXNwZWNpZmljIG1lY2hhbmlzbS4KPiA+Cj4gPiA+IFRoZSBi aWcgaXNzdWUgaGVyZSBpcyBqdXN0LCB0aGF0IHRoZSBHUFUgYm9vdHMgd2l0aCA4LjAsIHNvbWUg b24tZ3B1Cj4gPiA+IGluaXQgbWVjaGFuaXNtIGRlY3JlYXNlcyBpdCB0byAyLjUuIElmIHdlIHN1 c3BlbmQsIHRoZSBHUFUgb3IgYXQgbGVhc3QKPiA+ID4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0 aGUgY29udHJvbGxlciBpcyBicm9rZW4uIEJ1dCBpZiB3ZSBzZXQgaXQgdG8KPiA+ID4gdGhlIGJv b3Qgc3BlZWQsIHJlc3VtaW5nIHRoZSBHUFUganVzdCB3b3Jrcy4gU28gbXkgYXNzdW1wdGlvbiB3 YXMsCj4gPiA+IHRoYXQgX3NvbWV0aGluZ18gKG1pZ2h0IGl0IGJlIHRoZSBjb250cm9sbGVyIG9y IHRoZSBwY2kgc3Vic3lzdGVtKQo+ID4gPiB0cmllcyB0byBmb3JjZSB0byBvcGVyYXRlIG9uIGFu IGludmFsaWQgbGluayBzcGVlZCBhbmQgYmVjYXVzZSB0aGUKPiA+ID4gYnJpZGdlIGNvbnRyb2xs ZXIgaXMgYWN0dWFsbHkgcG93ZXJlZCBkb3duIGFzIHdlbGwgKGFzIGFsbCBjaGlsZHJlbgo+ID4g PiBhcmUgaW4gRDNjb2xkKSBJIGNvdWxkIGltYWdpbmUgdGhhdCBzb21ldGhpbmcgaW4gdGhlIHBj aSBzdWJzeXN0ZW0KPiA+ID4gYWN0dWFsbHkgcmVzdG9yZXMgdGhlIHN0YXRlIHdoaWNoIGxldHMg dGhlIGNvbnRyb2xsZXIgZmFpbCB0bwo+ID4gPiBlc3RhYmxpc2ggY29tbXVuaWNhdGlvbiBhZ2Fp bj8KPiA+Cj4gPiAgIDEpIEF0IGJvb3QtdGltZSwgdGhlIFBvcnQgYW5kIHRoZSBHUFUgaGFyZHdh cmUgbmVnb3RpYXRlIDguMCBHVC9zCj4gPiAgICAgIHdpdGhvdXQgT1MvZHJpdmVyIGludGVydmVu dGlvbi4KPiA+Cj4gPiAgIDIpIFNvbWUgbWVjaGFuaXNtIHJlZHVjZXMgbGluayBzcGVlZCB0byAy LjUgR1Qvcy4gIFRoaXMgcHJvYmFibHkKPiA+ICAgICAgcmVxdWlyZXMgZHJpdmVyIGludGVydmVu dGlvbiBvciBhdCBsZWFzdCBzb21lIEFDUEkgbWV0aG9kLgo+IAo+IHRoZXJlIGlzIG5vIGRyaXZl ciBpbnRlcnZlbnRpb24gYW5kIE5vdXZlYXUgZG9lc24ndCBjYXJlIGF0IGFsbC4gSXQncwo+IGFs bCBkb25lIG9uIHRoZSBHUFUuIFdlIGp1c3QgdXBsb2FkIGEgc2NyaXB0IGFuZCBzb21lIGZpcm13 YXJlIG9uIHRvCj4gdGhlIEdQVS4gVGhlIHNjcmlwdCBydW5zIHRoZW4gb24gdGhlIFBNVSBpbnNp ZGUgdGhlIEdQVSBhbmQgdGhpcwo+IHNjcmlwdCBhbHNvIGNhdXNlcyBjaGFuZ2luZyB0aGUgUENJ ZSBsaW5rIHNldHRpbmdzLiBCdXQgZnJvbSBhIE5vdXZlYXUKPiBwb2ludCBvZiB2aWV3IHdlIGRv bid0IGNhcmUgYWJvdXQgdGhlIGxpbmsgYmVmb3JlIG9yIGFmdGVyIHRoYXQgc2NyaXB0Cj4gd2Fz IGludm9rZWQuIEFsc28gdGhlcmUgaXMgbm8gQUNQSSBtZXRob2QgaW52b2x2ZWQuCj4gCj4gQnV0 IGlmIHRoZXJlIGlzIHNvbWV0aGluZyB3ZSBzaG91bGQgbm90aWZ5IHBjaSBjb3JlIGFib3V0LCBt YXliZQo+IHRoYXQncyBzb21ldGhpbmcgd2UgaGF2ZSB0byBkbyB0aGVuPwoKSSBkb24ndCB0aGlu ayB0aGVyZSdzIGFueXRoaW5nIHRoZSBQQ0kgY29yZSBjb3VsZCBkbyB3aXRoIHRoYXQKaW5mb3Jt YXRpb24gYW55d2F5LiAgVGhlIFBDSSBjb3JlIGRvZXNuJ3QgY2FyZSBhdCBhbGwgYWJvdXQgdGhl IGxpbmsKc3BlZWQsIGFuZCBpdCByZWFsbHkgY2FuJ3QgaW5mbHVlbmNlIGl0IGRpcmVjdGx5LgoK PiA+ICAgMykgU3VzcGVuZCBwdXRzIEdQVSBpbnRvIEQzY29sZCAocG93ZXJlZCBvZmYpLgo+ID4K PiA+ICAgNCkgUmVzdW1lIHJlc3RvcmVzIEdQVSB0byBEMCwgYW5kIHRoZSBQb3J0IGFuZCBHUFUg aGFyZHdhcmUgYWdhaW4KPiA+ICAgICAgbmVnb3RpYXRlIDguMCBHVC9zIHdpdGhvdXQgT1MvZHJp dmVyIGludGVydmVudGlvbiwganVzdCBsaWtlIGF0Cj4gPiAgICAgIGluaXRpYWwgYm9vdC4KPiAK PiBObywgdGhhdCBuZWdvdGlhdGlvbiBmYWlscyBhcHBhcmVudGx5IGFzIGFueSBhdHRlbXB0IHRv IHJlYWQgYW55dGhpbmcKPiBmcm9tIHRoZSBkZXZpY2UganVzdCBmYWlscyBpbnNpZGUgcGNpIGNv cmUuIE9yIHNvbWV0aGluZyBnb2VzIHdyb25nCj4gd2hlbiByZXN1bWluZyB0aGUgYnJpZGdlIGNv bnRyb2xsZXIuCgpJJ20gc3VycHJpc2VkIHRoZSBuZWdvdGlhdGlvbiB3b3VsZCBmYWlsIGV2ZW4g YWZ0ZXIgYSBwb3dlciBjeWNsZSBvZgp0aGUgZGV2aWNlLiAgQnV0IGlmIHlvdSBjYW4gYXZvaWQg dGhlIGlzc3VlIGJ5IHJ1bm5pbmcgYW5vdGhlciBzY3JpcHQKb24gdGhlIFBNVSBiZWZvcmUgc3Vz cGVuZCwgdGhhdCdzIHByb2JhYmx5IHdoYXQgeW91J2xsIGhhdmUgdG8gZG8uCgo+ID4gICA1KSBO b3cgdGhlIGRyaXZlciB0aGlua3MgdGhlIEdQVSBpcyBhdCAyLjUgR1QvcyBidXQgaXQncyBhY3R1 YWxseSBhdAo+ID4gICAgICA4LjAgR1Qvcy4KPiAKPiB3aGF0IGlzIGFjdHVhbGx5IG1lYW50IGJ5 ICJkcml2ZXIiIGhlcmU/IFRoZSBwY2kgc3Vic3lzdGVtIG9yIE5vdXZlYXU/CgpJIHdhcyB0aGlu a2luZyBOb3V2ZWF1IGJlY2F1c2UgdGhlIFBDSSBjb3JlIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUK bGluayBzcGVlZC4KCj4gPiBXaXRob3V0IGtub3dpbmcgbW9yZSBhYm91dCB0aGUgdHJhbnNpdGlv biB0byAyLjUgR1QvcywgSSBjYW4ndCBndWVzcwo+ID4gd2h5IHRoZSBHUFUgd291bGRuJ3Qgd29y ayBhZnRlciByZXN1bWUuICBGcm9tIGEgUENJZSBwb2ludCBvZiB2aWV3LAo+ID4gdGhlIGxpbmsg aXMgc3VwcG9zZWQgdG8gd29yayBhbmQgdGhlIGRldmljZSBzaG91bGQgYmUgcmVhY2hhYmxlCj4g PiBpbmRlcGVuZGVudCBvZiB0aGUgbGluayBzcGVlZC4gIEJ1dCBtYXliZSB0aGVyZSdzIHNvbWUg d2VpcmQKPiA+IGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgR1BVIGFuZCB0aGUgZHJpdmVyIGhlcmUu Cj4gCj4gYnV0IHRoZSBkZXZpY2UgaXNuJ3QgcmVhY2hhYmxlIGF0IGFsbCwgbm90IGV2ZW4gZnJv bSB0aGUgcGNpCj4gc3Vic3lzdGVtLiBBbGwgcmVhZHMgZmFpbC9yZXR1cm4gYSBkZWZhdWx0IGVy cm9yIHZhbHVlICgweGZmZmZmZmZmKS4KCkFyZSB0aGVzZSBQQ0kgY29uZmlnIHJlYWRzIHRoYXQg cmV0dXJuIDB4ZmZmZmZmZmY/ICBPciBNTUlPIHJlYWRzPwoibHNwY2kgLXZ2eHh4eCIgb2YgdGhl IGJyaWRnZSBhbmQgdGhlIEdQVSBtaWdodCBoYXZlIGEgY2x1ZSBhYm91dAp3aGV0aGVyIGEgUENJ IGVycm9yIG9jY3VycmVkLgoKPiA+IEl0IHNvdW5kcyBsaWtlIHRoaW5ncyB3b3JrIGlmIHlvdSBy ZXR1cm4gdG8gOC4wIEdUL3MgYmVmb3JlIHN1c3BlbmQsCj4gPiB0aGluZ3Mgd29yay4gIFRoYXQg d291bGQgbWFrZSBzZW5zZSB0byBtZSBiZWNhdXNlIHRoZW4gdGhlIGRyaXZlcidzCj4gPiBpZGVh IG9mIHRoZSBsaW5rIHN0YXRlIGFmdGVyIHJlc3VtZSB3b3VsZCBtYXRjaCB0aGUgYWN0dWFsIHN0 YXRlLgo+IAo+IGRlcGVuZHMgb24gd2hhdCBpcyBtZWFudCBieSB0aGUgZHJpdmVyIGhlcmUuIElu c2lkZSBOb3V2ZWF1IHdlIGRvbid0Cj4gY2FyZSBvbmUgYml0IGFib3V0IHRoZSBjdXJyZW50IGxp bmsgc3BlZWQsIHNvIEkgYXNzdW1lIHlvdSBtZWFuCj4gc29tZXRoaW5nIGluc2lkZSB0aGUgcGNp IGNvcmUgY29kZT8KPiAKPiA+IEJ1dCBJIGRvbid0IHNlZSBhIHdheSB0byBkZWFsIHdpdGggdGhp cyBpbiB0aGUgUENJIGNvcmUuICBUaGUgUENJIGNvcmUKPiA+IGRvZXMgc2F2ZSBhbmQgcmVzdG9y ZSBtb3N0IG9mIHRoZSBhcmNoaXRlY3RlZCBjb25maWcgc3BhY2UgYXJvdW5kCj4gPiBzdXNwZW5k L3Jlc3VtZSwgYnV0IHNpbmNlIHRoaXMgYXBwZWFycyB0byBiZSBhIGRldmljZS1zcGVjaWZpYyB0 aGluZywKPiA+IHRoZSBQQ0kgY29yZSB3b3VsZCBoYXZlIG5vIGlkZWEgaG93IHRvIHNhdmUvcmVz dG9yZSBpdC4KPiAKPiBpZiB3ZSBhc3N1bWUgdGhhdCB0aGUgbmVnb3RpYXRpb24gb24gYSBkZXZp Y2UgbGV2ZWwgd29ya3MgYXMgaW50ZW5kZWQsCj4gdGhlbiBJIHdvdWxkIGV4cGVjdCB0aGlzIHRv IGJlIGEgcGNpIGNvcmUgaXNzdWUsIHdoaWNoIG1pZ2h0IGFjdHVhbGx5Cj4gYmUgbm90IGZpeGFi bGUgdGhlcmUuIEJ1dCBpZiBpdCdzIG5vdCwgdGhlbiB3ZSB3b3VsZCBoYXZlIHRvIHB1dAo+IHNv bWV0aGluZyBsaWtlIHRoYXQgaW5zaWRlIHRoZSBydW5wbSBkb2N1bWVudGF0aW9uIHRvIHRlbGwg ZHJpdmVycwo+IHRoZXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgYWJvdXQgaXQuCj4gCj4gQnV0IGFn YWluLCBmb3IgbWUgaXQganVzdCBzb3VuZHMgbGlrZSB0aGUgbmVnb3RpYXRpb24gb24gdGhlIGRl dmljZQo+IGxldmVsIGZhaWxzIG9yIHNvbWV0aGluZyBpbnNpZGUgcGNpIGNvcmUgbWVzc2VzIGl0 IHVwLgoKVG8gbWUgaXQgc291bmRzIGxpa2UgdGhlIFBNVSBzY3JpcHQgbWVzc2VkIHNvbWV0aGlu ZyB1cCwgYW5kIHRoZSBQQ0kKY29yZSBoYXMgbm8gd2F5IHRvIGtub3cgd2hhdCB0aGF0IHdhcyBv ciBob3cgdG8gZml4IGl0LgoKPiA+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IEthcm9sIEhlcmJzdCA8 a2hlcmJzdEByZWRoYXQuY29tPgo+ID4gPiA+ID4gUmV2aWV3ZWQtYnk6IEx5dWRlIFBhdWwgPGx5 dWRlQHJlZGhhdC5jb20+Cj4gPiA+ID4gPiAtLS0KPiA+ID4gPiA+ICBkcm0vbm91dmVhdS9pbmNs dWRlL252a20vc3ViZGV2L3BjaS5oIHwgIDUgKysrLS0KPiA+ID4gPiA+ICBkcm0vbm91dmVhdS9u dmttL3N1YmRldi9wY2kvYmFzZS5jICAgIHwgIDkgKysrKysrKy0tCj4gPiA+ID4gPiAgZHJtL25v dXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYyAgICB8IDI0ICsrKysrKysrKysrKysrKysrKysr LS0tLQo+ID4gPiA+ID4gIGRybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9wcml2LmggICAgfCAg MiArKwo+ID4gPiA+ID4gIDQgZmlsZXMgY2hhbmdlZCwgMzIgaW5zZXJ0aW9ucygrKSwgOCBkZWxl dGlvbnMoLSkKPiA+ID4gPiA+Cj4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJtL25vdXZlYXUvaW5j bHVkZS9udmttL3N1YmRldi9wY2kuaCBiL2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYv cGNpLmgKPiA+ID4gPiA+IGluZGV4IDFmZGYzMDk4Li5iMjM3OTNhMiAxMDA2NDQKPiA+ID4gPiA+ IC0tLSBhL2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYvcGNpLmgKPiA+ID4gPiA+ICsr KyBiL2RybS9ub3V2ZWF1L2luY2x1ZGUvbnZrbS9zdWJkZXYvcGNpLmgKPiA+ID4gPiA+IEBAIC0y Niw4ICsyNiw5IEBAIHN0cnVjdCBudmttX3BjaSB7Cj4gPiA+ID4gPiAgICAgICB9IGFncDsKPiA+ ID4gPiA+Cj4gPiA+ID4gPiAgICAgICBzdHJ1Y3Qgewo+ID4gPiA+ID4gLSAgICAgICAgICAgICBl bnVtIG52a21fcGNpZV9zcGVlZCBzcGVlZDsKPiA+ID4gPiA+IC0gICAgICAgICAgICAgdTggd2lk dGg7Cj4gPiA+ID4gPiArICAgICAgICAgICAgIGVudW0gbnZrbV9wY2llX3NwZWVkIGN1cl9zcGVl ZDsKPiA+ID4gPiA+ICsgICAgICAgICAgICAgZW51bSBudmttX3BjaWVfc3BlZWQgZGVmX3NwZWVk Owo+ID4gPiA+ID4gKyAgICAgICAgICAgICB1OCBjdXJfd2lkdGg7Cj4gPiA+ID4gPiAgICAgICB9 IHBjaWU7Cj4gPiA+ID4gPgo+ID4gPiA+ID4gICAgICAgYm9vbCBtc2k7Cj4gPiA+ID4gPiBkaWZm IC0tZ2l0IGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYyBiL2RybS9ub3V2ZWF1 L252a20vc3ViZGV2L3BjaS9iYXNlLmMKPiA+ID4gPiA+IGluZGV4IGVlMjQzMWE3Li5kOWZiNWE4 MyAxMDA2NDQKPiA+ID4gPiA+IC0tLSBhL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNl LmMKPiA+ID4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNlLmMKPiA+ ID4gPiA+IEBAIC05MCw2ICs5MCw4IEBAIG52a21fcGNpX2Zpbmkoc3RydWN0IG52a21fc3ViZGV2 ICpzdWJkZXYsIGJvb2wgc3VzcGVuZCkKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgICAgICBpZiAocGNp LT5hZ3AuYnJpZGdlKQo+ID4gPiA+ID4gICAgICAgICAgICAgICBudmttX2FncF9maW5pKHBjaSk7 Cj4gPiA+ID4gPiArICAgICBlbHNlIGlmIChwY2lfaXNfcGNpZShwY2ktPnBkZXYpKQo+ID4gPiA+ ID4gKyAgICAgICAgICAgICBudmttX3BjaWVfZmluaShwY2kpOwo+ID4gPiA+ID4KPiA+ID4gPiA+ ICAgICAgIHJldHVybiAwOwo+ID4gPiA+ID4gIH0KPiA+ID4gPiA+IEBAIC0xMDAsNiArMTAyLDgg QEAgbnZrbV9wY2lfcHJlaW5pdChzdHJ1Y3QgbnZrbV9zdWJkZXYgKnN1YmRldikKPiA+ID4gPiA+ ICAgICAgIHN0cnVjdCBudmttX3BjaSAqcGNpID0gbnZrbV9wY2koc3ViZGV2KTsKPiA+ID4gPiA+ ICAgICAgIGlmIChwY2ktPmFncC5icmlkZ2UpCj4gPiA+ID4gPiAgICAgICAgICAgICAgIG52a21f YWdwX3ByZWluaXQocGNpKTsKPiA+ID4gPiA+ICsgICAgIGVsc2UgaWYgKHBjaV9pc19wY2llKHBj aS0+cGRldikpCj4gPiA+ID4gPiArICAgICAgICAgICAgIG52a21fcGNpZV9wcmVpbml0KHBjaSk7 Cj4gPiA+ID4gPiAgICAgICByZXR1cm4gMDsKPiA+ID4gPiA+ICB9Cj4gPiA+ID4gPgo+ID4gPiA+ ID4gQEAgLTE5Myw4ICsxOTcsOSBAQCBudmttX3BjaV9uZXdfKGNvbnN0IHN0cnVjdCBudmttX3Bj aV9mdW5jICpmdW5jLCBzdHJ1Y3QgbnZrbV9kZXZpY2UgKmRldmljZSwKPiA+ID4gPiA+ICAgICAg IHBjaS0+ZnVuYyA9IGZ1bmM7Cj4gPiA+ID4gPiAgICAgICBwY2ktPnBkZXYgPSBkZXZpY2UtPmZ1 bmMtPnBjaShkZXZpY2UpLT5wZGV2Owo+ID4gPiA+ID4gICAgICAgcGNpLT5pcnEgPSAtMTsKPiA+ ID4gPiA+IC0gICAgIHBjaS0+cGNpZS5zcGVlZCA9IC0xOwo+ID4gPiA+ID4gLSAgICAgcGNpLT5w Y2llLndpZHRoID0gLTE7Cj4gPiA+ID4gPiArICAgICBwY2ktPnBjaWUuY3VyX3NwZWVkID0gLTE7 Cj4gPiA+ID4gPiArICAgICBwY2ktPnBjaWUuZGVmX3NwZWVkID0gLTE7Cj4gPiA+ID4gPiArICAg ICBwY2ktPnBjaWUuY3VyX3dpZHRoID0gLTE7Cj4gPiA+ID4gPgo+ID4gPiA+ID4gICAgICAgaWYg KGRldmljZS0+dHlwZSA9PSBOVktNX0RFVklDRV9BR1ApCj4gPiA+ID4gPiAgICAgICAgICAgICAg IG52a21fYWdwX2N0b3IocGNpKTsKPiA+ID4gPiA+IGRpZmYgLS1naXQgYS9kcm0vbm91dmVhdS9u dmttL3N1YmRldi9wY2kvcGNpZS5jIGIvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUu Ywo+ID4gPiA+ID4gaW5kZXggNzBjY2JlMGQuLjczMWRkMzBlIDEwMDY0NAo+ID4gPiA+ID4gLS0t IGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYwo+ID4gPiA+ID4gKysrIGIvZHJt L25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYwo+ID4gPiA+ID4gQEAgLTg1LDYgKzg1LDEz IEBAIG52a21fcGNpZV9vbmVpbml0KHN0cnVjdCBudmttX3BjaSAqcGNpKQo+ID4gPiA+ID4gICAg ICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiAgfQo+ID4gPiA+ID4KPiA+ID4gPiA+ICtpbnQKPiA+ID4g PiA+ICtudmttX3BjaWVfcHJlaW5pdChzdHJ1Y3QgbnZrbV9wY2kgKnBjaSkKPiA+ID4gPiA+ICt7 Cj4gPiA+ID4gPiArICAgICBwY2ktPnBjaWUuZGVmX3NwZWVkID0gbnZrbV9wY2llX2dldF9zcGVl ZChwY2kpOwo+ID4gPiA+ID4gKyAgICAgcmV0dXJuIDA7Cj4gPiA+ID4gPiArfQo+ID4gPiA+ID4g Kwo+ID4gPiA+ID4gIGludAo+ID4gPiA+ID4gIG52a21fcGNpZV9pbml0KHN0cnVjdCBudmttX3Bj aSAqcGNpKQo+ID4gPiA+ID4gIHsKPiA+ID4gPiA+IEBAIC0xMDUsMTIgKzExMiwyMSBAQCBudmtt X3BjaWVfaW5pdChzdHJ1Y3QgbnZrbV9wY2kgKnBjaSkKPiA+ID4gPiA+ICAgICAgIGlmIChwY2kt PmZ1bmMtPnBjaWUuaW5pdCkKPiA+ID4gPiA+ICAgICAgICAgICAgICAgcGNpLT5mdW5jLT5wY2ll LmluaXQocGNpKTsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAtICAgICBpZiAocGNpLT5wY2llLnNwZWVk ICE9IC0xKQo+ID4gPiA+ID4gLSAgICAgICAgICAgICBudmttX3BjaWVfc2V0X2xpbmsocGNpLCBw Y2ktPnBjaWUuc3BlZWQsIHBjaS0+cGNpZS53aWR0aCk7Cj4gPiA+ID4gPiArICAgICBpZiAocGNp LT5wY2llLmN1cl9zcGVlZCAhPSAtMSkKPiA+ID4gPiA+ICsgICAgICAgICAgICAgbnZrbV9wY2ll X3NldF9saW5rKHBjaSwgcGNpLT5wY2llLmN1cl9zcGVlZCwKPiA+ID4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBjaS0+cGNpZS5jdXJfd2lkdGgpOwo+ID4gPiA+ID4KPiA+ ID4gPiA+ICAgICAgIHJldHVybiAwOwo+ID4gPiA+ID4gIH0KPiA+ID4gPiA+Cj4gPiA+ID4gPiAr aW50Cj4gPiA+ID4gPiArbnZrbV9wY2llX2Zpbmkoc3RydWN0IG52a21fcGNpICpwY2kpCj4gPiA+ ID4gPiArewo+ID4gPiA+ID4gKyAgICAgaWYgKCFJU19FUlJfVkFMVUUocGNpLT5wY2llLmRlZl9z cGVlZCkpCj4gPiA+ID4gPiArICAgICAgICAgICAgIHJldHVybiBudmttX3BjaWVfc2V0X2xpbmso cGNpLCBwY2ktPnBjaWUuZGVmX3NwZWVkLCAxNik7Cj4gPiA+ID4gPiArICAgICByZXR1cm4gMDsK PiA+ID4gPiA+ICt9Cj4gPiA+ID4gPiArCj4gPiA+ID4gPiAgaW50Cj4gPiA+ID4gPiAgbnZrbV9w Y2llX3NldF9saW5rKHN0cnVjdCBudmttX3BjaSAqcGNpLCBlbnVtIG52a21fcGNpZV9zcGVlZCBz cGVlZCwgdTggd2lkdGgpCj4gPiA+ID4gPiAgewo+ID4gPiA+ID4gQEAgLTE0Niw4ICsxNjIsOCBA QCBudmttX3BjaWVfc2V0X2xpbmsoc3RydWN0IG52a21fcGNpICpwY2ksIGVudW0gbnZrbV9wY2ll X3NwZWVkIHNwZWVkLCB1OCB3aWR0aCkKPiA+ID4gPiA+ICAgICAgICAgICAgICAgc3BlZWQgPSBt YXhfc3BlZWQ7Cj4gPiA+ID4gPiAgICAgICB9Cj4gPiA+ID4gPgo+ID4gPiA+ID4gLSAgICAgcGNp LT5wY2llLnNwZWVkID0gc3BlZWQ7Cj4gPiA+ID4gPiAtICAgICBwY2ktPnBjaWUud2lkdGggPSB3 aWR0aDsKPiA+ID4gPiA+ICsgICAgIHBjaS0+cGNpZS5jdXJfc3BlZWQgPSBzcGVlZDsKPiA+ID4g PiA+ICsgICAgIHBjaS0+cGNpZS5jdXJfd2lkdGggPSB3aWR0aDsKPiA+ID4gPiA+Cj4gPiA+ID4g PiAgICAgICBpZiAoc3BlZWQgPT0gY3VyX3NwZWVkKSB7Cj4gPiA+ID4gPiAgICAgICAgICAgICAg IG52a21fZGVidWcoc3ViZGV2LCAicmVxdWVzdGVkIG1hdGNoZXMgY3VycmVudCBzcGVlZFxuIik7 Cj4gPiA+ID4gPiBkaWZmIC0tZ2l0IGEvZHJtL25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL3ByaXYu aCBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2L3BjaS9wcml2LmgKPiA+ID4gPiA+IGluZGV4IGEw ZDRjMDA3Li5lNzc0NDY3MSAxMDA2NDQKPiA+ID4gPiA+IC0tLSBhL2RybS9ub3V2ZWF1L252a20v c3ViZGV2L3BjaS9wcml2LmgKPiA+ID4gPiA+ICsrKyBiL2RybS9ub3V2ZWF1L252a20vc3ViZGV2 L3BjaS9wcml2LmgKPiA+ID4gPiA+IEBAIC02MCw1ICs2MCw3IEBAIGVudW0gbnZrbV9wY2llX3Nw ZWVkIGdrMTA0X3BjaWVfbWF4X3NwZWVkKHN0cnVjdCBudmttX3BjaSAqKTsKPiA+ID4gPiA+ICBp bnQgZ2sxMDRfcGNpZV92ZXJzaW9uX3N1cHBvcnRlZChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gPiA+ ID4gPgo+ID4gPiA+ID4gIGludCBudmttX3BjaWVfb25laW5pdChzdHJ1Y3QgbnZrbV9wY2kgKik7 Cj4gPiA+ID4gPiAraW50IG52a21fcGNpZV9wcmVpbml0KHN0cnVjdCBudmttX3BjaSAqKTsKPiA+ ID4gPiA+ICBpbnQgbnZrbV9wY2llX2luaXQoc3RydWN0IG52a21fcGNpICopOwo+ID4gPiA+ID4g K2ludCBudmttX3BjaWVfZmluaShzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gPiA+ID4gPiAgI2VuZGlm Cj4gPiA+ID4gPiAtLQo+ID4gPiA+ID4gMi4yMS4wCj4gPiA+ID4gPgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2ZWF1IG1haWxpbmcgbGlzdApOb3V2 ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL25vdXZlYXU=