@@ -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,
@@ -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))
@@ -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) | \
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@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(+)