Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.c +2 −2 Original line number Diff line number Diff line Loading @@ -451,7 +451,7 @@ static int isp_vma_fault(struct vm_fault *vmf) { struct page *page; struct vfe_device *vfe_dev = vmf->vma->vm_private_data; struct isp_proc *isp_page = NULL; struct isp_kstate *isp_page = NULL; isp_page = vfe_dev->isp_page; Loading Loading @@ -743,7 +743,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; Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.h +2 −7 Original line number Diff line number Diff line /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -771,11 +771,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; Loading Loading @@ -862,7 +857,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; /* Dual VFE IRQ CAMSS Info*/ void __iomem *camss_base; Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +27 −8 Original line number Diff line number Diff line Loading @@ -605,7 +605,8 @@ static int msm_isp_composite_irq(struct vfe_device *vfe_dev, * * Returns void */ static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info) static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info, uint32_t drop_reconfig) { if (stream_info->stream_type == BURST_STREAM) { if (stream_info->runtime_num_burst_capture == 0 || Loading @@ -615,7 +616,8 @@ static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info) MSM_VFE_STREAM_STOP_PERIOD; } if (stream_info->undelivered_request_cnt > 0) if (stream_info->undelivered_request_cnt > 0 && drop_reconfig != 1) stream_info->current_framedrop_period = MSM_VFE_STREAM_STOP_PERIOD; Loading Loading @@ -670,7 +672,8 @@ void msm_isp_process_reg_upd_epoch_irq(struct vfe_device *vfe_dev, break; case MSM_ISP_COMP_IRQ_EPOCH: if (stream_info->state == ACTIVE) msm_isp_update_framedrop_reg(stream_info); msm_isp_update_framedrop_reg(stream_info, vfe_dev->isp_page->drop_reconfig); break; default: WARN(1, "Invalid irq %d\n", irq); Loading Loading @@ -3531,8 +3534,15 @@ 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); 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 Loading @@ -3546,9 +3556,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))) { Loading include/uapi/media/msmb_isp.h +7 −1 Original line number Diff line number Diff line Loading @@ -27,10 +27,16 @@ #define VFE_HW_LIMIT 1 #define DUAL_ISP_SYNC 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, Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.c +2 −2 Original line number Diff line number Diff line Loading @@ -451,7 +451,7 @@ static int isp_vma_fault(struct vm_fault *vmf) { struct page *page; struct vfe_device *vfe_dev = vmf->vma->vm_private_data; struct isp_proc *isp_page = NULL; struct isp_kstate *isp_page = NULL; isp_page = vfe_dev->isp_page; Loading Loading @@ -743,7 +743,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; Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.h +2 −7 Original line number Diff line number Diff line /* Copyright (c) 2013-2018, The Linux Foundation. All rights reserved. /* Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -771,11 +771,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; Loading Loading @@ -862,7 +857,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; /* Dual VFE IRQ CAMSS Info*/ void __iomem *camss_base; Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +27 −8 Original line number Diff line number Diff line Loading @@ -605,7 +605,8 @@ static int msm_isp_composite_irq(struct vfe_device *vfe_dev, * * Returns void */ static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info) static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info, uint32_t drop_reconfig) { if (stream_info->stream_type == BURST_STREAM) { if (stream_info->runtime_num_burst_capture == 0 || Loading @@ -615,7 +616,8 @@ static void msm_isp_update_framedrop_reg(struct msm_vfe_axi_stream *stream_info) MSM_VFE_STREAM_STOP_PERIOD; } if (stream_info->undelivered_request_cnt > 0) if (stream_info->undelivered_request_cnt > 0 && drop_reconfig != 1) stream_info->current_framedrop_period = MSM_VFE_STREAM_STOP_PERIOD; Loading Loading @@ -670,7 +672,8 @@ void msm_isp_process_reg_upd_epoch_irq(struct vfe_device *vfe_dev, break; case MSM_ISP_COMP_IRQ_EPOCH: if (stream_info->state == ACTIVE) msm_isp_update_framedrop_reg(stream_info); msm_isp_update_framedrop_reg(stream_info, vfe_dev->isp_page->drop_reconfig); break; default: WARN(1, "Invalid irq %d\n", irq); Loading Loading @@ -3531,8 +3534,15 @@ 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); 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 Loading @@ -3546,9 +3556,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))) { Loading
include/uapi/media/msmb_isp.h +7 −1 Original line number Diff line number Diff line Loading @@ -27,10 +27,16 @@ #define VFE_HW_LIMIT 1 #define DUAL_ISP_SYNC 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, Loading