diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 51 |
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; |