@@ -6691,7 +6691,7 @@ void intel_suspend_gt_powersave(struct drm_i915_private *dev_priv)
void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv)
{
if (intel_slpc_enabled()) {
- /* TODO: Set SLPC enabled forcefully */
+ dev_priv->guc.slpc.enabled = true;
intel_disable_gt_powersave(dev_priv);
} else {
dev_priv->rps.enabled = true; /* force disabling */
@@ -6704,8 +6704,10 @@ void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv)
void intel_disable_gt_powersave(struct drm_i915_private *dev_priv)
{
if (intel_slpc_enabled()) {
- if (!intel_slpc_active(dev_priv))
+ if (!intel_slpc_active(dev_priv)) {
+ dev_priv->guc.slpc.enabled = false;
return;
+ }
} else if (!READ_ONCE(dev_priv->rps.enabled))
return;
@@ -52,6 +52,19 @@ static void host2guc_slpc_reset(struct drm_i915_private *dev_priv)
host2guc_slpc(dev_priv, data, 4);
}
+static void host2guc_slpc_shutdown(struct drm_i915_private *dev_priv)
+{
+ u32 data[4];
+ u32 shared_data_gtt_offset = i915_ggtt_offset(dev_priv->guc.slpc.vma);
+
+ data[0] = HOST2GUC_ACTION_SLPC_REQUEST;
+ data[1] = SLPC_EVENT(SLPC_EVENT_SHUTDOWN, 2);
+ data[2] = shared_data_gtt_offset;
+ data[3] = 0;
+
+ host2guc_slpc(dev_priv, data, 4);
+}
+
static unsigned int slpc_get_platform_sku(struct drm_i915_private *dev_priv)
{
enum slpc_platform_sku platform_sku;
@@ -149,10 +162,14 @@ void intel_slpc_cleanup(struct drm_i915_private *dev_priv)
void intel_slpc_suspend(struct drm_i915_private *dev_priv)
{
+ host2guc_slpc_shutdown(dev_priv);
+ dev_priv->guc.slpc.enabled = false;
}
void intel_slpc_disable(struct drm_i915_private *dev_priv)
{
+ host2guc_slpc_shutdown(dev_priv);
+ dev_priv->guc.slpc.enabled = false;
}
void intel_slpc_enable(struct drm_i915_private *dev_priv)