Commit 17fae1cd authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'iommu-fixes-v3.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu

Pull IOMMU fixes from Joerg Roedel:
 "The patches fix several issues in the AMD IOMMU driver, the NVidia
  SMMU driver, and the DMA debug code.

  The most important fix for the AMD IOMMU solves a problem with SR-IOV
  devices where virtual functions did not work with IOMMU enabled.  The
  NVidia SMMU patch fixes a possible sleep while spin-lock situation
  (queued the small fix for v3.5, a better but more intrusive fix is
  coming for v3.6).  The DMA debug patches fix a possible data
  corruption issue due to bool vs u32 usage."

* tag 'iommu-fixes-v3.5-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu:
  iommu/amd: fix type bug in flush code
  dma-debug: debugfs_create_bool() takes a u32 pointer
  iommu/tegra: smmu: Fix unsleepable memory allocation
  iommu/amd: Initialize dma_ops for hotplug and sriov devices
  iommu/amd: Fix missing iommu_shutdown initialization in passthrough mode
parents 8c84bf41 3775d481
...@@ -83,6 +83,8 @@ static struct iommu_ops amd_iommu_ops; ...@@ -83,6 +83,8 @@ static struct iommu_ops amd_iommu_ops;
static ATOMIC_NOTIFIER_HEAD(ppr_notifier); static ATOMIC_NOTIFIER_HEAD(ppr_notifier);
int amd_iommu_max_glx_val = -1; int amd_iommu_max_glx_val = -1;
static struct dma_map_ops amd_iommu_dma_ops;
/* /*
* general struct to manage commands send to an IOMMU * general struct to manage commands send to an IOMMU
*/ */
...@@ -402,7 +404,7 @@ static void amd_iommu_stats_init(void) ...@@ -402,7 +404,7 @@ static void amd_iommu_stats_init(void)
return; return;
de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir, de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir,
(u32 *)&amd_iommu_unmap_flush); &amd_iommu_unmap_flush);
amd_iommu_stats_add(&compl_wait); amd_iommu_stats_add(&compl_wait);
amd_iommu_stats_add(&cnt_map_single); amd_iommu_stats_add(&cnt_map_single);
...@@ -2267,6 +2269,13 @@ static int device_change_notifier(struct notifier_block *nb, ...@@ -2267,6 +2269,13 @@ static int device_change_notifier(struct notifier_block *nb,
list_add_tail(&dma_domain->list, &iommu_pd_list); list_add_tail(&dma_domain->list, &iommu_pd_list);
spin_unlock_irqrestore(&iommu_pd_list_lock, flags); spin_unlock_irqrestore(&iommu_pd_list_lock, flags);
dev_data = get_dev_data(dev);
if (!dev_data->passthrough)
dev->archdata.dma_ops = &amd_iommu_dma_ops;
else
dev->archdata.dma_ops = &nommu_dma_ops;
break; break;
case BUS_NOTIFY_DEL_DEVICE: case BUS_NOTIFY_DEL_DEVICE:
......
...@@ -129,7 +129,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have ...@@ -129,7 +129,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have
to handle */ to handle */
LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings
we find in ACPI */ we find in ACPI */
bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ u32 amd_iommu_unmap_flush; /* if true, flush on every unmap */
LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the
system */ system */
...@@ -1641,6 +1641,8 @@ static int __init amd_iommu_init(void) ...@@ -1641,6 +1641,8 @@ static int __init amd_iommu_init(void)
amd_iommu_init_api(); amd_iommu_init_api();
x86_platform.iommu_shutdown = disable_iommus;
if (iommu_pass_through) if (iommu_pass_through)
goto out; goto out;
...@@ -1649,8 +1651,6 @@ static int __init amd_iommu_init(void) ...@@ -1649,8 +1651,6 @@ static int __init amd_iommu_init(void)
else else
printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n"); printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n");
x86_platform.iommu_shutdown = disable_iommus;
out: out:
return ret; return ret;
......
...@@ -652,7 +652,7 @@ extern unsigned long *amd_iommu_pd_alloc_bitmap; ...@@ -652,7 +652,7 @@ extern unsigned long *amd_iommu_pd_alloc_bitmap;
* If true, the addresses will be flushed on unmap time, not when * If true, the addresses will be flushed on unmap time, not when
* they are reused * they are reused
*/ */
extern bool amd_iommu_unmap_flush; extern u32 amd_iommu_unmap_flush;
/* Smallest number of PASIDs supported by any IOMMU in the system */ /* Smallest number of PASIDs supported by any IOMMU in the system */
extern u32 amd_iommu_max_pasids; extern u32 amd_iommu_max_pasids;
......
...@@ -550,13 +550,13 @@ static int alloc_pdir(struct smmu_as *as) ...@@ -550,13 +550,13 @@ static int alloc_pdir(struct smmu_as *as)
return 0; return 0;
as->pte_count = devm_kzalloc(smmu->dev, as->pte_count = devm_kzalloc(smmu->dev,
sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_KERNEL); sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_ATOMIC);
if (!as->pte_count) { if (!as->pte_count) {
dev_err(smmu->dev, dev_err(smmu->dev,
"failed to allocate smmu_device PTE cunters\n"); "failed to allocate smmu_device PTE cunters\n");
return -ENOMEM; return -ENOMEM;
} }
as->pdir_page = alloc_page(GFP_KERNEL | __GFP_DMA); as->pdir_page = alloc_page(GFP_ATOMIC | __GFP_DMA);
if (!as->pdir_page) { if (!as->pdir_page) {
dev_err(smmu->dev, dev_err(smmu->dev,
"failed to allocate smmu_device page directory\n"); "failed to allocate smmu_device page directory\n");
......
...@@ -78,7 +78,7 @@ static LIST_HEAD(free_entries); ...@@ -78,7 +78,7 @@ static LIST_HEAD(free_entries);
static DEFINE_SPINLOCK(free_entries_lock); static DEFINE_SPINLOCK(free_entries_lock);
/* Global disable flag - will be set in case of an error */ /* Global disable flag - will be set in case of an error */
static bool global_disable __read_mostly; static u32 global_disable __read_mostly;
/* Global error count */ /* Global error count */
static u32 error_count; static u32 error_count;
...@@ -657,7 +657,7 @@ static int dma_debug_fs_init(void) ...@@ -657,7 +657,7 @@ static int dma_debug_fs_init(void)
global_disable_dent = debugfs_create_bool("disabled", 0444, global_disable_dent = debugfs_create_bool("disabled", 0444,
dma_debug_dent, dma_debug_dent,
(u32 *)&global_disable); &global_disable);
if (!global_disable_dent) if (!global_disable_dent)
goto out_err; goto out_err;
......
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