From b7ba56ff00bd41838b91165f1e9681f9996f8eaa Mon Sep 17 00:00:00 2001 From: Veera Sundaram Sankaran Date: Wed, 18 Sep 2019 13:16:28 -0700 Subject: [PATCH] disp: msm: sde: fix inline rotator downscale ratio check During the validation of inline-rotator downscale ratio, in the plane atomic_check phase, the client_type is derived from the crtc->state. This leads to wrong client_type as in check phase, it has to be derived from the new crtc state. Fix it to derive from new crtc, which would in turn be used to get the correct inline-rotator downscale ratio. Change-Id: I109fc6fd81182b1cda1c4feefbf421d3fab433c7 Signed-off-by: Veera Sundaram Sankaran --- msm/sde/sde_core_perf.c | 10 +++++----- msm/sde/sde_crtc.c | 10 ++++++---- msm/sde/sde_crtc.h | 16 ++++++++++------ msm/sde/sde_plane.c | 12 ++++++++++-- 4 files changed, 31 insertions(+), 17 deletions(-) diff --git a/msm/sde/sde_core_perf.c b/msm/sde/sde_core_perf.c index 1cc8a66bad7b..3efd37746cce 100644 --- a/msm/sde/sde_core_perf.c +++ b/msm/sde/sde_core_perf.c @@ -456,7 +456,7 @@ static inline bool _sde_core_perf_is_wb(struct drm_crtc *crtc) { enum sde_intf_mode if_mode = INTF_MODE_NONE; - if_mode = sde_crtc_get_intf_mode(crtc); + if_mode = sde_crtc_get_intf_mode(crtc, crtc->state); if (if_mode == INTF_MODE_WB_BLOCK || if_mode == INTF_MODE_WB_LINE) return true; @@ -678,7 +678,7 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc) sde_cstate = to_sde_crtc_state(crtc->state); /* only do this for command mode rt client (non-rsc client) */ - if ((sde_crtc_get_intf_mode(crtc) != INTF_MODE_CMD) && + if ((sde_crtc_get_intf_mode(crtc, crtc->state) != INTF_MODE_CMD) && (sde_crtc_get_client_type(crtc) != RT_RSC_CLIENT)) return; @@ -686,11 +686,11 @@ void sde_core_perf_crtc_release_bw(struct drm_crtc *crtc) * If video interface present, cmd panel bandwidth cannot be * released. */ - if (sde_crtc_get_intf_mode(crtc) == INTF_MODE_CMD) + if (sde_crtc_get_intf_mode(crtc, crtc->state) == INTF_MODE_CMD) drm_for_each_crtc(tmp_crtc, crtc->dev) { if (_sde_core_perf_crtc_is_power_on(tmp_crtc) && - sde_crtc_get_intf_mode(tmp_crtc) == - INTF_MODE_VIDEO) + sde_crtc_get_intf_mode(tmp_crtc, + tmp_crtc->state) == INTF_MODE_VIDEO) return; } diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 91b68fa5f4f4..4602ae1a19df 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -2227,17 +2227,18 @@ end: spin_unlock_irqrestore(&dev->event_lock, flags); } -enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc) +enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc, + struct drm_crtc_state *cstate) { struct drm_encoder *encoder; - if (!crtc || !crtc->dev) { + if (!crtc || !crtc->dev || !cstate) { SDE_ERROR("invalid crtc\n"); return INTF_MODE_NONE; } drm_for_each_encoder_mask(encoder, crtc->dev, - crtc->state->encoder_mask) { + cstate->encoder_mask) { /* continue if copy encoder is encountered */ if (sde_encoder_in_clone_mode(encoder)) continue; @@ -5589,7 +5590,8 @@ static int sde_crtc_debugfs_state_show(struct seq_file *s, void *v) seq_printf(s, "num_connectors: %d\n", cstate->num_connectors); seq_printf(s, "client type: %d\n", sde_crtc_get_client_type(crtc)); - seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc)); + seq_printf(s, "intf_mode: %d\n", sde_crtc_get_intf_mode(crtc, + crtc->state)); seq_printf(s, "core_clk_rate: %llu\n", sde_crtc->cur_perf.core_clk_rate); for (i = SDE_POWER_HANDLE_DBUS_ID_MNOC; diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h index 3f2080a8afed..8b8e32ed9782 100644 --- a/msm/sde/sde_crtc.h +++ b/msm/sde/sde_crtc.h @@ -593,9 +593,11 @@ int sde_crtc_register_custom_event(struct sde_kms *kms, /** * sde_crtc_get_intf_mode - get interface mode of the given crtc - * @crtc: Pointert to crtc + * @crtc: Pointert to DRM crtc + * @crtc: Pointert to DRM crtc_state */ -enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc); +enum sde_intf_mode sde_crtc_get_intf_mode(struct drm_crtc *crtc, + struct drm_crtc_state *cstate); /** * sde_crtc_get_fps_mode - get frame rate of the given crtc @@ -621,14 +623,16 @@ static inline enum sde_crtc_client_type sde_crtc_get_client_type( /** * sde_crtc_is_rt_client - check if real-time client or not - * @crtc: Pointer to crtc + * @crtc: Pointer to DRM crtc + * @crtc_state: Pointer to DRM crtc_state */ -static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc) +static inline bool sde_crtc_is_rt_client(struct drm_crtc *crtc, + struct drm_crtc_state *cstate) { - if (!crtc || !crtc->state) + if (!crtc || !cstate) return true; - return (sde_crtc_get_intf_mode(crtc) != INTF_MODE_WB_LINE); + return (sde_crtc_get_intf_mode(crtc, cstate) != INTF_MODE_WB_LINE); } /** diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index ddd6746cae1c..e9c3a0cf8c8b 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -2406,6 +2406,12 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state, uint32_t max_upscale, max_linewidth; bool inline_rotation, rt_client; struct drm_crtc *crtc; + struct drm_crtc_state *new_cstate; + + if (!state || !state->state || !state->crtc) { + SDE_ERROR_PLANE(psde, "invalid arguments\n"); + return -EINVAL; + } deci_w = sde_plane_get_property(pstate, PLANE_PROP_H_DECIMATE); deci_h = sde_plane_get_property(pstate, PLANE_PROP_V_DECIMATE); @@ -2427,7 +2433,9 @@ static int _sde_atomic_check_decimation_scaler(struct drm_plane_state *state, max_linewidth = psde->pipe_sblk->maxlinewidth; crtc = state->crtc; - rt_client = sde_crtc_is_rt_client(crtc); + new_cstate = drm_atomic_get_new_crtc_state(state->state, crtc); + + rt_client = sde_crtc_is_rt_client(crtc, new_cstate); max_downscale_denom = 1; /* inline rotation RT clients have a different max downscaling limit */ @@ -3208,7 +3216,7 @@ static int sde_plane_sspp_atomic_update(struct drm_plane *plane, return 0; pstate->pending = true; - psde->is_rt_pipe = sde_crtc_is_rt_client(crtc); + psde->is_rt_pipe = sde_crtc_is_rt_client(crtc, crtc->state); _sde_plane_set_qos_ctrl(plane, false, SDE_PLANE_QOS_PANIC_CTRL); _sde_plane_update_properties(plane, crtc, fb);