Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6e0e16e3 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: camera: isp: find page fault buffer."

parents eda805bb e6f2e887
Loading
Loading
Loading
Loading
+91 −27
Original line number Diff line number Diff line
@@ -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)
@@ -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;
		}
@@ -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;
@@ -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__);
@@ -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);
					}
@@ -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;
}

+2 −1
Original line number Diff line number Diff line
@@ -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,
+1 −0
Original line number Diff line number Diff line
@@ -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
+6 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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->
@@ -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);
	}
}

+2 −1
Original line number Diff line number Diff line
@@ -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