diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_psr.c | 82 |
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 | ||
778 | static void intel_psr_work(struct work_struct *work) | 778 | static 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) | 817 | static 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); |
836 | unlock: | 842 | unlock: |
837 | mutex_unlock(&dev_priv->psr.lock); | 843 | mutex_unlock(&dev_priv->psr.lock); |
838 | } | 844 | } |