remoteproc: qcom: q6v5-mss: Add custom dump function for modem
authorSibi Sankar <sibis@codeaurora.org>
Wed, 17 Oct 2018 13:55:26 +0000 (19:25 +0530)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 19 Oct 2018 19:54:03 +0000 (12:54 -0700)
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>
drivers/remoteproc/qcom_q6v5_mss.c

index 7c85e2d..b50edc8 100644 (file)
@@ -168,6 +168,9 @@ struct q6v5 {
        bool running;
 
        bool dump_mba_loaded;
+       unsigned long dump_segment_mask;
+       unsigned long dump_complete_mask;
+
        phys_addr_t mba_phys;
        void *mba_region;
        size_t mba_size;
@@ -961,6 +964,33 @@ release_firmware:
        return ret < 0 ? ret : 0;
 }
 
+static void qcom_q6v5_dump_segment(struct rproc *rproc,
+                                  struct rproc_dump_segment *segment,
+                                  void *dest)
+{
+       int ret = 0;
+       struct q6v5 *qproc = rproc->priv;
+       unsigned long mask = BIT((unsigned long)segment->priv);
+       void *ptr = rproc_da_to_va(rproc, segment->da, segment->size);
+
+       /* Unlock mba before copying segments */
+       if (!qproc->dump_mba_loaded)
+               ret = q6v5_mba_load(qproc);
+
+       if (!ptr || ret)
+               memset(dest, 0xff, segment->size);
+       else
+               memcpy(dest, ptr, segment->size);
+
+       qproc->dump_segment_mask |= mask;
+
+       /* Reclaim mba after copying segments */
+       if (qproc->dump_segment_mask == qproc->dump_complete_mask) {
+               if (qproc->dump_mba_loaded)
+                       q6v5_mba_reclaim(qproc);
+       }
+}
+
 static int q6v5_start(struct rproc *rproc)
 {
        struct q6v5 *qproc = (struct q6v5 *)rproc->priv;
@@ -989,6 +1019,9 @@ static int q6v5_start(struct rproc *rproc)
        if (xfermemop_ret)
                dev_err(qproc->dev,
                        "Failed to reclaim mba buffer system may become unstable\n");
+
+       /* Reset Dump Segment Mask */
+       qproc->dump_segment_mask = 0;
        qproc->running = true;
 
        return 0;