diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-08-01 09:18:51 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-08-05 13:04:15 -0400 |
commit | 5b77da33c11b72d703382a93c402544186c7721e (patch) | |
tree | 49abc651fd372b811e6a36cc6540d987dacc8d50 /drivers/gpu/drm/i915/intel_pm.c | |
parent | 53615a5e129534fa161e882fc3c1c4f269166b76 (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.c | 36 |
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 | ||
2273 | static bool hsw_compute_lp_wm(uint32_t mem_value, struct hsw_wm_maximums *max, | 2273 | static 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 = ¶ms[pipe]; | 2282 | struct hsw_pipe_wm_parameters *p = ¶ms[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 | ||
2307 | static uint32_t hsw_compute_wm_pipe(struct drm_i915_private *dev_priv, | 2312 | static 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 | ||
2479 | static void hsw_compute_wm_results(struct drm_device *dev, | 2488 | static 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 | ¶ms[pipe]); | 2534 | ¶ms[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 { |