|
@@ -1030,8 +1030,9 @@ static void rproc_crash_handler_work(struct work_struct *work)
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * rproc_boot() - boot a remote processor
|
|
|
+ * __rproc_boot() - boot a remote processor
|
|
|
* @rproc: handle of a remote processor
|
|
|
+ * @wait: wait for rproc registration completion
|
|
|
*
|
|
|
* Boot a remote processor (i.e. load its firmware, power it on, ...).
|
|
|
*
|
|
@@ -1040,7 +1041,7 @@ static void rproc_crash_handler_work(struct work_struct *work)
|
|
|
*
|
|
|
* Returns 0 on success, and an appropriate error value otherwise.
|
|
|
*/
|
|
|
-int rproc_boot(struct rproc *rproc)
|
|
|
+static int __rproc_boot(struct rproc *rproc, bool wait)
|
|
|
{
|
|
|
const struct firmware *firmware_p;
|
|
|
struct device *dev;
|
|
@@ -1088,6 +1089,10 @@ int rproc_boot(struct rproc *rproc)
|
|
|
goto downref_rproc;
|
|
|
}
|
|
|
|
|
|
+ /* if rproc virtio is not yet configured, wait */
|
|
|
+ if (wait)
|
|
|
+ wait_for_completion(&rproc->firmware_loading_complete);
|
|
|
+
|
|
|
ret = rproc_fw_boot(rproc, firmware_p);
|
|
|
|
|
|
release_firmware(firmware_p);
|
|
@@ -1101,8 +1106,28 @@ unlock_mutex:
|
|
|
mutex_unlock(&rproc->lock);
|
|
|
return ret;
|
|
|
}
|
|
|
+
|
|
|
+/**
|
|
|
+ * rproc_boot() - boot a remote processor
|
|
|
+ * @rproc: handle of a remote processor
|
|
|
+ */
|
|
|
+int rproc_boot(struct rproc *rproc)
|
|
|
+{
|
|
|
+ return __rproc_boot(rproc, true);
|
|
|
+}
|
|
|
EXPORT_SYMBOL(rproc_boot);
|
|
|
|
|
|
+/**
|
|
|
+ * rproc_boot_nowait() - boot a remote processor
|
|
|
+ * @rproc: handle of a remote processor
|
|
|
+ *
|
|
|
+ * Same as rproc_boot() but don't wait for rproc registration completion
|
|
|
+ */
|
|
|
+int rproc_boot_nowait(struct rproc *rproc)
|
|
|
+{
|
|
|
+ return __rproc_boot(rproc, false);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* rproc_shutdown() - power off the remote processor
|
|
|
* @rproc: the remote processor
|