|
@@ -4908,6 +4908,57 @@ unlock:
|
|
mutex_unlock(&dev_priv->drrs.mutex);
|
|
mutex_unlock(&dev_priv->drrs.mutex);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void intel_edp_drrs_invalidate(struct drm_device *dev,
|
|
|
|
+ unsigned frontbuffer_bits)
|
|
|
|
+{
|
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
+ struct drm_crtc *crtc;
|
|
|
|
+ enum pipe pipe;
|
|
|
|
+
|
|
|
|
+ if (!dev_priv->drrs.dp)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&dev_priv->drrs.mutex);
|
|
|
|
+ crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
|
|
|
|
+ pipe = to_intel_crtc(crtc)->pipe;
|
|
|
|
+
|
|
|
|
+ if (dev_priv->drrs.refresh_rate_type == DRRS_LOW_RR) {
|
|
|
|
+ cancel_delayed_work_sync(&dev_priv->drrs.work);
|
|
|
|
+ intel_dp_set_drrs_state(dev_priv->dev,
|
|
|
|
+ dev_priv->drrs.dp->attached_connector->panel.
|
|
|
|
+ fixed_mode->vrefresh);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ frontbuffer_bits &= INTEL_FRONTBUFFER_ALL_MASK(pipe);
|
|
|
|
+
|
|
|
|
+ dev_priv->drrs.busy_frontbuffer_bits |= frontbuffer_bits;
|
|
|
|
+ mutex_unlock(&dev_priv->drrs.mutex);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void intel_edp_drrs_flush(struct drm_device *dev,
|
|
|
|
+ unsigned frontbuffer_bits)
|
|
|
|
+{
|
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
+ struct drm_crtc *crtc;
|
|
|
|
+ enum pipe pipe;
|
|
|
|
+
|
|
|
|
+ if (!dev_priv->drrs.dp)
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&dev_priv->drrs.mutex);
|
|
|
|
+ crtc = dp_to_dig_port(dev_priv->drrs.dp)->base.base.crtc;
|
|
|
|
+ pipe = to_intel_crtc(crtc)->pipe;
|
|
|
|
+ dev_priv->drrs.busy_frontbuffer_bits &= ~frontbuffer_bits;
|
|
|
|
+
|
|
|
|
+ cancel_delayed_work_sync(&dev_priv->drrs.work);
|
|
|
|
+
|
|
|
|
+ if (dev_priv->drrs.refresh_rate_type != DRRS_LOW_RR &&
|
|
|
|
+ !dev_priv->drrs.busy_frontbuffer_bits)
|
|
|
|
+ schedule_delayed_work(&dev_priv->drrs.work,
|
|
|
|
+ msecs_to_jiffies(1000));
|
|
|
|
+ mutex_unlock(&dev_priv->drrs.mutex);
|
|
|
|
+}
|
|
|
|
+
|
|
static struct drm_display_mode *
|
|
static struct drm_display_mode *
|
|
intel_dp_drrs_init(struct intel_connector *intel_connector,
|
|
intel_dp_drrs_init(struct intel_connector *intel_connector,
|
|
struct drm_display_mode *fixed_mode)
|
|
struct drm_display_mode *fixed_mode)
|