iommu/tegra-smmu: Add iommu_group support
authorRobin Murphy <robin.murphy@arm.com>
Fri, 21 Jul 2017 12:12:36 +0000 (13:12 +0100)
committerJoerg Roedel <jroedel@suse.de>
Wed, 9 Aug 2017 22:03:50 +0000 (00:03 +0200)
As the last step to making groups mandatory, clean up the remaining
drivers by adding basic support. Whilst it may not perfectly reflect
the isolation capabilities of the hardware (tegra_smmu_swgroup sounds
suspiciously like something that might warrant representing at the
iommu_group level), using generic_device_group() should at least
maintain existing behaviour with respect to the API.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Tested-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/tegra-smmu.c

index eeb19f560a05ee54d87da40859e206626f1418a6..faa9c1e704826f6bbfcd020255dd5b5bbab434eb 100644 (file)
@@ -704,6 +704,7 @@ static struct tegra_smmu *tegra_smmu_find(struct device_node *np)
 static int tegra_smmu_add_device(struct device *dev)
 {
        struct device_node *np = dev->of_node;
+       struct iommu_group *group;
        struct of_phandle_args args;
        unsigned int index = 0;
 
@@ -725,12 +726,19 @@ static int tegra_smmu_add_device(struct device *dev)
                index++;
        }
 
+       group = iommu_group_get_for_dev(dev);
+       if (IS_ERR(group))
+               return PTR_ERR(group);
+
+       iommu_group_put(group);
+
        return 0;
 }
 
 static void tegra_smmu_remove_device(struct device *dev)
 {
        dev->archdata.iommu = NULL;
+       iommu_group_remove_device(dev);
 }
 
 static const struct iommu_ops tegra_smmu_ops = {
@@ -741,6 +749,7 @@ static const struct iommu_ops tegra_smmu_ops = {
        .detach_dev = tegra_smmu_detach_dev,
        .add_device = tegra_smmu_add_device,
        .remove_device = tegra_smmu_remove_device,
+       .device_group = generic_device_group,
        .map = tegra_smmu_map,
        .unmap = tegra_smmu_unmap,
        .map_sg = default_iommu_map_sg,