kernel-ark/arch/powerpc/platforms/pseries
Linas Vepstas 77319254f1 [POWERPC] Fix broken DMA on non-LPAR pSeries
It appears that the iommu table address is never stored, and thus
never found, on non-lpar systems. Thus, for example, during boot:

<7>[   93.067916] PCI: Scanning bus 0001:41
<7>[   93.068542] PCI: Found 0001:41:01.0 [8086/100f] 000200 00
<7>[   93.068550] PCI: Calling quirk c0000000007822e0 for 0001:41:01.0
<7>[   93.069815] PCI: Fixups for bus 0001:41
<4>[   93.070167] iommu: Device 0001:41:01.0 has no iommu table
<7>[   93.070251] PCI: Bus scan for 0001:41 returning with max=41

No iommu table? How can that be? Well, circa line 471 of
arch/powerpc/platforms/pseries/iommu.c we see the code:

   while (dn && PCI_DN(dn) && PCI_DN(dn)->iommu_table == NULL)
      dn = dn->parent;

and a few lines later is the surprising print statement about
the missing table.  Seems that this loop ran unto the end, never
once finding a non-null PCI_DN(dn)->iommu_table.

The problem can be found a few lines earlier: it sems that the
value of PCI_DN(dn)->iommu_table is never ever set. Thus, the
patch sets it.

The patch was tested on a Power4 system running in full system
partition mode, which is where I saw the problem. It works; I've
not done any wider testing. Had a brief discussion on this on irc.

Signed-off-by: Linas Vepstas <linas@austin.ibm.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-01-22 21:27:35 +11:00
..
eeh_cache.c [PATCH] getting rid of all casts of k[cmz]alloc() calls 2006-12-13 09:05:58 -08:00
eeh_driver.c [POWERPC] EEH recovery tweaks 2006-12-08 17:10:18 +11:00
eeh_event.c
eeh.c [POWERPC] EEH recovery tweaks 2006-12-08 17:10:18 +11:00
firmware.c
firmware.h
hotplug-cpu.c [POWERPC] Cleanup pass over platforms/pseries/hotplug-cpu.c 2006-12-08 15:55:55 +11:00
hvCall_inst.c [POWERPC] Fix bugs in the hypervisor call stats code 2007-01-09 17:03:03 +11:00
hvCall.S [POWERPC] Fix bugs in the hypervisor call stats code 2007-01-09 17:03:03 +11:00
hvconsole.c
hvcserver.c
iommu.c [POWERPC] Fix broken DMA on non-LPAR pSeries 2007-01-22 21:27:35 +11:00
Kconfig
lpar.c
Makefile [POWERPC] Move rtas_stop_self() into platforms/pseries/hotplug-cpu.c 2006-12-08 15:55:54 +11:00
nvram.c
pci_dlpar.c
pci.c
plpar_wrappers.h
ras.c
ras.h
reconfig.c [POWERPC] Replace kmalloc+memset with kzalloc 2006-12-04 20:42:09 +11:00
rtasd.c
scanlog.c [PATCH] struct path: convert powerpc 2006-12-08 08:28:48 -08:00
setup.c [POWERPC] dont allow pSeries_probe to succeed without initialising MMU 2006-12-09 11:39:06 +11:00
smp.c [POWERPC] Move the rest of the hotplug cpu code into platforms/pseries/hotplug-cpu.c 2006-12-08 15:55:55 +11:00
xics.c [POWERPC] Avoid calling get_irq_server() with a real, not virtual irq. 2007-01-09 17:03:01 +11:00
xics.h