aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c39
1 files changed, 15 insertions, 24 deletions
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 32ce9365d763..2f2ced7c6921 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -3494,30 +3494,14 @@ static uint32_t skl_wm_method1(uint32_t pixel_rate, uint8_t cpp, uint32_t latenc
3494} 3494}
3495 3495
3496static uint32_t skl_wm_method2(uint32_t pixel_rate, uint32_t pipe_htotal, 3496static uint32_t skl_wm_method2(uint32_t pixel_rate, uint32_t pipe_htotal,
3497 uint32_t horiz_pixels, uint8_t cpp, 3497 uint32_t latency, uint32_t plane_blocks_per_line)
3498 uint64_t tiling, uint32_t latency,
3499 uint32_t y_min_scanlines)
3500{ 3498{
3501 uint32_t ret; 3499 uint32_t ret;
3502 uint32_t plane_bytes_per_line, plane_blocks_per_line;
3503 uint32_t wm_intermediate_val; 3500 uint32_t wm_intermediate_val;
3504 3501
3505 if (latency == 0) 3502 if (latency == 0)
3506 return UINT_MAX; 3503 return UINT_MAX;
3507 3504
3508 plane_bytes_per_line = horiz_pixels * cpp;
3509
3510 if (tiling == I915_FORMAT_MOD_Y_TILED ||
3511 tiling == I915_FORMAT_MOD_Yf_TILED) {
3512 plane_bytes_per_line *= y_min_scanlines;
3513 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
3514 plane_blocks_per_line /= y_min_scanlines;
3515 } else if (tiling == DRM_FORMAT_MOD_NONE) {
3516 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512) + 1;
3517 } else {
3518 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
3519 }
3520
3521 wm_intermediate_val = latency * pixel_rate; 3505 wm_intermediate_val = latency * pixel_rate;
3522 ret = DIV_ROUND_UP(wm_intermediate_val, pipe_htotal * 1000) * 3506 ret = DIV_ROUND_UP(wm_intermediate_val, pipe_htotal * 1000) *
3523 plane_blocks_per_line; 3507 plane_blocks_per_line;
@@ -3606,17 +3590,24 @@ static int skl_compute_plane_wm(const struct drm_i915_private *dev_priv,
3606 y_min_scanlines = 4; 3590 y_min_scanlines = 4;
3607 } 3591 }
3608 3592
3593 plane_bytes_per_line = width * cpp;
3594 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3595 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {
3596 plane_blocks_per_line =
3597 DIV_ROUND_UP(plane_bytes_per_line * y_min_scanlines, 512);
3598 plane_blocks_per_line /= y_min_scanlines;
3599 } else if (fb->modifier[0] == DRM_FORMAT_MOD_NONE) {
3600 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512)
3601 + 1;
3602 } else {
3603 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
3604 }
3605
3609 method1 = skl_wm_method1(plane_pixel_rate, cpp, latency); 3606 method1 = skl_wm_method1(plane_pixel_rate, cpp, latency);
3610 method2 = skl_wm_method2(plane_pixel_rate, 3607 method2 = skl_wm_method2(plane_pixel_rate,
3611 cstate->base.adjusted_mode.crtc_htotal, 3608 cstate->base.adjusted_mode.crtc_htotal,
3612 width,
3613 cpp,
3614 fb->modifier[0],
3615 latency, 3609 latency,
3616 y_min_scanlines); 3610 plane_blocks_per_line);
3617
3618 plane_bytes_per_line = width * cpp;
3619 plane_blocks_per_line = DIV_ROUND_UP(plane_bytes_per_line, 512);
3620 3611
3621 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED || 3612 if (fb->modifier[0] == I915_FORMAT_MOD_Y_TILED ||
3622 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) { 3613 fb->modifier[0] == I915_FORMAT_MOD_Yf_TILED) {