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 A0625C04AAC for ; Mon, 20 May 2019 21:19:36 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6CF532173C for ; Mon, 20 May 2019 21:19:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558387176; bh=nxe0kbIuLKT/xy3J74NILjx7UDLG36T7kPJSCiqfvp0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=1jgszu+9rbtcZmbmQj0zawUaQ1EWgBzqhVcVkkxT7OvOaG6LLbUbsFJ4B04Qr36MO w6ffahIqYkIzykwxKC+w3bOAEh+8T3sbOf9luSDMJ9WpQdeUIWofX4aVcgmOb2MYJ7 gcKABJ8JFTktwABKVu/tuPzZZICo0c9it0WCn64w= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726814AbfETVTf (ORCPT ); Mon, 20 May 2019 17:19:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:42386 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726151AbfETVTf (ORCPT ); Mon, 20 May 2019 17:19:35 -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 87E5C216B7; Mon, 20 May 2019 21:19:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1558387174; bh=nxe0kbIuLKT/xy3J74NILjx7UDLG36T7kPJSCiqfvp0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=pRjZjA5X5K1lb6sP8jtqhu8V2TF1EwxkHF5G/ML9b/wRzNQJjTF84E3i1oaP2VjVi G+xExagQXRTvTkx3Ya+wq29mEdk57VWbMBfKlqCQSB1d+q3LqpPgyhHLxGt9KQtckb 5YB1SLQPGEUPzM0/QYOWYL5NQYYRLj7hxav4iUls= Date: Mon, 20 May 2019 16:19:33 -0500 From: Bjorn Helgaas To: Karol Herbst Cc: nouveau@lists.freedesktop.org, 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: <20190520211933.GA57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20190507201245.9295-5-kherbst@redhat.com> 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 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. > v2: squashed together patch 4 and 5 > > 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: Mon, 20 May 2019 16:19:33 -0500 Message-ID: <20190520211933.GA57618@google.com> References: <20190507201245.9295-1-kherbst@redhat.com> <20190507201245.9295-5-kherbst@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190507201245.9295-5-kherbst-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: nouveau.vger.kernel.org T24gVHVlLCBNYXkgMDcsIDIwMTkgYXQgMTA6MTI6NDVQTSArMDIwMCwgS2Fyb2wgSGVyYnN0IHdy b3RlOgo+IEFwcGVyYW50bHkgdGhpbmdzIGdvIHNvdXRoIGlmIHdlIHN1c3BlbmQgdGhlIGRldmlj ZSB3aXRoIGEgZGlmZmVyZW50IFBDSUUKPiBsaW5rIHNwZWVkIHNldCB0aGFuIGl0IGdvdCBib290 ZWQgd2l0aC4gRml4ZXMgcnVudGltZSBzdXNwZW5kIG9uIG15IGdwMTA3Lgo+IAo+IFRoaXMgYWxs IGxvb2tzIGxpa2Ugc29tZSBidWcgaW5zaWRlIHRoZSBwY2kgc3Vic3lzdGVtIGFuZCBJIHdvdWxk IHByZWZlciBhCj4gZml4IHRoZXJlIGluc3RlYWQgb2Ygbm91dmVhdSwgYnV0IG1heWJlIHRoZXJl IGlzIG5vIHJlYWwgbmljZSB3YXkgb2YgZG9pbmcKPiB0aGF0IG91dHNpZGUgb2YgZHJpdmVycz8K CkkgYWdyZWUgaXQgd291bGQgYmUgbmljZSB0byBmaXggdGhpcyBpbiB0aGUgUENJIGNvcmUgaWYg dGhhdCdzCmZlYXNpYmxlLgoKSXQgbG9va3MgbGlrZSB0aGlzIGRyaXZlciBjaGFuZ2VzIHRoZSBQ Q0llIGxpbmsgc3BlZWQgdXNpbmcgc29tZQpkZXZpY2Utc3BlY2lmaWMgbWVjaGFuaXNtLiAgV2hl biB3ZSBzdXNwZW5kLCB3ZSBwdXQgdGhlIGRldmljZSBpbgpEM2NvbGQsIHNvIGl0IGxvc2VzIGFs bCBpdHMgc3RhdGUuICBXaGVuIHdlIHJlc3VtZSwgdGhlIGxpbmsgcHJvYmFibHkKY29tZXMgdXAg YXQgdGhlIGJvb3Qgc3BlZWQgYmVjYXVzZSBub3RoaW5nIGRpZCB0aGF0IGRldmljZS1zcGVjaWZp YwptYWdpYyB0byBjaGFuZ2UgaXQsIHNvIHlvdSBwcm9iYWJseSBlbmQgdXAgd2l0aCB0aGUgbGlu ayBiZWluZyBzbG93CmJ1dCB0aGUgZHJpdmVyIHRoaW5raW5nIGl0J3MgY29uZmlndXJlZCB0byBi ZSBmYXN0LCBhbmQgbWF5YmUgdGhhdApjb21iaW5hdGlvbiBkb2Vzbid0IHdvcmsuCgpJZiBpdCBy ZXF1aXJlcyBzb21ldGhpbmcgZGV2aWNlLXNwZWNpZmljIHRvIGNoYW5nZSB0aGF0IGxpbmsgc3Bl ZWQsIEkKZG9uJ3Qga25vdyBob3cgdG8gcHV0IHRoYXQgaW4gdGhlIFBDSSBjb3JlLiAgQnV0IG1h eWJlIEknbSBtaXNzaW5nCnNvbWV0aGluZz8KClBlciB0aGUgUENJZSBzcGVjIChyNC4wLCBzZWMg MS4yKToKCiAgSW5pdGlhbGl6YXRpb24g4oCTIER1cmluZyBoYXJkd2FyZSBpbml0aWFsaXphdGlv biwgZWFjaCBQQ0kgRXhwcmVzcwogIExpbmsgaXMgc2V0IHVwIGZvbGxvd2luZyBhIG5lZ290aWF0 aW9uIG9mIExhbmUgd2lkdGhzIGFuZCBmcmVxdWVuY3kKICBvZiBvcGVyYXRpb24gYnkgdGhlIHR3 byBhZ2VudHMgYXQgZWFjaCBlbmQgb2YgdGhlIExpbmsuIE5vIGZpcm13YXJlCiAgb3Igb3BlcmF0 aW5nIHN5c3RlbSBzb2Z0d2FyZSBpcyBpbnZvbHZlZC4KCkkgaGF2ZSBiZWVuIGFzc3VtaW5nIHRo YXQgdGhpcyBtZWFucyBkZXZpY2Utc3BlY2lmaWMgbGluayBzcGVlZAptYW5hZ2VtZW50IGlzIG91 dCBvZiBzcGVjLCBidXQgaXQgc2VlbXMgcHJldHR5IGNvbW1vbiB0aGF0IGRldmljZXMKZG9uJ3Qg Y29tZSB1cCBieSB0aGVtc2VsdmVzIGF0IHRoZSBmYXN0ZXN0IHBvc3NpYmxlIGxpbmsgc3BlZWQu ICBTbwptYXliZSB0aGUgc3BlYyBqdXN0IGludGVuZHMgdGhhdCBkZXZpY2VzIGNhbiBvcGVyYXRl IGF0ICpzb21lKiB2YWxpZApzcGVlZC4KCj4gdjI6IHNxdWFzaGVkIHRvZ2V0aGVyIHBhdGNoIDQg YW5kIDUKPiAKPiBTaWduZWQtb2ZmLWJ5OiBLYXJvbCBIZXJic3QgPGtoZXJic3RAcmVkaGF0LmNv bT4KPiBSZXZpZXdlZC1ieTogTHl1ZGUgUGF1bCA8bHl1ZGVAcmVkaGF0LmNvbT4KPiAtLS0KPiAg ZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaCB8ICA1ICsrKy0tCj4gIGRybS9u b3V2ZWF1L252a20vc3ViZGV2L3BjaS9iYXNlLmMgICAgfCAgOSArKysrKysrLS0KPiAgZHJtL25v dXZlYXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYyAgICB8IDI0ICsrKysrKysrKysrKysrKysrKysr LS0tLQo+ICBkcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvcHJpdi5oICAgIHwgIDIgKysKPiAg NCBmaWxlcyBjaGFuZ2VkLCAzMiBpbnNlcnRpb25zKCspLCA4IGRlbGV0aW9ucygtKQo+IAo+IGRp ZmYgLS1naXQgYS9kcm0vbm91dmVhdS9pbmNsdWRlL252a20vc3ViZGV2L3BjaS5oIGIvZHJtL25v dXZlYXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaAo+IGluZGV4IDFmZGYzMDk4Li5iMjM3OTNh MiAxMDA2NDQKPiAtLS0gYS9kcm0vbm91dmVhdS9pbmNsdWRlL252a20vc3ViZGV2L3BjaS5oCj4g KysrIGIvZHJtL25vdXZlYXUvaW5jbHVkZS9udmttL3N1YmRldi9wY2kuaAo+IEBAIC0yNiw4ICsy Niw5IEBAIHN0cnVjdCBudmttX3BjaSB7Cj4gIAl9IGFncDsKPiAgCj4gIAlzdHJ1Y3Qgewo+IC0J CWVudW0gbnZrbV9wY2llX3NwZWVkIHNwZWVkOwo+IC0JCXU4IHdpZHRoOwo+ICsJCWVudW0gbnZr bV9wY2llX3NwZWVkIGN1cl9zcGVlZDsKPiArCQllbnVtIG52a21fcGNpZV9zcGVlZCBkZWZfc3Bl ZWQ7Cj4gKwkJdTggY3VyX3dpZHRoOwo+ICAJfSBwY2llOwo+ICAKPiAgCWJvb2wgbXNpOwo+IGRp ZmYgLS1naXQgYS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvYmFzZS5jIGIvZHJtL25vdXZl YXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYwo+IGluZGV4IGVlMjQzMWE3Li5kOWZiNWE4MyAxMDA2 NDQKPiAtLS0gYS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvYmFzZS5jCj4gKysrIGIvZHJt L25vdXZlYXUvbnZrbS9zdWJkZXYvcGNpL2Jhc2UuYwo+IEBAIC05MCw2ICs5MCw4IEBAIG52a21f cGNpX2Zpbmkoc3RydWN0IG52a21fc3ViZGV2ICpzdWJkZXYsIGJvb2wgc3VzcGVuZCkKPiAgCj4g IAlpZiAocGNpLT5hZ3AuYnJpZGdlKQo+ICAJCW52a21fYWdwX2ZpbmkocGNpKTsKPiArCWVsc2Ug aWYgKHBjaV9pc19wY2llKHBjaS0+cGRldikpCj4gKwkJbnZrbV9wY2llX2ZpbmkocGNpKTsKPiAg Cj4gIAlyZXR1cm4gMDsKPiAgfQo+IEBAIC0xMDAsNiArMTAyLDggQEAgbnZrbV9wY2lfcHJlaW5p dChzdHJ1Y3QgbnZrbV9zdWJkZXYgKnN1YmRldikKPiAgCXN0cnVjdCBudmttX3BjaSAqcGNpID0g bnZrbV9wY2koc3ViZGV2KTsKPiAgCWlmIChwY2ktPmFncC5icmlkZ2UpCj4gIAkJbnZrbV9hZ3Bf cHJlaW5pdChwY2kpOwo+ICsJZWxzZSBpZiAocGNpX2lzX3BjaWUocGNpLT5wZGV2KSkKPiArCQlu dmttX3BjaWVfcHJlaW5pdChwY2kpOwo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gQEAgLTE5Myw4 ICsxOTcsOSBAQCBudmttX3BjaV9uZXdfKGNvbnN0IHN0cnVjdCBudmttX3BjaV9mdW5jICpmdW5j LCBzdHJ1Y3QgbnZrbV9kZXZpY2UgKmRldmljZSwKPiAgCXBjaS0+ZnVuYyA9IGZ1bmM7Cj4gIAlw Y2ktPnBkZXYgPSBkZXZpY2UtPmZ1bmMtPnBjaShkZXZpY2UpLT5wZGV2Owo+ICAJcGNpLT5pcnEg PSAtMTsKPiAtCXBjaS0+cGNpZS5zcGVlZCA9IC0xOwo+IC0JcGNpLT5wY2llLndpZHRoID0gLTE7 Cj4gKwlwY2ktPnBjaWUuY3VyX3NwZWVkID0gLTE7Cj4gKwlwY2ktPnBjaWUuZGVmX3NwZWVkID0g LTE7Cj4gKwlwY2ktPnBjaWUuY3VyX3dpZHRoID0gLTE7Cj4gIAo+ICAJaWYgKGRldmljZS0+dHlw ZSA9PSBOVktNX0RFVklDRV9BR1ApCj4gIAkJbnZrbV9hZ3BfY3RvcihwY2kpOwo+IGRpZmYgLS1n aXQgYS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvcGNpZS5jIGIvZHJtL25vdXZlYXUvbnZr bS9zdWJkZXYvcGNpL3BjaWUuYwo+IGluZGV4IDcwY2NiZTBkLi43MzFkZDMwZSAxMDA2NDQKPiAt LS0gYS9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kvcGNpZS5jCj4gKysrIGIvZHJtL25vdXZl YXUvbnZrbS9zdWJkZXYvcGNpL3BjaWUuYwo+IEBAIC04NSw2ICs4NSwxMyBAQCBudmttX3BjaWVf b25laW5pdChzdHJ1Y3QgbnZrbV9wY2kgKnBjaSkKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICtp bnQKPiArbnZrbV9wY2llX3ByZWluaXQoc3RydWN0IG52a21fcGNpICpwY2kpCj4gK3sKPiArCXBj aS0+cGNpZS5kZWZfc3BlZWQgPSBudmttX3BjaWVfZ2V0X3NwZWVkKHBjaSk7Cj4gKwlyZXR1cm4g MDsKPiArfQo+ICsKPiAgaW50Cj4gIG52a21fcGNpZV9pbml0KHN0cnVjdCBudmttX3BjaSAqcGNp KQo+ICB7Cj4gQEAgLTEwNSwxMiArMTEyLDIxIEBAIG52a21fcGNpZV9pbml0KHN0cnVjdCBudmtt X3BjaSAqcGNpKQo+ICAJaWYgKHBjaS0+ZnVuYy0+cGNpZS5pbml0KQo+ICAJCXBjaS0+ZnVuYy0+ cGNpZS5pbml0KHBjaSk7Cj4gIAo+IC0JaWYgKHBjaS0+cGNpZS5zcGVlZCAhPSAtMSkKPiAtCQlu dmttX3BjaWVfc2V0X2xpbmsocGNpLCBwY2ktPnBjaWUuc3BlZWQsIHBjaS0+cGNpZS53aWR0aCk7 Cj4gKwlpZiAocGNpLT5wY2llLmN1cl9zcGVlZCAhPSAtMSkKPiArCQludmttX3BjaWVfc2V0X2xp bmsocGNpLCBwY2ktPnBjaWUuY3VyX3NwZWVkLAo+ICsJCQkJICAgcGNpLT5wY2llLmN1cl93aWR0 aCk7Cj4gIAo+ICAJcmV0dXJuIDA7Cj4gIH0KPiAgCj4gK2ludAo+ICtudmttX3BjaWVfZmluaShz dHJ1Y3QgbnZrbV9wY2kgKnBjaSkKPiArewo+ICsJaWYgKCFJU19FUlJfVkFMVUUocGNpLT5wY2ll LmRlZl9zcGVlZCkpCj4gKwkJcmV0dXJuIG52a21fcGNpZV9zZXRfbGluayhwY2ksIHBjaS0+cGNp ZS5kZWZfc3BlZWQsIDE2KTsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICBpbnQKPiAgbnZrbV9w Y2llX3NldF9saW5rKHN0cnVjdCBudmttX3BjaSAqcGNpLCBlbnVtIG52a21fcGNpZV9zcGVlZCBz cGVlZCwgdTggd2lkdGgpCj4gIHsKPiBAQCAtMTQ2LDggKzE2Miw4IEBAIG52a21fcGNpZV9zZXRf bGluayhzdHJ1Y3QgbnZrbV9wY2kgKnBjaSwgZW51bSBudmttX3BjaWVfc3BlZWQgc3BlZWQsIHU4 IHdpZHRoKQo+ICAJCXNwZWVkID0gbWF4X3NwZWVkOwo+ICAJfQo+ICAKPiAtCXBjaS0+cGNpZS5z cGVlZCA9IHNwZWVkOwo+IC0JcGNpLT5wY2llLndpZHRoID0gd2lkdGg7Cj4gKwlwY2ktPnBjaWUu Y3VyX3NwZWVkID0gc3BlZWQ7Cj4gKwlwY2ktPnBjaWUuY3VyX3dpZHRoID0gd2lkdGg7Cj4gIAo+ ICAJaWYgKHNwZWVkID09IGN1cl9zcGVlZCkgewo+ICAJCW52a21fZGVidWcoc3ViZGV2LCAicmVx dWVzdGVkIG1hdGNoZXMgY3VycmVudCBzcGVlZFxuIik7Cj4gZGlmZiAtLWdpdCBhL2RybS9ub3V2 ZWF1L252a20vc3ViZGV2L3BjaS9wcml2LmggYi9kcm0vbm91dmVhdS9udmttL3N1YmRldi9wY2kv cHJpdi5oCj4gaW5kZXggYTBkNGMwMDcuLmU3NzQ0NjcxIDEwMDY0NAo+IC0tLSBhL2RybS9ub3V2 ZWF1L252a20vc3ViZGV2L3BjaS9wcml2LmgKPiArKysgYi9kcm0vbm91dmVhdS9udmttL3N1YmRl di9wY2kvcHJpdi5oCj4gQEAgLTYwLDUgKzYwLDcgQEAgZW51bSBudmttX3BjaWVfc3BlZWQgZ2sx MDRfcGNpZV9tYXhfc3BlZWQoc3RydWN0IG52a21fcGNpICopOwo+ICBpbnQgZ2sxMDRfcGNpZV92 ZXJzaW9uX3N1cHBvcnRlZChzdHJ1Y3QgbnZrbV9wY2kgKik7Cj4gIAo+ICBpbnQgbnZrbV9wY2ll X29uZWluaXQoc3RydWN0IG52a21fcGNpICopOwo+ICtpbnQgbnZrbV9wY2llX3ByZWluaXQoc3Ry dWN0IG52a21fcGNpICopOwo+ICBpbnQgbnZrbV9wY2llX2luaXQoc3RydWN0IG52a21fcGNpICop Owo+ICtpbnQgbnZrbV9wY2llX2Zpbmkoc3RydWN0IG52a21fcGNpICopOwo+ICAjZW5kaWYKPiAt LSAKPiAyLjIxLjAKPiAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KTm91dmVhdSBtYWlsaW5nIGxpc3QKTm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9ub3V2ZWF1