From: Stephen Rothwell Date: Thu, 5 Nov 2015 00:29:22 +0000 (+1100) Subject: Merge remote-tracking branch 'pci/next' X-Git-Tag: KARO-TXUL-2015-12-04~111 X-Git-Url: https://git.kernelconcepts.de/?p=karo-tx-linux.git;a=commitdiff_plain;h=cb1a14b95eee86d7e20bfa2c010aab77b021f62e Merge remote-tracking branch 'pci/next' --- cb1a14b95eee86d7e20bfa2c010aab77b021f62e diff --cc drivers/pci/probe.c index f14a970b61fa,6ae984da0b9c..f53b8e85f137 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@@ -1620,50 -1625,19 +1624,52 @@@ static void pci_init_capabilities(struc /* Enable ACS P2P upstream forwarding */ pci_enable_acs(dev); + + pci_cleanup_aer_error_status_regs(dev); } +/* + * This is the equivalent of pci_host_bridge_msi_domain that acts on + * devices. Firmware interfaces that can select the MSI domain on a + * per-device basis should be called from here. + */ +static struct irq_domain *pci_dev_msi_domain(struct pci_dev *dev) +{ + struct irq_domain *d; + + /* + * If a domain has been set through the pcibios_add_device + * callback, then this is the one (platform code knows best). + */ + d = dev_get_msi_domain(&dev->dev); + if (d) + return d; + + /* + * Let's see if we have a firmware interface able to provide + * the domain. + */ + d = pci_msi_get_device_domain(dev); + if (d) + return d; + + return NULL; +} + static void pci_set_msi_domain(struct pci_dev *dev) { + struct irq_domain *d; + /* - * If no domain has been set through the pcibios_add_device - * callback, inherit the default from the bus device. + * If the platform or firmware interfaces cannot supply a + * device-specific MSI domain, then inherit the default domain + * from the host bridge itself. */ - if (!dev_get_msi_domain(&dev->dev)) - dev_set_msi_domain(&dev->dev, - dev_get_msi_domain(&dev->bus->dev)); + d = pci_dev_msi_domain(dev); + if (!d) + d = dev_get_msi_domain(&dev->bus->dev); + + dev_set_msi_domain(&dev->dev, d); } void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)