Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

openamp: decouple rpmsg virtio and remoteproc #549

Merged
merged 2 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 0 additions & 12 deletions lib/include/openamp/remoteproc.h
Original file line number Diff line number Diff line change
Expand Up @@ -462,17 +462,6 @@ struct remoteproc_ops {
/** Notify the remote */
int (*notify)(struct remoteproc *rproc, uint32_t id);

/**
* @brief Wait for remote notified, when there is no TX buffer anymore.
* Set to NULL means use usleep to wait TX buffer available.
*
* @param rproc pointer to remoteproc instance
* @param id the notifyid
*
* return 0 means there is notify available, otherwise negative value.
*/
int (*wait_notified)(struct remoteproc *rproc, uint32_t id);

/**
* @brief Get remoteproc memory I/O region by either name, virtual
* address, physical address or device address.
Expand Down Expand Up @@ -508,7 +497,6 @@ struct remoteproc_ops {
#define RPROC_ERR_RSC_TAB_NP (RPROC_EBASE + 10)
#define RPROC_ERR_RSC_TAB_NS (RPROC_EBASE + 11)
#define RPROC_ERR_LOADER_STATE (RPROC_EBASE + 12)
#define RPROC_EOPNOTSUPP (RPROC_EBASE + 13)
#define RPROC_EMAX (RPROC_EBASE + 16)
#define RPROC_EPTR (void *)(-1)
#define RPROC_EOF (void *)(-1)
Expand Down
23 changes: 0 additions & 23 deletions lib/include/openamp/remoteproc_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,6 @@ extern "C" {
/* define vdev notification function user should implement */
typedef int (*rpvdev_notify_func)(void *priv, uint32_t id);

/*
* Define vdev wait notified function, user can implement this
* function to wait available Tx buffers.
*/
typedef int (*rpvdev_wait_notified_func)(void *priv, uint32_t id);

/** @brief Virtio structure for remoteproc instance */
struct remoteproc_virtio {
/** Pointer to private data */
Expand All @@ -59,9 +53,6 @@ struct remoteproc_virtio {
/** Notification function */
rpvdev_notify_func notify;

/** Wait notification function (optional) */
rpvdev_wait_notified_func wait_notified;

/** Virtio device */
struct virtio_device vdev;

Expand Down Expand Up @@ -135,20 +126,6 @@ int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid);
*/
void rproc_virtio_wait_remote_ready(struct virtio_device *vdev);

/**
* @brief Set the remoteproc virtio wait notified function.
*
* This \ref wait_notified_cb function will be called to customize the wait, when
* no Tx buffer is available.
*
* @param vdev Pointer to the virtio device.
* @param wait_notified_cb The wait notified callback function.
*
* @return 0 for successful, negative value for failure.
*/
int rproc_virtio_set_wait_notified(struct virtio_device *vdev,
rpvdev_wait_notified_func wait_notified_cb);

#if defined __cplusplus
}
#endif
Expand Down
9 changes: 9 additions & 0 deletions lib/include/openamp/rpmsg_virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ extern "C" {
#define BUFFER_INVALIDATE(x, s) do { } while (0)
#endif /* VIRTIO_CACHED_BUFFERS || VIRTIO_USE_DCACHE */

/* Callback handler for rpmsg virtio service */
typedef int (*rpmsg_virtio_notify_wait_cb)(struct rpmsg_device *rdev, uint32_t id);

/** @brief Shared memory pool used for RPMsg buffers */
struct rpmsg_virtio_shm_pool {
/** Base address of the memory pool */
Expand Down Expand Up @@ -98,6 +101,12 @@ struct rpmsg_virtio_device {
* \ref rpmsg_virtio_release_tx_buffer function
*/
struct metal_list reclaimer;

/**
* Callback handler for rpmsg virtio service, called when service
* can't get tx buffer
*/
rpmsg_virtio_notify_wait_cb notify_wait_cb;
};

#define RPMSG_REMOTE VIRTIO_DEV_DEVICE
Expand Down
3 changes: 0 additions & 3 deletions lib/include/openamp/virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,9 +275,6 @@ struct virtio_dispatch {

/** Notify the other side that a virtio vring as been updated. */
void (*notify)(struct virtqueue *vq);

/** Customize the wait, when no Tx buffer is available (optional) */
int (*wait_notified)(struct virtio_device *dev, struct virtqueue *vq);
};

/**
Expand Down
11 changes: 0 additions & 11 deletions lib/remoteproc/remoteproc.c
Original file line number Diff line number Diff line change
Expand Up @@ -901,16 +901,6 @@ static int remoteproc_virtio_notify(void *priv, uint32_t id)
return 0;
}

static int remoteproc_wait_notified(void *priv, uint32_t id)
{
struct remoteproc *rproc = priv;

if (rproc->ops->wait_notified)
return rproc->ops->wait_notified(rproc, id);

return -RPROC_EOPNOTSUPP;
}

struct virtio_device *
remoteproc_create_virtio(struct remoteproc *rproc,
int vdev_id, unsigned int role,
Expand Down Expand Up @@ -969,7 +959,6 @@ remoteproc_create_virtio(struct remoteproc *rproc,
rproc_virtio_wait_remote_ready(vdev);

rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
rproc_virtio_set_wait_notified(vdev, remoteproc_wait_notified);
metal_list_add_tail(&rproc->vdevs, &rpvdev->node);
num_vrings = vdev_rsc->num_of_vrings;

Expand Down
29 changes: 0 additions & 29 deletions lib/remoteproc/remoteproc_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,21 +30,6 @@ static void rproc_virtio_virtqueue_notify(struct virtqueue *vq)
rpvdev->notify(rpvdev->priv, vring_info->notifyid);
}

static int rproc_virtio_wait_notified(struct virtio_device *vdev,
struct virtqueue *vq)
{
struct remoteproc_virtio *rpvdev;
struct virtio_vring_info *vring_info;
unsigned int vq_id = vq->vq_queue_index;

rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
vring_info = &vdev->vrings_info[vq_id];

return rpvdev->wait_notified ?
rpvdev->wait_notified(rpvdev->priv, vring_info->notifyid) :
-RPROC_EOPNOTSUPP;
}

static unsigned char rproc_virtio_get_status(struct virtio_device *vdev)
{
struct remoteproc_virtio *rpvdev;
Expand Down Expand Up @@ -202,7 +187,6 @@ static const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = {
.get_features = rproc_virtio_get_features,
.read_config = rproc_virtio_read_config,
.notify = rproc_virtio_virtqueue_notify,
.wait_notified = rproc_virtio_wait_notified,
#ifndef VIRTIO_DEVICE_ONLY
/*
* We suppose here that the vdev is in a shared memory so that can
Expand Down Expand Up @@ -381,16 +365,3 @@ void rproc_virtio_wait_remote_ready(struct virtio_device *vdev)
metal_cpu_yield();
}
}

int rproc_virtio_set_wait_notified(struct virtio_device *vdev,
rpvdev_wait_notified_func wait_notified_cb)
{
struct remoteproc_virtio *rpvdev;

if (!vdev || !wait_notified_cb)
return -RPROC_EINVAL;
rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev);
rpvdev->wait_notified = wait_notified_cb;

return 0;
}
20 changes: 13 additions & 7 deletions lib/rpmsg/rpmsg_virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -358,12 +358,16 @@ static void rpmsg_virtio_release_rx_buffer(struct rpmsg_device *rdev,
metal_mutex_release(&rdev->lock);
}

static int rpmsg_virtio_wait_notified(struct rpmsg_virtio_device *rvdev,
struct virtqueue *vq)
static int rpmsg_virtio_notify_wait(struct rpmsg_virtio_device *rvdev, struct virtqueue *vq)
{
return rvdev->vdev->func->wait_notified ?
rvdev->vdev->func->wait_notified(rvdev->vdev, vq) :
RPMSG_EOPNOTSUPP;
struct virtio_vring_info *vring_info;

vring_info = &rvdev->vdev->vrings_info[vq->vq_queue_index];

if (!rvdev->notify_wait_cb)
return RPMSG_EOPNOTSUPP;

return rvdev->notify_wait_cb(&rvdev->rdev, vring_info->notifyid);
}
arnopo marked this conversation as resolved.
Show resolved Hide resolved

static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
Expand Down Expand Up @@ -400,10 +404,12 @@ static void *rpmsg_virtio_get_tx_payload_buffer(struct rpmsg_device *rdev,
* Try to use wait loop implemented in the virtio dispatcher and
* use metal_sleep_usec() method by default.
*/
status = rpmsg_virtio_wait_notified(rvdev, rvdev->rvq);
if (status != RPMSG_SUCCESS) {
status = rpmsg_virtio_notify_wait(rvdev, rvdev->rvq);
arnopo marked this conversation as resolved.
Show resolved Hide resolved
if (status == RPMSG_EOPNOTSUPP) {
metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL);
tick_count--;
} else if (status == RPMSG_SUCCESS) {
break;
}
}

Expand Down
Loading