From 45af4566d91697c3c48df9d08324c99146fbd585 Mon Sep 17 00:00:00 2001 From: Prabhanjan Kandula Date: Mon, 23 Sep 2019 19:24:20 -0700 Subject: [PATCH] disp: msm: dsi: add support for spr enable from panel config This change parses SPR enable entry from panel device tree and populates SPR specific information in panel data structure. Valid entry of SPR pack type is treated as panel requirement to enable SPR for specified pack type from source end. This change also populate connector capabilities blob with SPR pack type. Change-Id: I9d9ab8a990476fba281e12890bf3f7b17a174d79 Signed-off-by: Prabhanjan Kandula --- msm/dsi/dsi_drm.c | 4 ++++ msm/dsi/dsi_panel.c | 25 +++++++++++++++++++++++++ msm/dsi/dsi_panel.h | 7 +++++++ msm/msm_drv.h | 26 ++++++++++++++++++++++++++ 4 files changed, 62 insertions(+) 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