Loading drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +60 −30 Original line number Diff line number Diff line Loading @@ -359,43 +359,42 @@ static unsigned long msm_cpp_fetch_buffer_info(struct cpp_device *cpp_dev, return phy_addr; } static int32_t msm_cpp_enqueue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_stream_buff_info_t *stream_buff_info) static int32_t msm_cpp_dequeue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info) { uint32_t j; struct msm_cpp_buff_queue_info_t *buff_queue_info; struct msm_cpp_buffer_map_list_t *buff, *save; struct list_head *buff_head; buff_queue_info = msm_cpp_get_buff_queue_entry(cpp_dev, (stream_buff_info->identity >> 16) & 0xFFFF, stream_buff_info->identity & 0xFFFF); if (buff_queue_info == NULL) { pr_err("error finding buffer queue entry for sessid:%d strmid:%d\n", (stream_buff_info->identity >> 16) & 0xFFFF, stream_buff_info->identity & 0xFFFF); return -EINVAL; buff_head = &buff_queue_info->native_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } for (j = 0; j < stream_buff_info->num_buffs; j++) { msm_cpp_queue_buffer_info(cpp_dev, buff_queue_info, &stream_buff_info->buffer_info[j]); buff_head = &buff_queue_info->vb2_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } return 0; } static int32_t msm_cpp_dequeue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info) static int32_t msm_cpp_dequeue_buff(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info, uint32_t buff_index, uint8_t native_buff) { struct msm_cpp_buffer_map_list_t *buff, *save; struct list_head *buff_head; if (native_buff) buff_head = &buff_queue_info->native_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } else buff_head = &buff_queue_info->vb2_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { if (buff->map_info.buff_info.index == buff_index) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); break; } } return 0; Loading Loading @@ -1839,8 +1838,10 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, CPP_DBG("VIDIOC_MSM_CPP_FLUSH_QUEUE\n"); rc = msm_cpp_flush_frames(cpp_dev); break; case VIDIOC_MSM_CPP_DELETE_STREAM_BUFF: case VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO: case VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO: { uint32_t j; struct msm_cpp_stream_buff_info_t *u_stream_buff_info; struct msm_cpp_stream_buff_info_t k_stream_buff_info; struct msm_cpp_buff_queue_info_t *buff_queue_info; Loading Loading @@ -1917,10 +1918,40 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, (k_stream_buff_info.identity & 0xFFFF)); } if (!rc) rc = msm_cpp_enqueue_buff_info_list(cpp_dev, &k_stream_buff_info); if (rc) goto STREAM_BUFF_END; if (buff_queue_info == NULL) { cpp_dev->stream_cnt++; CPP_DBG("stream_cnt:%d\n", cpp_dev->stream_cnt); } buff_queue_info = msm_cpp_get_buff_queue_entry(cpp_dev, ((k_stream_buff_info.identity >> 16) & 0xFFFF), (k_stream_buff_info.identity & 0xFFFF)); if (buff_queue_info == NULL) { pr_err("error finding buffer queue entry identity:%d\n", k_stream_buff_info.identity); kfree(k_stream_buff_info.buffer_info); kfree(u_stream_buff_info); cpp_dev->stream_cnt--; mutex_unlock(&cpp_dev->mutex); return -EINVAL; } if (VIDIOC_MSM_CPP_DELETE_STREAM_BUFF == cmd) { for (j = 0; j < k_stream_buff_info.num_buffs; j++) { msm_cpp_dequeue_buff(cpp_dev, buff_queue_info, k_stream_buff_info.buffer_info[j].index, k_stream_buff_info.buffer_info[j].native_buff); } } else { for (j = 0; j < k_stream_buff_info.num_buffs; j++) { msm_cpp_queue_buffer_info(cpp_dev, buff_queue_info, &k_stream_buff_info.buffer_info[j]); } } STREAM_BUFF_END: kfree(k_stream_buff_info.buffer_info); kfree(u_stream_buff_info); if (cpp_dev->stream_cnt == 0) { Loading @@ -1929,10 +1960,6 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, msm_cpp_clean_queue(cpp_dev); } if (buff_queue_info == NULL) { cpp_dev->stream_cnt++; CPP_DBG("stream_cnt:%d\n", cpp_dev->stream_cnt); } break; } case VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO: { Loading Loading @@ -2511,6 +2538,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, break; case VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO32: case VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32: case VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32: { struct msm_cpp_stream_buff_info32_t *u32_cpp_buff_info = (struct msm_cpp_stream_buff_info32_t *)kp_ioctl.ioctl_ptr; Loading @@ -2531,6 +2559,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, } if (cmd == VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32) cmd = VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO; else if (cmd == VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32) cmd = VIDIOC_MSM_CPP_DELETE_STREAM_BUFF; else cmd = VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO; break; Loading include/media/msmb_pproc.h +6 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,9 @@ struct msm_cpp_clock_settings_t { #define VIDIOC_MSM_CPP_IOMMU_DETACH \ _IOWR('V', BASE_VIDIOC_PRIVATE + 19, struct msm_camera_v4l2_ioctl_t) #define VIDIOC_MSM_CPP_DELETE_STREAM_BUFF\ _IOWR('V', BASE_VIDIOC_PRIVATE + 20, struct msm_camera_v4l2_ioctl_t) #define V4L2_EVENT_CPP_FRAME_DONE (V4L2_EVENT_PRIVATE_START + 0) #define V4L2_EVENT_VPE_FRAME_DONE (V4L2_EVENT_PRIVATE_START + 1) Loading Loading @@ -418,6 +421,9 @@ struct cpp_hw_info_32_t { #define VIDIOC_MSM_CPP_IOMMU_DETACH32 \ _IOWR('V', BASE_VIDIOC_PRIVATE + 19, struct msm_camera_v4l2_ioctl32_t) #define VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32\ _IOWR('V', BASE_VIDIOC_PRIVATE + 20, struct msm_camera_v4l2_ioctl32_t) struct msm_camera_v4l2_ioctl32_t { uint32_t id; uint32_t len; Loading Loading
drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +60 −30 Original line number Diff line number Diff line Loading @@ -359,43 +359,42 @@ static unsigned long msm_cpp_fetch_buffer_info(struct cpp_device *cpp_dev, return phy_addr; } static int32_t msm_cpp_enqueue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_stream_buff_info_t *stream_buff_info) static int32_t msm_cpp_dequeue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info) { uint32_t j; struct msm_cpp_buff_queue_info_t *buff_queue_info; struct msm_cpp_buffer_map_list_t *buff, *save; struct list_head *buff_head; buff_queue_info = msm_cpp_get_buff_queue_entry(cpp_dev, (stream_buff_info->identity >> 16) & 0xFFFF, stream_buff_info->identity & 0xFFFF); if (buff_queue_info == NULL) { pr_err("error finding buffer queue entry for sessid:%d strmid:%d\n", (stream_buff_info->identity >> 16) & 0xFFFF, stream_buff_info->identity & 0xFFFF); return -EINVAL; buff_head = &buff_queue_info->native_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } for (j = 0; j < stream_buff_info->num_buffs; j++) { msm_cpp_queue_buffer_info(cpp_dev, buff_queue_info, &stream_buff_info->buffer_info[j]); buff_head = &buff_queue_info->vb2_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } return 0; } static int32_t msm_cpp_dequeue_buff_info_list(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info) static int32_t msm_cpp_dequeue_buff(struct cpp_device *cpp_dev, struct msm_cpp_buff_queue_info_t *buff_queue_info, uint32_t buff_index, uint8_t native_buff) { struct msm_cpp_buffer_map_list_t *buff, *save; struct list_head *buff_head; if (native_buff) buff_head = &buff_queue_info->native_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); } else buff_head = &buff_queue_info->vb2_buff_head; list_for_each_entry_safe(buff, save, buff_head, entry) { if (buff->map_info.buff_info.index == buff_index) { msm_cpp_dequeue_buffer_info(cpp_dev, buff); break; } } return 0; Loading Loading @@ -1839,8 +1838,10 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, CPP_DBG("VIDIOC_MSM_CPP_FLUSH_QUEUE\n"); rc = msm_cpp_flush_frames(cpp_dev); break; case VIDIOC_MSM_CPP_DELETE_STREAM_BUFF: case VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO: case VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO: { uint32_t j; struct msm_cpp_stream_buff_info_t *u_stream_buff_info; struct msm_cpp_stream_buff_info_t k_stream_buff_info; struct msm_cpp_buff_queue_info_t *buff_queue_info; Loading Loading @@ -1917,10 +1918,40 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, (k_stream_buff_info.identity & 0xFFFF)); } if (!rc) rc = msm_cpp_enqueue_buff_info_list(cpp_dev, &k_stream_buff_info); if (rc) goto STREAM_BUFF_END; if (buff_queue_info == NULL) { cpp_dev->stream_cnt++; CPP_DBG("stream_cnt:%d\n", cpp_dev->stream_cnt); } buff_queue_info = msm_cpp_get_buff_queue_entry(cpp_dev, ((k_stream_buff_info.identity >> 16) & 0xFFFF), (k_stream_buff_info.identity & 0xFFFF)); if (buff_queue_info == NULL) { pr_err("error finding buffer queue entry identity:%d\n", k_stream_buff_info.identity); kfree(k_stream_buff_info.buffer_info); kfree(u_stream_buff_info); cpp_dev->stream_cnt--; mutex_unlock(&cpp_dev->mutex); return -EINVAL; } if (VIDIOC_MSM_CPP_DELETE_STREAM_BUFF == cmd) { for (j = 0; j < k_stream_buff_info.num_buffs; j++) { msm_cpp_dequeue_buff(cpp_dev, buff_queue_info, k_stream_buff_info.buffer_info[j].index, k_stream_buff_info.buffer_info[j].native_buff); } } else { for (j = 0; j < k_stream_buff_info.num_buffs; j++) { msm_cpp_queue_buffer_info(cpp_dev, buff_queue_info, &k_stream_buff_info.buffer_info[j]); } } STREAM_BUFF_END: kfree(k_stream_buff_info.buffer_info); kfree(u_stream_buff_info); if (cpp_dev->stream_cnt == 0) { Loading @@ -1929,10 +1960,6 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, msm_cpp_clean_queue(cpp_dev); } if (buff_queue_info == NULL) { cpp_dev->stream_cnt++; CPP_DBG("stream_cnt:%d\n", cpp_dev->stream_cnt); } break; } case VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO: { Loading Loading @@ -2511,6 +2538,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, break; case VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO32: case VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32: case VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32: { struct msm_cpp_stream_buff_info32_t *u32_cpp_buff_info = (struct msm_cpp_stream_buff_info32_t *)kp_ioctl.ioctl_ptr; Loading @@ -2531,6 +2559,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, } if (cmd == VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32) cmd = VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO; else if (cmd == VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32) cmd = VIDIOC_MSM_CPP_DELETE_STREAM_BUFF; else cmd = VIDIOC_MSM_CPP_APPEND_STREAM_BUFF_INFO; break; Loading
include/media/msmb_pproc.h +6 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,9 @@ struct msm_cpp_clock_settings_t { #define VIDIOC_MSM_CPP_IOMMU_DETACH \ _IOWR('V', BASE_VIDIOC_PRIVATE + 19, struct msm_camera_v4l2_ioctl_t) #define VIDIOC_MSM_CPP_DELETE_STREAM_BUFF\ _IOWR('V', BASE_VIDIOC_PRIVATE + 20, struct msm_camera_v4l2_ioctl_t) #define V4L2_EVENT_CPP_FRAME_DONE (V4L2_EVENT_PRIVATE_START + 0) #define V4L2_EVENT_VPE_FRAME_DONE (V4L2_EVENT_PRIVATE_START + 1) Loading Loading @@ -418,6 +421,9 @@ struct cpp_hw_info_32_t { #define VIDIOC_MSM_CPP_IOMMU_DETACH32 \ _IOWR('V', BASE_VIDIOC_PRIVATE + 19, struct msm_camera_v4l2_ioctl32_t) #define VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32\ _IOWR('V', BASE_VIDIOC_PRIVATE + 20, struct msm_camera_v4l2_ioctl32_t) struct msm_camera_v4l2_ioctl32_t { uint32_t id; uint32_t len; Loading