Urgent: powerpc 2.6.20-rc4 dma broken on non-LPAR pseries
PATCH 1/1 Urgent: powerpc 2.6.20-rc4 dma broken on non-LPAR pseries
Paul, please review, apply and send upstream.
I marked the subject line as urgent, as I think 2.6.20-rc4 is broken for all pSeries non-LPAR systems.
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 breif discussion on this on irc.
----
arch/powerpc/platforms/pseries/iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/powerpc/platforms/pseries/iommu.c +2 -1
@@ -459,7 +459,8 @@ static void pci_dma_dev_setup_pSeries(st tbl =kmalloc_node (sizeof (struct iommu_table ),GFP_KERNEL , phb->node);iommu_table_setparms (phb, dn, tbl); - dev->dev.archdata.dma_data =iommu_init_table (tbl, phb->node); +PCI_DN (dn)->iommu_table =iommu_init_table (tbl, phb->node); + dev->dev.archdata.dma_data =PCI_DN (dn)->iommu_table;return ; }
Quoted 29 lines · Linas Vepstas
Paul, please review, apply and send upstream.
I marked the subject line as urgent, as I think 2.6.20-rc4 is broken for all pSeries non-LPAR systems.
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=41No iommu table? How can that be? Well, circa line 471 of
arch/powerpc/platforms/pseries/iommu.cwe 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.
Quoted 5 lines
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 breif discussion on this on irc.
Signed-off-by Linas Vepstas <[email protected]>
Quoted 18 lines
----
arch/powerpc/platforms/pseries/iommu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)Index:
linux-2.6.20-rc4/arch/powerpc/platforms/pseries/iommu.c
===================================================================arch/powerpc/platforms/pseries/iommu.c +2
-1@@ -459,7 +459,8 @@ static void pci_dma_dev_setup_pSeries(st tbl =kmalloc_node (sizeof (struct iommu_table ),GFP_KERNEL , phb->node);iommu_table_setparms (phb, dn, tbl); - dev->dev.archdata.dma_data =iommu_init_table (tbl, phb->node); +PCI_DN (dn)->iommu_table =iommu_init_table (tbl, phb->node); + dev->dev.archdata.dma_data =PCI_DN (dn)->iommu_table;return ; }