remoteproc: Introducing function rproc_actuate()
authorMathieu Poirier <mathieu.poirier@linaro.org>
Tue, 14 Jul 2020 19:50:30 +0000 (13:50 -0600)
committerBjorn Andersson <bjorn.andersson@linaro.org>
Fri, 17 Jul 2020 06:06:09 +0000 (23:06 -0700)
Introduce function rproc_actuate() that provides the same
functionatlity as rproc_fw_boot(), but without the steps that
involve interaction with the firmware image.  That way we can
deal with scenarios where the remoteproc core is attaching
to a remote processor that has already been started by another
entity.

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

index 90842c5..a62c4a7 100644 (file)
@@ -1372,7 +1372,7 @@ reset_table_ptr:
        return ret;
 }
 
-static int __maybe_unused rproc_attach(struct rproc *rproc)
+static int rproc_attach(struct rproc *rproc)
 {
        struct device *dev = &rproc->dev;
        int ret;
@@ -1494,6 +1494,63 @@ 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)
+{
+       struct device *dev = &rproc->dev;
+       int ret;
+
+       /*
+        * if enabling an IOMMU isn't relevant for this rproc, this is
+        * just a nop
+        */
+       ret = rproc_enable_iommu(rproc);
+       if (ret) {
+               dev_err(dev, "can't enable iommu: %d\n", ret);
+               return ret;
+       }
+
+       /* reset max_notifyid */
+       rproc->max_notifyid = -1;
+
+       /* reset handled vdev */
+       rproc->nb_vdev = 0;
+
+       /*
+        * Handle firmware resources required to attach to a remote processor.
+        * Because we are attaching rather than booting the remote processor,
+        * we expect the platform driver to properly set rproc->table_ptr.
+        */
+       ret = rproc_handle_resources(rproc, rproc_loading_handlers);
+       if (ret) {
+               dev_err(dev, "Failed to process resources: %d\n", ret);
+               goto disable_iommu;
+       }
+
+       /* Allocate carveout resources associated to rproc */
+       ret = rproc_alloc_registered_carveouts(rproc);
+       if (ret) {
+               dev_err(dev, "Failed to allocate associated carveouts: %d\n",
+                       ret);
+               goto clean_up_resources;
+       }
+
+       ret = rproc_attach(rproc);
+       if (ret)
+               goto clean_up_resources;
+
+       return 0;
+
+clean_up_resources:
+       rproc_resource_cleanup(rproc);
+disable_iommu:
+       rproc_disable_iommu(rproc);
+       return ret;
+}
+
+/*
  * take a firmware and boot it up.
  *
  * Note: this function is called asynchronously upon registration of the