ARM: dma-mapping: Pass device to arm_iommu_create_mapping()
Subsystems (8)
PATCH 1/2 ARM: dma-mapping: Pass device to arm_iommu_create_mapping()
From: Robin Murphy <[email protected]>
All users of ARM IOMMU mappings create them for a particular device, so change the interface to accept the device rather than forcing a vague indirection through a bus type. This prepares for making a similar change to iommu_domain_alloc() itself.
--- arch/arm/include/asm/dma-iommu.h | 2 +- arch/arm/mm/dma-mapping.c | 8 ++++---- drivers/gpu/drm/exynos/exynos_drm_dma.c | 2 +- drivers/iommu/ipmmu-vmsa.c | 3 +-- drivers/iommu/mtk_iommu_v1.c | 3 +-- drivers/media/platform/ti/omap3isp/isp.c | 2 +- 6 files changed, 9 insertions(+), 11 deletions(-)
arch/arm/include/asm/dma-iommu.h +1 -1
@@ -24,7 +24,7 @@ struct dma_iommu_mapping { };struct dma_iommu_mapping * -arm_iommu_create_mapping (const struct bus_type *bus,dma_addr_t base,u64 size); +arm_iommu_create_mapping (struct device *dev,dma_addr_t base,u64 size);void arm_iommu_release_mapping (struct dma_iommu_mapping *mapping);
arch/arm/mm/dma-mapping.c +4 -4
@@ -1532,7 +1532,7 @@ static const struct dma_map_ops iommu_ops = {/** * arm_iommu_create_mapping -* @bus: pointer to the bus holding the client device (for IOMMU calls) +* @dev: pointer to the client device (for IOMMU calls) * @base: start address of the valid IO address space * @size: maximum size of the valid IO address space *
@@ -1544,7 +1544,7 @@ static const struct dma_map_ops iommu_ops = {* arm_iommu_attach_device function. */ struct dma_iommu_mapping * -arm_iommu_create_mapping (const struct bus_type *bus,dma_addr_t base,u64 size) +arm_iommu_create_mapping (struct device *dev,dma_addr_t base,u64 size) {unsigned int bits = size >>PAGE_SHIFT ;unsigned int bitmap_size =BITS_TO_LONGS (bits) *sizeof (long );
@@ -1585,7 +1585,7 @@ arm_iommu_create_mapping(const struct bus_type *bus, dma_addr_t base, u64 size)spin_lock_init (&mapping->lock); - mapping->domain =iommu_domain_alloc (bus); + mapping->domain =iommu_domain_alloc (dev->bus);if (!mapping->domain) goto err4;
@@ -1718,7 +1718,7 @@ static void arm_setup_iommu_dma_ops(struct device *dev) dma_base =dma_range_map_min (dev->dma_range_map); size =dma_range_map_max (dev->dma_range_map) - dma_base; } - mapping =arm_iommu_create_mapping (dev->bus, dma_base, size); + mapping =arm_iommu_create_mapping (dev, dma_base, size);if (IS_ERR (mapping)) {pr_warn ("Failed to create %llu-byte IOMMU mapping for device %s\n" , size,dev_name (dev));
drivers/gpu/drm/exynos/exynos_drm_dma.c +1 -1
@@ -110,7 +110,7 @@ int exynos_drm_register_dma(struct drm_device *drm, struct device *dev,void *mapping =NULL ;if (IS_ENABLED (CONFIG_ARM_DMA_USE_IOMMU )) - mapping =arm_iommu_create_mapping (&platform_bus_type, + mapping =arm_iommu_create_mapping (dev,EXYNOS_DEV_ADDR_START ,EXYNOS_DEV_ADDR_SIZE );else if (IS_ENABLED (CONFIG_IOMMU_DMA )) mapping =iommu_get_domain_for_dev (priv->dma_dev);
drivers/iommu/ipmmu-vmsa.c +1 -2
@@ -804,8 +804,7 @@ static int ipmmu_init_arm_mapping(struct device *dev)if (!mmu->mapping) {struct dma_iommu_mapping *mapping; - mapping =arm_iommu_create_mapping (&platform_bus_type, -SZ_1G ,SZ_2G ); + mapping =arm_iommu_create_mapping (dev,SZ_1G ,SZ_2G );if (IS_ERR (mapping)) {dev_err (mmu->dev,"failed to create ARM IOMMU mapping\n" ); ret =PTR_ERR (mapping);
drivers/iommu/mtk_iommu_v1.c +1 -2
@@ -433,8 +433,7 @@ static int mtk_iommu_v1_create_mapping(struct device *dev, mtk_mapping = data->mapping;if (!mtk_mapping) {/* MTK iommu support 4GB iova address space. */ - mtk_mapping =arm_iommu_create_mapping (&platform_bus_type, -0 ,1ULL <<32 ); + mtk_mapping =arm_iommu_create_mapping (dev,0 ,1ULL <<32 );if (IS_ERR (mtk_mapping))return PTR_ERR (mtk_mapping);
drivers/media/platform/ti/omap3isp/isp.c +1 -1
@@ -1965,7 +1965,7 @@ static int isp_attach_iommu(struct isp_device *isp)* Create the ARM mapping, used by the ARM DMA mapping core to allocate * VAs. This will allocate a corresponding IOMMU domain. */ - mapping =arm_iommu_create_mapping (&platform_bus_type,SZ_1G ,SZ_2G ); + mapping =arm_iommu_create_mapping (isp->dev,SZ_1G ,SZ_2G );if (IS_ERR (mapping)) {dev_err (isp->dev,"failed to create ARM IOMMU mapping\n" );return PTR_ERR (mapping);
Signature · 1 line
2.34.1
PATCH 2/2 ARM: dma-mapping: Use iommu_paging_domain_alloc()
Since arm_iommu_create_mapping() now accepts the device, let's replace iommu_domain_alloc() with iommu_paging_domain_alloc() to retire the former.
--- arch/arm/mm/dma-mapping.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/arm/mm/dma-mapping.c +4 -2
@@ -1585,9 +1585,11 @@ arm_iommu_create_mapping(struct device *dev, dma_addr_t base, u64 size)spin_lock_init (&mapping->lock); - mapping->domain =iommu_domain_alloc (dev->bus); -if (!mapping->domain) + mapping->domain =iommu_paging_domain_alloc (dev); +if (IS_ERR (mapping->domain)) { + err =PTR_ERR (mapping->domain); goto err4; + }kref_init (&mapping->kref);return mapping;
Signature · 1 line
2.34.1
Quoted 10 lines · Lu Baolu
From: Robin Murphy <[email protected]>
All users of ARM IOMMU mappings create them for a particular device, so change the interface to accept the device rather than forcing a vague indirection through a bus type. This prepares for making a similar change to
iommu_domain_alloc()itself.Signed-off-by Robin Murphy <[email protected]>Signed-off-by Lu Baolu <[email protected]>
Quoted 8 lines
--- arch/arm/include/asm/dma-iommu.h | 2 +- arch/arm/mm/dma-mapping.c | 8 ++++---- drivers/gpu/drm/exynos/exynos_drm_dma.c | 2 +- drivers/iommu/ipmmu-vmsa.c | 3 +-- drivers/iommu/mtk_iommu_v1.c | 3 +-- drivers/media/platform/ti/omap3isp/isp.c | 2 +- 6 files changed, 9 insertions(+), 11 deletions(-)
I still have an account with RMK's patch tracking system, so I went ahead and put these there so Russell can pick them up:
https://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=9417/1
https://www.arm.linux.org.uk/developer/patches/viewpatch.php?id=9418/1
I think I did it right, though it has been a decade since I last did this..
Regards,
Jason