Skip to content

Commit

Permalink
virtio: add create_virtqueues and delete_virtqueues in virtio_dispatch
Browse files Browse the repository at this point in the history
This is the first step to decoupling the virtio deivce and transport
layer.

Signed-off-by: Bowen Wang <[email protected]>
  • Loading branch information
CV-Bowen committed Jul 3, 2023
1 parent b177618 commit 7394743
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 0 deletions.
94 changes: 94 additions & 0 deletions lib/include/openamp/virtio.h
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,11 @@ void virtio_describe(struct virtio_device *dev, const char *msg,
*/

struct virtio_dispatch {
int (*create_virtqueues)(struct virtio_device *vdev,
unsigned int flags,
unsigned int nvqs, const char *names[],
vq_callback callbacks[]);
void (*delete_virtqueues)(struct virtio_device *vdev);
uint8_t (*get_status)(struct virtio_device *dev);
void (*set_status)(struct virtio_device *dev, uint8_t status);
uint32_t (*get_features)(struct virtio_device *dev);
Expand All @@ -196,10 +201,99 @@ struct virtio_dispatch {
void (*notify)(struct virtqueue *vq);
};

/**
* @brief Create the virtio device virtqueue.
*
* @param vdev Pointer to virtio device structure.
* @param flags Create flag.
* @param nvqs The virtqueue number.
* @param names Virtqueue names.
* @param callbacks Virtqueue callback functions.
*
* @return Pointer to virtio device structure.
*/
int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
unsigned int nvqs, const char *names[],
vq_callback callbacks[]);

/**
* @brief Delete the virtio device virtqueue.
*
* @param vdev Pointer to virtio device structure.
*
* @return pointer to virtio device structure.
*/
#define virtio_delete_virtqueues(vdev) \
vdev->func->delete_virtqueues(vdev)

/**
* @brief Retrieve device status.
*
* @param dev Pointer to device structure.
*
* @return status of the device.
*/
#define virtio_get_status(vdev) \
vdev->func->get_status(vdev)

/**
* @brief Set device status.
*
* @param dev Pointer to device structure.
* @param status Value to be set as device status.
*/
#define virtio_set_status(vdev) \
vdev->func->set_status(vdev)

/**
* @brief Retrieve configuration data from the device.
*
* @param dev Pointer to device structure.
* @param offset Offset of the data within the configuration area.
* @param dst Address of the buffer that will hold the data.
* @param len Length of the data to be retrieved.
*/
#define virtio_read_config(vdev, offset, dst, length) \
vdev->func->read_config(vdev, offset, dst, length)

/**
* @brief Write configuration data to the device.
*
* @param dev Pointer to device structure.
* @param offset Offset of the data within the configuration area.
* @param src Address of the buffer that holds the data to write.
* @param len Length of the data to be written.
*/
#define virtio_write_config(vdev, offset, src, length) \
vdev->func->write_config(vdev, offset, src, length)

/**
* @brief Get the virtio device features.
*
* @param[in] dev Pointer to device structure.
*
* @return Features supported by both the driver and the device as a bitfield.
*/
#define virtio_get_features(vdev) \
vdev->func->get_features(vdev)

/**
* @brief Set features supported by the VIRTIO driver.
*
* @param dev Pointer to device structure.
* @param features Features supported by the driver as a bitfield.
*/
#define virtio_set_feature(vdev, features) \
vdev->func->set_features(vdev, features)

/**
* @brief Reset virtio device.
*
* @param vdev Pointer to virtio_device structure.
*/
#define virtio_reset_device(vdev) \
vdev->func->reset_device(vdev)

#if defined __cplusplus
}
#endif
Expand Down
5 changes: 5 additions & 0 deletions lib/virtio/virtio.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,11 @@ int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags,
int ret;
(void)flags;

if (vdev->func->create_virtqueues != NULL) {
return vdev->func->create_virtqueues(vdev, flags, nvqs,
names, callbacks);
}

num_vrings = vdev->vrings_num;
if (nvqs > num_vrings)
return ERROR_VQUEUE_INVLD_PARAM;
Expand Down

0 comments on commit 7394743

Please sign in to comment.