Skip to content

Commit

Permalink
Merge tag 'rproc-v4.7' of git://github.com/andersson/remoteproc
Browse files Browse the repository at this point in the history
Pull remoteproc updates from Bjorn Andersson:
 "Introduce a synchronization point between the async firmware loading
  and clients requesting the remote processor to boot, as well as
  support for remote processors that are not interested in the resource
  table information"

* tag 'rproc-v4.7' of git://github.com/andersson/remoteproc:
  remoteproc: Add additional crash reasons
  remoteproc: core: Make the loaded resource table optional
  remoteproc: core: Task sync during rproc_fw_boot()
  • Loading branch information
torvalds committed May 19, 2016
2 parents 676d973 + b3d3903 commit 97f0090
Show file tree
Hide file tree
Showing 4 changed files with 37 additions and 9 deletions.
39 changes: 31 additions & 8 deletions drivers/remoteproc/remoteproc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ static DEFINE_IDA(rproc_dev_index);

static const char * const rproc_crash_names[] = {
[RPROC_MMUFAULT] = "mmufault",
[RPROC_WATCHDOG] = "watchdog",
[RPROC_FATAL_ERROR] = "fatal error",
};

/* translate rproc_crash_type to string */
Expand Down Expand Up @@ -856,12 +858,8 @@ static int rproc_fw_boot(struct rproc *rproc, const struct firmware *fw)
* copy this information to device memory.
*/
loaded_table = rproc_find_loaded_rsc_table(rproc, fw);
if (!loaded_table) {
ret = -EINVAL;
goto clean_up;
}

memcpy(loaded_table, rproc->cached_table, tablesz);
if (loaded_table)
memcpy(loaded_table, rproc->cached_table, tablesz);

/* power up the remote processor */
ret = rproc->ops->start(rproc);
Expand Down Expand Up @@ -1030,8 +1028,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, ...).
*
Expand All @@ -1040,7 +1039,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;
Expand Down Expand Up @@ -1088,6 +1087,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);
Expand All @@ -1101,8 +1104,28 @@ int rproc_boot(struct rproc *rproc)
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
Expand Down
1 change: 1 addition & 0 deletions drivers/remoteproc/remoteproc_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ struct rproc_fw_ops {
/* from remoteproc_core.c */
void rproc_release(struct kref *kref);
irqreturn_t rproc_vq_interrupt(struct rproc *rproc, int vq_id);
int rproc_boot_nowait(struct rproc *rproc);

/* from remoteproc_virtio.c */
int rproc_add_virtio_dev(struct rproc_vdev *rvdev, int id);
Expand Down
2 changes: 1 addition & 1 deletion drivers/remoteproc/remoteproc_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,7 @@ static int rproc_virtio_find_vqs(struct virtio_device *vdev, unsigned nvqs,
}

/* now that the vqs are all set, boot the remote processor */
ret = rproc_boot(rproc);
ret = rproc_boot_nowait(rproc);
if (ret) {
dev_err(&rproc->dev, "rproc_boot() failed %d\n", ret);
goto error;
Expand Down
4 changes: 4 additions & 0 deletions include/linux/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -365,6 +365,8 @@ enum rproc_state {
/**
* enum rproc_crash_type - remote processor crash types
* @RPROC_MMUFAULT: iommu fault
* @RPROC_WATCHDOG: watchdog bite
* @RPROC_FATAL_ERROR fatal error
*
* Each element of the enum is used as an array index. So that, the value of
* the elements should be always something sane.
Expand All @@ -373,6 +375,8 @@ enum rproc_state {
*/
enum rproc_crash_type {
RPROC_MMUFAULT,
RPROC_WATCHDOG,
RPROC_FATAL_ERROR,
};

/**
Expand Down

0 comments on commit 97f0090

Please sign in to comment.