diff options
author | Allen Kay <allen.m.kay@intel.com> | 2011-10-14 15:32:17 -0400 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2011-10-19 07:06:20 -0400 |
commit | 8140a95d228efbcd64d84150e794761a32463947 (patch) | |
tree | 5eb55b8a23f8f015ddfcb6b6e0f8e7db9a9456da /drivers/iommu | |
parent | 292827cb164ad00cc7689a21283b1261c0b6daed (diff) |
intel-iommu: set iommu_superpage on VM domains to lowest common denominator
set dmar->iommu_superpage field to the smallest common denominator
of super page sizes supported by all active VT-d engines. Initialize
this field in intel_iommu_domain_init() API so intel_iommu_map() API
will be able to use iommu_superpage field to determine the appropriate
super page size to use.
Signed-off-by: Allen Kay <allen.m.kay@intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
Diffstat (limited to 'drivers/iommu')
-rw-r--r-- | drivers/iommu/intel-iommu.c | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c index 237ef52c8c76..e5883602cb35 100644 --- a/drivers/iommu/intel-iommu.c +++ b/drivers/iommu/intel-iommu.c | |||
@@ -580,17 +580,18 @@ static void domain_update_iommu_snooping(struct dmar_domain *domain) | |||
580 | 580 | ||
581 | static void domain_update_iommu_superpage(struct dmar_domain *domain) | 581 | static void domain_update_iommu_superpage(struct dmar_domain *domain) |
582 | { | 582 | { |
583 | int i, mask = 0xf; | 583 | struct dmar_drhd_unit *drhd; |
584 | struct intel_iommu *iommu = NULL; | ||
585 | int mask = 0xf; | ||
584 | 586 | ||
585 | if (!intel_iommu_superpage) { | 587 | if (!intel_iommu_superpage) { |
586 | domain->iommu_superpage = 0; | 588 | domain->iommu_superpage = 0; |
587 | return; | 589 | return; |
588 | } | 590 | } |
589 | 591 | ||
590 | domain->iommu_superpage = 4; /* 1TiB */ | 592 | /* set iommu_superpage to the smallest common denominator */ |
591 | 593 | for_each_active_iommu(iommu, drhd) { | |
592 | for_each_set_bit(i, &domain->iommu_bmp, g_num_of_iommus) { | 594 | mask &= cap_super_page_val(iommu->cap); |
593 | mask |= cap_super_page_val(g_iommus[i]->cap); | ||
594 | if (!mask) { | 595 | if (!mask) { |
595 | break; | 596 | break; |
596 | } | 597 | } |
@@ -3748,6 +3749,7 @@ static int intel_iommu_domain_init(struct iommu_domain *domain) | |||
3748 | vm_domain_exit(dmar_domain); | 3749 | vm_domain_exit(dmar_domain); |
3749 | return -ENOMEM; | 3750 | return -ENOMEM; |
3750 | } | 3751 | } |
3752 | domain_update_iommu_cap(dmar_domain); | ||
3751 | domain->priv = dmar_domain; | 3753 | domain->priv = dmar_domain; |
3752 | 3754 | ||
3753 | return 0; | 3755 | return 0; |