Skip to content

Commit

Permalink
remoteproc: Decouple vdev resources and devices
Browse files Browse the repository at this point in the history
Represent the virtio device part of the vdev resources as remoteproc
subdevices to finalize the decoupling of the virtio resource and device
handling.

Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
  • Loading branch information
Bjorn Andersson committed Nov 15, 2016
1 parent 2b45cef commit f5bcb35
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 15 deletions.
35 changes: 20 additions & 15 deletions drivers/remoteproc/remoteproc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,6 +296,20 @@ void rproc_free_vring(struct rproc_vring *rvring)
rsc->vring[idx].notifyid = -1;
}

static int rproc_vdev_do_probe(struct rproc_subdev *subdev)
{
struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);

return rproc_add_virtio_dev(rvdev, rvdev->id);
}

static void rproc_vdev_do_remove(struct rproc_subdev *subdev)
{
struct rproc_vdev *rvdev = container_of(subdev, struct rproc_vdev, subdev);

rproc_remove_virtio_dev(rvdev);
}

/**
* rproc_handle_vdev() - handle a vdev fw resource
* @rproc: the remote processor
Expand Down Expand Up @@ -358,6 +372,7 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,

kref_init(&rvdev->refcount);

rvdev->id = rsc->id;
rvdev->rproc = rproc;

/* parse the vrings */
Expand All @@ -382,18 +397,14 @@ static int rproc_handle_vdev(struct rproc *rproc, struct fw_rsc_vdev *rsc,

list_add_tail(&rvdev->node, &rproc->rvdevs);

/* it is now safe to add the virtio device */
ret = rproc_add_virtio_dev(rvdev, rsc->id);
if (ret)
goto remove_rvdev;
rproc_add_subdev(rproc, &rvdev->subdev,
rproc_vdev_do_probe, rproc_vdev_do_remove);

return 0;

unwind_vring_allocations:
for (i--; i >= 0; i--)
rproc_free_vring(&rvdev->vring[i]);
remove_rvdev:
list_del(&rvdev->node);
free_rvdev:
kfree(rvdev);
return ret;
Expand All @@ -403,6 +414,7 @@ void rproc_vdev_release(struct kref *ref)
{
struct rproc_vdev *rvdev = container_of(ref, struct rproc_vdev, refcount);
struct rproc_vring *rvring;
struct rproc *rproc = rvdev->rproc;
int id;

for (id = 0; id < ARRAY_SIZE(rvdev->vring); id++) {
Expand All @@ -413,6 +425,7 @@ void rproc_vdev_release(struct kref *ref)
rproc_free_vring(rvring);
}

rproc_remove_subdev(rproc, &rvdev->subdev);
list_del(&rvdev->node);
kfree(rvdev);
}
Expand Down Expand Up @@ -842,10 +855,8 @@ static void rproc_resource_cleanup(struct rproc *rproc)
}

/* clean up remote vdev entries */
list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node) {
rproc_remove_virtio_dev(rvdev);
list_for_each_entry_safe(rvdev, rvtmp, &rproc->rvdevs, node)
kref_put(&rvdev->refcount, rproc_vdev_release);
}
}

/*
Expand Down Expand Up @@ -1507,8 +1518,6 @@ EXPORT_SYMBOL(rproc_put);
*/
int rproc_del(struct rproc *rproc)
{
struct rproc_vdev *rvdev, *tmp;

if (!rproc)
return -EINVAL;

Expand All @@ -1520,10 +1529,6 @@ int rproc_del(struct rproc *rproc)
if (rproc->auto_boot)
rproc_shutdown(rproc);

/* clean up remote vdev entries */
list_for_each_entry_safe(rvdev, tmp, &rproc->rvdevs, node)
rproc_remove_virtio_dev(rvdev);

/* the rproc is downref'ed as soon as it's removed from the klist */
mutex_lock(&rproc_list_mutex);
list_del(&rproc->node);
Expand Down
5 changes: 5 additions & 0 deletions include/linux/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -488,6 +488,8 @@ struct rproc_vring {
/**
* struct rproc_vdev - remoteproc state for a supported virtio device
* @refcount: reference counter for the vdev and vring allocations
* @subdev: handle for registering the vdev as a rproc subdevice
* @id: virtio device id (as in virtio_ids.h)
* @node: list node
* @rproc: the rproc handle
* @vdev: the virio device
Expand All @@ -497,6 +499,9 @@ struct rproc_vring {
struct rproc_vdev {
struct kref refcount;

struct rproc_subdev subdev;

unsigned int id;
struct list_head node;
struct rproc *rproc;
struct virtio_device vdev;
Expand Down

0 comments on commit f5bcb35

Please sign in to comment.