aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_pm.c
diff options
context:
space:
mode:
authorVille Syrjälä <ville.syrjala@linux.intel.com>2013-08-01 09:18:51 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-08-05 13:04:15 -0400
commit5b77da33c11b72d703382a93c402544186c7721e (patch)
tree49abc651fd372b811e6a36cc6540d987dacc8d50 /drivers/gpu/drm/i915/intel_pm.c
parent53615a5e129534fa161e882fc3c1c4f269166b76 (diff)
drm/i915: Use the stored cursor and plane latencies properly
Rather than pass around the plane latencies, just grab them from dev_priv nearer to where they're needed. Do the same for cursor latencies. v2: Add some comments about latency units Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_pm.c')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c36
1 files changed, 21 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 87db1f064fc4..936c1628075a 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -2270,7 +2270,8 @@ static uint32_t ilk_compute_fbc_wm(struct hsw_pipe_wm_parameters *params,
2270 params->pri_bytes_per_pixel); 2270 params->pri_bytes_per_pixel);
2271} 2271}
2272 2272
2273static bool hsw_compute_lp_wm(uint32_t mem_value, struct hsw_wm_maximums *max, 2273static bool hsw_compute_lp_wm(struct drm_i915_private *dev_priv,
2274 int level, struct hsw_wm_maximums *max,
2274 struct hsw_pipe_wm_parameters *params, 2275 struct hsw_pipe_wm_parameters *params,
2275 struct hsw_lp_wm_result *result) 2276 struct hsw_lp_wm_result *result)
2276{ 2277{
@@ -2279,10 +2280,14 @@ static bool hsw_compute_lp_wm(uint32_t mem_value, struct hsw_wm_maximums *max,
2279 2280
2280 for (pipe = PIPE_A; pipe <= PIPE_C; pipe++) { 2281 for (pipe = PIPE_A; pipe <= PIPE_C; pipe++) {
2281 struct hsw_pipe_wm_parameters *p = &params[pipe]; 2282 struct hsw_pipe_wm_parameters *p = &params[pipe];
2282 2283 /* WM1+ latency values stored in 0.5us units */
2283 pri_val[pipe] = ilk_compute_pri_wm(p, mem_value, true); 2284 uint16_t pri_latency = dev_priv->wm.pri_latency[level] * 5;
2284 spr_val[pipe] = ilk_compute_spr_wm(p, mem_value); 2285 uint16_t spr_latency = dev_priv->wm.spr_latency[level] * 5;
2285 cur_val[pipe] = ilk_compute_cur_wm(p, mem_value); 2286 uint16_t cur_latency = dev_priv->wm.cur_latency[level] * 5;
2287
2288 pri_val[pipe] = ilk_compute_pri_wm(p, pri_latency, true);
2289 spr_val[pipe] = ilk_compute_spr_wm(p, spr_latency);
2290 cur_val[pipe] = ilk_compute_cur_wm(p, cur_latency);
2286 fbc_val[pipe] = ilk_compute_fbc_wm(p, pri_val[pipe]); 2291 fbc_val[pipe] = ilk_compute_fbc_wm(p, pri_val[pipe]);
2287 } 2292 }
2288 2293
@@ -2305,14 +2310,18 @@ static bool hsw_compute_lp_wm(uint32_t mem_value, struct hsw_wm_maximums *max,
2305} 2310}
2306 2311
2307static uint32_t hsw_compute_wm_pipe(struct drm_i915_private *dev_priv, 2312static uint32_t hsw_compute_wm_pipe(struct drm_i915_private *dev_priv,
2308 uint32_t mem_value, enum pipe pipe, 2313 enum pipe pipe,
2309 struct hsw_pipe_wm_parameters *params) 2314 struct hsw_pipe_wm_parameters *params)
2310{ 2315{
2311 uint32_t pri_val, cur_val, spr_val; 2316 uint32_t pri_val, cur_val, spr_val;
2317 /* WM0 latency values stored in 0.1us units */
2318 uint16_t pri_latency = dev_priv->wm.pri_latency[0];
2319 uint16_t spr_latency = dev_priv->wm.spr_latency[0];
2320 uint16_t cur_latency = dev_priv->wm.cur_latency[0];
2312 2321
2313 pri_val = ilk_compute_pri_wm(params, mem_value, false); 2322 pri_val = ilk_compute_pri_wm(params, pri_latency, false);
2314 spr_val = ilk_compute_spr_wm(params, mem_value); 2323 spr_val = ilk_compute_spr_wm(params, spr_latency);
2315 cur_val = ilk_compute_cur_wm(params, mem_value); 2324 cur_val = ilk_compute_cur_wm(params, cur_latency);
2316 2325
2317 WARN(pri_val > 127, 2326 WARN(pri_val > 127,
2318 "Primary WM error, mode not supported for pipe %c\n", 2327 "Primary WM error, mode not supported for pipe %c\n",
@@ -2478,7 +2487,6 @@ static void hsw_compute_wm_parameters(struct drm_device *dev,
2478 2487
2479static void hsw_compute_wm_results(struct drm_device *dev, 2488static void hsw_compute_wm_results(struct drm_device *dev,
2480 struct hsw_pipe_wm_parameters *params, 2489 struct hsw_pipe_wm_parameters *params,
2481 uint16_t *wm,
2482 struct hsw_wm_maximums *lp_maximums, 2490 struct hsw_wm_maximums *lp_maximums,
2483 struct hsw_wm_values *results) 2491 struct hsw_wm_values *results)
2484{ 2492{
@@ -2489,7 +2497,8 @@ static void hsw_compute_wm_results(struct drm_device *dev,
2489 int level, max_level, wm_lp; 2497 int level, max_level, wm_lp;
2490 2498
2491 for (level = 1; level <= 4; level++) 2499 for (level = 1; level <= 4; level++)
2492 if (!hsw_compute_lp_wm(wm[level] * 5, lp_maximums, params, 2500 if (!hsw_compute_lp_wm(dev_priv, level,
2501 lp_maximums, params,
2493 &lp_results[level - 1])) 2502 &lp_results[level - 1]))
2494 break; 2503 break;
2495 max_level = level - 1; 2504 max_level = level - 1;
@@ -2521,8 +2530,7 @@ static void hsw_compute_wm_results(struct drm_device *dev,
2521 } 2530 }
2522 2531
2523 for_each_pipe(pipe) 2532 for_each_pipe(pipe)
2524 results->wm_pipe[pipe] = hsw_compute_wm_pipe(dev_priv, wm[0], 2533 results->wm_pipe[pipe] = hsw_compute_wm_pipe(dev_priv, pipe,
2525 pipe,
2526 &params[pipe]); 2534 &params[pipe]);
2527 2535
2528 for_each_pipe(pipe) { 2536 for_each_pipe(pipe) {
@@ -2665,11 +2673,9 @@ static void haswell_update_wm(struct drm_device *dev)
2665 hsw_compute_wm_parameters(dev, params, &lp_max_1_2, &lp_max_5_6); 2673 hsw_compute_wm_parameters(dev, params, &lp_max_1_2, &lp_max_5_6);
2666 2674
2667 hsw_compute_wm_results(dev, params, 2675 hsw_compute_wm_results(dev, params,
2668 dev_priv->wm.pri_latency,
2669 &lp_max_1_2, &results_1_2); 2676 &lp_max_1_2, &results_1_2);
2670 if (lp_max_1_2.pri != lp_max_5_6.pri) { 2677 if (lp_max_1_2.pri != lp_max_5_6.pri) {
2671 hsw_compute_wm_results(dev, params, 2678 hsw_compute_wm_results(dev, params,
2672 dev_priv->wm.pri_latency,
2673 &lp_max_5_6, &results_5_6); 2679 &lp_max_5_6, &results_5_6);
2674 best_results = hsw_find_best_result(&results_1_2, &results_5_6); 2680 best_results = hsw_find_best_result(&results_1_2, &results_5_6);
2675 } else { 2681 } else {