[Intel-gfx] [PATCH 2/4] drm/i915: Introduce SAGV mutex.
Rodrigo Vivi
rodrigo.vivi at intel.com
Mon Feb 26 20:53:07 UTC 2018
Now that we are spreading the places we can manipulate
sagv status let's protect it.
Signed-off-by: Rodrigo Vivi <rodrigo.vivi at 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
More information about the Intel-gfx
mailing list