Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06bb372f authored by Zhi Wang's avatar Zhi Wang Committed by Zhenyu Wang
Browse files

drm/i915/gvt: Introduce intel_vgpu_reset_submission



Introduce an generic API to reset vGPU virtual submission interface.

Signed-off-by: default avatarZhi Wang <zhi.a.wang@intel.com>
parent ad1d3636
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -564,18 +564,7 @@ void clean_execlist(struct intel_vgpu *vgpu)
	}
}

int init_execlist(struct intel_vgpu *vgpu)
{
	enum intel_engine_id i;
	struct intel_engine_cs *engine;

	for_each_engine(engine, vgpu->gvt->dev_priv, i)
		init_vgpu_execlist(vgpu, i);

	return 0;
}

void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
void reset_execlist(struct intel_vgpu *vgpu,
		unsigned long engine_mask)
{
	struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
@@ -587,8 +576,15 @@ void intel_vgpu_reset_execlist(struct intel_vgpu *vgpu,
		init_vgpu_execlist(vgpu, engine->id);
}

int init_execlist(struct intel_vgpu *vgpu)
{
	reset_execlist(vgpu, ALL_ENGINES);
	return 0;
}

const struct intel_vgpu_submission_ops intel_vgpu_execlist_submission_ops = {
	.name = "execlist",
	.init = init_execlist,
	.reset = reset_execlist,
	.clean = clean_execlist,
};
+1 −0
Original line number Diff line number Diff line
@@ -151,6 +151,7 @@ struct intel_vgpu_submission_ops {
	const char *name;
	int (*init)(struct intel_vgpu *vgpu);
	void (*clean)(struct intel_vgpu *vgpu);
	void (*reset)(struct intel_vgpu *vgpu, unsigned long engine_mask);
};

struct intel_vgpu_submission {
+20 −0
Original line number Diff line number Diff line
@@ -889,6 +889,26 @@ void intel_vgpu_clean_submission(struct intel_vgpu *vgpu)
	kmem_cache_destroy(s->workloads);
}


/**
 * intel_vgpu_reset_submission - reset submission-related resource for vGPU
 * @vgpu: a vGPU
 * @engine_mask: engines expected to be reset
 *
 * This function is called when a vGPU is being destroyed.
 *
 */
void intel_vgpu_reset_submission(struct intel_vgpu *vgpu,
		unsigned long engine_mask)
{
	struct intel_vgpu_submission *s = &vgpu->submission;

	if (!s->active)
		return;

	s->ops->reset(vgpu, engine_mask);
}

/**
 * intel_vgpu_setup_submission - setup submission-related resource for vGPU
 * @vgpu: a vGPU
+3 −0
Original line number Diff line number Diff line
@@ -139,6 +139,9 @@ void intel_gvt_wait_vgpu_idle(struct intel_vgpu *vgpu);

int intel_vgpu_setup_submission(struct intel_vgpu *vgpu);

void intel_vgpu_reset_submission(struct intel_vgpu *vgpu,
				 unsigned long engine_mask);

void intel_vgpu_clean_submission(struct intel_vgpu *vgpu);

int intel_vgpu_select_submission_ops(struct intel_vgpu *vgpu,
+2 −2
Original line number Diff line number Diff line
@@ -492,10 +492,10 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
		mutex_lock(&gvt->lock);
	}

	intel_vgpu_reset_execlist(vgpu, resetting_eng);

	intel_vgpu_reset_submission(vgpu, resetting_eng);
	/* full GPU reset or device model level reset */
	if (engine_mask == ALL_ENGINES || dmlr) {
		intel_vgpu_select_submission_ops(vgpu, 0);

		/*fence will not be reset during virtual reset */
		if (dmlr) {