linux/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
..
Kconfig powerpc: Disallow lparcfg being a module 2006-03-14 11:35:37 +11:00
Makefile [POWERPC] Move rtas_stop_self() into platforms/pseries/hotplug-cpu.c 2006-12-08 15:55:54 +11:00
eeh.c [POWERPC] EEH recovery tweaks 2006-12-08 17:10:18 +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 WorkStruct: make allyesconfig 2006-11-22 14:57:56 +00:00
firmware.c [POWERPC] pseries: Constify & voidify get_property() 2006-07-31 15:55:04 +10:00
firmware.h [PATCH] powerpc: Move pSeries firmware feature setup into platforms/pseries 2006-02-10 16:52:03 +11:00
hotplug-cpu.c [POWERPC] Cleanup pass over platforms/pseries/hotplug-cpu.c 2006-12-08 15:55:55 +11:00
hvCall.S [POWERPC] Fix bugs in the hypervisor call stats code 2007-01-09 17:03:03 +11:00
hvCall_inst.c [POWERPC] Fix bugs in the hypervisor call stats code 2007-01-09 17:03:03 +11:00
hvconsole.c [POWERPC] clean up pseries hcall interfaces 2006-08-01 16:19:15 +10:00
hvcserver.c [PATCH] powerpc/pseries: Change H_StudlyCaps to H_SHOUTING_CAPS 2006-04-01 22:36:57 +11:00
iommu.c [POWERPC] Fix broken DMA on non-LPAR pSeries 2007-01-22 21:27:35 +11:00
lpar.c [POWERPC] Make pSeries_lpar_hpte_insert static 2006-10-16 16:33:04 +10:00
nvram.c [POWERPC] pseries: Constify & voidify get_property() 2006-07-31 15:55:04 +10:00
pci.c [POWERPC] Make pci_read_irq_line the default 2006-12-04 16:00:04 +11:00
pci_dlpar.c [POWERPC] Generic OF platform driver for PCI host bridges. 2006-12-04 20:38:49 +11:00
plpar_wrappers.h [POWERPC] Implement SLB shadow buffer 2006-08-08 17:08:56 +10:00
ras.c IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00
ras.h [PATCH] cell: enable pause(0) in cpu_idle 2006-01-09 15:44:32 +11:00
reconfig.c [POWERPC] Replace kmalloc+memset with kzalloc 2006-12-04 20:42:09 +11:00
rtasd.c [POWERPC] pseries: Constify & voidify get_property() 2006-07-31 15:55:04 +10:00
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 IRQ: Maintain regs pointer globally rather than passing to IRQ handlers 2006-10-05 15:10:12 +01:00