| From 74251fe21bfa9310ddba9e0436d1fcf389e602ee Mon Sep 17 00:00:00 2001 |
| From: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Date: Mon, 1 Jul 2013 17:54:09 +1000 |
| Subject: powerpc/powernv: Fix iommu initialization again |
| |
| From: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| |
| commit 74251fe21bfa9310ddba9e0436d1fcf389e602ee upstream. |
| |
| So because those things always end up in trainwrecks... In 7846de406 |
| we moved back the iommu initialization earlier, essentially undoing |
| 37f02195b which was causing us endless trouble... except that in the |
| meantime we had merged 959c9bdd58 (to workaround the original breakage) |
| which is now ... broken :-) |
| |
| This fixes it by doing a partial revert of the latter (we keep the |
| ppc_md. path which will be needed in the hotplug case, which happens |
| also during some EEH error recovery situations). |
| |
| Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/powerpc/platforms/powernv/pci-ioda.c | 21 +++++++++++++++++++++ |
| 1 file changed, 21 insertions(+) |
| |
| --- a/arch/powerpc/platforms/powernv/pci-ioda.c |
| +++ b/arch/powerpc/platforms/powernv/pci-ioda.c |
| @@ -441,6 +441,17 @@ static void pnv_pci_ioda_dma_dev_setup(s |
| 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) |
| { |
| @@ -596,6 +607,11 @@ static void pnv_pci_ioda_setup_dma_pe(st |
| } |
| 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: |
| /* XXX Failure: Try to fallback to 64-bit only ? */ |
| @@ -667,6 +683,11 @@ static void pnv_pci_ioda2_setup_dma_pe(s |
| } |
| 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) |