[PATCH 10/11] drm/i915/guc: Only initialise GuC submission once

Chris Wilson chris at chris-wilson.co.uk
Sun Nov 20 17:24:40 UTC 2016


Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_guc_submission.c | 15 +++++----------
 drivers/gpu/drm/i915/intel_guc_loader.c    |  8 +++-----
 2 files changed, 8 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index b88d4a525c7c..8d6e93473b4b 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -772,6 +772,8 @@ static void guc_init_doorbell_hw(struct intel_guc *guc)
 	uint16_t db_id;
 	int i, err;
 
+	/* Wipe bitmap & delete client in case of reinitialisation */
+	bitmap_clear(guc->doorbell_bitmap, 0, GUC_MAX_DOORBELLS);
 	guc_disable_doorbell(guc, client);
 
 	for (i = 0; i < GUC_MAX_DOORBELLS; ++i) {
@@ -1486,16 +1488,6 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
 	if (!HAS_GUC_SCHED(dev_priv))
 		return 0;
 
-	/* Wipe bitmap & delete client in case of reinitialisation */
-	bitmap_clear(guc->doorbell_bitmap, 0, GUC_MAX_DOORBELLS);
-	i915_guc_submission_disable(dev_priv);
-
-	if (!i915.enable_guc_submission)
-		return 0; /* not enabled  */
-
-	if (guc->ctx_pool_vma)
-		return 0; /* already allocated */
-
 	vma = guc_allocate_vma(guc, gemsize);
 	if (IS_ERR(vma))
 		return PTR_ERR(vma);
@@ -1536,6 +1528,9 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
 	struct intel_engine_cs *engine;
 	enum intel_engine_id id;
 
+	if (!guc->execbuf_client)
+		return 0;
+
 	host2guc_sample_forcewake(guc, client);
 	guc_init_doorbell_hw(guc);
 	guc_reset_wq(client);
diff --git a/drivers/gpu/drm/i915/intel_guc_loader.c b/drivers/gpu/drm/i915/intel_guc_loader.c
index 34d6ad2cf7c1..143215bc6613 100644
--- a/drivers/gpu/drm/i915/intel_guc_loader.c
+++ b/drivers/gpu/drm/i915/intel_guc_loader.c
@@ -493,10 +493,6 @@ int intel_guc_setup(struct drm_device *dev)
 		intel_guc_fw_status_repr(guc_fw->guc_fw_fetch_status),
 		intel_guc_fw_status_repr(guc_fw->guc_fw_load_status));
 
-	err = i915_guc_submission_init(dev_priv);
-	if (err)
-		goto fail;
-
 	/*
 	 * WaEnableuKernelHeaderValidFix:skl,bxt
 	 * For BXT, this is only upto B0 but below WA is required for later
@@ -547,7 +543,6 @@ int intel_guc_setup(struct drm_device *dev)
 
 	guc_interrupts_release(dev_priv);
 	i915_guc_submission_disable(dev_priv);
-	i915_guc_submission_fini(dev_priv);
 
 	/*
 	 * We've failed to load the firmware :(
@@ -759,6 +754,9 @@ void intel_guc_init(struct drm_device *dev)
 	guc_fw->guc_fw_fetch_status = GUC_FIRMWARE_NONE;
 	guc_fw->guc_fw_load_status = GUC_FIRMWARE_NONE;
 
+	if (i915.enable_guc_submission && i915_guc_submission_enable(dev_priv))
+		i915.enable_guc_submission = 0;
+
 	/* Early (and silent) return if GuC loading is disabled */
 	if (!i915.enable_guc_loading)
 		return;
-- 
2.10.2



More information about the Intel-gfx-trybot mailing list