|
@@ -589,12 +589,13 @@ int dsi_conn_get_mode_info(struct drm_connector *connector,
|
|
|
struct dsi_display_mode partial_dsi_mode, *dsi_mode = NULL;
|
|
|
struct dsi_mode_info *timing;
|
|
|
int src_bpp, tar_bpp, rc = 0;
|
|
|
+ struct dsi_display *dsi_display = (struct dsi_display *) display;
|
|
|
|
|
|
if (!drm_mode || !mode_info)
|
|
|
return -EINVAL;
|
|
|
|
|
|
convert_to_dsi_mode(drm_mode, &partial_dsi_mode);
|
|
|
- rc = dsi_display_find_mode(display, &partial_dsi_mode, sub_mode, &dsi_mode);
|
|
|
+ rc = dsi_display_find_mode(dsi_display, &partial_dsi_mode, NULL, &dsi_mode);
|
|
|
if (rc || !dsi_mode->priv_info)
|
|
|
return -EINVAL;
|
|
|
|
|
@@ -607,7 +608,6 @@ int dsi_conn_get_mode_info(struct drm_connector *connector,
|
|
|
mode_info->jitter_numer = dsi_mode->priv_info->panel_jitter_numer;
|
|
|
mode_info->jitter_denom = dsi_mode->priv_info->panel_jitter_denom;
|
|
|
mode_info->dfps_maxfps = dsi_drm_get_dfps_maxfps(display);
|
|
|
- mode_info->clk_rate = dsi_mode->timing.clk_rate_hz;
|
|
|
mode_info->panel_mode_caps = dsi_mode->panel_mode_caps;
|
|
|
mode_info->mdp_transfer_time_us =
|
|
|
dsi_mode->priv_info->mdp_transfer_time_us;
|
|
@@ -617,12 +617,23 @@ int dsi_conn_get_mode_info(struct drm_connector *connector,
|
|
|
sizeof(struct msm_display_topology));
|
|
|
|
|
|
if (dsi_mode->priv_info->bit_clk_list.count) {
|
|
|
- mode_info->bit_clk_rates =
|
|
|
- dsi_mode->priv_info->bit_clk_list.rates;
|
|
|
- mode_info->bit_clk_count =
|
|
|
- dsi_mode->priv_info->bit_clk_list.count;
|
|
|
+ struct msm_dyn_clk_list *dyn_clk_list = &mode_info->dyn_clk_list;
|
|
|
+
|
|
|
+ dyn_clk_list->rates = dsi_mode->priv_info->bit_clk_list.rates;
|
|
|
+ dyn_clk_list->count = dsi_mode->priv_info->bit_clk_list.count;
|
|
|
+ dyn_clk_list->type = dsi_display->panel->dyn_clk_caps.type;
|
|
|
+ dyn_clk_list->front_porches = dsi_mode->priv_info->bit_clk_list.front_porches;
|
|
|
+ dyn_clk_list->pixel_clks_khz = dsi_mode->priv_info->bit_clk_list.pixel_clks_khz;
|
|
|
+
|
|
|
+ rc = dsi_display_restore_bit_clk(dsi_display, dsi_mode);
|
|
|
+ if (rc) {
|
|
|
+ DSI_ERR("[%s] bit clk rate cannot be restored\n", dsi_display->name);
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ mode_info->clk_rate = dsi_mode->timing.clk_rate_hz;
|
|
|
+
|
|
|
if (dsi_mode->priv_info->dsc_enabled) {
|
|
|
mode_info->comp_info.comp_type = MSM_DISPLAY_COMPRESSION_DSC;
|
|
|
mode_info->topology.comp_type = MSM_DISPLAY_COMPRESSION_DSC;
|
|
@@ -845,6 +856,12 @@ void dsi_conn_set_submode_blob_info(struct drm_connector *conn,
|
|
|
struct dsi_display_mode partial_dsi_mode;
|
|
|
int count, i;
|
|
|
int preferred_submode_idx = -EINVAL;
|
|
|
+ enum dsi_dyn_clk_feature_type dyn_clk_type;
|
|
|
+ char *dyn_clk_types[DSI_DYN_CLK_TYPE_MAX] = {
|
|
|
+ [DSI_DYN_CLK_TYPE_LEGACY] = "none",
|
|
|
+ [DSI_DYN_CLK_TYPE_CONST_FPS_ADJUST_HFP] = "hfp",
|
|
|
+ [DSI_DYN_CLK_TYPE_CONST_FPS_ADJUST_VFP] = "vfp",
|
|
|
+ };
|
|
|
|
|
|
if (!conn || !display || !drm_mode) {
|
|
|
DSI_ERR("Invalid params\n");
|
|
@@ -861,35 +878,46 @@ void dsi_conn_set_submode_blob_info(struct drm_connector *conn,
|
|
|
u32 panel_mode_caps = 0;
|
|
|
const char *topo_name = NULL;
|
|
|
|
|
|
- if (dsi_display_mode_match(&partial_dsi_mode, dsi_mode,
|
|
|
- DSI_MODE_MATCH_FULL_TIMINGS)) {
|
|
|
-
|
|
|
- sde_kms_info_add_keyint(info, "submode_idx", i);
|
|
|
-
|
|
|
- if (dsi_mode->is_preferred)
|
|
|
- preferred_submode_idx = i;
|
|
|
-
|
|
|
- if (dsi_mode->panel_mode_caps & DSI_OP_CMD_MODE)
|
|
|
- panel_mode_caps |= DRM_MODE_FLAG_CMD_MODE_PANEL;
|
|
|
- if (dsi_mode->panel_mode_caps & DSI_OP_VIDEO_MODE)
|
|
|
- panel_mode_caps |= DRM_MODE_FLAG_VID_MODE_PANEL;
|
|
|
-
|
|
|
- sde_kms_info_add_keyint(info, "panel_mode_capabilities",
|
|
|
- panel_mode_caps);
|
|
|
-
|
|
|
- sde_kms_info_add_keyint(info, "dsc_mode",
|
|
|
- dsi_mode->priv_info->dsc_enabled ? MSM_DISPLAY_DSC_MODE_ENABLED :
|
|
|
- MSM_DISPLAY_DSC_MODE_DISABLED);
|
|
|
- topo_name = sde_conn_get_topology_name(conn,
|
|
|
- dsi_mode->priv_info->topology);
|
|
|
- if (topo_name)
|
|
|
- sde_kms_info_add_keystr(info, "topology", topo_name);
|
|
|
-
|
|
|
- if (dsi_mode->priv_info->bit_clk_list.count > 0)
|
|
|
- sde_kms_info_add_list(info, "dyn_bitclk_list",
|
|
|
- dsi_mode->priv_info->bit_clk_list.rates,
|
|
|
- dsi_mode->priv_info->bit_clk_list.count);
|
|
|
- }
|
|
|
+ if (!dsi_display_mode_match(&partial_dsi_mode, dsi_mode,
|
|
|
+ DSI_MODE_MATCH_FULL_TIMINGS))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ sde_kms_info_add_keyint(info, "submode_idx", i);
|
|
|
+
|
|
|
+ if (dsi_mode->is_preferred)
|
|
|
+ preferred_submode_idx = i;
|
|
|
+
|
|
|
+ if (dsi_mode->panel_mode_caps & DSI_OP_CMD_MODE)
|
|
|
+ panel_mode_caps |= DRM_MODE_FLAG_CMD_MODE_PANEL;
|
|
|
+ if (dsi_mode->panel_mode_caps & DSI_OP_VIDEO_MODE)
|
|
|
+ panel_mode_caps |= DRM_MODE_FLAG_VID_MODE_PANEL;
|
|
|
+
|
|
|
+ sde_kms_info_add_keyint(info, "panel_mode_capabilities",
|
|
|
+ panel_mode_caps);
|
|
|
+
|
|
|
+ sde_kms_info_add_keyint(info, "dsc_mode",
|
|
|
+ dsi_mode->priv_info->dsc_enabled ? MSM_DISPLAY_DSC_MODE_ENABLED :
|
|
|
+ MSM_DISPLAY_DSC_MODE_DISABLED);
|
|
|
+ topo_name = sde_conn_get_topology_name(conn,
|
|
|
+ dsi_mode->priv_info->topology);
|
|
|
+ if (topo_name)
|
|
|
+ sde_kms_info_add_keystr(info, "topology", topo_name);
|
|
|
+
|
|
|
+ if (!dsi_mode->priv_info->bit_clk_list.count)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ dyn_clk_type = dsi_display->panel->dyn_clk_caps.type;
|
|
|
+ sde_kms_info_add_list(info, "dyn_bitclk_list",
|
|
|
+ dsi_mode->priv_info->bit_clk_list.rates,
|
|
|
+ dsi_mode->priv_info->bit_clk_list.count);
|
|
|
+ sde_kms_info_add_keystr(info, "dyn_fp_type",
|
|
|
+ dyn_clk_types[dyn_clk_type]);
|
|
|
+ sde_kms_info_add_list(info, "dyn_fp_list",
|
|
|
+ dsi_mode->priv_info->bit_clk_list.front_porches,
|
|
|
+ dsi_mode->priv_info->bit_clk_list.count);
|
|
|
+ sde_kms_info_add_list(info, "dyn_pclk_list",
|
|
|
+ dsi_mode->priv_info->bit_clk_list.pixel_clks_khz,
|
|
|
+ dsi_mode->priv_info->bit_clk_list.count);
|
|
|
}
|
|
|
|
|
|
if (preferred_submode_idx >= 0)
|