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,URIBL_BLOCKED,USER_AGENT_SANE_1 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 9A3ECC74A36 for ; Wed, 10 Jul 2019 22:47:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 640BD21537 for ; Wed, 10 Jul 2019 22:47:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1562798841; bh=/i3JxqJDDtwq8v2QHqOwjTHnPWZUNPKzkFPSlQoJ2VI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:List-ID:From; b=DtzzOHI7GQwcvtO4UlV1OpW0EpP8mER+4EnRyFr5HXk7gFKjXGjFINc/EF5a0mR1L HVxCEbersj6CpNlxNMBxs/3CnTy0Bsz7XHyJBcTfF3rkRXFz+HCLKMznXe96+G1vdt kkATbo6PXY0+yRndL3P5k/BbdqoZOHk657d3l6kA= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727514AbfGJWrU (ORCPT ); Wed, 10 Jul 2019 18:47:20 -0400 Received: from mail.kernel.org ([198.145.29.99]:44300 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726708AbfGJWrU (ORCPT ); Wed, 10 Jul 2019 18:47:20 -0400 Received: from localhost (98.sub-174-234-128.myvzw.com [174.234.128.98]) (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 94FAF20665; Wed, 10 Jul 2019 22:47:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1562798839; bh=/i3JxqJDDtwq8v2QHqOwjTHnPWZUNPKzkFPSlQoJ2VI=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=MudOyC79oCFsyRrwzgUoVz4WElVZmZSZJ/nRJGSzUPOd+3hNvuizbpPZ+Zq/ip9/h 1J3O7EGzSwuIUmSFqbByGSrMlwHJgtDiux3P/1xjOfoQD80g4mKpt8mt8vOqxDLW7z BDR6p8685TUdrTDx6lKQBlFAluFPbFv+eTjh5pEc= Date: Wed, 10 Jul 2019 17:47:16 -0500 From: Bjorn Helgaas To: Daniel Drake Cc: linux-pci@vger.kernel.org, linux@endlessm.com, nouveau@lists.freedesktop.org, lukas@wunner.de, aplattner@nvidia.com, peter@lekensteyn.nl, imirkin@alum.mit.edu, kherbst@redhat.com, hhfeuer@gmx.de Subject: Re: [PATCH v2] PCI: Expose hidden NVIDIA HDA controllers Message-ID: <20190710224716.GD35486@google.com> References: <20190708051744.24039-1-drake@endlessm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190708051744.24039-1-drake@endlessm.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 Mon, Jul 08, 2019 at 01:17:44PM +0800, Daniel Drake wrote: > From: Lukas Wunner > > The integrated HDA controller on Nvidia GPUs can be hidden with a bit in > the GPU's config space. Information about this scheme was provided by > NVIDIA on their forums. > > Many laptops now ship with this device hidden, meaning that Linux users > of affected platforms (where the HDMI connector comes off the NVIDIA GPU) > cannot use HDMI audio functionality. > > Some platforms have ACPI DSDT code that will make the device visible if > the HDMI cable was connected at boot time, but this does not handle the > hotplug case, and this limitation has also been confirmed under Windows. > > Avoid this issue by exposing the HDMI audio device on device enumeration > and resume. > > The GPU and HDA controller are two functions of the same PCI device > (VGA class device on function 0 and audio device on function 1). > The multifunction flag in the GPU's Header Type register is cleared when > the HDA controller is hidden and set if it's exposed, so reread the flag > after exposing the HDA. > > According to Ilia Mirkin, the HDA controller is only present on GPUs with > PCI ID values from MCP89's onwards, so do not touch config space on older > GPUs. > > This quirk is limited to NVIDIA PCI devices with the VGA Controller > device class. This is expected to correspond to product configurations > where the NVIDIA GPU has connectors attached. Other products where the > device class is 3D Controller are expected to correspond to configurations > where the NVIDIA GPU is dedicated (dGPU) and has no connectors. > > It's sensible to avoid exposing the HDA controller on dGPU setups, > especially because we've seen cases where the PCI BARs are not set > up correctly by the platform in this case, causing Linux to log > errors if the device is visible. This assumption of device class > accurately corresponding to product configuration is true for 6 of 6 > laptops recently checked at the Endless lab, and there are also signs of > agreement checking the data from 74 previously tested products, however > Ilia Mirkin comments that he's seen cases where it is not true. Anyway, it > looks like this quirk should fix audio support for the majority of > affected users. > > This commit takes inspiration from an earlier patch by Daniel Drake. > > Link: https://devtalk.nvidia.com/default/topic/1024022 > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75985 > Cc: Aaron Plattner > Cc: Peter Wu > Cc: Ilia Mirkin > Cc: Karol Herbst > Cc: Maik Freudenberg > Signed-off-by: Lukas Wunner > Signed-off-by: Daniel Drake I applied this (slightly revised as below) to pci/misc and I think we can still squeeze it in for v5.3. My revisions: - Don't write the enable bit if it's already set. - Log a note when enabling the HDA. I don't like writing undocumented config bits in *every* current and future NVIDIA GPU, so the note is just a hint that we're doing something slightly risky. - Use "hdr_type & 0x80" to match the other places we set pdev->multifunction. - Remove the commit log parts that don't seem relevant for future maintenance and add the URL to the original posting. Let me know if I broke anything. commit b678f90a1a6f Author: Lukas Wunner Date: Mon Jul 8 13:17:44 2019 +0800 PCI: Enable NVIDIA HDA controllers Many NVIDIA GPUs can be configured as either a single-function video device or a multi-function device with video at function 0 and an HDA audio controller at function 1. The HDA controller can be enabled or disabled by a bit in the function 0 config space. Some BIOSes leave the HDA disabled, which means the HDMI connector from the NVIDIA GPU may not work. Sometimes the BIOS enables the HDA if an HDMI cable is connected at boot time, but that doesn't handle hotplug cases. Enable the HDA controller on device enumeration and resume and re-read the header type, which tells us whether the GPU is a multi-function device. This quirk is limited to NVIDIA PCI devices with the VGA Controller device class. This is expected to correspond to product configurations where the NVIDIA GPU has connectors attached. Other products where the device class is 3D Controller are expected to correspond to configurations where the NVIDIA GPU is dedicated (dGPU) and has no connectors. See original post (URL below) for more details. This commit takes inspiration from an earlier patch by Daniel Drake. Link: https://lore.kernel.org/r/20190708051744.24039-1-drake@endlessm.com Link: https://devtalk.nvidia.com/default/topic/1024022 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=75985 Signed-off-by: Lukas Wunner Signed-off-by: Daniel Drake [bhelgaas: commit log, log message, return early if already enabled] Signed-off-by: Bjorn Helgaas Cc: Aaron Plattner Cc: Peter Wu Cc: Ilia Mirkin Cc: Karol Herbst Cc: Maik Freudenberg diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index c66c0ca446c4..208aacf39329 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -5011,6 +5011,36 @@ DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_CLASS_SERIAL_UNKNOWN, 8, quirk_gpu_usb_typec_ucsi); +/* + * Enable the NVIDIA GPU integrated HDA controller if the BIOS left it + * disabled. https://devtalk.nvidia.com/default/topic/1024022 + */ +static void quirk_nvidia_hda(struct pci_dev *gpu) +{ + u8 hdr_type; + u32 val; + + /* There was no integrated HDA controller before MCP89 */ + if (gpu->device < PCI_DEVICE_ID_NVIDIA_GEFORCE_320M) + return; + + /* Bit 25 at offset 0x488 enables the HDA controller */ + pci_read_config_dword(gpu, 0x488, &val); + if (val & BIT(25)) + return; + + pci_info(gpu, "Enabling HDA controller\n"); + pci_write_config_dword(gpu, 0x488, val | BIT(25)); + + /* The GPU becomes a multi-function device when the HDA is enabled */ + pci_read_config_byte(gpu, PCI_HEADER_TYPE, &hdr_type); + gpu->multifunction = !!(hdr_type & 0x80); +} +DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, + PCI_BASE_CLASS_DISPLAY, 16, quirk_nvidia_hda); +DECLARE_PCI_FIXUP_CLASS_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, + PCI_BASE_CLASS_DISPLAY, 16, quirk_nvidia_hda); + /* * Some IDT switches incorrectly flag an ACS Source Validation error on * completions for config read requests even though PCIe r4.0, sec diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index 70e86148cb1e..66898463b81f 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h @@ -1336,6 +1336,7 @@ #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP78S_SMBUS 0x0752 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP77_IDE 0x0759 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP73_SMBUS 0x07D8 +#define PCI_DEVICE_ID_NVIDIA_GEFORCE_320M 0x08A0 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP79_SMBUS 0x0AA2 #define PCI_DEVICE_ID_NVIDIA_NFORCE_MCP89_SATA 0x0D85 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bjorn Helgaas Subject: Re: [PATCH v2] PCI: Expose hidden NVIDIA HDA controllers Date: Wed, 10 Jul 2019 17:47:16 -0500 Message-ID: <20190710224716.GD35486@google.com> References: <20190708051744.24039-1-drake@endlessm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <20190708051744.24039-1-drake-6IF/jdPJHihWk0Htik3J/w@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Daniel Drake Cc: aplattner-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, hhfeuer-Mmb7MZpHnFY@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-6IF/jdPJHihWk0Htik3J/w@public.gmane.org List-Id: nouveau.vger.kernel.org T24gTW9uLCBKdWwgMDgsIDIwMTkgYXQgMDE6MTc6NDRQTSArMDgwMCwgRGFuaWVsIERyYWtlIHdy b3RlOgo+IEZyb206IEx1a2FzIFd1bm5lciA8bHVrYXNAd3VubmVyLmRlPgo+IAo+IFRoZSBpbnRl Z3JhdGVkIEhEQSBjb250cm9sbGVyIG9uIE52aWRpYSBHUFVzIGNhbiBiZSBoaWRkZW4gd2l0aCBh IGJpdCBpbgo+IHRoZSBHUFUncyBjb25maWcgc3BhY2UuIEluZm9ybWF0aW9uIGFib3V0IHRoaXMg c2NoZW1lIHdhcyBwcm92aWRlZCBieQo+IE5WSURJQSBvbiB0aGVpciBmb3J1bXMuCj4gCj4gTWFu eSBsYXB0b3BzIG5vdyBzaGlwIHdpdGggdGhpcyBkZXZpY2UgaGlkZGVuLCBtZWFuaW5nIHRoYXQg TGludXggdXNlcnMKPiBvZiBhZmZlY3RlZCBwbGF0Zm9ybXMgKHdoZXJlIHRoZSBIRE1JIGNvbm5l Y3RvciBjb21lcyBvZmYgdGhlIE5WSURJQSBHUFUpCj4gY2Fubm90IHVzZSBIRE1JIGF1ZGlvIGZ1 bmN0aW9uYWxpdHkuCj4gCj4gU29tZSBwbGF0Zm9ybXMgaGF2ZSBBQ1BJIERTRFQgY29kZSB0aGF0 IHdpbGwgbWFrZSB0aGUgZGV2aWNlIHZpc2libGUgaWYKPiB0aGUgSERNSSBjYWJsZSB3YXMgY29u bmVjdGVkIGF0IGJvb3QgdGltZSwgYnV0IHRoaXMgZG9lcyBub3QgaGFuZGxlIHRoZQo+IGhvdHBs dWcgY2FzZSwgYW5kIHRoaXMgbGltaXRhdGlvbiBoYXMgYWxzbyBiZWVuIGNvbmZpcm1lZCB1bmRl ciBXaW5kb3dzLgo+IAo+IEF2b2lkIHRoaXMgaXNzdWUgYnkgZXhwb3NpbmcgdGhlIEhETUkgYXVk aW8gZGV2aWNlIG9uIGRldmljZSBlbnVtZXJhdGlvbgo+IGFuZCByZXN1bWUuCj4gCj4gVGhlIEdQ VSBhbmQgSERBIGNvbnRyb2xsZXIgYXJlIHR3byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgUENJIGRl dmljZQo+IChWR0EgY2xhc3MgZGV2aWNlIG9uIGZ1bmN0aW9uIDAgYW5kIGF1ZGlvIGRldmljZSBv biBmdW5jdGlvbiAxKS4KPiBUaGUgbXVsdGlmdW5jdGlvbiBmbGFnIGluIHRoZSBHUFUncyBIZWFk ZXIgVHlwZSByZWdpc3RlciBpcyBjbGVhcmVkIHdoZW4KPiB0aGUgSERBIGNvbnRyb2xsZXIgaXMg aGlkZGVuIGFuZCBzZXQgaWYgaXQncyBleHBvc2VkLCBzbyByZXJlYWQgdGhlIGZsYWcKPiBhZnRl ciBleHBvc2luZyB0aGUgSERBLgo+IAo+IEFjY29yZGluZyB0byBJbGlhIE1pcmtpbiwgdGhlIEhE QSBjb250cm9sbGVyIGlzIG9ubHkgcHJlc2VudCBvbiBHUFVzIHdpdGgKPiBQQ0kgSUQgdmFsdWVz IGZyb20gTUNQODkncyBvbndhcmRzLCBzbyBkbyBub3QgdG91Y2ggY29uZmlnIHNwYWNlIG9uIG9s ZGVyCj4gR1BVcy4KPiAKPiBUaGlzIHF1aXJrIGlzIGxpbWl0ZWQgdG8gTlZJRElBIFBDSSBkZXZp Y2VzIHdpdGggdGhlIFZHQSBDb250cm9sbGVyCj4gZGV2aWNlIGNsYXNzLiBUaGlzIGlzIGV4cGVj dGVkIHRvIGNvcnJlc3BvbmQgdG8gcHJvZHVjdCBjb25maWd1cmF0aW9ucwo+IHdoZXJlIHRoZSBO VklESUEgR1BVIGhhcyBjb25uZWN0b3JzIGF0dGFjaGVkLiBPdGhlciBwcm9kdWN0cyB3aGVyZSB0 aGUKPiBkZXZpY2UgY2xhc3MgaXMgM0QgQ29udHJvbGxlciBhcmUgZXhwZWN0ZWQgdG8gY29ycmVz cG9uZCB0byBjb25maWd1cmF0aW9ucwo+IHdoZXJlIHRoZSBOVklESUEgR1BVIGlzIGRlZGljYXRl ZCAoZEdQVSkgYW5kIGhhcyBubyBjb25uZWN0b3JzLgo+IAo+IEl0J3Mgc2Vuc2libGUgdG8gYXZv aWQgZXhwb3NpbmcgdGhlIEhEQSBjb250cm9sbGVyIG9uIGRHUFUgc2V0dXBzLAo+IGVzcGVjaWFs bHkgYmVjYXVzZSB3ZSd2ZSBzZWVuIGNhc2VzIHdoZXJlIHRoZSBQQ0kgQkFScyBhcmUgbm90IHNl dAo+IHVwIGNvcnJlY3RseSBieSB0aGUgcGxhdGZvcm0gaW4gdGhpcyBjYXNlLCBjYXVzaW5nIExp bnV4IHRvIGxvZwo+IGVycm9ycyBpZiB0aGUgZGV2aWNlIGlzIHZpc2libGUuIFRoaXMgYXNzdW1w dGlvbiBvZiBkZXZpY2UgY2xhc3MKPiBhY2N1cmF0ZWx5IGNvcnJlc3BvbmRpbmcgdG8gcHJvZHVj dCBjb25maWd1cmF0aW9uIGlzIHRydWUgZm9yIDYgb2YgNgo+IGxhcHRvcHMgcmVjZW50bHkgY2hl Y2tlZCBhdCB0aGUgRW5kbGVzcyBsYWIsIGFuZCB0aGVyZSBhcmUgYWxzbyBzaWducyBvZgo+IGFn cmVlbWVudCBjaGVja2luZyB0aGUgZGF0YSBmcm9tIDc0IHByZXZpb3VzbHkgdGVzdGVkIHByb2R1 Y3RzLCBob3dldmVyCj4gSWxpYSBNaXJraW4gY29tbWVudHMgdGhhdCBoZSdzIHNlZW4gY2FzZXMg d2hlcmUgaXQgaXMgbm90IHRydWUuIEFueXdheSwgaXQKPiBsb29rcyBsaWtlIHRoaXMgcXVpcmsg c2hvdWxkIGZpeCBhdWRpbyBzdXBwb3J0IGZvciB0aGUgbWFqb3JpdHkgb2YKPiBhZmZlY3RlZCB1 c2Vycy4KPiAKPiBUaGlzIGNvbW1pdCB0YWtlcyBpbnNwaXJhdGlvbiBmcm9tIGFuIGVhcmxpZXIg cGF0Y2ggYnkgRGFuaWVsIERyYWtlLgo+IAo+IExpbms6IGh0dHBzOi8vZGV2dGFsay5udmlkaWEu Y29tL2RlZmF1bHQvdG9waWMvMTAyNDAyMgo+IEJ1Z3ppbGxhOiBodHRwczovL2J1Z3MuZnJlZWRl c2t0b3Aub3JnL3Nob3dfYnVnLmNnaT9pZD03NTk4NQo+IENjOiBBYXJvbiBQbGF0dG5lciA8YXBs YXR0bmVyQG52aWRpYS5jb20+Cj4gQ2M6IFBldGVyIFd1IDxwZXRlckBsZWtlbnN0ZXluLm5sPgo+ IENjOiBJbGlhIE1pcmtpbiA8aW1pcmtpbkBhbHVtLm1pdC5lZHU+Cj4gQ2M6IEthcm9sIEhlcmJz dCA8a2hlcmJzdEByZWRoYXQuY29tPgo+IENjOiBNYWlrIEZyZXVkZW5iZXJnIDxoaGZldWVyQGdt eC5kZT4KPiBTaWduZWQtb2ZmLWJ5OiBMdWthcyBXdW5uZXIgPGx1a2FzQHd1bm5lci5kZT4KPiBT aWduZWQtb2ZmLWJ5OiBEYW5pZWwgRHJha2UgPGRyYWtlQGVuZGxlc3NtLmNvbT4KCkkgYXBwbGll ZCB0aGlzIChzbGlnaHRseSByZXZpc2VkIGFzIGJlbG93KSB0byBwY2kvbWlzYyBhbmQgSSB0aGlu ayB3ZQpjYW4gc3RpbGwgc3F1ZWV6ZSBpdCBpbiBmb3IgdjUuMy4KCk15IHJldmlzaW9uczoKCiAg LSBEb24ndCB3cml0ZSB0aGUgZW5hYmxlIGJpdCBpZiBpdCdzIGFscmVhZHkgc2V0LgoKICAtIExv ZyBhIG5vdGUgd2hlbiBlbmFibGluZyB0aGUgSERBLiAgSSBkb24ndCBsaWtlIHdyaXRpbmcKICAg IHVuZG9jdW1lbnRlZCBjb25maWcgYml0cyBpbiAqZXZlcnkqIGN1cnJlbnQgYW5kIGZ1dHVyZSBO VklESUEgR1BVLAogICAgc28gdGhlIG5vdGUgaXMganVzdCBhIGhpbnQgdGhhdCB3ZSdyZSBkb2lu ZyBzb21ldGhpbmcgc2xpZ2h0bHkKICAgIHJpc2t5LgoKICAtIFVzZSAiaGRyX3R5cGUgJiAweDgw IiB0byBtYXRjaCB0aGUgb3RoZXIgcGxhY2VzIHdlIHNldAogICAgcGRldi0+bXVsdGlmdW5jdGlv bi4KCiAgLSBSZW1vdmUgdGhlIGNvbW1pdCBsb2cgcGFydHMgdGhhdCBkb24ndCBzZWVtIHJlbGV2 YW50IGZvciBmdXR1cmUKICAgIG1haW50ZW5hbmNlIGFuZCBhZGQgdGhlIFVSTCB0byB0aGUgb3Jp Z2luYWwgcG9zdGluZy4KCkxldCBtZSBrbm93IGlmIEkgYnJva2UgYW55dGhpbmcuCgpjb21taXQg YjY3OGY5MGExYTZmCkF1dGhvcjogTHVrYXMgV3VubmVyIDxsdWthc0B3dW5uZXIuZGU+CkRhdGU6 ICAgTW9uIEp1bCA4IDEzOjE3OjQ0IDIwMTkgKzA4MDAKCiAgICBQQ0k6IEVuYWJsZSBOVklESUEg SERBIGNvbnRyb2xsZXJzCiAgICAKICAgIE1hbnkgTlZJRElBIEdQVXMgY2FuIGJlIGNvbmZpZ3Vy ZWQgYXMgZWl0aGVyIGEgc2luZ2xlLWZ1bmN0aW9uIHZpZGVvIGRldmljZQogICAgb3IgYSBtdWx0 aS1mdW5jdGlvbiBkZXZpY2Ugd2l0aCB2aWRlbyBhdCBmdW5jdGlvbiAwIGFuZCBhbiBIREEgYXVk aW8KICAgIGNvbnRyb2xsZXIgYXQgZnVuY3Rpb24gMS4gIFRoZSBIREEgY29udHJvbGxlciBjYW4g YmUgZW5hYmxlZCBvciBkaXNhYmxlZCBieQogICAgYSBiaXQgaW4gdGhlIGZ1bmN0aW9uIDAgY29u ZmlnIHNwYWNlLgogICAgCiAgICBTb21lIEJJT1NlcyBsZWF2ZSB0aGUgSERBIGRpc2FibGVkLCB3 aGljaCBtZWFucyB0aGUgSERNSSBjb25uZWN0b3IgZnJvbSB0aGUKICAgIE5WSURJQSBHUFUgbWF5 IG5vdCB3b3JrLiAgU29tZXRpbWVzIHRoZSBCSU9TIGVuYWJsZXMgdGhlIEhEQSBpZiBhbiBIRE1J CiAgICBjYWJsZSBpcyBjb25uZWN0ZWQgYXQgYm9vdCB0aW1lLCBidXQgdGhhdCBkb2Vzbid0IGhh bmRsZSBob3RwbHVnIGNhc2VzLgogICAgCiAgICBFbmFibGUgdGhlIEhEQSBjb250cm9sbGVyIG9u IGRldmljZSBlbnVtZXJhdGlvbiBhbmQgcmVzdW1lIGFuZCByZS1yZWFkIHRoZQogICAgaGVhZGVy IHR5cGUsIHdoaWNoIHRlbGxzIHVzIHdoZXRoZXIgdGhlIEdQVSBpcyBhIG11bHRpLWZ1bmN0aW9u IGRldmljZS4KICAgIAogICAgVGhpcyBxdWlyayBpcyBsaW1pdGVkIHRvIE5WSURJQSBQQ0kgZGV2 aWNlcyB3aXRoIHRoZSBWR0EgQ29udHJvbGxlciBkZXZpY2UKICAgIGNsYXNzLiAgVGhpcyBpcyBl eHBlY3RlZCB0byBjb3JyZXNwb25kIHRvIHByb2R1Y3QgY29uZmlndXJhdGlvbnMgd2hlcmUgdGhl CiAgICBOVklESUEgR1BVIGhhcyBjb25uZWN0b3JzIGF0dGFjaGVkLiAgT3RoZXIgcHJvZHVjdHMg d2hlcmUgdGhlIGRldmljZSBjbGFzcwogICAgaXMgM0QgQ29udHJvbGxlciBhcmUgZXhwZWN0ZWQg dG8gY29ycmVzcG9uZCB0byBjb25maWd1cmF0aW9ucyB3aGVyZSB0aGUKICAgIE5WSURJQSBHUFUg aXMgZGVkaWNhdGVkIChkR1BVKSBhbmQgaGFzIG5vIGNvbm5lY3RvcnMuICBTZWUgb3JpZ2luYWwg cG9zdAogICAgKFVSTCBiZWxvdykgZm9yIG1vcmUgZGV0YWlscy4KICAgIAogICAgVGhpcyBjb21t aXQgdGFrZXMgaW5zcGlyYXRpb24gZnJvbSBhbiBlYXJsaWVyIHBhdGNoIGJ5IERhbmllbCBEcmFr ZS4KICAgIAogICAgTGluazogaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDE5MDcwODA1MTc0 NC4yNDAzOS0xLWRyYWtlQGVuZGxlc3NtLmNvbQogICAgTGluazogaHR0cHM6Ly9kZXZ0YWxrLm52 aWRpYS5jb20vZGVmYXVsdC90b3BpYy8xMDI0MDIyCiAgICBCdWd6aWxsYTogaHR0cHM6Ly9idWdz LmZyZWVkZXNrdG9wLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzU5ODUKICAgIFNpZ25lZC1vZmYtYnk6 IEx1a2FzIFd1bm5lciA8bHVrYXNAd3VubmVyLmRlPgogICAgU2lnbmVkLW9mZi1ieTogRGFuaWVs IERyYWtlIDxkcmFrZUBlbmRsZXNzbS5jb20+CiAgICBbYmhlbGdhYXM6IGNvbW1pdCBsb2csIGxv ZyBtZXNzYWdlLCByZXR1cm4gZWFybHkgaWYgYWxyZWFkeSBlbmFibGVkXQogICAgU2lnbmVkLW9m Zi1ieTogQmpvcm4gSGVsZ2FhcyA8YmhlbGdhYXNAZ29vZ2xlLmNvbT4KICAgIENjOiBBYXJvbiBQ bGF0dG5lciA8YXBsYXR0bmVyQG52aWRpYS5jb20+CiAgICBDYzogUGV0ZXIgV3UgPHBldGVyQGxl a2Vuc3RleW4ubmw+CiAgICBDYzogSWxpYSBNaXJraW4gPGltaXJraW5AYWx1bS5taXQuZWR1Pgog ICAgQ2M6IEthcm9sIEhlcmJzdCA8a2hlcmJzdEByZWRoYXQuY29tPgogICAgQ2M6IE1haWsgRnJl dWRlbmJlcmcgPGhoZmV1ZXJAZ214LmRlPgoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3F1aXJr cy5jIGIvZHJpdmVycy9wY2kvcXVpcmtzLmMKaW5kZXggYzY2YzBjYTQ0NmM0Li4yMDhhYWNmMzkz MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3F1aXJrcy5jCisrKyBiL2RyaXZlcnMvcGNpL3F1 aXJrcy5jCkBAIC01MDExLDYgKzUwMTEsMzYgQEAgREVDTEFSRV9QQ0lfRklYVVBfQ0xBU1NfRklO QUwoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9BTllfSUQsCiAJCQkgICAgICBQQ0lfQ0xBU1Nf U0VSSUFMX1VOS05PV04sIDgsCiAJCQkgICAgICBxdWlya19ncHVfdXNiX3R5cGVjX3Vjc2kpOwog CisvKgorICogRW5hYmxlIHRoZSBOVklESUEgR1BVIGludGVncmF0ZWQgSERBIGNvbnRyb2xsZXIg aWYgdGhlIEJJT1MgbGVmdCBpdAorICogZGlzYWJsZWQuICBodHRwczovL2RldnRhbGsubnZpZGlh LmNvbS9kZWZhdWx0L3RvcGljLzEwMjQwMjIKKyAqLworc3RhdGljIHZvaWQgcXVpcmtfbnZpZGlh X2hkYShzdHJ1Y3QgcGNpX2RldiAqZ3B1KQoreworCXU4IGhkcl90eXBlOworCXUzMiB2YWw7CisK KwkvKiBUaGVyZSB3YXMgbm8gaW50ZWdyYXRlZCBIREEgY29udHJvbGxlciBiZWZvcmUgTUNQODkg Ki8KKwlpZiAoZ3B1LT5kZXZpY2UgPCBQQ0lfREVWSUNFX0lEX05WSURJQV9HRUZPUkNFXzMyME0p CisJCXJldHVybjsKKworCS8qIEJpdCAyNSBhdCBvZmZzZXQgMHg0ODggZW5hYmxlcyB0aGUgSERB IGNvbnRyb2xsZXIgKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZ3B1LCAweDQ4OCwgJnZhbCk7 CisJaWYgKHZhbCAmIEJJVCgyNSkpCisJCXJldHVybjsKKworCXBjaV9pbmZvKGdwdSwgIkVuYWJs aW5nIEhEQSBjb250cm9sbGVyXG4iKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGdwdSwgMHg0 ODgsIHZhbCB8IEJJVCgyNSkpOworCisJLyogVGhlIEdQVSBiZWNvbWVzIGEgbXVsdGktZnVuY3Rp b24gZGV2aWNlIHdoZW4gdGhlIEhEQSBpcyBlbmFibGVkICovCisJcGNpX3JlYWRfY29uZmlnX2J5 dGUoZ3B1LCBQQ0lfSEVBREVSX1RZUEUsICZoZHJfdHlwZSk7CisJZ3B1LT5tdWx0aWZ1bmN0aW9u ID0gISEoaGRyX3R5cGUgJiAweDgwKTsKK30KK0RFQ0xBUkVfUENJX0ZJWFVQX0NMQVNTX0hFQURF UihQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0FOWV9JRCwKKwkJCSAgICAgICBQQ0lfQkFTRV9D TEFTU19ESVNQTEFZLCAxNiwgcXVpcmtfbnZpZGlhX2hkYSk7CitERUNMQVJFX1BDSV9GSVhVUF9D TEFTU19SRVNVTUVfRUFSTFkoUENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9BTllfSUQsCisJCQkg ICAgICAgUENJX0JBU0VfQ0xBU1NfRElTUExBWSwgMTYsIHF1aXJrX252aWRpYV9oZGEpOworCiAv KgogICogU29tZSBJRFQgc3dpdGNoZXMgaW5jb3JyZWN0bHkgZmxhZyBhbiBBQ1MgU291cmNlIFZh bGlkYXRpb24gZXJyb3Igb24KICAqIGNvbXBsZXRpb25zIGZvciBjb25maWcgcmVhZCByZXF1ZXN0 cyBldmVuIHRob3VnaCBQQ0llIHI0LjAsIHNlYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9w Y2lfaWRzLmggYi9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaAppbmRleCA3MGU4NjE0OGNiMWUuLjY2 ODk4NDYzYjgxZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5j bHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTEzMzYsNiArMTMzNiw3IEBACiAjZGVmaW5lIFBDSV9E RVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3OFNfU01CVVMgICAgMHgwNzUyCiAjZGVmaW5lIFBD SV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3N19JREUgICAgICAgMHgwNzU5CiAjZGVmaW5l IFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3M19TTUJVUyAgICAgMHgwN0Q4CisjZGVm aW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX0dFRk9SQ0VfMzIwTSAgICAgICAgICAgMHgwOEEwCiAj ZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A3OV9TTUJVUyAgICAgMHgwQUEy CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTlZJRElBX05GT1JDRV9NQ1A4OV9TQVRBCSAgICAweDBE ODUKIApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpOb3V2 ZWF1IG1haWxpbmcgbGlzdApOb3V2ZWF1QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xp c3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL25vdXZlYXU=