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

Commit cab792ba authored by Andhavarapu Karthik's avatar Andhavarapu Karthik
Browse files

disp: msm: sde: aggregate all register dump memory allocation



In current implementation, register dump memory is allocated
separately for each range and block. When register dumps are
added to minidump, this will generate around 32 minidump bin files.
Changes are made to allocate all the required register dump memory
once. When register dumps are added to minidump, this will generate
only one minidump file.

Change-Id: I04d4d8db559f21f862f8989d3dfcfa7d9aef6dc5
Signed-off-by: default avatarAndhavarapu Karthik <kartkart@codeaurora.org>
parent fbe759f9
Loading
Loading
Loading
Loading
+66 −3
Original line number Diff line number Diff line
@@ -266,6 +266,7 @@ struct sde_dbg_base {
	struct sde_dbg_evtlog *evtlog;
	struct sde_dbg_reglog *reglog;
	struct list_head reg_base_list;
	void *reg_dump_addr;
	struct device *dev;
	struct mutex mutex;

@@ -488,6 +489,7 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag,
		char *base_addr, char *addr, size_t len_bytes, u32 **dump_mem)
{
	u32 in_log, in_mem, len_align, len_padded;
	struct sde_dbg_base *dbg_base = &sde_dbg_base;
	u32 *dump_addr = NULL;
	char *end_addr;
	int i;
@@ -515,9 +517,10 @@ static void _sde_dump_reg(const char *dump_name, u32 reg_dump_flag,
	end_addr = addr + len_bytes;

	if (in_mem) {
		if (dump_mem && !(*dump_mem))
			*dump_mem = devm_kzalloc(sde_dbg_base.dev, len_padded,
					GFP_KERNEL);
		if (dump_mem && !(*dump_mem)) {
			*dump_mem = dbg_base->reg_dump_addr;
			dbg_base->reg_dump_addr += len_padded;
		}

		if (dump_mem && *dump_mem) {
			dump_addr = *dump_mem;
@@ -590,6 +593,49 @@ static u32 _sde_dbg_get_dump_range(struct sde_dbg_reg_offset *range_node,
	return length;
}

static u32 _sde_dbg_get_reg_blk_size(struct sde_dbg_reg_base *dbg)
{
	u32 len, len_align, len_padded;
	u32 size = 0;
	struct sde_dbg_reg_range *range_node;

	if (!dbg || !dbg->base) {
		pr_err("dbg base is null!\n");
		return 0;
	}

	if (!list_empty(&dbg->sub_range_list)) {
		list_for_each_entry(range_node, &dbg->sub_range_list, head) {
			len = _sde_dbg_get_dump_range(&range_node->offset,
					dbg->max_offset);
			len_align = (len + REG_DUMP_ALIGN - 1) / REG_DUMP_ALIGN;
			len_padded = len_align * REG_DUMP_ALIGN;
			size += REG_BASE_NAME_LEN + RANGE_NAME_LEN + len_padded;
		}
	} else {
		len = dbg->max_offset;
		len_align = (len + REG_DUMP_ALIGN - 1) / REG_DUMP_ALIGN;
		len_padded = len_align * REG_DUMP_ALIGN;
		size += REG_BASE_NAME_LEN + RANGE_NAME_LEN + len_padded;
	}
	return size;
}

static u32 _sde_dbg_get_reg_dump_size(void)
{
	struct sde_dbg_base *dbg_base = &sde_dbg_base;
	struct sde_dbg_reg_base *blk_base;
	u32 size = 0;

	if (!dbg_base)
		return 0;

	list_for_each_entry(blk_base, &dbg_base->reg_base_list, reg_base_head) {
		size += _sde_dbg_get_reg_blk_size(blk_base);
	}
	return size;
}

static int _sde_dump_reg_range_cmp(void *priv, struct list_head *a,
		struct list_head *b)
{
@@ -635,6 +681,7 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
	char *addr;
	size_t len;
	struct sde_dbg_reg_range *range_node;
	struct sde_dbg_base *dbg_base = &sde_dbg_base;

	if (!dbg || !(dbg->base || dbg->cb)) {
		pr_err("dbg base is null!\n");
@@ -664,6 +711,12 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
				addr, range_node->offset.start,
				range_node->offset.end);

			scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN,
					dbg->name);
			dbg_base->reg_dump_addr += REG_BASE_NAME_LEN;
			scnprintf(dbg_base->reg_dump_addr, RANGE_NAME_LEN,
					range_node->range_name);
			dbg_base->reg_dump_addr += RANGE_NAME_LEN;
			_sde_dump_reg(range_node->range_name, reg_dump_flag,
					dbg->base, addr, len,
					&range_node->reg_dump);
@@ -676,6 +729,10 @@ static void _sde_dump_reg_by_ranges(struct sde_dbg_reg_base *dbg,
				dbg->max_offset);
		addr = dbg->base;
		len = dbg->max_offset;
		scnprintf(dbg_base->reg_dump_addr, REG_BASE_NAME_LEN,
				dbg->name);
		dbg_base->reg_dump_addr += REG_BASE_NAME_LEN;
		dbg_base->reg_dump_addr += RANGE_NAME_LEN;
		_sde_dump_reg(dbg->name, reg_dump_flag, dbg->base, addr, len,
				&dbg->reg_dump);
	}
@@ -1286,9 +1343,15 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[],
	bool dump_secure)
{
	int i;
	u32 reg_dump_size;
	struct sde_dbg_base *dbg_base = &sde_dbg_base;

	mutex_lock(&sde_dbg_base.mutex);

	reg_dump_size =  _sde_dbg_get_reg_dump_size();
	dbg_base->reg_dump_addr = devm_kzalloc(sde_dbg_base.dev,
			reg_dump_size, GFP_KERNEL);

	if (dump_all)
		sde_evtlog_dump_all(sde_dbg_base.evtlog);