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

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

Merge "drm/msm: limit sde_dbg_dump output to current entries"

parents 47be39ac 87d93e0a
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -2558,6 +2558,7 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],

	mutex_lock(&sde_dbg_base.mutex);

	if (dump_all)
		sde_evtlog_dump_all(sde_dbg_base.evtlog);

	if (dump_all || !blk_arr || !len) {
@@ -2711,7 +2712,7 @@ static ssize_t sde_evtlog_dump_read(struct file *file, char __user *buff,
		return -EINVAL;

	len = sde_evtlog_dump_to_buffer(sde_dbg_base.evtlog, evtlog_buf,
			SDE_EVTLOG_BUF_MAX);
			SDE_EVTLOG_BUF_MAX, true);
	if (copy_to_user(buff, evtlog_buf, len))
		return -EFAULT;
	*ppos += len;
+10 −4
Original line number Diff line number Diff line
@@ -17,7 +17,8 @@
#include <linux/debugfs.h>
#include <linux/list.h>

#define SDE_EVTLOG_DATA_LIMITER	(-1)
/* select an uncommon hex value for the limiter */
#define SDE_EVTLOG_DATA_LIMITER	(0xC0DEBEEF)
#define SDE_EVTLOG_FUNC_ENTRY	0x1111
#define SDE_EVTLOG_FUNC_EXIT	0x2222
#define SDE_EVTLOG_FUNC_CASE1	0x3333
@@ -66,7 +67,7 @@ enum sde_dbg_dump_flag {
 * number must be greater than print entry to prevent out of bound evtlog
 * entry array access.
 */
#define SDE_EVTLOG_ENTRY	(SDE_EVTLOG_PRINT_ENTRY * 4)
#define SDE_EVTLOG_ENTRY	(SDE_EVTLOG_PRINT_ENTRY * 8)
#define SDE_EVTLOG_MAX_DATA 15
#define SDE_EVTLOG_BUF_MAX 512
#define SDE_EVTLOG_BUF_ALIGN 32
@@ -87,12 +88,14 @@ struct sde_dbg_evtlog_log {
};

/**
 * @last_dump: Index of last entry to be output during evtlog dumps
 * @filter_list: Linked list of currently active filter strings
 */
struct sde_dbg_evtlog {
	struct sde_dbg_evtlog_log logs[SDE_EVTLOG_ENTRY];
	u32 first;
	u32 last;
	u32 last_dump;
	u32 curr;
	u32 next;
	u32 enable;
@@ -197,10 +200,12 @@ bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog, u32 flag);
 * @evtlog:		pointer to evtlog
 * @evtlog_buf:		target buffer to print into
 * @evtlog_buf_size:	size of target buffer
 * @update_last_entry:	whether or not to stop at most recent entry
 * Returns:		number of bytes written to buffer
 */
ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size);
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry);

/**
 * sde_dbg_init_dbg_buses - initialize debug bus dumping support for the chipset
@@ -352,7 +357,8 @@ static inline bool sde_evtlog_is_enabled(struct sde_dbg_evtlog *evtlog,
}

static inline ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size)
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry)
{
	return 0;
}
+22 −12
Original line number Diff line number Diff line
@@ -105,27 +105,32 @@ void sde_evtlog_log(struct sde_dbg_evtlog *evtlog, const char *name, int line,
}

/* always dump the last entries which are not dumped yet */
static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog)
static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog,
		bool update_last_entry)
{
	if (!evtlog)
		return false;

	evtlog->first = evtlog->next;

	if (evtlog->last == evtlog->first)
	if (update_last_entry)
		evtlog->last_dump = evtlog->last;

	if (evtlog->last_dump == evtlog->first)
		return false;

	if (evtlog->last < evtlog->first) {
	if (evtlog->last_dump < evtlog->first) {
		evtlog->first %= SDE_EVTLOG_ENTRY;
		if (evtlog->last < evtlog->first)
			evtlog->last += SDE_EVTLOG_ENTRY;
		if (evtlog->last_dump < evtlog->first)
			evtlog->last_dump += SDE_EVTLOG_ENTRY;
	}

	if ((evtlog->last - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) {
	if ((evtlog->last_dump - evtlog->first) > SDE_EVTLOG_PRINT_ENTRY) {
		pr_info("evtlog skipping %d entries, last=%d\n",
			evtlog->last - evtlog->first - SDE_EVTLOG_PRINT_ENTRY,
			evtlog->last - 1);
		evtlog->first = evtlog->last - SDE_EVTLOG_PRINT_ENTRY;
			evtlog->last_dump - evtlog->first -
			SDE_EVTLOG_PRINT_ENTRY,
			evtlog->last_dump - 1);
		evtlog->first = evtlog->last_dump - SDE_EVTLOG_PRINT_ENTRY;
	}
	evtlog->next = evtlog->first + 1;

@@ -133,7 +138,8 @@ static bool _sde_evtlog_dump_calc_range(struct sde_dbg_evtlog *evtlog)
}

ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
		char *evtlog_buf, ssize_t evtlog_buf_size)
		char *evtlog_buf, ssize_t evtlog_buf_size,
		bool update_last_entry)
{
	int i;
	ssize_t off = 0;
@@ -146,7 +152,7 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
	spin_lock_irqsave(&evtlog->spin_lock, flags);

	/* update markers, exit if nothing to print */
	if (!_sde_evtlog_dump_calc_range(evtlog))
	if (!_sde_evtlog_dump_calc_range(evtlog, update_last_entry))
		goto exit;

	log = &evtlog->logs[evtlog->first % SDE_EVTLOG_ENTRY];
@@ -179,12 +185,16 @@ ssize_t sde_evtlog_dump_to_buffer(struct sde_dbg_evtlog *evtlog,
void sde_evtlog_dump_all(struct sde_dbg_evtlog *evtlog)
{
	char buf[SDE_EVTLOG_BUF_MAX];
	bool update_last_entry = true;

	if (!evtlog)
		return;

	while (sde_evtlog_dump_to_buffer(evtlog, buf, sizeof(buf)))
	while (sde_evtlog_dump_to_buffer(
				evtlog, buf, sizeof(buf), update_last_entry)) {
		pr_info("%s", buf);
		update_last_entry = false;
	}
}

struct sde_dbg_evtlog *sde_evtlog_init(void)