From cab792ba29b839f83aa42ffccb30d9135981cdb9 Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Wed, 18 Nov 2020 15:44:54 +0530 Subject: [PATCH 1/2] 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 --- msm/sde_dbg.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 3 deletions(-) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index 89715d376f24..eea83f4d1a82 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -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); From b7d7dbc6e7251b7e89b1a235d6637a54d47b7a24 Mon Sep 17 00:00:00 2001 From: Andhavarapu Karthik Date: Tue, 4 May 2021 18:47:25 +0530 Subject: [PATCH 2/2] disp: msm: sde: add register dumps to minidump Add register dumps partition to minidump. Change-Id: I587e5169747eb60780a698b0f7756bb52c9ef853 Signed-off-by: Andhavarapu Karthik --- msm/sde_dbg.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index eea83f4d1a82..12ca18734ebc 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -1352,6 +1352,11 @@ static void _sde_dump_array(struct sde_dbg_reg_base *blk_arr[], dbg_base->reg_dump_addr = devm_kzalloc(sde_dbg_base.dev, reg_dump_size, GFP_KERNEL); + if (dbg_base->reg_dump_addr && + sde_mini_dump_add_region("reg_dump", + reg_dump_size, dbg_base->reg_dump_addr) < 0) + pr_err("minidump add regdump failed\n"); + if (dump_all) sde_evtlog_dump_all(sde_dbg_base.evtlog);