Commit 0f9dc562 authored by Mathieu Poirier's avatar Mathieu Poirier Committed by Bjorn Andersson

remoteproc: Refactor function rproc_boot()

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: default avatarMathieu Poirier <mathieu.poirier@linaro.org>
Reviewed-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Tested-by: default avatarArnaud Pouliquen <arnaud.pouliquen@st.com>
Link: https://lore.kernel.org/r/20200714195035.1426873-7-mathieu.poirier@linaro.orgSigned-off-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
parent 88d3a136
...@@ -1497,7 +1497,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw) ...@@ -1497,7 +1497,7 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
* Attach to remote processor - similar to rproc_fw_boot() but without * Attach to remote processor - similar to rproc_fw_boot() but without
* the steps that deal with the firmware image. * 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; struct device *dev = &rproc->dev;
int ret; int ret;
...@@ -1908,24 +1908,30 @@ int rproc_boot(struct rproc *rproc) ...@@ -1908,24 +1908,30 @@ int rproc_boot(struct rproc *rproc)
goto unlock_mutex; 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) { if (atomic_inc_return(&rproc->power) > 1) {
ret = 0; ret = 0;
goto unlock_mutex; 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 = rproc_actuate(rproc);
ret = request_firmware(&firmware_p, rproc->firmware, dev); } else {
if (ret < 0) { dev_info(dev, "powering up %s\n", rproc->name);
dev_err(dev, "request_firmware failed: %d\n", ret);
goto downref_rproc;
}
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: downref_rproc:
if (ret) if (ret)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment