aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/iommu
diff options
context:
space:
mode:
authorAllen Kay <allen.m.kay@intel.com>2011-10-14 15:32:17 -0400
committerDavid Woodhouse <David.Woodhouse@intel.com>2011-10-19 07:06:20 -0400
commit8140a95d228efbcd64d84150e794761a32463947 (patch)
tree5eb55b8a23f8f015ddfcb6b6e0f8e7db9a9456da /drivers/iommu
parent292827cb164ad00cc7689a21283b1261c0b6daed (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.c12
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
581static void domain_update_iommu_superpage(struct dmar_domain *domain) 581static 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;