diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c index a24a97a2c646..4099a0bd8494 100644 --- a/drivers/iommu/amd/iommu.c +++ b/drivers/iommu/amd/iommu.c @@ -2767,8 +2767,7 @@ static int amd_iommu_def_domain_type(struct device *dev) if (!dev_data) return 0; - /* Always use DMA domain for untrusted device */ - if (dev_is_pci(dev) && to_pci_dev(dev)->untrusted) + if (dev_is_pci(dev) && to_pci_dev(dev)->requires_dma_protection) return IOMMU_DOMAIN_DMA; /* diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c index 57a9fb96323a..ddc348b39366 100644 --- a/drivers/iommu/dma-iommu.c +++ b/drivers/iommu/dma-iommu.c @@ -599,16 +599,16 @@ static int iova_reserve_iommu_regions(struct device *dev, return ret; } -static bool dev_is_untrusted(struct device *dev) +static bool dev_requires_dma_protection(struct device *dev) { - return dev_is_pci(dev) && to_pci_dev(dev)->untrusted; + return dev_is_pci(dev) && to_pci_dev(dev)->requires_dma_protection; } static bool dev_use_swiotlb(struct device *dev, size_t size, enum dma_data_direction dir) { return IS_ENABLED(CONFIG_SWIOTLB) && - (dev_is_untrusted(dev) || + (dev_requires_dma_protection(dev) || dma_kmalloc_needs_bounce(dev, size, dir)); } @@ -621,7 +621,7 @@ static bool dev_use_sg_swiotlb(struct device *dev, struct scatterlist *sg, if (!IS_ENABLED(CONFIG_SWIOTLB)) return false; - if (dev_is_untrusted(dev)) + if (dev_requires_dma_protection(dev)) return true; /* @@ -1202,12 +1202,12 @@ dma_addr_t iommu_dma_map_page(struct device *dev, struct page *page, return DMA_MAPPING_ERROR; /* - * Untrusted devices should not see padding areas with random - * leftover kernel data, so zero the pre- and post-padding. + * Zero the pre- and post-padding to prevent exposing kernel data to devices + * requiring DMA protection. * swiotlb_tbl_map_single() has initialized the bounce buffer * proper to the contents of the original memory buffer. */ - if (dev_is_untrusted(dev)) { + if (dev_requires_dma_protection(dev)) { size_t start, virt = (size_t)phys_to_virt(phys); /* Pre-padding */ @@ -1748,7 +1748,7 @@ size_t iommu_dma_opt_mapping_size(void) size_t iommu_dma_max_mapping_size(struct device *dev) { - if (dev_is_untrusted(dev)) + if (dev_requires_dma_protection(dev)) return swiotlb_max_mapping_size(dev); return SIZE_MAX; diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index cc23cfcdeb2d..63e8c9db8105 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -3146,7 +3146,7 @@ static int __init platform_optin_force_iommu(void) /* * If Intel-IOMMU is disabled by default, we will apply identity - * map for all devices except those marked as being untrusted. + * map for all devices except those marked as requiring DMA protection. */ if (dmar_disabled) iommu_set_default_passthrough(false); @@ -4242,13 +4242,13 @@ static bool intel_iommu_is_attach_deferred(struct device *dev) } /* - * Check that the device does not live on an external facing PCI port that is - * marked as untrusted. Such devices should not be able to apply quirks and - * thus not be able to bypass the IOMMU restrictions. + * Check that the device does not require DMA protection. Such devices should + * not be able to apply quirks and thus not be able to bypass the IOMMU + * restrictions. */ static bool risky_device(struct pci_dev *pdev) { - if (pdev->untrusted) { + if (pdev->requires_dma_protection) { pci_info(pdev, "Skipping IOMMU quirk for dev [%04X:%04X] on untrusted PCI link\n", pdev->vendor, pdev->device); diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index c504a09e9e94..93538cc0fed4 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -1745,10 +1745,9 @@ static int iommu_get_default_domain_type(struct iommu_group *group, driver_type = iommu_get_def_domain_type(group, gdev->dev, driver_type); - if (dev_is_pci(gdev->dev) && to_pci_dev(gdev->dev)->untrusted) { + if (dev_is_pci(gdev->dev) && to_pci_dev(gdev->dev)->requires_dma_protection) { /* - * No ARM32 using systems will set untrusted, it cannot - * work. + * ARM32 systems don't support DMA protection. */ if (WARN_ON(IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU))) return -1; diff --git a/drivers/pci/ats.c b/drivers/pci/ats.c index 6afff1f1b143..05aab7c74491 100644 --- a/drivers/pci/ats.c +++ b/drivers/pci/ats.c @@ -43,7 +43,7 @@ bool pci_ats_supported(struct pci_dev *dev) if (!dev->ats_cap) return false; - return (dev->untrusted == 0); + return (dev->requires_dma_protection == 0); } EXPORT_SYMBOL_GPL(pci_ats_supported); diff --git a/drivers/pci/pci-acpi.c b/drivers/pci/pci-acpi.c index a457ae3e811a..1713e2856a88 100644 --- a/drivers/pci/pci-acpi.c +++ b/drivers/pci/pci-acpi.c @@ -1465,7 +1465,7 @@ void pci_acpi_setup(struct device *dev, struct acpi_device *adev) pci_acpi_optimize_delay(pci_dev, adev->handle); pci_acpi_set_external_facing(pci_dev); - pci_dev->untrusted |= pci_dev_has_dma_property(pci_dev); + pci_dev->requires_dma_protection |= pci_dev_has_dma_property(pci_dev); pci_acpi_add_edr_notifier(pci_dev); pci_acpi_add_pm_notifier(adev, pci_dev); diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index dd3c6dcb47ae..85e5f8548b7b 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1056,7 +1056,7 @@ static void pci_std_enable_acs(struct pci_dev *dev, struct pci_acs *caps) caps->ctrl |= (caps->cap & PCI_ACS_UF); /* Enable Translation Blocking for external devices and noats */ - if (pci_ats_disabled() || dev->external_facing || dev->untrusted) + if (pci_ats_disabled() || dev->external_facing || dev->requires_dma_protection) caps->ctrl |= (caps->cap & PCI_ACS_TB); } diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 675268d0b106..ad980edf0e93 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -1631,7 +1631,7 @@ static void set_pcie_thunderbolt(struct pci_dev *dev) dev->is_thunderbolt = 1; } -static void set_pcie_untrusted(struct pci_dev *dev) +static void pci_set_requires_dma_protection(struct pci_dev *dev) { struct pci_dev *parent = pci_upstream_bridge(dev); @@ -1641,14 +1641,14 @@ static void set_pcie_untrusted(struct pci_dev *dev) * If the upstream bridge is untrusted we treat this device as * untrusted as well. */ - if (parent->untrusted) { - dev->untrusted = true; + if (parent->requires_dma_protection) { + dev->requires_dma_protection = true; return; } if (arch_pci_dev_is_removable(dev)) { pci_dbg(dev, "marking as untrusted\n"); - dev->untrusted = true; + dev->requires_dma_protection = true; } } @@ -1961,7 +1961,7 @@ int pci_setup_device(struct pci_dev *dev) /* Need to have dev->cfg_size ready */ set_pcie_thunderbolt(dev); - set_pcie_untrusted(dev); + pci_set_requires_dma_protection(dev); /* "Unknown power state" */ dev->current_state = PCI_UNKNOWN; diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 064067d9c8b5..c67bf411833f 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c @@ -5299,7 +5299,7 @@ static void pci_quirk_enable_intel_rp_mpc_acs(struct pci_dev *dev) * PCI_ACS_SV | PCI_ACS_RR | PCI_ACS_CR | PCI_ACS_UF * * TODO: This quirk also needs to do equivalent of PCI_ACS_TB, - * if dev->external_facing || dev->untrusted + * if dev->external_facing || dev->requires_dma_protection */ static int pci_quirk_enable_intel_pch_acs(struct pci_dev *dev) { @@ -5340,7 +5340,7 @@ static int pci_quirk_enable_intel_spt_pch_acs(struct pci_dev *dev) ctrl |= (cap & PCI_ACS_CR); ctrl |= (cap & PCI_ACS_UF); - if (pci_ats_disabled() || dev->external_facing || dev->untrusted) + if (pci_ats_disabled() || dev->external_facing || dev->requires_dma_protection) ctrl |= (cap & PCI_ACS_TB); pci_write_config_dword(dev, pos + INTEL_SPT_ACS_CTRL, ctrl); diff --git a/include/linux/pci.h b/include/linux/pci.h index 4e77c4230c0a..fcdcd14cc9cc 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -444,13 +444,14 @@ struct pci_dev { unsigned int shpc_managed:1; /* SHPC owned by shpchp */ unsigned int is_thunderbolt:1; /* Thunderbolt controller */ /* - * Devices marked being untrusted are the ones that can potentially - * execute DMA attacks and similar. They are typically connected + * Devices marked with requires_dma_protection are the ones that can + * potentially execute DMA attacks and similar. They are typically connected * through external ports such as Thunderbolt but not limited to * that. When an IOMMU is enabled they should be getting full * mappings to make sure they cannot access arbitrary memory. */ - unsigned int untrusted:1; + unsigned int requires_dma_protection:1; + /* * Info from the platform, e.g., ACPI or device tree, may mark a * device as "external-facing". An external-facing device is