• Linas Vepstas's avatar
    [POWERPC] Fix broken DMA on non-LPAR pSeries · 77319254
    Linas Vepstas authored
    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: default avatarLinas Vepstas <linas@austin.ibm.com>
    Acked-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    77319254
iommu.c 15.5 KB