diff --git a/msm/dsi/dsi_defs.h b/msm/dsi/dsi_defs.h index 870b7c5b5f41..6c78879913a6 100644 --- a/msm/dsi/dsi_defs.h +++ b/msm/dsi/dsi_defs.h @@ -267,7 +267,11 @@ enum dsi_dyn_clk_feature_type { * @DSI_CMD_SET_HBM_OFF: Turning HBM off * @DSI_CMD_SET_ACL_ON: Turning ACL on * @DSI_CMD_SET_ACL_OFF: Turning ACL off - * DSI_CMD_SET_HBM_DIM_OFF: Turning HBM DIM off + * @DSI_CMD_SET_HBM_DIM_OFF: Turning HBM DIM off + * @DSI_CMD_SET_CABC_UI: CABC UI mode + * @DSI_CMD_SET_CABC_MV: CABC MV mode + * @DSI_CMD_SET_CABC_DIS: CABC DIS mode + * @DSI_CMD_SET_MAX */ enum dsi_cmd_set_type { @@ -300,6 +304,9 @@ enum dsi_cmd_set_type { DSI_CMD_SET_ACL_ON, DSI_CMD_SET_ACL_OFF, DSI_CMD_SET_HBM_DIM_OFF, + DSI_CMD_SET_CABC_UI, + DSI_CMD_SET_CABC_MV, + DSI_CMD_SET_CABC_DIS, DSI_CMD_SET_MAX }; diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index cccfc795887f..9f18d06f060b 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -68,10 +68,18 @@ static struct panel_param_val_map acl_map[ACL_STATE_NUM] = { {ACL_ON_STATE, DSI_CMD_SET_ACL_ON, NULL}, }; +static struct panel_param_val_map cabc_map[CABC_STATE_NUM] = { + {CABC_UI_STATE, DSI_CMD_SET_CABC_UI, NULL}, + {CABC_MV_STATE, DSI_CMD_SET_CABC_MV, NULL}, + {CABC_DIS_STATE, DSI_CMD_SET_CABC_DIS, NULL}, +}; + static struct panel_param dsi_panel_param[PANEL_IDX_MAX][PARAM_ID_NUM] = { { {"HBM", hbm_map, HBM_STATE_NUM, HBM_OFF_STATE, HBM_OFF_STATE, false}, + {"CABC", cabc_map, CABC_STATE_NUM, CABC_UI_STATE, + CABC_UI_STATE, false}, {"ACL", acl_map, ACL_STATE_NUM, ACL_OFF_STATE, ACL_OFF_STATE, false} }, @@ -864,7 +872,7 @@ static int dsi_panel_send_param_cmd(struct dsi_panel *panel, param_map = panel_param->val_map; - DSI_DEBUG("%s: param_name=%s; val_max =%d, default_value=%d, value=%d\n", + DSI_INFO("%s: param_name=%s; val_max =%d, default_value=%d, value=%d\n", __func__, panel_param->param_name, panel_param->val_max, panel_param->default_value, panel_param->value); @@ -950,6 +958,19 @@ static int dsi_panel_set_acl(struct dsi_panel *panel, return rc; }; +static int dsi_panel_set_cabc(struct dsi_panel *panel, + struct msm_param_info *param_info) +{ + int rc = 0; + + pr_info("%s: Set CABC to (%d)\n", __func__, param_info->value); + rc = dsi_panel_send_param_cmd(panel, param_info); + if (rc < 0) + pr_err("%s: failed to send param cmds. ret=%d\n", __func__, rc); + + return rc; +}; + int dsi_panel_set_param(struct dsi_panel *panel, struct msm_param_info *param_info) { @@ -966,6 +987,9 @@ int dsi_panel_set_param(struct dsi_panel *panel, case PARAM_HBM_ID : dsi_panel_set_hbm(panel, param_info); break; + case PARAM_CABC_ID : + dsi_panel_set_cabc(panel, param_info); + break; case PARAM_ACL_ID : dsi_panel_set_acl(panel, param_info); break; @@ -2100,6 +2124,9 @@ const char *cmd_set_prop_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-acl-on-command", "qcom,mdss-dsi-acl-off-command", "qcom,mdss-dsi-hbm-dim-off-command", + "qcom,mdss-dsi-cabc-ui-command", + "qcom,mdss-dsi-cabc-mv-command", + "qcom,mdss-dsi-cabc-dis-command", }; const char *cmd_set_state_map[DSI_CMD_SET_MAX] = { @@ -2132,6 +2159,9 @@ const char *cmd_set_state_map[DSI_CMD_SET_MAX] = { "qcom,mdss-dsi-acl-on-command-state", "qcom,mdss-dsi-acl-off-command-state", "qcom,mdss-dsi-hbm-dim-off-command-state", + "qcom,mdss-dsi-cabc-ui-command-state", + "qcom,mdss-dsi-cabc-mv-command-state", + "qcom,mdss-dsi-cabc-dis-command-state", }; int dsi_panel_get_cmd_pkt_count(const char *data, u32 length, u32 *cnt) diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 4f286f7fa750..c346d703a03f 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -236,6 +236,13 @@ enum hbm_state { HBM_STATE_NUM }; +enum cabc_state { + CABC_UI_STATE, + CABC_MV_STATE, + CABC_DIS_STATE, + CABC_STATE_NUM, +}; + struct panel_param_val_map { int state; enum dsi_cmd_set_type type; diff --git a/msm/msm_drv.h b/msm/msm_drv.h index 9b7520718baf..b69a2c7cec5a 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -218,6 +218,7 @@ enum msm_mdp_conn_property { /* MOT feature panel*/ CONNECTOR_PROP_HBM, + CONNECTOR_PROP_CABC, CONNECTOR_PROP_ACL, /* total # of properties */ CONNECTOR_PROP_COUNT @@ -365,6 +366,7 @@ enum msm_param_state { enum msm_param_id { PARAM_HBM_ID = 0, + PARAM_CABC_ID, PARAM_ACL_ID, PARAM_ID_NUM }; diff --git a/msm/sde/sde_connector.c b/msm/sde/sde_connector.c index bc40cc07172e..09b77f4bed32 100644 --- a/msm/sde/sde_connector.c +++ b/msm/sde/sde_connector.c @@ -1578,6 +1578,14 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector, if (rc) goto end; break; + case CONNECTOR_PROP_CABC: + param_info.value = val; + param_info.param_idx = PARAM_CABC_ID; + param_info.param_conn_idx = CONNECTOR_PROP_CABC; + rc = _sde_connector_update_param(c_conn, ¶m_info); + if (rc) + goto end; + break; default: break; } @@ -2674,6 +2682,8 @@ static int sde_connector_install_panel_params(struct sde_connector *c_conn) if (!strncmp(param_cmds->param_name, "HBM", 3)) prop_idx = CONNECTOR_PROP_HBM; + else if (!strncmp(param_cmds->param_name, "CABC", 4)) + prop_idx = CONNECTOR_PROP_CABC; else if (!strncmp(param_cmds->param_name, "ACL", 3)) prop_idx = CONNECTOR_PROP_ACL; else { diff --git a/msm/sde/sde_motUtil.c b/msm/sde/sde_motUtil.c index d0b98d644327..84ff35b4caee 100644 --- a/msm/sde/sde_motUtil.c +++ b/msm/sde/sde_motUtil.c @@ -217,6 +217,9 @@ static int _sde_debugfs_motUtil_kms_prop_test(struct sde_kms *kms, case KMSPROPTEST_TYPE_ACL: conn_prop_idx = CONNECTOR_PROP_ACL; break; + case KMSPROPTEST_TYPE_CABC: + conn_prop_idx = CONNECTOR_PROP_CABC; + break; default: DRM_ERROR(" Invalid KMSPROPTEST_PROP_INDEX = %d\n", input[KMSPROPTEST_PROP_INDEX]);