diff options
author | Linas Vepstas <linas@austin.ibm.com> | 2007-01-11 02:16:29 +0100 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2007-01-22 11:27:35 +0100 |
commit | 77319254f109963213f33cbb15e0103f2e81a64a (patch) | |
tree | 5e22d54b95ab0a5422d6df03e57ff4b896ad8828 /Documentation/powerpc | |
parent | [POWERPC] Fix cell's mmio nvram to properly parse device tree (diff) | |
download | linux-77319254f109963213f33cbb15e0103f2e81a64a.tar.xz linux-77319254f109963213f33cbb15e0103f2e81a64a.zip |
[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>
Diffstat (limited to 'Documentation/powerpc')
0 files changed, 0 insertions, 0 deletions