|
@@ -443,6 +443,17 @@ static void pnv_pci_ioda_dma_dev_setup(struct pnv_phb *phb, struct pci_dev *pdev
|
|
|
set_iommu_table_base(&pdev->dev, &pe->tce32_table);
|
|
|
}
|
|
|
|
|
|
+static void pnv_ioda_setup_bus_dma(struct pnv_ioda_pe *pe, struct pci_bus *bus)
|
|
|
+{
|
|
|
+ struct pci_dev *dev;
|
|
|
+
|
|
|
+ list_for_each_entry(dev, &bus->devices, bus_list) {
|
|
|
+ set_iommu_table_base(&dev->dev, &pe->tce32_table);
|
|
|
+ if (dev->subordinate)
|
|
|
+ pnv_ioda_setup_bus_dma(pe, dev->subordinate);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void pnv_pci_ioda1_tce_invalidate(struct iommu_table *tbl,
|
|
|
u64 *startp, u64 *endp)
|
|
|
{
|
|
@@ -599,6 +610,11 @@ static void pnv_pci_ioda_setup_dma_pe(struct pnv_phb *phb,
|
|
|
iommu_init_table(tbl, phb->hose->node);
|
|
|
iommu_register_group(tbl, pci_domain_nr(pe->pbus), pe->pe_number);
|
|
|
|
|
|
+ if (pe->pdev)
|
|
|
+ set_iommu_table_base(&pe->pdev->dev, tbl);
|
|
|
+ else
|
|
|
+ pnv_ioda_setup_bus_dma(pe, pe->pbus);
|
|
|
+
|
|
|
return;
|
|
|
fail:
|
|
|
/* XXX Failure: Try to fallback to 64-bit only ? */
|
|
@@ -670,6 +686,11 @@ static void pnv_pci_ioda2_setup_dma_pe(struct pnv_phb *phb,
|
|
|
}
|
|
|
iommu_init_table(tbl, phb->hose->node);
|
|
|
|
|
|
+ if (pe->pdev)
|
|
|
+ set_iommu_table_base(&pe->pdev->dev, tbl);
|
|
|
+ else
|
|
|
+ pnv_ioda_setup_bus_dma(pe, pe->pbus);
|
|
|
+
|
|
|
return;
|
|
|
fail:
|
|
|
if (pe->tce32_seg >= 0)
|