diff options
author | Ohad Ben-Cohen <ohad@wizery.com> | 2012-05-30 15:01:25 -0400 |
---|---|---|
committer | Ohad Ben-Cohen <ohad@wizery.com> | 2012-07-05 17:53:03 -0400 |
commit | b5ab5e24e960b9f780a4cc96815cfd4b0d412720 (patch) | |
tree | d07fbf490e03e9e2706c14a9bc24ae4f47b05111 /include | |
parent | 6db20ea8d85064175c7ef594c433c6c2e6bbab83 (diff) |
remoteproc: maintain a generic child device for each rproc
For each registered rproc, maintain a generic remoteproc device whose
parent is the low level platform-specific device (commonly a pdev, but
it may certainly be any other type of device too).
With this in hand, the resulting device hierarchy might then look like:
omap-rproc.0
|
- remoteproc0 <---- new !
|
- virtio0
|
- virtio1
|
- rpmsg0
|
- rpmsg1
|
- rpmsg2
Where:
- omap-rproc.0 is the low level device that's bound to the
driver which invokes rproc_register()
- remoteproc0 is the result of this patch, and will be added by the
remoteproc framework when rproc_register() is invoked
- virtio0 and virtio1 are vdevs that are registered by remoteproc
when it realizes that they are supported by the firmware
of the physical remote processor represented by omap-rproc.0
- rpmsg0, rpmsg1 and rpmsg2 are rpmsg devices that represent rpmsg
channels, and are registerd by the rpmsg bus when it gets notified
about their existence
Technically, this patch:
- changes 'struct rproc' to contain this generic remoteproc.x device
- creates a new "remoteproc" type, to which this new generic remoteproc.x
device belong to.
- adds a super simple enumeration method for the indices of the
remoteproc.x devices
- updates all dev_* messaging to use the generic remoteproc.x device
instead of the low level platform-specific device
- updates all dma_* allocations to use the parent of remoteproc.x (where
the platform-specific memory pools, most commonly CMA, are to be found)
Adding this generic device has several merits:
- we can now add remoteproc runtime PM support simply by hooking onto the
new "remoteproc" type
- all remoteproc log messages will now carry a common name prefix
instead of having a platform-specific one
- having a device as part of the rproc struct makes it possible to simplify
refcounting (see subsequent patch)
Thanks to Stephen Boyd <sboyd@codeaurora.org> for suggesting and
discussing these ideas in one of the remoteproc review threads and
to Fernando Guzman Lugo <fernando.lugo@ti.com> for trying them out
with the (upcoming) runtime PM support for remoteproc.
Cc: Fernando Guzman Lugo <fernando.lugo@ti.com>
Reviewed-by: Stephen Boyd <sboyd@codeaurora.org>
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/remoteproc.h | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/include/linux/remoteproc.h b/include/linux/remoteproc.h index f1ffabb978d3..7f806dcf5278 100644 --- a/include/linux/remoteproc.h +++ b/include/linux/remoteproc.h | |||
@@ -369,7 +369,7 @@ enum rproc_state { | |||
369 | * @firmware: name of firmware file to be loaded | 369 | * @firmware: name of firmware file to be loaded |
370 | * @priv: private data which belongs to the platform-specific rproc module | 370 | * @priv: private data which belongs to the platform-specific rproc module |
371 | * @ops: platform-specific start/stop rproc handlers | 371 | * @ops: platform-specific start/stop rproc handlers |
372 | * @dev: underlying device | 372 | * @dev: virtual device for refcounting and common remoteproc behavior |
373 | * @refcount: refcount of users that have a valid pointer to this rproc | 373 | * @refcount: refcount of users that have a valid pointer to this rproc |
374 | * @power: refcount of users who need this rproc powered up | 374 | * @power: refcount of users who need this rproc powered up |
375 | * @state: state of the device | 375 | * @state: state of the device |
@@ -383,6 +383,7 @@ enum rproc_state { | |||
383 | * @bootaddr: address of first instruction to boot rproc with (optional) | 383 | * @bootaddr: address of first instruction to boot rproc with (optional) |
384 | * @rvdevs: list of remote virtio devices | 384 | * @rvdevs: list of remote virtio devices |
385 | * @notifyids: idr for dynamically assigning rproc-wide unique notify ids | 385 | * @notifyids: idr for dynamically assigning rproc-wide unique notify ids |
386 | * @index: index of this rproc device | ||
386 | */ | 387 | */ |
387 | struct rproc { | 388 | struct rproc { |
388 | struct klist_node node; | 389 | struct klist_node node; |
@@ -391,7 +392,7 @@ struct rproc { | |||
391 | const char *firmware; | 392 | const char *firmware; |
392 | void *priv; | 393 | void *priv; |
393 | const struct rproc_ops *ops; | 394 | const struct rproc_ops *ops; |
394 | struct device *dev; | 395 | struct device dev; |
395 | struct kref refcount; | 396 | struct kref refcount; |
396 | atomic_t power; | 397 | atomic_t power; |
397 | unsigned int state; | 398 | unsigned int state; |
@@ -405,6 +406,7 @@ struct rproc { | |||
405 | u32 bootaddr; | 406 | u32 bootaddr; |
406 | struct list_head rvdevs; | 407 | struct list_head rvdevs; |
407 | struct idr notifyids; | 408 | struct idr notifyids; |
409 | int index; | ||
408 | }; | 410 | }; |
409 | 411 | ||
410 | /* we currently support only two vrings per rvdev */ | 412 | /* we currently support only two vrings per rvdev */ |