summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAvaneesh Kumar Dwivedi <akdwived@codeaurora.org>2017-09-08 15:02:47 +0530
committerGerrit - the friendly Code Review server <code-review@localhost>2017-09-19 05:04:56 -0700
commitd0a863a26ad7aed7b45b7dd244b164de8a1bab1e (patch)
tree89a0b446805fff9da194b3d14dc1f08fac64fad5
parent6f777b2385c98a17d69bbeead6edbc7ad7470f72 (diff)
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 <akdwived@codeaurora.org>
-rw-r--r--drivers/soc/qcom/peripheral-loader.c19
1 files 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++;