linux/arch/powerpc/platforms/powernv
Gavin Shan 763fe0addb powerpc/powernv: Fix IOMMU group lost
When we take full hotplug to recover from EEH errors, PCI buses
could be involved. For the case, the child devices of involved
PCI buses can't be attached to IOMMU group properly, which is
caused by commit 3f28c5a ("powerpc/powernv: Reduce multi-hit of
iommu_add_device()").

When adding the PCI devices of the newly created PCI buses to
the system, the IOMMU group is expected to be added in (C).
(A) fails to bind the IOMMU group because bus->is_added is
false. (B) fails because the device doesn't have binding IOMMU
table yet. bus->is_added is set to true at end of (C) and
pdev->is_added is set to true at (D).

   pcibios_add_pci_devices()
      pci_scan_bridge()
         pci_scan_child_bus()
            pci_scan_slot()
               pci_scan_single_device()
                  pci_scan_device()
                  pci_device_add()
                     pcibios_add_device()           A: Ignore
                     device_add()                   B: Ignore
                  pcibios_fixup_bus()
                     pcibios_setup_bus_devices()
                        pcibios_setup_device()      C: Hit
      pcibios_finish_adding_to_bus()
         pci_bus_add_devices()
            pci_bus_add_device()                    D: Add device

If the parent PCI bus isn't involved in hotplug, the IOMMU
group is expected to be bound in (B). (A) should fail as the
sysfs entries aren't populated.

The patch fixes the issue by reverting commit 3f28c5a and remove
WARN_ON() in iommu_add_device() to allow calling the function
even the specified device already has associated IOMMU group.

Cc: <stable@vger.kernel.org>  # 3.16+
Reported-by: Thadeu Lima de Souza Cascardo <cascardo@linux.vnet.ibm.com>
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: Wei Yang <weiyang@linux.vnet.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
2014-08-13 15:13:42 +10:00
..
eeh-ioda.c powerpc/powernv: Handle compound PE for EEH 2014-08-05 16:33:34 +10:00
eeh-powernv.c powerpc/eeh: Aux PE data for error log 2014-08-05 15:41:43 +10:00
Kconfig powerpc/powernv: Enable POWER8 doorbell IPIs 2014-06-11 17:05:12 +10:00
Makefile powerpc/powernv: Invoke opal call to handle hmi. 2014-08-05 16:33:52 +10:00
opal-async.c powerpc/powernv: Switch powernv drivers to use machine_xxx_initcall() 2014-07-28 14:11:26 +10:00
opal-dump.c powerpc/powernv: Fix little endian issues in OPAL dump code 2014-04-28 13:11:24 +10:00
opal-elog.c powerpc/powernv: Change BUG_ON to WARN_ON in elog code 2014-07-28 11:30:54 +10:00
opal-flash.c powerpc/powernv: Pass buffer size to OPAL validate flash call 2014-06-05 14:54:04 +10:00
opal-hmi.c powerpc/powernv: Invoke opal call to handle hmi. 2014-08-05 16:33:52 +10:00
opal-lpc.c powerpc/powernv: Switch powernv drivers to use machine_xxx_initcall() 2014-07-28 14:11:26 +10:00
opal-memory-errors.c powerpc/powernv: Switch powernv drivers to use machine_xxx_initcall() 2014-07-28 14:11:26 +10:00
opal-msglog.c powerpc/powernv: Fix reading of OPAL msglog 2014-06-11 17:03:36 +10:00
opal-nvram.c powerpc/powernv: Make OPAL NVRAM device tree accesses endian safe 2013-10-11 16:48:47 +11:00
opal-rtc.c powernv: Remove get/set_rtc_time when they are not present 2013-12-05 16:08:22 +11:00
opal-sensor.c powerpc/powernv: Fix endian issues with sensor code 2014-04-09 12:52:49 +10:00
opal-sysparam.c powernv: Fix permissions on sysparam sysfs entries 2014-06-11 17:03:15 +10:00
opal-tracepoints.c powernv: Add OPAL tracepoints 2014-07-11 16:06:08 +10:00
opal-wrappers.S powerpc/powernv: Invoke opal call to handle hmi. 2014-08-05 16:33:52 +10:00
opal-xscom.c powerpc/powernv: Switch powernv drivers to use machine_xxx_initcall() 2014-07-28 14:11:26 +10:00
opal.c powerpc/powernv: Invoke opal call to handle hmi. 2014-08-05 16:33:52 +10:00
pci-ioda.c powerpc/powernv: Fix IOMMU group lost 2014-08-13 15:13:42 +10:00
pci-p5ioc2.c powerpc/powernv: Add a page size parameter to pnv_pci_setup_iommu_table() 2014-07-11 16:05:53 +10:00
pci.c powerpc/powernv: Handle compound PE in config accessors 2014-08-05 16:33:39 +10:00
pci.h powerpc/powernv: Handle compound PE 2014-08-05 16:33:30 +10:00
powernv.h powerpc/powernv: Add support for POWER8 split core on powernv 2014-05-28 13:35:37 +10:00
rng.c powerpc/powernv: Switch powernv drivers to use machine_xxx_initcall() 2014-07-28 14:11:26 +10:00
setup.c powerpc/book3s: Add basic infrastructure to handle HMI in Linux. 2014-08-05 16:33:48 +10:00
smp.c powerpc/powernv: Enable POWER8 doorbell IPIs 2014-06-11 17:05:12 +10:00
subcore-asm.S powerpc/powernv: Add support for POWER8 split core on powernv 2014-05-28 13:35:37 +10:00
subcore.c powerpc/powernv: Add support for POWER8 split core on powernv 2014-05-28 13:35:37 +10:00
subcore.h powerpc/powernv: Add support for POWER8 split core on powernv 2014-05-28 13:35:37 +10:00