int msm_mctl_pp_proc_cmd(struct msm_cam_media_controller *p_mctl, struct msm_mctl_pp_cmd *pp_cmd) { int rc = 0; struct msm_mctl_pp_frame_buffer pp_buffer; struct msm_frame_buffer *buf = NULL; void __user *argp = (void __user *)pp_cmd->value; int msg_type = VFE_MSG_OUTPUT_V; unsigned long flags; switch (pp_cmd->id) { case MCTL_CMD_GET_FRAME_BUFFER: { if (copy_from_user(&pp_buffer, pp_cmd->value, sizeof(pp_buffer))) return -EFAULT; msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path); buf = msm_mctl_get_free_buf(p_mctl, msg_type); pp_buffer.buf_handle = (uint32_t)buf; if (copy_to_user((void *)argp, &pp_buffer, sizeof(struct msm_mctl_pp_frame_buffer))) { ERR_COPY_TO_USER(); rc = -EFAULT; } break; } case MCTL_CMD_PUT_FRAME_BUFFER: { if (copy_from_user(&pp_buffer, pp_cmd->value, sizeof(pp_buffer))) return -EFAULT; msg_type = msm_mctl_pp_path_to_msg_type(pp_buffer.path); buf = (struct msm_frame_buffer *)pp_buffer.buf_handle; msm_mctl_put_free_buf(p_mctl, msg_type, buf); break; } case MCTL_CMD_DIVERT_FRAME_PP_PATH: { struct msm_mctl_pp_divert_pp divert_pp; if (copy_from_user(&divert_pp, pp_cmd->value, sizeof(divert_pp))) return -EFAULT; D("%s: PP_PATH, path=%d", __func__, divert_pp.path); spin_lock_irqsave(&p_mctl->pp_info.lock, flags); if (divert_pp.enable) p_mctl->pp_info.pp_ctrl.pp_msg_type |= divert_pp.path; else p_mctl->pp_info.pp_ctrl.pp_msg_type &= ~divert_pp.path; spin_unlock_irqrestore(&p_mctl->pp_info.lock, flags); D("%s: pp path = 0x%x", __func__, p_mctl->pp_info.pp_ctrl.pp_msg_type); break; } default: rc = -EPERM; break; } return rc; }
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; }
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; }