From 64b52f80aad244531692ec22cb8b123d64b683cd Mon Sep 17 00:00:00 2001 From: Avaneesh Kumar Dwivedi Date: Mon, 18 Sep 2017 12:56:18 +0530 Subject: [PATCH] soc: qcom: Create additional ramdump device node for SSR minidump This change add a new ramdump device node which is only used to collect SSR minidump by ramdump process. Change-Id: I3af5c15798d3c74896a499c8db30e5733743f106 Signed-off-by: Avaneesh Kumar Dwivedi --- drivers/soc/qcom/peripheral-loader.c | 8 ++++++-- drivers/soc/qcom/peripheral-loader.h | 6 ++++-- drivers/soc/qcom/pil-msa.h | 1 + drivers/soc/qcom/pil-q6v5-mss.c | 13 ++++++++++++- drivers/soc/qcom/subsys-pil-tz.c | 2 +- 5 files changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 8e0bf64afe0d..d82c36480159 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -164,6 +164,9 @@ 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 */ @@ -220,7 +223,8 @@ 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; @@ -237,7 +241,7 @@ int pil_do_ramdump(struct pil_desc *desc, void *ramdump_dev) && (__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); + return pil_do_minidump(desc, minidump_dev); } pr_debug("Continuing with full SSR dump for %s\n", desc->name); diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 908ab78124f7..6e74743c8c21 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -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, @@ -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; } diff --git a/drivers/soc/qcom/pil-msa.h b/drivers/soc/qcom/pil-msa.h index 896f0c7c232b..b1a5311859ff 100644 --- a/drivers/soc/qcom/pil-msa.h +++ b/drivers/soc/qcom/pil-msa.h @@ -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; diff --git a/drivers/soc/qcom/pil-q6v5-mss.c b/drivers/soc/qcom/pil-q6v5-mss.c index bbcff5923c53..45712457de73 100644 --- a/drivers/soc/qcom/pil-q6v5-mss.c +++ b/drivers/soc/qcom/pil-q6v5-mss.c @@ -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); @@ -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: @@ -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; } diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index f85c4ba06b47..8bf5f8eb64ad 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -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)