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++;