drm/msm/dsi-staging: update dsi clock calculations

Change updates dsi clock calculations for command mode
as per recommendation. Now dsi clocks are tied to
frame transer time. Propagate correct frame transfer
time to hal to update mdp clocks and bandwidth needed
accordingly.

Change-Id: I46f9038622ddd47cc53c5f3d54229f69a7008c8a
Signed-off-by: Vara Reddy <varar@codeaurora.org>
This commit is contained in:
Vara Reddy
2019-05-02 13:42:06 -07:00
parent 74f328561e
commit f28b596aac
6 changed files with 143 additions and 19 deletions

View File

@@ -4000,7 +4000,8 @@ static int dsi_display_set_mode_sub(struct dsi_display *display,
display_for_each_ctrl(i, display) {
ctrl = &display->ctrl[i];
rc = dsi_ctrl_update_host_config(ctrl->ctrl, &display->config,
mode->dsi_mode_flags, display->dsi_clk_handle);
mode, mode->dsi_mode_flags,
display->dsi_clk_handle);
if (rc) {
pr_err("[%s] failed to update ctrl config, rc=%d\n",
display->name, rc);
@@ -5547,13 +5548,30 @@ int dsi_display_get_modes(struct dsi_display *display,
memset(&panel_mode, 0, sizeof(panel_mode));
rc = dsi_panel_get_mode(display->panel, mode_idx,
&panel_mode, topology_override);
&panel_mode,
topology_override);
if (rc) {
pr_err("[%s] failed to get mode idx %d from panel\n",
display->name, mode_idx);
goto error;
}
/* Calculate dsi frame transfer time */
if (display->panel->panel_mode == DSI_OP_CMD_MODE) {
dsi_panel_calc_dsi_transfer_time(
&display->panel->host_config,
&panel_mode.timing);
panel_mode.priv_info->dsi_transfer_time_us =
panel_mode.timing.dsi_transfer_time_us;
panel_mode.priv_info->min_dsi_clk_hz =
panel_mode.timing.min_dsi_clk_hz;
panel_mode.priv_info->mdp_transfer_time_us =
panel_mode.priv_info->dsi_transfer_time_us;
panel_mode.timing.mdp_transfer_time_us =
panel_mode.timing.dsi_transfer_time_us;
}
if (display->ctrl_count > 1) { /* TODO: remove if */
panel_mode.timing.h_active *= display->ctrl_count;
panel_mode.timing.h_front_porch *= display->ctrl_count;
@@ -5894,6 +5912,7 @@ int dsi_display_set_mode(struct dsi_display *display,
{
int rc = 0;
struct dsi_display_mode adj_mode;
struct dsi_mode_info timing;
if (!display || !mode || !display->panel) {
pr_err("Invalid params\n");
@@ -5903,6 +5922,7 @@ int dsi_display_set_mode(struct dsi_display *display,
mutex_lock(&display->display_lock);
adj_mode = *mode;
timing = adj_mode.timing;
adjust_timing_by_ctrl_count(display, &adj_mode);
/*For dynamic DSI setting, use specified clock rate */
@@ -5930,6 +5950,11 @@ int dsi_display_set_mode(struct dsi_display *display,
}
}
pr_info("mdp_transfer_time_us=%d us\n",
adj_mode.priv_info->mdp_transfer_time_us);
pr_info("hactive= %d,vactive= %d,fps=%d",timing.h_active,
timing.v_active,timing.refresh_rate);
memcpy(display->panel->cur_mode, &adj_mode, sizeof(adj_mode));
error:
mutex_unlock(&display->display_lock);