msm:vidc: Add the support for MPEG-2 extension and user data

Support is added for MPEG-2 extension and user data. With this
changes Core returns extension and user data as an extradata.

Change-Id: Icdb9da359d90799391b5b9751df2e735ff93475e
Signed-off-by: Shobhit Pandey <cshopan@codeaurora.org>
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
index 0c6aa86..69d71d9 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl.h
@@ -171,6 +171,7 @@
 	u32  sz_desc;
 	u32  sz_cpb;
 	u32  sz_context;
+	u32  sz_extnuserdata;
 };
 struct ddl_dec_buffers{
 	struct ddl_buf_addr desc;
@@ -186,6 +187,7 @@
 	struct ddl_buf_addr h264_vert_nb_mv;
 	struct ddl_buf_addr h264_nb_ip;
 	struct ddl_buf_addr context;
+	struct ddl_buf_addr extnuserdata;
 };
 struct ddl_enc_buffer_size{
 	u32  sz_cur_y;
@@ -230,6 +232,17 @@
 	u32 out_frm_next_frmindex;
 	u32  first_output_frame_tag;
 };
+struct ddl_mp2_datadumpenabletype {
+	u32 userdatadump_enable;
+	u32 pictempscalable_extdump_enable;
+	u32 picspat_extdump_enable;
+	u32 picdisp_extdump_enable;
+	u32 copyright_extdump_enable;
+	u32 quantmatrix_extdump_enable;
+	u32 seqscalable_extdump_enable;
+	u32 seqdisp_extdump_enable;
+	u32 seq_extdump_enable;
+};
 struct ddl_encoder_data{
 	struct ddl_codec_data_hdr   hdr;
 	struct vcd_property_codec   codec;
@@ -323,6 +336,9 @@
 	u32  dmx_disable;
 	int avg_dec_time;
 	int dec_time_sum;
+	struct ddl_mp2_datadumpenabletype mp2_datadump_enable;
+	u32 mp2_datadump_status;
+	u32 extn_user_data_enable;
 };
 union ddl_codec_data{
 	struct ddl_codec_data_hdr  hdr;
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
index 949e5c0..95be1b6 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
@@ -533,6 +533,7 @@
 	ddl_pmem_free(&dec_bufs->stx_parser);
 	ddl_pmem_free(&dec_bufs->desc);
 	ddl_pmem_free(&dec_bufs->context);
+	ddl_pmem_free(&dec_bufs->extnuserdata);
 	memset(dec_bufs, 0, sizeof(struct ddl_dec_buffers));
 }
 
@@ -601,6 +602,7 @@
 	u32 sz_sub_anchor_mv = 0, sz_overlap_xform = 0, sz_bit_plane3 = 0;
 	u32 sz_bit_plane2 = 0, sz_bit_plane1 = 0, sz_stx_parser = 0;
 	u32 sz_desc, sz_cpb, sz_context, sz_vert_nb_mv = 0, sz_nb_ip = 0;
+	u32 sz_extnuserdata = 0;
 
 	if (codec == VCD_CODEC_H264) {
 		sz_mv = ddl_get_yuv_buf_size(width,
@@ -630,7 +632,8 @@
 			sz_bit_plane3 = DDL_KILO_BYTE(2);
 			sz_bit_plane2 = DDL_KILO_BYTE(2);
 			sz_bit_plane1 = DDL_KILO_BYTE(2);
-		}
+		} else if (codec == VCD_CODEC_MPEG2)
+			sz_extnuserdata = DDL_KILO_BYTE(2);
 	}
 	sz_desc = DDL_KILO_BYTE(128);
 	sz_cpb = VCD_DEC_CPB_SIZE;
@@ -657,6 +660,7 @@
 		buf_size->sz_desc           = sz_desc;
 		buf_size->sz_cpb            = sz_cpb;
 		buf_size->sz_context        = sz_context;
+		buf_size->sz_extnuserdata   = sz_extnuserdata;
 	}
 }
 
