@@ -987,15 +987,14 @@ static void pcibios_setup_device(struct pci_dev *dev)
ppc_md.pci_irq_fixup(dev);
}
-int pcibios_add_device(struct pci_dev *dev)
+void pcibios_fixup_dev(struct pci_dev *dev)
{
- /*
- * We can only call pcibios_setup_device() after bus setup is complete,
- * since some of the platform specific DMA setup code depends on it.
- */
- if (dev->bus->is_added)
- pcibios_setup_device(dev);
+ /* Device is registered in sysfs and ready to be set up */
+ pcibios_setup_device(dev);
+}
+int pcibios_add_device(struct pci_dev *dev)
+{
#ifdef CONFIG_PCI_IOV
if (ppc_md.pcibios_fixup_sriov)
ppc_md.pcibios_fixup_sriov(dev);
Move PCI device setup from pcibios_add_device() to pcibios_fixup_dev(). This ensures that platform-specific DMA and IOMMU setup occurs after the device has been registered in sysfs, which is a requirement for IOMMU group assignment to work. This fixes IOMMU group assignment for hotplugged devices on pseries, where the existing behavior results in IOMMU assignment before registration. Signed-off-by: Shawn Anastasio <shawn@anastas.io> --- arch/powerpc/kernel/pci-common.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)