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 <[email protected]>
Reviewed-by: Arnaud Pouliquen <[email protected]>
Tested-by: Arnaud Pouliquen <[email protected]>
---
 drivers/remoteproc/remoteproc_core.c | 59 +++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/drivers/remoteproc/remoteproc_core.c 
b/drivers/remoteproc/remoteproc_core.c
index 1e8e66a25bd6..fd424662801f 100644
--- a/drivers/remoteproc/remoteproc_core.c
+++ b/drivers/remoteproc/remoteproc_core.c
@@ -1369,7 +1369,7 @@ static int rproc_start(struct rproc *rproc, const struct 
firmware *fw)
        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;
@@ -1490,6 +1490,63 @@ static int rproc_fw_boot(struct rproc *rproc, const 
struct firmware *fw)
        return ret;
 }
 
+/*
+ * 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.
  *
-- 
2.25.1

Reply via email to