Commit 28b41e2c authored by Lu Baolu's avatar Lu Baolu Committed by Will Deacon
Browse files

iommu: Move def_domain type check for untrusted device into core



So that the vendor iommu drivers are no more required to provide the
def_domain_type callback to always isolate the untrusted devices.

Signed-off-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Cc: Shameerali Kolothum Thodi <shameerali.kolothum.thodi@huawei.com>
Link: https://lore.kernel.org/linux-iommu/243ce89c33fe4b9da4c56ba35acebf81@huawei.com/
Link: https://lore.kernel.org/r/20201124130604.2912899-2-baolu.lu@linux.intel.com


Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent f8394f23
Loading
Loading
Loading
Loading
+0 −7
Original line number Diff line number Diff line
@@ -2916,13 +2916,6 @@ static int device_def_domain_type(struct device *dev)
	if (dev_is_pci(dev)) {
		struct pci_dev *pdev = to_pci_dev(dev);

		/*
		 * Prevent any device marked as untrusted from getting
		 * placed into the statically identity mapping domain.
		 */
		if (pdev->untrusted)
			return IOMMU_DOMAIN_DMA;

		if ((iommu_identity_mapping & IDENTMAP_AZALIA) && IS_AZALIA(pdev))
			return IOMMU_DOMAIN_IDENTITY;

+7 −9
Original line number Diff line number Diff line
@@ -1460,12 +1460,14 @@ EXPORT_SYMBOL_GPL(fsl_mc_device_group);
static int iommu_get_def_domain_type(struct device *dev)
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;
	unsigned int type = 0;

	if (dev_is_pci(dev) && to_pci_dev(dev)->untrusted)
		return IOMMU_DOMAIN_DMA;

	if (ops->def_domain_type)
		type = ops->def_domain_type(dev);
		return ops->def_domain_type(dev);

	return (type == 0) ? iommu_def_domain_type : type;
	return 0;
}

static int iommu_group_alloc_default_domain(struct bus_type *bus,
@@ -1507,7 +1509,7 @@ static int iommu_alloc_default_domain(struct iommu_group *group,
	if (group->default_domain)
		return 0;

	type = iommu_get_def_domain_type(dev);
	type = iommu_get_def_domain_type(dev) ? : iommu_def_domain_type;

	return iommu_group_alloc_default_domain(dev->bus, group, type);
}
@@ -1645,12 +1647,8 @@ struct __group_domain_type {

static int probe_get_default_domain_type(struct device *dev, void *data)
{
	const struct iommu_ops *ops = dev->bus->iommu_ops;
	struct __group_domain_type *gtype = data;
	unsigned int type = 0;

	if (ops->def_domain_type)
		type = ops->def_domain_type(dev);
	unsigned int type = iommu_get_def_domain_type(dev);

	if (type) {
		if (gtype->type && gtype->type != type) {