int msm_mctl_pp_notify(struct msm_cam_media_controller *p_mctl,
			struct msm_mctl_pp_frame_info *pp_frame_info)
{
		struct msm_mctl_pp_frame_cmd *pp_frame_cmd;
		pp_frame_cmd = &pp_frame_info->pp_frame_cmd;

		D("%s: msm_cam_evt_divert_frame=%d",
			__func__, sizeof(struct msm_mctl_pp_event_info));
		if ((MSM_MCTL_PP_VPE_FRAME_TO_APP &
			pp_frame_cmd->vpe_output_action)) {
			struct msm_free_buf done_frame;
			int msg_type =
				msm_mctl_pp_path_to_msg_type(
					pp_frame_cmd->path);

			done_frame.ch_paddr[0] =
				pp_frame_info->dest_frame.sp.phy_addr;
			done_frame.vb =
				pp_frame_info->dest_frame.handle;
			msm_mctl_buf_done_pp(
				p_mctl, msg_type, &done_frame, 0);
			pr_info("%s: vpe done to app, vb=0x%x, path=%d, phy=0x%x",
				__func__, done_frame.vb,
				pp_frame_cmd->path, done_frame.ch_paddr[0]);
		}
		if ((MSM_MCTL_PP_VPE_FRAME_ACK &
			pp_frame_cmd->vpe_output_action)) {
			struct v4l2_event v4l2_evt;
			struct msm_mctl_pp_event_info *pp_event_info;
			struct msm_isp_event_ctrl *isp_event;
			isp_event = kzalloc(sizeof(struct msm_isp_event_ctrl),
								GFP_ATOMIC);
			if (!isp_event) {
				pr_err("%s Insufficient memory.", __func__);
				return -ENOMEM;
			}
			memset(&v4l2_evt, 0, sizeof(v4l2_evt));
			*((uint32_t *)v4l2_evt.u.data) = (uint32_t)isp_event;

			/* Get hold of pp event info struct inside event ctrl.*/
			pp_event_info = &(isp_event->isp_data.pp_event_info);

			pp_event_info->event = MCTL_PP_EVENT_CMD_ACK;
			pp_event_info->ack.cmd = pp_frame_info->user_cmd;
			pp_event_info->ack.status = 0;
			pp_event_info->ack.cookie = pp_frame_cmd->cookie;
			v4l2_evt.type = V4L2_EVENT_PRIVATE_START +
						MSM_CAM_RESP_MCTL_PP_EVENT;

			v4l2_event_queue(
				p_mctl->config_device->
					config_stat_event_queue.pvdev,
				&v4l2_evt);
			D("%s: ack to daemon, cookie=0x%x, event = 0x%x",
				__func__, pp_frame_info->pp_frame_cmd.cookie,
				v4l2_evt.type);
		}
		kfree(pp_frame_info); /* free mem */
		return 0;
}
Example #2
0
int msm_mctl_pp_done(
	struct msm_cam_media_controller *p_mctl,
	void __user *arg)
{
	struct msm_pp_frame frame;
	int msg_type, image_mode, rc = 0;
	int dirty = 0;
	struct msm_free_buf buf;
	unsigned long flags;

	if (copy_from_user(&frame, arg, sizeof(frame)))
		return -EFAULT;

	spin_lock_irqsave(&p_mctl->pp_info.lock, flags);
	switch (frame.path) {
	case OUTPUT_TYPE_P:
		msg_type = VFE_MSG_OUTPUT_P;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
		break;
	case OUTPUT_TYPE_S:
		msg_type = VFE_MSG_OUTPUT_S;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
		break;
	case OUTPUT_TYPE_V:
		msg_type = VFE_MSG_OUTPUT_V;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
		break;
	case OUTPUT_TYPE_T:
	default:
		rc = -EFAULT;
		goto err;
	}
	D("%s Returning frame %x id %d to kernel ", __func__,
		(int)frame.handle, frame.frame_id);
	if (p_mctl->pp_info.div_frame[image_mode].ch_paddr[0]) {
		memcpy(&buf,
			&p_mctl->pp_info.div_frame[image_mode],
			sizeof(buf));
		memset(&p_mctl->pp_info.div_frame[image_mode],
			0, sizeof(buf));
		if (p_mctl->pp_info.cur_frame_id[image_mode] !=
					frame.frame_id) {
			/* dirty frame. should not pass to app */
			dirty = 1;
		}
	} else {
		if (frame.num_planes > 1)
			buf.ch_paddr[0] = frame.mp[0].phy_addr +
						frame.mp[0].data_offset;
		else
			buf.ch_paddr[0] = frame.sp.phy_addr + frame.sp.y_off;
	}
	spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
	/* here buf.addr is phy_addr */
	rc = msm_mctl_buf_done_pp(p_mctl, msg_type, &buf, dirty);
	return rc;
err:
	spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
	return rc;
}
Example #3
0
int msm_mctl_pp_notify(struct msm_cam_media_controller *p_mctl,
                       struct msm_mctl_pp_frame_info *pp_frame_info)
{
    struct msm_mctl_pp_frame_cmd *pp_frame_cmd;
    pp_frame_cmd = &pp_frame_info->pp_frame_cmd;

