diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-09 13:57:21 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-07-09 13:57:21 -0400 |
commit | 17fae1cdea2fd131984facfb24923a3eb78c63d0 (patch) | |
tree | 49103c6ebca5efca5ee8e13700e40c2a93e261ab | |
parent | 8c84bf4166a4698296342841a549bbee03860ac0 (diff) | |
parent | 3775d4818d72081e2afa2aed2442a2b9ecfc5eab (diff) |
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
-rw-r--r-- | drivers/iommu/amd_iommu.c | 11 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_init.c | 6 | ||||
-rw-r--r-- | drivers/iommu/amd_iommu_types.h | 2 | ||||
-rw-r--r-- | drivers/iommu/tegra-smmu.c | 4 | ||||
-rw-r--r-- | lib/dma-debug.c | 4 |
5 files changed, 18 insertions, 9 deletions
diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c index a2e418cba0ff..625626391f2d 100644 --- a/drivers/iommu/amd_iommu.c +++ b/drivers/iommu/amd_iommu.c | |||
@@ -83,6 +83,8 @@ static struct iommu_ops amd_iommu_ops; | |||
83 | static ATOMIC_NOTIFIER_HEAD(ppr_notifier); | 83 | static ATOMIC_NOTIFIER_HEAD(ppr_notifier); |
84 | int amd_iommu_max_glx_val = -1; | 84 | int amd_iommu_max_glx_val = -1; |
85 | 85 | ||
86 | static struct dma_map_ops amd_iommu_dma_ops; | ||
87 | |||
86 | /* | 88 | /* |
87 | * general struct to manage commands send to an IOMMU | 89 | * general struct to manage commands send to an IOMMU |
88 | */ | 90 | */ |
@@ -402,7 +404,7 @@ static void amd_iommu_stats_init(void) | |||
402 | return; | 404 | return; |
403 | 405 | ||
404 | de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir, | 406 | de_fflush = debugfs_create_bool("fullflush", 0444, stats_dir, |
405 | (u32 *)&amd_iommu_unmap_flush); | 407 | &amd_iommu_unmap_flush); |
406 | 408 | ||
407 | amd_iommu_stats_add(&compl_wait); | 409 | amd_iommu_stats_add(&compl_wait); |
408 | amd_iommu_stats_add(&cnt_map_single); | 410 | amd_iommu_stats_add(&cnt_map_single); |
@@ -2267,6 +2269,13 @@ static int device_change_notifier(struct notifier_block *nb, | |||
2267 | list_add_tail(&dma_domain->list, &iommu_pd_list); | 2269 | list_add_tail(&dma_domain->list, &iommu_pd_list); |
2268 | spin_unlock_irqrestore(&iommu_pd_list_lock, flags); | 2270 | spin_unlock_irqrestore(&iommu_pd_list_lock, flags); |
2269 | 2271 | ||
2272 | dev_data = get_dev_data(dev); | ||
2273 | |||
2274 | if (!dev_data->passthrough) | ||
2275 | dev->archdata.dma_ops = &amd_iommu_dma_ops; | ||
2276 | else | ||
2277 | dev->archdata.dma_ops = &nommu_dma_ops; | ||
2278 | |||
2270 | break; | 2279 | break; |
2271 | case BUS_NOTIFY_DEL_DEVICE: | 2280 | case BUS_NOTIFY_DEL_DEVICE: |
2272 | 2281 | ||
diff --git a/drivers/iommu/amd_iommu_init.c b/drivers/iommu/amd_iommu_init.c index 542024ba6dba..a33612f3206f 100644 --- a/drivers/iommu/amd_iommu_init.c +++ b/drivers/iommu/amd_iommu_init.c | |||
@@ -129,7 +129,7 @@ u16 amd_iommu_last_bdf; /* largest PCI device id we have | |||
129 | to handle */ | 129 | to handle */ |
130 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings | 130 | LIST_HEAD(amd_iommu_unity_map); /* a list of required unity mappings |
131 | we find in ACPI */ | 131 | we find in ACPI */ |
132 | bool amd_iommu_unmap_flush; /* if true, flush on every unmap */ | 132 | u32 amd_iommu_unmap_flush; /* if true, flush on every unmap */ |
133 | 133 | ||
134 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the | 134 | LIST_HEAD(amd_iommu_list); /* list of all AMD IOMMUs in the |
135 | system */ | 135 | system */ |
@@ -1641,6 +1641,8 @@ static int __init amd_iommu_init(void) | |||
1641 | 1641 | ||
1642 | amd_iommu_init_api(); | 1642 | amd_iommu_init_api(); |
1643 | 1643 | ||
1644 | x86_platform.iommu_shutdown = disable_iommus; | ||
1645 | |||
1644 | if (iommu_pass_through) | 1646 | if (iommu_pass_through) |
1645 | goto out; | 1647 | goto out; |
1646 | 1648 | ||
@@ -1649,8 +1651,6 @@ static int __init amd_iommu_init(void) | |||
1649 | else | 1651 | else |
1650 | printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n"); | 1652 | printk(KERN_INFO "AMD-Vi: Lazy IO/TLB flushing enabled\n"); |
1651 | 1653 | ||
1652 | x86_platform.iommu_shutdown = disable_iommus; | ||
1653 | |||
1654 | out: | 1654 | out: |
1655 | return ret; | 1655 | return ret; |
1656 | 1656 | ||
diff --git a/drivers/iommu/amd_iommu_types.h b/drivers/iommu/amd_iommu_types.h index 24355559a2ad..c1b1d489817e 100644 --- a/drivers/iommu/amd_iommu_types.h +++ b/drivers/iommu/amd_iommu_types.h | |||
@@ -652,7 +652,7 @@ extern unsigned long *amd_iommu_pd_alloc_bitmap; | |||
652 | * If true, the addresses will be flushed on unmap time, not when | 652 | * If true, the addresses will be flushed on unmap time, not when |
653 | * they are reused | 653 | * they are reused |
654 | */ | 654 | */ |
655 | extern bool amd_iommu_unmap_flush; | 655 | extern u32 amd_iommu_unmap_flush; |
656 | 656 | ||
657 | /* Smallest number of PASIDs supported by any IOMMU in the system */ | 657 | /* Smallest number of PASIDs supported by any IOMMU in the system */ |
658 | extern u32 amd_iommu_max_pasids; | 658 | extern u32 amd_iommu_max_pasids; |
diff --git a/drivers/iommu/tegra-smmu.c b/drivers/iommu/tegra-smmu.c index ecd679043d77..3f3d09d560ea 100644 --- a/drivers/iommu/tegra-smmu.c +++ b/drivers/iommu/tegra-smmu.c | |||
@@ -550,13 +550,13 @@ static int alloc_pdir(struct smmu_as *as) | |||
550 | return 0; | 550 | return 0; |
551 | 551 | ||
552 | as->pte_count = devm_kzalloc(smmu->dev, | 552 | as->pte_count = devm_kzalloc(smmu->dev, |
553 | sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_KERNEL); | 553 | sizeof(as->pte_count[0]) * SMMU_PDIR_COUNT, GFP_ATOMIC); |
554 | if (!as->pte_count) { | 554 | if (!as->pte_count) { |
555 | dev_err(smmu->dev, | 555 | dev_err(smmu->dev, |
556 | "failed to allocate smmu_device PTE cunters\n"); | 556 | "failed to allocate smmu_device PTE cunters\n"); |
557 | return -ENOMEM; | 557 | return -ENOMEM; |
558 | } | 558 | } |
559 | as->pdir_page = alloc_page(GFP_KERNEL | __GFP_DMA); | 559 | as->pdir_page = alloc_page(GFP_ATOMIC | __GFP_DMA); |
560 | if (!as->pdir_page) { | 560 | if (!as->pdir_page) { |
561 | dev_err(smmu->dev, | 561 | dev_err(smmu->dev, |
562 | "failed to allocate smmu_device page directory\n"); | 562 | "failed to allocate smmu_device page directory\n"); |
diff --git a/lib/dma-debug.c b/lib/dma-debug.c index 518aea714d21..66ce41489133 100644 --- a/lib/dma-debug.c +++ b/lib/dma-debug.c | |||
@@ -78,7 +78,7 @@ static LIST_HEAD(free_entries); | |||
78 | static DEFINE_SPINLOCK(free_entries_lock); | 78 | static DEFINE_SPINLOCK(free_entries_lock); |
79 | 79 | ||
80 | /* Global disable flag - will be set in case of an error */ | 80 | /* Global disable flag - will be set in case of an error */ |
81 | static bool global_disable __read_mostly; | 81 | static u32 global_disable __read_mostly; |
82 | 82 | ||
83 | /* Global error count */ | 83 | /* Global error count */ |
84 | static u32 error_count; | 84 | static u32 error_count; |
@@ -657,7 +657,7 @@ static int dma_debug_fs_init(void) | |||
657 | 657 | ||
658 | global_disable_dent = debugfs_create_bool("disabled", 0444, | 658 | global_disable_dent = debugfs_create_bool("disabled", 0444, |
659 | dma_debug_dent, | 659 | dma_debug_dent, |
660 | (u32 *)&global_disable); | 660 | &global_disable); |
661 | if (!global_disable_dent) | 661 | if (!global_disable_dent) |
662 | goto out_err; | 662 | goto out_err; |
663 | 663 | ||