aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c51
1 files changed, 21 insertions, 30 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 0a09f8ff6aff..cb950752c346 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2716,9 +2716,9 @@ static void ilk_compute_wm_level(const struct drm_i915_private *dev_priv,
2716 const struct intel_crtc *intel_crtc, 2716 const struct intel_crtc *intel_crtc,
2717 int level, 2717 int level,
2718 struct intel_crtc_state *cstate, 2718 struct intel_crtc_state *cstate,
2719 struct intel_plane_state *pristate, 2719 const struct intel_plane_state *pristate,
2720 struct intel_plane_state *sprstate, 2720 const struct intel_plane_state *sprstate,
2721 struct intel_plane_state *curstate, 2721 const struct intel_plane_state *curstate,
2722 struct intel_wm_level *result) 2722 struct intel_wm_level *result)
2723{ 2723{
2724 uint16_t pri_latency = dev_priv->wm.pri_latency[level]; 2724 uint16_t pri_latency = dev_priv->wm.pri_latency[level];
@@ -3038,28 +3038,24 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
3038 struct intel_pipe_wm *pipe_wm; 3038 struct intel_pipe_wm *pipe_wm;
3039 struct drm_device *dev = state->dev; 3039 struct drm_device *dev = state->dev;
3040 const struct drm_i915_private *dev_priv = to_i915(dev); 3040 const struct drm_i915_private *dev_priv = to_i915(dev);
3041 struct intel_plane *intel_plane; 3041 struct drm_plane *plane;
3042 struct intel_plane_state *pristate = NULL; 3042 const struct drm_plane_state *plane_state;
3043 struct intel_plane_state *sprstate = NULL; 3043 const struct intel_plane_state *pristate = NULL;
3044 struct intel_plane_state *curstate = NULL; 3044 const struct intel_plane_state *sprstate = NULL;
3045 const struct intel_plane_state *curstate = NULL;
3045 int level, max_level = ilk_wm_max_level(dev_priv), usable_level; 3046 int level, max_level = ilk_wm_max_level(dev_priv), usable_level;
3046 struct ilk_wm_maximums max; 3047 struct ilk_wm_maximums max;
3047 3048
3048 pipe_wm = &cstate->wm.ilk.optimal; 3049 pipe_wm = &cstate->wm.ilk.optimal;
3049 3050
3050 for_each_intel_plane_on_crtc(dev, intel_crtc, intel_plane) { 3051 drm_atomic_crtc_state_for_each_plane_state(plane, plane_state, &cstate->base) {
3051 struct intel_plane_state *ps; 3052 const struct intel_plane_state *ps = to_intel_plane_state(plane_state);
3052
3053 ps = intel_atomic_get_existing_plane_state(state,
3054 intel_plane);
3055 if (!ps)
3056 continue;
3057 3053
3058 if (intel_plane->base.type == DRM_PLANE_TYPE_PRIMARY) 3054 if (plane->type == DRM_PLANE_TYPE_PRIMARY)
3059 pristate = ps; 3055 pristate = ps;
3060 else if (intel_plane->base.type == DRM_PLANE_TYPE_OVERLAY) 3056 else if (plane->type == DRM_PLANE_TYPE_OVERLAY)
3061 sprstate = ps; 3057 sprstate = ps;
3062 else if (intel_plane->base.type == DRM_PLANE_TYPE_CURSOR) 3058 else if (plane->type == DRM_PLANE_TYPE_CURSOR)
3063 curstate = ps; 3059 curstate = ps;
3064 } 3060 }
3065 3061
@@ -3081,11 +3077,9 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
3081 if (pipe_wm->sprites_scaled) 3077 if (pipe_wm->sprites_scaled)
3082 usable_level = 0; 3078 usable_level = 0;
3083 3079
3084 ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate,
3085 pristate, sprstate, curstate, &pipe_wm->raw_wm[0]);
3086
3087 memset(&pipe_wm->wm, 0, sizeof(pipe_wm->wm)); 3080 memset(&pipe_wm->wm, 0, sizeof(pipe_wm->wm));
3088 pipe_wm->wm[0] = pipe_wm->raw_wm[0]; 3081 ilk_compute_wm_level(dev_priv, intel_crtc, 0, cstate,
3082 pristate, sprstate, curstate, &pipe_wm->wm[0]);
3089 3083
3090 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) 3084 if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv))
3091 pipe_wm->linetime = hsw_compute_linetime_wm(cstate); 3085 pipe_wm->linetime = hsw_compute_linetime_wm(cstate);
@@ -3095,8 +3089,8 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
3095 3089
3096 ilk_compute_wm_reg_maximums(dev_priv, 1, &max); 3090 ilk_compute_wm_reg_maximums(dev_priv, 1, &max);
3097 3091
3098 for (level = 1; level <= max_level; level++) { 3092 for (level = 1; level <= usable_level; level++) {
3099 struct intel_wm_level *wm = &pipe_wm->raw_wm[level]; 3093 struct intel_wm_level *wm = &pipe_wm->wm[level];
3100 3094
3101 ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate, 3095 ilk_compute_wm_level(dev_priv, intel_crtc, level, cstate,
3102 pristate, sprstate, curstate, wm); 3096 pristate, sprstate, curstate, wm);
@@ -3106,13 +3100,10 @@ static int ilk_compute_pipe_wm(struct intel_crtc_state *cstate)
3106 * register maximums since such watermarks are 3100 * register maximums since such watermarks are
3107 * always invalid. 3101 * always invalid.
3108 */ 3102 */
3109 if (level > usable_level) 3103 if (!ilk_validate_wm_level(level, &max, wm)) {
3110 continue; 3104 memset(wm, 0, sizeof(*wm));
3111 3105 break;
3112 if (ilk_validate_wm_level(level, &max, wm)) 3106 }
3113 pipe_wm->wm[level] = *wm;
3114 else
3115 usable_level = level;
3116 } 3107 }
3117 3108
3118 return 0; 3109 return 0;