    D("%s: msm_cam_evt_divert_frame=%d",
      __func__, sizeof(struct msm_mctl_pp_event_info));
    if ((MSM_MCTL_PP_VPE_FRAME_TO_APP &
            pp_frame_cmd->vpe_output_action)) {
        struct msm_free_buf done_frame;
        int msg_type =
            msm_mctl_pp_path_to_msg_type(
                pp_frame_cmd->path);

        done_frame.ch_paddr[0] =
            pp_frame_info->dest_frame.sp.phy_addr;
        done_frame.vb =
            pp_frame_info->dest_frame.handle;
        msm_mctl_buf_done_pp(
            p_mctl, msg_type, &done_frame, 0);
        pr_err("%s: vpe done to app, vb=0x%x, path=%d, phy=0x%x",
               __func__, done_frame.vb,
               pp_frame_cmd->path, done_frame.ch_paddr[0]);
    }
    if ((MSM_MCTL_PP_VPE_FRAME_ACK &
            pp_frame_cmd->vpe_output_action)) {
        struct v4l2_event v4l2_evt;
        struct msm_mctl_pp_event_info *pp_event_info;
        memset(&v4l2_evt, 0, sizeof(v4l2_evt));
        pp_event_info =
            (struct msm_mctl_pp_event_info *)v4l2_evt.
            u.data;
        pp_event_info->event = MCTL_PP_EVENT_CMD_ACK;
        pp_event_info->ack.cmd = pp_frame_info->user_cmd;
        pp_event_info->ack.status = 0;
        pp_event_info->ack.cookie = pp_frame_cmd->cookie;
        v4l2_evt.type = V4L2_EVENT_PRIVATE_START +
                        MSM_CAM_RESP_MCTL_PP_EVENT;
        v4l2_event_queue(
            p_mctl->config_device->
            config_stat_event_queue.pvdev,
            &v4l2_evt);
        pr_err("%s: ack to daemon, cookie=0x%x, event = 0x%x",
               __func__, pp_frame_info->pp_frame_cmd.cookie,
               v4l2_evt.type);
    }
    kfree(pp_frame_info); /* free mem */
    return 0;
}
Example #4
0
int msm_mctl_pp_divert_done(
	struct msm_cam_media_controller *p_mctl,
	void __user *arg)
{
	struct msm_pp_frame frame;
	int msg_type, image_mode, rc = 0;
	int dirty = 0;
	struct msm_free_buf buf;
	unsigned long flags;
	D("%s enter\n", __func__);

	if (copy_from_user(&frame, arg, sizeof(frame)))
		return -EFAULT;

	spin_lock_irqsave(&p_mctl->pp_info.lock, flags);
	D("%s Frame path: %d\n", __func__, frame.path);
	switch (frame.path) {
	case OUTPUT_TYPE_P:
		msg_type = VFE_MSG_OUTPUT_P;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_PREVIEW;
		break;
	case OUTPUT_TYPE_S:
		msg_type = VFE_MSG_OUTPUT_S;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_MAIN;
		break;
	case OUTPUT_TYPE_V:
		msg_type = VFE_MSG_OUTPUT_V;
		image_mode = MSM_V4L2_EXT_CAPTURE_MODE_VIDEO;
		break;
	case OUTPUT_TYPE_T:
	default:
		rc = -EFAULT;
		goto err;
	}

	if (frame.num_planes > 1)
		buf.ch_paddr[0] = frame.mp[0].phy_addr;
	else
		buf.ch_paddr[0] = frame.sp.phy_addr;

	spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
	D("%s Frame done id: %d\n", __func__, frame.frame_id);
	rc = msm_mctl_buf_done_pp(p_mctl, msg_type, &buf, dirty);
	return rc;
err:
	spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags);
	return rc;
}