Loading drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +91 −27 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define BUF_DEBUG_FULL 0 struct msm_isp_bufq *msm_isp_get_bufq( struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle) Loading Loading @@ -515,7 +517,7 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } } else { CDBG("%s: No Buffer session_id: %d stream_id: %d\n", CDBG("%s: No HAL Buffer session_id: %d stream_id: %d\n", __func__, bufq->session_id, bufq->stream_id); rc = -EINVAL; } Loading Loading @@ -707,7 +709,8 @@ static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, } } } else { pr_warn("%s: Invalid state\n", __func__); pr_warn("%s: Invalid state, stream id %x, state %d\n", __func__, bufq->stream_id, state); } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return 0; Loading Loading @@ -1224,17 +1227,73 @@ int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr, return 0; } static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, unsigned long fault_addr) { struct msm_isp_buffer *bufs = NULL; uint32_t i = 0, j = 0, k = 0, rc = 0; char *print_buf = NULL, temp_buf[100]; uint32_t start_addr = 0, end_addr = 0, print_buf_size = 2000; int buf_addr_delta = -1; int temp_delta = 0; uint32_t debug_stream_id = 0; uint32_t debug_buf_idx = 0; uint32_t debug_buf_plane = 0; uint32_t debug_start_addr = 0; uint32_t debug_end_addr = 0; uint32_t debug_frame_id = 0; enum msm_isp_buffer_state debug_state; if (!buf_mgr) { pr_err_ratelimited("%s: %d] NULL buf_mgr\n", __func__, __LINE__); return -EINVAL; } for (i = 0; i < BUF_MGR_NUM_BUF_Q; i++) { if (buf_mgr->bufq[i].bufq_handle != 0) { for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { bufs = &buf_mgr->bufq[i].bufs[j]; if (!bufs) { continue; } for (k = 0; k < bufs->num_planes; k++) { start_addr = bufs-> mapped_info[k].paddr; end_addr = bufs->mapped_info[k].paddr + bufs->mapped_info[k].len - 1; temp_delta = fault_addr - start_addr; if (temp_delta < 0) continue; if (buf_addr_delta == -1 || temp_delta < buf_addr_delta) { buf_addr_delta = temp_delta; debug_stream_id = buf_mgr-> bufq[i].stream_id; debug_buf_idx = j; debug_buf_plane = k; debug_start_addr = start_addr; debug_end_addr = end_addr; debug_frame_id = bufs->frame_id; debug_state = bufs->state; } } } start_addr = 0; end_addr = 0; } } pr_err("%s: ==== SMMU page fault addr %lx ====\n", __func__, fault_addr); pr_err("%s: nearby stream id %x, frame_id %d\n", __func__, debug_stream_id, debug_frame_id); pr_err("%s: nearby buf index %d, plane %d, state %d\n", __func__, debug_buf_idx, debug_buf_plane, debug_state); pr_err("%s: buf address 0x%x -- 0x%x\n", __func__, debug_start_addr, debug_end_addr); if (BUF_DEBUG_FULL) { print_buf = kzalloc(print_buf_size, GFP_ATOMIC); if (!print_buf) { pr_err("%s failed: No memory", __func__); Loading @@ -1253,19 +1312,23 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) buf_mgr->bufq[i].stream_id, buf_mgr->bufq[i].num_bufs); strlcat(print_buf, temp_buf, print_buf_size); for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { bufs = &buf_mgr->bufq[i].bufs[j]; if (!bufs) { continue; } if (!bufs) break; for (k = 0; k < bufs->num_planes; k++) { start_addr = bufs-> mapped_info[k].paddr; end_addr = bufs->mapped_info[k].paddr + bufs->mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), end_addr = bufs->mapped_info[k]. paddr + bufs-> mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), " buf %d plane %d start_addr %x end_addr %x\n", j, k, start_addr, end_addr); j, k, start_addr, end_addr); strlcat(print_buf, temp_buf, print_buf_size); } Loading @@ -1276,6 +1339,7 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) } pr_err("%s\n", print_buf); kfree(print_buf); } return rc; } Loading drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +2 −1 Original line number Diff line number Diff line Loading @@ -152,7 +152,8 @@ struct msm_isp_buf_ops { int (*buf_mgr_init)(struct msm_isp_buf_mgr *buf_mgr, const char *ctx_name, uint16_t num_buf_q); int (*buf_mgr_deinit)(struct msm_isp_buf_mgr *buf_mgr); int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr); int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr, unsigned long fault_addr); struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle); int (*update_put_buf_cnt)(struct msm_isp_buf_mgr *buf_mgr, Loading drivers/media/platform/msm/camera_v2/isp/msm_isp.h +1 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,7 @@ struct vfe_device { uint8_t reg_updated; struct dual_vfe_resource *dual_vfe_res; uint32_t is_split; unsigned long page_fault_addr; }; #endif drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +6 −5 Original line number Diff line number Diff line Loading @@ -1203,7 +1203,8 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev) msm_isp_send_event(vfe_dev, ISP_EVENT_IOMMU_P_FAULT, &error_event); } int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev) int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev, unsigned long fault_addr) { int i, j; struct msm_isp_buffer *buf = NULL; Loading @@ -1222,8 +1223,8 @@ int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev) pr_err("%s: buf NULL\n", __func__); continue; } pr_err("%s: stream_id %x ping-pong %d plane %d start_addr %x addr_offset %x len %lx stride %d scanline %d\n", __func__, stream_info->stream_id, pr_debug("%s: stream_id %x ping-pong %d plane %d start_addr %x addr_offset %x len %lx stride %d scanline %d\n" , __func__, stream_info->stream_id, pingpong_bit, i, (uint32_t)buf->mapped_info[i].paddr, stream_info-> Loading Loading @@ -1517,8 +1518,8 @@ static void msm_isp_process_done_buf(struct vfe_device *vfe_dev, frame_id, stream_info->runtime_output_format); } } else { pr_err_ratelimited("%s: Warning! Unexpected return value\n", __func__); pr_err_ratelimited("%s: Warning! Unexpected return value rc = %d\n", __func__, rc); } } Loading drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h +2 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,8 @@ void msm_isp_process_axi_irq(struct vfe_device *vfe_dev, void msm_isp_axi_disable_all_wm(struct vfe_device *vfe_dev); int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev); int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev, unsigned long fault_addr); int msm_isp_drop_frame(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, struct msm_isp_timestamp *ts, Loading Loading
drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +91 −27 Original line number Diff line number Diff line Loading @@ -36,6 +36,8 @@ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define BUF_DEBUG_FULL 0 struct msm_isp_bufq *msm_isp_get_bufq( struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle) Loading Loading @@ -515,7 +517,7 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } } else { CDBG("%s: No Buffer session_id: %d stream_id: %d\n", CDBG("%s: No HAL Buffer session_id: %d stream_id: %d\n", __func__, bufq->session_id, bufq->stream_id); rc = -EINVAL; } Loading Loading @@ -707,7 +709,8 @@ static int msm_isp_update_put_buf_cnt(struct msm_isp_buf_mgr *buf_mgr, } } } else { pr_warn("%s: Invalid state\n", __func__); pr_warn("%s: Invalid state, stream id %x, state %d\n", __func__, bufq->stream_id, state); } spin_unlock_irqrestore(&bufq->bufq_lock, flags); return 0; Loading Loading @@ -1224,17 +1227,73 @@ int msm_isp_proc_buf_cmd(struct msm_isp_buf_mgr *buf_mgr, return 0; } static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, unsigned long fault_addr) { struct msm_isp_buffer *bufs = NULL; uint32_t i = 0, j = 0, k = 0, rc = 0; char *print_buf = NULL, temp_buf[100]; uint32_t start_addr = 0, end_addr = 0, print_buf_size = 2000; int buf_addr_delta = -1; int temp_delta = 0; uint32_t debug_stream_id = 0; uint32_t debug_buf_idx = 0; uint32_t debug_buf_plane = 0; uint32_t debug_start_addr = 0; uint32_t debug_end_addr = 0; uint32_t debug_frame_id = 0; enum msm_isp_buffer_state debug_state; if (!buf_mgr) { pr_err_ratelimited("%s: %d] NULL buf_mgr\n", __func__, __LINE__); return -EINVAL; } for (i = 0; i < BUF_MGR_NUM_BUF_Q; i++) { if (buf_mgr->bufq[i].bufq_handle != 0) { for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { bufs = &buf_mgr->bufq[i].bufs[j]; if (!bufs) { continue; } for (k = 0; k < bufs->num_planes; k++) { start_addr = bufs-> mapped_info[k].paddr; end_addr = bufs->mapped_info[k].paddr + bufs->mapped_info[k].len - 1; temp_delta = fault_addr - start_addr; if (temp_delta < 0) continue; if (buf_addr_delta == -1 || temp_delta < buf_addr_delta) { buf_addr_delta = temp_delta; debug_stream_id = buf_mgr-> bufq[i].stream_id; debug_buf_idx = j; debug_buf_plane = k; debug_start_addr = start_addr; debug_end_addr = end_addr; debug_frame_id = bufs->frame_id; debug_state = bufs->state; } } } start_addr = 0; end_addr = 0; } } pr_err("%s: ==== SMMU page fault addr %lx ====\n", __func__, fault_addr); pr_err("%s: nearby stream id %x, frame_id %d\n", __func__, debug_stream_id, debug_frame_id); pr_err("%s: nearby buf index %d, plane %d, state %d\n", __func__, debug_buf_idx, debug_buf_plane, debug_state); pr_err("%s: buf address 0x%x -- 0x%x\n", __func__, debug_start_addr, debug_end_addr); if (BUF_DEBUG_FULL) { print_buf = kzalloc(print_buf_size, GFP_ATOMIC); if (!print_buf) { pr_err("%s failed: No memory", __func__); Loading @@ -1253,19 +1312,23 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) buf_mgr->bufq[i].stream_id, buf_mgr->bufq[i].num_bufs); strlcat(print_buf, temp_buf, print_buf_size); for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { for (j = 0; j < buf_mgr->bufq[i].num_bufs; j++) { bufs = &buf_mgr->bufq[i].bufs[j]; if (!bufs) { continue; } if (!bufs) break; for (k = 0; k < bufs->num_planes; k++) { start_addr = bufs-> mapped_info[k].paddr; end_addr = bufs->mapped_info[k].paddr + bufs->mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), end_addr = bufs->mapped_info[k]. paddr + bufs-> mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), " buf %d plane %d start_addr %x end_addr %x\n", j, k, start_addr, end_addr); j, k, start_addr, end_addr); strlcat(print_buf, temp_buf, print_buf_size); } Loading @@ -1276,6 +1339,7 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr) } pr_err("%s\n", print_buf); kfree(print_buf); } return rc; } Loading
drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +2 −1 Original line number Diff line number Diff line Loading @@ -152,7 +152,8 @@ struct msm_isp_buf_ops { int (*buf_mgr_init)(struct msm_isp_buf_mgr *buf_mgr, const char *ctx_name, uint16_t num_buf_q); int (*buf_mgr_deinit)(struct msm_isp_buf_mgr *buf_mgr); int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr); int (*buf_mgr_debug)(struct msm_isp_buf_mgr *buf_mgr, unsigned long fault_addr); struct msm_isp_bufq * (*get_bufq)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle); int (*update_put_buf_cnt)(struct msm_isp_buf_mgr *buf_mgr, Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp.h +1 −0 Original line number Diff line number Diff line Loading @@ -653,6 +653,7 @@ struct vfe_device { uint8_t reg_updated; struct dual_vfe_resource *dual_vfe_res; uint32_t is_split; unsigned long page_fault_addr; }; #endif
drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +6 −5 Original line number Diff line number Diff line Loading @@ -1203,7 +1203,8 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev) msm_isp_send_event(vfe_dev, ISP_EVENT_IOMMU_P_FAULT, &error_event); } int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev) int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev, unsigned long fault_addr) { int i, j; struct msm_isp_buffer *buf = NULL; Loading @@ -1222,8 +1223,8 @@ int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev) pr_err("%s: buf NULL\n", __func__); continue; } pr_err("%s: stream_id %x ping-pong %d plane %d start_addr %x addr_offset %x len %lx stride %d scanline %d\n", __func__, stream_info->stream_id, pr_debug("%s: stream_id %x ping-pong %d plane %d start_addr %x addr_offset %x len %lx stride %d scanline %d\n" , __func__, stream_info->stream_id, pingpong_bit, i, (uint32_t)buf->mapped_info[i].paddr, stream_info-> Loading Loading @@ -1517,8 +1518,8 @@ static void msm_isp_process_done_buf(struct vfe_device *vfe_dev, frame_id, stream_info->runtime_output_format); } } else { pr_err_ratelimited("%s: Warning! Unexpected return value\n", __func__); pr_err_ratelimited("%s: Warning! Unexpected return value rc = %d\n", __func__, rc); } } Loading
drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h +2 −1 Original line number Diff line number Diff line Loading @@ -72,7 +72,8 @@ void msm_isp_process_axi_irq(struct vfe_device *vfe_dev, void msm_isp_axi_disable_all_wm(struct vfe_device *vfe_dev); int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev); int msm_isp_print_ping_pong_address(struct vfe_device *vfe_dev, unsigned long fault_addr); int msm_isp_drop_frame(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, struct msm_isp_timestamp *ts, Loading