disp: msm: sde: trigger tx_wait if panel resolution switch

Trigger tx_wait if command mode panel resolution
switches during mode switch to avoid early single buffer
tear check programming.

Change-Id: Ib747df8250c714248a44b596c2c8aeef006ea4fc
Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
This commit is contained in:
Dhaval Patel
2021-10-01 14:15:53 -07:00
parent 5f5c61faa0
commit b696aa3b24

View File

@@ -2439,17 +2439,33 @@ static void _sde_encoder_virt_populate_hw_res(struct drm_encoder *drm_enc)
} }
static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc, static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc,
struct msm_display_mode *msm_mode, bool pre_modeset) struct drm_display_mode *adj_mode, struct msm_display_mode *msm_mode, bool pre_modeset)
{ {
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc); struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
enum sde_intf_mode intf_mode; enum sde_intf_mode intf_mode;
struct drm_display_mode *old_adj_mode = NULL;
int ret; int ret;
bool is_cmd_mode = false; bool is_cmd_mode = false, res_switch = false;
if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE)) if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
is_cmd_mode = true; is_cmd_mode = true;
if (pre_modeset) { if (pre_modeset) {
if (sde_enc->cur_master)
old_adj_mode = &sde_enc->cur_master->cached_mode;
if (old_adj_mode && is_cmd_mode)
res_switch = !drm_mode_match(old_adj_mode, adj_mode, DRM_MODE_MATCH_TIMINGS);
if (res_switch) {
/* avoid early tear check reconfigure for resolution switch */
ret = sde_encoder_wait_for_event(drm_enc, MSM_ENC_TX_COMPLETE);
if (ret && ret != -EWOULDBLOCK) {
SDE_ERROR_ENC(sde_enc, "wait for idle failed %d\n", ret);
SDE_EVT32(DRMID(drm_enc), ret, SDE_EVTLOG_ERROR);
return ret;
}
}
intf_mode = sde_encoder_get_intf_mode(drm_enc); intf_mode = sde_encoder_get_intf_mode(drm_enc);
if (msm_is_mode_seamless_dms(msm_mode) || if (msm_is_mode_seamless_dms(msm_mode) ||
(msm_is_mode_seamless_dyn_clk(msm_mode) && (msm_is_mode_seamless_dyn_clk(msm_mode) &&
@@ -2554,7 +2570,7 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
/* release resources before seamless mode change */ /* release resources before seamless mode change */
msm_mode = &c_state->msm_mode; msm_mode = &c_state->msm_mode;
ret = sde_encoder_virt_modeset_rc(drm_enc, msm_mode, true); ret = sde_encoder_virt_modeset_rc(drm_enc, adj_mode, msm_mode, true);
if (ret) if (ret)
return; return;
@@ -2593,7 +2609,7 @@ static void sde_encoder_virt_mode_set(struct drm_encoder *drm_enc,
} }
/* update resources after seamless mode change */ /* update resources after seamless mode change */
sde_encoder_virt_modeset_rc(drm_enc, msm_mode, false); sde_encoder_virt_modeset_rc(drm_enc, adj_mode, msm_mode, false);
} }
void sde_encoder_control_te(struct drm_encoder *drm_enc, bool enable) void sde_encoder_control_te(struct drm_encoder *drm_enc, bool enable)