@@ -774,6 +778,16 @@
 			}
 		}
 	}
+	if (buf_size.sz_extnuserdata > 0) {
+		dec_bufs->extnuserdata.mem_type = DDL_FW_MEM;
+		ptr = ddl_pmem_alloc(&dec_bufs->extnuserdata,
+				buf_size.sz_extnuserdata, DDL_KILO_BYTE(2));
+		if (!ptr)
+			goto fail_free_exit;
+		else
+			memset(dec_bufs->extnuserdata.align_virtual_addr,
+				0, buf_size.sz_extnuserdata);
+	}
 	return status;
 fail_free_exit:
 	status = VCD_ERR_ALLOC_FAIL;
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c
index 8ec444f..b047505 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_interrupt_handler.c
@@ -256,6 +256,10 @@
 		DDL_MSG_LOW("HEADER_DONE");
 		vidc_1080p_get_decode_seq_start_result(&seq_hdr_info);
 		parse_hdr_size_data(ddl, &seq_hdr_info);
+		decoder->mp2_datadump_status = 0;
+		vidc_sm_get_mp2datadump_status(&ddl->shared_mem
+			[ddl->command_channel],
+			&decoder->mp2_datadump_status);
 		if (res_trk_get_disable_fullhd() &&
 			(seq_hdr_info.img_size_x * seq_hdr_info.img_size_y >
 				1280 * 720)) {
@@ -1205,6 +1209,10 @@
 		vidc_sm_get_metadata_status(&ddl->shared_mem
 			[ddl->command_channel],
 			&decoder->meta_data_exists);
+		decoder->mp2_datadump_status = 0;
+		vidc_sm_get_mp2datadump_status(&ddl->shared_mem
+			[ddl->command_channel],
+			&decoder->mp2_datadump_status);
 		if (decoder->output_order == VCD_DEC_ORDER_DISPLAY) {
 			vidc_sm_get_frame_tags(&ddl->shared_mem
 				[ddl->command_channel],
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
index fade821..f70c47c 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.c
@@ -52,6 +52,12 @@
 		case VCD_METADATA_QCOMFILLER:
 			skip_words = 21;
 		break;
+		case VCD_METADATA_USER_DATA:
+			skip_words = 27;
+		break;
+		case VCD_METADATA_EXT_DATA:
+			skip_words = 30;
+		break;
 		}
 	} else {
 		buffer = (u32 *) ddl->codec_data.encoder.meta_data_input.
@@ -123,6 +129,18 @@
 		hdr_entry[DDL_METADATA_HDR_PORT_INDEX] = 1;
 		hdr_entry[DDL_METADATA_HDR_TYPE_INDEX] =
 			VCD_METADATA_PASSTHROUGH;
+		hdr_entry = ddl_metadata_hdr_entry(ddl,
+			VCD_METADATA_USER_DATA);
+		hdr_entry[DDL_METADATA_HDR_VERSION_INDEX] = 0x00000101;
+		hdr_entry[DDL_METADATA_HDR_PORT_INDEX] = 1;
+		hdr_entry[DDL_METADATA_HDR_TYPE_INDEX] =
+			VCD_METADATA_USER_DATA;
+		hdr_entry = ddl_metadata_hdr_entry(ddl,
+			VCD_METADATA_EXT_DATA);
+		hdr_entry[DDL_METADATA_HDR_VERSION_INDEX] = 0x00000101;
+		hdr_entry[DDL_METADATA_HDR_PORT_INDEX] = 1;
+		hdr_entry[DDL_METADATA_HDR_TYPE_INDEX] =
+			VCD_METADATA_EXT_DATA;
 	} else {
 		hdr_entry = ddl_metadata_hdr_entry(ddl, VCD_METADATA_ENC_SLICE);
 		hdr_entry[DDL_METADATA_HDR_VERSION_INDEX] = 0x00000101;
@@ -146,6 +164,9 @@
 		else if (codec == VCD_CODEC_VC1 ||
 			codec == VCD_CODEC_VC1_RCV)
 			flag |= VCD_METADATA_VC1;
+		else if (codec == VCD_CODEC_MPEG2)
+			flag |= (VCD_METADATA_USER_DATA |
+				VCD_METADATA_EXT_DATA);
 	} else
 		flag |= VCD_METADATA_ENC_SLICE;
 	return flag;
@@ -165,7 +186,6 @@
 {
 	u32 flag = decoder->meta_data_enable_flag;
 	u32 suffix = 0, size = 0;
-
 	if (!flag) {
 		decoder->suffix = 0;
 		return;
@@ -210,6 +230,18 @@
 		DDL_METADATA_ALIGNSIZE(size);
 		suffix += (size);
 	}
+	if (flag & VCD_METADATA_USER_DATA) {
+		size = DDL_METADATA_HDR_SIZE;
+		size += DDL_METADATA_USER_PAYLOAD_SIZE;
+		DDL_METADATA_ALIGNSIZE(size);
+		suffix += (size);
+	}
+	if (flag & VCD_METADATA_EXT_DATA) {
+		size = DDL_METADATA_HDR_SIZE;
+		size += DDL_METADATA_EXT_PAYLOAD_SIZE;
+		DDL_METADATA_ALIGNSIZE(size);
+		suffix += (size);
+	}
 	size = DDL_METADATA_EXTRADATANONE_SIZE;
 	DDL_METADATA_ALIGNSIZE(size);
 	suffix += (size);
@@ -278,6 +310,10 @@
 			if (flag)
 				flag |= DDL_METADATA_MANDATORY;
 			if (*meta_data_enable_flag != flag) {
+				if (VCD_CODEC_MPEG2 == codec)
+					ddl_set_mp2_dump_default(
+						&ddl->codec_data.decoder,
+						flag);
 				*meta_data_enable_flag = flag;
 				if (ddl->decoding)
 					ddl_set_default_decoder_buffer_req(
@@ -357,6 +393,7 @@
 	u32 qp_enable = false, concealed_mb_enable = false;
 	u32 vc1_param_enable = false, sei_nal_enable = false;
 	u32 vui_enable = false, enc_slice_size_enable = false;
+	u32 mp2_data_dump_enable = false;
 
 	if (ddl->decoding)
 		flag = ddl->codec_data.decoder.meta_data_enable_flag;
@@ -380,10 +417,22 @@
 	}
 
 	DDL_MSG_LOW("metadata enable flag : %d", sei_nal_enable);
+	if (flag & VCD_METADATA_EXT_DATA || flag & VCD_METADATA_USER_DATA) {
+		mp2_data_dump_enable = true;
+		ddl->codec_data.decoder.extn_user_data_enable =
+				mp2_data_dump_enable;
+		vidc_sm_set_mp2datadump_enable(&ddl->shared_mem
+		[ddl->command_channel],
+		&ddl->codec_data.decoder.mp2_datadump_enable);
+	} else {
+		mp2_data_dump_enable = false;
+		ddl->codec_data.decoder.extn_user_data_enable =
+				mp2_data_dump_enable;
+	}
 	vidc_sm_set_metadata_enable(&ddl->shared_mem
 		[ddl->command_channel], extradata_enable, qp_enable,
 		concealed_mb_enable, vc1_param_enable, sei_nal_enable,
-		vui_enable, enc_slice_size_enable);
+		vui_enable, enc_slice_size_enable, mp2_data_dump_enable);
 }
 
 u32 ddl_vidc_encode_set_metadata_output_buf(struct ddl_client_context *ddl)
@@ -487,6 +536,11 @@
 		output_frame->flags &= ~(VCD_FRAME_FLAG_EXTRADATA);
 		return;
 	}
