Merge "target: msm8952: Change target_volume_down function for msm8917 tmo" into lk.lnx.1.0-dev.1.0
diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c
index d689ea6..33ee59b 100644
--- a/app/aboot/aboot.c
+++ b/app/aboot/aboot.c
@@ -1148,6 +1148,12 @@
 			(!boot_into_recovery ? "boot" : "recovery"),imagesize_actual);
 	bs_set_timestamp(BS_KERNEL_LOAD_START);
 
+	if ((target_get_max_flash_size() - page_size) < imagesize_actual)
+	{
+		dprintf(CRITICAL, "booimage  size is greater than DDR can hold\n");
+		return -1;
+	}
+
 	/* Read image without signature */
 	if (mmc_read(ptn + offset, (void *)image_addr, imagesize_actual))
 	{
@@ -2838,6 +2844,7 @@
 
 			if (data_end < (uintptr_t)data + sizeof(uint32_t)) {
 				fastboot_fail("buffer overreads occured due to invalid sparse header");
+				free(fill_buf);
 				return;
 			}
 			fill_val = *(uint32_t *)data;
@@ -2861,6 +2868,7 @@
 				if ((uint64_t)total_blocks * (uint64_t)sparse_header->blk_sz + sparse_header->blk_sz > size)
 				{
 					fastboot_fail("Chunk data size for fill type exceeds partition size");
+					free(fill_buf);
 					return;
 				}
 
diff --git a/dev/gcdb/display/include/panel.h b/dev/gcdb/display/include/panel.h
index 11f471c..3a83bce 100755
--- a/dev/gcdb/display/include/panel.h
+++ b/dev/gcdb/display/include/panel.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -217,6 +217,7 @@
 	uint32_t bpc;		/* target bpc, byte per component */
 	uint32_t slice_per_pkt;
 	uint32_t block_prediction;
+	uint32_t scr_rev;
 };
 
 struct topology_config {
diff --git a/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_cmd.h b/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_cmd.h
index 2e8f306..6320c60 100644
--- a/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_cmd.h
+++ b/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_cmd.h
@@ -333,7 +333,7 @@
 /* DSC									     */
 /*---------------------------------------------------------------------------*/
 struct dsc_parameters nt35597_wqxga_dsc_cmd_params0 = {
-	1, 0, 0, 16, 720, 8, 8, 2, 1
+	1, 1, 0, 16, 720, 8, 8, 2, 1, 0
 };
 
 /* 1LM + 1 DSC_ENC */
diff --git a/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_video.h b/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_video.h
index f1f5247..af9fe14 100644
--- a/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_video.h
+++ b/dev/gcdb/display/include/panel_nt35597_wqxga_dsc_video.h
@@ -320,7 +320,7 @@
 /* DSC									     */
 /*---------------------------------------------------------------------------*/
 struct dsc_parameters nt35597_wqxga_dsc_video_params0 = {
-	1, 0, 0, 16, 720, 8, 8, 2, 1
+	1, 1, 0, 16, 720, 8, 8, 2, 1, 0
 };
 
 /* 1LM + 1 DSC_ENC */
diff --git a/dev/gcdb/display/panel_display.c b/dev/gcdb/display/panel_display.c
index b4084ad..2973de8 100755
--- a/dev/gcdb/display/panel_display.c
+++ b/dev/gcdb/display/panel_display.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -270,6 +270,7 @@
 
 		dsc->major = dsc_params->major;
 		dsc->minor = dsc_params->minor;
+		dsc->scr_rev = dsc_params->scr_rev;
 		dsc->pps_id = dsc_params->pps_id;
 		dsc->slice_height = dsc_params->slice_height;
 		dsc->slice_width = dsc_params->slice_width;
diff --git a/platform/msm_shared/include/msm_panel.h b/platform/msm_shared/include/msm_panel.h
index 7ea7805..4c44cc4 100644
--- a/platform/msm_shared/include/msm_panel.h
+++ b/platform/msm_shared/include/msm_panel.h
@@ -148,6 +148,7 @@
 
 	int major;
 	int minor;
+	int scr_rev;
 	int pps_id;
 
 	int pic_height;
diff --git a/platform/msm_shared/mipi_dsc.c b/platform/msm_shared/mipi_dsc.c
index a4ee313..c581855 100644
--- a/platform/msm_shared/mipi_dsc.c
+++ b/platform/msm_shared/mipi_dsc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2106, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -41,10 +41,14 @@
  */
 static char 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};
 
