diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 66f142bcbee47..41cfb2624cdc0 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c @@ -3374,14 +3374,18 @@ skl_compute_linetime_wm(struct drm_crtc *crtc, struct skl_pipe_wm_parameters *p) static void skl_compute_transition_wm(struct drm_crtc *crtc, struct skl_pipe_wm_parameters *params, - struct skl_pipe_wm *pipe_wm) + struct skl_wm_level *trans_wm /* out */) { - /* - * For now it is suggested to use the LP0 wm val of corresponding - * plane as transition wm val. - */ + struct intel_crtc *intel_crtc = to_intel_crtc(crtc); + int i; + if (!params->active) return; + + /* Until we know more, just disable transition WMs */ + for (i = 0; i < intel_num_planes(intel_crtc); i++) + trans_wm->plane_en[i] = false; + trans_wm->cursor_en = false; } static void skl_compute_pipe_wm(struct drm_crtc *crtc, @@ -3401,7 +3405,7 @@ static void skl_compute_pipe_wm(struct drm_crtc *crtc, } pipe_wm->linetime = skl_compute_linetime_wm(crtc, params); - skl_compute_transition_wm(crtc, params, pipe_wm); + skl_compute_transition_wm(crtc, params, &pipe_wm->trans_wm); } static void skl_compute_wm_results(struct drm_device *dev, @@ -3412,11 +3416,10 @@ static void skl_compute_wm_results(struct drm_device *dev, { int level, max_level = ilk_wm_max_level(dev); enum pipe pipe = intel_crtc->pipe; + uint32_t temp; + int i; for (level = 0; level <= max_level; level++) { - uint32_t temp; - int i; - for (i = 0; i < intel_num_planes(intel_crtc); i++) { temp = 0; @@ -3427,9 +3430,6 @@ static void skl_compute_wm_results(struct drm_device *dev, temp |= PLANE_WM_EN; r->plane[pipe][i][level] = temp; - /* Use the LP0 WM value for transition WM for now. */ - if (level == 0) - r->plane_trans[pipe][i] = temp; } temp = 0; @@ -3441,12 +3441,28 @@ static void skl_compute_wm_results(struct drm_device *dev, temp |= PLANE_WM_EN; r->cursor[pipe][level] = temp; - /* Use the LP0 WM value for transition WM for now. */ - if (level == 0) - r->cursor_trans[pipe] = temp; } + /* transition WMs */ + for (i = 0; i < intel_num_planes(intel_crtc); i++) { + temp = 0; + temp |= p_wm->trans_wm.plane_res_l[i] << PLANE_WM_LINES_SHIFT; + temp |= p_wm->trans_wm.plane_res_b[i]; + if (p_wm->trans_wm.plane_en[i]) + temp |= PLANE_WM_EN; + + r->plane_trans[pipe][i] = temp; + } + + temp = 0; + temp |= p_wm->trans_wm.cursor_res_l << PLANE_WM_LINES_SHIFT; + temp |= p_wm->trans_wm.cursor_res_b; + if (p_wm->trans_wm.cursor_en) + temp |= PLANE_WM_EN; + + r->cursor_trans[pipe] = temp; + r->wm_linetime[pipe] = p_wm->linetime; }