mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-10-31 16:54:21 +00:00 
			
		
		
		
	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
					
				
					 1 changed files with 25 additions and 10 deletions
				
			
		|  | @ -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…
	
	Add table
		
		Reference in a new issue
	
	 Nicolin Chen
						Nicolin Chen