Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

remoteproc: qcom: q6v5-mss: Register segments/dumpfn for coredump

Register the MDT segments, custom dumpfn and private data with the
remoteproc core dump functionality.

Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>

authored by

Sibi Sankar and committed by
Bjorn Andersson
f18b7e91 7dd8ade2

+42
+42
drivers/remoteproc/qcom_q6v5_mss.c
··· 1064 1064 return qproc->mpss_region + offset; 1065 1065 } 1066 1066 1067 + static int qcom_q6v5_register_dump_segments(struct rproc *rproc, 1068 + const struct firmware *mba_fw) 1069 + { 1070 + const struct firmware *fw; 1071 + const struct elf32_phdr *phdrs; 1072 + const struct elf32_phdr *phdr; 1073 + const struct elf32_hdr *ehdr; 1074 + struct q6v5 *qproc = rproc->priv; 1075 + unsigned long i; 1076 + int ret; 1077 + 1078 + ret = request_firmware(&fw, "modem.mdt", qproc->dev); 1079 + if (ret < 0) { 1080 + dev_err(qproc->dev, "unable to load modem.mdt\n"); 1081 + return ret; 1082 + } 1083 + 1084 + ehdr = (struct elf32_hdr *)fw->data; 1085 + phdrs = (struct elf32_phdr *)(ehdr + 1); 1086 + qproc->dump_complete_mask = 0; 1087 + 1088 + for (i = 0; i < ehdr->e_phnum; i++) { 1089 + phdr = &phdrs[i]; 1090 + 1091 + if (!q6v5_phdr_valid(phdr)) 1092 + continue; 1093 + 1094 + ret = rproc_coredump_add_custom_segment(rproc, phdr->p_paddr, 1095 + phdr->p_memsz, 1096 + qcom_q6v5_dump_segment, 1097 + (void *)i); 1098 + if (ret) 1099 + break; 1100 + 1101 + qproc->dump_complete_mask |= BIT(i); 1102 + } 1103 + 1104 + release_firmware(fw); 1105 + return ret; 1106 + } 1107 + 1067 1108 static const struct rproc_ops q6v5_ops = { 1068 1109 .start = q6v5_start, 1069 1110 .stop = q6v5_stop, 1070 1111 .da_to_va = q6v5_da_to_va, 1112 + .parse_fw = qcom_q6v5_register_dump_segments, 1071 1113 .load = q6v5_load, 1072 1114 }; 1073 1115