Commit 628d5939 authored by Matthew Brost's avatar Matthew Brost
Browse files

drm/xe: Add exec queue active vfunc



If an exec queue is inactive (e.g., not registered or scheduling is
disabled), TLB invalidations are not issued for that queue. Add a
virtual function to determine the active state, which TLB invalidation
logic can hook into.

v5:
 - Operate on primary in active function

Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Tested-by: default avatarStuart Summers <stuart.summers@intel.com>
Reviewed-by: default avatarStuart Summers <stuart.summers@intel.com>
Link: https://patch.msgid.link/20260116221731.868657-11-matthew.brost@intel.com
parent 6b42b635
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -300,6 +300,8 @@ struct xe_exec_queue_ops {
	void (*resume)(struct xe_exec_queue *q);
	/** @reset_status: check exec queue reset status */
	bool (*reset_status)(struct xe_exec_queue *q);
	/** @active: check exec queue is active */
	bool (*active)(struct xe_exec_queue *q);
};

#endif
+7 −0
Original line number Diff line number Diff line
@@ -468,6 +468,12 @@ static bool execlist_exec_queue_reset_status(struct xe_exec_queue *q)
	return false;
}

static bool execlist_exec_queue_active(struct xe_exec_queue *q)
{
	/* NIY */
	return false;
}

static const struct xe_exec_queue_ops execlist_exec_queue_ops = {
	.init = execlist_exec_queue_init,
	.kill = execlist_exec_queue_kill,
@@ -480,6 +486,7 @@ static const struct xe_exec_queue_ops execlist_exec_queue_ops = {
	.suspend_wait = execlist_exec_queue_suspend_wait,
	.resume = execlist_exec_queue_resume,
	.reset_status = execlist_exec_queue_reset_status,
	.active = execlist_exec_queue_active,
};

int xe_execlist_init(struct xe_gt *gt)
+9 −0
Original line number Diff line number Diff line
@@ -2276,6 +2276,14 @@ static bool guc_exec_queue_reset_status(struct xe_exec_queue *q)
	return exec_queue_reset(q) || exec_queue_killed_or_banned_or_wedged(q);
}

static bool guc_exec_queue_active(struct xe_exec_queue *q)
{
	struct xe_exec_queue *primary = xe_exec_queue_multi_queue_primary(q);

	return exec_queue_enabled(primary) &&
		!exec_queue_pending_disable(primary);
}

/*
 * All of these functions are an abstraction layer which other parts of Xe can
 * use to trap into the GuC backend. All of these functions, aside from init,
@@ -2295,6 +2303,7 @@ static const struct xe_exec_queue_ops guc_exec_queue_ops = {
	.suspend_wait = guc_exec_queue_suspend_wait,
	.resume = guc_exec_queue_resume,
	.reset_status = guc_exec_queue_reset_status,
	.active = guc_exec_queue_active,
};

static void guc_exec_queue_stop(struct xe_guc *guc, struct xe_exec_queue *q)