From b03102c0100289f43d27f42fa12e7304b531b4d3 Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Tue, 3 Dec 2019 10:45:26 +0800 Subject: [PATCH] iommu/rockchip: add max segment size for device The default max segment size is 64Kb, if memory that device want to map larger than default then it will break to several times mapping which may result in non-contiguous IOVA. So set to 4Gb Change-Id: I22eb7f30a3f741689c8c32734509c34f99fd8100 Signed-off-by: Simon Xue --- drivers/iommu/rockchip-iommu.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index d0316996279e..ed39fbafd496 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1108,6 +1108,14 @@ static int rk_iommu_add_device(struct device *dev) data->defer_attach = false; + /* set max segment size for dev, needed for single chunk map */ + if (!dev->dma_parms) + dev->dma_parms = kzalloc(sizeof(*dev->dma_parms), GFP_KERNEL); + if (!dev->dma_parms) + return -ENOMEM; + + dma_set_max_seg_size(dev, DMA_BIT_MASK(32)); + return 0; } @@ -1118,6 +1126,9 @@ static void rk_iommu_remove_device(struct device *dev) iommu = rk_iommu_from_dev(dev); + kfree(dev->dma_parms); + dev->dma_parms = NULL; + device_link_del(data->link); iommu_device_unlink(&iommu->iommu, dev); iommu_group_remove_device(dev);