From d0a863a26ad7aed7b45b7dd244b164de8a1bab1e Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Fri, 8 Sep 2017 15:02:47 +0530 Subject: [PATCH] soc: qcom: Optimize minidump collection check and add debug log This change does additional checks for more imem ToC entries before invoking minidump. This change also add few debug logs to ease process of debugging. Change-Id: Ie70301d70fe85ec9f85573c0167098319c2b1cfe Signed-off-by: Avaneesh Kumar Dwivedi --- drivers/soc/qcom/peripheral-loader.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index d77a12626330..8e0bf64afe0d 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -170,6 +170,8 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) ss_mdump_seg_cnt = readb_relaxed(offset) + NUM_OF_ENCRYPTED_KEY; + pr_debug("SMEM base to read minidump segments is 0x%x\n", + __raw_readl(priv->minidump)); subsys_smem_base = ioremap(__raw_readl(priv->minidump), ss_mdump_seg_cnt * sizeof(*region_info)); region_info = @@ -191,6 +193,9 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) s->address = __raw_readl(offset); offset = offset + sizeof(region_info->region_base_address); s->size = __raw_readl(offset); + pr_debug("Dumping segment %s with address %pK and size 0x%x\n", + s->name, (void *)s->address, + (unsigned int)s->size); s++; region_info++; } @@ -199,7 +204,6 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) if (ret) pil_err(desc, "%s: Ramdump collection failed for subsys %s rc:%d\n", __func__, desc->name, ret); - writel_relaxed(0, &priv->minidump->md_ss_smem_regions_baseptr); writeb_relaxed(1, &priv->minidump->md_ss_ssr_cause); if (desc->subsys_vmid > 0) @@ -222,10 +226,21 @@ int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) struct pil_seg *seg; int count = 0, ret; struct ramdump_segment *ramdump_segs, *s; + void __iomem *offset; - if (priv->minidump && (__raw_readl(priv->minidump) > 0)) + memcpy(&offset, &priv->minidump, sizeof(priv->minidump)); + /* + * Collect minidump if smem base is initialized, + * ssr cause is 0. No need to check encryption status + */ + if (priv->minidump + && (__raw_readl(priv->minidump) != 0) + && (readb_relaxed(offset + sizeof(u32) + 2 * sizeof(u8)) == 0)) { + pr_debug("Dumping Minidump for %s\n", desc->name); return pil_do_minidump(desc, ramdump_dev); + } + pr_debug("Continuing with full SSR dump for %s\n", desc->name); list_for_each_entry(seg, &priv->segs, list) count++;