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) {