Skip to content

Commit dcb57ed

Browse files
Sarangdhar Joshiandersson
authored andcommitted
remoteproc: qcom: Register segments for core dump
Register MDT segments with the remoteproc core dump functionality in order to include them in a core dump, in case of a recovery of the remote processor. Signed-off-by: Sarangdhar Joshi <[email protected]> Signed-off-by: Bjorn Andersson <[email protected]>
1 parent 4dd27f5 commit dcb57ed

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

drivers/remoteproc/qcom_adsp_pil.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ static const struct rproc_ops adsp_ops = {
179179
.start = adsp_start,
180180
.stop = adsp_stop,
181181
.da_to_va = adsp_da_to_va,
182+
.parse_fw = qcom_register_dump_segments,
182183
.load = adsp_load,
183184
};
184185

drivers/remoteproc/qcom_common.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <linux/remoteproc.h>
2323
#include <linux/rpmsg/qcom_glink.h>
2424
#include <linux/rpmsg/qcom_smd.h>
25+
#include <linux/soc/qcom/mdt_loader.h>
2526

2627
#include "remoteproc_internal.h"
2728
#include "qcom_common.h"
@@ -79,6 +80,49 @@ void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glin
7980
}
8081
EXPORT_SYMBOL_GPL(qcom_remove_glink_subdev);
8182

83+
/**
84+
* qcom_register_dump_segments() - register segments for coredump
85+
* @rproc: remoteproc handle
86+
* @fw: firmware header
87+
*
88+
* Register all segments of the ELF in the remoteproc coredump segment list
89+
*
90+
* Return: 0 on success, negative errno on failure.
91+
*/
92+
int qcom_register_dump_segments(struct rproc *rproc,
93+
const struct firmware *fw)
94+
{
95+
const struct elf32_phdr *phdrs;
96+
const struct elf32_phdr *phdr;
97+
const struct elf32_hdr *ehdr;
98+
int ret;
99+
int i;
100+
101+
ehdr = (struct elf32_hdr *)fw->data;
102+
phdrs = (struct elf32_phdr *)(ehdr + 1);
103+
104+
for (i = 0; i < ehdr->e_phnum; i++) {
105+
phdr = &phdrs[i];
106+
107+
if (phdr->p_type != PT_LOAD)
108+
continue;
109+
110+
if ((phdr->p_flags & QCOM_MDT_TYPE_MASK) == QCOM_MDT_TYPE_HASH)
111+
continue;
112+
113+
if (!phdr->p_memsz)
114+
continue;
115+
116+
ret = rproc_coredump_add_segment(rproc, phdr->p_paddr,
117+
phdr->p_memsz);
118+
if (ret)
119+
return ret;
120+
}
121+
122+
return 0;
123+
}
124+
EXPORT_SYMBOL_GPL(qcom_register_dump_segments);
125+
82126
static int smd_subdev_probe(struct rproc_subdev *subdev)
83127
{
84128
struct qcom_rproc_subdev *smd = to_smd_subdev(subdev);

drivers/remoteproc/qcom_common.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ struct qcom_rproc_ssr {
3030
void qcom_add_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
3131
void qcom_remove_glink_subdev(struct rproc *rproc, struct qcom_rproc_glink *glink);
3232

33+
int qcom_register_dump_segments(struct rproc *rproc, const struct firmware *fw);
34+
3335
void qcom_add_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
3436
void qcom_remove_smd_subdev(struct rproc *rproc, struct qcom_rproc_subdev *smd);
3537

drivers/remoteproc/qcom_wcnss.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ static const struct rproc_ops wcnss_ops = {
309309
.start = wcnss_start,
310310
.stop = wcnss_stop,
311311
.da_to_va = wcnss_da_to_va,
312+
.parse_fw = qcom_register_dump_segments,
312313
.load = wcnss_load,
313314
};
314315

0 commit comments

Comments
 (0)