Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +86 −34 Original line number Diff line number Diff line Loading @@ -3247,7 +3247,7 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) struct msm_vfe_axi_stream *stream_info; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_axi_stream_update_cmd *update_cmd = arg; struct msm_vfe_axi_stream_cfg_update_info *update_info; struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; struct msm_isp_sw_framskip *sw_skip_info = NULL; unsigned long flags; struct msm_isp_timestamp timestamp; Loading @@ -3258,7 +3258,8 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) return -EINVAL; for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; /*check array reference bounds*/ if (HANDLE_TO_IDX(update_info->stream_handle) >= VFE_AXI_SRC_MAX) { Loading Loading @@ -3289,16 +3290,24 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) } } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(update_info->stream_handle)]; switch (update_cmd->update_type) { case ENABLE_STREAM_BUF_DIVERT: for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; stream_info->buf_divert = 1; } break; case DISABLE_STREAM_BUF_DIVERT: for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; stream_info->buf_divert = 0; msm_isp_get_timestamp(×tamp); frame_id = vfe_dev->axi_data.src_info[ Loading @@ -3320,11 +3329,18 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) ISP_EVENT_BUF_FATAL_ERROR); return rc; } } break; case UPDATE_STREAM_FRAMEDROP_PATTERN: { for (i = 0; i < update_cmd->num_streams; i++) { uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; spin_lock_irqsave(&stream_info->lock, flags); /* no change then break early */ if (stream_info->current_framedrop_period == Loading @@ -3348,9 +3364,16 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) if (stream_info->stream_type != BURST_STREAM) msm_isp_cfg_framedrop_reg(vfe_dev, stream_info); spin_unlock_irqrestore(&stream_info->lock, flags); } break; } case UPDATE_STREAM_SW_FRAME_DROP: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; sw_skip_info = &update_info->sw_skip_info; if (sw_skip_info->stream_src_mask != 0) { /* SW image buffer drop */ Loading @@ -3365,14 +3388,22 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) spin_unlock_irqrestore(&stream_info->lock, flags); } } break; } case UPDATE_STREAM_AXI_CONFIG: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; for (j = 0; j < stream_info->num_planes; j++) { stream_info->plane_cfg[j] = update_info->plane_cfg[j]; } stream_info->output_format = update_info->output_format; stream_info->output_format = update_info->output_format; if ((stream_info->state == ACTIVE) && ((vfe_dev->hw_info->runtime_axi_update == 0) || (vfe_dev->dual_vfe_enable == 1))) { Loading Loading @@ -3407,25 +3438,46 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) spin_unlock_irqrestore(&stream_info->lock, flags); } } break; } case UPDATE_STREAM_REQUEST_FRAMES: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; rc = msm_isp_request_frame(vfe_dev, stream_info, update_info->user_stream_id, update_info->frame_id); if (rc) pr_err("%s failed to request frame!\n", __func__); } break; } case UPDATE_STREAM_ADD_BUFQ: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; rc = msm_isp_add_buf_queue(vfe_dev, stream_info, update_info->user_stream_id); if (rc) pr_err("%s failed to add bufq!\n", __func__); } break; } case UPDATE_STREAM_REMOVE_BUFQ: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; msm_isp_remove_buf_queue(vfe_dev, stream_info, update_info->user_stream_id); pr_debug("%s, Remove bufq for Stream 0x%x\n", Loading @@ -3439,14 +3491,14 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) pr_err("%s: wait for update failed\n", __func__); } } break; } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; } } return rc; } Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +11 −6 Original line number Diff line number Diff line Loading @@ -868,7 +868,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) > vfe_dev->hw_info->stats_hw_info->num_stats_type) { Loading @@ -879,9 +880,11 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &stats_data->stream_info[ STATS_IDX(update_info->stream_handle)]; STATS_IDX( update_info->stream_handle)]; if (stream_info->stream_handle != update_info->stream_handle) { pr_err("%s: stats stream handle %x %x mismatch!\n", Loading @@ -895,7 +898,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); if (update_info->skip_pattern == SKIP_ALL) if (update_info->skip_pattern == SKIP_ALL) stream_info->framedrop_pattern = 0x0; else stream_info->framedrop_pattern = 0x1; Loading @@ -906,7 +910,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) break; } case UPDATE_STREAM_SW_FRAME_DROP: { sw_skip_info = &update_info->sw_skip_info; sw_skip_info = &update_info->sw_skip_info; if (!stream_info->sw_skip.stream_src_mask) stream_info->sw_skip = *sw_skip_info; Loading include/uapi/media/msmb_isp.h +95 −28 Original line number Diff line number Diff line Loading @@ -323,7 +323,9 @@ enum msm_vfe_axi_stream_update_type { UPDATE_STREAM_ADD_BUFQ, UPDATE_STREAM_REMOVE_BUFQ, UPDATE_STREAM_SW_FRAME_DROP, UPDATE_STREAM_REQUEST_FRAMES_VER2, }; #define UPDATE_STREAM_REQUEST_FRAMES_VER2 UPDATE_STREAM_REQUEST_FRAMES_VER2 enum msm_vfe_iommu_type { IOMMU_ATTACH, Loading @@ -346,6 +348,13 @@ struct msm_vfe_axi_stream_cfg_update_info { struct msm_isp_sw_framskip sw_skip_info; }; struct msm_vfe_axi_stream_cfg_update_info_req_frm { uint32_t stream_handle; uint32_t user_stream_id; uint32_t frame_id; uint32_t buf_index; }; struct msm_vfe_axi_halt_cmd { uint32_t stop_camif; uint32_t overflow_detected; Loading @@ -364,8 +373,15 @@ struct msm_vfe_axi_restart_cmd { struct msm_vfe_axi_stream_update_cmd { uint32_t num_streams; enum msm_vfe_axi_stream_update_type update_type; /* * For backward compatibility, ensure 1st member of any struct * in union below is uint32_t stream_handle. */ union { struct msm_vfe_axi_stream_cfg_update_info update_info[MSM_ISP_STATS_MAX]; struct msm_vfe_axi_stream_cfg_update_info_req_frm req_frm_ver2; }; }; struct msm_vfe_smmu_attach_cmd { Loading Loading @@ -806,82 +822,133 @@ struct msm_isp_ahb_clk_cfg { #define V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') /* 14 GRGR.BGBG.*/ #define V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') /* 14 RGRG.GBGB.*/ enum msm_isp_ioctl_cmd_code { MSM_VFE_REG_CFG = BASE_VIDIOC_PRIVATE, MSM_ISP_REQUEST_BUF, MSM_ISP_ENQUEUE_BUF, MSM_ISP_RELEASE_BUF, MSM_ISP_REQUEST_STREAM, MSM_ISP_CFG_STREAM, MSM_ISP_RELEASE_STREAM, MSM_ISP_INPUT_CFG, MSM_ISP_SET_SRC_STATE, MSM_ISP_REQUEST_STATS_STREAM, MSM_ISP_CFG_STATS_STREAM, MSM_ISP_RELEASE_STATS_STREAM, MSM_ISP_REG_UPDATE_CMD, MSM_ISP_UPDATE_STREAM, MSM_VFE_REG_LIST_CFG, MSM_ISP_SMMU_ATTACH, MSM_ISP_UPDATE_STATS_STREAM, MSM_ISP_AXI_HALT, MSM_ISP_AXI_RESET, MSM_ISP_AXI_RESTART, MSM_ISP_FETCH_ENG_START, MSM_ISP_DEQUEUE_BUF, MSM_ISP_SET_DUAL_HW_MASTER_SLAVE, MSM_ISP_MAP_BUF_START_FE, MSM_ISP_UNMAP_BUF, }; #define VIDIOC_MSM_VFE_REG_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE, struct msm_vfe_cfg_cmd2) _IOWR('V', MSM_VFE_REG_CFG, \ struct msm_vfe_cfg_cmd2) #define VIDIOC_MSM_ISP_REQUEST_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+1, struct msm_isp_buf_request) _IOWR('V', MSM_ISP_REQUEST_BUF, \ struct msm_isp_buf_request) #define VIDIOC_MSM_ISP_ENQUEUE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+2, struct msm_isp_qbuf_info) _IOWR('V', MSM_ISP_ENQUEUE_BUF, \ struct msm_isp_qbuf_info) #define VIDIOC_MSM_ISP_RELEASE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+3, struct msm_isp_buf_request) _IOWR('V', MSM_ISP_RELEASE_BUF, \ struct msm_isp_buf_request) #define VIDIOC_MSM_ISP_REQUEST_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+4, struct msm_vfe_axi_stream_request_cmd) _IOWR('V', MSM_ISP_REQUEST_STREAM, \ struct msm_vfe_axi_stream_request_cmd) #define VIDIOC_MSM_ISP_CFG_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+5, struct msm_vfe_axi_stream_cfg_cmd) _IOWR('V', MSM_ISP_CFG_STREAM, \ struct msm_vfe_axi_stream_cfg_cmd) #define VIDIOC_MSM_ISP_RELEASE_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+6, struct msm_vfe_axi_stream_release_cmd) _IOWR('V', MSM_ISP_RELEASE_STREAM, \ struct msm_vfe_axi_stream_release_cmd) #define VIDIOC_MSM_ISP_INPUT_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+7, struct msm_vfe_input_cfg) _IOWR('V', MSM_ISP_INPUT_CFG, \ struct msm_vfe_input_cfg) #define VIDIOC_MSM_ISP_SET_SRC_STATE \ _IOWR('V', BASE_VIDIOC_PRIVATE+8, struct msm_vfe_axi_src_state) _IOWR('V', MSM_ISP_SET_SRC_STATE, \ struct msm_vfe_axi_src_state) #define VIDIOC_MSM_ISP_REQUEST_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+9, \ _IOWR('V', MSM_ISP_REQUEST_STATS_STREAM, \ struct msm_vfe_stats_stream_request_cmd) #define VIDIOC_MSM_ISP_CFG_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+10, struct msm_vfe_stats_stream_cfg_cmd) _IOWR('V', MSM_ISP_CFG_STATS_STREAM, \ struct msm_vfe_stats_stream_cfg_cmd) #define VIDIOC_MSM_ISP_RELEASE_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+11, \ _IOWR('V', MSM_ISP_RELEASE_STATS_STREAM, \ struct msm_vfe_stats_stream_release_cmd) #define VIDIOC_MSM_ISP_REG_UPDATE_CMD \ _IOWR('V', BASE_VIDIOC_PRIVATE+12, enum msm_vfe_input_src) _IOWR('V', MSM_ISP_REG_UPDATE_CMD, \ enum msm_vfe_input_src) #define VIDIOC_MSM_ISP_UPDATE_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+13, struct msm_vfe_axi_stream_update_cmd) _IOWR('V', MSM_ISP_UPDATE_STREAM, \ struct msm_vfe_axi_stream_update_cmd) #define VIDIOC_MSM_VFE_REG_LIST_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+14, struct msm_vfe_cfg_cmd_list) _IOWR('V', MSM_VFE_REG_LIST_CFG, \ struct msm_vfe_cfg_cmd_list) #define VIDIOC_MSM_ISP_SMMU_ATTACH \ _IOWR('V', BASE_VIDIOC_PRIVATE+15, struct msm_vfe_smmu_attach_cmd) _IOWR('V', MSM_ISP_SMMU_ATTACH, \ struct msm_vfe_smmu_attach_cmd) #define VIDIOC_MSM_ISP_UPDATE_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+16, struct msm_vfe_axi_stream_update_cmd) _IOWR('V', MSM_ISP_UPDATE_STATS_STREAM, \ struct msm_vfe_axi_stream_update_cmd) #define VIDIOC_MSM_ISP_AXI_HALT \ _IOWR('V', BASE_VIDIOC_PRIVATE+17, struct msm_vfe_axi_halt_cmd) _IOWR('V', MSM_ISP_AXI_HALT, \ struct msm_vfe_axi_halt_cmd) #define VIDIOC_MSM_ISP_AXI_RESET \ _IOWR('V', BASE_VIDIOC_PRIVATE+18, struct msm_vfe_axi_reset_cmd) _IOWR('V', MSM_ISP_AXI_RESET, \ struct msm_vfe_axi_reset_cmd) #define VIDIOC_MSM_ISP_AXI_RESTART \ _IOWR('V', BASE_VIDIOC_PRIVATE+19, struct msm_vfe_axi_restart_cmd) _IOWR('V', MSM_ISP_AXI_RESTART, \ struct msm_vfe_axi_restart_cmd) #define VIDIOC_MSM_ISP_FETCH_ENG_START \ _IOWR('V', BASE_VIDIOC_PRIVATE+20, struct msm_vfe_fetch_eng_start) _IOWR('V', MSM_ISP_FETCH_ENG_START, \ struct msm_vfe_fetch_eng_start) #define VIDIOC_MSM_ISP_DEQUEUE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_isp_qbuf_info) _IOWR('V', MSM_ISP_DEQUEUE_BUF, \ struct msm_isp_qbuf_info) #define VIDIOC_MSM_ISP_SET_DUAL_HW_MASTER_SLAVE \ _IOWR('V', BASE_VIDIOC_PRIVATE+22, struct msm_isp_set_dual_hw_ms_cmd) _IOWR('V', MSM_ISP_SET_DUAL_HW_MASTER_SLAVE, \ struct msm_isp_set_dual_hw_ms_cmd) #define VIDIOC_MSM_ISP_MAP_BUF_START_FE \ _IOWR('V', BASE_VIDIOC_PRIVATE+23, struct msm_vfe_fetch_eng_start) _IOWR('V', MSM_ISP_MAP_BUF_START_FE, \ struct msm_vfe_fetch_eng_start) #define VIDIOC_MSM_ISP_UNMAP_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+24, struct msm_isp_unmap_buf_req) _IOWR('V', MSM_ISP_UNMAP_BUF, \ struct msm_isp_unmap_buf_req) #define VIDIOC_MSM_ISP_AHB_CLK_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+25, struct msm_isp_ahb_clk_cfg) Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +86 −34 Original line number Diff line number Diff line Loading @@ -3247,7 +3247,7 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) struct msm_vfe_axi_stream *stream_info; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_axi_stream_update_cmd *update_cmd = arg; struct msm_vfe_axi_stream_cfg_update_info *update_info; struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; struct msm_isp_sw_framskip *sw_skip_info = NULL; unsigned long flags; struct msm_isp_timestamp timestamp; Loading @@ -3258,7 +3258,8 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) return -EINVAL; for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; /*check array reference bounds*/ if (HANDLE_TO_IDX(update_info->stream_handle) >= VFE_AXI_SRC_MAX) { Loading Loading @@ -3289,16 +3290,24 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) } } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(update_info->stream_handle)]; switch (update_cmd->update_type) { case ENABLE_STREAM_BUF_DIVERT: for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; stream_info->buf_divert = 1; } break; case DISABLE_STREAM_BUF_DIVERT: for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; stream_info->buf_divert = 0; msm_isp_get_timestamp(×tamp); frame_id = vfe_dev->axi_data.src_info[ Loading @@ -3320,11 +3329,18 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) ISP_EVENT_BUF_FATAL_ERROR); return rc; } } break; case UPDATE_STREAM_FRAMEDROP_PATTERN: { for (i = 0; i < update_cmd->num_streams; i++) { uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; spin_lock_irqsave(&stream_info->lock, flags); /* no change then break early */ if (stream_info->current_framedrop_period == Loading @@ -3348,9 +3364,16 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) if (stream_info->stream_type != BURST_STREAM) msm_isp_cfg_framedrop_reg(vfe_dev, stream_info); spin_unlock_irqrestore(&stream_info->lock, flags); } break; } case UPDATE_STREAM_SW_FRAME_DROP: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; sw_skip_info = &update_info->sw_skip_info; if (sw_skip_info->stream_src_mask != 0) { /* SW image buffer drop */ Loading @@ -3365,14 +3388,22 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) spin_unlock_irqrestore(&stream_info->lock, flags); } } break; } case UPDATE_STREAM_AXI_CONFIG: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; for (j = 0; j < stream_info->num_planes; j++) { stream_info->plane_cfg[j] = update_info->plane_cfg[j]; } stream_info->output_format = update_info->output_format; stream_info->output_format = update_info->output_format; if ((stream_info->state == ACTIVE) && ((vfe_dev->hw_info->runtime_axi_update == 0) || (vfe_dev->dual_vfe_enable == 1))) { Loading Loading @@ -3407,25 +3438,46 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) spin_unlock_irqrestore(&stream_info->lock, flags); } } break; } case UPDATE_STREAM_REQUEST_FRAMES: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; rc = msm_isp_request_frame(vfe_dev, stream_info, update_info->user_stream_id, update_info->frame_id); if (rc) pr_err("%s failed to request frame!\n", __func__); } break; } case UPDATE_STREAM_ADD_BUFQ: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; rc = msm_isp_add_buf_queue(vfe_dev, stream_info, update_info->user_stream_id); if (rc) pr_err("%s failed to add bufq!\n", __func__); } break; } case UPDATE_STREAM_REMOVE_BUFQ: { for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &axi_data->stream_info[HANDLE_TO_IDX( update_info->stream_handle)]; msm_isp_remove_buf_queue(vfe_dev, stream_info, update_info->user_stream_id); pr_debug("%s, Remove bufq for Stream 0x%x\n", Loading @@ -3439,14 +3491,14 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) pr_err("%s: wait for update failed\n", __func__); } } break; } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; } } return rc; } Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +11 −6 Original line number Diff line number Diff line Loading @@ -868,7 +868,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) > vfe_dev->hw_info->stats_hw_info->num_stats_type) { Loading @@ -879,9 +880,11 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) } for (i = 0; i < update_cmd->num_streams; i++) { update_info = &update_cmd->update_info[i]; update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; stream_info = &stats_data->stream_info[ STATS_IDX(update_info->stream_handle)]; STATS_IDX( update_info->stream_handle)]; if (stream_info->stream_handle != update_info->stream_handle) { pr_err("%s: stats stream handle %x %x mismatch!\n", Loading @@ -895,7 +898,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) uint32_t framedrop_period = msm_isp_get_framedrop_period( update_info->skip_pattern); if (update_info->skip_pattern == SKIP_ALL) if (update_info->skip_pattern == SKIP_ALL) stream_info->framedrop_pattern = 0x0; else stream_info->framedrop_pattern = 0x1; Loading @@ -906,7 +910,8 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) break; } case UPDATE_STREAM_SW_FRAME_DROP: { sw_skip_info = &update_info->sw_skip_info; sw_skip_info = &update_info->sw_skip_info; if (!stream_info->sw_skip.stream_src_mask) stream_info->sw_skip = *sw_skip_info; Loading
include/uapi/media/msmb_isp.h +95 −28 Original line number Diff line number Diff line Loading @@ -323,7 +323,9 @@ enum msm_vfe_axi_stream_update_type { UPDATE_STREAM_ADD_BUFQ, UPDATE_STREAM_REMOVE_BUFQ, UPDATE_STREAM_SW_FRAME_DROP, UPDATE_STREAM_REQUEST_FRAMES_VER2, }; #define UPDATE_STREAM_REQUEST_FRAMES_VER2 UPDATE_STREAM_REQUEST_FRAMES_VER2 enum msm_vfe_iommu_type { IOMMU_ATTACH, Loading @@ -346,6 +348,13 @@ struct msm_vfe_axi_stream_cfg_update_info { struct msm_isp_sw_framskip sw_skip_info; }; struct msm_vfe_axi_stream_cfg_update_info_req_frm { uint32_t stream_handle; uint32_t user_stream_id; uint32_t frame_id; uint32_t buf_index; }; struct msm_vfe_axi_halt_cmd { uint32_t stop_camif; uint32_t overflow_detected; Loading @@ -364,8 +373,15 @@ struct msm_vfe_axi_restart_cmd { struct msm_vfe_axi_stream_update_cmd { uint32_t num_streams; enum msm_vfe_axi_stream_update_type update_type; /* * For backward compatibility, ensure 1st member of any struct * in union below is uint32_t stream_handle. */ union { struct msm_vfe_axi_stream_cfg_update_info update_info[MSM_ISP_STATS_MAX]; struct msm_vfe_axi_stream_cfg_update_info_req_frm req_frm_ver2; }; }; struct msm_vfe_smmu_attach_cmd { Loading Loading @@ -806,82 +822,133 @@ struct msm_isp_ahb_clk_cfg { #define V4L2_PIX_FMT_SGRBG14 v4l2_fourcc('B', 'A', '1', '4') /* 14 GRGR.BGBG.*/ #define V4L2_PIX_FMT_SRGGB14 v4l2_fourcc('R', 'G', '1', '4') /* 14 RGRG.GBGB.*/ enum msm_isp_ioctl_cmd_code { MSM_VFE_REG_CFG = BASE_VIDIOC_PRIVATE, MSM_ISP_REQUEST_BUF, MSM_ISP_ENQUEUE_BUF, MSM_ISP_RELEASE_BUF, MSM_ISP_REQUEST_STREAM, MSM_ISP_CFG_STREAM, MSM_ISP_RELEASE_STREAM, MSM_ISP_INPUT_CFG, MSM_ISP_SET_SRC_STATE, MSM_ISP_REQUEST_STATS_STREAM, MSM_ISP_CFG_STATS_STREAM, MSM_ISP_RELEASE_STATS_STREAM, MSM_ISP_REG_UPDATE_CMD, MSM_ISP_UPDATE_STREAM, MSM_VFE_REG_LIST_CFG, MSM_ISP_SMMU_ATTACH, MSM_ISP_UPDATE_STATS_STREAM, MSM_ISP_AXI_HALT, MSM_ISP_AXI_RESET, MSM_ISP_AXI_RESTART, MSM_ISP_FETCH_ENG_START, MSM_ISP_DEQUEUE_BUF, MSM_ISP_SET_DUAL_HW_MASTER_SLAVE, MSM_ISP_MAP_BUF_START_FE, MSM_ISP_UNMAP_BUF, }; #define VIDIOC_MSM_VFE_REG_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE, struct msm_vfe_cfg_cmd2) _IOWR('V', MSM_VFE_REG_CFG, \ struct msm_vfe_cfg_cmd2) #define VIDIOC_MSM_ISP_REQUEST_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+1, struct msm_isp_buf_request) _IOWR('V', MSM_ISP_REQUEST_BUF, \ struct msm_isp_buf_request) #define VIDIOC_MSM_ISP_ENQUEUE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+2, struct msm_isp_qbuf_info) _IOWR('V', MSM_ISP_ENQUEUE_BUF, \ struct msm_isp_qbuf_info) #define VIDIOC_MSM_ISP_RELEASE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+3, struct msm_isp_buf_request) _IOWR('V', MSM_ISP_RELEASE_BUF, \ struct msm_isp_buf_request) #define VIDIOC_MSM_ISP_REQUEST_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+4, struct msm_vfe_axi_stream_request_cmd) _IOWR('V', MSM_ISP_REQUEST_STREAM, \ struct msm_vfe_axi_stream_request_cmd) #define VIDIOC_MSM_ISP_CFG_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+5, struct msm_vfe_axi_stream_cfg_cmd) _IOWR('V', MSM_ISP_CFG_STREAM, \ struct msm_vfe_axi_stream_cfg_cmd) #define VIDIOC_MSM_ISP_RELEASE_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+6, struct msm_vfe_axi_stream_release_cmd) _IOWR('V', MSM_ISP_RELEASE_STREAM, \ struct msm_vfe_axi_stream_release_cmd) #define VIDIOC_MSM_ISP_INPUT_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+7, struct msm_vfe_input_cfg) _IOWR('V', MSM_ISP_INPUT_CFG, \ struct msm_vfe_input_cfg) #define VIDIOC_MSM_ISP_SET_SRC_STATE \ _IOWR('V', BASE_VIDIOC_PRIVATE+8, struct msm_vfe_axi_src_state) _IOWR('V', MSM_ISP_SET_SRC_STATE, \ struct msm_vfe_axi_src_state) #define VIDIOC_MSM_ISP_REQUEST_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+9, \ _IOWR('V', MSM_ISP_REQUEST_STATS_STREAM, \ struct msm_vfe_stats_stream_request_cmd) #define VIDIOC_MSM_ISP_CFG_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+10, struct msm_vfe_stats_stream_cfg_cmd) _IOWR('V', MSM_ISP_CFG_STATS_STREAM, \ struct msm_vfe_stats_stream_cfg_cmd) #define VIDIOC_MSM_ISP_RELEASE_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+11, \ _IOWR('V', MSM_ISP_RELEASE_STATS_STREAM, \ struct msm_vfe_stats_stream_release_cmd) #define VIDIOC_MSM_ISP_REG_UPDATE_CMD \ _IOWR('V', BASE_VIDIOC_PRIVATE+12, enum msm_vfe_input_src) _IOWR('V', MSM_ISP_REG_UPDATE_CMD, \ enum msm_vfe_input_src) #define VIDIOC_MSM_ISP_UPDATE_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+13, struct msm_vfe_axi_stream_update_cmd) _IOWR('V', MSM_ISP_UPDATE_STREAM, \ struct msm_vfe_axi_stream_update_cmd) #define VIDIOC_MSM_VFE_REG_LIST_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+14, struct msm_vfe_cfg_cmd_list) _IOWR('V', MSM_VFE_REG_LIST_CFG, \ struct msm_vfe_cfg_cmd_list) #define VIDIOC_MSM_ISP_SMMU_ATTACH \ _IOWR('V', BASE_VIDIOC_PRIVATE+15, struct msm_vfe_smmu_attach_cmd) _IOWR('V', MSM_ISP_SMMU_ATTACH, \ struct msm_vfe_smmu_attach_cmd) #define VIDIOC_MSM_ISP_UPDATE_STATS_STREAM \ _IOWR('V', BASE_VIDIOC_PRIVATE+16, struct msm_vfe_axi_stream_update_cmd) _IOWR('V', MSM_ISP_UPDATE_STATS_STREAM, \ struct msm_vfe_axi_stream_update_cmd) #define VIDIOC_MSM_ISP_AXI_HALT \ _IOWR('V', BASE_VIDIOC_PRIVATE+17, struct msm_vfe_axi_halt_cmd) _IOWR('V', MSM_ISP_AXI_HALT, \ struct msm_vfe_axi_halt_cmd) #define VIDIOC_MSM_ISP_AXI_RESET \ _IOWR('V', BASE_VIDIOC_PRIVATE+18, struct msm_vfe_axi_reset_cmd) _IOWR('V', MSM_ISP_AXI_RESET, \ struct msm_vfe_axi_reset_cmd) #define VIDIOC_MSM_ISP_AXI_RESTART \ _IOWR('V', BASE_VIDIOC_PRIVATE+19, struct msm_vfe_axi_restart_cmd) _IOWR('V', MSM_ISP_AXI_RESTART, \ struct msm_vfe_axi_restart_cmd) #define VIDIOC_MSM_ISP_FETCH_ENG_START \ _IOWR('V', BASE_VIDIOC_PRIVATE+20, struct msm_vfe_fetch_eng_start) _IOWR('V', MSM_ISP_FETCH_ENG_START, \ struct msm_vfe_fetch_eng_start) #define VIDIOC_MSM_ISP_DEQUEUE_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+21, struct msm_isp_qbuf_info) _IOWR('V', MSM_ISP_DEQUEUE_BUF, \ struct msm_isp_qbuf_info) #define VIDIOC_MSM_ISP_SET_DUAL_HW_MASTER_SLAVE \ _IOWR('V', BASE_VIDIOC_PRIVATE+22, struct msm_isp_set_dual_hw_ms_cmd) _IOWR('V', MSM_ISP_SET_DUAL_HW_MASTER_SLAVE, \ struct msm_isp_set_dual_hw_ms_cmd) #define VIDIOC_MSM_ISP_MAP_BUF_START_FE \ _IOWR('V', BASE_VIDIOC_PRIVATE+23, struct msm_vfe_fetch_eng_start) _IOWR('V', MSM_ISP_MAP_BUF_START_FE, \ struct msm_vfe_fetch_eng_start) #define VIDIOC_MSM_ISP_UNMAP_BUF \ _IOWR('V', BASE_VIDIOC_PRIVATE+24, struct msm_isp_unmap_buf_req) _IOWR('V', MSM_ISP_UNMAP_BUF, \ struct msm_isp_unmap_buf_req) #define VIDIOC_MSM_ISP_AHB_CLK_CFG \ _IOWR('V', BASE_VIDIOC_PRIVATE+25, struct msm_isp_ahb_clk_cfg) Loading