diff --git a/msm/dsi/dsi_drm.c b/msm/dsi/dsi_drm.c index 90f03add80..fbea1f3e2e 100644 --- a/msm/dsi/dsi_drm.c +++ b/msm/dsi/dsi_drm.c @@ -650,6 +650,10 @@ int dsi_conn_set_info_blob(struct drm_connector *connector, break; } + if (panel->spr_info.enable) + sde_kms_info_add_keystr(info, "spr_pack_type", + msm_spr_pack_type_str[panel->spr_info.pack_type]); + if (mode_info && mode_info->roi_caps.enabled) { sde_kms_info_add_keyint(info, "partial_update_num_roi", mode_info->roi_caps.num_roi); diff --git a/msm/dsi/dsi_panel.c b/msm/dsi/dsi_panel.c index 3e872e04f1..02a7f87b89 100644 --- a/msm/dsi/dsi_panel.c +++ b/msm/dsi/dsi_panel.c @@ -1860,6 +1860,8 @@ error: static int dsi_panel_parse_misc_features(struct dsi_panel *panel) { struct dsi_parser_utils *utils = &panel->utils; + const char *string; + int i, rc = 0; panel->ulps_feature_enabled = utils->read_bool(utils->data, "qcom,ulps-enabled"); @@ -1881,6 +1883,29 @@ static int dsi_panel_parse_misc_features(struct dsi_panel *panel) panel->lp11_init = utils->read_bool(utils->data, "qcom,mdss-dsi-lp11-init"); + + panel->spr_info.enable = false; + panel->spr_info.pack_type = MSM_DISPLAY_SPR_TYPE_MAX; + + rc = utils->read_string(utils->data, "qcom,spr-pack-type", &string); + if (!rc) { + // find match for pack-type string + for (i = 0; i < MSM_DISPLAY_SPR_TYPE_MAX; i++) { + if (msm_spr_pack_type_str[i] && + (!strcmp(string, msm_spr_pack_type_str[i]))) { + panel->spr_info.enable = true; + panel->spr_info.pack_type = i; + break; + } + } + } + + pr_debug("%s source side spr packing, pack-type %s\n", + panel->spr_info.enable ? "enable" : "disable", + panel->spr_info.enable ? + msm_spr_pack_type_str[panel->spr_info.pack_type] : "none"); + + return 0; } diff --git a/msm/dsi/dsi_panel.h b/msm/dsi/dsi_panel.h index 946bbf0bcb..07d00450e4 100644 --- a/msm/dsi/dsi_panel.h +++ b/msm/dsi/dsi_panel.h @@ -155,6 +155,11 @@ struct drm_panel_esd_config { u32 groups; }; +struct dsi_panel_spr_info { + bool enable; + enum msm_display_spr_pack_type pack_type; +}; + struct dsi_panel { const char *name; const char *type; @@ -203,6 +208,8 @@ struct dsi_panel { char dce_pps_cmd[DSI_CMD_PPS_SIZE]; enum dsi_dms_mode dms_mode; + struct dsi_panel_spr_info spr_info; + bool sync_broadcast_en; int panel_test_gpio; diff --git a/msm/msm_drv.h b/msm/msm_drv.h index 59c72000b2..24bb320c5c 100644 --- a/msm/msm_drv.h +++ b/msm/msm_drv.h @@ -231,6 +231,32 @@ enum msm_display_compression_type { #define MSM_DISPLAY_COMPRESSION_RATIO_NONE 1 #define MSM_DISPLAY_COMPRESSION_RATIO_MAX 5 +/** + * enum msm_display_spr_pack_type - sub pixel rendering pack patterns supported + * @MSM_DISPLAY_SPR_TYPE_NONE: Bypass, no special packing + * @MSM_DISPLAY_SPR_TYPE_PENTILE: pentile pack pattern + * @MSM_DISPLAY_SPR_TYPE_RGBW: RGBW pack pattern + * @MSM_DISPLAY_SPR_TYPE_YYGM: YYGM pack pattern + * @MSM_DISPLAY_SPR_TYPE_YYGW: YYGW pack patterm + * @MSM_DISPLAY_SPR_TYPE_MAX: max and invalid + */ +enum msm_display_spr_pack_type { + MSM_DISPLAY_SPR_TYPE_NONE, + MSM_DISPLAY_SPR_TYPE_PENTILE, + MSM_DISPLAY_SPR_TYPE_RGBW, + MSM_DISPLAY_SPR_TYPE_YYGM, + MSM_DISPLAY_SPR_TYPE_YYGW, + MSM_DISPLAY_SPR_TYPE_MAX +}; + +static const char *msm_spr_pack_type_str[MSM_DISPLAY_SPR_TYPE_MAX] = { + [MSM_DISPLAY_SPR_TYPE_NONE] = "", + [MSM_DISPLAY_SPR_TYPE_PENTILE] = "pentile", + [MSM_DISPLAY_SPR_TYPE_RGBW] = "rgbw", + [MSM_DISPLAY_SPR_TYPE_YYGM] = "yygm", + [MSM_DISPLAY_SPR_TYPE_YYGW] = "yygw" +}; + /** * enum msm_display_caps - features/capabilities supported by displays * @MSM_DISPLAY_CAP_VID_MODE: Video or "active" mode supported