Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'pci-v4.5-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci

Pull PCI fixes from Bjorn Helgaas:
"Enumeration:
Revert x86 pcibios_alloc_irq() to fix regression (Bjorn Helgaas)

Marvell MVEBU host bridge driver:
Restrict build to 32-bit ARM (Thierry Reding)"

* tag 'pci-v4.5-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/helgaas/pci:
PCI: mvebu: Restrict build to 32-bit ARM
Revert "PCI, x86: Implement pcibios_alloc_irq() and pcibios_free_irq()"
Revert "PCI: Add helpers to manage pci_dev->irq and pci_dev->irq_managed"
Revert "x86/PCI: Don't alloc pcibios-irq when MSI is enabled"

+52 -51
+2
arch/x86/include/asm/pci_x86.h
··· 93 93 extern int (*pcibios_enable_irq)(struct pci_dev *dev); 94 94 extern void (*pcibios_disable_irq)(struct pci_dev *dev); 95 95 96 + extern bool mp_should_keep_irq(struct device *dev); 97 + 96 98 struct pci_raw_ops { 97 99 int (*read)(unsigned int domain, unsigned int bus, unsigned int devfn, 98 100 int reg, int len, u32 *val);
+14 -20
arch/x86/pci/common.c
··· 711 711 return 0; 712 712 } 713 713 714 - int pcibios_alloc_irq(struct pci_dev *dev) 715 - { 716 - /* 717 - * If the PCI device was already claimed by core code and has 718 - * MSI enabled, probing of the pcibios IRQ will overwrite 719 - * dev->irq. So bail out if MSI is already enabled. 720 - */ 721 - if (pci_dev_msi_enabled(dev)) 722 - return -EBUSY; 723 - 724 - return pcibios_enable_irq(dev); 725 - } 726 - 727 - void pcibios_free_irq(struct pci_dev *dev) 728 - { 729 - if (pcibios_disable_irq) 730 - pcibios_disable_irq(dev); 731 - } 732 - 733 714 int pcibios_enable_device(struct pci_dev *dev, int mask) 734 715 { 735 - return pci_enable_resources(dev, mask); 716 + int err; 717 + 718 + if ((err = pci_enable_resources(dev, mask)) < 0) 719 + return err; 720 + 721 + if (!pci_dev_msi_enabled(dev)) 722 + return pcibios_enable_irq(dev); 723 + return 0; 724 + } 725 + 726 + void pcibios_disable_device (struct pci_dev *dev) 727 + { 728 + if (!pci_dev_msi_enabled(dev) && pcibios_disable_irq) 729 + pcibios_disable_irq(dev); 736 730 } 737 731 738 732 int pci_ext_cfg_avail(void)
+3 -6
arch/x86/pci/intel_mid_pci.c
··· 215 215 int polarity; 216 216 int ret; 217 217 218 - if (pci_has_managed_irq(dev)) 218 + if (dev->irq_managed && dev->irq > 0) 219 219 return 0; 220 220 221 221 switch (intel_mid_identify_cpu()) { ··· 256 256 257 257 static void intel_mid_pci_irq_disable(struct pci_dev *dev) 258 258 { 259 - if (pci_has_managed_irq(dev)) { 259 + if (!mp_should_keep_irq(&dev->dev) && dev->irq_managed && 260 + dev->irq > 0) { 260 261 mp_unmap_irq(dev->irq); 261 262 dev->irq_managed = 0; 262 - /* 263 - * Don't reset dev->irq here, otherwise 264 - * intel_mid_pci_irq_enable() will fail on next call. 265 - */ 266 263 } 267 264 } 268 265
+19 -4
arch/x86/pci/irq.c
··· 1202 1202 struct pci_dev *temp_dev; 1203 1203 int irq; 1204 1204 1205 - if (pci_has_managed_irq(dev)) 1205 + if (dev->irq_managed && dev->irq > 0) 1206 1206 return 0; 1207 1207 1208 1208 irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, ··· 1230 1230 } 1231 1231 dev = temp_dev; 1232 1232 if (irq >= 0) { 1233 - pci_set_managed_irq(dev, irq); 1233 + dev->irq_managed = 1; 1234 + dev->irq = irq; 1234 1235 dev_info(&dev->dev, "PCI->APIC IRQ transform: " 1235 1236 "INT %c -> IRQ %d\n", 'A' + pin - 1, irq); 1236 1237 return 0; ··· 1257 1256 return 0; 1258 1257 } 1259 1258 1259 + bool mp_should_keep_irq(struct device *dev) 1260 + { 1261 + if (dev->power.is_prepared) 1262 + return true; 1263 + #ifdef CONFIG_PM 1264 + if (dev->power.runtime_status == RPM_SUSPENDING) 1265 + return true; 1266 + #endif 1267 + 1268 + return false; 1269 + } 1270 + 1260 1271 static void pirq_disable_irq(struct pci_dev *dev) 1261 1272 { 1262 - if (io_apic_assign_pci_irqs && pci_has_managed_irq(dev)) { 1273 + if (io_apic_assign_pci_irqs && !mp_should_keep_irq(&dev->dev) && 1274 + dev->irq_managed && dev->irq) { 1263 1275 mp_unmap_irq(dev->irq); 1264 - pci_reset_managed_irq(dev); 1276 + dev->irq = 0; 1277 + dev->irq_managed = 0; 1265 1278 } 1266 1279 }
+13 -4
drivers/acpi/pci_irq.c
··· 406 406 return 0; 407 407 } 408 408 409 - if (pci_has_managed_irq(dev)) 409 + if (dev->irq_managed && dev->irq > 0) 410 410 return 0; 411 411 412 412 entry = acpi_pci_irq_lookup(dev, pin); ··· 451 451 kfree(entry); 452 452 return rc; 453 453 } 454 - pci_set_managed_irq(dev, rc); 454 + dev->irq = rc; 455 + dev->irq_managed = 1; 455 456 456 457 if (link) 457 458 snprintf(link_desc, sizeof(link_desc), " -> Link[%s]", link); ··· 475 474 u8 pin; 476 475 477 476 pin = dev->pin; 478 - if (!pin || !pci_has_managed_irq(dev)) 477 + if (!pin || !dev->irq_managed || dev->irq <= 0) 479 478 return; 479 + 480 + /* Keep IOAPIC pin configuration when suspending */ 481 + if (dev->dev.power.is_prepared) 482 + return; 483 + #ifdef CONFIG_PM 484 + if (dev->dev.power.runtime_status == RPM_SUSPENDING) 485 + return; 486 + #endif 480 487 481 488 entry = acpi_pci_irq_lookup(dev, pin); 482 489 if (!entry) ··· 505 496 dev_dbg(&dev->dev, "PCI INT %c disabled\n", pin_name(pin)); 506 497 if (gsi >= 0) { 507 498 acpi_unregister_gsi(gsi); 508 - pci_reset_managed_irq(dev); 499 + dev->irq_managed = 0; 509 500 } 510 501 }
+1
drivers/pci/host/Kconfig
··· 14 14 config PCI_MVEBU 15 15 bool "Marvell EBU PCIe controller" 16 16 depends on ARCH_MVEBU || ARCH_DOVE 17 + depends on ARM 17 18 depends on OF 18 19 19 20 config PCIE_DW
-17
include/linux/pci.h
··· 988 988 return pdev->is_managed; 989 989 } 990 990 991 - static inline void pci_set_managed_irq(struct pci_dev *pdev, unsigned int irq) 992 - { 993 - pdev->irq = irq; 994 - pdev->irq_managed = 1; 995 - } 996 - 997 - static inline void pci_reset_managed_irq(struct pci_dev *pdev) 998 - { 999 - pdev->irq = 0; 1000 - pdev->irq_managed = 0; 1001 - } 1002 - 1003 - static inline bool pci_has_managed_irq(struct pci_dev *pdev) 1004 - { 1005 - return pdev->irq_managed && pdev->irq > 0; 1006 - } 1007 - 1008 991 void pci_disable_device(struct pci_dev *dev); 1009 992 1010 993 extern unsigned int pcibios_max_latency;