diff options
Diffstat (limited to 'drivers/iommu/intel-iommu.c')
-rw-r--r-- | drivers/iommu/intel-iommu.c | 45 |
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 | ||
486 | static struct kmem_cache *iommu_domain_cache; | 489 | static struct kmem_cache *iommu_domain_cache; |
487 | static struct kmem_cache *iommu_devinfo_cache; | 490 | static struct kmem_cache *iommu_devinfo_cache; |
488 | static struct kmem_cache *iommu_iova_cache; | ||
489 | 491 | ||
490 | static inline void *alloc_pgtable_page(int node) | 492 | static 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 | ||
526 | struct iova *alloc_iova_mem(void) | ||
527 | { | ||
528 | return kmem_cache_alloc(iommu_iova_cache, GFP_ATOMIC); | ||
529 | } | ||
530 | |||
531 | void free_iova_mem(struct iova *iova) | ||
532 | { | ||
533 | kmem_cache_free(iommu_iova_cache, iova); | ||
534 | } | ||
535 | |||
536 | static inline int domain_type_is_vm(struct dmar_domain *domain) | 528 | static 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 | ||
3430 | static 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 | |||
3447 | static int __init iommu_init_mempool(void) | 3424 | static 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); |
3463 | domain_error: | 3440 | domain_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 | ||
3477 | static void quirk_ioat_snb_local_iommu(struct pci_dev *pdev) | 3453 | static 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 */ |