Commit 01b9d4e2 authored by Joerg Roedel's avatar Joerg Roedel

iommu/vt-d: Use dev_iommu_priv_get/set()

Remove the use of dev->archdata.iommu and use the private per-device
pointer provided by IOMMU core code instead.
Signed-off-by: default avatarJoerg Roedel <jroedel@suse.de>
Reviewed-by: default avatarJerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: default avatarLu Baolu <baolu.lu@linux.intel.com>
Link: https://lore.kernel.org/r/20200625130836.1916-3-joro@8bytes.org
parent 0f45b04d
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
#include <linux/pm_domain.h> #include <linux/pm_domain.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/iommu.h>
#include <drm/drm_managed.h> #include <drm/drm_managed.h>
...@@ -118,6 +119,9 @@ struct drm_i915_private *mock_gem_device(void) ...@@ -118,6 +119,9 @@ struct drm_i915_private *mock_gem_device(void)
{ {
struct drm_i915_private *i915; struct drm_i915_private *i915;
struct pci_dev *pdev; struct pci_dev *pdev;
#if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
struct dev_iommu iommu;
#endif
int err; int err;
pdev = kzalloc(sizeof(*pdev), GFP_KERNEL); pdev = kzalloc(sizeof(*pdev), GFP_KERNEL);
...@@ -136,8 +140,10 @@ struct drm_i915_private *mock_gem_device(void) ...@@ -136,8 +140,10 @@ struct drm_i915_private *mock_gem_device(void)
dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64)); dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
#if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU) #if IS_ENABLED(CONFIG_IOMMU_API) && defined(CONFIG_INTEL_IOMMU)
/* hack to disable iommu for the fake device; force identity mapping */ /* HACK HACK HACK to disable iommu for the fake device; force identity mapping */
pdev->dev.archdata.iommu = (void *)-1; memset(&iommu, 0, sizeof(iommu));
iommu.priv = (void *)-1;
pdev->dev.iommu = &iommu;
#endif #endif
pci_set_drvdata(pdev, i915); pci_set_drvdata(pdev, i915);
......
...@@ -372,7 +372,7 @@ struct device_domain_info *get_domain_info(struct device *dev) ...@@ -372,7 +372,7 @@ struct device_domain_info *get_domain_info(struct device *dev)
if (!dev) if (!dev)
return NULL; return NULL;
info = dev->archdata.iommu; info = dev_iommu_priv_get(dev);
if (unlikely(info == DUMMY_DEVICE_DOMAIN_INFO || if (unlikely(info == DUMMY_DEVICE_DOMAIN_INFO ||
info == DEFER_DEVICE_DOMAIN_INFO)) info == DEFER_DEVICE_DOMAIN_INFO))
return NULL; return NULL;
...@@ -743,12 +743,12 @@ struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus, ...@@ -743,12 +743,12 @@ struct context_entry *iommu_context_addr(struct intel_iommu *iommu, u8 bus,
static int iommu_dummy(struct device *dev) static int iommu_dummy(struct device *dev)
{ {
return dev->archdata.iommu == DUMMY_DEVICE_DOMAIN_INFO; return dev_iommu_priv_get(dev) == DUMMY_DEVICE_DOMAIN_INFO;
} }
static bool attach_deferred(struct device *dev) static bool attach_deferred(struct device *dev)
{ {
return dev->archdata.iommu == DEFER_DEVICE_DOMAIN_INFO; return dev_iommu_priv_get(dev) == DEFER_DEVICE_DOMAIN_INFO;
} }
/** /**
...@@ -2420,7 +2420,7 @@ static inline void unlink_domain_info(struct device_domain_info *info) ...@@ -2420,7 +2420,7 @@ static inline void unlink_domain_info(struct device_domain_info *info)
list_del(&info->link); list_del(&info->link);
list_del(&info->global); list_del(&info->global);
if (info->dev) if (info->dev)
info->dev->archdata.iommu = NULL; dev_iommu_priv_set(info->dev, NULL);
} }
static void domain_remove_dev_info(struct dmar_domain *domain) static void domain_remove_dev_info(struct dmar_domain *domain)
...@@ -2453,7 +2453,7 @@ static void do_deferred_attach(struct device *dev) ...@@ -2453,7 +2453,7 @@ static void do_deferred_attach(struct device *dev)
{ {
struct iommu_domain *domain; struct iommu_domain *domain;
dev->archdata.iommu = NULL; dev_iommu_priv_set(dev, NULL);
domain = iommu_get_domain_for_dev(dev); domain = iommu_get_domain_for_dev(dev);
if (domain) if (domain)
intel_iommu_attach_device(domain, dev); intel_iommu_attach_device(domain, dev);
...@@ -2599,7 +2599,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu, ...@@ -2599,7 +2599,7 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
list_add(&info->link, &domain->devices); list_add(&info->link, &domain->devices);
list_add(&info->global, &device_domain_list); list_add(&info->global, &device_domain_list);
if (dev) if (dev)
dev->archdata.iommu = info; dev_iommu_priv_set(dev, info);
spin_unlock_irqrestore(&device_domain_lock, flags); spin_unlock_irqrestore(&device_domain_lock, flags);
/* PASID table is mandatory for a PCI device in scalable mode. */ /* PASID table is mandatory for a PCI device in scalable mode. */
...@@ -4004,7 +4004,7 @@ static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) ...@@ -4004,7 +4004,7 @@ static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev)
if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) { if (!drhd || drhd->reg_base_addr - vtbar != 0xa000) {
pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n"); pr_warn_once(FW_BUG "BIOS assigned incorrect VT-d unit for Intel(R) QuickData Technology device\n");
add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
pdev->dev.archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; dev_iommu_priv_set(&pdev->dev, DUMMY_DEVICE_DOMAIN_INFO);
} }
} }
DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu); DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_IOAT_SNB, quirk_ioat_snb_local_iommu);
...@@ -4043,7 +4043,7 @@ static void __init init_no_remapping_devices(void) ...@@ -4043,7 +4043,7 @@ static void __init init_no_remapping_devices(void)
drhd->ignored = 1; drhd->ignored = 1;
for_each_active_dev_scope(drhd->devices, for_each_active_dev_scope(drhd->devices,
drhd->devices_cnt, i, dev) drhd->devices_cnt, i, dev)
dev->archdata.iommu = DUMMY_DEVICE_DOMAIN_INFO; dev_iommu_priv_set(dev, DUMMY_DEVICE_DOMAIN_INFO);
} }
} }
} }
...@@ -5665,7 +5665,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev) ...@@ -5665,7 +5665,7 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
return ERR_PTR(-ENODEV); return ERR_PTR(-ENODEV);
if (translation_pre_enabled(iommu)) if (translation_pre_enabled(iommu))
dev->archdata.iommu = DEFER_DEVICE_DOMAIN_INFO; dev_iommu_priv_set(dev, DEFER_DEVICE_DOMAIN_INFO);
return &iommu->iommu; return &iommu->iommu;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment