mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-23 12:14:10 +08:00
iommu: Streamline registration interface
Rather than have separate opaque setter functions that are easy to overlook and lead to repetitive boilerplate in drivers, let's pass the relevant initialisation parameters directly to iommu_device_register(). Acked-by: Will Deacon <will@kernel.org> Signed-off-by: Robin Murphy <robin.murphy@arm.com> Link: https://lore.kernel.org/r/ab001b87c533b6f4db71eb90db6f888953986c36.1617285386.git.robin.murphy@arm.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
parent
c0aec6680b
commit
2d471b20c5
@ -1888,8 +1888,7 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
|
||||
|
||||
iommu_device_sysfs_add(&iommu->iommu, &iommu->dev->dev,
|
||||
amd_iommu_groups, "ivhd%d", iommu->index);
|
||||
iommu_device_set_ops(&iommu->iommu, &amd_iommu_ops);
|
||||
iommu_device_register(&iommu->iommu);
|
||||
iommu_device_register(&iommu->iommu, &amd_iommu_ops, NULL);
|
||||
|
||||
return pci_enable_device(iommu->dev);
|
||||
}
|
||||
|
@ -3666,10 +3666,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
|
||||
iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
|
||||
|
||||
ret = iommu_device_register(&smmu->iommu);
|
||||
ret = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register iommu\n");
|
||||
return ret;
|
||||
|
@ -2161,10 +2161,7 @@ static int arm_smmu_device_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
}
|
||||
|
||||
iommu_device_set_ops(&smmu->iommu, &arm_smmu_ops);
|
||||
iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
|
||||
|
||||
err = iommu_device_register(&smmu->iommu);
|
||||
err = iommu_device_register(&smmu->iommu, &arm_smmu_ops, dev);
|
||||
if (err) {
|
||||
dev_err(dev, "Failed to register iommu\n");
|
||||
return err;
|
||||
|
@ -847,10 +847,7 @@ static int qcom_iommu_device_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
iommu_device_set_ops(&qcom_iommu->iommu, &qcom_iommu_ops);
|
||||
iommu_device_set_fwnode(&qcom_iommu->iommu, dev->fwnode);
|
||||
|
||||
ret = iommu_device_register(&qcom_iommu->iommu);
|
||||
ret = iommu_device_register(&qcom_iommu->iommu, &qcom_iommu_ops, dev);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register iommu\n");
|
||||
return ret;
|
||||
|
@ -630,10 +630,7 @@ static int exynos_sysmmu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iommu_device_set_ops(&data->iommu, &exynos_iommu_ops);
|
||||
iommu_device_set_fwnode(&data->iommu, &dev->of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&data->iommu);
|
||||
ret = iommu_device_register(&data->iommu, &exynos_iommu_ops, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -474,9 +474,7 @@ int __init pamu_domain_init(void)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iommu_device_set_ops(&pamu_iommu, &fsl_pamu_ops);
|
||||
|
||||
ret = iommu_device_register(&pamu_iommu);
|
||||
ret = iommu_device_register(&pamu_iommu, &fsl_pamu_ops, NULL);
|
||||
if (ret) {
|
||||
iommu_device_sysfs_remove(&pamu_iommu);
|
||||
pr_err("Can't register iommu device\n");
|
||||
|
@ -1140,9 +1140,7 @@ static int alloc_iommu(struct dmar_drhd_unit *drhd)
|
||||
if (err)
|
||||
goto err_unmap;
|
||||
|
||||
iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
|
||||
|
||||
err = iommu_device_register(&iommu->iommu);
|
||||
err = iommu_device_register(&iommu->iommu, &intel_iommu_ops, NULL);
|
||||
if (err)
|
||||
goto err_unmap;
|
||||
}
|
||||
|
@ -4396,8 +4396,7 @@ int __init intel_iommu_init(void)
|
||||
iommu_device_sysfs_add(&iommu->iommu, NULL,
|
||||
intel_iommu_groups,
|
||||
"%s", iommu->name);
|
||||
iommu_device_set_ops(&iommu->iommu, &intel_iommu_ops);
|
||||
iommu_device_register(&iommu->iommu);
|
||||
iommu_device_register(&iommu->iommu, &intel_iommu_ops, NULL);
|
||||
}
|
||||
up_read(&dmar_global_lock);
|
||||
|
||||
|
@ -142,8 +142,25 @@ static int __init iommu_subsys_init(void)
|
||||
}
|
||||
subsys_initcall(iommu_subsys_init);
|
||||
|
||||
int iommu_device_register(struct iommu_device *iommu)
|
||||
/**
|
||||
* iommu_device_register() - Register an IOMMU hardware instance
|
||||
* @iommu: IOMMU handle for the instance
|
||||
* @ops: IOMMU ops to associate with the instance
|
||||
* @hwdev: (optional) actual instance device, used for fwnode lookup
|
||||
*
|
||||
* Return: 0 on success, or an error.
|
||||
*/
|
||||
int iommu_device_register(struct iommu_device *iommu,
|
||||
const struct iommu_ops *ops, struct device *hwdev)
|
||||
{
|
||||
/* We need to be able to take module references appropriately */
|
||||
if (WARN_ON(is_module_address((unsigned long)ops) && !ops->owner))
|
||||
return -EINVAL;
|
||||
|
||||
iommu->ops = ops;
|
||||
if (hwdev)
|
||||
iommu->fwnode = hwdev->fwnode;
|
||||
|
||||
spin_lock(&iommu_device_lock);
|
||||
list_add_tail(&iommu->list, &iommu_device_list);
|
||||
spin_unlock(&iommu_device_lock);
|
||||
|
@ -1076,11 +1076,7 @@ static int ipmmu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iommu_device_set_ops(&mmu->iommu, &ipmmu_ops);
|
||||
iommu_device_set_fwnode(&mmu->iommu,
|
||||
&pdev->dev.of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&mmu->iommu);
|
||||
ret = iommu_device_register(&mmu->iommu, &ipmmu_ops, &pdev->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
|
@ -792,10 +792,7 @@ static int msm_iommu_probe(struct platform_device *pdev)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
iommu_device_set_ops(&iommu->iommu, &msm_iommu_ops);
|
||||
iommu_device_set_fwnode(&iommu->iommu, &pdev->dev.of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&iommu->iommu);
|
||||
ret = iommu_device_register(&iommu->iommu, &msm_iommu_ops, &pdev->dev);
|
||||
if (ret) {
|
||||
pr_err("Could not register msm-smmu at %pa\n", &ioaddr);
|
||||
goto fail;
|
||||
|
@ -892,10 +892,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto out_link_remove;
|
||||
|
||||
iommu_device_set_ops(&data->iommu, &mtk_iommu_ops);
|
||||
iommu_device_set_fwnode(&data->iommu, &pdev->dev.of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&data->iommu);
|
||||
ret = iommu_device_register(&data->iommu, &mtk_iommu_ops, dev);
|
||||
if (ret)
|
||||
goto out_sysfs_remove;
|
||||
|
||||
|
@ -616,9 +616,7 @@ static int mtk_iommu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
iommu_device_set_ops(&data->iommu, &mtk_iommu_ops);
|
||||
|
||||
ret = iommu_device_register(&data->iommu);
|
||||
ret = iommu_device_register(&data->iommu, &mtk_iommu_ops, dev);
|
||||
if (ret)
|
||||
goto out_sysfs_remove;
|
||||
|
||||
|
@ -1235,10 +1235,7 @@ static int omap_iommu_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
goto out_group;
|
||||
|
||||
iommu_device_set_ops(&obj->iommu, &omap_iommu_ops);
|
||||
iommu_device_set_fwnode(&obj->iommu, &of->fwnode);
|
||||
|
||||
err = iommu_device_register(&obj->iommu);
|
||||
err = iommu_device_register(&obj->iommu, &omap_iommu_ops, &pdev->dev);
|
||||
if (err)
|
||||
goto out_sysfs;
|
||||
}
|
||||
|
@ -1196,10 +1196,7 @@ static int rk_iommu_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
goto err_put_group;
|
||||
|
||||
iommu_device_set_ops(&iommu->iommu, &rk_iommu_ops);
|
||||
iommu_device_set_fwnode(&iommu->iommu, &dev->of_node->fwnode);
|
||||
|
||||
err = iommu_device_register(&iommu->iommu);
|
||||
err = iommu_device_register(&iommu->iommu, &rk_iommu_ops, dev);
|
||||
if (err)
|
||||
goto err_remove_sysfs;
|
||||
|
||||
|
@ -333,9 +333,7 @@ int zpci_init_iommu(struct zpci_dev *zdev)
|
||||
if (rc)
|
||||
goto out_err;
|
||||
|
||||
iommu_device_set_ops(&zdev->iommu_dev, &s390_iommu_ops);
|
||||
|
||||
rc = iommu_device_register(&zdev->iommu_dev);
|
||||
rc = iommu_device_register(&zdev->iommu_dev, &s390_iommu_ops, NULL);
|
||||
if (rc)
|
||||
goto out_sysfs;
|
||||
|
||||
|
@ -508,10 +508,7 @@ static int sprd_iommu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto put_group;
|
||||
|
||||
iommu_device_set_ops(&sdev->iommu, &sprd_iommu_ops);
|
||||
iommu_device_set_fwnode(&sdev->iommu, &dev->of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&sdev->iommu);
|
||||
ret = iommu_device_register(&sdev->iommu, &sprd_iommu_ops, dev);
|
||||
if (ret)
|
||||
goto remove_sysfs;
|
||||
|
||||
|
@ -968,10 +968,7 @@ static int sun50i_iommu_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto err_free_group;
|
||||
|
||||
iommu_device_set_ops(&iommu->iommu, &sun50i_iommu_ops);
|
||||
iommu_device_set_fwnode(&iommu->iommu, &pdev->dev.of_node->fwnode);
|
||||
|
||||
ret = iommu_device_register(&iommu->iommu);
|
||||
ret = iommu_device_register(&iommu->iommu, &sun50i_iommu_ops, &pdev->dev);
|
||||
if (ret)
|
||||
goto err_remove_sysfs;
|
||||
|
||||
|
@ -353,10 +353,7 @@ struct gart_device *tegra_gart_probe(struct device *dev, struct tegra_mc *mc)
|
||||
if (err)
|
||||
goto free_gart;
|
||||
|
||||
iommu_device_set_ops(&gart->iommu, &gart_iommu_ops);
|
||||
iommu_device_set_fwnode(&gart->iommu, dev->fwnode);
|
||||
|
||||
err = iommu_device_register(&gart->iommu);
|
||||
err = iommu_device_register(&gart->iommu, &gart_iommu_ops, dev);
|
||||
if (err)
|
||||
goto remove_sysfs;
|
||||
|
||||
|
@ -1145,10 +1145,7 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
iommu_device_set_ops(&smmu->iommu, &tegra_smmu_ops);
|
||||
iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
|
||||
|
||||
err = iommu_device_register(&smmu->iommu);
|
||||
err = iommu_device_register(&smmu->iommu, &tegra_smmu_ops, dev);
|
||||
if (err)
|
||||
goto remove_sysfs;
|
||||
|
||||
|
@ -1066,10 +1066,7 @@ static int viommu_probe(struct virtio_device *vdev)
|
||||
if (ret)
|
||||
goto err_free_vqs;
|
||||
|
||||
iommu_device_set_ops(&viommu->iommu, &viommu_ops);
|
||||
iommu_device_set_fwnode(&viommu->iommu, parent_dev->fwnode);
|
||||
|
||||
iommu_device_register(&viommu->iommu);
|
||||
iommu_device_register(&viommu->iommu, &viommu_ops, parent_dev);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (pci_bus_type.iommu_ops != &viommu_ops) {
|
||||
|
@ -350,7 +350,9 @@ struct dev_iommu {
|
||||
void *priv;
|
||||
};
|
||||
|
||||
int iommu_device_register(struct iommu_device *iommu);
|
||||
int iommu_device_register(struct iommu_device *iommu,
|
||||
const struct iommu_ops *ops,
|
||||
struct device *hwdev);
|
||||
void iommu_device_unregister(struct iommu_device *iommu);
|
||||
int iommu_device_sysfs_add(struct iommu_device *iommu,
|
||||
struct device *parent,
|
||||
@ -361,18 +363,6 @@ int iommu_device_link(struct iommu_device *iommu, struct device *link);
|
||||
void iommu_device_unlink(struct iommu_device *iommu, struct device *link);
|
||||
int iommu_deferred_attach(struct device *dev, struct iommu_domain *domain);
|
||||
|
||||
static inline void iommu_device_set_ops(struct iommu_device *iommu,
|
||||
const struct iommu_ops *ops)
|
||||
{
|
||||
iommu->ops = ops;
|
||||
}
|
||||
|
||||
static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
|
||||
struct fwnode_handle *fwnode)
|
||||
{
|
||||
iommu->fwnode = fwnode;
|
||||
}
|
||||
|
||||
static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
|
||||
{
|
||||
return (struct iommu_device *)dev_get_drvdata(dev);
|
||||
@ -858,21 +848,13 @@ static inline int iommu_set_pgtable_quirks(struct iommu_domain *domain,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int iommu_device_register(struct iommu_device *iommu)
|
||||
static inline int iommu_device_register(struct iommu_device *iommu,
|
||||
const struct iommu_ops *ops,
|
||||
struct device *hwdev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline void iommu_device_set_ops(struct iommu_device *iommu,
|
||||
const struct iommu_ops *ops)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void iommu_device_set_fwnode(struct iommu_device *iommu,
|
||||
struct fwnode_handle *fwnode)
|
||||
{
|
||||
}
|
||||
|
||||
static inline struct iommu_device *dev_to_iommu_device(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
|
Loading…
Reference in New Issue
Block a user