@@ -66,79 +70,73 @@
 	*bp++ = 0xc0;	/* last + long pkt */
 
 	/* pps payload */
-	*bp++ = ((dsc->major << 4) | dsc->minor);	/* pps0 */
-	*bp++ = dsc->pps_id;				/* pps1 */
+	*bp++ = (((dsc->major & 0xf) << 4) | (dsc->minor & 0xf));	/* pps0 */
+	*bp++ = (dsc->pps_id & 0xff);		/* pps1 */
 	bp++;					/* pps2, reserved */
 
 	data = dsc->line_buf_depth & 0x0f;
-	data |= (dsc->bpc << 4);
+	data |= ((dsc->bpc & 0xf) << 4);
 	*bp++ = data;				 /* pps3 */
 
 	bpp = dsc->bpp;
 	bpp <<= 4;	/* 4 fraction bits */
 	data = (bpp >> 8);
 	data &= 0x03;		/* upper two bits */
-	data |= (dsc->block_pred_enable << 5);
-	data |= (dsc->convert_rgb << 4);
-	data |= (dsc->enable_422 << 3);
-	data |= (dsc->vbr_enable << 2);
+	data |= ((dsc->block_pred_enable & 0x1) << 5);
+	data |= ((dsc->convert_rgb & 0x1) << 4);
+	data |= ((dsc->enable_422 & 0x1) << 3);
+	data |= ((dsc->vbr_enable & 0x1) << 2);
 	*bp++ = data;				/* pps4 */
 	*bp++ = bpp;				/* pps5 */
 
-	*bp++ = (dsc->pic_height >> 8);		/* pps6 */
+	*bp++ = ((dsc->pic_height >> 8) & 0xff); /* pps6 */
 	*bp++ = (dsc->pic_height & 0x0ff);	/* pps7 */
-	*bp++ = (dsc->pic_width >> 8);		/* pps8 */
+	*bp++ = ((dsc->pic_width >> 8) & 0xff);	/* pps8 */
 	*bp++ = (dsc->pic_width & 0x0ff);	/* pps9 */
 
-	*bp++ = (dsc->slice_height >> 8);	/* pps10 */
+	*bp++ = ((dsc->slice_height >> 8) & 0xff);/* pps10 */
 	*bp++ = (dsc->slice_height & 0x0ff);	/* pps11 */
-	*bp++ = (dsc->slice_width >> 8);	/* pps12 */
+	*bp++ = ((dsc->slice_width >> 8) & 0xff); /* pps12 */
 	*bp++ = (dsc->slice_width & 0x0ff);	/* pps13 */
 
-	*bp++ = (dsc->chunk_size >> 8);		/* pps14 */
+	*bp++ = ((dsc->chunk_size >> 8) & 0xff);/* pps14 */
 	*bp++ = (dsc->chunk_size & 0x0ff);	/* pps15 */
 
-	data = dsc->initial_xmit_delay >> 8;
-	data &= 0x03;
-	*bp++ = data;				/* pps16, bit 0, 1 */
-	*bp++ = dsc->initial_xmit_delay;	/* pps17 */
+	*bp++ = (dsc->initial_xmit_delay >> 8) & 0x3; /* pps16, bit 0, 1 */
+	*bp++ = (dsc->initial_xmit_delay & 0xff);/* pps17 */
 
-	*bp++ = (dsc->initial_dec_delay >> 8);	/* pps18 */
-	*bp++ = dsc->initial_dec_delay;		/* pps19 */
+	*bp++ = ((dsc->initial_dec_delay >> 8) & 0xff);	/* pps18 */
+	*bp++ = (dsc->initial_dec_delay & 0xff);/* pps19 */
 
 	bp++;					/* pps20, reserved */
 
 	*bp++ = (dsc->initial_scale_value & 0x3f); /* pps21 */
 
