* [PATCH v2 0/3] Reset Apple AirPort card @ 2016-06-12 10:31 Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner ` (2 more replies) 0 siblings, 3 replies; 12+ messages in thread From: Lukas Wunner @ 2016-06-12 10:31 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Bjorn Helgaas, Yinghai Lu Reset Apple AirPort card v2 Browsable on GitHub with green/red highlighting: https://github.com/l1k/linux/commits/airport_reset_v2 Link to v1: https://lkml.org/lkml/2016/5/28/163 Changes since v1: - Validate secondary bus number (Yinghai Lu) - Move amendment of nvidia_bugs quirk and scanning of secondary buses to separate patch to allow for easier reviewing, bisecting and reverting (Bjorn Helgaas) - Spell out reason for resetting the AirPort card in pr_info() message (Bjorn Helgaas) - Add dev_err() macro to emulate message format of PCI core (Bjorn Helgaas) - Remove line breaks in read/write_pci_config_16() (Ingo Molnar) Lukas Wunner (3): x86/quirks: Apply nvidia_bugs quirk only on root bus x86/quirks: Reintroduce scanning of secondary buses x86/quirks: Add early quirk to reset Apple AirPort card arch/x86/kernel/early-quirks.c | 98 ++++++++++++++++++++++++++++++++++++------ drivers/bcma/bcma_private.h | 2 - include/linux/bcma/bcma.h | 1 + 3 files changed, 86 insertions(+), 15 deletions(-) -- 2.8.1 ^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 10:31 [PATCH v2 0/3] Reset Apple AirPort card Lukas Wunner @ 2016-06-12 10:31 ` Lukas Wunner 2016-06-12 11:49 ` Ingo Molnar 2016-07-10 19:01 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 2/3] x86/quirks: Reintroduce scanning of secondary buses Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 1/3] x86/quirks: Apply nvidia_bugs quirk only on root bus Lukas Wunner 2 siblings, 2 replies; 12+ messages in thread From: Lukas Wunner @ 2016-06-12 10:31 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Bjorn Helgaas, Yinghai Lu The EFI firmware on Macs contains a full-fledged network stack for downloading OS X images from osrecovery.apple.com. Unfortunately on Macs introduced 2011 and 2012, EFI brings up the Broadcom 4331 wireless card on every boot and leaves it enabled even after ExitBootServices has been called. The card continues to assert its IRQ line, causing spurious interrupts if the IRQ is shared. It also corrupts memory by DMAing received packets, allowing for remote code execution over the air. This only stops when a driver is loaded for the wireless card, which may be never if the driver is not installed or blacklisted. The issue seems to be constrained to the Broadcom 4331. Chris Milsted has verified that the newer Broadcom 4360 built into the MacBookPro11,3 (2013/2014) does not exhibit this behaviour. The chances that Apple will ever supply a firmware fix for the older machines appear to be zero. The solution is to reset the card on boot by writing to a reset bit in its mmio space. This must be done as an early quirk and not as a plain vanilla PCI quirk to successfully combat memory corruption by DMAed packets: Matthew Garrett found out in 2012 that the packets are written to EfiBootServicesData memory (http://mjg59.dreamwidth.org/11235.html). This type of memory is made available to the page allocator by efi_free_boot_services(). Plain vanilla PCI quirks run much later, in subsys initcall level. In-between a time window would be open for memory corruption. Random crashes occurring in this time window and attributed to DMAed packets have indeed been observed in the wild by Chris Bainbridge. When Matthew Garrett analyzed the memory corruption issue in 2012, he sought to fix it with a grub quirk which transitions the card to D3hot: http://git.savannah.gnu.org/cgit/grub.git/commit/?id=9d34bb85da56 This approach does not help users with other bootloaders and while it may prevent DMAed packets, it does not cure the spurious interrupts emanating from the card. Unfortunately the card's mmio space is inaccessible in D3hot, so to reset it, we have to undo the effect of Matthew's grub patch and transition the card back to D0. Note that the quirk takes a few shortcuts to reduce the amount of code: The size of BAR 0 and the location of the PM capability is identical on all affected machines and therefore hardcoded. Only the address of BAR 0 differs between models. Also, it is assumed that the BCMA core currently mapped is the 802.11 core. The EFI driver seems to always take care of this. Michael Büsch, Bjorn Helgaas and Matt Fleming contributed feedback towards finding the best solution to this problem. The following should be a comprehensive list of affected models: iMac13,1 2012 21.5" [Root Port 00:1c.3 = 8086:1e16] iMac13,2 2012 27" [Root Port 00:1c.3 = 8086:1e16] Macmini5,1 2011 i5 2.3 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini5,2 2011 i5 2.5 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini5,3 2011 i7 2.0 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini6,1 2012 i5 2.5 GHz [Root Port 00:1c.1 = 8086:1e12] Macmini6,2 2012 i7 2.3 GHz [Root Port 00:1c.1 = 8086:1e12] MacBookPro8,1 2011 13" [Root Port 00:1c.1 = 8086:1c12] MacBookPro8,2 2011 15" [Root Port 00:1c.1 = 8086:1c12] MacBookPro8,3 2011 17" [Root Port 00:1c.1 = 8086:1c12] MacBookPro9,1 2012 15" [Root Port 00:1c.1 = 8086:1e12] MacBookPro9,2 2012 13" [Root Port 00:1c.1 = 8086:1e12] MacBookPro10,1 2012 15" [Root Port 00:1c.1 = 8086:1e12] MacBookPro10,2 2012 13" [Root Port 00:1c.1 = 8086:1e12] For posterity, spurious interrupts caused by the Broadcom 4331 wireless card resulted in splats like this (stacktrace omitted): irq 17: nobody cared (try booting with the "irqpoll" option) handlers: [<ffffffff81374370>] pcie_isr [<ffffffffc0704550>] sdhci_irq [sdhci] threaded [<ffffffffc07013c0>] sdhci_thread_irq [sdhci] [<ffffffffc0a0b960>] azx_interrupt [snd_hda_codec] Disabling IRQ #17 Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=79301 Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111781 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=728916 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=895951#c16 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1009819 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1098621 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1149632#c5 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1279130 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1332732 Tested-by: Konstantin Simanov <k.simanov@stlk.ru> # [MacBookPro8,1] Tested-by: Lukas Wunner <lukas@wunner.de> # [MacBookPro9,1] Tested-by: Bryan Paradis <bryan.paradis@gmail.com> # [MacBookPro9,2] Tested-by: Andrew Worsley <amworsley@gmail.com> # [MacBookPro10,1] Tested-by: Chris Bainbridge <chris.bainbridge@gmail.com> # [MacBookPro10,2] Signed-off-by: Lukas Wunner <lukas@wunner.de> Acked-by: Rafał Miłecki <zajec5@gmail.com> Acked-by: Matt Fleming <matt@codeblueprint.co.uk> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Chris Milsted <cmilsted@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Michael Buesch <m@bues.ch> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: b43-dev@lists.infradead.org Cc: linux-pci@vger.kernel.org Cc: linux-wireless@vger.kernel.org Cc: stable@vger.kernel.org # 123456789abc: x86/quirks: Apply nvidia_bugs quirk only on root bus Cc: stable@vger.kernel.org # 123456789abc: x86/quirks: Reintroduce scanning of secondary buses Cc: stable@vger.kernel.org --- v2: - Move amendment of nvidia_bugs quirk and scanning of secondary buses to separate patch to allow for easier reviewing, bisecting and reverting (Bjorn Helgaas) - Spell out reason for resetting the AirPort card in pr_info() message (Bjorn Helgaas) - Add dev_err() macro to emulate message format of PCI core (Bjorn Helgaas) - Remove line breaks in read/write_pci_config_16() (Ingo Molnar) arch/x86/kernel/early-quirks.c | 57 ++++++++++++++++++++++++++++++++++++++++++ drivers/bcma/bcma_private.h | 2 -- include/linux/bcma/bcma.h | 1 + 3 files changed, 58 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index ea60c05..c23fb76 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -11,7 +11,11 @@ #include <linux/pci.h> #include <linux/acpi.h> +#include <linux/delay.h> +#include <linux/dmi.h> #include <linux/pci_ids.h> +#include <linux/bcma/bcma.h> +#include <linux/bcma/bcma_regs.h> #include <drm/i915_drm.h> #include <asm/pci-direct.h> #include <asm/dma.h> @@ -21,6 +25,9 @@ #include <asm/iommu.h> #include <asm/gart.h> #include <asm/irq_remapping.h> +#include <asm/early_ioremap.h> + +#define dev_err(msg) pr_err("pci 0000:%02x:%02x.%d: %s", bus, slot, func, msg) static void __init fix_hypertransport_config(int num, int slot, int func) { @@ -597,6 +604,54 @@ static void __init force_disable_hpet(int num, int slot, int func) #endif } +#define BCM4331_MMIO_SIZE 16384 +#define BCM4331_PM_CAP 0x40 +#define bcma_aread32(reg) ioread32(mmio + 1 * BCMA_CORE_SIZE + reg) +#define bcma_awrite32(reg, val) iowrite32(val, mmio + 1 * BCMA_CORE_SIZE + reg) + +static void __init apple_airport_reset(int bus, int slot, int func) +{ + void __iomem *mmio; + u16 pmcsr; + u64 addr; + int i; + + if (!dmi_match(DMI_SYS_VENDOR, "Apple Inc.")) + return; + + /* Card may have been put into PCI_D3hot by grub quirk */ + pmcsr = read_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL); + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0) { + pmcsr &= ~PCI_PM_CTRL_STATE_MASK; + write_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL, pmcsr); + mdelay(10); + pmcsr = read_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL); + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0) { + dev_err("Cannot power up Apple AirPort card\n"); + return; + } + } + + addr = read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_0); + addr |= (u64)read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_1) << 32; + addr &= PCI_BASE_ADDRESS_MEM_MASK; + mmio = early_ioremap(addr, BCM4331_MMIO_SIZE); + if (!mmio) { + dev_err("Cannot iomap Apple AirPort card\n"); + return; + } + + pr_info("Resetting Apple AirPort card (left enabled by EFI)\n"); + for (i = 0; bcma_aread32(BCMA_RESET_ST) && i < 30; i++) + udelay(10); + bcma_awrite32(BCMA_RESET_CTL, BCMA_RESET_CTL_RESET); + bcma_aread32(BCMA_RESET_CTL); + udelay(1); + bcma_awrite32(BCMA_RESET_CTL, 0); + bcma_aread32(BCMA_RESET_CTL); + udelay(10); + early_iounmap(mmio, BCM4331_MMIO_SIZE); +} #define QFLAG_APPLY_ONCE 0x1 #define QFLAG_APPLIED 0x2 @@ -639,6 +694,8 @@ static struct chipset early_qrk[] __initdata = { */ { PCI_VENDOR_ID_INTEL, 0x0f00, PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, + { PCI_VENDOR_ID_BROADCOM, 0x4331, + PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset}, {} }; diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h index eda0909..f642c42 100644 --- a/drivers/bcma/bcma_private.h +++ b/drivers/bcma/bcma_private.h @@ -8,8 +8,6 @@ #include <linux/bcma/bcma.h> #include <linux/delay.h> -#define BCMA_CORE_SIZE 0x1000 - #define bcma_err(bus, fmt, ...) \ pr_err("bus%d: " fmt, (bus)->num, ##__VA_ARGS__) #define bcma_warn(bus, fmt, ...) \ diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index e6b41f4..3db25df 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -159,6 +159,7 @@ struct bcma_host_ops { #define BCMA_CORE_DEFAULT 0xFFF #define BCMA_MAX_NR_CORES 16 +#define BCMA_CORE_SIZE 0x1000 /* Chip IDs of PCIe devices */ #define BCMA_CHIP_ID_BCM4313 0x4313 -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner @ 2016-06-12 11:49 ` Ingo Molnar 2016-06-12 12:37 ` Lukas Wunner 2016-06-28 13:21 ` Lukas Wunner 2016-07-10 19:01 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 1 sibling, 2 replies; 12+ messages in thread From: Ingo Molnar @ 2016-06-12 11:49 UTC (permalink / raw) To: Lukas Wunner Cc: x86, linux-kernel, Bjorn Helgaas, Yinghai Lu, Matt Fleming, Linus Torvalds, Andrew Morton, Thomas Gleixner, H. Peter Anvin * Lukas Wunner <lukas@wunner.de> wrote: > The solution is to reset the card on boot by writing to a reset bit in > its mmio space. This must be done as an early quirk and not as a plain > vanilla PCI quirk to successfully combat memory corruption by DMAed > packets: Matthew Garrett found out in 2012 that the packets are written > to EfiBootServicesData memory (http://mjg59.dreamwidth.org/11235.html). > This type of memory is made available to the page allocator by > efi_free_boot_services(). [...] Btw., would it also make sense to *not* free those pages by default, if firmware can occasionally corrupt them? What memory size are we talking about? Thanks, Ingo ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 11:49 ` Ingo Molnar @ 2016-06-12 12:37 ` Lukas Wunner 2016-06-13 14:44 ` Matt Fleming 2016-06-28 13:21 ` Lukas Wunner 1 sibling, 1 reply; 12+ messages in thread From: Lukas Wunner @ 2016-06-12 12:37 UTC (permalink / raw) To: Ingo Molnar Cc: x86, linux-kernel, Bjorn Helgaas, Yinghai Lu, Matt Fleming, Linus Torvalds, Andrew Morton, Thomas Gleixner, H. Peter Anvin On Sun, Jun 12, 2016 at 01:49:02PM +0200, Ingo Molnar wrote: > * Lukas Wunner <lukas@wunner.de> wrote: > > The solution is to reset the card on boot by writing to a reset bit in > > its mmio space. This must be done as an early quirk and not as a plain > > vanilla PCI quirk to successfully combat memory corruption by DMAed > > packets: Matthew Garrett found out in 2012 that the packets are written > > to EfiBootServicesData memory (http://mjg59.dreamwidth.org/11235.html). > > This type of memory is made available to the page allocator by > > efi_free_boot_services(). [...] > > Btw., would it also make sense to *not* free those pages by default, > if firmware can occasionally corrupt them? What memory size are we > talking about? The memory area where packets are written is relatively small, Matthew Garret writes: "I'd traced it down to a single 31MB region of boot service data" (https://mjg59.dreamwidth.org/11235.html) However memory corruption by DMAed packets is only one of two issues here. The other is the interrupt storm unleashed by the wireless card. The IRQ is frequently shared on these models. On my machine it's shared with the Thunderbolt controller, SDXC controller and a sound card. I can't even authenticate with cryptsetup on boot before getting a spurious interrupt splat. Resetting the card solves the problem at the root and fixes both, the spurious interrupts and the memory corruption. Best regards, Lukas ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 12:37 ` Lukas Wunner @ 2016-06-13 14:44 ` Matt Fleming 2016-06-14 7:36 ` Ingo Molnar 0 siblings, 1 reply; 12+ messages in thread From: Matt Fleming @ 2016-06-13 14:44 UTC (permalink / raw) To: Lukas Wunner Cc: Ingo Molnar, x86, linux-kernel, Bjorn Helgaas, Yinghai Lu, Linus Torvalds, Andrew Morton, Thomas Gleixner, H. Peter Anvin On Sun, 12 Jun, at 02:37:26PM, Lukas Wunner wrote: > > Resetting the card solves the problem at the root and fixes both, > the spurious interrupts and the memory corruption. It also avoids the need to figure out exactly which Boot Services regions may have become corrupt. This would be necessary since you can't keep all Boot Services regions reserved because those regions can add up to be many gigabytes in size, even on relatively low-end laptops that don't have huge amounts of RAM to begin with. Freeing Boot Services regions is pretty important. ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-13 14:44 ` Matt Fleming @ 2016-06-14 7:36 ` Ingo Molnar 0 siblings, 0 replies; 12+ messages in thread From: Ingo Molnar @ 2016-06-14 7:36 UTC (permalink / raw) To: Matt Fleming Cc: Lukas Wunner, x86, linux-kernel, Bjorn Helgaas, Yinghai Lu, Linus Torvalds, Andrew Morton, Thomas Gleixner, H. Peter Anvin * Matt Fleming <matt@codeblueprint.co.uk> wrote: > On Sun, 12 Jun, at 02:37:26PM, Lukas Wunner wrote: > > > > Resetting the card solves the problem at the root and fixes both, > > the spurious interrupts and the memory corruption. > > It also avoids the need to figure out exactly which Boot Services > regions may have become corrupt. > > This would be necessary since you can't keep all Boot Services regions > reserved because those regions can add up to be many gigabytes in > size, even on relatively low-end laptops that don't have huge amounts > of RAM to begin with. > > Freeing Boot Services regions is pretty important. Ok! Thanks, Ingo ^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [PATCH v2 3/3] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 11:49 ` Ingo Molnar 2016-06-12 12:37 ` Lukas Wunner @ 2016-06-28 13:21 ` Lukas Wunner 1 sibling, 0 replies; 12+ messages in thread From: Lukas Wunner @ 2016-06-28 13:21 UTC (permalink / raw) To: Ingo Molnar Cc: x86, linux-kernel, Bjorn Helgaas, Yinghai Lu, Matt Fleming, Linus Torvalds, Andrew Morton, Thomas Gleixner, H. Peter Anvin Hi Ingo, On Sun, Jun 12, 2016 at 01:13:38PM +0200, Lukas Wunner wrote: > I've just posted v2, taking into account all of Bjorn's suggestions: > https://lkml.org/lkml/2016/6/12/65 > > @Ingo Molnar: I noticed that you've removed the line breaks in > read/write_pci_config_16(). I've carried that change over to v2 > even though it exceeds 80 chars/line and thus doesn't seem to > comply with Documentation/CodingStyle, chapter 2. > > Please note that the stable designation in patch [3/3] needs to be > amended with the sha1 of the two preceding patches after they have > been merged. Just wanted to send a gentle reminder that this series seems to still be pending, at least I'm not seeing it in linux-next or tip/master. If there is anything I can do to move this forward please let me know. Thank you! Lukas ^ permalink raw reply [flat|nested] 12+ messages in thread
* [tip:x86/urgent] x86/quirks: Add early quirk to reset Apple AirPort card 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner 2016-06-12 11:49 ` Ingo Molnar @ 2016-07-10 19:01 ` tip-bot for Lukas Wunner 1 sibling, 0 replies; 12+ messages in thread From: tip-bot for Lukas Wunner @ 2016-07-10 19:01 UTC (permalink / raw) To: linux-tip-commits Cc: yinghai, jpoimboe, bp, mjg59, lukas, zajec5, dvlasenk, peterz, tglx, bhelgaas, torvalds, cmilsted, luto, mingo, matt, hpa, brgerst, linux-kernel, m Commit-ID: abb2bafd295fe962bbadc329dbfb2146457283ac Gitweb: http://git.kernel.org/tip/abb2bafd295fe962bbadc329dbfb2146457283ac Author: Lukas Wunner <lukas@wunner.de> AuthorDate: Sun, 12 Jun 2016 12:31:53 +0200 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Sun, 10 Jul 2016 20:13:53 +0200 x86/quirks: Add early quirk to reset Apple AirPort card The EFI firmware on Macs contains a full-fledged network stack for downloading OS X images from osrecovery.apple.com. Unfortunately on Macs introduced 2011 and 2012, EFI brings up the Broadcom 4331 wireless card on every boot and leaves it enabled even after ExitBootServices has been called. The card continues to assert its IRQ line, causing spurious interrupts if the IRQ is shared. It also corrupts memory by DMAing received packets, allowing for remote code execution over the air. This only stops when a driver is loaded for the wireless card, which may be never if the driver is not installed or blacklisted. The issue seems to be constrained to the Broadcom 4331. Chris Milsted has verified that the newer Broadcom 4360 built into the MacBookPro11,3 (2013/2014) does not exhibit this behaviour. The chances that Apple will ever supply a firmware fix for the older machines appear to be zero. The solution is to reset the card on boot by writing to a reset bit in its mmio space. This must be done as an early quirk and not as a plain vanilla PCI quirk to successfully combat memory corruption by DMAed packets: Matthew Garrett found out in 2012 that the packets are written to EfiBootServicesData memory (http://mjg59.dreamwidth.org/11235.html). This type of memory is made available to the page allocator by efi_free_boot_services(). Plain vanilla PCI quirks run much later, in subsys initcall level. In-between a time window would be open for memory corruption. Random crashes occurring in this time window and attributed to DMAed packets have indeed been observed in the wild by Chris Bainbridge. When Matthew Garrett analyzed the memory corruption issue in 2012, he sought to fix it with a grub quirk which transitions the card to D3hot: http://git.savannah.gnu.org/cgit/grub.git/commit/?id=9d34bb85da56 This approach does not help users with other bootloaders and while it may prevent DMAed packets, it does not cure the spurious interrupts emanating from the card. Unfortunately the card's mmio space is inaccessible in D3hot, so to reset it, we have to undo the effect of Matthew's grub patch and transition the card back to D0. Note that the quirk takes a few shortcuts to reduce the amount of code: The size of BAR 0 and the location of the PM capability is identical on all affected machines and therefore hardcoded. Only the address of BAR 0 differs between models. Also, it is assumed that the BCMA core currently mapped is the 802.11 core. The EFI driver seems to always take care of this. Michael Büsch, Bjorn Helgaas and Matt Fleming contributed feedback towards finding the best solution to this problem. The following should be a comprehensive list of affected models: iMac13,1 2012 21.5" [Root Port 00:1c.3 = 8086:1e16] iMac13,2 2012 27" [Root Port 00:1c.3 = 8086:1e16] Macmini5,1 2011 i5 2.3 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini5,2 2011 i5 2.5 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini5,3 2011 i7 2.0 GHz [Root Port 00:1c.1 = 8086:1c12] Macmini6,1 2012 i5 2.5 GHz [Root Port 00:1c.1 = 8086:1e12] Macmini6,2 2012 i7 2.3 GHz [Root Port 00:1c.1 = 8086:1e12] MacBookPro8,1 2011 13" [Root Port 00:1c.1 = 8086:1c12] MacBookPro8,2 2011 15" [Root Port 00:1c.1 = 8086:1c12] MacBookPro8,3 2011 17" [Root Port 00:1c.1 = 8086:1c12] MacBookPro9,1 2012 15" [Root Port 00:1c.1 = 8086:1e12] MacBookPro9,2 2012 13" [Root Port 00:1c.1 = 8086:1e12] MacBookPro10,1 2012 15" [Root Port 00:1c.1 = 8086:1e12] MacBookPro10,2 2012 13" [Root Port 00:1c.1 = 8086:1e12] For posterity, spurious interrupts caused by the Broadcom 4331 wireless card resulted in splats like this (stacktrace omitted): irq 17: nobody cared (try booting with the "irqpoll" option) handlers: [<ffffffff81374370>] pcie_isr [<ffffffffc0704550>] sdhci_irq [sdhci] threaded [<ffffffffc07013c0>] sdhci_thread_irq [sdhci] [<ffffffffc0a0b960>] azx_interrupt [snd_hda_codec] Disabling IRQ #17 Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=79301 Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=111781 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=728916 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=895951#c16 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1009819 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1098621 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1149632#c5 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1279130 Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1332732 Tested-by: Konstantin Simanov <k.simanov@stlk.ru> # [MacBookPro8,1] Tested-by: Lukas Wunner <lukas@wunner.de> # [MacBookPro9,1] Tested-by: Bryan Paradis <bryan.paradis@gmail.com> # [MacBookPro9,2] Tested-by: Andrew Worsley <amworsley@gmail.com> # [MacBookPro10,1] Tested-by: Chris Bainbridge <chris.bainbridge@gmail.com> # [MacBookPro10,2] Signed-off-by: Lukas Wunner <lukas@wunner.de> Acked-by: Rafał Miłecki <zajec5@gmail.com> Acked-by: Matt Fleming <matt@codeblueprint.co.uk> Cc: Andy Lutomirski <luto@kernel.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Chris Milsted <cmilsted@redhat.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Michael Buesch <m@bues.ch> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Yinghai Lu <yinghai@kernel.org> Cc: b43-dev@lists.infradead.org Cc: linux-pci@vger.kernel.org Cc: linux-wireless@vger.kernel.org Cc: stable@vger.kernel.org Cc: stable@vger.kernel.org # 123456789abc: x86/quirks: Apply nvidia_bugs quirk only on root bus Cc: stable@vger.kernel.org # 123456789abc: x86/quirks: Reintroduce scanning of secondary buses Link: http://lkml.kernel.org/r/48d0972ac82a53d460e5fce77a07b2560db95203.1465690253.git.lukas@wunner.de [ Did minor readability edits. ] Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/kernel/early-quirks.c | 64 ++++++++++++++++++++++++++++++++++++++++++ drivers/bcma/bcma_private.h | 2 -- include/linux/bcma/bcma.h | 1 + 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index ea60c05..57b7137 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -11,7 +11,11 @@ #include <linux/pci.h> #include <linux/acpi.h> +#include <linux/delay.h> +#include <linux/dmi.h> #include <linux/pci_ids.h> +#include <linux/bcma/bcma.h> +#include <linux/bcma/bcma_regs.h> #include <drm/i915_drm.h> #include <asm/pci-direct.h> #include <asm/dma.h> @@ -21,6 +25,9 @@ #include <asm/iommu.h> #include <asm/gart.h> #include <asm/irq_remapping.h> +#include <asm/early_ioremap.h> + +#define dev_err(msg) pr_err("pci 0000:%02x:%02x.%d: %s", bus, slot, func, msg) static void __init fix_hypertransport_config(int num, int slot, int func) { @@ -597,6 +604,61 @@ static void __init force_disable_hpet(int num, int slot, int func) #endif } +#define BCM4331_MMIO_SIZE 16384 +#define BCM4331_PM_CAP 0x40 +#define bcma_aread32(reg) ioread32(mmio + 1 * BCMA_CORE_SIZE + reg) +#define bcma_awrite32(reg, val) iowrite32(val, mmio + 1 * BCMA_CORE_SIZE + reg) + +static void __init apple_airport_reset(int bus, int slot, int func) +{ + void __iomem *mmio; + u16 pmcsr; + u64 addr; + int i; + + if (!dmi_match(DMI_SYS_VENDOR, "Apple Inc.")) + return; + + /* Card may have been put into PCI_D3hot by grub quirk */ + pmcsr = read_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL); + + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0) { + pmcsr &= ~PCI_PM_CTRL_STATE_MASK; + write_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL, pmcsr); + mdelay(10); + + pmcsr = read_pci_config_16(bus, slot, func, BCM4331_PM_CAP + PCI_PM_CTRL); + if ((pmcsr & PCI_PM_CTRL_STATE_MASK) != PCI_D0) { + dev_err("Cannot power up Apple AirPort card\n"); + return; + } + } + + addr = read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_0); + addr |= (u64)read_pci_config(bus, slot, func, PCI_BASE_ADDRESS_1) << 32; + addr &= PCI_BASE_ADDRESS_MEM_MASK; + + mmio = early_ioremap(addr, BCM4331_MMIO_SIZE); + if (!mmio) { + dev_err("Cannot iomap Apple AirPort card\n"); + return; + } + + pr_info("Resetting Apple AirPort card (left enabled by EFI)\n"); + + for (i = 0; bcma_aread32(BCMA_RESET_ST) && i < 30; i++) + udelay(10); + + bcma_awrite32(BCMA_RESET_CTL, BCMA_RESET_CTL_RESET); + bcma_aread32(BCMA_RESET_CTL); + udelay(1); + + bcma_awrite32(BCMA_RESET_CTL, 0); + bcma_aread32(BCMA_RESET_CTL); + udelay(10); + + early_iounmap(mmio, BCM4331_MMIO_SIZE); +} #define QFLAG_APPLY_ONCE 0x1 #define QFLAG_APPLIED 0x2 @@ -639,6 +701,8 @@ static struct chipset early_qrk[] __initdata = { */ { PCI_VENDOR_ID_INTEL, 0x0f00, PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, force_disable_hpet}, + { PCI_VENDOR_ID_BROADCOM, 0x4331, + PCI_CLASS_NETWORK_OTHER, PCI_ANY_ID, 0, apple_airport_reset}, {} }; diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h index eda0909..f642c42 100644 --- a/drivers/bcma/bcma_private.h +++ b/drivers/bcma/bcma_private.h @@ -8,8 +8,6 @@ #include <linux/bcma/bcma.h> #include <linux/delay.h> -#define BCMA_CORE_SIZE 0x1000 - #define bcma_err(bus, fmt, ...) \ pr_err("bus%d: " fmt, (bus)->num, ##__VA_ARGS__) #define bcma_warn(bus, fmt, ...) \ diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h index e6b41f4..3db25df 100644 --- a/include/linux/bcma/bcma.h +++ b/include/linux/bcma/bcma.h @@ -159,6 +159,7 @@ struct bcma_host_ops { #define BCMA_CORE_DEFAULT 0xFFF #define BCMA_MAX_NR_CORES 16 +#define BCMA_CORE_SIZE 0x1000 /* Chip IDs of PCIe devices */ #define BCMA_CHIP_ID_BCM4313 0x4313 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 2/3] x86/quirks: Reintroduce scanning of secondary buses 2016-06-12 10:31 [PATCH v2 0/3] Reset Apple AirPort card Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner @ 2016-06-12 10:31 ` Lukas Wunner 2016-07-10 19:01 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 1/3] x86/quirks: Apply nvidia_bugs quirk only on root bus Lukas Wunner 2 siblings, 1 reply; 12+ messages in thread From: Lukas Wunner @ 2016-06-12 10:31 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Bjorn Helgaas, Yinghai Lu We used to scan secondary buses until commit 8659c406ade3 ("x86: only scan the root bus in early PCI quirks") constrained early quirks to the root bus only. Its motivation was to prevent application of the nvidia_bugs quirk on secondary buses. We're about to add a quirk to reset the Broadcom 4331 wireless card on 2011/2012 Macs, which is located on a secondary bus behind a PCIe root port. To facilitate that, reintroduce scanning of secondary buses. The commit message of 8659c406ade3 notes that scanning only the root bus "saves quite some unnecessary scanning work". The algorithm used prior to 8659c406ade3 was particularly time consuming because it scanned buses 0 to 31 brute force. To avoid lengthening boot time, employ a recursive strategy which only scans buses that are actually reachable from the root bus. Yinghai Lu pointed out that the secondary bus number read from a bridge's config space may be invalid, in particular a value of 0 would cause an infinite loop. The PCI core goes beyond that and recurses to a child bus only if its bus number is greater than the parent bus number (see pci_scan_bridge()). Since the root bus is numbered 0, this implies that secondary buses may not be 0. Do the same on early scanning. If this algorithm is found to significantly impact boot time or cause infinite loops on broken hardware, it would be possible to limit its recursion depth: The Broadcom 4331 quirk applies at depth 1, all others at depth 0, so the bus need not be scanned deeper than that for now. An alternative approach would be to revert to scanning only the root bus, and apply the Broadcom 4331 quirk to the root ports 8086:1c12, 8086:1e12 and 8086:1e16. Apple always positioned the card behind either of these three ports. The quirk would then check presence of the card in slot 0 below the root port and do its deed. Cc: Yinghai Lu <yinghai@kernel.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Andi Kleen <ak@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: linux-pci@vger.kernel.org Signed-off-by: Lukas Wunner <lukas@wunner.de> --- v2: - Validate secondary bus number (Yinghai Lu) - Move scanning of secondary buses to separate patch to allow for easier reviewing, bisecting and reverting (Bjorn Helgaas) arch/x86/kernel/early-quirks.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 256976f..ea60c05 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -610,12 +610,6 @@ struct chipset { void (*f)(int num, int slot, int func); }; -/* - * Only works for devices on the root bus. If you add any devices - * not on bus 0 readd another loop level in early_quirks(). But - * be careful because at least the Nvidia quirk here relies on - * only matching on bus 0. - */ static struct chipset early_qrk[] __initdata = { { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, @@ -648,6 +642,8 @@ static struct chipset early_qrk[] __initdata = { {} }; +static void __init early_pci_scan_bus(int bus); + /** * check_dev_quirk - apply early quirks to a given PCI device * @num: bus number @@ -656,7 +652,7 @@ static struct chipset early_qrk[] __initdata = { * * Check the vendor & device ID against the early quirks table. * - * If the device is single function, let early_quirks() know so we don't + * If the device is single function, let early_pci_scan_bus() know so we don't * poke at this device again. */ static int __init check_dev_quirk(int num, int slot, int func) @@ -665,6 +661,7 @@ static int __init check_dev_quirk(int num, int slot, int func) u16 vendor; u16 device; u8 type; + u8 sec; int i; class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); @@ -692,25 +689,36 @@ static int __init check_dev_quirk(int num, int slot, int func) type = read_pci_config_byte(num, slot, func, PCI_HEADER_TYPE); + + if ((type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) { + sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS); + if (sec > num) + early_pci_scan_bus(sec); + } + if (!(type & 0x80)) return -1; return 0; } -void __init early_quirks(void) +static void __init early_pci_scan_bus(int bus) { int slot, func; - if (!early_pci_allowed()) - return; - /* Poor man's PCI discovery */ - /* Only scan the root bus */ for (slot = 0; slot < 32; slot++) for (func = 0; func < 8; func++) { /* Only probe function 0 on single fn devices */ - if (check_dev_quirk(0, slot, func)) + if (check_dev_quirk(bus, slot, func)) break; } } + +void __init early_quirks(void) +{ + if (!early_pci_allowed()) + return; + + early_pci_scan_bus(0); +} -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [tip:x86/urgent] x86/quirks: Reintroduce scanning of secondary buses 2016-06-12 10:31 ` [PATCH v2 2/3] x86/quirks: Reintroduce scanning of secondary buses Lukas Wunner @ 2016-07-10 19:01 ` tip-bot for Lukas Wunner 0 siblings, 0 replies; 12+ messages in thread From: tip-bot for Lukas Wunner @ 2016-07-10 19:01 UTC (permalink / raw) To: linux-tip-commits Cc: lukas, bhelgaas, torvalds, jpoimboe, luto, bp, tglx, hpa, dvlasenk, peterz, brgerst, mingo, linux-kernel, yinghai Commit-ID: 850c321027c2e31d0afc71588974719a4b565550 Gitweb: http://git.kernel.org/tip/850c321027c2e31d0afc71588974719a4b565550 Author: Lukas Wunner <lukas@wunner.de> AuthorDate: Sun, 12 Jun 2016 12:31:53 +0200 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Sun, 10 Jul 2016 20:13:53 +0200 x86/quirks: Reintroduce scanning of secondary buses We used to scan secondary buses until the following commit that was applied in 2009: 8659c406ade3 ("x86: only scan the root bus in early PCI quirks") which commit constrained early quirks to the root bus only. Its motivation was to prevent application of the nvidia_bugs quirk on secondary buses. We're about to add a quirk to reset the Broadcom 4331 wireless card on 2011/2012 Macs, which is located on a secondary bus behind a PCIe root port. To facilitate that, reintroduce scanning of secondary buses. The commit message of 8659c406ade3 notes that scanning only the root bus "saves quite some unnecessary scanning work". The algorithm used prior to 8659c406ade3 was particularly time consuming because it scanned buses 0 to 31 brute force. To avoid lengthening boot time, employ a recursive strategy which only scans buses that are actually reachable from the root bus. Yinghai Lu pointed out that the secondary bus number read from a bridge's config space may be invalid, in particular a value of 0 would cause an infinite loop. The PCI core goes beyond that and recurses to a child bus only if its bus number is greater than the parent bus number (see pci_scan_bridge()). Since the root bus is numbered 0, this implies that secondary buses may not be 0. Do the same on early scanning. If this algorithm is found to significantly impact boot time or cause infinite loops on broken hardware, it would be possible to limit its recursion depth: The Broadcom 4331 quirk applies at depth 1, all others at depth 0, so the bus need not be scanned deeper than that for now. An alternative approach would be to revert to scanning only the root bus, and apply the Broadcom 4331 quirk to the root ports 8086:1c12, 8086:1e12 and 8086:1e16. Apple always positioned the card behind either of these three ports. The quirk would then check presence of the card in slot 0 below the root port and do its deed. Signed-off-by: Lukas Wunner <lukas@wunner.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Yinghai Lu <yinghai@kernel.org> Cc: linux-pci@vger.kernel.org Link: http://lkml.kernel.org/r/f0daa70dac1a9b2483abdb31887173eb6ab77bdf.1465690253.git.lukas@wunner.de Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/kernel/early-quirks.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 256976f..ea60c05 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -610,12 +610,6 @@ struct chipset { void (*f)(int num, int slot, int func); }; -/* - * Only works for devices on the root bus. If you add any devices - * not on bus 0 readd another loop level in early_quirks(). But - * be careful because at least the Nvidia quirk here relies on - * only matching on bus 0. - */ static struct chipset early_qrk[] __initdata = { { PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID, PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, @@ -648,6 +642,8 @@ static struct chipset early_qrk[] __initdata = { {} }; +static void __init early_pci_scan_bus(int bus); + /** * check_dev_quirk - apply early quirks to a given PCI device * @num: bus number @@ -656,7 +652,7 @@ static struct chipset early_qrk[] __initdata = { * * Check the vendor & device ID against the early quirks table. * - * If the device is single function, let early_quirks() know so we don't + * If the device is single function, let early_pci_scan_bus() know so we don't * poke at this device again. */ static int __init check_dev_quirk(int num, int slot, int func) @@ -665,6 +661,7 @@ static int __init check_dev_quirk(int num, int slot, int func) u16 vendor; u16 device; u8 type; + u8 sec; int i; class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); @@ -692,25 +689,36 @@ static int __init check_dev_quirk(int num, int slot, int func) type = read_pci_config_byte(num, slot, func, PCI_HEADER_TYPE); + + if ((type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) { + sec = read_pci_config_byte(num, slot, func, PCI_SECONDARY_BUS); + if (sec > num) + early_pci_scan_bus(sec); + } + if (!(type & 0x80)) return -1; return 0; } -void __init early_quirks(void) +static void __init early_pci_scan_bus(int bus) { int slot, func; - if (!early_pci_allowed()) - return; - /* Poor man's PCI discovery */ - /* Only scan the root bus */ for (slot = 0; slot < 32; slot++) for (func = 0; func < 8; func++) { /* Only probe function 0 on single fn devices */ - if (check_dev_quirk(0, slot, func)) + if (check_dev_quirk(bus, slot, func)) break; } } + +void __init early_quirks(void) +{ + if (!early_pci_allowed()) + return; + + early_pci_scan_bus(0); +} ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [PATCH v2 1/3] x86/quirks: Apply nvidia_bugs quirk only on root bus 2016-06-12 10:31 [PATCH v2 0/3] Reset Apple AirPort card Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 2/3] x86/quirks: Reintroduce scanning of secondary buses Lukas Wunner @ 2016-06-12 10:31 ` Lukas Wunner 2016-07-10 19:00 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 2 siblings, 1 reply; 12+ messages in thread From: Lukas Wunner @ 2016-06-12 10:31 UTC (permalink / raw) To: x86, linux-kernel; +Cc: Bjorn Helgaas, Yinghai Lu Since commit 8659c406ade3 ("x86: only scan the root bus in early PCI quirks"), early quirks are only applied to devices on the root bus. The motivation was to prevent application of the nvidia_bugs quirk on secondary buses. We're about to reintroduce scanning of secondary buses for a quirk to reset the Broadcom 4331 wireless card on 2011/2012 Macs. To prevent regressions, open code the requirement to apply nvidia_bugs only on the root bus. Cc: Andi Kleen <ak@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Lukas Wunner <lukas@wunner.de> --- v2: - Move amendment of nvidia_bugs quirk to separate patch to allow for easier reviewing, bisecting and reverting (Bjorn Helgaas) arch/x86/kernel/early-quirks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index bca14c8..256976f 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -76,6 +76,13 @@ static void __init nvidia_bugs(int num, int slot, int func) #ifdef CONFIG_ACPI #ifdef CONFIG_X86_IO_APIC /* + * Only applies to Nvidia root ports (bus 0) and not to + * Nvidia graphics cards with PCI ports on secondary buses. + */ + if (num) + return; + + /* * All timer overrides on Nvidia are * wrong unless HPET is enabled. * Unfortunately that's not true on many Asus boards. -- 2.8.1 ^ permalink raw reply related [flat|nested] 12+ messages in thread
* [tip:x86/urgent] x86/quirks: Apply nvidia_bugs quirk only on root bus 2016-06-12 10:31 ` [PATCH v2 1/3] x86/quirks: Apply nvidia_bugs quirk only on root bus Lukas Wunner @ 2016-07-10 19:00 ` tip-bot for Lukas Wunner 0 siblings, 0 replies; 12+ messages in thread From: tip-bot for Lukas Wunner @ 2016-07-10 19:00 UTC (permalink / raw) To: linux-tip-commits Cc: bp, luto, mingo, jpoimboe, torvalds, bhelgaas, hpa, yinghai, tglx, dvlasenk, brgerst, linux-kernel, lukas, peterz Commit-ID: 447d29d1d3aed839e74c2401ef63387780ac51ed Gitweb: http://git.kernel.org/tip/447d29d1d3aed839e74c2401ef63387780ac51ed Author: Lukas Wunner <lukas@wunner.de> AuthorDate: Sun, 12 Jun 2016 12:31:53 +0200 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Sun, 10 Jul 2016 20:13:53 +0200 x86/quirks: Apply nvidia_bugs quirk only on root bus Since the following commit: 8659c406ade3 ("x86: only scan the root bus in early PCI quirks") ... early quirks are only applied to devices on the root bus. The motivation was to prevent application of the nvidia_bugs quirk on secondary buses. We're about to reintroduce scanning of secondary buses for a quirk to reset the Broadcom 4331 wireless card on 2011/2012 Macs. To prevent regressions, open code the requirement to apply nvidia_bugs only on the root bus. Signed-off-by: Lukas Wunner <lukas@wunner.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Yinghai Lu <yinghai@kernel.org> Link: http://lkml.kernel.org/r/4d5477c1d76b2f0387a780f2142bbcdd9fee869b.1465690253.git.lukas@wunner.de Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/kernel/early-quirks.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index bca14c8..256976f 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c @@ -76,6 +76,13 @@ static void __init nvidia_bugs(int num, int slot, int func) #ifdef CONFIG_ACPI #ifdef CONFIG_X86_IO_APIC /* + * Only applies to Nvidia root ports (bus 0) and not to + * Nvidia graphics cards with PCI ports on secondary buses. + */ + if (num) + return; + + /* * All timer overrides on Nvidia are * wrong unless HPET is enabled. * Unfortunately that's not true on many Asus boards. ^ permalink raw reply related [flat|nested] 12+ messages in thread
end of thread, other threads:[~2016-07-10 19:02 UTC | newest] Thread overview: 12+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2016-06-12 10:31 [PATCH v2 0/3] Reset Apple AirPort card Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 3/3] x86/quirks: Add early quirk to reset " Lukas Wunner 2016-06-12 11:49 ` Ingo Molnar 2016-06-12 12:37 ` Lukas Wunner 2016-06-13 14:44 ` Matt Fleming 2016-06-14 7:36 ` Ingo Molnar 2016-06-28 13:21 ` Lukas Wunner 2016-07-10 19:01 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 2/3] x86/quirks: Reintroduce scanning of secondary buses Lukas Wunner 2016-07-10 19:01 ` [tip:x86/urgent] " tip-bot for Lukas Wunner 2016-06-12 10:31 ` [PATCH v2 1/3] x86/quirks: Apply nvidia_bugs quirk only on root bus Lukas Wunner 2016-07-10 19:00 ` [tip:x86/urgent] " tip-bot for Lukas Wunner
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.