mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
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: Matthew Brost <matthew.brost@intel.com> Tested-by: Stuart Summers <stuart.summers@intel.com> Reviewed-by: Stuart Summers <stuart.summers@intel.com> Link: https://patch.msgid.link/20260116221731.868657-11-matthew.brost@intel.com
This commit is contained in:
parent
6b42b635d6
commit
628d59392c
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user