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_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; }
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; }
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; }