From 4f53bc1569a25721d37d63266b85082ca06825d1 Mon Sep 17 00:00:00 2001 From: Rajeev Nandan Date: Thu, 9 Apr 2020 15:26:22 +0530 Subject: [PATCH 1/4] disp: msm: dsi: fix physical size truncation of large panel Panel's physical width/height larger than 255mm is getting truncated due to type conversion into smaller type. Change-Id: I826fb2db542146c07d8379951563430b7da8288c Signed-off-by: Rajeev Nandan Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_drm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index 19a41015edf9..fb3df7e615a4 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -825,8 +825,8 @@ int dsi_connector_get_modes(struct drm_connector *connector, void *data, struct drm_display_mode drm_mode; struct dsi_display *display = data; struct edid edid; - u8 width_mm = connector->display_info.width_mm; - u8 height_mm = connector->display_info.height_mm; + unsigned int width_mm = connector->display_info.width_mm; + unsigned int height_mm = connector->display_info.height_mm; const u8 edid_buf[EDID_LENGTH] = { 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x44, 0x6D, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1B, 0x10, 0x01, 0x03, From 9cf9c8e99b29d0d8bbe0cc93ee66e8daa19c18b2 Mon Sep 17 00:00:00 2001 From: Lipsa Rout Date: Fri, 27 Mar 2020 16:22:14 +0530 Subject: [PATCH 2/4] disp: msm: dsi: Fix the total number of modes calculation This change updates the parsing of timing nodes to check the mode of operation as video or command. In command mode, for each timing node, num of supported dfps rate is always one. Accordingly, update the num_dfps_rate to 1 for command mode. Change-Id: I5098c7e0d4d2320609d6e10031eaef78c1d8b3c1 Signed-off-by: Lipsa Rout Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_display.c | 4 ++-- msm/dsi/dsi_panel.c | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index b94d733cb6be..8b8c4d6f9b6f 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6130,8 +6130,6 @@ int dsi_display_get_modes(struct dsi_display *display, dyn_clk_caps = &(display->panel->dyn_clk_caps); - num_dfps_rates = !dfps_caps.dfps_support ? 1 : dfps_caps.dfps_list_len; - timing_mode_count = display->panel->num_timing_nodes; for (mode_idx = 0; mode_idx < timing_mode_count; mode_idx++) { @@ -6158,6 +6156,8 @@ int dsi_display_get_modes(struct dsi_display *display, /* Setup widebus support */ display_mode.priv_info->widebus_support = ctrl->ctrl->hw.widebus_support; + num_dfps_rates = ((!dfps_caps.dfps_support || + is_cmd_mode) ? 1 : dfps_caps.dfps_list_len); /* Calculate dsi frame transfer time */ if (is_cmd_mode) { diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index a04e4ddef532..6c2fe136f097 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -3425,7 +3425,6 @@ int dsi_panel_get_mode_count(struct dsi_panel *panel) int num_dfps_rates, num_bit_clks; int num_video_modes = 0, num_cmd_modes = 0; int count, rc = 0; - void *utils_data = NULL; if (!panel) { DSI_ERR("invalid params\n"); @@ -3462,10 +3461,9 @@ int dsi_panel_get_mode_count(struct dsi_panel *panel) panel->num_timing_nodes = count; dsi_for_each_child_node(timings_np, child_np) { - utils_data = child_np; - if (utils->read_bool(utils->data, "qcom,mdss-dsi-video-mode")) + if (utils->read_bool(child_np, "qcom,mdss-dsi-video-mode")) num_video_modes++; - else if (utils->read_bool(utils->data, + else if (utils->read_bool(child_np, "qcom,mdss-dsi-cmd-mode")) num_cmd_modes++; else if (panel->panel_mode == DSI_OP_VIDEO_MODE) From d59451d9e95035ec5a2f76dff7b11a3e947774fb Mon Sep 17 00:00:00 2001 From: Lipsa Rout Date: Wed, 15 Apr 2020 19:14:04 +0530 Subject: [PATCH 3/4] disp: msm: dsi: Add support to skip constant fps for command mode VFP or HFP is adjusted to achieve constant fps during dynamic DSI clock switch. This feature is not supported for command mode. So, add check to skip porch calculation for command mode. Change-Id: I5fa76d6536a55b2a19f24c0e14b6861e1f4c8f25 Signed-off-by: Lipsa Rout Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_display.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 8b8c4d6f9b6f..8c86e981e416 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -5967,6 +5967,10 @@ void dsi_display_adjust_mode_timing( { u64 new_htotal, new_vtotal, htotal, vtotal, old_htotal, div; + /* Constant FPS is not supported on command mode */ + if (dsi_mode->panel_mode == DSI_OP_CMD_MODE) + return; + if (!dyn_clk_caps->maintain_const_fps) return; /* From e009f7f81f776cb3be89dbdc7a69478f19b9de74 Mon Sep 17 00:00:00 2001 From: Lipsa Rout Date: Mon, 6 Apr 2020 11:52:11 +0530 Subject: [PATCH 4/4] disp: msm: dsi: Update mode population logic for POMS feature This change adds support to populate one command mode for video mode panels supporting panel operating mode switch feature. Change-Id: I850b889ebfa8c2ee1406ad946061b96143537b09 Signed-off-by: Lipsa Rout Signed-off-by: Satya Rama Aditya Pinapala --- msm/dsi/dsi_display.c | 11 +++++++++-- msm/dsi/dsi_panel.c | 17 ++++++++++++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/msm/dsi/dsi_display.c b/msm/dsi/dsi_display.c index 8c86e981e416..28f0d7d32a2b 100644 --- a/msm/dsi/dsi_display.c +++ b/msm/dsi/dsi_display.c @@ -6224,9 +6224,16 @@ int dsi_display_get_modes(struct dsi_display *display, } end = array_idx; /* - * if dynamic clk switch is supported then update all the bit - * clk rates. + * if POMS is enabled and boot up mode is video mode, + * skip bit clk rates update for command mode, + * else if dynamic clk switch is supported then update all + * the bit clk rates. */ + + if (is_cmd_mode && + (display->panel->panel_mode == DSI_OP_VIDEO_MODE)) + continue; + _dsi_display_populate_bit_clks(display, start, end, &array_idx); } diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 6c2fe136f097..61c6c7a0ab4b 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -3478,9 +3478,20 @@ int dsi_panel_get_mode_count(struct dsi_panel *panel) num_bit_clks = !panel->dyn_clk_caps.dyn_clk_support ? 1 : panel->dyn_clk_caps.bit_clk_list_len; - /* Inflate num_of_modes by fps and bit clks in dfps */ - panel->num_display_modes = (num_cmd_modes * num_bit_clks) + - (num_video_modes * num_bit_clks * num_dfps_rates); + /* + * Inflate num_of_modes by fps and bit clks in dfps. + * Single command mode for video mode panels supporting + * panel operating mode switch. + */ + num_video_modes = num_video_modes * num_bit_clks * num_dfps_rates; + + if ((panel->panel_mode == DSI_OP_VIDEO_MODE) && + (panel->panel_mode_switch_enabled)) + num_cmd_modes = 1; + else + num_cmd_modes = num_cmd_modes * num_bit_clks; + + panel->num_display_modes = num_video_modes + num_cmd_modes; error: return rc;