diff options
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 8c69ec9eb6ee..f904bf73dbd6 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -2026,16 +2026,27 @@ static void vlv_atomic_update_fifo(struct intel_atomic_state *state, | |||
2026 | 2026 | ||
2027 | static int vlv_compute_intermediate_wm(struct drm_device *dev, | 2027 | static int vlv_compute_intermediate_wm(struct drm_device *dev, |
2028 | struct intel_crtc *crtc, | 2028 | struct intel_crtc *crtc, |
2029 | struct intel_crtc_state *crtc_state) | 2029 | struct intel_crtc_state *new_crtc_state) |
2030 | { | 2030 | { |
2031 | struct vlv_wm_state *intermediate = &crtc_state->wm.vlv.intermediate; | 2031 | struct vlv_wm_state *intermediate = &new_crtc_state->wm.vlv.intermediate; |
2032 | const struct vlv_wm_state *optimal = &crtc_state->wm.vlv.optimal; | 2032 | const struct vlv_wm_state *optimal = &new_crtc_state->wm.vlv.optimal; |
2033 | const struct vlv_wm_state *active = &crtc->wm.active.vlv; | 2033 | struct intel_atomic_state *intel_state = |
2034 | to_intel_atomic_state(new_crtc_state->base.state); | ||
2035 | const struct intel_crtc_state *old_crtc_state = | ||
2036 | intel_atomic_get_old_crtc_state(intel_state, crtc); | ||
2037 | const struct vlv_wm_state *active = &old_crtc_state->wm.vlv.optimal; | ||
2034 | int level; | 2038 | int level; |
2035 | 2039 | ||
2040 | if (!new_crtc_state->base.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->base)) { | ||
2041 | *intermediate = *optimal; | ||
2042 | |||
2043 | intermediate->cxsr = false; | ||
2044 | goto out; | ||
2045 | } | ||
2046 | |||
2036 | intermediate->num_levels = min(optimal->num_levels, active->num_levels); | 2047 | intermediate->num_levels = min(optimal->num_levels, active->num_levels); |
2037 | intermediate->cxsr = optimal->cxsr && active->cxsr && | 2048 | intermediate->cxsr = optimal->cxsr && active->cxsr && |
2038 | !crtc_state->disable_cxsr; | 2049 | !new_crtc_state->disable_cxsr; |
2039 | 2050 | ||
2040 | for (level = 0; level < intermediate->num_levels; level++) { | 2051 | for (level = 0; level < intermediate->num_levels; level++) { |
2041 | enum plane_id plane_id; | 2052 | enum plane_id plane_id; |
@@ -2054,12 +2065,13 @@ static int vlv_compute_intermediate_wm(struct drm_device *dev, | |||
2054 | 2065 | ||
2055 | vlv_invalidate_wms(crtc, intermediate, level); | 2066 | vlv_invalidate_wms(crtc, intermediate, level); |
2056 | 2067 | ||
2068 | out: | ||
2057 | /* | 2069 | /* |
2058 | * If our intermediate WM are identical to the final WM, then we can | 2070 | * If our intermediate WM are identical to the final WM, then we can |
2059 | * omit the post-vblank programming; only update if it's different. | 2071 | * omit the post-vblank programming; only update if it's different. |
2060 | */ | 2072 | */ |
2061 | if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0) | 2073 | if (memcmp(intermediate, optimal, sizeof(*intermediate)) != 0) |
2062 | crtc_state->wm.need_postvbl_update = true; | 2074 | new_crtc_state->wm.need_postvbl_update = true; |
2063 | 2075 | ||
2064 | return 0; | 2076 | return 0; |
2065 | } | 2077 | } |