aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu/intel-iommu.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/iommu/intel-iommu.c')
-rw-r--r--drivers/iommu/intel-iommu.c45
1 files changed, 11 insertions, 34 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 40dfbc0444c0..ae4c1a854e57 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -71,6 +71,9 @@
71 __DOMAIN_MAX_PFN(gaw), (unsigned long)-1)) 71 __DOMAIN_MAX_PFN(gaw), (unsigned long)-1))
72#define DOMAIN_MAX_ADDR(gaw) (((uint64_t)__DOMAIN_MAX_PFN(gaw)) << VTD_PAGE_SHIFT) 72#define DOMAIN_MAX_ADDR(gaw) (((uint64_t)__DOMAIN_MAX_PFN(gaw)) << VTD_PAGE_SHIFT)
73 73
74/* IO virtual address start page frame number */
75#define IOVA_START_PFN (1)
76
74#define IOVA_PFN(addr) ((addr) >> PAGE_SHIFT) 77#define IOVA_PFN(addr) ((addr) >> PAGE_SHIFT)
75#define DMA_32BIT_PFN IOVA_PFN(DMA_BIT_MASK(32)) 78#define DMA_32BIT_PFN IOVA_PFN(DMA_BIT_MASK(32))
76#define DMA_64BIT_PFN IOVA_PFN(DMA_BIT_MASK(64)) 79#define DMA_64BIT_PFN IOVA_PFN(DMA_BIT_MASK(64))
@@ -485,7 +488,6 @@ __setup("intel_iommu=", intel_iommu_setup);
485 488
486static struct kmem_cache *iommu_domain_cache; 489static struct kmem_cache *iommu_domain_cache;
487static struct kmem_cache *iommu_devinfo_cache; 490static struct kmem_cache *iommu_devinfo_cache;
488static struct kmem_cache *iommu_iova_cache;
489 491
490static inline void *alloc_pgtable_page(int node) 492static inline void *alloc_pgtable_page(int node)
491{ 493{
@@ -523,16 +525,6 @@ static inline void free_devinfo_mem(void *vaddr)
523 kmem_cache_free(iommu_devinfo_cache, vaddr); 525 kmem_cache_free(iommu_devinfo_cache, vaddr);
524} 526}
525 527
526struct iova *alloc_iova_mem(void)
527{
528 return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC);
529}
530
531void free_iova_mem(struct iova *iova)
532{
533 kmem_cache_free(iommu_iova_cache, iova);
534}
535
536static inline int domain_type_is_vm(struct dmar_domain *domain) 528static inline int domain_type_is_vm(struct dmar_domain *domain)
537{ 529{
538 return domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE; 530 return domain->flags & DOMAIN_FLAG_VIRTUAL_MACHINE;
@@ -1643,7 +1635,8 @@ static int dmar_init_reserved_ranges(void)
1643 struct iova *iova; 1635 struct iova *iova;
1644 int i; 1636 int i;
1645 1637
1646 init_iova_domain(&reserved_iova_list, DMA_32BIT_PFN); 1638 init_iova_domain(&reserved_iova_list, VTD_PAGE_SIZE, IOVA_START_PFN,
1639 DMA_32BIT_PFN);
1647 1640
1648 lockdep_set_class(&reserved_iova_list.iova_rbtree_lock, 1641 lockdep_set_class(&reserved_iova_list.iova_rbtree_lock,
1649 &reserved_rbtree_key); 1642 &reserved_rbtree_key);
@@ -1701,7 +1694,8 @@ static int domain_init(struct dmar_domain *domain, int guest_width)
1701 int adjust_width, agaw; 1694 int adjust_width, agaw;
1702 unsigned long sagaw; 1695 unsigned long sagaw;
1703 1696
1704 init_iova_domain(&domain->iovad, DMA_32BIT_PFN); 1697 init_iova_domain(&domain->iovad, VTD_PAGE_SIZE, IOVA_START_PFN,
1698 DMA_32BIT_PFN);
1705 domain_reserve_special_ranges(domain); 1699 domain_reserve_special_ranges(domain);
1706 1700
1707 /* calculate AGAW */ 1701 /* calculate AGAW */
@@ -3427,23 +3421,6 @@ static inline int iommu_devinfo_cache_init(void)
3427 return ret; 3421 return ret;
3428} 3422}
3429 3423
3430static inline int iommu_iova_cache_init(void)
3431{
3432 int ret = 0;
3433
3434 iommu_iova_cache = kmem_cache_create("iommu_iova",
3435 sizeof(struct iova),
3436 0,
3437 SLAB_HWCACHE_ALIGN,
3438 NULL);
3439 if (!iommu_iova_cache) {
3440 printk(KERN_ERR "Couldn't create iova cache\n");
3441 ret = -ENOMEM;
3442 }
3443
3444 return ret;
3445}
3446
3447static int __init iommu_init_mempool(void) 3424static int __init iommu_init_mempool(void)
3448{ 3425{
3449 int ret; 3426 int ret;
@@ -3461,7 +3438,7 @@ static int __init iommu_init_mempool(void)
3461 3438
3462 kmem_cache_destroy(iommu_domain_cache); 3439 kmem_cache_destroy(iommu_domain_cache);
3463domain_error: 3440domain_error:
3464 kmem_cache_destroy(iommu_iova_cache); 3441 iommu_iova_cache_destroy();
3465 3442
3466 return -ENOMEM; 3443 return -ENOMEM;
3467} 3444}
@@ -3470,8 +3447,7 @@ static void __init iommu_exit_mempool(void)
3470{ 3447{
3471 kmem_cache_destroy(iommu_devinfo_cache); 3448 kmem_cache_destroy(iommu_devinfo_cache);
3472 kmem_cache_destroy(iommu_domain_cache); 3449 kmem_cache_destroy(iommu_domain_cache);
3473 kmem_cache_destroy(iommu_iova_cache); 3450 iommu_iova_cache_destroy();
3474
3475} 3451}
3476 3452
3477static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) 3453static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev)
@@ -4342,7 +4318,8 @@ static int md_domain_init(struct dmar_domain *domain, int guest_width)
4342{ 4318{
4343 int adjust_width; 4319 int adjust_width;
4344 4320
4345 init_iova_domain(&domain->iovad, DMA_32BIT_PFN); 4321 init_iova_domain(&domain->iovad, VTD_PAGE_SIZE, IOVA_START_PFN,
4322 DMA_32BIT_PFN);
4346 domain_reserve_special_ranges(domain); 4323 domain_reserve_special_ranges(domain);
4347 4324
4348 /* calculate AGAW */ 4325 /* calculate AGAW */