@@ -255,6 +255,78 @@ static unsigned long calculate_psi_aligned_address(unsigned long start,
255
255
return ALIGN_DOWN (start , VTD_PAGE_SIZE << mask );
256
256
}
257
257
258
+ static void cache_tag_flush_iotlb (struct dmar_domain * domain , struct cache_tag * tag ,
259
+ unsigned long addr , unsigned long pages ,
260
+ unsigned long mask , int ih )
261
+ {
262
+ struct intel_iommu * iommu = tag -> iommu ;
263
+ u64 type = DMA_TLB_PSI_FLUSH ;
264
+
265
+ if (domain -> use_first_level ) {
266
+ qi_flush_piotlb (iommu , tag -> domain_id , tag -> pasid , addr , pages , ih );
267
+ return ;
268
+ }
269
+
270
+ /*
271
+ * Fallback to domain selective flush if no PSI support or the size
272
+ * is too big.
273
+ */
274
+ if (!cap_pgsel_inv (iommu -> cap ) ||
275
+ mask > cap_max_amask_val (iommu -> cap ) || pages == -1 ) {
276
+ addr = 0 ;
277
+ mask = 0 ;
278
+ ih = 0 ;
279
+ type = DMA_TLB_DSI_FLUSH ;
280
+ }
281
+
282
+ if (ecap_qis (iommu -> ecap ))
283
+ qi_flush_iotlb (iommu , tag -> domain_id , addr | ih , mask , type );
284
+ else
285
+ __iommu_flush_iotlb (iommu , tag -> domain_id , addr | ih , mask , type );
286
+ }
287
+
288
+ static void cache_tag_flush_devtlb_psi (struct dmar_domain * domain , struct cache_tag * tag ,
289
+ unsigned long addr , unsigned long mask )
290
+ {
291
+ struct intel_iommu * iommu = tag -> iommu ;
292
+ struct device_domain_info * info ;
293
+ u16 sid ;
294
+
295
+ info = dev_iommu_priv_get (tag -> dev );
296
+ sid = PCI_DEVID (info -> bus , info -> devfn );
297
+
298
+ if (tag -> pasid == IOMMU_NO_PASID ) {
299
+ qi_flush_dev_iotlb (iommu , sid , info -> pfsid , info -> ats_qdep ,
300
+ addr , mask );
301
+ if (info -> dtlb_extra_inval )
302
+ qi_flush_dev_iotlb (iommu , sid , info -> pfsid ,
303
+ info -> ats_qdep , addr , mask );
304
+ return ;
305
+ }
306
+
307
+ qi_flush_dev_iotlb_pasid (iommu , sid , info -> pfsid , tag -> pasid ,
308
+ info -> ats_qdep , addr , mask );
309
+ if (info -> dtlb_extra_inval )
310
+ qi_flush_dev_iotlb_pasid (iommu , sid , info -> pfsid , tag -> pasid ,
311
+ info -> ats_qdep , addr , mask );
312
+ }
313
+
314
+ static void cache_tag_flush_devtlb_all (struct dmar_domain * domain , struct cache_tag * tag )
315
+ {
316
+ struct intel_iommu * iommu = tag -> iommu ;
317
+ struct device_domain_info * info ;
318
+ u16 sid ;
319
+
320
+ info = dev_iommu_priv_get (tag -> dev );
321
+ sid = PCI_DEVID (info -> bus , info -> devfn );
322
+
323
+ qi_flush_dev_iotlb (iommu , sid , info -> pfsid , info -> ats_qdep , 0 ,
324
+ MAX_AGAW_PFN_WIDTH );
325
+ if (info -> dtlb_extra_inval )
326
+ qi_flush_dev_iotlb (iommu , sid , info -> pfsid , info -> ats_qdep , 0 ,
327
+ MAX_AGAW_PFN_WIDTH );
328
+ }
329
+
258
330
/*
259
331
* Invalidates a range of IOVA from @start (inclusive) to @end (inclusive)
260
332
* when the memory mappings in the target domain have been modified.
@@ -270,30 +342,10 @@ void cache_tag_flush_range(struct dmar_domain *domain, unsigned long start,
270
342
271
343
spin_lock_irqsave (& domain -> cache_lock , flags );
272
344
list_for_each_entry (tag , & domain -> cache_tags , node ) {
273
- struct intel_iommu * iommu = tag -> iommu ;
274
- struct device_domain_info * info ;
275
- u16 sid ;
276
-
277
345
switch (tag -> type ) {
278
346
case CACHE_TAG_IOTLB :
279
347
case CACHE_TAG_NESTING_IOTLB :
280
- if (domain -> use_first_level ) {
281
- qi_flush_piotlb (iommu , tag -> domain_id ,
282
- tag -> pasid , addr , pages , ih );
283
- } else {
284
- /*
285
- * Fallback to domain selective flush if no
286
- * PSI support or the size is too big.
287
- */
288
- if (!cap_pgsel_inv (iommu -> cap ) ||
289
- mask > cap_max_amask_val (iommu -> cap ))
290
- iommu -> flush .flush_iotlb (iommu , tag -> domain_id ,
291
- 0 , 0 , DMA_TLB_DSI_FLUSH );
292
- else
293
- iommu -> flush .flush_iotlb (iommu , tag -> domain_id ,
294
- addr | ih , mask ,
295
- DMA_TLB_PSI_FLUSH );
296
- }
348
+ cache_tag_flush_iotlb (domain , tag , addr , pages , mask , ih );
297
349
break ;
298
350
case CACHE_TAG_NESTING_DEVTLB :
299
351
/*
@@ -307,18 +359,7 @@ void cache_tag_flush_range(struct dmar_domain *domain, unsigned long start,
307
359
mask = MAX_AGAW_PFN_WIDTH ;
308
360
fallthrough ;
309
361
case CACHE_TAG_DEVTLB :
310
- info = dev_iommu_priv_get (tag -> dev );
311
- sid = PCI_DEVID (info -> bus , info -> devfn );
312
-
313
- if (tag -> pasid == IOMMU_NO_PASID )
314
- qi_flush_dev_iotlb (iommu , sid , info -> pfsid ,
315
- info -> ats_qdep , addr , mask );
316
- else
317
- qi_flush_dev_iotlb_pasid (iommu , sid , info -> pfsid ,
318
- tag -> pasid , info -> ats_qdep ,
319
- addr , mask );
320
-
321
- quirk_extra_dev_tlb_flush (info , addr , mask , tag -> pasid , info -> ats_qdep );
362
+ cache_tag_flush_devtlb_psi (domain , tag , addr , mask );
322
363
break ;
323
364
}
324
365
@@ -338,29 +379,14 @@ void cache_tag_flush_all(struct dmar_domain *domain)
338
379
339
380
spin_lock_irqsave (& domain -> cache_lock , flags );
340
381
list_for_each_entry (tag , & domain -> cache_tags , node ) {
341
- struct intel_iommu * iommu = tag -> iommu ;
342
- struct device_domain_info * info ;
343
- u16 sid ;
344
-
345
382
switch (tag -> type ) {
346
383
case CACHE_TAG_IOTLB :
347
384
case CACHE_TAG_NESTING_IOTLB :
348
- if (domain -> use_first_level )
349
- qi_flush_piotlb (iommu , tag -> domain_id ,
350
- tag -> pasid , 0 , -1 , 0 );
351
- else
352
- iommu -> flush .flush_iotlb (iommu , tag -> domain_id ,
353
- 0 , 0 , DMA_TLB_DSI_FLUSH );
385
+ cache_tag_flush_iotlb (domain , tag , 0 , -1 , 0 , 0 );
354
386
break ;
355
387
case CACHE_TAG_DEVTLB :
356
388
case CACHE_TAG_NESTING_DEVTLB :
357
- info = dev_iommu_priv_get (tag -> dev );
358
- sid = PCI_DEVID (info -> bus , info -> devfn );
359
-
360
- qi_flush_dev_iotlb (iommu , sid , info -> pfsid , info -> ats_qdep ,
361
- 0 , MAX_AGAW_PFN_WIDTH );
362
- quirk_extra_dev_tlb_flush (info , 0 , MAX_AGAW_PFN_WIDTH ,
363
- IOMMU_NO_PASID , info -> ats_qdep );
389
+ cache_tag_flush_devtlb_all (domain , tag );
364
390
break ;
365
391
}
366
392
@@ -399,20 +425,8 @@ void cache_tag_flush_range_np(struct dmar_domain *domain, unsigned long start,
399
425
}
400
426
401
427
if (tag -> type == CACHE_TAG_IOTLB ||
402
- tag -> type == CACHE_TAG_NESTING_IOTLB ) {
403
- /*
404
- * Fallback to domain selective flush if no
405
- * PSI support or the size is too big.
406
- */
407
- if (!cap_pgsel_inv (iommu -> cap ) ||
408
- mask > cap_max_amask_val (iommu -> cap ))
409
- iommu -> flush .flush_iotlb (iommu , tag -> domain_id ,
410
- 0 , 0 , DMA_TLB_DSI_FLUSH );
411
- else
412
- iommu -> flush .flush_iotlb (iommu , tag -> domain_id ,
413
- addr , mask ,
414
- DMA_TLB_PSI_FLUSH );
415
- }
428
+ tag -> type == CACHE_TAG_NESTING_IOTLB )
429
+ cache_tag_flush_iotlb (domain , tag , addr , pages , mask , 0 );
416
430
417
431
trace_cache_tag_flush_range_np (tag , start , end , addr , pages , mask );
418
432
}
0 commit comments