On Wed, 27 Sep 2017 11:30:35 +0200, Sagar Arun Kamble
<sagar.a.kamble@xxxxxxxxx> wrote:
Apart from configuring interrupts, we need to update the ggtt invalidate
interface and GuC communication on suspend/resume. This functionality
can be reused for other suspend and reset paths.
v2: Rebase w.r.t removal of GuC code restructuring.
v3: Removed GuC specific helpers as tasks other than send H2G for
sleep/resume are to be done from uc generic functions. (Michal Wajdeczko)
v4: Simplified/Unified the error messaging in uc_runtime_suspend/resume.
(Michal Wajdeczko). Rebase w.r.t i915_modparams change.
Added documentation to intel_uc_runtime_suspend/resume.
Signed-off-by: Sagar Arun Kamble <sagar.a.kamble@xxxxxxxxx>
Cc: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx>
Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx>
Reviewed-by: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx>
---
drivers/gpu/drm/i915/i915_guc_submission.c | 5 ---
drivers/gpu/drm/i915/intel_uc.c | 60
+++++++++++++++++++++++++++++-
2 files changed, 58 insertions(+), 7 deletions(-)
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c
b/drivers/gpu/drm/i915/i915_guc_submission.c
index 04f1281..d1d6c0d 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -1226,8 +1226,6 @@ int intel_guc_suspend(struct drm_i915_private
*dev_priv)
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
return 0;
Btw, this check can be also moved to intel_uc_runtime_suspend()
- gen9_disable_guc_interrupts(dev_priv);
-
ctx = dev_priv->kernel_context;
data[0] = INTEL_GUC_ACTION_ENTER_S_STATE;
@@ -1252,9 +1250,6 @@ int intel_guc_resume(struct drm_i915_private
*dev_priv)
if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
return 0;
And above to intel_uc_runtime_resume()
- if (i915_modparams.guc_log_level >= 0)
- gen9_enable_guc_interrupts(dev_priv);
-
ctx = dev_priv->kernel_context;
data[0] = INTEL_GUC_ACTION_EXIT_S_STATE;
diff --git a/drivers/gpu/drm/i915/intel_uc.c
b/drivers/gpu/drm/i915/intel_uc.c
index 7b30790..1446b5e 100644
--- a/drivers/gpu/drm/i915/intel_uc.c
+++ b/drivers/gpu/drm/i915/intel_uc.c
@@ -481,14 +481,70 @@ void intel_uc_fini_hw(struct drm_i915_private
*dev_priv)
i915_ggtt_disable_guc(dev_priv);
}
+/**
+ * intel_uc_runtime_suspend() - Suspend uC operation.
+ * @dev_priv: i915 device private
+ *
+ * This function invokes GuC OS suspension, makes ggtt_invalidate
function to
+ * point to non-GuC variant, disables GuC interrupts and disable
communication
+ * with GuC.
+ *
+ * Return: non-zero code on error
+ */
int intel_uc_runtime_suspend(struct drm_i915_private *dev_priv)
{
- return intel_guc_suspend(dev_priv);
+ int ret;
+
+ if (!i915_modparams.enable_guc_loading)
+ return 0;
+
+ ret = intel_guc_suspend(dev_priv);
+ if (ret)
+ goto out;
+
+ i915_ggtt_disable_guc(dev_priv);
+ gen9_disable_guc_interrupts(dev_priv);
+ guc_disable_communication(&dev_priv->guc);
+
+out:
+ if (ret)
+ DRM_ERROR("uC runtime suspend failed (%d)\n", ret);
+ return ret;
}
+/**
+ * intel_uc_runtime_resume() - Resume uC operation.
+ * @dev_priv: i915 device private
+ *
+ * This function enables communication with GuC, enables GuC interrupts,
+ * makes ggtt_invalidate function to point to GuC variant and invokes
+ * GuC OS resumption.
+ *
+ * Return: non-zero code on error
+ */
int intel_uc_runtime_resume(struct drm_i915_private *dev_priv)
{
- return intel_guc_resume(dev_priv);
+ int ret;
+
+ if (!i915_modparams.enable_guc_loading)
+ return 0;
+
+ ret = guc_enable_communication(&dev_priv->guc);
+ if (ret)
+ goto out;
+
+ if (i915_modparams.guc_log_level >= 0)
+ gen9_enable_guc_interrupts(dev_priv);
+ i915_ggtt_enable_guc(dev_priv);
+
+ ret = intel_guc_resume(dev_priv);
+ if (ret)
+ goto out;
+
+out:
+ if (ret)
+ DRM_ERROR("uC runtime resume failed (%d)\n", ret);
+ return ret;
}
int intel_uc_suspend(struct drm_i915_private *dev_priv)
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx