diff --git a/drivers/gpu/drm/xe/xe_bo.c b/drivers/gpu/drm/xe/xe_bo.c index ba156a85460c..42a5978ecc74 100644 --- a/drivers/gpu/drm/xe/xe_bo.c +++ b/drivers/gpu/drm/xe/xe_bo.c @@ -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) { diff --git a/drivers/gpu/drm/xe/xe_bo.h b/drivers/gpu/drm/xe/xe_bo.h index 4350845542bf..e38894c1255d 100644 --- a/drivers/gpu/drm/xe/xe_bo.h +++ b/drivers/gpu/drm/xe/xe_bo.h @@ -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); diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c index 64da98152455..7aa12f86e55b 100644 --- a/drivers/gpu/drm/xe/xe_pt.c +++ b/drivers/gpu/drm/xe/xe_pt.c @@ -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 {