-	data = (dsc->scale_increment_interval >> 8);
-	data &= 0x0f;
-	*bp++ =  data;				/* pps22 */
-	*bp++ = dsc->scale_increment_interval;	/* pps23 */
+	*bp++ = ((dsc->scale_increment_interval >> 8) & 0xff); /* pps22 */
+	*bp++ = (dsc->scale_increment_interval & 0xff);	/* pps23 */
 
-	data = (dsc->scale_decrement_interval >> 8);
-	data &= 0x0f;
-	*bp++ = data;				/* pps24 */
+	*bp++ = ((dsc->scale_decrement_interval >> 8) & 0xf); /* pps24 */
 	*bp++ = (dsc->scale_decrement_interval & 0x0ff);/* pps25 */
 
 	bp++;			/* pps26, reserved */
 
 	*bp++ = (dsc->first_line_bpg_offset & 0x1f);/* pps27 */
 
-	*bp++ = (dsc->nfl_bpg_offset >> 8);	/* pps28 */
+	*bp++ = ((dsc->nfl_bpg_offset >> 8) & 0xff);/* pps28 */
 	*bp++ = (dsc->nfl_bpg_offset & 0x0ff);	/* pps29 */
-	*bp++ = (dsc->slice_bpg_offset >> 8);	/* pps30 */
+	*bp++ = ((dsc->slice_bpg_offset >> 8) & 0xff);/* pps30 */
 	*bp++ = (dsc->slice_bpg_offset & 0x0ff);/* pps31 */
 
-	*bp++ = (dsc->initial_offset >> 8);	/* pps32 */
+	*bp++ = ((dsc->initial_offset >> 8) & 0xff);/* pps32 */
 	*bp++ = (dsc->initial_offset & 0x0ff);	/* pps33 */
 
-	*bp++ = (dsc->final_offset >> 8);	/* pps34 */
+	*bp++ = ((dsc->final_offset >> 8) & 0xff);/* pps34 */
 	*bp++ = (dsc->final_offset & 0x0ff);	/* pps35 */
 
 	*bp++ = (dsc->min_qp_flatness & 0x1f);	/* pps36 */
 	*bp++ = (dsc->max_qp_flatness & 0x1f);	/* pps37 */
 
-	*bp++ = (dsc->rc_model_size >> 8);	/* pps38 */
+	*bp++ = ((dsc->rc_model_size >> 8) & 0xff);/* pps38 */
 	*bp++ = (dsc->rc_model_size & 0x0ff);	/* pps39 */
 
 	*bp++ = (dsc->edge_factor & 0x0f);	/* pps40 */
@@ -146,12 +144,12 @@
 	*bp++ = (dsc->quant_incr_limit0 & 0x1f);	/* pps41 */
 	*bp++ = (dsc->quant_incr_limit1 & 0x1f);	/* pps42 */
 
-	data = (dsc->tgt_offset_hi << 4);
+	data = ((dsc->tgt_offset_hi & 0xf) << 4);
 	data |= (dsc->tgt_offset_lo & 0x0f);
 	*bp++ = data;				/* pps43 */
 
 	for (i = 0; i < 14; i++)
-		*bp++ = dsc->buf_thresh[i];	/* pps44 - pps57 */
+		*bp++ = (dsc->buf_thresh[i] & 0xff);/* pps44 - pps57 */
 
 	for (i = 0; i < 15; i++) {		/* pps58 - pps87 */
 		data = (dsc->range_min_qp[i] & 0x1f); /* 5 bits */
@@ -196,10 +194,16 @@
 	int data;
 	int final_value, final_scale;
 	int slice_per_line, bytes_in_slice, total_bytes;
+	int version;
 
 	dsc = &pinfo->dsc;
+	version = (((dsc->major & 0xf) << 4) | (dsc->minor & 0xf));
+
 	dsc->rc_model_size = 8192;	/* rate_buffer_size */
-	dsc->first_line_bpg_offset = 12;
+	if (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;
@@ -211,8 +215,13 @@
 	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 (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;
 
 	dsc->pic_width = pinfo->xres;