From 6a574a6e3cae27a3f837d8a2c5ae50f7dbcb753b Mon Sep 17 00:00:00 2001 From: Vara Reddy Date: Thu, 3 Oct 2019 09:29:20 -0700 Subject: [PATCH] drm/msm/dsi: add flag for mode switch with fps Change adds flag to identify dynamic mode switch with same resolution and different fps. Block sending PPS command if we hit this scenario, this optimizes mode switch time. Change-Id: If5c86084cde641952fe294b512e937cfd1bb5479 Signed-off-by: Vara Reddy --- msm/dsi/dsi_defs.h | 2 ++ msm/dsi/dsi_display.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index 8aed1670a1..fe932e3356 100644 --- a/msm/dsi/dsi_defs.h +++ b/msm/dsi/dsi_defs.h @@ -96,6 +96,7 @@ enum dsi_op_mode { * @DSI_MODE_FLAG_POMS: * Seamless transition is dynamic panel operating mode switch * @DSI_MODE_FLAG_DYN_CLK: Seamless transition is dynamic clock change + * @DSI_MODE_FLAG_DMS_FPS: Seamless fps only transition in Dynamic Mode Switch */ enum dsi_mode_flags { DSI_MODE_FLAG_SEAMLESS = BIT(0), @@ -105,6 +106,7 @@ enum dsi_mode_flags { DSI_MODE_FLAG_VRR = BIT(4), DSI_MODE_FLAG_POMS = BIT(5), DSI_MODE_FLAG_DYN_CLK = BIT(6), + DSI_MODE_FLAG_DMS_FPS = BIT(7), }; /** diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 809294bf50..ae3d0bf098 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -4387,6 +4387,30 @@ static bool dsi_display_validate_mode_seamless(struct dsi_display *display, return rc; } +static void dsi_display_validate_dms_fps(struct dsi_display_mode *cur_mode, + struct dsi_display_mode *to_mode) +{ + u32 cur_fps, to_fps; + u32 cur_h_active, to_h_active; + u32 cur_v_active, to_v_active; + + cur_fps = cur_mode->timing.refresh_rate; + to_fps = to_mode->timing.refresh_rate; + cur_h_active = cur_mode->timing.h_active; + cur_v_active = cur_mode->timing.v_active; + to_h_active = to_mode->timing.h_active; + to_v_active = to_mode->timing.v_active; + + if ((cur_h_active == to_h_active) && (cur_v_active == to_v_active) && + (cur_fps != to_fps)) { + to_mode->dsi_mode_flags |= DSI_MODE_FLAG_DMS_FPS; + DSI_DEBUG("DMS Modeset with FPS change\n"); + } else { + to_mode->dsi_mode_flags &= ~DSI_MODE_FLAG_DMS_FPS; + } +} + + static int dsi_display_set_mode_sub(struct dsi_display *display, struct dsi_display_mode *mode, u32 flags) @@ -4403,6 +4427,7 @@ static int dsi_display_set_mode_sub(struct dsi_display *display, return -EINVAL; } + SDE_EVT32(mode->dsi_mode_flags); if (mode->dsi_mode_flags & DSI_MODE_FLAG_POMS) { display->config.panel_mode = mode->panel_mode; display->panel->panel_mode = mode->panel_mode; @@ -4462,9 +4487,12 @@ static int dsi_display_set_mode_sub(struct dsi_display *display, } if ((mode->dsi_mode_flags & DSI_MODE_FLAG_DMS) && - (display->panel->panel_mode == DSI_OP_CMD_MODE)) + (display->panel->panel_mode == DSI_OP_CMD_MODE)) { atomic_set(&display->clkrate_change_pending, 1); + dsi_display_validate_dms_fps(display->panel->cur_mode, mode); + } + if (priv_info->phy_timing_len) { display_for_each_ctrl(i, display) { ctrl = &display->ctrl[i]; @@ -7136,7 +7164,9 @@ int dsi_display_enable(struct dsi_display *display) } } - if (mode->priv_info->dsc_enabled) { + /* Block sending pps command if modeset is due to fps difference */ + if ((mode->priv_info->dsc_enabled) && + !(mode->dsi_mode_flags & DSI_MODE_FLAG_DMS_FPS)) { mode->priv_info->dsc.pic_width *= display->ctrl_count; rc = dsi_panel_update_pps(display->panel); if (rc) {