aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_psr.c82
1 files changed, 44 insertions, 38 deletions
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c
index 2d53f7398a6d..69a5b276f4d8 100644
--- a/drivers/gpu/drm/i915/intel_psr.c
+++ b/drivers/gpu/drm/i915/intel_psr.c
@@ -775,53 +775,59 @@ void intel_psr_disable(struct intel_dp *intel_dp,
775 cancel_delayed_work_sync(&dev_priv->psr.work); 775 cancel_delayed_work_sync(&dev_priv->psr.work);
776} 776}
777 777
778static void intel_psr_work(struct work_struct *work) 778static bool psr_wait_for_idle(struct drm_i915_private *dev_priv)
779{ 779{
780 struct drm_i915_private *dev_priv = 780 struct intel_dp *intel_dp;
781 container_of(work, typeof(*dev_priv), psr.work.work); 781 i915_reg_t reg;
782 struct intel_dp *intel_dp = dev_priv->psr.enabled; 782 u32 mask;
783 struct drm_crtc *crtc = dp_to_dig_port(intel_dp)->base.base.crtc; 783 int err;
784 enum pipe pipe = to_intel_crtc(crtc)->pipe; 784
785 intel_dp = dev_priv->psr.enabled;
786 if (!intel_dp)
787 return false;
785 788
786 /* We have to make sure PSR is ready for re-enable
787 * otherwise it keeps disabled until next full enable/disable cycle.
788 * PSR might take some time to get fully disabled
789 * and be ready for re-enable.
790 */
791 if (HAS_DDI(dev_priv)) { 789 if (HAS_DDI(dev_priv)) {
792 if (dev_priv->psr.psr2_enabled) { 790 if (dev_priv->psr.psr2_enabled) {
793 if (intel_wait_for_register(dev_priv, 791 reg = EDP_PSR2_STATUS;
794 EDP_PSR2_STATUS, 792 mask = EDP_PSR2_STATUS_STATE_MASK;
795 EDP_PSR2_STATUS_STATE_MASK,
796 0,
797 50)) {
798 DRM_ERROR("Timed out waiting for PSR2 Idle for re-enable\n");
799 return;
800 }
801 } else { 793 } else {
802 if (intel_wait_for_register(dev_priv, 794 reg = EDP_PSR_STATUS;
803 EDP_PSR_STATUS, 795 mask = EDP_PSR_STATUS_STATE_MASK;
804 EDP_PSR_STATUS_STATE_MASK,
805 0,
806 50)) {
807 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
808 return;
809 }
810 } 796 }
811 } else { 797 } else {
812 if (intel_wait_for_register(dev_priv, 798 struct drm_crtc *crtc =
813 VLV_PSRSTAT(pipe), 799 dp_to_dig_port(intel_dp)->base.base.crtc;
814 VLV_EDP_PSR_IN_TRANS, 800 enum pipe pipe = to_intel_crtc(crtc)->pipe;
815 0, 801
816 1)) { 802 reg = VLV_PSRSTAT(pipe);
817 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n"); 803 mask = VLV_EDP_PSR_IN_TRANS;
818 return;
819 }
820 } 804 }
805
806 mutex_unlock(&dev_priv->psr.lock);
807
808 err = intel_wait_for_register(dev_priv, reg, mask, 0, 50);
809 if (err)
810 DRM_ERROR("Timed out waiting for PSR Idle for re-enable\n");
811
812 /* After the unlocked wait, verify that PSR is still wanted! */
821 mutex_lock(&dev_priv->psr.lock); 813 mutex_lock(&dev_priv->psr.lock);
822 intel_dp = dev_priv->psr.enabled; 814 return err == 0 && dev_priv->psr.enabled;
815}
823 816
824 if (!intel_dp) 817static void intel_psr_work(struct work_struct *work)
818{
819 struct drm_i915_private *dev_priv =
820 container_of(work, typeof(*dev_priv), psr.work.work);
821
822 mutex_lock(&dev_priv->psr.lock);
823
824 /*
825 * We have to make sure PSR is ready for re-enable
826 * otherwise it keeps disabled until next full enable/disable cycle.
827 * PSR might take some time to get fully disabled
828 * and be ready for re-enable.
829 */
830 if (!psr_wait_for_idle(dev_priv))
825 goto unlock; 831 goto unlock;
826 832
827 /* 833 /*
@@ -832,7 +838,7 @@ static void intel_psr_work(struct work_struct *work)
832 if (dev_priv->psr.busy_frontbuffer_bits) 838 if (dev_priv->psr.busy_frontbuffer_bits)
833 goto unlock; 839 goto unlock;
834 840
835 intel_psr_activate(intel_dp); 841 intel_psr_activate(dev_priv->psr.enabled);
836unlock: 842unlock:
837 mutex_unlock(&dev_priv->psr.lock); 843 mutex_unlock(&dev_priv->psr.lock);
838} 844}