diff options
| -rw-r--r-- | drivers/gpu/drm/i915/intel_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 51 |
2 files changed, 21 insertions, 31 deletions
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index fa47285918f4..79fbaf78f604 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h | |||
| @@ -496,7 +496,6 @@ struct intel_crtc_scaler_state { | |||
| 496 | 496 | ||
| 497 | struct intel_pipe_wm { | 497 | struct intel_pipe_wm { |
| 498 | struct intel_wm_level wm[5]; | 498 | struct intel_wm_level wm[5]; |
| 499 | struct intel_wm_level raw_wm[5]; | ||
| 500 | uint32_t linetime; | 499 | uint32_t linetime; |
| 501 | bool fbc_wm_enabled; | 500 | bool fbc_wm_enabled; |
| 502 | bool pipe_enabled; | 501 | bool pipe_enabled; |
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; |