+	if (!decoder->mp2_datadump_status && decoder->codec.codec ==
+		VCD_CODEC_MPEG2 && !decoder->extn_user_data_enable) {
+		output_frame->flags &= ~(VCD_FRAME_FLAG_EXTRADATA);
+		return;
+	}
 	DDL_MSG_LOW("processing metadata for decoder");
 	DDL_MSG_LOW("data_len/metadata_offset : %d/%d",
 		output_frame->data_len, decoder->meta_data_offset);
@@ -507,3 +561,27 @@
 		*qfiller = (u32)(qfiller_size - DDL_METADATA_HDR_SIZE);
 	}
 }
+
+void ddl_set_mp2_dump_default(struct ddl_decoder_data *decoder, u32 flag)
+{
+
+	if (flag & VCD_METADATA_EXT_DATA) {
+		decoder->mp2_datadump_enable.pictempscalable_extdump_enable =
+			true;
+		decoder->mp2_datadump_enable.picspat_extdump_enable = true;
+		decoder->mp2_datadump_enable.picdisp_extdump_enable = true;
+		decoder->mp2_datadump_enable.copyright_extdump_enable = true;
+		decoder->mp2_datadump_enable.quantmatrix_extdump_enable =
+			true;
+		decoder->mp2_datadump_enable.seqscalable_extdump_enable =
+			true;
+		decoder->mp2_datadump_enable.seqdisp_extdump_enable = true;
+		decoder->mp2_datadump_enable.seq_extdump_enable = true;
+	}
+	if (flag & VCD_METADATA_USER_DATA)
+		decoder->mp2_datadump_enable.userdatadump_enable =
+				DDL_METADATA_USER_DUMP_FULL_MODE;
+	else
+		decoder->mp2_datadump_enable.userdatadump_enable =
+				DDL_METADATA_USER_DUMP_DISABLE_MODE;
+}
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
index c63b6a9..e03a9b7 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_metadata.h
@@ -14,7 +14,7 @@
 #ifndef _VCD_DDL_METADATA_H_
 #define _VCD_DDL_METADATA_H_
 
-#define DDL_MAX_DEC_METADATATYPE          8
+#define DDL_MAX_DEC_METADATATYPE          10
 #define DDL_MAX_ENC_METADATATYPE          3
 #define DDL_METADATA_EXTRAPAD_SIZE      256
 #define DDL_METADATA_HDR_SIZE            20
@@ -27,6 +27,8 @@
 #define DDL_METADATA_SEI_MAX                     5
 #define DDL_METADATA_VUI_PAYLOAD_SIZE          256
 #define DDL_METADATA_PASSTHROUGH_PAYLOAD_SIZE   68
+#define DDL_METADATA_EXT_PAYLOAD_SIZE         (640)
+#define DDL_METADATA_USER_PAYLOAD_SIZE        (2048)
 #define DDL_METADATA_CLIENT_INPUTBUFSIZE       256
 #define DDL_METADATA_TOTAL_INPUTBUFSIZE \
 	(DDL_METADATA_CLIENT_INPUTBUFSIZE * VCD_MAX_NO_CLIENT)
@@ -46,6 +48,10 @@
 #define DDL_METADATA_HDR_PORT_INDEX    1
 #define DDL_METADATA_HDR_TYPE_INDEX    2
 
+#define DDL_METADATA_USER_DUMP_DISABLE_MODE 0
+#define DDL_METADATA_USER_DUMP_OFFSET_MODE  1
+#define DDL_METADATA_USER_DUMP_FULL_MODE    2
+
 void ddl_set_default_meta_data_hdr(struct ddl_client_context *ddl);
 u32 ddl_get_metadata_params(struct ddl_client_context *ddl,
 	struct vcd_property_hdr *property_hdr, void *property_value);
@@ -62,5 +68,6 @@
 void ddl_vidc_decode_set_metadata_output(struct ddl_decoder_data *decoder);
 void ddl_process_encoder_metadata(struct ddl_client_context *ddl);
 void ddl_process_decoder_metadata(struct ddl_client_context *ddl);
+void ddl_set_mp2_dump_default(struct ddl_decoder_data *decoder, u32 flag);
 
 #endif
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c
index d83cde8..416b497 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.c
@@ -187,6 +187,8 @@
 
 
 #define VIDC_SM_METADATA_ENABLE_ADDR                 0x0038
+#define VIDC_SM_METADATA_ENABLE_MP2_DATADUMP_BMSK    0x00000200
+#define VIDC_SM_METADATA_ENABLE_MP2_DATADUMP_SHFT    9
 #define VIDC_SM_METADATA_ENABLE_EXTRADATA_BMSK       0x40
 #define VIDC_SM_METADATA_ENABLE_EXTRADATA_SHFT       6
 #define VIDC_SM_METADATA_ENABLE_ENC_SLICE_SIZE_BMSK  0x20
@@ -251,6 +253,51 @@
 #define VIDC_SM_TIMEOUT_VALUE_BMSK        0xffffffff
 #define VIDC_SM_TIMEOUT_VALUE_SHFT        0
 
+#define VIDC_SM_MP2_DATA_DUMP_CONTROL_ADDR                        0x0194
+#define VIDC_SM_MP2_USERDATA_DUMP_ENABLE_BMSK                     0x00000300
+#define VIDC_SM_MP2_USERDATA_DUMP_ENABLE_SHFT                     8
+#define VIDC_SM_MP2_PICT_TEMP_DUMP_ENABLE_BMSK                    0x00000080
+#define VIDC_SM_MP2_PICT_TEMP_DUMP_ENABLE_SHFT                    7
+#define VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_ENABLE_BMSK                0x00000040
+#define VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_ENABLE_SHFT                6
+#define VIDC_SM_MP2_PICT_DISP_EXT_DUMP_ENABLE_BMSK                0x00000020
+#define VIDC_SM_MP2_PICT_DISP_EXT_DUMP_ENABLE_SHFT                5
+#define VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_ENABLE_BMSK                0x00000010
+#define VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_ENABLE_SHFT                4
+#define VIDC_SM_MP2_QMATRIX_EXT_DUMP_ENABLE_BMSK                  0x00000008
+#define VIDC_SM_MP2_QMATRIX_EXT_DUMP_ENABLE_SHFT                  3
+#define VIDC_SM_MP2_SCAL_EXT_DUMP_ENABLE_BMSK                     0x00000004
+#define VIDC_SM_MP2_SCAL_EXT_DUMP_ENABLE_SHFT                     2
+#define VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_ENABLE_BMSK                 0x00000002
+#define VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_ENABLE_SHFT                 1
+#define VIDC_SM_MP2_SEQ_EXT_DUMP_ENABLE_BMSK                      0x00000001
+#define VIDC_SM_MP2_SEQ_EXT_DUMP_ENABLE_SHFT                      0
+
+#define VIDC_SM_MP2_DATA_DUMP_STATUS_ADDR                         0x0198
+#define VIDC_SM_MP2_USERDATA_DUMP_STATUS_BMSK                     0x00000300
+#define VIDC_SM_MP2_USERDATA_DUMP_STATUS_SHFT                     8
+#define VIDC_SM_MP2_PICT_TEMP_DUMP_STATUS_BMSK                    0x00000080
+#define VIDC_SM_MP2_PICT_TEMP_DUMP_STATUS_SHFT                    7
+#define VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_STATUS_BMSK                0x00000040
+#define VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_STATUS_SHFT                6
+#define VIDC_SM_MP2_PICT_DISP_EXT_DUMP_STATUS_BMSK                0x00000020
+#define VIDC_SM_MP2_PICT_DISP_EXT_DUMP_STATUS_SHFT                5
+#define VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_STATUS_BMSK                0x00000010
+#define VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_STATUS_SHFT                4
+#define VIDC_SM_MP2_QMATRIX_EXT_DUMP_STATUS_BMSK                  0x00000008
+#define VIDC_SM_MP2_QMATRIX_EXT_DUMP_STATUS_SHFT                  3
+#define VIDC_SM_MP2_SCAL_EXT_DUMP_STATUS_BMSK                     0x00000004
+#define VIDC_SM_MP2_SCAL_EXT_DUMP_STATUS_SHFT                     2
+#define VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_STATUS_BMSK                 0x00000002
+#define VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_STATUS_SHFT                 1
+#define VIDC_SM_MP2_SEQ_EXT_DUMP_STATUS_BMSK                      0x00000001
+#define VIDC_SM_MP2_SEQ_EXT_DUMP_STATUS_SHFT                      0
+
+#define VIDC_SM_MP2_DATA_DUMP_BUFFER_ADDR                         0x01a4
+#define VIDC_SM_MP2_DATA_DUMP_BUFFER_SIZE_ADDR                    0x01a8
+
+
+
 #define VIDC_SM_ENC_EXT_CTRL_CLOSED_GOP_ENABLE_BMSK	0x40
 #define VIDC_SM_ENC_EXT_CTRL_CLOSED_GOP_ENABLE_SHFT	6
 
@@ -579,11 +626,14 @@
 void vidc_sm_set_metadata_enable(struct ddl_buf_addr *shared_mem,
 	u32 extradata_enable, u32 qp_enable, u32 concealed_mb_enable,
 	u32 vc1Param_enable, u32 sei_nal_enable, u32 vui_enable,
-	u32 enc_slice_size_enable)
+	u32 enc_slice_size_enable, u32 mp2_data_dump_enable)
 {
 	u32 metadata_enable;
 
-	metadata_enable = VIDC_SETFIELD((extradata_enable) ? 1 : 0,
+	metadata_enable = VIDC_SETFIELD((mp2_data_dump_enable) ? 1 : 0,
+				VIDC_SM_METADATA_ENABLE_MP2_DATADUMP_SHFT,
+				VIDC_SM_METADATA_ENABLE_MP2_DATADUMP_BMSK) |
+				VIDC_SETFIELD((extradata_enable) ? 1 : 0,
 				VIDC_SM_METADATA_ENABLE_EXTRADATA_SHFT,
 				VIDC_SM_METADATA_ENABLE_EXTRADATA_BMSK) |
 				VIDC_SETFIELD((enc_slice_size_enable) ? 1 : 0,
@@ -1015,3 +1065,71 @@
 			timeout);
 }
 
+void vidc_sm_set_mp2datadump_enable(struct ddl_buf_addr *shared_mem,
+	struct ddl_mp2_datadumpenabletype *ddl_mp2_datadump_enable)
+{
+	u32 mp2_datadump_enable = 0;
+
+	mp2_datadump_enable = VIDC_SETFIELD(
+				ddl_mp2_datadump_enable->userdatadump_enable,
+				VIDC_SM_MP2_USERDATA_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_USERDATA_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				pictempscalable_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_PICT_TEMP_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_PICT_TEMP_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				picspat_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_PICT_SPAT_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				picdisp_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_PICT_DISP_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_PICT_DISP_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				copyright_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_COPYRIGHT_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				quantmatrix_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_QMATRIX_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_QMATRIX_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				seqscalable_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_SCAL_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_SCAL_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				seqdisp_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_SEQ_DISP_EXT_DUMP_ENABLE_BMSK) |
+				VIDC_SETFIELD(ddl_mp2_datadump_enable->
+				seq_extdump_enable ? 1 : 0,
+				VIDC_SM_MP2_SEQ_EXT_DUMP_ENABLE_SHFT,
+				VIDC_SM_MP2_SEQ_EXT_DUMP_ENABLE_BMSK);
+	DDL_MEM_WRITE_32(shared_mem, VIDC_SM_MP2_DATA_DUMP_CONTROL_ADDR,
+			mp2_datadump_enable);
+
+}
+
+void vidc_sm_get_mp2datadump_status(struct ddl_buf_addr
+		*shared_mem, u32 *ext_userdata_present)
+{
+	u32 status;
+
+	status = DDL_MEM_READ_32(shared_mem,
+			VIDC_SM_MP2_DATA_DUMP_STATUS_ADDR);
+	*ext_userdata_present = (u32) VIDC_GETFIELD(status,
+				VIDC_SM_MP2_USERDATA_DUMP_STATUS_BMSK,
+				VIDC_SM_MP2_USERDATA_DUMP_STATUS_SHFT);
+}
+
+void vidc_sm_set_mp2datadumpbuffer(struct ddl_buf_addr *shared_mem,
+		u32 mp2datadumpaddr, u32 mp2datadumpsize)
+{
+	DDL_MEM_WRITE_32(shared_mem,
+			VIDC_SM_MP2_DATA_DUMP_BUFFER_ADDR,
+			mp2datadumpaddr);
+	DDL_MEM_WRITE_32(shared_mem,
+			VIDC_SM_MP2_DATA_DUMP_BUFFER_SIZE_ADDR,
+			mp2datadumpsize);
+}
diff --git a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.h b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.h
index 1a46c36..9cb1933 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.h
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_shared_mem.h
@@ -139,7 +139,7 @@
 void vidc_sm_set_metadata_enable(struct ddl_buf_addr *shared_mem,
 	u32 extradata_enable, u32 qp_enable, u32 concealed_mb_enable,
 	u32 vc1Param_enable, u32 sei_nal_enable, u32 vui_enable,
-	u32 enc_slice_size_enable);
+	u32 enc_slice_size_enable, u32 mp2_data_dump_enable);
 void vidc_sm_get_metadata_status(struct ddl_buf_addr *shared_mem,
 	u32 *pb_metadata_present);
 void vidc_sm_get_metadata_display_index(struct ddl_buf_addr *shared_mem,
@@ -193,4 +193,11 @@
 	u32 *output_buffer_size);
 void vidc_sm_set_video_core_timeout_value(struct ddl_buf_addr *shared_mem,
 	u32 timeout);
+void vidc_sm_get_mp2datadump_status(struct ddl_buf_addr
+		*shared_mem, u32 *ext_userdata_present);
+void vidc_sm_set_mp2datadump_enable(struct ddl_buf_addr *shared_mem,
+	struct ddl_mp2_datadumpenabletype *ddl_mp2_datadump_enable);
+void vidc_sm_set_mp2datadumpbuffer(struct ddl_buf_addr *shared_mem,
+		u32 mp2datadumpaddr, u32 mp2datadumpsize);
+
 #endif
diff --git a/include/linux/msm_vidc_dec.h b/include/linux/msm_vidc_dec.h
index 3d8907a..3c99562 100644
--- a/include/linux/msm_vidc_dec.h
+++ b/include/linux/msm_vidc_dec.h
@@ -76,6 +76,9 @@
 #define VDEC_EXTRADATA_VUI 0x020
 #define VDEC_EXTRADATA_VC1 0x040
 
+#define VDEC_EXTRADATA_EXT_DATA          0x0800
+#define VDEC_EXTRADATA_USER_DATA         0x1000
+
 #define VDEC_CMDBASE	0x800
 #define VDEC_CMD_SET_INTF_VERSION	(VDEC_CMDBASE)
 
diff --git a/include/media/msm/vcd_property.h b/include/media/msm/vcd_property.h
index acd0fa3..484d08f 100644
--- a/include/media/msm/vcd_property.h
+++ b/include/media/msm/vcd_property.h
@@ -113,6 +113,9 @@
 #define VCD_METADATA_PASSTHROUGH    0x080
 #define VCD_METADATA_ENC_SLICE      0x100
 
+#define VCD_METADATA_EXT_DATA       0x0800
+#define VCD_METADATA_USER_DATA      0x1000
+
 struct vcd_property_meta_data_enable {
 	u32 meta_data_enable_flag;
 };