drm/xe: Invalidate TLB on all affected GTs during GGTT updates
authorMatt Roper <matthew.d.roper@intel.com>
Thu, 1 Jun 2023 21:52:39 +0000 (14:52 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:34:19 +0000 (18:34 -0500)
The GGTT is part of the tile and is shared by the primary and media GTs
on platforms with a standalone media architecture.  However each of
these GTs has its own TLBs caching the page table lookups, and each
needs to be invalidated separately.

Reviewed-by: Nirmoy Das <nirmoy.das@intel.com>
Link: https://lore.kernel.org/r/20230601215244.678611-27-matthew.d.roper@intel.com
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_ggtt.c

index 8d3638826860b92f0d51e066d15e3e63937edaf2..d6724949611319494c59fa5b09cb4a14cda5317e 100644 (file)
@@ -190,13 +190,10 @@ err:
 #define PVC_GUC_TLB_INV_DESC1                  XE_REG(0xcf80)
 #define   PVC_GUC_TLB_INV_DESC1_INVALIDATE     REG_BIT(6)
 
-void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
+static void ggtt_invalidate_gt_tlb(struct xe_gt *gt)
 {
-       /*
-        * TODO: Loop over each GT in tile once media GT support is
-        * re-added
-        */
-       struct xe_gt *gt = ggtt->tile->primary_gt;
+       if (!gt)
+               return;
 
        /* TODO: vfunc for GuC vs. non-GuC */
 
@@ -221,6 +218,13 @@ void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
        }
 }
 
+void xe_ggtt_invalidate(struct xe_ggtt *ggtt)
+{
+       /* Each GT in a tile has its own TLB to cache GGTT lookups */
+       ggtt_invalidate_gt_tlb(ggtt->tile->primary_gt);
+       ggtt_invalidate_gt_tlb(ggtt->tile->media_gt);
+}
+
 void xe_ggtt_printk(struct xe_ggtt *ggtt, const char *prefix)
 {
        u64 addr, scratch_pte;