Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa212a97 authored by Lu Baolu's avatar Lu Baolu Committed by Joerg Roedel
Browse files

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: default avatarLu Baolu <baolu.lu@linux.intel.com>
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
parent 98b2fffb
Loading
Loading
Loading
Loading
+45 −0
Original line number Original line Diff line number Diff line
@@ -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))