Vblank counters are not restored by DMC when exiting deep DC states
because frame counter register is read-only. So it is better to avoid
Deep DC states when waiting for Vblanks. At least we don't mess with
the counters when already waiting for vblank.

Signed-off-by: Rodrigo Vivi <rodrigo.vivi at intel.com>
---
 drivers/gpu/drm/i915/i915_drv.h         |  1 +
 drivers/gpu/drm/i915/i915_irq.c         | 14 ++++++++++++++
 drivers/gpu/drm/i915/intel_runtime_pm.c |  3 +++
 3 files changed, 18 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index fe152df..7aa87c4 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -229,6 +229,7 @@ enum intel_display_power_domain {
        POWER_DOMAIN_PORT_OTHER,
        POWER_DOMAIN_VGA,
        POWER_DOMAIN_AUDIO,
+       POWER_DOMAIN_VBLANK,
        POWER_DOMAIN_PLLS,
        POWER_DOMAIN_AUX_A,
        POWER_DOMAIN_AUX_B,
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 76d48da..4efe20c 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -2756,6 +2756,18 @@ static int gen8_enable_vblank(struct drm_device *dev, 
unsigned int pipe)
        return 0;
 }

+static void gen9_prepare_vblank(struct drm_device *dev, unsigned int pipe)
+{
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       intel_display_power_get(dev_priv, POWER_DOMAIN_VBLANK);
+}
+
+static void gen9_unprepare_vblank(struct drm_device *dev, unsigned int pipe)
+{
+       struct drm_i915_private *dev_priv = to_i915(dev);
+       intel_display_power_put(dev_priv, POWER_DOMAIN_VBLANK);
+}
+
 /* Called from drm generic code, passed 'crtc' which
  * we use as a pipe index
  */
@@ -4589,6 +4601,8 @@ void intel_irq_init(struct drm_i915_private *dev_priv)
                dev->driver->irq_uninstall = gen8_irq_uninstall;
                dev->driver->enable_vblank = gen8_enable_vblank;
                dev->driver->disable_vblank = gen8_disable_vblank;
+               dev->driver->prepare_vblank = gen9_prepare_vblank;
+               dev->driver->unprepare_vblank = gen9_unprepare_vblank;
                if (IS_BROXTON(dev))
                        dev_priv->display.hpd_irq_setup = bxt_hpd_irq_setup;
                else if (HAS_PCH_SPT(dev) || HAS_PCH_KBP(dev))
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c 
b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6e6e079..167fead 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -116,6 +116,8 @@ intel_display_power_domain_str(enum 
intel_display_power_domain domain)
                return "VGA";
        case POWER_DOMAIN_AUDIO:
                return "AUDIO";
+       case POWER_DOMAIN_VBLANK:
+               return "VBLANK";
        case POWER_DOMAIN_PLLS:
                return "PLLS";
        case POWER_DOMAIN_AUX_A:
@@ -419,6 +421,7 @@ static void hsw_set_power_well(struct drm_i915_private 
*dev_priv,
        SKL_DISPLAY_POWERWELL_2_POWER_DOMAINS |         \
        BIT(POWER_DOMAIN_MODESET) |                     \
        BIT(POWER_DOMAIN_AUX_A) |                       \
+       BIT(POWER_DOMAIN_VBLANK) |                      \
        BIT(POWER_DOMAIN_INIT))
 #define SKL_DISPLAY_PSR_BLOCK_POWER_DOMAINS (          \
        BIT(POWER_DOMAIN_MODESET) |                     \
-- 
2.4.3

Reply via email to