diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index 6e15e3bd9f7a..92b153afd78a 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -412,7 +412,11 @@ static int pil_do_minidump(struct pil_desc *desc, void *ramdump_dev) goto seg_mapping_fail; } - ret = do_minidump(ramdump_dev, ramdump_segs, ss_valid_seg_cnt); + if (desc->minidump_as_elf32) + ret = do_minidump_elf32(ramdump_dev, ramdump_segs, + ss_valid_seg_cnt); + else + ret = do_minidump(ramdump_dev, ramdump_segs, ss_valid_seg_cnt); if (ret) pil_err(desc, "%s: Minidump collection failed for subsys %s rc:%d\n", __func__, desc->name, ret); @@ -1624,6 +1628,9 @@ int pil_desc_init(struct pil_desc *desc) if (!desc->unmap_fw_mem) desc->unmap_fw_mem = unmap_fw_mem; + desc->minidump_as_elf32 = of_property_read_bool( + ofnode, "qcom,minidump-as-elf32"); + return 0; err_parse_dt: ida_simple_remove(&pil_ida, priv->id); diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 137341e19409..57180c739f17 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -63,6 +63,7 @@ struct pil_desc { int *aux_minidump_ids; int num_aux_minidump_ids; u32 extra_size; + bool minidump_as_elf32; }; /** diff --git a/drivers/soc/qcom/ramdump.c b/drivers/soc/qcom/ramdump.c index 01efce451f2b..4670b8017505 100644 --- a/drivers/soc/qcom/ramdump.c +++ b/drivers/soc/qcom/ramdump.c @@ -399,7 +399,7 @@ void destroy_ramdump_device(void *dev) EXPORT_SYMBOL(destroy_ramdump_device); static int _do_ramdump(void *handle, struct ramdump_segment *segments, - int nsegments, bool use_elf) + int nsegments, bool use_elf, bool complete_ramdump) { int ret, i; struct ramdump_device *rd_dev = (struct ramdump_device *)handle; @@ -427,7 +427,7 @@ static int _do_ramdump(void *handle, struct ramdump_segment *segments, return -EPIPE; } - if (rd_dev->complete_ramdump) { + if (complete_ramdump) { for (i = 0; i < nsegments-1; i++) segments[i].size = segments[i + 1].address - segments[i].address; @@ -628,7 +628,10 @@ static int _do_minidump(void *handle, struct ramdump_segment *segments, int do_ramdump(void *handle, struct ramdump_segment *segments, int nsegments) { - return _do_ramdump(handle, segments, nsegments, false); + struct ramdump_device *rd_dev = (struct ramdump_device *)handle; + + return _do_ramdump(handle, segments, nsegments, false, + rd_dev->complete_ramdump); } EXPORT_SYMBOL(do_ramdump); @@ -638,10 +641,20 @@ int do_minidump(void *handle, struct ramdump_segment *segments, int nsegments) } EXPORT_SYMBOL(do_minidump); +int do_minidump_elf32(void *handle, struct ramdump_segment *segments, + int nsegments) +{ + return _do_ramdump(handle, segments, nsegments, true, false); +} +EXPORT_SYMBOL(do_minidump_elf32); + int do_elf_ramdump(void *handle, struct ramdump_segment *segments, int nsegments) { - return _do_ramdump(handle, segments, nsegments, true); + struct ramdump_device *rd_dev = (struct ramdump_device *)handle; + + return _do_ramdump(handle, segments, nsegments, true, + rd_dev->complete_ramdump); } EXPORT_SYMBOL(do_elf_ramdump); diff --git a/include/soc/qcom/ramdump.h b/include/soc/qcom/ramdump.h index 99b3c445f013..ea57be70dcc0 100644 --- a/include/soc/qcom/ramdump.h +++ b/include/soc/qcom/ramdump.h @@ -39,6 +39,8 @@ extern int do_elf_ramdump(void *handle, struct ramdump_segment *segments, int nsegments); extern int do_minidump(void *handle, struct ramdump_segment *segments, int nsegments); +extern int do_minidump_elf32(void *handle, struct ramdump_segment *segments, + int nsegments); #else static inline void *create_ramdump_device(const char *dev_name, @@ -62,6 +64,19 @@ static inline int do_elf_ramdump(void *handle, struct ramdump_segment *segments, { return -ENODEV; } + +static inline int do_minidump(void *handle, struct ramdump_segment *segments, + int nsegments) +{ + return -ENODEV; +} + +static inline int do_minidump_elf32(void *handle, + struct ramdump_segment *segments, int nsegments) +{ + return -ENODEV; +} + #endif /* CONFIG_MSM_SUBSYSTEM_RESTART */ #endif