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

remoteproc: qcom: q6v5-mss: Add custom dump function for modem

The per segment dump function is responsible for loading the mba
before device memory segments associated with coredump can be populated
and for cleaning up the resources post coredump.

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
7dd8ade2 0304530d

+33
+33
drivers/remoteproc/qcom_q6v5_mss.c
··· 168 168 bool running; 169 169 170 170 bool dump_mba_loaded; 171 + unsigned long dump_segment_mask; 172 + unsigned long dump_complete_mask; 173 + 171 174 phys_addr_t mba_phys; 172 175 void *mba_region; 173 176 size_t mba_size; ··· 964 961 return ret < 0 ? ret : 0; 965 962 } 966 963 964 + static void qcom_q6v5_dump_segment(struct rproc *rproc, 965 + struct rproc_dump_segment *segment, 966 + void *dest) 967 + { 968 + int ret = 0; 969 + struct q6v5 *qproc = rproc->priv; 970 + unsigned long mask = BIT((unsigned long)segment->priv); 971 + void *ptr = rproc_da_to_va(rproc, segment->da, segment->size); 972 + 973 + /* Unlock mba before copying segments */ 974 + if (!qproc->dump_mba_loaded) 975 + ret = q6v5_mba_load(qproc); 976 + 977 + if (!ptr || ret) 978 + memset(dest, 0xff, segment->size); 979 + else 980 + memcpy(dest, ptr, segment->size); 981 + 982 + qproc->dump_segment_mask |= mask; 983 + 984 + /* Reclaim mba after copying segments */ 985 + if (qproc->dump_segment_mask == qproc->dump_complete_mask) { 986 + if (qproc->dump_mba_loaded) 987 + q6v5_mba_reclaim(qproc); 988 + } 989 + } 990 + 967 991 static int q6v5_start(struct rproc *rproc) 968 992 { 969 993 struct q6v5 *qproc = (struct q6v5 *)rproc->priv; ··· 1019 989 if (xfermemop_ret) 1020 990 dev_err(qproc->dev, 1021 991 "Failed to reclaim mba buffer system may become unstable\n"); 992 + 993 + /* Reset Dump Segment Mask */ 994 + qproc->dump_segment_mask = 0; 1022 995 qproc->running = true; 1023 996 1024 997 return 0;