@@ -287,6 +287,39 @@ static void pasid_flush_caches(struct intel_iommu *iommu,
287
287
}
288
288
}
289
289
290
+ /*
291
+ * This function is supposed to be used after caller updates the fields
292
+ * except for the SSADE and P bit of a pasid table entry. It does the
293
+ * below:
294
+ * - Flush cacheline if needed
295
+ * - Flush the caches per Table 28 ”Guidance to Software for Invalidations“
296
+ * of VT-d spec 5.0.
297
+ */
298
+ static void intel_pasid_flush_present (struct intel_iommu * iommu ,
299
+ struct device * dev ,
300
+ u32 pasid , u16 did ,
301
+ struct pasid_entry * pte )
302
+ {
303
+ if (!ecap_coherent (iommu -> ecap ))
304
+ clflush_cache_range (pte , sizeof (* pte ));
305
+
306
+ /*
307
+ * VT-d spec 5.0 table28 states guides for cache invalidation:
308
+ *
309
+ * - PASID-selective-within-Domain PASID-cache invalidation
310
+ * - PASID-selective PASID-based IOTLB invalidation
311
+ * - If (pasid is RID_PASID)
312
+ * - Global Device-TLB invalidation to affected functions
313
+ * Else
314
+ * - PASID-based Device-TLB invalidation (with S=1 and
315
+ * Addr[63:12]=0x7FFFFFFF_FFFFF) to affected functions
316
+ */
317
+ pasid_cache_invalidation_with_pasid (iommu , did , pasid );
318
+ qi_flush_piotlb (iommu , did , pasid , 0 , -1 , 0 );
319
+
320
+ devtlb_invalidation_with_pasid (iommu , dev , pasid );
321
+ }
322
+
290
323
/*
291
324
* Set up the scalable mode pasid table entry for first only
292
325
* translation type.
@@ -526,24 +559,7 @@ void intel_pasid_setup_page_snoop_control(struct intel_iommu *iommu,
526
559
did = pasid_get_domain_id (pte );
527
560
spin_unlock (& iommu -> lock );
528
561
529
- if (!ecap_coherent (iommu -> ecap ))
530
- clflush_cache_range (pte , sizeof (* pte ));
531
-
532
- /*
533
- * VT-d spec 3.4 table23 states guides for cache invalidation:
534
- *
535
- * - PASID-selective-within-Domain PASID-cache invalidation
536
- * - PASID-selective PASID-based IOTLB invalidation
537
- * - If (pasid is RID_PASID)
538
- * - Global Device-TLB invalidation to affected functions
539
- * Else
540
- * - PASID-based Device-TLB invalidation (with S=1 and
541
- * Addr[63:12]=0x7FFFFFFF_FFFFF) to affected functions
542
- */
543
- pasid_cache_invalidation_with_pasid (iommu , did , pasid );
544
- qi_flush_piotlb (iommu , did , pasid , 0 , -1 , 0 );
545
-
546
- devtlb_invalidation_with_pasid (iommu , dev , pasid );
562
+ intel_pasid_flush_present (iommu , dev , pasid , did , pte );
547
563
}
548
564
549
565
/**
0 commit comments