Skip to content

Commit

Permalink
iommu/arm-smmu: add devices attached to the SMMU to an IOMMU group
Browse files Browse the repository at this point in the history
IOMMU groups are expected by certain users of the IOMMU API,
e.g. VFIO. Add new devices found by the SMMU driver to an IOMMU
group to satisfy those users.

Acked-by: Alex Williamson <alex.williamson@redhat.com>
Signed-off-by: Antonios Motakis <a.motakis@virtualopensystems.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
  • Loading branch information
Antonios Motakis authored and Will Deacon committed Dec 16, 2013
1 parent 319e2e3 commit 5fc63a7
Showing 1 changed file with 18 additions and 1 deletion.
19 changes: 18 additions & 1 deletion drivers/iommu/arm-smmu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1494,6 +1494,13 @@ static int arm_smmu_add_device(struct device *dev)
{
struct arm_smmu_device *child, *parent, *smmu;
struct arm_smmu_master *master = NULL;
struct iommu_group *group;
int ret;

if (dev->archdata.iommu) {
dev_warn(dev, "IOMMU driver already assigned to device\n");
return -EINVAL;
}

spin_lock(&arm_smmu_devices_lock);
list_for_each_entry(parent, &arm_smmu_devices, list) {
Expand Down Expand Up @@ -1526,13 +1533,23 @@ static int arm_smmu_add_device(struct device *dev)
if (!master)
return -ENODEV;

group = iommu_group_alloc();
if (IS_ERR(group)) {
dev_err(dev, "Failed to allocate IOMMU group\n");
return PTR_ERR(group);
}

ret = iommu_group_add_device(group, dev);
iommu_group_put(group);
dev->archdata.iommu = smmu;
return 0;

return ret;
}

static void arm_smmu_remove_device(struct device *dev)
{
dev->archdata.iommu = NULL;
iommu_group_remove_device(dev);
}

static struct iommu_ops arm_smmu_ops = {
Expand Down

0 comments on commit 5fc63a7

Please sign in to comment.