diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2013-11-03 00:07:46 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-11-08 12:09:59 -0500 |
commit | 416f4727abf9e5ecc88fea4b55ea294d310534ac (patch) | |
tree | 1add8447458d00e7567b7c005b430655e3841845 | |
parent | 77d8d00944dd5a0a2f4f67809819df927ee23030 (diff) |
drm/i915/bdw: Add Broadwell display FIFO limits
Broadwell has bigger display FIFOs than Haswell. Otherwise the
two are very similar.
v2: Fix FBC WM_LP shift for BDW
v3: Rebase on top of the big Haswell wm rework.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> (v2)
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r-- | drivers/gpu/drm/i915/i915_reg.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_pm.c | 33 |
2 files changed, 25 insertions, 9 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index ad903b927fb8..b2abdd78fdef 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -3379,6 +3379,7 @@ | |||
3379 | #define WM1_LP_LATENCY_MASK (0x7f<<24) | 3379 | #define WM1_LP_LATENCY_MASK (0x7f<<24) |
3380 | #define WM1_LP_FBC_MASK (0xf<<20) | 3380 | #define WM1_LP_FBC_MASK (0xf<<20) |
3381 | #define WM1_LP_FBC_SHIFT 20 | 3381 | #define WM1_LP_FBC_SHIFT 20 |
3382 | #define WM1_LP_FBC_SHIFT_BDW 19 | ||
3382 | #define WM1_LP_SR_MASK (0x7ff<<8) | 3383 | #define WM1_LP_SR_MASK (0x7ff<<8) |
3383 | #define WM1_LP_SR_SHIFT 8 | 3384 | #define WM1_LP_SR_SHIFT 8 |
3384 | #define WM1_LP_CURSOR_MASK (0xff) | 3385 | #define WM1_LP_CURSOR_MASK (0xff) |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index b05f141a5a0e..0ca8eb765e2f 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
@@ -2291,7 +2291,9 @@ static uint32_t ilk_compute_fbc_wm(const struct hsw_pipe_wm_parameters *params, | |||
2291 | 2291 | ||
2292 | static unsigned int ilk_display_fifo_size(const struct drm_device *dev) | 2292 | static unsigned int ilk_display_fifo_size(const struct drm_device *dev) |
2293 | { | 2293 | { |
2294 | if (INTEL_INFO(dev)->gen >= 7) | 2294 | if (INTEL_INFO(dev)->gen >= 8) |
2295 | return 3072; | ||
2296 | else if (INTEL_INFO(dev)->gen >= 7) | ||
2295 | return 768; | 2297 | return 768; |
2296 | else | 2298 | else |
2297 | return 512; | 2299 | return 512; |
@@ -2336,7 +2338,9 @@ static unsigned int ilk_plane_wm_max(const struct drm_device *dev, | |||
2336 | } | 2338 | } |
2337 | 2339 | ||
2338 | /* clamp to max that the registers can hold */ | 2340 | /* clamp to max that the registers can hold */ |
2339 | if (INTEL_INFO(dev)->gen >= 7) | 2341 | if (INTEL_INFO(dev)->gen >= 8) |
2342 | max = level == 0 ? 255 : 2047; | ||
2343 | else if (INTEL_INFO(dev)->gen >= 7) | ||
2340 | /* IVB/HSW primary/sprite plane watermarks */ | 2344 | /* IVB/HSW primary/sprite plane watermarks */ |
2341 | max = level == 0 ? 127 : 1023; | 2345 | max = level == 0 ? 127 : 1023; |
2342 | else if (!is_sprite) | 2346 | else if (!is_sprite) |
@@ -2366,10 +2370,13 @@ static unsigned int ilk_cursor_wm_max(const struct drm_device *dev, | |||
2366 | } | 2370 | } |
2367 | 2371 | ||
2368 | /* Calculate the maximum FBC watermark */ | 2372 | /* Calculate the maximum FBC watermark */ |
2369 | static unsigned int ilk_fbc_wm_max(void) | 2373 | static unsigned int ilk_fbc_wm_max(struct drm_device *dev) |
2370 | { | 2374 | { |
2371 | /* max that registers can hold */ | 2375 | /* max that registers can hold */ |
2372 | return 15; | 2376 | if (INTEL_INFO(dev)->gen >= 8) |
2377 | return 31; | ||
2378 | else | ||
2379 | return 15; | ||
2373 | } | 2380 | } |
2374 | 2381 | ||
2375 | static void ilk_compute_wm_maximums(struct drm_device *dev, | 2382 | static void ilk_compute_wm_maximums(struct drm_device *dev, |
@@ -2381,7 +2388,7 @@ static void ilk_compute_wm_maximums(struct drm_device *dev, | |||
2381 | max->pri = ilk_plane_wm_max(dev, level, config, ddb_partitioning, false); | 2388 | max->pri = ilk_plane_wm_max(dev, level, config, ddb_partitioning, false); |
2382 | max->spr = ilk_plane_wm_max(dev, level, config, ddb_partitioning, true); | 2389 | max->spr = ilk_plane_wm_max(dev, level, config, ddb_partitioning, true); |
2383 | max->cur = ilk_cursor_wm_max(dev, level, config); | 2390 | max->cur = ilk_cursor_wm_max(dev, level, config); |
2384 | max->fbc = ilk_fbc_wm_max(); | 2391 | max->fbc = ilk_fbc_wm_max(dev); |
2385 | } | 2392 | } |
2386 | 2393 | ||
2387 | static bool ilk_validate_wm_level(int level, | 2394 | static bool ilk_validate_wm_level(int level, |
@@ -2722,10 +2729,18 @@ static void hsw_compute_wm_results(struct drm_device *dev, | |||
2722 | if (!r->enable) | 2729 | if (!r->enable) |
2723 | break; | 2730 | break; |
2724 | 2731 | ||
2725 | results->wm_lp[wm_lp - 1] = HSW_WM_LP_VAL(level * 2, | 2732 | results->wm_lp[wm_lp - 1] = WM3_LP_EN | |
2726 | r->fbc_val, | 2733 | ((level * 2) << WM1_LP_LATENCY_SHIFT) | |
2727 | r->pri_val, | 2734 | (r->pri_val << WM1_LP_SR_SHIFT) | |
2728 | r->cur_val); | 2735 | r->cur_val; |
2736 | |||
2737 | if (INTEL_INFO(dev)->gen >= 8) | ||
2738 | results->wm_lp[wm_lp - 1] |= | ||
2739 | r->fbc_val << WM1_LP_FBC_SHIFT_BDW; | ||
2740 | else | ||
2741 | results->wm_lp[wm_lp - 1] |= | ||
2742 | r->fbc_val << WM1_LP_FBC_SHIFT; | ||
2743 | |||
2729 | results->wm_lp_spr[wm_lp - 1] = r->spr_val; | 2744 | results->wm_lp_spr[wm_lp - 1] = r->spr_val; |
2730 | } | 2745 | } |
2731 | 2746 | ||