Now that we are spreading the places we can manipulate sagv status let's protect it. Signed-off-by: Rodrigo Vivi <rodrigo.vivi@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_drv.h | 15 +++++++++------ drivers/gpu/drm/i915/intel_pm.c | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 82a106b1bdbc..4c5174ceab96 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2122,12 +2122,15 @@ struct drm_i915_private { struct i915_suspend_saved_registers regfile; struct vlv_s0ix_state vlv_s0ix_state; - enum { - I915_SAGV_UNKNOWN = 0, - I915_SAGV_DISABLED, - I915_SAGV_ENABLED, - I915_SAGV_NOT_CONTROLLED - } sagv_status; + struct { + enum { + I915_SAGV_UNKNOWN = 0, + I915_SAGV_DISABLED, + I915_SAGV_ENABLED, + I915_SAGV_NOT_CONTROLLED + } status; + struct mutex lock; + } sagv; struct { /* diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 2b6419b7bdd1..e1ec9c2fd08a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -3584,15 +3584,19 @@ static bool skl_needs_memory_bw_wa(struct intel_atomic_state *state) static bool intel_has_sagv(struct drm_i915_private *dev_priv) { + bool ret = false; + if (IS_KABYLAKE(dev_priv) || IS_COFFEELAKE(dev_priv) || IS_CANNONLAKE(dev_priv)) return true; + mutex_lock(&dev_priv->sagv.lock); if (IS_SKYLAKE(dev_priv) && - dev_priv->sagv_status != I915_SAGV_NOT_CONTROLLED) - return true; + dev_priv->sagv.status != I915_SAGV_NOT_CONTROLLED) + ret = true; + mutex_unlock(&dev_priv->sagv.lock); - return false; + return ret; } /* @@ -3613,8 +3617,9 @@ void intel_enable_sagv(struct drm_i915_private *dev_priv) if (!intel_has_sagv(dev_priv)) return; - if (dev_priv->sagv_status == I915_SAGV_ENABLED) - return; + mutex_lock(&dev_priv->sagv.lock); + if (dev_priv->sagv.status == I915_SAGV_ENABLED) + goto out; DRM_DEBUG_KMS("Enabling the SAGV\n"); mutex_lock(&dev_priv->pcu_lock); @@ -3631,14 +3636,16 @@ void intel_enable_sagv(struct drm_i915_private *dev_priv) */ if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) { DRM_DEBUG_DRIVER("No SAGV found on system, ignoring\n"); - dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED; - return; + dev_priv->sagv.status = I915_SAGV_NOT_CONTROLLED; + goto out; } else if (ret < 0) { DRM_ERROR("Failed to enable the SAGV (%d)\n", ret); - return; + goto out; } - dev_priv->sagv_status = I915_SAGV_ENABLED; + dev_priv->sagv.status = I915_SAGV_ENABLED; +out: + mutex_unlock(&dev_priv->sagv.lock); } void intel_disable_sagv(struct drm_i915_private *dev_priv) @@ -3648,8 +3655,9 @@ void intel_disable_sagv(struct drm_i915_private *dev_priv) if (!intel_has_sagv(dev_priv)) return; - if (dev_priv->sagv_status == I915_SAGV_DISABLED) - return; + mutex_lock(&dev_priv->sagv.lock); + if (dev_priv->sagv.status == I915_SAGV_DISABLED) + goto out; DRM_DEBUG_KMS("Disabling the SAGV\n"); mutex_lock(&dev_priv->pcu_lock); @@ -3667,14 +3675,16 @@ void intel_disable_sagv(struct drm_i915_private *dev_priv) */ if (IS_SKYLAKE(dev_priv) && ret == -ENXIO) { DRM_DEBUG_DRIVER("No SAGV found on system, ignoring\n"); - dev_priv->sagv_status = I915_SAGV_NOT_CONTROLLED; - return; + dev_priv->sagv.status = I915_SAGV_NOT_CONTROLLED; + goto out; } else if (ret < 0) { DRM_ERROR("Failed to disable the SAGV (%d)\n", ret); - return; + goto out; } - dev_priv->sagv_status = I915_SAGV_DISABLED; + dev_priv->sagv.status = I915_SAGV_DISABLED; +out: + mutex_unlock(&dev_priv->sagv.lock); } bool intel_can_enable_sagv(struct drm_atomic_state *state) @@ -9046,6 +9056,7 @@ void intel_init_clock_gating_hooks(struct drm_i915_private *dev_priv) void intel_init_pm(struct drm_i915_private *dev_priv) { intel_fbc_init(dev_priv); + mutex_init(&dev_priv->sagv.lock); /* For cxsr */ if (IS_PINEVIEW(dev_priv)) -- 2.13.6 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx