vidc: Migrate to new ION cache ops API.

New cache ops API are provided thru ION interface
migrating the in kernel cache ops to use the
new cache ops API.

Change-Id: Idf152429316cec2eec8417d72160b7bd53488fc4
Signed-off-by: Deepak Kotur <dkotur@codeaurora.org>
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 b3aa486..8c86bae 100644
--- a/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
+++ b/drivers/video/msm/vidc/1080p/ddl/vcd_ddl_helper.c
@@ -256,13 +256,14 @@
 					 0x80808080,
 					frame[i].vcd_frm.alloc_len - luma_size);
 				if (frame[i].vcd_frm.ion_flag == CACHED) {
-					clean_and_invalidate_caches(
-					(unsigned long)frame[i].
+					msm_ion_do_cache_op(
+					ddl_context->video_ion_client,
+					frame[i].vcd_frm.buff_ion_handle,
+					(unsigned long *)frame[i].
 					vcd_frm.virtual,
 					(unsigned long)frame[i].
 					vcd_frm.alloc_len,
-					(unsigned long)frame[i].
-					vcd_frm.physical);
+					ION_IOC_CLEAN_INV_CACHES);
 				}
 			} else {
 				DDL_MSG_ERROR("luma size error");
diff --git a/drivers/video/msm/vidc/common/dec/vdec.c b/drivers/video/msm/vidc/common/dec/vdec.c
index 356a4ae..7fbad23 100644
--- a/drivers/video/msm/vidc/common/dec/vdec.c
+++ b/drivers/video/msm/vidc/common/dec/vdec.c
@@ -236,6 +236,7 @@
 	s32 buffer_index = -1;
 	enum vdec_picture pic_type;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	if (!client_ctx || !vcd_frame_data) {
 		ERR("vid_dec_input_frame_done() NULL pointer\n");
@@ -336,11 +337,14 @@
 	}
 	if (vcd_frame_data->data_len > 0) {
 		ion_flag = vidc_get_fd_info(client_ctx, BUFFER_TYPE_OUTPUT,
-				pmem_fd, kernel_vaddr, buffer_index);
+				pmem_fd, kernel_vaddr, buffer_index,
+				&buff_handle);
 		if (ion_flag == CACHED) {
-			invalidate_caches(kernel_vaddr,
+			msm_ion_do_cache_op(client_ctx->user_ion_client,
+					buff_handle,
+					(unsigned long *) kernel_vaddr,
 					(unsigned long)vcd_frame_data->data_len,
-					phy_addr);
+					ION_IOC_INV_CACHES);
 		}
 	}
 	mutex_lock(&client_ctx->msg_queue_lock);
@@ -1200,6 +1204,7 @@
 	s32 buffer_index = -1;
 	u32 vcd_status = VCD_ERR_FAIL;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	if (!client_ctx || !input_frame_info)
 		return false;
@@ -1232,11 +1237,14 @@
 						BUFFER_TYPE_INPUT,
 						pmem_fd,
 						kernel_vaddr,
-						buffer_index);
+						buffer_index,
+						&buff_handle);
 			if (ion_flag == CACHED) {
-				clean_caches(kernel_vaddr,
-				(unsigned long)vcd_input_buffer.data_len,
-				phy_addr);
+				msm_ion_do_cache_op(client_ctx->user_ion_client,
+				buff_handle,
+				(unsigned long *)kernel_vaddr,
+				(unsigned long) vcd_input_buffer.data_len,
+				ION_IOC_CLEAN_CACHES);
 			}
 		}
 		vcd_status = vcd_decode_frame(client_ctx->vcd_handle,
@@ -1263,6 +1271,7 @@
 	struct file *file;
 	s32 buffer_index = -1;
 	u32 vcd_status = VCD_ERR_FAIL;
+	struct ion_handle *buff_handle = NULL;
 
 	struct vcd_frame_data vcd_frame;
 
@@ -1284,7 +1293,9 @@
 		vcd_frame.ion_flag = vidc_get_fd_info(client_ctx,
 						 BUFFER_TYPE_OUTPUT,
 						pmem_fd, kernel_vaddr,
-						buffer_index);
+						buffer_index,
+						&buff_handle);
+		vcd_frame.buff_ion_handle = buff_handle;
 		vcd_status = vcd_fill_output_buffer(client_ctx->vcd_handle,
 						    &vcd_frame);
 		if (!vcd_status)
