Commit 3f6cd669 authored by Piotr Piórkowski's avatar Piotr Piórkowski Committed by Michal Wajdeczko
Browse files

drm/xe: Force user context allocations in user VRAM



In general, kernel structures should be allocated in the kernel-dedicated
VRAM region. However, userspace context data - while used by the kernel -
does not need to reside there.
Let's force the allocation of such data in the general-purpose VRAM region
accessible to userspace.

Signed-off-by: default avatarPiotr Piórkowski <piotr.piorkowski@intel.com>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://lore.kernel.org/r/20251003162619.1984236-4-piotr.piorkowski@intel.com
parent 9d290ab0
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -183,7 +183,7 @@ static struct xe_exec_queue *__xe_exec_queue_alloc(struct xe_device *xe,
	return q;
}

static int __xe_exec_queue_init(struct xe_exec_queue *q)
static int __xe_exec_queue_init(struct xe_exec_queue *q, u32 exec_queue_flags)
{
	int i, err;
	u32 flags = 0;
@@ -202,6 +202,9 @@ static int __xe_exec_queue_init(struct xe_exec_queue *q)
			flags |= XE_LRC_CREATE_RUNALONE;
	}

	if (!(exec_queue_flags & EXEC_QUEUE_FLAG_KERNEL))
		flags |= XE_LRC_CREATE_USER_CTX;

	for (i = 0; i < q->width; ++i) {
		q->lrc[i] = xe_lrc_create(q->hwe, q->vm, SZ_16K, q->msix_vec, flags);
		if (IS_ERR(q->lrc[i])) {
@@ -248,7 +251,7 @@ struct xe_exec_queue *xe_exec_queue_create(struct xe_device *xe, struct xe_vm *v
	if (IS_ERR(q))
		return q;

	err = __xe_exec_queue_init(q);
	err = __xe_exec_queue_init(q, flags);
	if (err)
		goto err_post_alloc;

+3 −0
Original line number Diff line number Diff line
@@ -1415,6 +1415,9 @@ static int xe_lrc_init(struct xe_lrc *lrc, struct xe_hw_engine *hwe,
	if (vm && vm->xef) /* userspace */
		bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE;

	if (init_flags & XE_LRC_CREATE_USER_CTX)
		bo_flags |= XE_BO_FLAG_FORCE_USER_VRAM;

	lrc->bo = xe_bo_create_pin_map_novm(xe, tile,
					    bo_size,
					    ttm_bo_type_kernel,
+4 −2
Original line number Diff line number Diff line
@@ -44,8 +44,10 @@ struct xe_lrc_snapshot {

#define LRC_WA_BB_SIZE SZ_4K

#define XE_LRC_CREATE_RUNALONE 0x1
#define XE_LRC_CREATE_PXP 0x2
#define XE_LRC_CREATE_RUNALONE		BIT(0)
#define XE_LRC_CREATE_PXP		BIT(1)
#define XE_LRC_CREATE_USER_CTX		BIT(2)

struct xe_lrc *xe_lrc_create(struct xe_hw_engine *hwe, struct xe_vm *vm,
			     u32 ring_size, u16 msix_vec, u32 flags);
void xe_lrc_destroy(struct kref *ref);
+1 −1
Original line number Diff line number Diff line
@@ -122,7 +122,7 @@ struct xe_pt *xe_pt_create(struct xe_vm *vm, struct xe_tile *tile,
		   XE_BO_FLAG_IGNORE_MIN_PAGE_SIZE |
		   XE_BO_FLAG_NO_RESV_EVICT | XE_BO_FLAG_PAGETABLE;
	if (vm->xef) /* userspace */
		bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE;
		bo_flags |= XE_BO_FLAG_PINNED_LATE_RESTORE | XE_BO_FLAG_FORCE_USER_VRAM;

	pt->level = level;