Merge tag 'blackfin-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/realm...
[linux.git] / drivers / iommu / amd_iommu_init.c
index 28b4bea7c1094d79a483ee5256c21a91d3829396..b76c58dbe30ce5ac38c8422b66b5ed2ea4f0fb1e 100644 (file)
@@ -150,7 +150,7 @@ int amd_iommus_present;
 bool amd_iommu_np_cache __read_mostly;
 bool amd_iommu_iotlb_sup __read_mostly = true;
 
-u32 amd_iommu_max_pasids __read_mostly = ~0;
+u32 amd_iommu_max_pasid __read_mostly = ~0;
 
 bool amd_iommu_v2_present __read_mostly;
 bool amd_iommu_pc_present __read_mostly;
@@ -1231,14 +1231,16 @@ static int iommu_init_pci(struct amd_iommu *iommu)
 
        if (iommu_feature(iommu, FEATURE_GT)) {
                int glxval;
-               u32 pasids;
-               u64 shift;
+               u32 max_pasid;
+               u64 pasmax;
 
-               shift   = iommu->features & FEATURE_PASID_MASK;
-               shift >>= FEATURE_PASID_SHIFT;
-               pasids  = (1 << shift);
+               pasmax = iommu->features & FEATURE_PASID_MASK;
+               pasmax >>= FEATURE_PASID_SHIFT;
+               max_pasid  = (1 << (pasmax + 1)) - 1;
 
-               amd_iommu_max_pasids = min(amd_iommu_max_pasids, pasids);
+               amd_iommu_max_pasid = min(amd_iommu_max_pasid, max_pasid);
+
+               BUG_ON(amd_iommu_max_pasid & ~PASID_MASK);
 
                glxval   = iommu->features & FEATURE_GLXVAL_MASK;
                glxval >>= FEATURE_GLXVAL_SHIFT;