diff --git a/drivers/video/msm/vidc/common/enc/venc.c b/drivers/video/msm/vidc/common/enc/venc.c
index 3c25751..f983e25 100644
--- a/drivers/video/msm/vidc/common/enc/venc.c
+++ b/drivers/video/msm/vidc/common/enc/venc.c
@@ -198,6 +198,7 @@
 	struct file *file;
 	s32 buffer_index = -1;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	if (!client_ctx || !vcd_frame_data) {
 		ERR("vid_enc_input_frame_done() NULL pointer\n");
@@ -262,11 +263,14 @@
 	}
 	if (venc_msg->venc_msg_info.buf.len > 0) {
 		ion_flag = vidc_get_fd_info(client_ctx, BUFFER_TYPE_OUTPUT,
-					pmem_fd, kernel_vaddr, buffer_index);
+					pmem_fd, kernel_vaddr, buffer_index,
+					&buff_handle);
 		if (ion_flag == CACHED) {
-			clean_and_invalidate_caches(kernel_vaddr,
+			msm_ion_do_cache_op(client_ctx->user_ion_client,
+				buff_handle,
+				(unsigned long *) kernel_vaddr,
 				(unsigned long)venc_msg->venc_msg_info.buf.len,
-				phy_addr);
+				ION_IOC_CLEAN_INV_CACHES);
 		}
 	}
 	mutex_lock(&client_ctx->msg_queue_lock);
diff --git a/drivers/video/msm/vidc/common/enc/venc_internal.c b/drivers/video/msm/vidc/common/enc/venc_internal.c
index 37f1001..46dcaf4 100644
--- a/drivers/video/msm/vidc/common/enc/venc_internal.c
+++ b/drivers/video/msm/vidc/common/enc/venc_internal.c
@@ -1656,6 +1656,7 @@
 	struct file *file;
 	s32 buffer_index = -1;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	u32 vcd_status = VCD_ERR_FAIL;
 
@@ -1688,14 +1689,17 @@
 		vcd_input_buffer.flags = input_frame_info->flags;
 
 		ion_flag = vidc_get_fd_info(client_ctx, BUFFER_TYPE_INPUT,
-				pmem_fd, kernel_vaddr, buffer_index);
+				pmem_fd, kernel_vaddr, buffer_index,
+				&buff_handle);
 
 		if (vcd_input_buffer.data_len > 0) {
 			if (ion_flag == CACHED) {
-				clean_caches(
-				(unsigned long) vcd_input_buffer.virtual,
+				msm_ion_do_cache_op(
+				client_ctx->user_ion_client,
+				buff_handle,
+				(unsigned long *) vcd_input_buffer.virtual,
 				(unsigned long) vcd_input_buffer.data_len,
-				(phy_addr + input_frame_info->offset));
+				ION_IOC_CLEAN_CACHES);
 			}
 		}
 
diff --git a/drivers/video/msm/vidc/common/init/vidc_init.c b/drivers/video/msm/vidc/common/init/vidc_init.c
index cd128dd..5c647d2 100644
--- a/drivers/video/msm/vidc/common/init/vidc_init.c
+++ b/drivers/video/msm/vidc/common/init/vidc_init.c
@@ -366,7 +366,8 @@
 
 u32 vidc_get_fd_info(struct video_client_ctx *client_ctx,
 		enum buffer_dir buffer, int pmem_fd,
-		unsigned long kvaddr, int index)
+		unsigned long kvaddr, int index,
+		struct ion_handle **buff_handle)
 {
 	struct buf_addr_table *buf_addr_table;
 	u32 rc = 0;
@@ -377,9 +378,13 @@
 	else
 		buf_addr_table = client_ctx->output_buf_addr_table;
 	if (buf_addr_table[index].pmem_fd == pmem_fd) {
-		if (buf_addr_table[index].kernel_vaddr == kvaddr)
+		if (buf_addr_table[index].kernel_vaddr == kvaddr) {
 			rc = buf_addr_table[index].buff_ion_flag;
-	}
+			*buff_handle = buf_addr_table[index].buff_ion_handle;
+		} else
+			*buff_handle = NULL;
+	} else
+		*buff_handle = NULL;
 	return rc;
 }
 EXPORT_SYMBOL(vidc_get_fd_info);
