Skip to content

Commit

Permalink
powerpc/pseries/iommu: Add additional checks when changing iommu mask
Browse files Browse the repository at this point in the history
Do not check dma supported until we have chosen the right dma ops.
Check that the device is pci before treating it as such.

Check the mask is supported by the selected dma ops before
committing it.

We only need to set iommu ops if it is not the current ops; this
avoids searching the tree for the iommu table unnecessarily.

Signed-off-by: Milton Miller <miltonm@bga.com>
Signed-off-by: Nishanth Aravamudan <nacc@us.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
  • Loading branch information
Milton Miller authored and Benjamin Herrenschmidt committed May 19, 2011
1 parent 23a6c48 commit 64ac822
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions arch/powerpc/platforms/pseries/iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1026,9 +1026,12 @@ static int dma_set_mask_pSeriesLP(struct device *dev, u64 dma_mask)
const void *dma_window = NULL;
u64 dma_offset;

if (!dev->dma_mask || !dma_supported(dev, dma_mask))
if (!dev->dma_mask)
return -EIO;

if (!dev_is_pci(dev))
goto check_mask;

pdev = to_pci_dev(dev);

/* only attempt to use a new window if 64-bit DMA is requested */
Expand Down Expand Up @@ -1059,13 +1062,17 @@ static int dma_set_mask_pSeriesLP(struct device *dev, u64 dma_mask)
}
}

/* fall-through to iommu ops */
if (!ddw_enabled) {
dev_info(dev, "Using 32-bit DMA via iommu\n");
/* fall back on iommu ops, restore table pointer with ops */
if (!ddw_enabled && get_dma_ops(dev) != &dma_iommu_ops) {
dev_info(dev, "Restoring 32-bit DMA via iommu\n");
set_dma_ops(dev, &dma_iommu_ops);
pci_dma_dev_setup_pSeriesLP(pdev);
}

check_mask:
if (!dma_supported(dev, dma_mask))
return -EIO;

*dev->dma_mask = dma_mask;
return 0;
}
Expand Down

0 comments on commit 64ac822

Please sign in to comment.