mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-14 08:36:12 -04:00
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: Andhavarapu Karthik <kartkart@codeaurora.org>
This commit is contained in:
parent
fbe759f998
commit
cab792ba29
1 changed files with 66 additions and 3 deletions
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue