I didn't find issue, could you show some light?---*iommu, u16 source_id,
drivers/iommu/intel/iommu.c | 31 ++++++++++++++++++++-----------
1 file changed, 20 insertions(+), 11 deletions(-)
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index a564eeaf2375..8288b0ee7a61 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -733,12 +733,17 @@ void dmar_fault_dump_ptes(struct intel_iommu
u8 devfn = source_id & 0xff;*iommu, u16 source_id,
u8 bus = source_id >> 8;
struct dma_pte *pgtable;
+ u64 entry;
pr_info("Dump %s table entries for IOVA 0x%llx\n", iommu->name, addr);
/* root entry dump */
rt_entry = &iommu->root_entry[bus];
- if (!rt_entry) {
+ entry = rt_entry->lo;
+ if (sm_supported(iommu) && devfn >= 0x80)
+ entry = rt_entry->hi;
+
+ if (!(entry & 1)) {
pr_info("root table entry is not present\n");
return;
}
@@ -766,28 +771,32 @@ void dmar_fault_dump_ptes(struct intel_iommu
goto pgtable_walk;Is above code correct in the scalable mode?
}
+ /* For request-without-pasid, get the pasid from context entry */
+ if (pasid == IOMMU_PASID_INVALID)
+ pasid = IOMMU_NO_PASID;
+
/* get the pointer to pasid directory entry */
dir = phys_to_virt(ctx_entry->lo & VTD_PAGE_MASK);