forked from mirrors/linux
		
	iommu/vt-d: Probe DMA-capable ACPI name space devices
Some platforms may support ACPI name-space enumerated devices that are capable of generating DMA requests. Platforms which support DMA remapping explicitly declares any such DMA-capable ACPI name-space devices in the platform through ACPI Name-space Device Declaration (ANDD) structure and enumerate them through the Device Scope of the appropriate remapping hardware unit. Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
This commit is contained in:
		
							parent
							
								
									98b2fffb5e
								
							
						
					
					
						commit
						fa212a97f3
					
				
					 1 changed files with 45 additions and 0 deletions
				
			
		| 
						 | 
					@ -4796,6 +4796,48 @@ static int __init platform_optin_force_iommu(void)
 | 
				
			||||||
	return 1;
 | 
						return 1;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int __init probe_acpi_namespace_devices(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct dmar_drhd_unit *drhd;
 | 
				
			||||||
 | 
						struct intel_iommu *iommu;
 | 
				
			||||||
 | 
						struct device *dev;
 | 
				
			||||||
 | 
						int i, ret = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for_each_active_iommu(iommu, drhd) {
 | 
				
			||||||
 | 
							for_each_active_dev_scope(drhd->devices,
 | 
				
			||||||
 | 
										  drhd->devices_cnt, i, dev) {
 | 
				
			||||||
 | 
								struct acpi_device_physical_node *pn;
 | 
				
			||||||
 | 
								struct iommu_group *group;
 | 
				
			||||||
 | 
								struct acpi_device *adev;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (dev->bus != &acpi_bus_type)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								adev = to_acpi_device(dev);
 | 
				
			||||||
 | 
								mutex_lock(&adev->physical_node_lock);
 | 
				
			||||||
 | 
								list_for_each_entry(pn,
 | 
				
			||||||
 | 
										    &adev->physical_node_list, node) {
 | 
				
			||||||
 | 
									group = iommu_group_get(pn->dev);
 | 
				
			||||||
 | 
									if (group) {
 | 
				
			||||||
 | 
										iommu_group_put(group);
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									pn->dev->bus->iommu_ops = &intel_iommu_ops;
 | 
				
			||||||
 | 
									ret = iommu_probe_device(pn->dev);
 | 
				
			||||||
 | 
									if (ret)
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								mutex_unlock(&adev->physical_node_lock);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (ret)
 | 
				
			||||||
 | 
									return ret;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int __init intel_iommu_init(void)
 | 
					int __init intel_iommu_init(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int ret = -ENODEV;
 | 
						int ret = -ENODEV;
 | 
				
			||||||
| 
						 | 
					@ -4908,6 +4950,9 @@ int __init intel_iommu_init(void)
 | 
				
			||||||
	cpuhp_setup_state(CPUHP_IOMMU_INTEL_DEAD, "iommu/intel:dead", NULL,
 | 
						cpuhp_setup_state(CPUHP_IOMMU_INTEL_DEAD, "iommu/intel:dead", NULL,
 | 
				
			||||||
			  intel_iommu_cpu_dead);
 | 
								  intel_iommu_cpu_dead);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (probe_acpi_namespace_devices())
 | 
				
			||||||
 | 
							pr_warn("ACPI name space devices didn't probe correctly\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Finally, we enable the DMA remapping hardware. */
 | 
						/* Finally, we enable the DMA remapping hardware. */
 | 
				
			||||||
	for_each_iommu(iommu, drhd) {
 | 
						for_each_iommu(iommu, drhd) {
 | 
				
			||||||
		if (!translation_pre_enabled(iommu))
 | 
							if (!translation_pre_enabled(iommu))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue