remoteproc: Refactor function rproc_boot()
authorMathieu Poirier <mathieu.poirier@linaro.org>
Tue, 14 Jul 2020 19:50:32 +0000 (13:50 -0600)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 17 Jul 2020 06:06:11 +0000 (23:06 -0700)
Refactor function rproc_boot() to properly deal with scenarios
where the remoteproc core needs to attach with a remote
processor that has already been booted by an external entity.

Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: Arnaud Pouliquen <arnaud.pouliquen@st.com>
Link: https://lore.kernel.org/r/20200714195035.1426873-7-mathieu.poirier@linaro.org
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
drivers/remoteproc/remoteproc_core.c

index 7e6b17a..1e9fc31 100644 (file)
@@ -1497,7 +1497,7 @@ disable_iommu:
  * Attach to remote processor - similar to rproc_fw_boot() but without
  * the steps that deal with the firmware image.
  */
-static int __maybe_unused rproc_actuate(struct rproc *rproc)
+static int rproc_actuate(struct rproc *rproc)
 {
        struct device *dev = &rproc->dev;
        int ret;
@@ -1908,24 +1908,30 @@ int rproc_boot(struct rproc *rproc)
                goto unlock_mutex;
        }
 
-       /* skip the boot process if rproc is already powered up */
+       /* skip the boot or attach process if rproc is already powered up */
        if (atomic_inc_return(&rproc->power) > 1) {
                ret = 0;
                goto unlock_mutex;
        }
 
-       dev_info(dev, "powering up %s\n", rproc->name);
+       if (rproc->state == RPROC_DETACHED) {
+               dev_info(dev, "attaching to %s\n", rproc->name);
 
-       /* load firmware */
-       ret = request_firmware(&firmware_p, rproc->firmware, dev);
-       if (ret < 0) {
-               dev_err(dev, "request_firmware failed: %d\n", ret);
-               goto downref_rproc;
-       }
+               ret = rproc_actuate(rproc);
+       } else {
+               dev_info(dev, "powering up %s\n", rproc->name);
 
-       ret = rproc_fw_boot(rproc, firmware_p);
+               /* load firmware */
+               ret = request_firmware(&firmware_p, rproc->firmware, dev);
+               if (ret < 0) {
+                       dev_err(dev, "request_firmware failed: %d\n", ret);
+                       goto downref_rproc;
+               }
 
-       release_firmware(firmware_p);
+               ret = rproc_fw_boot(rproc, firmware_p);
+
+               release_firmware(firmware_p);
+       }
 
 downref_rproc:
        if (ret)