summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/soc/qcom/peripheral-loader.c8
-rw-r--r--drivers/soc/qcom/peripheral-loader.h6
-rw-r--r--drivers/soc/qcom/pil-msa.h1
-rw-r--r--drivers/soc/qcom/pil-q6v5-mss.c13
-rw-r--r--drivers/soc/qcom/subsys-pil-tz.c2
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)