Commit cf193888 authored by Joerg Roedel's avatar Joerg Roedel
Browse files

iommu: Move new probe_device path to separate function



This makes it easier to remove to old code-path when all drivers are
converted. As a side effect that it also fixes the error cleanup
path.

Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
Tested-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Acked-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
Link: https://lore.kernel.org/r/20200429133712.31431-11-joro@8bytes.org


Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 41df6dcc
Loading
Loading
Loading
Loading
+46 −23
Original line number Original line Diff line number Diff line
@@ -218,27 +218,15 @@ out_release:
	return ret;
	return ret;
}
}


int iommu_probe_device(struct device *dev)
static int __iommu_probe_device_helper(struct device *dev)
{
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;
	const struct iommu_ops *ops = dev->bus->iommu_ops;
	int ret;

	WARN_ON(dev->iommu_group);
	if (!ops)
		return -EINVAL;

	if (!dev_iommu_get(dev))
		return -ENOMEM;

	if (!try_module_get(ops->owner)) {
		ret = -EINVAL;
		goto err_free_dev_param;
	}

	if (ops->probe_device) {
	struct iommu_group *group;
	struct iommu_group *group;
	int ret;


	ret = __iommu_probe_device(dev, NULL);
	ret = __iommu_probe_device(dev, NULL);
	if (ret)
		goto err_out;


	/*
	/*
	 * Try to allocate a default domain - needs support from the
	 * Try to allocate a default domain - needs support from the
@@ -246,19 +234,54 @@ int iommu_probe_device(struct device *dev)
	 * support default domains, so the return value is not yet
	 * support default domains, so the return value is not yet
	 * checked.
	 * checked.
	 */
	 */
		if (!ret)
	iommu_alloc_default_domain(dev);
	iommu_alloc_default_domain(dev);


	group = iommu_group_get(dev);
	group = iommu_group_get(dev);
		if (group && group->default_domain) {
	if (!group)
		goto err_release;

	if (group->default_domain)
		ret = __iommu_attach_device(group->default_domain, dev);
		ret = __iommu_attach_device(group->default_domain, dev);

	iommu_group_put(group);
	iommu_group_put(group);

	if (ret)
		goto err_release;

	if (ops->probe_finalize)
		ops->probe_finalize(dev);

	return 0;

err_release:
	iommu_release_device(dev);
err_out:
	return ret;

}
}


	} else {
int iommu_probe_device(struct device *dev)
		ret = ops->add_device(dev);
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;
	int ret;

	WARN_ON(dev->iommu_group);

	if (!ops)
		return -EINVAL;

	if (!dev_iommu_get(dev))
		return -ENOMEM;

	if (!try_module_get(ops->owner)) {
		ret = -EINVAL;
		goto err_free_dev_param;
	}
	}


	if (ops->probe_device)
		return __iommu_probe_device_helper(dev);

	ret = ops->add_device(dev);
	if (ret)
	if (ret)
		goto err_module_put;
		goto err_module_put;