mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
drm/xe/guc: Enable the Dynamic Inhibit Context Switch optimization
The Dynamic Inhibit Context Switch is an optimization aimed at reducing the amount of time the HW is stuck waiting on an unsatisfied semaphore. When this optimization is enabled, the GuC will dynamically modify the CTX_CTRL_INHIBIT_SYN_CTX_SWITCH in the CTX_CONTEXT_CONTROL register of LRCs to enable immediate switching out on an unsatisfied semaphore wait when multiple contexts are competing for time on the same engine. This feature is available on recent HW from GuC 70.40.1 onwards and it is enabled via a per-VF feature opt-in. v2: rebase v3: switch to using guc_buf_cache instead of dedicated alloc v4: add helper to check for feature availability (Michal), don't enable if multi-lrc is possible. Signed-off-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Cc: John Harrison <John.C.Harrison@Intel.com> Cc: Julia Filipchuk <julia.filipchuk@intel.com> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com> Reviewed-by: John Harrison <John.C.Harrison@Intel.com> Link: https://lore.kernel.org/r/20250625205405.1653212-4-daniele.ceraolospurio@intel.com
This commit is contained in:
@@ -583,6 +583,32 @@ static int __guc_opt_in_features_enable(struct xe_guc *guc, u64 addr, u32 num_dw
|
||||
return xe_guc_ct_send_block(&guc->ct, action, ARRAY_SIZE(action));
|
||||
}
|
||||
|
||||
static bool supports_dynamic_ics(struct xe_guc *guc)
|
||||
{
|
||||
struct xe_device *xe = guc_to_xe(guc);
|
||||
struct xe_gt *gt = guc_to_gt(guc);
|
||||
|
||||
/* Dynamic ICS is available for PVC and Xe2 and newer platforms. */
|
||||
if (xe->info.platform != XE_PVC && GRAPHICS_VER(xe) < 20)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* The feature is currently not compatible with multi-lrc, so the GuC
|
||||
* does not support it at all on the media engines (which are the main
|
||||
* users of mlrc). On the primary GT side, to avoid it being used in
|
||||
* conjunction with mlrc, we only enable it if we are in single CCS
|
||||
* mode.
|
||||
*/
|
||||
if (xe_gt_is_media_type(gt) || gt->ccs_mode > 1)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Dynamic ICS requires GuC v70.40.1, which maps to compatibility
|
||||
* version v1.18.4.
|
||||
*/
|
||||
return GUC_SUBMIT_VER(guc) >= MAKE_GUC_VER(1, 18, 4);
|
||||
}
|
||||
|
||||
#define OPT_IN_MAX_DWORDS 16
|
||||
int xe_guc_opt_in_features_enable(struct xe_guc *guc)
|
||||
{
|
||||
@@ -607,6 +633,9 @@ int xe_guc_opt_in_features_enable(struct xe_guc *guc)
|
||||
if (GUC_SUBMIT_VER(guc) >= MAKE_GUC_VER(1, 7, 0))
|
||||
klvs[count++] = PREP_GUC_KLV_TAG(OPT_IN_FEATURE_EXT_CAT_ERR_TYPE);
|
||||
|
||||
if (supports_dynamic_ics(guc))
|
||||
klvs[count++] = PREP_GUC_KLV_TAG(OPT_IN_FEATURE_DYNAMIC_INHIBIT_CONTEXT_SWITCH);
|
||||
|
||||
if (count) {
|
||||
xe_assert(xe, count <= OPT_IN_MAX_DWORDS);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user