|
@@ -284,6 +284,13 @@ static void hsw_power_well_post_enable(struct drm_i915_private *dev_priv)
|
|
|
1 << PIPE_C | 1 << PIPE_B);
|
|
|
}
|
|
|
|
|
|
+static void hsw_power_well_pre_disable(struct drm_i915_private *dev_priv)
|
|
|
+{
|
|
|
+ if (IS_BROADWELL(dev_priv))
|
|
|
+ gen8_irq_power_well_pre_disable(dev_priv,
|
|
|
+ 1 << PIPE_C | 1 << PIPE_B);
|
|
|
+}
|
|
|
+
|
|
|
static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
|
|
|
struct i915_power_well *power_well)
|
|
|
{
|
|
@@ -309,6 +316,14 @@ static void skl_power_well_post_enable(struct drm_i915_private *dev_priv,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void skl_power_well_pre_disable(struct drm_i915_private *dev_priv,
|
|
|
+ struct i915_power_well *power_well)
|
|
|
+{
|
|
|
+ if (power_well->data == SKL_DISP_PW_2)
|
|
|
+ gen8_irq_power_well_pre_disable(dev_priv,
|
|
|
+ 1 << PIPE_C | 1 << PIPE_B);
|
|
|
+}
|
|
|
+
|
|
|
static void hsw_set_power_well(struct drm_i915_private *dev_priv,
|
|
|
struct i915_power_well *power_well, bool enable)
|
|
|
{
|
|
@@ -334,6 +349,7 @@ static void hsw_set_power_well(struct drm_i915_private *dev_priv,
|
|
|
|
|
|
} else {
|
|
|
if (enable_requested) {
|
|
|
+ hsw_power_well_pre_disable(dev_priv);
|
|
|
I915_WRITE(HSW_PWR_WELL_DRIVER, 0);
|
|
|
POSTING_READ(HSW_PWR_WELL_DRIVER);
|
|
|
DRM_DEBUG_KMS("Requesting to disable the power well\n");
|
|
@@ -709,6 +725,9 @@ static void skl_set_power_well(struct drm_i915_private *dev_priv,
|
|
|
state_mask = SKL_POWER_WELL_STATE(power_well->data);
|
|
|
is_enabled = tmp & state_mask;
|
|
|
|
|
|
+ if (!enable && enable_requested)
|
|
|
+ skl_power_well_pre_disable(dev_priv, power_well);
|
|
|
+
|
|
|
if (enable) {
|
|
|
if (!enable_requested) {
|
|
|
WARN((tmp & state_mask) &&
|