Commit 59ea53ee authored by Matthew Brost's avatar Matthew Brost Committed by Rodrigo Vivi

drm/xe: Use BO's GT to determine dma_offset when programming PTEs

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: default avatarThomas Hellström <thomas.hellstrom@linux.intel.com>
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarRodrigo Vivi <rodrigo.vivi@intel.com>
parent 99c5952f
...@@ -79,6 +79,19 @@ mem_type_to_gt(struct xe_device *xe, u32 mem_type) ...@@ -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)); 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, static void try_add_system(struct xe_bo *bo, struct ttm_place *places,
u32 bo_flags, u32 *c) u32 bo_flags, u32 *c)
{ {
......
...@@ -105,6 +105,8 @@ struct xe_bo *xe_bo_create_from_data(struct xe_device *xe, struct xe_gt *gt, ...@@ -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, int xe_bo_placement_for_flags(struct xe_device *xe, struct xe_bo *bo,
u32 bo_flags); 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) static inline struct xe_bo *ttm_to_xe_bo(const struct ttm_buffer_object *bo)
{ {
return container_of(bo, struct xe_bo, ttm); return container_of(bo, struct xe_bo, ttm);
......
...@@ -758,10 +758,12 @@ xe_pt_stage_bind(struct xe_gt *gt, struct xe_vma *vma, ...@@ -758,10 +758,12 @@ xe_pt_stage_bind(struct xe_gt *gt, struct xe_vma *vma,
int ret; int ret;
if (is_vram) { if (is_vram) {
struct xe_gt *bo_gt = xe_bo_to_gt(bo);
xe_walk.default_pte = GEN12_PPGTT_PTE_LM; xe_walk.default_pte = GEN12_PPGTT_PTE_LM;
if (vma && vma->use_atomic_access_pte_bit) if (vma && vma->use_atomic_access_pte_bit)
xe_walk.default_pte |= GEN12_USM_PPGTT_PTE_AE; 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; gt_to_xe(gt)->mem.vram.io_start;
xe_walk.cache = XE_CACHE_WB; xe_walk.cache = XE_CACHE_WB;
} else { } else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment