Skip to content

Commit

Permalink
iommu/rockchip: Support sharing IOMMU between masters
Browse files Browse the repository at this point in the history
There would be some masters sharing the same IOMMU device. Put them in
the same iommu group and share the same iommu domain.

Signed-off-by: Jeffy Chen <[email protected]>
Reviewed-by: Robin Murphy <[email protected]>
Signed-off-by: Joerg Roedel <[email protected]>
  • Loading branch information
JeffyCN authored and joergroedel committed Mar 29, 2018
1 parent 0f181d3 commit 57c2695
Showing 1 changed file with 20 additions and 2 deletions.
22 changes: 20 additions & 2 deletions drivers/iommu/rockchip-iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ struct rk_iommu {
struct iommu_device iommu;
struct list_head node; /* entry in rk_iommu_domain.iommus */
struct iommu_domain *domain; /* domain to which iommu is attached */
struct iommu_group *group;
};

struct rk_iommudata {
Expand Down Expand Up @@ -1073,6 +1074,15 @@ static void rk_iommu_remove_device(struct device *dev)
iommu_group_remove_device(dev);
}

static struct iommu_group *rk_iommu_device_group(struct device *dev)
{
struct rk_iommu *iommu;

iommu = rk_iommu_from_dev(dev);

return iommu_group_ref_get(iommu->group);
}

static int rk_iommu_of_xlate(struct device *dev,
struct of_phandle_args *args)
{
Expand Down Expand Up @@ -1104,7 +1114,7 @@ static const struct iommu_ops rk_iommu_ops = {
.add_device = rk_iommu_add_device,
.remove_device = rk_iommu_remove_device,
.iova_to_phys = rk_iommu_iova_to_phys,
.device_group = generic_device_group,
.device_group = rk_iommu_device_group,
.pgsize_bitmap = RK_IOMMU_PGSIZE_BITMAP,
.of_xlate = rk_iommu_of_xlate,
};
Expand Down Expand Up @@ -1173,9 +1183,15 @@ static int rk_iommu_probe(struct platform_device *pdev)
if (err)
return err;

iommu->group = iommu_group_alloc();
if (IS_ERR(iommu->group)) {
err = PTR_ERR(iommu->group);
goto err_unprepare_clocks;
}

err = iommu_device_sysfs_add(&iommu->iommu, dev, NULL, dev_name(dev));
if (err)
goto err_unprepare_clocks;
goto err_put_group;

iommu_device_set_ops(&iommu->iommu, &rk_iommu_ops);
iommu_device_set_fwnode(&iommu->iommu, &dev->of_node->fwnode);
Expand All @@ -1199,6 +1215,8 @@ static int rk_iommu_probe(struct platform_device *pdev)
return 0;
err_remove_sysfs:
iommu_device_sysfs_remove(&iommu->iommu);
err_put_group:
iommu_group_put(iommu->group);
err_unprepare_clocks:
clk_bulk_unprepare(iommu->num_clocks, iommu->clocks);
return err;
Expand Down

0 comments on commit 57c2695

Please sign in to comment.