Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5fc63a7c authored by Antonios Motakis's avatar Antonios Motakis Committed by Will Deacon
Browse files

iommu/arm-smmu: add devices attached to the SMMU to an IOMMU group



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: default avatarAlex Williamson <alex.williamson@redhat.com>
Signed-off-by: default avatarAntonios Motakis <a.motakis@virtualopensystems.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
parent 319e2e3f
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -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) {
@@ -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 = {