From 5bf83ce8c3f95be88cb8f16324b5863ffc5d5697 Mon Sep 17 00:00:00 2001 From: Meera Gande Date: Thu, 11 Oct 2018 15:32:51 +0530 Subject: [PATCH] msm: camera: isp: Handle frame drop due to delay In few scenarios, the request frame may get delayed and current and request frame id may become same. To handle such scenarios, made changes to inform user to delay a frame and process the request. Change-Id: I31fa04c386922c48a043c511a163c76316e21987 Signed-off-by: Meera Gande --- .../platform/msm/camera_v2/isp/msm_isp.c | 4 ++-- .../platform/msm/camera_v2/isp/msm_isp.h | 7 +----- .../msm/camera_v2/isp/msm_isp_axi_util.c | 23 ++++++++++++++++--- include/uapi/media/msmb_isp.h | 7 ++++++ 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c index 18961e69aadc..fa5aee08c37d 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c @@ -467,7 +467,7 @@ static int isp_vma_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { struct page *page; struct vfe_device *vfe_dev = vma->vm_private_data; - struct isp_proc *isp_page = NULL; + struct isp_kstate *isp_page = NULL; isp_page = vfe_dev->isp_page; @@ -749,7 +749,7 @@ int vfe_hw_probe(struct platform_device *pdev) vfe_dev->buf_mgr->init_done = 1; vfe_dev->vfe_open_cnt = 0; /*Allocate a page in kernel and map it to camera user process*/ - vfe_dev->isp_page = (struct isp_proc *)get_zeroed_page(GFP_KERNEL); + vfe_dev->isp_page = (struct isp_kstate *)get_zeroed_page(GFP_KERNEL); if (vfe_dev->isp_page == NULL) { pr_err("%s: no enough memory\n", __func__); rc = -ENOMEM; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index da8fbb3cd5b9..0c18bfe55842 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -762,11 +762,6 @@ struct msm_vfe_common_subdev { struct msm_vfe_common_dev_data *common_data; }; -struct isp_proc { - uint32_t kernel_sofid; - uint32_t vfeid; -}; - struct vfe_device { /* Driver private data */ struct platform_device *pdev; @@ -851,7 +846,7 @@ struct vfe_device { uint32_t recovery_irq1_mask; /* total bandwidth per vfe */ uint64_t total_bandwidth; - struct isp_proc *isp_page; + struct isp_kstate *isp_page; }; struct vfe_parent_device { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index 661850d6d7c6..180e5df98cc6 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -3497,6 +3497,14 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, frame_src = SRC_TO_INTF(stream_info->stream_src); pingpong_status = vfe_dev->hw_info-> vfe_ops.axi_ops.get_pingpong_status(vfe_dev); + + /* As MCT is still processing it, need to drop the additional requests*/ + if (vfe_dev->isp_page->drop_reconfig) { + pr_err("%s: MCT has not yet delayed %d drop request %d\n", + __func__, vfe_dev->isp_page->drop_reconfig, frame_id); + goto error; + } + /* * If PIX stream is active then RDI path uses SOF frame ID of PIX * In case of standalone RDI streaming, SOF are used from @@ -3510,9 +3518,18 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, vfe_dev->axi_data.src_info[frame_src].accept_frame == false) { pr_debug("%s:%d invalid time to request frame %d\n", __func__, __LINE__, frame_id); - goto error; - } - if ((vfe_dev->axi_data.src_info[frame_src].active && (frame_id != + vfe_dev->isp_page->drop_reconfig = 1; + } else if ((vfe_dev->axi_data.src_info[frame_src].active) && + (frame_id == + vfe_dev->axi_data.src_info[frame_src].frame_id) && + (stream_info->undelivered_request_cnt <= + MAX_BUFFERS_IN_HW)) { + vfe_dev->isp_page->drop_reconfig = 1; + pr_debug("%s: vfe_%d request_frame %d cur frame id %d pix %d\n", + __func__, vfe_dev->pdev->id, frame_id, + vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id, + vfe_dev->axi_data.src_info[VFE_PIX_0].active); + } else if ((vfe_dev->axi_data.src_info[frame_src].active && (frame_id != vfe_dev->axi_data.src_info[frame_src].frame_id + vfe_dev-> axi_data.src_info[frame_src].sof_counter_step)) || ((!vfe_dev->axi_data.src_info[frame_src].active))) { diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h index d84bb30d56fa..40e5c273011f 100644 --- a/include/uapi/media/msmb_isp.h +++ b/include/uapi/media/msmb_isp.h @@ -25,9 +25,16 @@ #define ISP_STATS_STREAM_BIT 0x80000000 #define VFE_HW_LIMIT 1 +#define ISP_KERNEL_STATE 1 struct msm_vfe_cfg_cmd_list; +struct isp_kstate { + uint32_t kernel_sofid; + uint32_t drop_reconfig; + uint32_t vfeid; +}; + enum ISP_START_PIXEL_PATTERN { ISP_BAYER_RGRGRG, ISP_BAYER_GRGRGR,