Merge "disp: msm: update POMS detection logic"

This commit is contained in:
qctecmdr
2020-09-20 19:01:21 -07:00
committed by Gerrit - the friendly Code Review server
2 changed files with 23 additions and 11 deletions

View File

@@ -4931,10 +4931,8 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
} }
SDE_EVT32(mode->dsi_mode_flags, mode->panel_mode); SDE_EVT32(mode->dsi_mode_flags, mode->panel_mode);
if (mode->dsi_mode_flags & DSI_MODE_FLAG_POMS) {
display->config.panel_mode = mode->panel_mode; display->panel->panel_mode = mode->panel_mode;
display->panel->panel_mode = mode->panel_mode;
}
rc = dsi_panel_get_host_cfg_for_mode(display->panel, rc = dsi_panel_get_host_cfg_for_mode(display->panel,
mode, mode,
&display->config); &display->config);

View File

@@ -2065,17 +2065,17 @@ static void sde_encoder_virt_mode_switch(struct drm_encoder *drm_enc,
if (intf_mode == INTF_MODE_CMD) { if (intf_mode == INTF_MODE_CMD) {
for (i = 0; i < sde_enc->num_phys_encs; i++) for (i = 0; i < sde_enc->num_phys_encs; i++)
sde_enc->phys_encs[i] = sde_enc->phys_vid_encs[i]; sde_enc->phys_encs[i] = sde_enc->phys_vid_encs[i];
SDE_DEBUG_ENC(sde_enc, "switch to video physical encoder\n"); SDE_DEBUG_ENC(sde_enc, "switch to video physical encoder\n");
SDE_EVT32(DRMID(&sde_enc->base), intf_mode, SDE_EVT32(DRMID(&sde_enc->base), intf_mode, adj_mode->flags,
msm_is_mode_seamless_poms(adj_mode), adj_mode->private_flags, SDE_EVTLOG_FUNC_CASE1);
SDE_EVTLOG_FUNC_CASE1);
} else if (intf_mode == INTF_MODE_VIDEO) { } else if (intf_mode == INTF_MODE_VIDEO) {
for (i = 0; i < sde_enc->num_phys_encs; i++) for (i = 0; i < sde_enc->num_phys_encs; i++)
sde_enc->phys_encs[i] = sde_enc->phys_cmd_encs[i]; sde_enc->phys_encs[i] = sde_enc->phys_cmd_encs[i];
SDE_EVT32(DRMID(&sde_enc->base), intf_mode,
msm_is_mode_seamless_poms(adj_mode),
SDE_EVTLOG_FUNC_CASE2);
SDE_DEBUG_ENC(sde_enc, "switch to command physical encoder\n"); SDE_DEBUG_ENC(sde_enc, "switch to command physical encoder\n");
SDE_EVT32(DRMID(&sde_enc->base), intf_mode, adj_mode->flags,
adj_mode->private_flags, SDE_EVTLOG_FUNC_CASE2);
} }
} }
@@ -2168,6 +2168,19 @@ static void _sde_encoder_virt_populate_hw_res(struct drm_encoder *drm_enc)
} }
} }
static bool sde_encoder_detect_panel_mode_switch(
struct drm_display_mode *adj_mode, enum sde_intf_mode intf_mode)
{
/* don't rely on POMS flag as it may not be set for power-on modeset */
if ((intf_mode == INTF_MODE_CMD &&
adj_mode->flags & DRM_MODE_FLAG_VID_MODE_PANEL) ||
(intf_mode == INTF_MODE_VIDEO &&
adj_mode->flags & DRM_MODE_FLAG_CMD_MODE_PANEL))
return true;
return false;
}
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 drm_display_mode *adj_mode, bool pre_modeset) struct drm_display_mode *adj_mode, bool pre_modeset)
{ {
@@ -2199,7 +2212,8 @@ static int sde_encoder_virt_modeset_rc(struct drm_encoder *drm_enc,
* modeset to guarantee previous kickoff has finished. * modeset to guarantee previous kickoff has finished.
*/ */
sde_encoder_dce_disable(sde_enc); sde_encoder_dce_disable(sde_enc);
} else if (msm_is_mode_seamless_poms(adj_mode)) { } else if (sde_encoder_detect_panel_mode_switch(adj_mode,
intf_mode)) {
_sde_encoder_modeset_helper_locked(drm_enc, _sde_encoder_modeset_helper_locked(drm_enc,
SDE_ENC_RC_EVENT_PRE_MODESET); SDE_ENC_RC_EVENT_PRE_MODESET);
sde_encoder_virt_mode_switch(drm_enc, intf_mode, sde_encoder_virt_mode_switch(drm_enc, intf_mode,