Skip to content

Commit ef848b7

Browse files
LuBaolujoergroedel
authored andcommitted
iommu/vt-d: Setup pasid entry for RID2PASID support
when the scalable mode is enabled, there is no second level page translation pointer in the context entry any more (for DMA request without PASID). Instead, a new RID2PASID field is introduced in the context entry. Software can choose any PASID value to set RID2PASID and then setup the translation in the corresponding PASID entry. Upon receiving a DMA request without PASID, hardware will firstly look at this RID2PASID field and then treat this request as a request with a pasid value specified in RID2PASID field. Though software is allowed to use any PASID for the RID2PASID, we will always use the PASID 0 as a sort of design decision. Cc: Ashok Raj <ashok.raj@intel.com> Cc: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Kevin Tian <kevin.tian@intel.com> Signed-off-by: Sanjay Kumar <sanjay.k.kumar@intel.com> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com> Reviewed-by: Ashok Raj <ashok.raj@intel.com> Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent 6f7db75 commit ef848b7

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

drivers/iommu/intel-iommu.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2462,6 +2462,22 @@ static struct dmar_domain *dmar_insert_one_dev_info(struct intel_iommu *iommu,
24622462
dmar_remove_one_dev_info(domain, dev);
24632463
return NULL;
24642464
}
2465+
2466+
/* Setup the PASID entry for requests without PASID: */
2467+
spin_lock(&iommu->lock);
2468+
if (hw_pass_through && domain_type_is_si(domain))
2469+
ret = intel_pasid_setup_pass_through(iommu, domain,
2470+
dev, PASID_RID2PASID);
2471+
else
2472+
ret = intel_pasid_setup_second_level(iommu, domain,
2473+
dev, PASID_RID2PASID);
2474+
spin_unlock(&iommu->lock);
2475+
if (ret) {
2476+
pr_err("Setup RID2PASID for %s failed\n",
2477+
dev_name(dev));
2478+
dmar_remove_one_dev_info(domain, dev);
2479+
return NULL;
2480+
}
24652481
}
24662482

24672483
if (dev && domain_context_mapping(domain, dev)) {
@@ -4825,6 +4841,10 @@ static void __dmar_remove_one_dev_info(struct device_domain_info *info)
48254841
iommu = info->iommu;
48264842

48274843
if (info->dev) {
4844+
if (dev_is_pci(info->dev) && sm_supported(iommu))
4845+
intel_pasid_tear_down_entry(iommu, info->dev,
4846+
PASID_RID2PASID);
4847+
48284848
iommu_disable_dev_iotlb(info);
48294849
domain_context_clear(iommu, info->dev);
48304850
intel_pasid_free_table(info->dev);

drivers/iommu/intel-pasid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#ifndef __INTEL_PASID_H
1111
#define __INTEL_PASID_H
1212

13+
#define PASID_RID2PASID 0x0
1314
#define PASID_MIN 0x1
1415
#define PASID_MAX 0x100000
1516
#define PASID_PTE_MASK 0x3F

0 commit comments

Comments
 (0)