Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 038cb397 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: isp: Create union for update command payload"

parents 12509d89 e322a9b2
Loading
Loading
Loading
Loading
+86 −34
Original line number Diff line number Diff line
@@ -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;
@@ -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) {
@@ -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(&timestamp);
			frame_id = vfe_dev->axi_data.src_info[
@@ -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 ==
@@ -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 */
@@ -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)))  {
@@ -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",
@@ -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;
}

+11 −6
Original line number Diff line number Diff line
@@ -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) {
@@ -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",
@@ -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;
@@ -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;

+95 −28
Original line number Diff line number Diff line
@@ -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,
@@ -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;
@@ -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 {
@@ -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)