Commit 4be3fca2 authored by Tomasz Lis's avatar Tomasz Lis Committed by Michal Wajdeczko
Browse files

drm/xe/vf: Start post-migration fixups with provisioning query



During post-migration recovery, only MMIO communication to GuC is
allowed. The VF KMD needs to use that channel to ask for the new
provisioning, which includes a new GGTT range assigned to the VF.

v2: query config only instead of handshake; no need to get pm ref as
 it's now kept through whole recovery (Michal)
v3: switched names of 'err' and 'ret'  (Michal)

Signed-off-by: default avatarTomasz Lis <tomasz.lis@intel.com>
Reviewed-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241104213449.1455694-5-tomasz.lis@intel.com


Signed-off-by: default avatarMichal Wajdeczko <michal.wajdeczko@intel.com>
parent 1255954d
Loading
Loading
Loading
Loading
+36 −0
Original line number Diff line number Diff line
@@ -132,6 +132,31 @@ void xe_sriov_vf_init_early(struct xe_device *xe)
	INIT_WORK(&xe->sriov.vf.migration.worker, migration_worker_func);
}

/**
 * vf_post_migration_requery_guc - Re-query GuC for current VF provisioning.
 * @xe: the &xe_device struct instance
 *
 * After migration, we need to re-query all VF configuration to make sure
 * they match previous provisioning. Note that most of VF provisioning
 * shall be the same, except GGTT range, since GGTT is not virtualized per-VF.
 *
 * Returns: 0 if the operation completed successfully, or a negative error
 * code otherwise.
 */
static int vf_post_migration_requery_guc(struct xe_device *xe)
{
	struct xe_gt *gt;
	unsigned int id;
	int err, ret = 0;

	for_each_gt(gt, xe, id) {
		err = xe_gt_sriov_vf_query_config(gt);
		ret = ret ?: err;
	}

	return ret;
}

/*
 * Notify all GuCs about resource fixups apply finished.
 */
@@ -147,12 +172,23 @@ static void vf_post_migration_notify_resfix_done(struct xe_device *xe)

static void vf_post_migration_recovery(struct xe_device *xe)
{
	int err;

	drm_dbg(&xe->drm, "migration recovery in progress\n");
	xe_pm_runtime_get(xe);
	err = vf_post_migration_requery_guc(xe);
	if (unlikely(err))
		goto fail;

	/* FIXME: add the recovery steps */
	vf_post_migration_notify_resfix_done(xe);
	xe_pm_runtime_put(xe);
	drm_notice(&xe->drm, "migration recovery ended\n");
	return;
fail:
	xe_pm_runtime_put(xe);
	drm_err(&xe->drm, "migration recovery failed (%pe)\n", ERR_PTR(err));
	xe_device_declare_wedged(xe);
}

static void migration_worker_func(struct work_struct *w)