drm/xe: Use BO's GT to determine dma_offset when programming PTEs
authorMatthew Brost <matthew.brost@intel.com>
Thu, 23 Mar 2023 16:25:00 +0000 (09:25 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Tue, 19 Dec 2023 23:30:21 +0000 (18:30 -0500)
Rather than using the passed in GT, use the BO's GT determine dma_offset
when programming PTEs as these two GT's could differ (i.e. mapping a BO
from a remote GT). The BO's GT is correct GT to use as this where BO
resides, while the passed in GT is where the mapping is created.

v2:
  (Thomas)      - Kernel doc, extra new line
  (CI)          - Rebase to tip

Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: Matthew Brost <matthew.brost@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/xe/xe_bo.c
drivers/gpu/drm/xe/xe_bo.h
drivers/gpu/drm/xe/xe_pt.c

index ba156a85460c704b3f76eb69b60fa0d73c2f3d01..42a5978ecc7427263b5779f8816bb2b45e5dcc31 100644 (file)
@@ -79,6 +79,19 @@ mem_type_to_gt(struct xe_device *xe, u32 mem_type)
        return xe_device_get_gt(xe, mem_type == XE_PL_STOLEN ? 0 : (mem_type - XE_PL_VRAM0));
 }
 
+/**
+ * xe_bo_to_gt() - Get a GT from a BO's memory location
+ * @bo: The buffer object
+ *
+ * Get a GT from a BO's memory location, should be called on BOs in VRAM only.
+ *
+ * Return: xe_gt object which is closest to the BO
+ */
+struct xe_gt *xe_bo_to_gt(struct xe_bo *bo)
+{
+       return mem_type_to_gt(xe_bo_device(bo), bo->ttm.resource->mem_type);
+}
+
 static void try_add_system(struct xe_bo *bo, struct ttm_place *places,
                           u32 bo_flags, u32 *c)
 {
index 4350845542bf4ad90b0e1c92d135095ece3186db..e38894c1255d701f2c760fb5fa63f38789d52621 100644 (file)
@@ -105,6 +105,8 @@ struct xe_bo *xe_bo_create_from_data(struct xe_device *xe, struct xe_gt *gt,
 int xe_bo_placement_for_flags(struct xe_device *xe, struct xe_bo *bo,
                              u32 bo_flags);
 
+struct xe_gt *xe_bo_to_gt(struct xe_bo *bo);
+
 static inline struct xe_bo *ttm_to_xe_bo(const struct ttm_buffer_object *bo)
 {
        return container_of(bo, struct xe_bo, ttm);
index 64da9815245597ba17651dbb7bea781f1204fc7e..7aa12f86e55bdafe5f4720ce8173768dded894c6 100644 (file)
@@ -758,10 +758,12 @@ xe_pt_stage_bind(struct xe_gt *gt, struct xe_vma *vma,
        int ret;
 
        if (is_vram) {
+               struct xe_gt *bo_gt = xe_bo_to_gt(bo);
+
                xe_walk.default_pte = GEN12_PPGTT_PTE_LM;
                if (vma && vma->use_atomic_access_pte_bit)
                        xe_walk.default_pte |= GEN12_USM_PPGTT_PTE_AE;
-               xe_walk.dma_offset = gt->mem.vram.io_start -
+               xe_walk.dma_offset = bo_gt->mem.vram.io_start -
                        gt_to_xe(gt)->mem.vram.io_start;
                xe_walk.cache = XE_CACHE_WB;
        } else {