summaryrefslogtreecommitdiff
path: root/drivers/video
diff options
context:
space:
mode:
authorDhaval Patel <pdhaval@codeaurora.org>2016-03-30 00:22:57 -0700
committerKyle Yan <kyan@codeaurora.org>2016-04-28 16:41:20 -0700
commit76d65e6339b563db39dbecf7799ef663fc83e430 (patch)
treebe36e61e83d4b4bee302ab83c3dc086d34296e0f /drivers/video
parent2e95db147d9c4801d8b86ac77c1b088298032363 (diff)
msm: mdss: add scr rev support for dsc
Panels can support different dsc revisions based on the scr. Add scr revision support for dsc based on updated spec. Change-Id: Icbd93ed592a7d79dcd7f72b52d73572ced384759 Signed-off-by: Dhaval Patel <pdhaval@codeaurora.org>
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/fbdev/msm/mdss_dsi_panel.c52
-rw-r--r--drivers/video/fbdev/msm/mdss_panel.c26
-rw-r--r--drivers/video/fbdev/msm/mdss_panel.h7
3 files changed, 72 insertions, 13 deletions
diff --git a/drivers/video/fbdev/msm/mdss_dsi_panel.c b/drivers/video/fbdev/msm/mdss_dsi_panel.c
index 95808754d8c6..a64cdc161e55 100644
--- a/drivers/video/fbdev/msm/mdss_dsi_panel.c
+++ b/drivers/video/fbdev/msm/mdss_dsi_panel.c
@@ -1089,7 +1089,7 @@ void mdss_dsi_panel_dsc_pps_send(struct mdss_dsi_ctrl_pdata *ctrl,
memset(&cmd, 0, sizeof(cmd));
cmd.dchdr.dlen = mdss_panel_dsc_prepare_pps_buf(&pinfo->dsc,
- ctrl->pps_buf, 0 , 1, 0);
+ ctrl->pps_buf, 0);
cmd.dchdr.dtype = DTYPE_PPS;
cmd.dchdr.last = 1;
cmd.dchdr.wait = 10;
@@ -1104,6 +1104,47 @@ void mdss_dsi_panel_dsc_pps_send(struct mdss_dsi_ctrl_pdata *ctrl,
mdss_dsi_panel_cmds_send(ctrl, &pcmds, CMD_REQ_COMMIT);
}
+static int mdss_dsi_parse_dsc_version(struct device_node *np,
+ struct mdss_panel_timing *timing)
+{
+ u32 data;
+ int rc = 0;
+ struct dsc_desc *dsc = &timing->dsc;
+
+ rc = of_property_read_u32(np, "qcom,mdss-dsc-version", &data);
+ if (rc) {
+ dsc->version = 0x11;
+ rc = 0;
+ } else {
+ dsc->version = data & 0xff;
+ /* only support DSC 1.1 rev */
+ if (dsc->version != 0x11) {
+ pr_err("%s: DSC version:%d not supported\n", __func__,
+ dsc->version);
+ rc = -EINVAL;
+ goto end;
+ }
+ }
+
+ rc = of_property_read_u32(np, "qcom,mdss-dsc-scr-version", &data);
+ if (rc) {
+ dsc->scr_rev = 0x0;
+ rc = 0;
+ } else {
+ dsc->scr_rev = data & 0xff;
+ /* only one scr rev supported */
+ if (dsc->scr_rev > 0x1) {
+ pr_err("%s: DSC scr version:%d not supported\n",
+ __func__, dsc->scr_rev);
+ rc = -EINVAL;
+ goto end;
+ }
+ }
+
+end:
+ return rc;
+}
+
static int mdss_dsi_parse_dsc_params(struct device_node *np,
struct mdss_panel_timing *timing, bool is_split_display)
{
@@ -1277,11 +1318,16 @@ static int mdss_dsi_parse_topology_config(struct device_node *np,
data = of_get_property(np, "qcom,compression-mode", NULL);
if (data) {
- if (cfg_np && !strcmp(data, "dsc"))
+ if (cfg_np && !strcmp(data, "dsc")) {
+ rc = mdss_dsi_parse_dsc_version(np, &pt->timing);
+ if (rc)
+ goto end;
+
rc = mdss_dsi_parse_dsc_params(cfg_np, &pt->timing,
is_split_display);
- else if (!strcmp(data, "fbc"))
+ } else if (!strcmp(data, "fbc")) {
rc = mdss_dsi_parse_fbc_params(np, &pt->timing);
+ }
}
end:
diff --git a/drivers/video/fbdev/msm/mdss_panel.c b/drivers/video/fbdev/msm/mdss_panel.c
index 41d4320322e2..d8fed98a9e46 100644
--- a/drivers/video/fbdev/msm/mdss_panel.c
+++ b/drivers/video/fbdev/msm/mdss_panel.c
@@ -30,10 +30,14 @@
*/
static u32 dsc_rc_buf_thresh[] = {0x0e, 0x1c, 0x2a, 0x38, 0x46, 0x54,
0x62, 0x69, 0x70, 0x77, 0x79, 0x7b, 0x7d, 0x7e};
-static char dsc_rc_range_min_qp[] = {0, 0, 1, 1, 3, 3, 3, 3, 3, 3, 5,
+static char dsc_rc_range_min_qp_1_1[] = {0, 0, 1, 1, 3, 3, 3, 3, 3, 3, 5,
5, 5, 7, 13};
-static char dsc_rc_range_max_qp[] = {4, 4, 5, 6, 7, 7, 7, 8, 9, 10, 11,
+static char dsc_rc_range_min_qp_1_1_scr1[] = {0, 0, 1, 1, 3, 3, 3, 3, 3, 3, 5,
+ 5, 5, 9, 12};
+static char dsc_rc_range_max_qp_1_1[] = {4, 4, 5, 6, 7, 7, 7, 8, 9, 10, 11,
12, 13, 13, 15};
+static char dsc_rc_range_max_qp_1_1_scr1[] = {4, 4, 5, 6, 7, 7, 7, 8, 9, 10, 10,
+ 11, 11, 12, 13};
static char dsc_rc_range_bpg_offset[] = {2, 0, 0, -2, -4, -6, -8, -8,
-8, -10, -10, -12, -12, -12, -12};
@@ -668,7 +672,10 @@ void mdss_panel_dsc_parameters_calc(struct dsc_desc *dsc)
int final_value, final_scale;
dsc->rc_model_size = 8192; /* rate_buffer_size */
- dsc->first_line_bpg_offset = 12;
+ if (dsc->version == 0x11 && dsc->scr_rev == 0x1)
+ dsc->first_line_bpg_offset = 15;
+ else
+ dsc->first_line_bpg_offset = 12;
dsc->min_qp_flatness = 3;
dsc->max_qp_flatness = 12;
dsc->line_buf_depth = 9;
@@ -680,8 +687,13 @@ void mdss_panel_dsc_parameters_calc(struct dsc_desc *dsc)
dsc->tgt_offset_lo = 3;
dsc->buf_thresh = dsc_rc_buf_thresh;
- dsc->range_min_qp = dsc_rc_range_min_qp;
- dsc->range_max_qp = dsc_rc_range_max_qp;
+ if (dsc->version == 0x11 && dsc->scr_rev == 0x1) {
+ dsc->range_min_qp = dsc_rc_range_min_qp_1_1_scr1;
+ dsc->range_max_qp = dsc_rc_range_max_qp_1_1_scr1;
+ } else {
+ dsc->range_min_qp = dsc_rc_range_min_qp_1_1;
+ dsc->range_max_qp = dsc_rc_range_max_qp_1_1;
+ }
dsc->range_bpg_offset = dsc_rc_range_bpg_offset;
bpp = dsc->bpp;
@@ -858,14 +870,14 @@ void mdss_panel_dsc_pclk_param_calc(struct dsc_desc *dsc, int intf_width)
}
int mdss_panel_dsc_prepare_pps_buf(struct dsc_desc *dsc, char *buf,
- int pps_id, int major, int minor)
+ int pps_id)
{
char *bp;
char data;
int i, bpp;
bp = buf;
- *bp++ = (((major & 0xf) << 4) | (minor & 0xf)); /* pps0 */
+ *bp++ = (dsc->version & 0xff); /* pps0 */
*bp++ = (pps_id & 0xff); /* pps1 */
bp++; /* pps2, reserved */
diff --git a/drivers/video/fbdev/msm/mdss_panel.h b/drivers/video/fbdev/msm/mdss_panel.h
index 24c785b11f8c..205a14cf8285 100644
--- a/drivers/video/fbdev/msm/mdss_panel.h
+++ b/drivers/video/fbdev/msm/mdss_panel.h
@@ -441,6 +441,9 @@ enum {
};
struct dsc_desc {
+ u8 version; /* top 4 bits major and lower 4 bits minor version */
+ u8 scr_rev; /* 8 bit value for dsc scr revision */
+
/*
* Following parameters can change per frame if partial update is on
*/
@@ -1014,13 +1017,11 @@ void mdss_panel_dsc_pclk_param_calc(struct dsc_desc *dsc, int intf_width);
* @dsc: pointer to DSC structure associated with panel_info
* @buf: buffer that holds PPS
* @pps_id: pps_identifier
- * @major: major version of the DSC encoder
- * @minot: minor version of the DSC encoder
*
* returns length of the PPS buffer.
*/
int mdss_panel_dsc_prepare_pps_buf(struct dsc_desc *dsc, char *buf,
- int pps_id, int major, int minor);
+ int pps_id);
#ifdef CONFIG_FB_MSM_MDSS
int mdss_panel_debugfs_init(struct mdss_panel_info *panel_info,
char const *panel_name);