|
@@ -3393,15 +3393,26 @@ void hsw_enable_ips(struct intel_crtc *crtc)
|
|
|
* only after intel_enable_plane. And intel_enable_plane already waits
|
|
|
* for a vblank, so all we need to do here is to enable the IPS bit. */
|
|
|
assert_plane_enabled(dev_priv, crtc->plane);
|
|
|
- I915_WRITE(IPS_CTL, IPS_ENABLE);
|
|
|
-
|
|
|
- /* The bit only becomes 1 in the next vblank, so this wait here is
|
|
|
- * essentially intel_wait_for_vblank. If we don't have this and don't
|
|
|
- * wait for vblanks until the end of crtc_enable, then the HW state
|
|
|
- * readout code will complain that the expected IPS_CTL value is not the
|
|
|
- * one we read. */
|
|
|
- if (wait_for(I915_READ_NOTRACE(IPS_CTL) & IPS_ENABLE, 50))
|
|
|
- DRM_ERROR("Timed out waiting for IPS enable\n");
|
|
|
+ if (IS_BROADWELL(crtc->base.dev)) {
|
|
|
+ mutex_lock(&dev_priv->rps.hw_lock);
|
|
|
+ WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0xc0000000));
|
|
|
+ mutex_unlock(&dev_priv->rps.hw_lock);
|
|
|
+ /* Quoting Art Runyan: "its not safe to expect any particular
|
|
|
+ * value in IPS_CTL bit 31 after enabling IPS through the
|
|
|
+ * mailbox." Therefore we need to defer waiting on the state
|
|
|
+ * change.
|
|
|
+ * TODO: need to fix this for state checker
|
|
|
+ */
|
|
|
+ } else {
|
|
|
+ I915_WRITE(IPS_CTL, IPS_ENABLE);
|
|
|
+ /* The bit only becomes 1 in the next vblank, so this wait here
|
|
|
+ * is essentially intel_wait_for_vblank. If we don't have this
|
|
|
+ * and don't wait for vblanks until the end of crtc_enable, then
|
|
|
+ * the HW state readout code will complain that the expected
|
|
|
+ * IPS_CTL value is not the one we read. */
|
|
|
+ if (wait_for(I915_READ_NOTRACE(IPS_CTL) & IPS_ENABLE, 50))
|
|
|
+ DRM_ERROR("Timed out waiting for IPS enable\n");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
void hsw_disable_ips(struct intel_crtc *crtc)
|
|
@@ -3413,7 +3424,12 @@ void hsw_disable_ips(struct intel_crtc *crtc)
|
|
|
return;
|
|
|
|
|
|
assert_plane_enabled(dev_priv, crtc->plane);
|
|
|
- I915_WRITE(IPS_CTL, 0);
|
|
|
+ if (IS_BROADWELL(crtc->base.dev)) {
|
|
|
+ mutex_lock(&dev_priv->rps.hw_lock);
|
|
|
+ WARN_ON(sandybridge_pcode_write(dev_priv, DISPLAY_IPS_CONTROL, 0));
|
|
|
+ mutex_unlock(&dev_priv->rps.hw_lock);
|
|
|
+ } else
|
|
|
+ I915_WRITE(IPS_CTL, 0);
|
|
|
POSTING_READ(IPS_CTL);
|
|
|
|
|
|
/* We need to wait for a vblank before we can disable the plane. */
|