diff options
author | Tarun Vyas <tarun.vyas@intel.com> | 2018-06-27 16:02:49 -0400 |
---|---|---|
committer | Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com> | 2018-07-02 13:52:39 -0400 |
commit | c43dbcbbcc8c515d4ececc7a996d5fc7286c28c3 (patch) | |
tree | 88af166425a5bc1bae33df4d9c5f240a8da37b60 /drivers/gpu/drm/i915/intel_psr.c | |
parent | abdd322f680870dbe1942425d1fa2c74de4721f4 (diff) |
drm/i915/psr: Lockless version of psr_wait_for_idle
This is a lockless version of the exisiting psr_wait_for_idle().
We want to wait for PSR to idle out inside intel_pipe_update_start.
At the time of a pipe update, we should never race with any psr
enable or disable code, which is a part of crtc enable/disable.
The follow up patch will use this lockless wait inside pipe_update_
start to wait for PSR to idle out before checking for vblank evasion.
We need to keep the wait in pipe_update_start to as less as it can be.
So,we can live and flourish w/o taking any psr locks at all.
Even if psr is never enabled, psr2_enabled will be false and this
function will wait for PSR1 to idle out, which should just return
immediately, so a very short (~1-2 usec) wait for cases where PSR
is disabled.
v2: Add comment to explain the 25msec timeout (DK)
v3: Rename psr_wait_for_idle to __psr_wait_for_idle_locked to avoid
naming conflicts and propagate err (if any) to the caller (Chris)
v5: Form a series with the next patch
v7: Better explain the need for lockless wait and increase the max
timeout to handle refresh rates < 60 Hz (Daniel Vetter)
v8: Rebase
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: Tarun Vyas <tarun.vyas@intel.com>
Signed-off-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180627200250.1515-1-tarun.vyas@intel.com
Diffstat (limited to 'drivers/gpu/drm/i915/intel_psr.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_psr.c | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/intel_psr.c b/drivers/gpu/drm/i915/intel_psr.c index 45f1cb7d6c04..23acc9ac8d4d 100644 --- a/drivers/gpu/drm/i915/intel_psr.c +++ b/drivers/gpu/drm/i915/intel_psr.c | |||
@@ -717,7 +717,39 @@ void intel_psr_disable(struct intel_dp *intel_dp, | |||
717 | cancel_work_sync(&dev_priv->psr.work); | 717 | cancel_work_sync(&dev_priv->psr.work); |
718 | } | 718 | } |
719 | 719 | ||
720 | static bool psr_wait_for_idle(struct drm_i915_private *dev_priv) | 720 | int intel_psr_wait_for_idle(struct drm_i915_private *dev_priv) |
721 | { | ||
722 | i915_reg_t reg; | ||
723 | u32 mask; | ||
724 | |||
725 | /* | ||
726 | * The sole user right now is intel_pipe_update_start(), | ||
727 | * which won't race with psr_enable/disable, which is | ||
728 | * where psr2_enabled is written to. So, we don't need | ||
729 | * to acquire the psr.lock. More importantly, we want the | ||
730 | * latency inside intel_pipe_update_start() to be as low | ||
731 | * as possible, so no need to acquire psr.lock when it is | ||
732 | * not needed and will induce latencies in the atomic | ||
733 | * update path. | ||
734 | */ | ||
735 | if (dev_priv->psr.psr2_enabled) { | ||
736 | reg = EDP_PSR2_STATUS; | ||
737 | mask = EDP_PSR2_STATUS_STATE_MASK; | ||
738 | } else { | ||
739 | reg = EDP_PSR_STATUS; | ||
740 | mask = EDP_PSR_STATUS_STATE_MASK; | ||
741 | } | ||
742 | |||
743 | /* | ||
744 | * Max time for PSR to idle = Inverse of the refresh rate + | ||
745 | * 6 ms of exit training time + 1.5 ms of aux channel | ||
746 | * handshake. 50 msec is defesive enough to cover everything. | ||
747 | */ | ||
748 | return intel_wait_for_register(dev_priv, reg, mask, | ||
749 | EDP_PSR_STATUS_STATE_IDLE, 50); | ||
750 | } | ||
751 | |||
752 | static bool __psr_wait_for_idle_locked(struct drm_i915_private *dev_priv) | ||
721 | { | 753 | { |
722 | struct intel_dp *intel_dp; | 754 | struct intel_dp *intel_dp; |
723 | i915_reg_t reg; | 755 | i915_reg_t reg; |
@@ -763,7 +795,7 @@ static void intel_psr_work(struct work_struct *work) | |||
763 | * PSR might take some time to get fully disabled | 795 | * PSR might take some time to get fully disabled |
764 | * and be ready for re-enable. | 796 | * and be ready for re-enable. |
765 | */ | 797 | */ |
766 | if (!psr_wait_for_idle(dev_priv)) | 798 | if (!__psr_wait_for_idle_locked(dev_priv)) |
767 | goto unlock; | 799 | goto unlock; |
768 | 800 | ||
769 | /* | 801 | /* |