platform: msm_shared: enable different panel configuration modes
Add support to specify multiple working configurations for a given
panel. Choose the default configuration through target specific oem panel
module. Add support to select non-default configuration, if supported by
given panel, through "fastboot oem select-display-panel". Add support to
convey selected lk config to kernel by modifying kernel command line.
Ex:
fastboot oem select-display-panel nt35597_wqxga_dsc_video
fastboot oem select-display-panel nt35597_wqxga_dsc_video:cfg[0..2]
fastboot oem select-display-panel nt35597_wqxga_dsc_video:cfg[0..2]#sim
fastboot oem select-display-panel nt35597_wqxga_dsc_cmd
fastboot oem select-display-panel nt35597_wqxga_dsc_cmd:cfg[0..2]
fastboot oem select-display-panel nt35597_wqxga_dsc_cmd:cfg[0..2]#sim
Change-Id: I39f4434b5d8f81229dfc95990b558efaab382c8d
diff --git a/dev/gcdb/display/panel_display.c b/dev/gcdb/display/panel_display.c
index 1c0a82a..88d2006 100755
--- a/dev/gcdb/display/panel_display.c
+++ b/dev/gcdb/display/panel_display.c
@@ -148,6 +148,8 @@
pinfo->xres += (pinfo->border_left + pinfo->border_right);
pinfo->yres += (pinfo->border_top + pinfo->border_bottom);
+ dprintf(INFO, "panel_operating_mode=0x%x\n",
+ pstruct->paneldata->panel_operating_mode);
if (pstruct->paneldata->panel_operating_mode & DUAL_PIPE_FLAG)
pinfo->lcdc.dual_pipe = 1;
if (pstruct->paneldata->panel_operating_mode & PIPE_SWAP_FLAG)
@@ -156,6 +158,14 @@
pinfo->lcdc.split_display = 1;
if (pstruct->paneldata->panel_operating_mode & DST_SPLIT_FLAG)
pinfo->lcdc.dst_split = 1;
+ if (pstruct->paneldata->panel_operating_mode & DUAL_DSI_FLAG)
+ pinfo->mipi.dual_dsi = 1;
+ if (pstruct->paneldata->panel_operating_mode & USE_DSI1_PLL_FLAG)
+ pinfo->mipi.use_dsi1_pll = 1;
+
+ dprintf(SPEW, "dual_pipe=%d pipe_swap=%d split_display=%d dst_split=%d\n",
+ pinfo->lcdc.dual_pipe, pinfo->lcdc.pipe_swap,
+ pinfo->lcdc.split_display, pinfo->lcdc.dst_split);
/* Color setting*/
pinfo->lcdc.border_clr = pstruct->color->border_color;
@@ -194,10 +204,6 @@
pinfo->mipi.vc = pstruct->paneldata->dsi_virtualchannel_id;
pinfo->mipi.frame_rate = pstruct->paneldata->panel_framerate;
pinfo->mipi.stream = pstruct->paneldata->dsi_stream;
- if (pstruct->paneldata->panel_operating_mode & DUAL_DSI_FLAG)
- pinfo->mipi.dual_dsi = 1;
- if (pstruct->paneldata->panel_operating_mode & USE_DSI1_PLL_FLAG)
- pinfo->mipi.use_dsi1_pll = 1;
pinfo->mipi.mode_gpio_state = pstruct->paneldata->mode_gpio_state;
pinfo->mipi.bitclock = pstruct->paneldata->panel_bitclock_freq;
if (pinfo->mipi.bitclock) {
@@ -246,28 +252,36 @@
pinfo->fbc.comp_ratio = 1;
if (pinfo->compression_mode == COMPRESSION_DSC) {
- struct dsc_desc *dsc = NULL;
+ struct dsc_desc *dsc = &pinfo->dsc;
+ struct dsc_parameters *dsc_params = NULL;
- pinfo->dsc.major = pstruct->dsc_paras.major;
- pinfo->dsc.minor = pstruct->dsc_paras.minor;
- pinfo->dsc.pps_id = pstruct->dsc_paras.pps_id;
- pinfo->dsc.slice_height = pstruct->dsc_paras.slice_height;
- pinfo->dsc.slice_width = pstruct->dsc_paras.slice_width;
- pinfo->dsc.bpp = pstruct->dsc_paras.bpp;
- pinfo->dsc.bpc = pstruct->dsc_paras.bpc;
- pinfo->dsc.slice_per_pkt = pstruct->dsc_paras.slice_per_pkt;
- pinfo->dsc.ich_reset_value = pstruct->dsc_paras.ich_reset_value;
- pinfo->dsc.ich_reset_override = pstruct->dsc_paras.ich_reset_override;
- pinfo->dsc.block_pred_enable = pstruct->dsc_paras.block_prediction;
- pinfo->dsc.enable_422 = 0;
- pinfo->dsc.convert_rgb = 1;
- pinfo->dsc.vbr_enable = 0;
+ if (!pstruct->config) {
+ dprintf(CRITICAL, "ERROR: DSC cannot be used without topology_config\n");
+ return ERR_NOT_ALLOWED;
+ }
+ dsc_params = pstruct->config->dsc;
+ if (!dsc_params) {
+ dprintf(CRITICAL, "ERROR: DSC params are NULL\n");
+ return ERR_INVALID_ARGS;
+ }
- dsc = &pinfo->dsc;
- if (dsc) {
- if (dsc->parameter_calc)
- dsc->parameter_calc(pinfo);
- }
+ dsc->major = dsc_params->major;
+ dsc->minor = dsc_params->minor;
+ dsc->pps_id = dsc_params->pps_id;
+ dsc->slice_height = dsc_params->slice_height;
+ dsc->slice_width = dsc_params->slice_width;
+ dsc->bpp = dsc_params->bpp;
+ dsc->bpc = dsc_params->bpc;
+ dsc->slice_per_pkt = dsc_params->slice_per_pkt;
+ dsc->ich_reset_value = dsc_params->ich_reset_value;
+ dsc->ich_reset_override = dsc_params->ich_reset_override;
+ dsc->block_pred_enable = dsc_params->block_prediction;
+ dsc->enable_422 = 0;
+ dsc->convert_rgb = 1;
+ dsc->vbr_enable = 0;
+
+ if (dsc->parameter_calc)
+ dsc->parameter_calc(pinfo);
} else if (pinfo->compression_mode == COMPRESSION_FBC) {
pinfo->fbc.enabled = pstruct->fbcinfo.enabled;
if (pinfo->fbc.enabled) {