]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - rpmsg/rpmsg.git/commitdiff
remoteproc: Properly deal with the resource table when stopping
authorMathieu Poirier <mathieu.poirier@linaro.org>
Fri, 12 Mar 2021 16:24:48 +0000 (09:24 -0700)
committerSuman Anna <s-anna@ti.com>
Sat, 10 Apr 2021 15:35:03 +0000 (10:35 -0500)
When a remote processor that was attached to is stopped, special care
must be taken to make sure the shutdown process is similar to what
it would be had it been started by the remoteproc core.

This patch takes care of that by making a copy of the resource
table currently used by the remote processor.  From that point on
the copy is used, as if the remote processor had been started by
the remoteproc core.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Reported-by: kernel test robot <lkp@intel.com>
Link: https://lore.kernel.org/r/20210312162453.1234145-13-mathieu.poirier@linaro.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
[s-anna@ti.com: cherry-pick linux-next commit '8088dd4d9316' for v5.13]
Signed-off-by: Suman Anna <s-anna@ti.com>
drivers/remoteproc/remoteproc_core.c

index e7b7548e2d50496ca9b4c4cc0182c27cfb0aa933..46958c504d50183576397a07208893652b4a64d0 100644 (file)
@@ -1695,6 +1695,47 @@ static int rproc_reset_rsc_table_on_detach(struct rproc *rproc)
        return 0;
 }
 
+static int rproc_reset_rsc_table_on_stop(struct rproc *rproc)
+{
+       /* A resource table was never retrieved, nothing to do here */
+       if (!rproc->table_ptr)
+               return 0;
+
+       /*
+        * If a cache table exists the remote processor was started by
+        * the remoteproc core.  That cache table should be used for
+        * the rest of the shutdown process.
+        */
+       if (rproc->cached_table)
+               goto out;
+
+       /*
+        * If we made it here the remote processor was started by another
+        * entity and a cache table doesn't exist.  As such make a copy of
+        * the resource table currently used by the remote processor and
+        * use that for the rest of the shutdown process.  The memory
+        * allocated here is free'd in rproc_shutdown().
+        */
+       rproc->cached_table = kmemdup(rproc->table_ptr,
+                                     rproc->table_sz, GFP_KERNEL);
+       if (!rproc->cached_table)
+               return -ENOMEM;
+
+       /*
+        * Since the remote processor is being switched off the clean table
+        * won't be needed.  Allocated in rproc_set_rsc_table().
+        */
+       kfree(rproc->clean_table);
+
+out:
+       /*
+        * Use a copy of the resource table for the remainder of the
+        * shutdown process.
+        */
+       rproc->table_ptr = rproc->cached_table;
+       return 0;
+}
+
 /*
  * Attach to remote processor - similar to rproc_fw_boot() but without
  * the steps that deal with the firmware image.
@@ -1820,7 +1861,12 @@ static int rproc_stop(struct rproc *rproc, bool crashed)
        rproc_stop_subdevices(rproc, crashed);
 
        /* the installed resource table is no longer accessible */
-       rproc->table_ptr = rproc->cached_table;
+       ret = rproc_reset_rsc_table_on_stop(rproc);
+       if (ret) {
+               dev_err(dev, "can't reset resource table: %d\n", ret);
+               return ret;
+       }
+
 
        /* power off the remote processor */
        ret = rproc->ops->stop(rproc);