mirror of https://gitee.com/openkylin/linux.git
[POWERPC] Fix potential cell IOMMU bug when switching back to default DMA ops
If we get a 64-bit dma mask we switch to the fixed ops and call cell_dma_dev_setup(). If the driver then switches back to a 32-bit dma mask for any reason we don't call cell_dma_dev_setup() again, which has the potential to leave bogus data in dev->archdata.dma_data. Signed-off-by: Michael Ellerman <michael@ellerman.id.au> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
0e0b47abb7
commit
4a8df1507e
|
@ -841,19 +841,18 @@ static int dma_set_mask_and_switch(struct device *dev, u64 dma_mask)
|
|||
if (!dev->dma_mask || !dma_supported(dev, dma_mask))
|
||||
return -EIO;
|
||||
|
||||
if (dma_mask == DMA_BIT_MASK(64)) {
|
||||
if (cell_iommu_get_fixed_address(dev) == OF_BAD_ADDR)
|
||||
dev_dbg(dev, "iommu: 64-bit OK, but bad addr\n");
|
||||
else {
|
||||
dev_dbg(dev, "iommu: 64-bit OK, using fixed ops\n");
|
||||
set_dma_ops(dev, &dma_iommu_fixed_ops);
|
||||
cell_dma_dev_setup(dev);
|
||||
}
|
||||
if (dma_mask == DMA_BIT_MASK(64) &&
|
||||
cell_iommu_get_fixed_address(dev) != OF_BAD_ADDR)
|
||||
{
|
||||
dev_dbg(dev, "iommu: 64-bit OK, using fixed ops\n");
|
||||
set_dma_ops(dev, &dma_iommu_fixed_ops);
|
||||
} else {
|
||||
dev_dbg(dev, "iommu: not 64-bit, using default ops\n");
|
||||
set_dma_ops(dev, get_pci_dma_ops());
|
||||
}
|
||||
|
||||
cell_dma_dev_setup(dev);
|
||||
|
||||
*dev->dma_mask = dma_mask;
|
||||
|
||||
return 0;
|
||||
|
|
Loading…
Reference in New Issue