aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
authorMatt Roper <matthew.d.roper@intel.com>2015-09-24 18:53:18 -0400
committerMatt Roper <matthew.d.roper@intel.com>2015-10-21 17:55:06 -0400
commitaa363136866caa636031284f13ea0f730c64fca9 (patch)
tree4a1fe17d59c9949f8f85172e0d0e5da2945b5570 /drivers/gpu/drm/i915/intel_display.c
parent19b8d3875e21f4f7e5c999350892f1a788f4e977 (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.c52
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 */
13058static 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)
13058static int intel_atomic_check(struct drm_device *dev, 13097static 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);