aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2016-09-22 17:00:33 -0400
committerJani Nikula <jani.nikula@intel.com>2016-10-10 09:06:39 -0400
commit73fed0ef8567f1e1cba079994353e60208ded964 (patch)
treee44f28476bdb75dc2c550eab25928758ca405752 /drivers/gpu
parentcf6c525a31fac11b0775b8c06c00a508c6356d9b (diff)
drm/i915/gen9: fix the watermark res_blocks value
We forgot the "res_blocks += y_tile_minimum" that's described on step V of our documentation. Again, this should only affect the Y tiling cases. It looks like the relevant code was introduced in 0fda65680e92, but there's always the possibility that it matched our specification when it was introduced, and then the specification changed while the code stayed the same. So we can't really say this was a regression, but let's try to add a "Fixes" tag anyway to help backporting. v2: Try to add a "Fixes" tag (Maarten). Fixes: 0fda65680e92 ("drm/i915/skl: Update watermarks for Y tiling") Cc: stable@vger.kernel.org Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Lyude <cpaul@redhat.com> Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1474578035-424-8-git-send-email-paulo.r.zanoni@intel.com (cherry picked from commit 75676ed423a6acf9e2b1df52fbc036a51e11fb7a) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 2f2ced7c6921..f3d370a764a3 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3552,7 +3552,7 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3552 uint8_t cpp; 3552 uint8_t cpp;
3553 uint32_t width = 0, height = 0; 3553 uint32_t width = 0, height = 0;
3554 uint32_t plane_pixel_rate; 3554 uint32_t plane_pixel_rate;
3555 uint32_t y_min_scanlines; 3555 uint32_t y_tile_minimum, y_min_scanlines;
3556 3556
3557 if (latency == 0 || !cstate->base.active || !intel_pstate->base.visible) { 3557 if (latency == 0 || !cstate->base.active || !intel_pstate->base.visible) {
3558 *enabled = false; 3558 *enabled = false;
@@ -3609,10 +3609,10 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3609 latency, 3609 latency,
3610 plane_blocks_per_line); 3610 plane_blocks_per_line);
3611 3611
3612 y_tile_minimum = plane_blocks_per_line * y_min_scanlines;
3613
3612 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || 3614 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3613 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) { 3615 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
3614 uint32_t y_tile_minimum = plane_blocks_per_line *
3615 y_min_scanlines;
3616 selected_result = max(method2, y_tile_minimum); 3616 selected_result = max(method2, y_tile_minimum);
3617 } else { 3617 } else {
3618 if ((ddb_allocation / plane_blocks_per_line) >= 1) 3618 if ((ddb_allocation / plane_blocks_per_line) >= 1)
@@ -3626,10 +3626,12 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3626 3626
3627 if (level >= 1 && level <= 7) { 3627 if (level >= 1 && level <= 7) {
3628 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || 3628 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3629 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) 3629 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
3630 res_blocks += y_tile_minimum;
3630 res_lines += y_min_scanlines; 3631 res_lines += y_min_scanlines;
3631 else 3632 } else {
3632 res_blocks++; 3633 res_blocks++;
3634 }
3633 } 3635 }
3634 3636
3635 if (res_blocks >= ddb_allocation || res_lines > 31) { 3637 if (res_blocks >= ddb_allocation || res_lines > 31) {