diff options
author | Matt Roper <matthew.d.roper@intel.com> | 2015-09-24 18:53:18 -0400 |
---|---|---|
committer | Matt Roper <matthew.d.roper@intel.com> | 2015-10-21 17:55:06 -0400 |
commit | aa363136866caa636031284f13ea0f730c64fca9 (patch) | |
tree | 4a1fe17d59c9949f8f85172e0d0e5da2945b5570 /drivers/gpu/drm/i915/intel_display.c | |
parent | 19b8d3875e21f4f7e5c999350892f1a788f4e977 (diff) |
drm/i915: Calculate watermark configuration during atomic check (v2)
v2: Don't forget to actually check the cstate->active value when
tallying up the number of active CRTC's. (Ander)
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Smoke-tested-by: Paulo Zanoni <przanoni@gmail.com>
Link: http://patchwork.freedesktop.org/patch/59561/
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 3874b3563e63..9d9e0e864b66 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -13050,6 +13050,45 @@ static int intel_modeset_checks(struct drm_atomic_state *state) | |||
13050 | return 0; | 13050 | return 0; |
13051 | } | 13051 | } |
13052 | 13052 | ||
13053 | /* | ||
13054 | * Handle calculation of various watermark data at the end of the atomic check | ||
13055 | * phase. The code here should be run after the per-crtc and per-plane 'check' | ||
13056 | * handlers to ensure that all derived state has been updated. | ||
13057 | */ | ||
13058 | static void calc_watermark_data(struct drm_atomic_state *state) | ||
13059 | { | ||
13060 | struct drm_device *dev = state->dev; | ||
13061 | struct intel_atomic_state *intel_state = to_intel_atomic_state(state); | ||
13062 | struct drm_crtc *crtc; | ||
13063 | struct drm_crtc_state *cstate; | ||
13064 | struct drm_plane *plane; | ||
13065 | struct drm_plane_state *pstate; | ||
13066 | |||
13067 | /* | ||
13068 | * Calculate watermark configuration details now that derived | ||
13069 | * plane/crtc state is all properly updated. | ||
13070 | */ | ||
13071 | drm_for_each_crtc(crtc, dev) { | ||
13072 | cstate = drm_atomic_get_existing_crtc_state(state, crtc) ?: | ||
13073 | crtc->state; | ||
13074 | |||
13075 | if (cstate->active) | ||
13076 | intel_state->wm_config.num_pipes_active++; | ||
13077 | } | ||
13078 | drm_for_each_legacy_plane(plane, dev) { | ||
13079 | pstate = drm_atomic_get_existing_plane_state(state, plane) ?: | ||
13080 | plane->state; | ||
13081 | |||
13082 | if (!to_intel_plane_state(pstate)->visible) | ||
13083 | continue; | ||
13084 | |||
13085 | intel_state->wm_config.sprites_enabled = true; | ||
13086 | if (pstate->crtc_w != pstate->src_w >> 16 || | ||
13087 | pstate->crtc_h != pstate->src_h >> 16) | ||
13088 | intel_state->wm_config.sprites_scaled = true; | ||
13089 | } | ||
13090 | } | ||
13091 | |||
13053 | /** | 13092 | /** |
13054 | * intel_atomic_check - validate state object | 13093 | * intel_atomic_check - validate state object |
13055 | * @dev: drm device | 13094 | * @dev: drm device |
@@ -13058,6 +13097,7 @@ static int intel_modeset_checks(struct drm_atomic_state *state) | |||
13058 | static int intel_atomic_check(struct drm_device *dev, | 13097 | static int intel_atomic_check(struct drm_device *dev, |
13059 | struct drm_atomic_state *state) | 13098 | struct drm_atomic_state *state) |
13060 | { | 13099 | { |
13100 | struct intel_atomic_state *intel_state = to_intel_atomic_state(state); | ||
13061 | struct drm_crtc *crtc; | 13101 | struct drm_crtc *crtc; |
13062 | struct drm_crtc_state *crtc_state; | 13102 | struct drm_crtc_state *crtc_state; |
13063 | int ret, i; | 13103 | int ret, i; |
@@ -13121,10 +13161,15 @@ static int intel_atomic_check(struct drm_device *dev, | |||
13121 | if (ret) | 13161 | if (ret) |
13122 | return ret; | 13162 | return ret; |
13123 | } else | 13163 | } else |
13124 | to_intel_atomic_state(state)->cdclk = | 13164 | intel_state->cdclk = to_i915(state->dev)->cdclk_freq; |
13125 | to_i915(state->dev)->cdclk_freq; | ||
13126 | 13165 | ||
13127 | return drm_atomic_helper_check_planes(state->dev, state); | 13166 | ret = drm_atomic_helper_check_planes(state->dev, state); |
13167 | if (ret) | ||
13168 | return ret; | ||
13169 | |||
13170 | calc_watermark_data(state); | ||
13171 | |||
13172 | return 0; | ||
13128 | } | 13173 | } |
13129 | 13174 | ||
13130 | /** | 13175 | /** |
@@ -13164,6 +13209,7 @@ static int intel_atomic_commit(struct drm_device *dev, | |||
13164 | return ret; | 13209 | return ret; |
13165 | 13210 | ||
13166 | drm_atomic_helper_swap_state(dev, state); | 13211 | drm_atomic_helper_swap_state(dev, state); |
13212 | dev_priv->wm.config = to_intel_atomic_state(state)->wm_config; | ||
13167 | 13213 | ||
13168 | for_each_crtc_in_state(state, crtc, crtc_state, i) { | 13214 | for_each_crtc_in_state(state, crtc, crtc_state, i) { |
13169 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 13215 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |