[PATCH 06/12] drm/i915/guc: Separate runtime logging create/destroy from base logging
Sagar Arun Kamble
sagar.a.kamble at intel.com
Wed Nov 1 17:29:26 UTC 2017
GuC log runtime/relay channel data is released during i915 unregister,
so only GuC log vma needs to be released during submission_fini. To
achieve this prepare separate helpers to create/destroy base and runtime
logging.
v2: Refined usage of intel_guc_log_destroy and created new function
intel_guc_log_runtime_destroy. (Tvrtko)
v3: Exporting guc_log_runtime_create.
Signed-off-by: Sagar Arun Kamble <sagar.a.kamble at intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Cc: Chris Wilson <chris at chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
---
drivers/gpu/drm/i915/i915_guc_submission.c | 8 +++++++-
drivers/gpu/drm/i915/intel_guc_log.c | 22 ++++++++--------------
drivers/gpu/drm/i915/intel_guc_log.h | 2 ++
drivers/gpu/drm/i915/intel_uc.c | 4 +++-
4 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index 3049a07..e771b3d 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -1258,9 +1258,13 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
if (ret < 0)
goto err_shared_data;
+ ret = intel_guc_log_runtime_create(guc);
+ if (ret < 0)
+ goto err_log;
+
ret = guc_preempt_work_create(guc);
if (ret)
- goto err_log;
+ goto err_log_runtime;
ret = guc_ads_create(guc);
if (ret < 0)
@@ -1270,6 +1274,8 @@ int i915_guc_submission_init(struct drm_i915_private *dev_priv)
err_wq:
guc_preempt_work_destroy(guc);
+err_log_runtime:
+ intel_guc_log_runtime_destroy(&dev_priv->guc);
err_log:
intel_guc_log_destroy(guc);
err_shared_data:
diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
index 200f0a1..40e141c 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.c
+++ b/drivers/gpu/drm/i915/intel_guc_log.c
@@ -357,7 +357,7 @@ static bool guc_log_has_runtime(struct intel_guc *guc)
return guc->log.runtime.buf_addr != NULL;
}
-static int guc_log_runtime_create(struct intel_guc *guc)
+int intel_guc_log_runtime_create(struct intel_guc *guc)
{
struct drm_i915_private *dev_priv = guc_to_i915(guc);
void *vaddr;
@@ -365,6 +365,9 @@ static int guc_log_runtime_create(struct intel_guc *guc)
size_t n_subbufs, subbuf_size;
int ret;
+ if (i915_modparams.guc_log_level < 0)
+ return 0;
+
lockdep_assert_held(&dev_priv->drm.struct_mutex);
GEM_BUG_ON(guc_log_has_runtime(guc));
@@ -442,7 +445,7 @@ static int guc_log_runtime_create(struct intel_guc *guc)
return ret;
}
-static void guc_log_runtime_destroy(struct intel_guc *guc)
+void intel_guc_log_runtime_destroy(struct intel_guc *guc)
{
/*
* It's possible that the runtime stuff was never allocated because
@@ -469,7 +472,7 @@ static int guc_log_late_setup(struct intel_guc *guc)
* handle log buffer flush interrupts would not have been done yet,
* so do that now.
*/
- ret = guc_log_runtime_create(guc);
+ ret = intel_guc_log_runtime_create(guc);
if (ret)
goto err;
}
@@ -481,7 +484,7 @@ static int guc_log_late_setup(struct intel_guc *guc)
return 0;
err_runtime:
- guc_log_runtime_destroy(guc);
+ intel_guc_log_runtime_destroy(guc);
err:
/* logging will remain off */
i915_modparams.guc_log_level = -1;
@@ -559,12 +562,6 @@ int intel_guc_log_create(struct intel_guc *guc)
guc->log.vma = vma;
- if (i915_modparams.guc_log_level >= 0) {
- ret = guc_log_runtime_create(guc);
- if (ret < 0)
- goto err_vma;
- }
-
/* each allocated unit is a page */
flags = GUC_LOG_VALID | GUC_LOG_NOTIFY_ON_HALF_FULL |
(GUC_LOG_DPC_PAGES << GUC_LOG_DPC_SHIFT) |
@@ -576,8 +573,6 @@ int intel_guc_log_create(struct intel_guc *guc)
return 0;
-err_vma:
- i915_vma_unpin_and_release(&guc->log.vma);
err:
/* logging will be off */
i915_modparams.guc_log_level = -1;
@@ -586,7 +581,6 @@ int intel_guc_log_create(struct intel_guc *guc)
void intel_guc_log_destroy(struct intel_guc *guc)
{
- guc_log_runtime_destroy(guc);
i915_vma_unpin_and_release(&guc->log.vma);
}
@@ -662,6 +656,6 @@ void i915_guc_log_unregister(struct drm_i915_private *dev_priv)
mutex_lock(&dev_priv->drm.struct_mutex);
/* GuC logging is currently the only user of Guc2Host interrupts */
intel_disable_guc_interrupts(&dev_priv->guc);
- guc_log_runtime_destroy(&dev_priv->guc);
+ intel_guc_log_runtime_destroy(&dev_priv->guc);
mutex_unlock(&dev_priv->drm.struct_mutex);
}
diff --git a/drivers/gpu/drm/i915/intel_guc_log.h b/drivers/gpu/drm/i915/intel_guc_log.h
index f512cf7..345447a 100644
--- a/drivers/gpu/drm/i915/intel_guc_log.h
+++ b/drivers/gpu/drm/i915/intel_guc_log.h
@@ -52,6 +52,8 @@ struct intel_guc_log {
int intel_guc_log_create(struct intel_guc *guc);
void intel_guc_log_destroy(struct intel_guc *guc);
+int intel_guc_log_runtime_create(struct intel_guc *guc);
+void intel_guc_log_runtime_destroy(struct intel_guc *guc);
int i915_guc_log_control(struct drm_i915_private *dev_priv, u64 control_val);
void i915_guc_log_register(struct drm_i915_private *dev_priv);
void i915_guc_log_unregister(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c
index 1157602..383f9fa 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -253,8 +253,10 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv)
err_log_capture:
guc_capture_load_err_log(guc);
err_submission:
- if (i915_modparams.enable_guc_submission)
+ if (i915_modparams.enable_guc_submission) {
+ intel_guc_log_runtime_destroy(&dev_priv->guc);
i915_guc_submission_fini(dev_priv);
+ }
err_guc:
i915_ggtt_disable_guc(dev_priv);
--
1.9.1
More information about the Intel-gfx-trybot
mailing list