iommu/tegra-smmu: Add PCI support
This patch simply adds support for PCI devices. Signed-off-by: Nicolin Chen <nicoleotsuka@gmail.com> Tested-by: Dmitry Osipenko <digetx@gmail.com> Reviewed-by: Dmitry Osipenko <digetx@gmail.com> Acked-by: Thierry Reding <treding@nvidia.com> Link: https://lore.kernel.org/r/20201125101013.14953-6-nicoleotsuka@gmail.com Signed-off-by: Will Deacon <will@kernel.org>
This commit is contained in:
parent
25938c73cd
commit
541f29bb06
|
@ -10,6 +10,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
@ -865,7 +866,11 @@ static struct iommu_group *tegra_smmu_device_group(struct device *dev)
|
|||
group->smmu = smmu;
|
||||
group->soc = soc;
|
||||
|
||||
group->group = iommu_group_alloc();
|
||||
if (dev_is_pci(dev))
|
||||
group->group = pci_device_group(dev);
|
||||
else
|
||||
group->group = generic_device_group(dev);
|
||||
|
||||
if (IS_ERR(group->group)) {
|
||||
devm_kfree(smmu->dev, group);
|
||||
mutex_unlock(&smmu->lock);
|
||||
|
@ -1075,22 +1080,32 @@ struct tegra_smmu *tegra_smmu_probe(struct device *dev,
|
|||
iommu_device_set_fwnode(&smmu->iommu, dev->fwnode);
|
||||
|
||||
err = iommu_device_register(&smmu->iommu);
|
||||
if (err) {
|
||||
iommu_device_sysfs_remove(&smmu->iommu);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
if (err)
|
||||
goto remove_sysfs;
|
||||
|
||||
err = bus_set_iommu(&platform_bus_type, &tegra_smmu_ops);
|
||||
if (err < 0) {
|
||||
iommu_device_unregister(&smmu->iommu);
|
||||
iommu_device_sysfs_remove(&smmu->iommu);
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
if (err < 0)
|
||||
goto unregister;
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
err = bus_set_iommu(&pci_bus_type, &tegra_smmu_ops);
|
||||
if (err < 0)
|
||||
goto unset_platform_bus;
|
||||
#endif
|
||||
|
||||
if (IS_ENABLED(CONFIG_DEBUG_FS))
|
||||
tegra_smmu_debugfs_init(smmu);
|
||||
|
||||
return smmu;
|
||||
|
||||
unset_platform_bus: __maybe_unused;
|
||||
bus_set_iommu(&platform_bus_type, NULL);
|
||||
unregister:
|
||||
iommu_device_unregister(&smmu->iommu);
|
||||
remove_sysfs:
|
||||
iommu_device_sysfs_remove(&smmu->iommu);
|
||||
|
||||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
void tegra_smmu_remove(struct tegra_smmu *smmu)
|
||||
|
|
Loading…
Reference in New Issue