[PATCH v3] drm/xe/vf: Enable CCS save/restore only on supported GUC versions
Satyanarayana K V P
satyanarayana.k.v.p at intel.com
Mon Aug 25 13:56:41 UTC 2025
CCS save/restore is supported starting with GuC 70.48.0 (compatibility
version 1.23.0). Gate the feature on the GuC firmware version and keep it
disabled on older or unsupported versions.
Fixes: f3009272ff2e ("drm/xe/vf: Create contexts for CCS read write")
Signed-off-by: Satyanarayana K V P <satyanarayana.k.v.p at intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
---
V2 -> V3:
- Fixed review comments (Michal)
V1 -> V2:
- Fixed review comments (Michal)
---
drivers/gpu/drm/xe/xe_sriov_vf.c | 40 +++++++++++++++++++++++++-
drivers/gpu/drm/xe/xe_sriov_vf_ccs.c | 3 ++
drivers/gpu/drm/xe/xe_sriov_vf_types.h | 5 ++++
3 files changed, 47 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf.c b/drivers/gpu/drm/xe/xe_sriov_vf.c
index 5de81f213d83..734e64a50f13 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf.c
@@ -10,6 +10,7 @@
#include "xe_gt.h"
#include "xe_gt_sriov_printk.h"
#include "xe_gt_sriov_vf.h"
+#include "xe_guc.h"
#include "xe_guc_ct.h"
#include "xe_guc_submit.h"
#include "xe_irq.h"
@@ -133,7 +134,42 @@ static bool vf_migration_supported(struct xe_device *xe)
* TODO: Add conditions to allow specific platforms, when they're
* supported at production quality.
*/
- return IS_ENABLED(CONFIG_DRM_XE_DEBUG);
+ xe_assert(xe, IS_SRIOV_VF(xe));
+ return xe->sriov.vf.migration.disabled;
+}
+
+static void vf_disable_migration(struct xe_device *xe, const char *fmt, ...)
+{
+ struct va_format vaf;
+ va_list va_args;
+
+ xe_assert(xe, IS_SRIOV_VF(xe));
+
+ va_start(va_args, fmt);
+ vaf.fmt = fmt;
+ vaf.va = &va_args;
+ xe_sriov_notice(xe, "migration disabled: %pV\n", &vaf);
+ va_end(va_args);
+
+ xe->sriov.vf.migration.disabled = true;
+}
+
+static void vf_check_migration_support(struct xe_device *xe)
+{
+ struct xe_tile *tile = xe_device_get_root_tile(xe);
+ struct xe_uc_fw_version *guc_version;
+
+ if (!IS_ENABLED(CONFIG_DRM_XE_DEBUG))
+ return vf_disable_migration(xe,
+ "experimantal feature not available on production builds");
+
+ guc_version = &tile->primary_gt->sriov.vf.guc_version;
+ if (!IS_DGFX(xe) && MAKE_GUC_VER(guc_version->major, guc_version->minor,
+ guc_version->patch) < MAKE_GUC_VER(1, 23, 0)) {
+ return vf_disable_migration(xe,
+ "CCS migration requires GuC ABI >= 1.23 but only %u.%u found",
+ guc_version->major, guc_version->minor);
+ }
}
static void migration_worker_func(struct work_struct *w);
@@ -146,6 +182,8 @@ void xe_sriov_vf_init_early(struct xe_device *xe)
{
INIT_WORK(&xe->sriov.vf.migration.worker, migration_worker_func);
+ vf_check_migration_support(xe);
+
if (!vf_migration_supported(xe))
xe_sriov_info(xe, "migration not supported by this module version\n");
}
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
index 4872e43eb440..05d3c680b3fa 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_ccs.c
@@ -268,6 +268,9 @@ int xe_sriov_vf_ccs_init(struct xe_device *xe)
xe_assert(xe, !IS_DGFX(xe));
xe_assert(xe, xe_device_has_flat_ccs(xe));
+ if (xe->sriov.vf.migration.disabled)
+ return 0;
+
for_each_ccs_rw_ctx(ctx_id) {
ctx = &tile->sriov.vf.ccs[ctx_id];
ctx->ctx_id = ctx_id;
diff --git a/drivers/gpu/drm/xe/xe_sriov_vf_types.h b/drivers/gpu/drm/xe/xe_sriov_vf_types.h
index 24a873c50c49..8eb4ca9f62de 100644
--- a/drivers/gpu/drm/xe/xe_sriov_vf_types.h
+++ b/drivers/gpu/drm/xe/xe_sriov_vf_types.h
@@ -35,6 +35,11 @@ struct xe_device_vf {
struct work_struct worker;
/** @migration.gt_flags: Per-GT request flags for VF migration recovery */
unsigned long gt_flags;
+ /**
+ * @migration.disabled: flag indicating if migration support
+ * was disabled due to missing prerequisites
+ */
+ bool disabled;
} migration;
/** @ccs: VF CCS state data */
--
2.43.0
More information about the Intel-xe
mailing list