diff --git a/drivers/video/msm/vidc/common/vcd/vcd_sub.c b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
index b5f643f..6f7e8d1 100644
--- a/drivers/video/msm/vidc/common/vcd/vcd_sub.c
+++ b/drivers/video/msm/vidc/common/vcd/vcd_sub.c
@@ -223,13 +223,15 @@
 }
 
 u32 vcd_get_ion_flag(struct video_client_ctx *client_ctx,
-			  unsigned long kernel_vaddr)
+			  unsigned long kernel_vaddr,
+			struct ion_handle **buff_ion_handle)
 {
 	unsigned long phy_addr, user_vaddr;
 	int pmem_fd;
 	struct file *file;
 	s32 buffer_index = -1;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	if (vidc_lookup_addr_table(client_ctx, BUFFER_TYPE_INPUT,
 					  false, &user_vaddr, &kernel_vaddr,
@@ -237,13 +239,17 @@
 					  &buffer_index)) {
 
 		ion_flag = vidc_get_fd_info(client_ctx, BUFFER_TYPE_INPUT,
-				pmem_fd, kernel_vaddr, buffer_index);
+				pmem_fd, kernel_vaddr, buffer_index,
+				&buff_handle);
+		*buff_ion_handle = buff_handle;
 		return ion_flag;
 	} else if (vidc_lookup_addr_table(client_ctx, BUFFER_TYPE_OUTPUT,
 		false, &user_vaddr, &kernel_vaddr, &phy_addr, &pmem_fd, &file,
 		&buffer_index)) {
 		ion_flag = vidc_get_fd_info(client_ctx, BUFFER_TYPE_OUTPUT,
-				pmem_fd, kernel_vaddr, buffer_index);
+				pmem_fd, kernel_vaddr, buffer_index,
+				&buff_handle);
+		*buff_ion_handle = buff_handle;
 		return ion_flag;
 	} else {
 		VCD_MSG_ERROR("Couldn't get ion flag");
@@ -588,6 +594,7 @@
 	struct vcd_buffer_entry *buf_entry;
 	u8 *physical;
 	u32 ion_flag = 0;
+	struct ion_handle *buff_handle = NULL;
 
 	buf_entry = vcd_find_buffer_pool_entry(buf_pool, buffer);
 	if (buf_entry) {
@@ -600,8 +607,8 @@
 		cctxt->client_data, (unsigned long)buffer);
 
 	ion_flag = vcd_get_ion_flag(cctxt->client_data,
-				(unsigned long)buffer);
-
+				(unsigned long)buffer,
+				&buff_handle);
 	if (!physical) {
 		VCD_MSG_ERROR("Couldn't get physical address");
 		return VCD_ERR_BAD_POINTER;
@@ -625,6 +632,7 @@
 	buf_entry->frame.virtual = buf_entry->virtual;
 	buf_entry->frame.physical = buf_entry->physical;
 	buf_entry->frame.ion_flag = ion_flag;
+	buf_entry->frame.buff_ion_handle = buff_handle;
 
 	buf_pool->validated++;
 
diff --git a/include/media/msm/vcd_api.h b/include/media/msm/vcd_api.h
index 8bb2558..6304c93 100644
--- a/include/media/msm/vcd_api.h
+++ b/include/media/msm/vcd_api.h
@@ -70,6 +70,7 @@
 	u32 intrlcd_ip_frm_tag;
 	u8 *desc_buf;
 	u32 desc_size;
+	struct ion_handle *buff_ion_handle;
 };
 
 struct vcd_sequence_hdr {
diff --git a/include/media/msm/vidc_init.h b/include/media/msm/vidc_init.h
index 4e28c74..3084962 100644
--- a/include/media/msm/vidc_init.h
+++ b/include/media/msm/vidc_init.h
@@ -67,7 +67,8 @@
 void vidc_release_firmware(void);
 u32 vidc_get_fd_info(struct video_client_ctx *client_ctx,
 		enum buffer_dir buffer, int pmem_fd,
-		unsigned long kvaddr, int index);
+		unsigned long kvaddr, int index,
+		struct ion_handle **buff_handle);
 u32 vidc_lookup_addr_table(struct video_client_ctx *client_ctx,
 	enum buffer_dir buffer, u32 search_with_user_vaddr,
 	unsigned long *user_vaddr, unsigned long *kernel_vaddr,