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=-5.6 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_PASS, USER_AGENT_MUTT autolearn=unavailable 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 2035EC282CE for ; Wed, 24 Apr 2019 18:59:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id CB191206BA for ; Wed, 24 Apr 2019 18:59:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1556132384; bh=C50HptKC58Jf/zZXUpG3ld6bN5bDbFzS70IId4+tthM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=lm7uLPhn2HFeI5LA9f9EqIrElvyhYDVoSlAgLpZWWq2hQMphCZxglSoCS6P+wwLJT RiO6wiE3Uy3IhjosBtBHWq3/Wi3dpdCF6W889ptkqsn7sRm5vSYhZpqovOiCr2za+f gTtSTUjarRe/HyIiePb0w54QUVCcrnCsjqSyKVS4= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388543AbfDXS7m (ORCPT ); Wed, 24 Apr 2019 14:59:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:47726 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727749AbfDXS7k (ORCPT ); Wed, 24 Apr 2019 14:59:40 -0400 Received: from localhost (unknown [69.71.4.100]) (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 90A00206BA; Wed, 24 Apr 2019 18:59:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1556132379; bh=C50HptKC58Jf/zZXUpG3ld6bN5bDbFzS70IId4+tthM=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=w0Zw1R447tSnNTFAC70hasgxwE5fImCDhJWqP8J1lH9rligAXcFr8QMDBfRjcXg2I VfEuaBC7vS0Ef49Sfr4+3gIpIaJSCmBqobS74nzaRC0nmmGUg5NbqJk6/f4pJ426LW RrHaIzeiBilHi5MzR4sJ5OTYsspeThpXAXuxVlf0= Date: Wed, 24 Apr 2019 13:59:37 -0500 From: Bjorn Helgaas To: Lyude Paul Cc: David Ober , linux-pci@vger.kernel.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, Karol Herbst , Ben Skeggs , stable@vger.kernel.org, linux-kernel@vger.kernel.org, "Rafael J. Wysocki" , Hans de Goede Subject: Re: [PATCH] pci/quirks: Add quirk to reset nvgpu at boot for the Lenovo ThinkPad P50 Message-ID: <20190424185937.GB11428@google.com> References: <20190212220230.1568-1-lyude@redhat.com> <20190215004329.GR96272@google.com> <2fca9a9feafcd17b27bc71994a71ebc241a93e9a.camel@redhat.com> <52b17f8cb24e179e9661d75548d193843ae87b4c.camel@redhat.com> <20190321224819.GK251185@google.com> <20190322113015.GM251185@google.com> <20190404141724.GJ141706@google.com> <3987ad435bfdb2d92e5e42648174634814b1646d.camel@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <3987ad435bfdb2d92e5e42648174634814b1646d.camel@redhat.com> User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Apr 15, 2019 at 02:07:18PM -0400, Lyude Paul wrote: > On Thu, 2019-04-04 at 09:17 -0500, Bjorn Helgaas wrote: > > [+cc Hans, author of 0b2fe6594fa2 ("drm/nouveau: Queue hpd_work on (runtime) > > resume")] > > > > On Fri, Mar 22, 2019 at 06:30:15AM -0500, Bjorn Helgaas wrote: > > > On Thu, Mar 21, 2019 at 05:48:19PM -0500, Bjorn Helgaas wrote: > > > > On Wed, Mar 13, 2019 at 06:25:02PM -0400, Lyude Paul wrote: > > > > > On Fri, 2019-02-15 at 16:17 -0500, Lyude Paul wrote: > > > > > > On Thu, 2019-02-14 at 18:43 -0600, Bjorn Helgaas wrote: > > > > > > > On Tue, Feb 12, 2019 at 05:02:30PM -0500, Lyude Paul wrote: > > > > > > > > On a very specific subset of ThinkPad P50 SKUs, particularly > > > > > > > > ones that come with a Quadro M1000M chip instead of the M2000M > > > > > > > > variant, the BIOS seems to have a very nasty habit of not > > > > > > > > always resetting the secondary Nvidia GPU between full reboots > > > > > > > > if the laptop is configured in Hybrid Graphics mode. The > > > > > > > > reason for this happening is unknown, but the following steps > > > > > > > > and possibly a good bit of patience will reproduce the issue: > > > > > > > > > > > > > > > > 1. Boot up the laptop normally in Hybrid graphics mode > > > > > > > > 2. Make sure nouveau is loaded and that the GPU is awake > > > > > > > > 2. Allow the nvidia GPU to runtime suspend itself after being > > > > > > > > idle > > > > > > > > 3. Reboot the machine, the more sudden the better (e.g sysrq-b > > > > > > > > may help) > > > > > > > > 4. If nouveau loads up properly, reboot the machine again and go > > > > > > > > back to > > > > > > > > step 2 until you reproduce the issue > > > > > > > > > > > > > > > > This results in some very strange behavior: the GPU will quite > > > > > > > > literally be left in exactly the same state it was in when the > > > > > > > > previously booted kernel started the reboot. This has all > > > > > > > > sorts of bad sideaffects: for starters, this completely breaks > > > > > > > > nouveau starting with a mysterious EVO channel failure that > > > > > > > > happens well before we've actually used the EVO channel for > > > > > > > > anything: > > > > > > > > Thanks for the hybrid tutorial (snipped from this response). IIUC, > > > > what you said was that in hybrid mode, the Intel GPU drives the > > > > built-in display and the Nvidia GPU drives any external displays and > > > > may be used for DRI PRIME rendering (whatever that is). But since you > > > > say the Nvidia device gets runtime suspended, I assume there's no > > > > external display here and you're not using DRI PRIME. > > > > > > > > I wonder if it's related to the fact that the Nvidia GPU has been > > > > runtime suspended before you do the reboot. Can you try turning of > > > > runtime power management for the GPU by setting the runpm module > > > > parameter to 0? I *think* this would be booting with > > > > "nouveau.runpm=0". > > > > > > Sorry, I wasn't really thinking here. You already *said* this is > > > related to runtime suspend. It only happens when the Nvidia GPU has > > > been suspended. > > > > > > I don't know that much about suspend, but ISTR seeing comments about > > > resuming devices before we shutdown. If we do that, maybe there's > > > some kind of race between that resume and the reboot? > > > > I think we do in fact resume PCI devices before shutdown. Here's the > > path I'm looking at: > > > > device_shutdown > > pm_runtime_get_noresume > > pm_runtime_barrier > > dev->bus->shutdown > > pci_device_shutdown > > pm_runtime_resume > > __pm_runtime_resume(dev, 0) > > rpm_resume(dev, 0) > > __update_runtime_status(dev, RPM_RESUMING) > > callback = RPM_GET_CALLBACK(dev, runtime_resume) > > rpm_callback(callback, dev) > > __rpm_callback > > pci_pm_runtime_resume > > drv->pm->runtime_resume > > nouveau_pmops_runtime_resume > > nouveau_do_resume > > schedule_work(hpd_work) # <--- > > ... > > nouveau_display_hpd_work > > pm_runtime_get_sync > > drm_helper_hpd_irq_event > > pm_runtime_mark_last_busy > > pm_runtime_put_sync > > > > I'm curious about that "schedule_work(hpd_work)" near the end because > > no other drivers seem to use schedule_work() in the runtime_resume > > path, and I don't know how that synchronizes with the shutdown > > process. I don't see anything that waits for > > nouveau_display_hpd_work() to complete, so it seems like something > > that could be a race. > > > > I wonder this problem would be easier to reproduce if you added a > > sleep in nouveau_display_hpd_work() as in the first hunk below, and I > > wonder if the problem would then go away if you stopped scheduling > > hpd_work as in the second hunk? Obviously the second hunk isn't a > > solution, it's just an attempt to figure out if I'm looking in the > > right area. > > So I did try making it so that we cancel hpd_work from > pci_driver->shutdown and wait for it to complete, however that > didn't really seem to make any difference. Not being a scheduled work expert, I was unsure if this experiment was equivalent to what I proposed. I'm always suspicious of singleton solutions like this (using schedule_work() in runtime_resume()) because usually they seem to be solving a generic problem that should happen on many kinds of hardware. The 0b2fe6594fa2 ("drm/nouveau: Queue hpd_work on (runtime) resume") commit log says: We need to call drm_helper_hpd_irq_event() on resume to properly detect monitor connection / disconnection on some laptops, use hpd_work for this to avoid deadlocks. The situation of a monitor being connected or disconnected during suspend can happen to *any* GPU, but the commit only changes nouveau, which of course raises the question of how we deal with that in other drivers. If the Nvidia GPU has some unique behavior related to monitor connection, that would explain special-case code there, but the commit doesn't mention anything like that. It should be simple to revert 0b2fe6594fa2 and see whether it changes the behavior at all (well, simple except for the fact that this problem isn't 100% reproducible in the first place). > Do we want to have this discussion on the bz btw, or is this email > thread fine? Email is fine. > > diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c > > b/drivers/gpu/drm/nouveau/nouveau_display.c > > index 55c0fa451163..e50806012d41 100644 > > --- a/drivers/gpu/drm/nouveau/nouveau_display.c > > +++ b/drivers/gpu/drm/nouveau/nouveau_display.c > > @@ -350,6 +350,7 @@ nouveau_display_hpd_work(struct work_struct *work) > > > > pm_runtime_get_sync(drm->dev->dev); > > > > + msleep(2000); > > drm_helper_hpd_irq_event(drm->dev); > > > > pm_runtime_mark_last_busy(drm->dev->dev); > > > > > > > > diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c > > b/drivers/gpu/drm/nouveau/nouveau_drm.c > > index 5020265bfbd9..48da72caa017 100644 > > --- a/drivers/gpu/drm/nouveau/nouveau_drm.c > > +++ b/drivers/gpu/drm/nouveau/nouveau_drm.c > > @@ -946,9 +946,6 @@ nouveau_pmops_runtime_resume(struct device *dev) > > nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25)); > > drm_dev->switch_power_state = DRM_SWITCH_POWER_ON; > > > > - /* Monitors may have been connected / disconnected during suspend */ > > - schedule_work(&nouveau_drm(drm_dev)->hpd_work); > > - > > return ret; > > } > > > -- > Cheers, > Lyude Paul > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bjorn Helgaas Subject: Re: [PATCH] pci/quirks: Add quirk to reset nvgpu at boot for the Lenovo ThinkPad P50 Date: Wed, 24 Apr 2019 13:59:37 -0500 Message-ID: <20190424185937.GB11428@google.com> References: <20190212220230.1568-1-lyude@redhat.com> <20190215004329.GR96272@google.com> <2fca9a9feafcd17b27bc71994a71ebc241a93e9a.camel@redhat.com> <52b17f8cb24e179e9661d75548d193843ae87b4c.camel@redhat.com> <20190321224819.GK251185@google.com> <20190322113015.GM251185@google.com> <20190404141724.GJ141706@google.com> <3987ad435bfdb2d92e5e42648174634814b1646d.camel@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: <3987ad435bfdb2d92e5e42648174634814b1646d.camel-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: Lyude Paul Cc: linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, "Rafael J. Wysocki" , linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Hans de Goede , stable-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, David Ober , nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org T24gTW9uLCBBcHIgMTUsIDIwMTkgYXQgMDI6MDc6MThQTSAtMDQwMCwgTHl1ZGUgUGF1bCB3cm90 ZToKPiBPbiBUaHUsIDIwMTktMDQtMDQgYXQgMDk6MTcgLTA1MDAsIEJqb3JuIEhlbGdhYXMgd3Jv dGU6Cj4gPiBbK2NjIEhhbnMsIGF1dGhvciBvZiAwYjJmZTY1OTRmYTIgKCJkcm0vbm91dmVhdTog UXVldWUgaHBkX3dvcmsgb24gKHJ1bnRpbWUpCj4gPiByZXN1bWUiKV0KPiA+IAo+ID4gT24gRnJp LCBNYXIgMjIsIDIwMTkgYXQgMDY6MzA6MTVBTSAtMDUwMCwgQmpvcm4gSGVsZ2FhcyB3cm90ZToK PiA+ID4gT24gVGh1LCBNYXIgMjEsIDIwMTkgYXQgMDU6NDg6MTlQTSAtMDUwMCwgQmpvcm4gSGVs Z2FhcyB3cm90ZToKPiA+ID4gPiBPbiBXZWQsIE1hciAxMywgMjAxOSBhdCAwNjoyNTowMlBNIC0w NDAwLCBMeXVkZSBQYXVsIHdyb3RlOgo+ID4gPiA+ID4gT24gRnJpLCAyMDE5LTAyLTE1IGF0IDE2 OjE3IC0wNTAwLCBMeXVkZSBQYXVsIHdyb3RlOgo+ID4gPiA+ID4gPiBPbiBUaHUsIDIwMTktMDIt MTQgYXQgMTg6NDMgLTA2MDAsIEJqb3JuIEhlbGdhYXMgd3JvdGU6Cj4gPiA+ID4gPiA+ID4gT24g VHVlLCBGZWIgMTIsIDIwMTkgYXQgMDU6MDI6MzBQTSAtMDUwMCwgTHl1ZGUgUGF1bCB3cm90ZToK PiA+ID4gPiA+ID4gPiA+IE9uIGEgdmVyeSBzcGVjaWZpYyBzdWJzZXQgb2YgVGhpbmtQYWQgUDUw IFNLVXMsIHBhcnRpY3VsYXJseQo+ID4gPiA+ID4gPiA+ID4gb25lcyB0aGF0IGNvbWUgd2l0aCBh IFF1YWRybyBNMTAwME0gY2hpcCBpbnN0ZWFkIG9mIHRoZSBNMjAwME0KPiA+ID4gPiA+ID4gPiA+ IHZhcmlhbnQsIHRoZSBCSU9TIHNlZW1zIHRvIGhhdmUgYSB2ZXJ5IG5hc3R5IGhhYml0IG9mIG5v dAo+ID4gPiA+ID4gPiA+ID4gYWx3YXlzIHJlc2V0dGluZyB0aGUgc2Vjb25kYXJ5IE52aWRpYSBH UFUgYmV0d2VlbiBmdWxsIHJlYm9vdHMKPiA+ID4gPiA+ID4gPiA+IGlmIHRoZSBsYXB0b3AgaXMg Y29uZmlndXJlZCBpbiBIeWJyaWQgR3JhcGhpY3MgbW9kZS4gVGhlCj4gPiA+ID4gPiA+ID4gPiBy ZWFzb24gZm9yIHRoaXMgaGFwcGVuaW5nIGlzIHVua25vd24sIGJ1dCB0aGUgZm9sbG93aW5nIHN0 ZXBzCj4gPiA+ID4gPiA+ID4gPiBhbmQgcG9zc2libHkgYSBnb29kIGJpdCBvZiBwYXRpZW5jZSB3 aWxsIHJlcHJvZHVjZSB0aGUgaXNzdWU6Cj4gPiA+ID4gPiA+ID4gPiAKPiA+ID4gPiA+ID4gPiA+ IDEuIEJvb3QgdXAgdGhlIGxhcHRvcCBub3JtYWxseSBpbiBIeWJyaWQgZ3JhcGhpY3MgbW9kZQo+ ID4gPiA+ID4gPiA+ID4gMi4gTWFrZSBzdXJlIG5vdXZlYXUgaXMgbG9hZGVkIGFuZCB0aGF0IHRo ZSBHUFUgaXMgYXdha2UKPiA+ID4gPiA+ID4gPiA+IDIuIEFsbG93IHRoZSBudmlkaWEgR1BVIHRv IHJ1bnRpbWUgc3VzcGVuZCBpdHNlbGYgYWZ0ZXIgYmVpbmcKPiA+ID4gPiA+ID4gPiA+IGlkbGUK PiA+ID4gPiA+ID4gPiA+IDMuIFJlYm9vdCB0aGUgbWFjaGluZSwgdGhlIG1vcmUgc3VkZGVuIHRo ZSBiZXR0ZXIgKGUuZyBzeXNycS1iCj4gPiA+ID4gPiA+ID4gPiBtYXkgaGVscCkKPiA+ID4gPiA+ ID4gPiA+IDQuIElmIG5vdXZlYXUgbG9hZHMgdXAgcHJvcGVybHksIHJlYm9vdCB0aGUgbWFjaGlu ZSBhZ2FpbiBhbmQgZ28KPiA+ID4gPiA+ID4gPiA+IGJhY2sgdG8KPiA+ID4gPiA+ID4gPiA+IHN0 ZXAgMiB1bnRpbCB5b3UgcmVwcm9kdWNlIHRoZSBpc3N1ZQo+ID4gPiA+ID4gPiA+ID4gCj4gPiA+ ID4gPiA+ID4gPiBUaGlzIHJlc3VsdHMgaW4gc29tZSB2ZXJ5IHN0cmFuZ2UgYmVoYXZpb3I6IHRo ZSBHUFUgd2lsbCBxdWl0ZQo+ID4gPiA+ID4gPiA+ID4gbGl0ZXJhbGx5IGJlIGxlZnQgaW4gZXhh Y3RseSB0aGUgc2FtZSBzdGF0ZSBpdCB3YXMgaW4gd2hlbiB0aGUKPiA+ID4gPiA+ID4gPiA+IHBy ZXZpb3VzbHkgYm9vdGVkIGtlcm5lbCBzdGFydGVkIHRoZSByZWJvb3QuIFRoaXMgaGFzIGFsbAo+ ID4gPiA+ID4gPiA+ID4gc29ydHMgb2YgYmFkIHNpZGVhZmZlY3RzOiBmb3Igc3RhcnRlcnMsIHRo aXMgY29tcGxldGVseSBicmVha3MKPiA+ID4gPiA+ID4gPiA+IG5vdXZlYXUgc3RhcnRpbmcgd2l0 aCBhIG15c3RlcmlvdXMgRVZPIGNoYW5uZWwgZmFpbHVyZSB0aGF0Cj4gPiA+ID4gPiA+ID4gPiBo YXBwZW5zIHdlbGwgYmVmb3JlIHdlJ3ZlIGFjdHVhbGx5IHVzZWQgdGhlIEVWTyBjaGFubmVsIGZv cgo+ID4gPiA+ID4gPiA+ID4gYW55dGhpbmc6Cj4gPiA+ID4gCj4gPiA+ID4gVGhhbmtzIGZvciB0 aGUgaHlicmlkIHR1dG9yaWFsIChzbmlwcGVkIGZyb20gdGhpcyByZXNwb25zZSkuICBJSVVDLAo+ ID4gPiA+IHdoYXQgeW91IHNhaWQgd2FzIHRoYXQgaW4gaHlicmlkIG1vZGUsIHRoZSBJbnRlbCBH UFUgZHJpdmVzIHRoZQo+ID4gPiA+IGJ1aWx0LWluIGRpc3BsYXkgYW5kIHRoZSBOdmlkaWEgR1BV IGRyaXZlcyBhbnkgZXh0ZXJuYWwgZGlzcGxheXMgYW5kCj4gPiA+ID4gbWF5IGJlIHVzZWQgZm9y IERSSSBQUklNRSByZW5kZXJpbmcgKHdoYXRldmVyIHRoYXQgaXMpLiAgQnV0IHNpbmNlIHlvdQo+ ID4gPiA+IHNheSB0aGUgTnZpZGlhIGRldmljZSBnZXRzIHJ1bnRpbWUgc3VzcGVuZGVkLCBJIGFz c3VtZSB0aGVyZSdzIG5vCj4gPiA+ID4gZXh0ZXJuYWwgZGlzcGxheSBoZXJlIGFuZCB5b3UncmUg bm90IHVzaW5nIERSSSBQUklNRS4KPiA+ID4gPiAKPiA+ID4gPiBJIHdvbmRlciBpZiBpdCdzIHJl bGF0ZWQgdG8gdGhlIGZhY3QgdGhhdCB0aGUgTnZpZGlhIEdQVSBoYXMgYmVlbgo+ID4gPiA+IHJ1 bnRpbWUgc3VzcGVuZGVkIGJlZm9yZSB5b3UgZG8gdGhlIHJlYm9vdC4gIENhbiB5b3UgdHJ5IHR1 cm5pbmcgb2YKPiA+ID4gPiBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQgZm9yIHRoZSBHUFUgYnkg c2V0dGluZyB0aGUgcnVucG0gbW9kdWxlCj4gPiA+ID4gcGFyYW1ldGVyIHRvIDA/ICBJICp0aGlu ayogdGhpcyB3b3VsZCBiZSBib290aW5nIHdpdGgKPiA+ID4gPiAibm91dmVhdS5ydW5wbT0wIi4K PiA+ID4gCj4gPiA+IFNvcnJ5LCBJIHdhc24ndCByZWFsbHkgdGhpbmtpbmcgaGVyZS4gIFlvdSBh bHJlYWR5ICpzYWlkKiB0aGlzIGlzCj4gPiA+IHJlbGF0ZWQgdG8gcnVudGltZSBzdXNwZW5kLiAg SXQgb25seSBoYXBwZW5zIHdoZW4gdGhlIE52aWRpYSBHUFUgaGFzCj4gPiA+IGJlZW4gc3VzcGVu ZGVkLgo+ID4gPiAKPiA+ID4gSSBkb24ndCBrbm93IHRoYXQgbXVjaCBhYm91dCBzdXNwZW5kLCBi dXQgSVNUUiBzZWVpbmcgY29tbWVudHMgYWJvdXQKPiA+ID4gcmVzdW1pbmcgZGV2aWNlcyBiZWZv cmUgd2Ugc2h1dGRvd24uICBJZiB3ZSBkbyB0aGF0LCBtYXliZSB0aGVyZSdzCj4gPiA+IHNvbWUg a2luZCBvZiByYWNlIGJldHdlZW4gdGhhdCByZXN1bWUgYW5kIHRoZSByZWJvb3Q/Cj4gPiAKPiA+ IEkgdGhpbmsgd2UgZG8gaW4gZmFjdCByZXN1bWUgUENJIGRldmljZXMgYmVmb3JlIHNodXRkb3du LiAgSGVyZSdzIHRoZQo+ID4gcGF0aCBJJ20gbG9va2luZyBhdDoKPiA+IAo+ID4gICBkZXZpY2Vf c2h1dGRvd24KPiA+ICAgICBwbV9ydW50aW1lX2dldF9ub3Jlc3VtZQo+ID4gICAgIHBtX3J1bnRp bWVfYmFycmllcgo+ID4gICAgIGRldi0+YnVzLT5zaHV0ZG93bgo+ID4gICAgICAgcGNpX2Rldmlj ZV9zaHV0ZG93bgo+ID4gICAgICAgICBwbV9ydW50aW1lX3Jlc3VtZQo+ID4gICAgICAgICAgIF9f cG1fcnVudGltZV9yZXN1bWUoZGV2LCAwKQo+ID4gICAgICAgICAgICAgcnBtX3Jlc3VtZShkZXYs IDApCj4gPiAgICAgICAgICAgICAgIF9fdXBkYXRlX3J1bnRpbWVfc3RhdHVzKGRldiwgUlBNX1JF U1VNSU5HKQo+ID4gICAgICAgICAgICAgICBjYWxsYmFjayA9IFJQTV9HRVRfQ0FMTEJBQ0soZGV2 LCBydW50aW1lX3Jlc3VtZSkKPiA+ICAgICAgICAgICAgICAgcnBtX2NhbGxiYWNrKGNhbGxiYWNr LCBkZXYpCj4gPiAgICAgICAgICAgICAgICAgX19ycG1fY2FsbGJhY2sKPiA+ICAgICAgICAgICAg ICAgICAgIHBjaV9wbV9ydW50aW1lX3Jlc3VtZQo+ID4gICAgICAgICAgICAgICAgICAgICBkcnYt PnBtLT5ydW50aW1lX3Jlc3VtZQo+ID4gICAgICAgICAgICAgICAgICAgICAgIG5vdXZlYXVfcG1v cHNfcnVudGltZV9yZXN1bWUKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG5vdXZlYXVfZG9f cmVzdW1lCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZV93b3JrKGhwZF93b3Jr KSAgICMgPC0tLQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgLi4uCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICBub3V2ZWF1X2Rpc3BsYXlfaHBkX3dvcmsKPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgcG1fcnVudGltZV9nZXRfc3luYwo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICBkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgcG1fcnVudGltZV9tYXJrX2xhc3RfYnVzeQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAg ICBwbV9ydW50aW1lX3B1dF9zeW5jCj4gPiAKPiA+IEknbSBjdXJpb3VzIGFib3V0IHRoYXQgInNj aGVkdWxlX3dvcmsoaHBkX3dvcmspIiBuZWFyIHRoZSBlbmQgYmVjYXVzZQo+ID4gbm8gb3RoZXIg ZHJpdmVycyBzZWVtIHRvIHVzZSBzY2hlZHVsZV93b3JrKCkgaW4gdGhlIHJ1bnRpbWVfcmVzdW1l Cj4gPiBwYXRoLCBhbmQgSSBkb24ndCBrbm93IGhvdyB0aGF0IHN5bmNocm9uaXplcyB3aXRoIHRo ZSBzaHV0ZG93bgo+ID4gcHJvY2Vzcy4gIEkgZG9uJ3Qgc2VlIGFueXRoaW5nIHRoYXQgd2FpdHMg Zm9yCj4gPiBub3V2ZWF1X2Rpc3BsYXlfaHBkX3dvcmsoKSB0byBjb21wbGV0ZSwgc28gaXQgc2Vl bXMgbGlrZSBzb21ldGhpbmcKPiA+IHRoYXQgY291bGQgYmUgYSByYWNlLgo+ID4gCj4gPiBJIHdv bmRlciB0aGlzIHByb2JsZW0gd291bGQgYmUgZWFzaWVyIHRvIHJlcHJvZHVjZSBpZiB5b3UgYWRk ZWQgYQo+ID4gc2xlZXAgaW4gbm91dmVhdV9kaXNwbGF5X2hwZF93b3JrKCkgYXMgaW4gdGhlIGZp cnN0IGh1bmsgYmVsb3csIGFuZCBJCj4gPiB3b25kZXIgaWYgdGhlIHByb2JsZW0gd291bGQgdGhl biBnbyBhd2F5IGlmIHlvdSBzdG9wcGVkIHNjaGVkdWxpbmcKPiA+IGhwZF93b3JrIGFzIGluIHRo ZSBzZWNvbmQgaHVuaz8gIE9idmlvdXNseSB0aGUgc2Vjb25kIGh1bmsgaXNuJ3QgYQo+ID4gc29s dXRpb24sIGl0J3MganVzdCBhbiBhdHRlbXB0IHRvIGZpZ3VyZSBvdXQgaWYgSSdtIGxvb2tpbmcg aW4gdGhlCj4gPiByaWdodCBhcmVhLgo+IAo+IFNvIEkgZGlkIHRyeSBtYWtpbmcgaXQgc28gdGhh dCB3ZSBjYW5jZWwgaHBkX3dvcmsgZnJvbQo+IHBjaV9kcml2ZXItPnNodXRkb3duIGFuZCB3YWl0 IGZvciBpdCB0byBjb21wbGV0ZSwgaG93ZXZlciB0aGF0Cj4gZGlkbid0IHJlYWxseSBzZWVtIHRv IG1ha2UgYW55IGRpZmZlcmVuY2UuIAoKTm90IGJlaW5nIGEgc2NoZWR1bGVkIHdvcmsgZXhwZXJ0 LCBJIHdhcyB1bnN1cmUgaWYgdGhpcyBleHBlcmltZW50IHdhcwplcXVpdmFsZW50IHRvIHdoYXQg SSBwcm9wb3NlZC4KCkknbSBhbHdheXMgc3VzcGljaW91cyBvZiBzaW5nbGV0b24gc29sdXRpb25z IGxpa2UgdGhpcyAodXNpbmcKc2NoZWR1bGVfd29yaygpIGluIHJ1bnRpbWVfcmVzdW1lKCkpIGJl Y2F1c2UgdXN1YWxseSB0aGV5IHNlZW0gdG8gYmUKc29sdmluZyBhIGdlbmVyaWMgcHJvYmxlbSB0 aGF0IHNob3VsZCBoYXBwZW4gb24gbWFueSBraW5kcyBvZgpoYXJkd2FyZS4gIFRoZSAwYjJmZTY1 OTRmYTIgKCJkcm0vbm91dmVhdTogUXVldWUgaHBkX3dvcmsgb24gKHJ1bnRpbWUpCnJlc3VtZSIp IGNvbW1pdCBsb2cgc2F5czoKCiAgV2UgbmVlZCB0byBjYWxsIGRybV9oZWxwZXJfaHBkX2lycV9l dmVudCgpIG9uIHJlc3VtZSB0byBwcm9wZXJseQogIGRldGVjdCBtb25pdG9yIGNvbm5lY3Rpb24g LyBkaXNjb25uZWN0aW9uIG9uIHNvbWUgbGFwdG9wcywgdXNlCiAgaHBkX3dvcmsgZm9yIHRoaXMg dG8gYXZvaWQgZGVhZGxvY2tzLgoKVGhlIHNpdHVhdGlvbiBvZiBhIG1vbml0b3IgYmVpbmcgY29u bmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCBkdXJpbmcKc3VzcGVuZCBjYW4gaGFwcGVuIHRvICphbnkq IEdQVSwgYnV0IHRoZSBjb21taXQgb25seSBjaGFuZ2VzIG5vdXZlYXUsCndoaWNoIG9mIGNvdXJz ZSByYWlzZXMgdGhlIHF1ZXN0aW9uIG9mIGhvdyB3ZSBkZWFsIHdpdGggdGhhdCBpbiBvdGhlcgpk cml2ZXJzLiAgSWYgdGhlIE52aWRpYSBHUFUgaGFzIHNvbWUgdW5pcXVlIGJlaGF2aW9yIHJlbGF0 ZWQgdG8KbW9uaXRvciBjb25uZWN0aW9uLCB0aGF0IHdvdWxkIGV4cGxhaW4gc3BlY2lhbC1jYXNl IGNvZGUgdGhlcmUsIGJ1dAp0aGUgY29tbWl0IGRvZXNuJ3QgbWVudGlvbiBhbnl0aGluZyBsaWtl IHRoYXQuCgpJdCBzaG91bGQgYmUgc2ltcGxlIHRvIHJldmVydCAwYjJmZTY1OTRmYTIgYW5kIHNl ZSB3aGV0aGVyIGl0IGNoYW5nZXMKdGhlIGJlaGF2aW9yIGF0IGFsbCAod2VsbCwgc2ltcGxlIGV4 Y2VwdCBmb3IgdGhlIGZhY3QgdGhhdCB0aGlzCnByb2JsZW0gaXNuJ3QgMTAwJSByZXByb2R1Y2li bGUgaW4gdGhlIGZpcnN0IHBsYWNlKS4KCj4gRG8gd2Ugd2FudCB0byBoYXZlIHRoaXMgZGlzY3Vz c2lvbiBvbiB0aGUgYnogYnR3LCBvciBpcyB0aGlzIGVtYWlsCj4gdGhyZWFkIGZpbmU/CgpFbWFp bCBpcyBmaW5lLgoKPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2 ZWF1X2Rpc3BsYXkuYwo+ID4gYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3Bs YXkuYwo+ID4gaW5kZXggNTVjMGZhNDUxMTYzLi5lNTA4MDYwMTJkNDEgMTAwNjQ0Cj4gPiAtLS0g YS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYwo+ID4gKysrIGIvZHJp dmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kaXNwbGF5LmMKPiA+IEBAIC0zNTAsNiArMzUw LDcgQEAgbm91dmVhdV9kaXNwbGF5X2hwZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykK PiA+ICAKPiA+ICAJcG1fcnVudGltZV9nZXRfc3luYyhkcm0tPmRldi0+ZGV2KTsKPiA+ICAKPiA+ ICsJbXNsZWVwKDIwMDApOwo+ID4gIAlkcm1faGVscGVyX2hwZF9pcnFfZXZlbnQoZHJtLT5kZXYp Owo+ID4gIAo+ID4gIAlwbV9ydW50aW1lX21hcmtfbGFzdF9idXN5KGRybS0+ZGV2LT5kZXYpOwo+ ID4gCj4gPiAKPiA+IAo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25v dXZlYXVfZHJtLmMKPiA+IGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcm0uYwo+ ID4gaW5kZXggNTAyMDI2NWJmYmQ5Li40OGRhNzJjYWEwMTcgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2 ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jCj4gPiArKysgYi9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9ub3V2ZWF1X2RybS5jCj4gPiBAQCAtOTQ2LDkgKzk0Niw2IEBAIG5vdXZlYXVf cG1vcHNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ID4gIAludmlmX21hc2so JmRldmljZS0+b2JqZWN0LCAweDA4ODQ4OCwgKDEgPDwgMjUpLCAoMSA8PCAyNSkpOwo+ID4gIAlk cm1fZGV2LT5zd2l0Y2hfcG93ZXJfc3RhdGUgPSBEUk1fU1dJVENIX1BPV0VSX09OOwo+ID4gIAo+ ID4gLQkvKiBNb25pdG9ycyBtYXkgaGF2ZSBiZWVuIGNvbm5lY3RlZCAvIGRpc2Nvbm5lY3RlZCBk dXJpbmcgc3VzcGVuZCAqLwo+ID4gLQlzY2hlZHVsZV93b3JrKCZub3V2ZWF1X2RybShkcm1fZGV2 KS0+aHBkX3dvcmspOwo+ID4gLQo+ID4gIAlyZXR1cm4gcmV0Owo+ID4gIH0KPiA+ICAKPiAtLSAK PiBDaGVlcnMsCj4gCUx5dWRlIFBhdWwKPiAKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KTm91dmVhdSBtYWlsaW5nIGxpc3QKTm91dmVhdUBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9ub3V2ZWF1