Loading drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +95 −243 Original line number Diff line number Diff line Loading @@ -75,31 +75,6 @@ static int msm_buf_check_head_sanity(struct msm_isp_bufq *bufq) return -EINVAL; } prev = bufq->share_head.prev; next = bufq->share_head.next; if (!prev) { pr_err("%s: Error! bufq->share_head.prev is NULL\n", __func__); return -EINVAL; } if (!next) { pr_err("%s: Error! bufq->share_head.next is NULL\n", __func__); return -EINVAL; } if (prev->next != &bufq->share_head) { pr_err("%s: Error! share_head prev->next is %p should be %p\n", __func__, prev->next, &bufq->share_head); return -EINVAL; } if (next->prev != &bufq->share_head) { pr_err("%s: Error! share_head next->prev is %p should be %p\n", __func__, next->prev, &bufq->share_head); return -EINVAL; } return rc; } Loading Loading @@ -187,9 +162,7 @@ static int msm_isp_free_bufq_handle(struct msm_isp_buf_mgr *buf_mgr, bufq->stream_id = 0; bufq->num_bufs = 0; bufq->buf_type = 0; memset(&bufq->head, 0, sizeof(bufq->head)); memset(&bufq->share_head, 0, sizeof(bufq->share_head)); bufq->buf_client_count = 0; INIT_LIST_HEAD(&bufq->head); return 0; } Loading Loading @@ -487,27 +460,12 @@ static int msm_isp_buf_unprepare(struct msm_isp_buf_mgr *buf_mgr, return 0; } static void msm_isp_debug_list(struct msm_isp_bufq *bufq, struct msm_isp_buffer *buf_info) { int i = 0; pr_err("%s: stream_id %x buf_info last_put_id = %d\n", __func__, bufq->stream_id, buf_info->buf_debug.put_state_last); for (i = 0; i < 2; i++) { pr_err("%s i %d put_state %d\n", __func__, i, buf_info->buf_debug.put_state[i]); } } static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, struct msm_isp_buffer **buf_info, uint32_t *buf_cnt) uint32_t bufq_handle, struct msm_isp_buffer **buf_info) { int rc = -1; unsigned long flags; unsigned int list_count = 0; struct msm_isp_buffer *temp_buf_info = NULL; struct msm_isp_bufq *bufq = NULL; struct vb2_buffer *vb2_buf = NULL; Loading @@ -532,52 +490,6 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } *buf_info = NULL; *buf_cnt = 0; if (bufq->buf_type == ISP_SHARE_BUF) { if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x is in bad state\n", __func__, bufq->bufq_handle); return -EFAULT; } list_count = 0; list_for_each_entry(temp_buf_info, &bufq->share_head, share_list) { if ((temp_buf_info->get_buf_mask & (1 << id)) == 0) { temp_buf_info->get_buf_mask |= (1 << id); temp_buf_info->buf_get_count++; *buf_cnt = temp_buf_info->buf_get_count; if (temp_buf_info->buf_get_count == bufq->buf_client_count) { list_del_init( &temp_buf_info->share_list); } if (temp_buf_info->buf_reuse_flag) { kfree(temp_buf_info); } else { *buf_info = temp_buf_info; rc = 0; } spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } else if ((temp_buf_info->get_buf_mask & (1 << id)) && temp_buf_info->buf_reuse_flag) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } list_count++; if (list_count > MAX_LIST_COUNT) { pr_err_ratelimited("%s: %d share_list corruption, list corrupt! count = %d\n", __func__, __LINE__, list_count); spin_unlock_irqrestore( &bufq->bufq_lock, flags); return -EINVAL; } } } switch (BUF_SRC(bufq->stream_id)) { case MSM_ISP_BUFFER_SRC_NATIVE: Loading @@ -588,11 +500,10 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", WARN(1, "%s buf_handle 0x%x buf_idx %d\n", __func__, bufq->bufq_handle, temp_buf_info->buf_idx, temp_buf_info->buf_reuse_flag); temp_buf_info->buf_idx); return -EFAULT; } *buf_info = temp_buf_info; Loading Loading @@ -641,68 +552,9 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } if (!(*buf_info)) { if (bufq->buf_type == ISP_SHARE_BUF) { temp_buf_info = kzalloc( sizeof(struct msm_isp_buffer), GFP_ATOMIC); if (temp_buf_info) { temp_buf_info->buf_reuse_flag = 1; temp_buf_info->get_buf_mask |= (1 << id); temp_buf_info->buf_get_count = 1; list_add_tail(&temp_buf_info->share_list, &bufq->share_head); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, temp_buf_info->buf_idx, temp_buf_info->buf_reuse_flag); return -EFAULT; } } else rc = -ENOMEM; } } else { (*buf_info)->state = MSM_ISP_BUFFER_STATE_DEQUEUED; if (bufq->buf_type == ISP_SHARE_BUF) { list_for_each_entry(temp_buf_info, &bufq->share_head, share_list) { if (temp_buf_info->buf_idx == (*buf_info)->buf_idx) { msm_isp_debug_list(bufq, temp_buf_info); spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s ERROR! Double ADD found\n", __func__); return -EFAULT; } } (*buf_info)->get_buf_mask = (1 << id); (*buf_info)->buf_get_count = 1; (*buf_info)->buf_put_count = 0; (*buf_info)->put_buf_mask = 0; (*buf_info)->buf_reuse_flag = 0; if (!list_empty(&(*buf_info)->share_list)) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s: buf %x/%x double add\n", __func__, bufq_handle, (*buf_info)->buf_idx); return -EFAULT; } list_add_tail(&(*buf_info)->share_list, &bufq->share_head); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, (*buf_info)->buf_idx, (*buf_info)->buf_reuse_flag); return -EFAULT; } } rc = 0; } spin_unlock_irqrestore(&bufq->bufq_lock, flags); Loading Loading @@ -730,6 +582,7 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, switch (buf_info->state) { case MSM_ISP_BUFFER_STATE_PREPARED: case MSM_ISP_BUFFER_STATE_DEQUEUED: if (BUF_SRC(bufq->stream_id)) { if (!list_empty(&buf_info->list)) { WARN(1, "%s: buf %x/%x double add\n", Loading @@ -738,11 +591,10 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, } list_add_tail(&buf_info->list, &bufq->head); if (msm_buf_check_head_sanity(bufq) < 0) { WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", WARN(1, "%s buf_handle 0x%x buf_idx %d\n", __func__, bufq->bufq_handle, buf_info->buf_idx, buf_info->buf_reuse_flag); buf_info->buf_idx); return -EFAULT; } } else { Loading @@ -757,7 +609,6 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, rc = 0; break; case MSM_ISP_BUFFER_STATE_QUEUED: case MSM_ISP_BUFFER_STATE_DEQUEUED: case MSM_ISP_BUFFER_STATE_DIVERTED: default: WARN(1, "%s: bufq 0x%x, buf idx 0x%x, incorrect state = %d", Loading Loading @@ -790,11 +641,6 @@ static int msm_isp_put_buf(struct msm_isp_buf_mgr *buf_mgr, spin_lock_irqsave(&bufq->bufq_lock, flags); buf_info->buf_get_count = 0; buf_info->buf_put_count = 0; buf_info->get_buf_mask = 0; buf_info->put_buf_mask = 0; rc = msm_isp_put_buf_unsafe(buf_mgr, bufq_handle, buf_index); spin_unlock_irqrestore(&bufq->bufq_lock, flags); Loading @@ -804,13 +650,13 @@ static int msm_isp_put_buf(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_update_put_buf_cnt_unsafe( struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id, unsigned long *flags) uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit) { int rc = -1; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; enum msm_isp_buffer_state state; uint8_t *put_buf_mask = NULL; bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { Loading @@ -818,38 +664,46 @@ static int msm_isp_update_put_buf_cnt_unsafe( return rc; } put_buf_mask = &bufq->put_buf_mask[pingpong_bit]; if (buf_index >= 0) { buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EFAULT; } if (buf_info->state != MSM_ISP_BUFFER_STATE_DEQUEUED) { pr_err( "%s: Invalid state, bufq_handle %x stream id %x, state %d\n", __func__, bufq_handle, bufq->stream_id, buf_info->state); return -EFAULT; } BUG_ON(buf_info->pingpong_bit != pingpong_bit); } if (bufq->buf_type != ISP_SHARE_BUF || buf_info->put_buf_mask == 0) { (*put_buf_mask == 0)) { if (buf_info) buf_info->frame_id = frame_id; } state = buf_info->state; if (state == MSM_ISP_BUFFER_STATE_DEQUEUED) { if (bufq->buf_type == ISP_SHARE_BUF && ((buf_info->put_buf_mask & (1 << id)) == 0)) { buf_info->put_buf_mask |= (1 << id); buf_info->buf_put_count++; if (buf_info->buf_put_count != ISP_SHARE_BUF_CLIENT) { rc = buf_info->buf_put_count; return rc; } ((*put_buf_mask & (1 << id)) == 0)) { *put_buf_mask |= (1 << id); if (*put_buf_mask != ISP_SHARE_BUF_MASK) { rc = *put_buf_mask; return 1; } } else { pr_warn("%s: Invalid state, stream id %x, state %d\n", __func__, bufq->stream_id, state); spin_unlock_irqrestore(&bufq->bufq_lock, *flags); dump_stack(); spin_lock_irqsave(&bufq->bufq_lock, *flags); return rc; *put_buf_mask = 0; rc = 0; } else if (bufq->buf_type == ISP_SHARE_BUF && (*put_buf_mask & (1 << id)) != 0) { return -ENOTEMPTY; } if (MSM_ISP_BUFFER_SRC_NATIVE == BUF_SRC(bufq->stream_id)) { if (buf_info && MSM_ISP_BUFFER_SRC_NATIVE == BUF_SRC(bufq->stream_id)) { buf_info->state = MSM_ISP_BUFFER_STATE_DIVERTED; buf_info->tv = tv; } Loading @@ -857,8 +711,8 @@ static int msm_isp_update_put_buf_cnt_unsafe( } static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id) uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit) { int rc = -1; struct msm_isp_bufq *bufq = NULL; Loading @@ -872,7 +726,12 @@ static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, spin_lock_irqsave(&bufq->bufq_lock, flags); rc = msm_isp_update_put_buf_cnt_unsafe(buf_mgr, id, bufq_handle, buf_index, tv, frame_id, &flags); buf_index, tv, frame_id, pingpong_bit); if (-ENOTEMPTY == rc) { pr_err("%s: Error! Uncleared put_buf_mask for pingpong(%d) from vfe %d bufq 0x%x buf_idx %d\n", __func__, pingpong_bit, id, bufq_handle, buf_index); rc = -EFAULT; } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return rc; } Loading @@ -881,7 +740,7 @@ static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t output_format) { int rc = -1; int rc = 0; unsigned long flags; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; Loading @@ -890,13 +749,13 @@ static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr, bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq\n"); return rc; return -EINVAL; } buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } spin_lock_irqsave(&bufq->bufq_lock, flags); Loading Loading @@ -936,7 +795,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, enum msm_isp_buffer_flush_t flush_type, struct timeval *tv, uint32_t frame_id) { int rc = -1, i; int rc = 0, i; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; unsigned long flags; Loading @@ -944,7 +803,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq\n"); return rc; return -EINVAL; } spin_lock_irqsave(&bufq->bufq_lock, flags); Loading @@ -965,40 +824,35 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, __func__); } else if (buf_info->state == MSM_ISP_BUFFER_STATE_DEQUEUED) { rc = msm_isp_update_put_buf_cnt_unsafe(buf_mgr, id, bufq_handle, buf_info->buf_idx, tv, frame_id, buf_info->pingpong_bit); if (-ENOTEMPTY == rc) { rc = 0; continue; } if (rc == 0) { buf_info->buf_debug.put_state[ buf_info->buf_debug.put_state_last] buf_info->buf_debug. put_state_last] = MSM_ISP_BUFFER_STATE_FLUSH; buf_info->buf_debug.put_state_last ^= 1; buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED; buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED; rc = msm_isp_put_buf_unsafe(buf_mgr, bufq_handle, buf_info->buf_idx); if (rc == -EFAULT) { spin_unlock_irqrestore(&bufq->bufq_lock, spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } } } } if (bufq->buf_type == ISP_SHARE_BUF) { while (!list_empty(&bufq->share_head)) { buf_info = list_entry((&bufq->share_head)->next, typeof(*buf_info), share_list); list_del_init(&(buf_info->share_list)); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, buf_info->buf_idx, buf_info->buf_reuse_flag); return -EFAULT; } if (buf_info->buf_reuse_flag) kfree(buf_info); } } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return 0; } Loading @@ -1006,7 +860,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_qbuf_info *info) { int rc = -1, buf_state; int rc = 0, buf_state; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; Loading @@ -1029,7 +883,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, info->handle, info->buf_idx); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } if (info->dirty_buf) { buf_info->buf_debug.put_state[ Loading Loading @@ -1059,7 +913,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, info->handle, info->buf_idx); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } buf_info->buf_debug.put_state[ Loading @@ -1075,7 +929,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, } } } return rc; return 0; } static int msm_isp_buf_dequeue(struct msm_isp_buf_mgr *buf_mgr, Loading Loading @@ -1136,20 +990,20 @@ static int msm_isp_get_buf_src(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buf_request *buf_request) { int rc = -1, i; int i; struct msm_isp_bufq *bufq = NULL; CDBG("%s: E\n", __func__); if (!buf_request->num_buf || buf_request->num_buf > VB2_MAX_FRAME) { pr_err("Invalid buffer request\n"); return rc; return -EINVAL; } buf_request->handle = msm_isp_get_buf_handle(buf_mgr, buf_request->session_id, buf_request->stream_id); if (!buf_request->handle) { pr_err("Invalid buffer handle\n"); return rc; return -EINVAL; } bufq = msm_isp_get_bufq(buf_mgr, buf_request->handle); Loading @@ -1157,7 +1011,7 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, pr_err("%s: Invalid bufq stream_id %x\n", __func__, buf_request->stream_id); return rc; return -EINVAL; } bufq->bufs = kzalloc(sizeof(struct msm_isp_buffer) * Loading @@ -1165,7 +1019,7 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, if (!bufq->bufs) { pr_err("No free memory for buf info\n"); msm_isp_free_bufq_handle(buf_mgr, buf_request->handle); return rc; return -ENOMEM; } spin_lock_init(&bufq->bufq_lock); bufq->bufq_handle = buf_request->handle; Loading @@ -1173,10 +1027,10 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, bufq->stream_id = buf_request->stream_id; bufq->num_bufs = buf_request->num_buf; bufq->buf_type = buf_request->buf_type; if (bufq->buf_type == ISP_SHARE_BUF) bufq->buf_client_count = ISP_SHARE_BUF_CLIENT; for (i = 0; i < ISP_NUM_BUF_MASK; i++) bufq->put_buf_mask[i] = 0; INIT_LIST_HEAD(&bufq->head); INIT_LIST_HEAD(&bufq->share_head); for (i = 0; i < buf_request->num_buf; i++) { bufq->bufs[i].state = MSM_ISP_BUFFER_STATE_INITIALIZED; bufq->bufs[i].buf_debug.put_state[0] = Loading @@ -1187,7 +1041,6 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, bufq->bufs[i].bufq_handle = bufq->bufq_handle; bufq->bufs[i].buf_idx = i; INIT_LIST_HEAD(&bufq->bufs[i].list); INIT_LIST_HEAD(&bufq->bufs[i].share_list); } return 0; Loading @@ -1198,11 +1051,10 @@ static int msm_isp_release_bufq(struct msm_isp_buf_mgr *buf_mgr, { struct msm_isp_bufq *bufq = NULL; unsigned long flags; int rc = -1; bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq release\n"); return rc; return -EINVAL; } msm_isp_buf_unprepare_all(buf_mgr, bufq_handle); Loading drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +12 −17 Original line number Diff line number Diff line Loading @@ -23,7 +23,12 @@ (id & ISP_NATIVE_BUF_BIT) ? MSM_ISP_BUFFER_SRC_NATIVE : \ MSM_ISP_BUFFER_SRC_HAL) #define ISP_SHARE_BUF_CLIENT 2 /* * This mask can be set dynamically if there are more than 2 VFE *.and 2 of those are used */ #define ISP_SHARE_BUF_MASK 0x3 #define ISP_NUM_BUF_MASK 2 #define BUF_MGR_NUM_BUF_Q 28 #define MAX_IOMMU_CTX 2 Loading Loading @@ -89,6 +94,8 @@ struct msm_isp_buffer { uint32_t bufq_handle; uint32_t frame_id; struct timeval *tv; /* Indicates whether buffer is used as ping ot pong buffer */ uint32_t pingpong_bit; /*Native buffer*/ struct list_head list; Loading @@ -98,14 +105,6 @@ struct msm_isp_buffer { /*Vb2 buffer data*/ struct vb2_buffer *vb2_buf; /*Share buffer cache state*/ struct list_head share_list; uint8_t get_buf_mask; uint8_t put_buf_mask; uint8_t buf_get_count; uint8_t buf_put_count; uint8_t buf_reuse_flag; }; struct msm_isp_bufq { Loading @@ -116,12 +115,9 @@ struct msm_isp_bufq { enum msm_isp_buf_type buf_type; struct msm_isp_buffer *bufs; spinlock_t bufq_lock; uint8_t put_buf_mask[ISP_NUM_BUF_MASK]; /*Native buffer queue*/ struct list_head head; /*Share buffer cache queue*/ struct list_head share_head; uint8_t buf_client_count; }; struct msm_isp_buf_ops { Loading @@ -144,8 +140,7 @@ struct msm_isp_buf_ops { uint32_t bufq_handle, uint32_t *buf_src); int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, struct msm_isp_buffer **buf_info, uint32_t *buf_cnt); uint32_t bufq_handle, struct msm_isp_buffer **buf_info); int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, Loading Loading @@ -177,8 +172,8 @@ struct msm_isp_buf_ops { struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle); int (*update_put_buf_cnt)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id); uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit); }; struct msm_isp_buf_mgr { Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +95 −243 Original line number Diff line number Diff line Loading @@ -75,31 +75,6 @@ static int msm_buf_check_head_sanity(struct msm_isp_bufq *bufq) return -EINVAL; } prev = bufq->share_head.prev; next = bufq->share_head.next; if (!prev) { pr_err("%s: Error! bufq->share_head.prev is NULL\n", __func__); return -EINVAL; } if (!next) { pr_err("%s: Error! bufq->share_head.next is NULL\n", __func__); return -EINVAL; } if (prev->next != &bufq->share_head) { pr_err("%s: Error! share_head prev->next is %p should be %p\n", __func__, prev->next, &bufq->share_head); return -EINVAL; } if (next->prev != &bufq->share_head) { pr_err("%s: Error! share_head next->prev is %p should be %p\n", __func__, next->prev, &bufq->share_head); return -EINVAL; } return rc; } Loading Loading @@ -187,9 +162,7 @@ static int msm_isp_free_bufq_handle(struct msm_isp_buf_mgr *buf_mgr, bufq->stream_id = 0; bufq->num_bufs = 0; bufq->buf_type = 0; memset(&bufq->head, 0, sizeof(bufq->head)); memset(&bufq->share_head, 0, sizeof(bufq->share_head)); bufq->buf_client_count = 0; INIT_LIST_HEAD(&bufq->head); return 0; } Loading Loading @@ -487,27 +460,12 @@ static int msm_isp_buf_unprepare(struct msm_isp_buf_mgr *buf_mgr, return 0; } static void msm_isp_debug_list(struct msm_isp_bufq *bufq, struct msm_isp_buffer *buf_info) { int i = 0; pr_err("%s: stream_id %x buf_info last_put_id = %d\n", __func__, bufq->stream_id, buf_info->buf_debug.put_state_last); for (i = 0; i < 2; i++) { pr_err("%s i %d put_state %d\n", __func__, i, buf_info->buf_debug.put_state[i]); } } static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, struct msm_isp_buffer **buf_info, uint32_t *buf_cnt) uint32_t bufq_handle, struct msm_isp_buffer **buf_info) { int rc = -1; unsigned long flags; unsigned int list_count = 0; struct msm_isp_buffer *temp_buf_info = NULL; struct msm_isp_bufq *bufq = NULL; struct vb2_buffer *vb2_buf = NULL; Loading @@ -532,52 +490,6 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } *buf_info = NULL; *buf_cnt = 0; if (bufq->buf_type == ISP_SHARE_BUF) { if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x is in bad state\n", __func__, bufq->bufq_handle); return -EFAULT; } list_count = 0; list_for_each_entry(temp_buf_info, &bufq->share_head, share_list) { if ((temp_buf_info->get_buf_mask & (1 << id)) == 0) { temp_buf_info->get_buf_mask |= (1 << id); temp_buf_info->buf_get_count++; *buf_cnt = temp_buf_info->buf_get_count; if (temp_buf_info->buf_get_count == bufq->buf_client_count) { list_del_init( &temp_buf_info->share_list); } if (temp_buf_info->buf_reuse_flag) { kfree(temp_buf_info); } else { *buf_info = temp_buf_info; rc = 0; } spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } else if ((temp_buf_info->get_buf_mask & (1 << id)) && temp_buf_info->buf_reuse_flag) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } list_count++; if (list_count > MAX_LIST_COUNT) { pr_err_ratelimited("%s: %d share_list corruption, list corrupt! count = %d\n", __func__, __LINE__, list_count); spin_unlock_irqrestore( &bufq->bufq_lock, flags); return -EINVAL; } } } switch (BUF_SRC(bufq->stream_id)) { case MSM_ISP_BUFFER_SRC_NATIVE: Loading @@ -588,11 +500,10 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", WARN(1, "%s buf_handle 0x%x buf_idx %d\n", __func__, bufq->bufq_handle, temp_buf_info->buf_idx, temp_buf_info->buf_reuse_flag); temp_buf_info->buf_idx); return -EFAULT; } *buf_info = temp_buf_info; Loading Loading @@ -641,68 +552,9 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } if (!(*buf_info)) { if (bufq->buf_type == ISP_SHARE_BUF) { temp_buf_info = kzalloc( sizeof(struct msm_isp_buffer), GFP_ATOMIC); if (temp_buf_info) { temp_buf_info->buf_reuse_flag = 1; temp_buf_info->get_buf_mask |= (1 << id); temp_buf_info->buf_get_count = 1; list_add_tail(&temp_buf_info->share_list, &bufq->share_head); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, temp_buf_info->buf_idx, temp_buf_info->buf_reuse_flag); return -EFAULT; } } else rc = -ENOMEM; } } else { (*buf_info)->state = MSM_ISP_BUFFER_STATE_DEQUEUED; if (bufq->buf_type == ISP_SHARE_BUF) { list_for_each_entry(temp_buf_info, &bufq->share_head, share_list) { if (temp_buf_info->buf_idx == (*buf_info)->buf_idx) { msm_isp_debug_list(bufq, temp_buf_info); spin_unlock_irqrestore( &bufq->bufq_lock, flags); WARN(1, "%s ERROR! Double ADD found\n", __func__); return -EFAULT; } } (*buf_info)->get_buf_mask = (1 << id); (*buf_info)->buf_get_count = 1; (*buf_info)->buf_put_count = 0; (*buf_info)->put_buf_mask = 0; (*buf_info)->buf_reuse_flag = 0; if (!list_empty(&(*buf_info)->share_list)) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s: buf %x/%x double add\n", __func__, bufq_handle, (*buf_info)->buf_idx); return -EFAULT; } list_add_tail(&(*buf_info)->share_list, &bufq->share_head); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, (*buf_info)->buf_idx, (*buf_info)->buf_reuse_flag); return -EFAULT; } } rc = 0; } spin_unlock_irqrestore(&bufq->bufq_lock, flags); Loading Loading @@ -730,6 +582,7 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, switch (buf_info->state) { case MSM_ISP_BUFFER_STATE_PREPARED: case MSM_ISP_BUFFER_STATE_DEQUEUED: if (BUF_SRC(bufq->stream_id)) { if (!list_empty(&buf_info->list)) { WARN(1, "%s: buf %x/%x double add\n", Loading @@ -738,11 +591,10 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, } list_add_tail(&buf_info->list, &bufq->head); if (msm_buf_check_head_sanity(bufq) < 0) { WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", WARN(1, "%s buf_handle 0x%x buf_idx %d\n", __func__, bufq->bufq_handle, buf_info->buf_idx, buf_info->buf_reuse_flag); buf_info->buf_idx); return -EFAULT; } } else { Loading @@ -757,7 +609,6 @@ static int msm_isp_put_buf_unsafe(struct msm_isp_buf_mgr *buf_mgr, rc = 0; break; case MSM_ISP_BUFFER_STATE_QUEUED: case MSM_ISP_BUFFER_STATE_DEQUEUED: case MSM_ISP_BUFFER_STATE_DIVERTED: default: WARN(1, "%s: bufq 0x%x, buf idx 0x%x, incorrect state = %d", Loading Loading @@ -790,11 +641,6 @@ static int msm_isp_put_buf(struct msm_isp_buf_mgr *buf_mgr, spin_lock_irqsave(&bufq->bufq_lock, flags); buf_info->buf_get_count = 0; buf_info->buf_put_count = 0; buf_info->get_buf_mask = 0; buf_info->put_buf_mask = 0; rc = msm_isp_put_buf_unsafe(buf_mgr, bufq_handle, buf_index); spin_unlock_irqrestore(&bufq->bufq_lock, flags); Loading @@ -804,13 +650,13 @@ static int msm_isp_put_buf(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_update_put_buf_cnt_unsafe( struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id, unsigned long *flags) uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit) { int rc = -1; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; enum msm_isp_buffer_state state; uint8_t *put_buf_mask = NULL; bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { Loading @@ -818,38 +664,46 @@ static int msm_isp_update_put_buf_cnt_unsafe( return rc; } put_buf_mask = &bufq->put_buf_mask[pingpong_bit]; if (buf_index >= 0) { buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EFAULT; } if (buf_info->state != MSM_ISP_BUFFER_STATE_DEQUEUED) { pr_err( "%s: Invalid state, bufq_handle %x stream id %x, state %d\n", __func__, bufq_handle, bufq->stream_id, buf_info->state); return -EFAULT; } BUG_ON(buf_info->pingpong_bit != pingpong_bit); } if (bufq->buf_type != ISP_SHARE_BUF || buf_info->put_buf_mask == 0) { (*put_buf_mask == 0)) { if (buf_info) buf_info->frame_id = frame_id; } state = buf_info->state; if (state == MSM_ISP_BUFFER_STATE_DEQUEUED) { if (bufq->buf_type == ISP_SHARE_BUF && ((buf_info->put_buf_mask & (1 << id)) == 0)) { buf_info->put_buf_mask |= (1 << id); buf_info->buf_put_count++; if (buf_info->buf_put_count != ISP_SHARE_BUF_CLIENT) { rc = buf_info->buf_put_count; return rc; } ((*put_buf_mask & (1 << id)) == 0)) { *put_buf_mask |= (1 << id); if (*put_buf_mask != ISP_SHARE_BUF_MASK) { rc = *put_buf_mask; return 1; } } else { pr_warn("%s: Invalid state, stream id %x, state %d\n", __func__, bufq->stream_id, state); spin_unlock_irqrestore(&bufq->bufq_lock, *flags); dump_stack(); spin_lock_irqsave(&bufq->bufq_lock, *flags); return rc; *put_buf_mask = 0; rc = 0; } else if (bufq->buf_type == ISP_SHARE_BUF && (*put_buf_mask & (1 << id)) != 0) { return -ENOTEMPTY; } if (MSM_ISP_BUFFER_SRC_NATIVE == BUF_SRC(bufq->stream_id)) { if (buf_info && MSM_ISP_BUFFER_SRC_NATIVE == BUF_SRC(bufq->stream_id)) { buf_info->state = MSM_ISP_BUFFER_STATE_DIVERTED; buf_info->tv = tv; } Loading @@ -857,8 +711,8 @@ static int msm_isp_update_put_buf_cnt_unsafe( } static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id) uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit) { int rc = -1; struct msm_isp_bufq *bufq = NULL; Loading @@ -872,7 +726,12 @@ static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, spin_lock_irqsave(&bufq->bufq_lock, flags); rc = msm_isp_update_put_buf_cnt_unsafe(buf_mgr, id, bufq_handle, buf_index, tv, frame_id, &flags); buf_index, tv, frame_id, pingpong_bit); if (-ENOTEMPTY == rc) { pr_err("%s: Error! Uncleared put_buf_mask for pingpong(%d) from vfe %d bufq 0x%x buf_idx %d\n", __func__, pingpong_bit, id, bufq_handle, buf_index); rc = -EFAULT; } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return rc; } Loading @@ -881,7 +740,7 @@ static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t output_format) { int rc = -1; int rc = 0; unsigned long flags; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; Loading @@ -890,13 +749,13 @@ static int msm_isp_buf_done(struct msm_isp_buf_mgr *buf_mgr, bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq\n"); return rc; return -EINVAL; } buf_info = msm_isp_get_buf_ptr(buf_mgr, bufq_handle, buf_index); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } spin_lock_irqsave(&bufq->bufq_lock, flags); Loading Loading @@ -936,7 +795,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, enum msm_isp_buffer_flush_t flush_type, struct timeval *tv, uint32_t frame_id) { int rc = -1, i; int rc = 0, i; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; unsigned long flags; Loading @@ -944,7 +803,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq\n"); return rc; return -EINVAL; } spin_lock_irqsave(&bufq->bufq_lock, flags); Loading @@ -965,40 +824,35 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, __func__); } else if (buf_info->state == MSM_ISP_BUFFER_STATE_DEQUEUED) { rc = msm_isp_update_put_buf_cnt_unsafe(buf_mgr, id, bufq_handle, buf_info->buf_idx, tv, frame_id, buf_info->pingpong_bit); if (-ENOTEMPTY == rc) { rc = 0; continue; } if (rc == 0) { buf_info->buf_debug.put_state[ buf_info->buf_debug.put_state_last] buf_info->buf_debug. put_state_last] = MSM_ISP_BUFFER_STATE_FLUSH; buf_info->buf_debug.put_state_last ^= 1; buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED; buf_info->state = MSM_ISP_BUFFER_STATE_PREPARED; rc = msm_isp_put_buf_unsafe(buf_mgr, bufq_handle, buf_info->buf_idx); if (rc == -EFAULT) { spin_unlock_irqrestore(&bufq->bufq_lock, spin_unlock_irqrestore( &bufq->bufq_lock, flags); return rc; } } } } if (bufq->buf_type == ISP_SHARE_BUF) { while (!list_empty(&bufq->share_head)) { buf_info = list_entry((&bufq->share_head)->next, typeof(*buf_info), share_list); list_del_init(&(buf_info->share_list)); if (msm_buf_check_head_sanity(bufq) < 0) { spin_unlock_irqrestore(&bufq->bufq_lock, flags); WARN(1, "%s buf_handle 0x%x buf_idx %d buf_reuse_flag %d\n", __func__, bufq->bufq_handle, buf_info->buf_idx, buf_info->buf_reuse_flag); return -EFAULT; } if (buf_info->buf_reuse_flag) kfree(buf_info); } } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return 0; } Loading @@ -1006,7 +860,7 @@ static int msm_isp_flush_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_qbuf_info *info) { int rc = -1, buf_state; int rc = 0, buf_state; struct msm_isp_bufq *bufq = NULL; struct msm_isp_buffer *buf_info = NULL; Loading @@ -1029,7 +883,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, info->handle, info->buf_idx); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } if (info->dirty_buf) { buf_info->buf_debug.put_state[ Loading Loading @@ -1059,7 +913,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, info->handle, info->buf_idx); if (!buf_info) { pr_err("%s: buf not found\n", __func__); return rc; return -EINVAL; } buf_info->buf_debug.put_state[ Loading @@ -1075,7 +929,7 @@ static int msm_isp_buf_enqueue(struct msm_isp_buf_mgr *buf_mgr, } } } return rc; return 0; } static int msm_isp_buf_dequeue(struct msm_isp_buf_mgr *buf_mgr, Loading Loading @@ -1136,20 +990,20 @@ static int msm_isp_get_buf_src(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buf_request *buf_request) { int rc = -1, i; int i; struct msm_isp_bufq *bufq = NULL; CDBG("%s: E\n", __func__); if (!buf_request->num_buf || buf_request->num_buf > VB2_MAX_FRAME) { pr_err("Invalid buffer request\n"); return rc; return -EINVAL; } buf_request->handle = msm_isp_get_buf_handle(buf_mgr, buf_request->session_id, buf_request->stream_id); if (!buf_request->handle) { pr_err("Invalid buffer handle\n"); return rc; return -EINVAL; } bufq = msm_isp_get_bufq(buf_mgr, buf_request->handle); Loading @@ -1157,7 +1011,7 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, pr_err("%s: Invalid bufq stream_id %x\n", __func__, buf_request->stream_id); return rc; return -EINVAL; } bufq->bufs = kzalloc(sizeof(struct msm_isp_buffer) * Loading @@ -1165,7 +1019,7 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, if (!bufq->bufs) { pr_err("No free memory for buf info\n"); msm_isp_free_bufq_handle(buf_mgr, buf_request->handle); return rc; return -ENOMEM; } spin_lock_init(&bufq->bufq_lock); bufq->bufq_handle = buf_request->handle; Loading @@ -1173,10 +1027,10 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, bufq->stream_id = buf_request->stream_id; bufq->num_bufs = buf_request->num_buf; bufq->buf_type = buf_request->buf_type; if (bufq->buf_type == ISP_SHARE_BUF) bufq->buf_client_count = ISP_SHARE_BUF_CLIENT; for (i = 0; i < ISP_NUM_BUF_MASK; i++) bufq->put_buf_mask[i] = 0; INIT_LIST_HEAD(&bufq->head); INIT_LIST_HEAD(&bufq->share_head); for (i = 0; i < buf_request->num_buf; i++) { bufq->bufs[i].state = MSM_ISP_BUFFER_STATE_INITIALIZED; bufq->bufs[i].buf_debug.put_state[0] = Loading @@ -1187,7 +1041,6 @@ static int msm_isp_request_bufq(struct msm_isp_buf_mgr *buf_mgr, bufq->bufs[i].bufq_handle = bufq->bufq_handle; bufq->bufs[i].buf_idx = i; INIT_LIST_HEAD(&bufq->bufs[i].list); INIT_LIST_HEAD(&bufq->bufs[i].share_list); } return 0; Loading @@ -1198,11 +1051,10 @@ static int msm_isp_release_bufq(struct msm_isp_buf_mgr *buf_mgr, { struct msm_isp_bufq *bufq = NULL; unsigned long flags; int rc = -1; bufq = msm_isp_get_bufq(buf_mgr, bufq_handle); if (!bufq) { pr_err("Invalid bufq release\n"); return rc; return -EINVAL; } msm_isp_buf_unprepare_all(buf_mgr, bufq_handle); Loading
drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +12 −17 Original line number Diff line number Diff line Loading @@ -23,7 +23,12 @@ (id & ISP_NATIVE_BUF_BIT) ? MSM_ISP_BUFFER_SRC_NATIVE : \ MSM_ISP_BUFFER_SRC_HAL) #define ISP_SHARE_BUF_CLIENT 2 /* * This mask can be set dynamically if there are more than 2 VFE *.and 2 of those are used */ #define ISP_SHARE_BUF_MASK 0x3 #define ISP_NUM_BUF_MASK 2 #define BUF_MGR_NUM_BUF_Q 28 #define MAX_IOMMU_CTX 2 Loading Loading @@ -89,6 +94,8 @@ struct msm_isp_buffer { uint32_t bufq_handle; uint32_t frame_id; struct timeval *tv; /* Indicates whether buffer is used as ping ot pong buffer */ uint32_t pingpong_bit; /*Native buffer*/ struct list_head list; Loading @@ -98,14 +105,6 @@ struct msm_isp_buffer { /*Vb2 buffer data*/ struct vb2_buffer *vb2_buf; /*Share buffer cache state*/ struct list_head share_list; uint8_t get_buf_mask; uint8_t put_buf_mask; uint8_t buf_get_count; uint8_t buf_put_count; uint8_t buf_reuse_flag; }; struct msm_isp_bufq { Loading @@ -116,12 +115,9 @@ struct msm_isp_bufq { enum msm_isp_buf_type buf_type; struct msm_isp_buffer *bufs; spinlock_t bufq_lock; uint8_t put_buf_mask[ISP_NUM_BUF_MASK]; /*Native buffer queue*/ struct list_head head; /*Share buffer cache queue*/ struct list_head share_head; uint8_t buf_client_count; }; struct msm_isp_buf_ops { Loading @@ -144,8 +140,7 @@ struct msm_isp_buf_ops { uint32_t bufq_handle, uint32_t *buf_src); int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, struct msm_isp_buffer **buf_info, uint32_t *buf_cnt); uint32_t bufq_handle, struct msm_isp_buffer **buf_info); int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, Loading Loading @@ -177,8 +172,8 @@ struct msm_isp_buf_ops { struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle); int (*update_put_buf_cnt)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, uint32_t bufq_handle, uint32_t buf_index, struct timeval *tv, uint32_t frame_id); uint32_t id, uint32_t bufq_handle, int32_t buf_index, struct timeval *tv, uint32_t frame_id, uint32_t pingpong_bit); }; struct msm_isp_buf_mgr { Loading