]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
iommu/exynos: Use first SYSMMU in controllers list for IOMMU core
authorJoerg Roedel <jroedel@suse.de>
Wed, 29 Apr 2020 13:37:08 +0000 (15:37 +0200)
committerJoerg Roedel <jroedel@suse.de>
Tue, 5 May 2020 12:36:14 +0000 (14:36 +0200)
On Exynos platforms there can be more than one SYSMMU (IOMMU) for one
DMA master device. Since the IOMMU core code expects only one hardware
IOMMU, use the first SYSMMU in the list.

Signed-off-by: Joerg Roedel <jroedel@suse.de>
Tested-by: Marek Szyprowski <m.szyprowski@samsung.com>
Acked-by: Marek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20200429133712.31431-31-joro@8bytes.org
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/exynos-iommu.c

index 186ff5cc975ca14cc33484daa4562da4d73cde30..09cdd163560acbaf8e3198882111e7fffc798f26 100644 (file)
@@ -1261,6 +1261,11 @@ static int exynos_iommu_add_device(struct device *dev)
        }
        iommu_group_put(group);
 
+       /* There is always at least one entry, see exynos_iommu_of_xlate() */
+       data = list_first_entry(&owner->controllers,
+                               struct sysmmu_drvdata, owner_node);
+       iommu_device_link(&data->iommu, dev);
+
        return 0;
 }
 
@@ -1286,6 +1291,11 @@ static void exynos_iommu_remove_device(struct device *dev)
 
        list_for_each_entry(data, &owner->controllers, owner_node)
                device_link_del(data->link);
+
+       /* There is always at least one entry, see exynos_iommu_of_xlate() */
+       data = list_first_entry(&owner->controllers,
+                               struct sysmmu_drvdata, owner_node);
+       iommu_device_unlink(&data->iommu, dev);
 }
 
 static int exynos_iommu_of_xlate(struct device *dev,