Loading drivers/soc/qcom/peripheral-loader.c +23 −4 Original line number Diff line number Diff line Loading @@ -164,12 +164,17 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) int ss_mdump_seg_cnt; int ret, i; if (!ramdump_dev) return -ENODEV; memcpy(&offset, &priv->minidump, sizeof(priv->minidump)); offset = offset + sizeof(priv->minidump->md_ss_smem_regions_baseptr); /* There are 3 encryption keys which also need to be dumped */ 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 = Loading @@ -191,6 +196,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++; } Loading @@ -199,7 +207,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) Loading @@ -216,16 +223,28 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) * Calls the ramdump API with a list of segments generated from the addresses * that the descriptor corresponds to. */ int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev) { struct pil_priv *priv = desc->priv; 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)) return pil_do_minidump(desc, ramdump_dev); 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, minidump_dev); } pr_debug("Continuing with full SSR dump for %s\n", desc->name); list_for_each_entry(seg, &priv->segs, list) count++; Loading drivers/soc/qcom/peripheral-loader.h +4 −2 Original line number Diff line number Diff line Loading @@ -134,7 +134,8 @@ extern void pil_shutdown(struct pil_desc *desc); extern void pil_free_memory(struct pil_desc *desc); extern void pil_desc_release(struct pil_desc *desc); extern phys_addr_t pil_get_entry_addr(struct pil_desc *desc); extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev); extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev); extern int pil_assign_mem_to_subsys(struct pil_desc *desc, phys_addr_t addr, size_t size); extern int pil_assign_mem_to_linux(struct pil_desc *desc, phys_addr_t addr, Loading @@ -154,7 +155,8 @@ static inline phys_addr_t pil_get_entry_addr(struct pil_desc *desc) { return 0; } static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev) { return 0; } Loading drivers/soc/qcom/pil-msa.h +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ struct modem_data { struct subsys_device *subsys; struct subsys_desc subsys_desc; void *ramdump_dev; void *minidump_dev; bool crash_shutdown; u32 pas_id; bool ignore_errors; Loading drivers/soc/qcom/pil-q6v5-mss.c +12 −1 Original line number Diff line number Diff line Loading @@ -171,7 +171,8 @@ static int modem_ramdump(int enable, const struct subsys_desc *subsys) if (ret) return ret; ret = pil_do_ramdump(&drv->q6->desc, drv->ramdump_dev); ret = pil_do_ramdump(&drv->q6->desc, drv->ramdump_dev, drv->minidump_dev); if (ret < 0) pr_err("Unable to dump modem fw memory (rc = %d).\n", ret); Loading Loading @@ -230,9 +231,18 @@ static int pil_subsys_init(struct modem_data *drv, ret = -ENOMEM; goto err_ramdump; } drv->minidump_dev = create_ramdump_device("md_modem", &pdev->dev); if (!drv->minidump_dev) { pr_err("%s: Unable to create a modem minidump device.\n", __func__); ret = -ENOMEM; goto err_minidump; } return 0; err_minidump: destroy_ramdump_device(drv->ramdump_dev); err_ramdump: subsys_unregister(drv->subsys); err_subsys: Loading Loading @@ -414,6 +424,7 @@ static int pil_mss_driver_exit(struct platform_device *pdev) subsys_unregister(drv->subsys); destroy_ramdump_device(drv->ramdump_dev); destroy_ramdump_device(drv->minidump_dev); pil_desc_release(&drv->q6->desc); return 0; } Loading drivers/soc/qcom/subsys-pil-tz.c +1 −1 Original line number Diff line number Diff line Loading @@ -850,7 +850,7 @@ static int subsys_ramdump(int enable, const struct subsys_desc *subsys) if (!enable) return 0; return pil_do_ramdump(&d->desc, d->ramdump_dev); return pil_do_ramdump(&d->desc, d->ramdump_dev, NULL); } static void subsys_free_memory(const struct subsys_desc *subsys) Loading Loading
drivers/soc/qcom/peripheral-loader.c +23 −4 Original line number Diff line number Diff line Loading @@ -164,12 +164,17 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) int ss_mdump_seg_cnt; int ret, i; if (!ramdump_dev) return -ENODEV; memcpy(&offset, &priv->minidump, sizeof(priv->minidump)); offset = offset + sizeof(priv->minidump->md_ss_smem_regions_baseptr); /* There are 3 encryption keys which also need to be dumped */ 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 = Loading @@ -191,6 +196,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++; } Loading @@ -199,7 +207,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) Loading @@ -216,16 +223,28 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) * Calls the ramdump API with a list of segments generated from the addresses * that the descriptor corresponds to. */ int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev) { struct pil_priv *priv = desc->priv; 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)) return pil_do_minidump(desc, ramdump_dev); 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, minidump_dev); } pr_debug("Continuing with full SSR dump for %s\n", desc->name); list_for_each_entry(seg, &priv->segs, list) count++; Loading
drivers/soc/qcom/peripheral-loader.h +4 −2 Original line number Diff line number Diff line Loading @@ -134,7 +134,8 @@ extern void pil_shutdown(struct pil_desc *desc); extern void pil_free_memory(struct pil_desc *desc); extern void pil_desc_release(struct pil_desc *desc); extern phys_addr_t pil_get_entry_addr(struct pil_desc *desc); extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev); extern int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev); extern int pil_assign_mem_to_subsys(struct pil_desc *desc, phys_addr_t addr, size_t size); extern int pil_assign_mem_to_linux(struct pil_desc *desc, phys_addr_t addr, Loading @@ -154,7 +155,8 @@ static inline phys_addr_t pil_get_entry_addr(struct pil_desc *desc) { return 0; } static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) static inline int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev, void *minidump_dev) { return 0; } Loading
drivers/soc/qcom/pil-msa.h +1 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ struct modem_data { struct subsys_device *subsys; struct subsys_desc subsys_desc; void *ramdump_dev; void *minidump_dev; bool crash_shutdown; u32 pas_id; bool ignore_errors; Loading
drivers/soc/qcom/pil-q6v5-mss.c +12 −1 Original line number Diff line number Diff line Loading @@ -171,7 +171,8 @@ static int modem_ramdump(int enable, const struct subsys_desc *subsys) if (ret) return ret; ret = pil_do_ramdump(&drv->q6->desc, drv->ramdump_dev); ret = pil_do_ramdump(&drv->q6->desc, drv->ramdump_dev, drv->minidump_dev); if (ret < 0) pr_err("Unable to dump modem fw memory (rc = %d).\n", ret); Loading Loading @@ -230,9 +231,18 @@ static int pil_subsys_init(struct modem_data *drv, ret = -ENOMEM; goto err_ramdump; } drv->minidump_dev = create_ramdump_device("md_modem", &pdev->dev); if (!drv->minidump_dev) { pr_err("%s: Unable to create a modem minidump device.\n", __func__); ret = -ENOMEM; goto err_minidump; } return 0; err_minidump: destroy_ramdump_device(drv->ramdump_dev); err_ramdump: subsys_unregister(drv->subsys); err_subsys: Loading Loading @@ -414,6 +424,7 @@ static int pil_mss_driver_exit(struct platform_device *pdev) subsys_unregister(drv->subsys); destroy_ramdump_device(drv->ramdump_dev); destroy_ramdump_device(drv->minidump_dev); pil_desc_release(&drv->q6->desc); return 0; } Loading
drivers/soc/qcom/subsys-pil-tz.c +1 −1 Original line number Diff line number Diff line Loading @@ -850,7 +850,7 @@ static int subsys_ramdump(int enable, const struct subsys_desc *subsys) if (!enable) return 0; return pil_do_ramdump(&d->desc, d->ramdump_dev); return pil_do_ramdump(&d->desc, d->ramdump_dev, NULL); } static void subsys_free_memory(const struct subsys_desc *subsys) Loading