Now that we are spreading the places we can manipulate
sagv status let's protect it.

Signed-off-by: Rodrigo Vivi <rodrigo.v...@intel.com>
---
 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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to