2020-07-07 13:07:08 +08:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
* Copyright(c) 2020 Intel Corporation
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _RTE_VHOST_ASYNC_H_
|
|
|
|
#define _RTE_VHOST_ASYNC_H_
|
|
|
|
|
|
|
|
#include "rte_vhost.h"
|
|
|
|
|
|
|
|
/**
|
|
|
|
* iovec iterator
|
|
|
|
*/
|
|
|
|
struct rte_vhost_iov_iter {
|
|
|
|
/** offset to the first byte of interesting data */
|
|
|
|
size_t offset;
|
|
|
|
/** total bytes of data in this iterator */
|
|
|
|
size_t count;
|
|
|
|
/** pointer to the iovec array */
|
|
|
|
struct iovec *iov;
|
|
|
|
/** number of iovec in this iterator */
|
|
|
|
unsigned long nr_segs;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* dma transfer descriptor pair
|
|
|
|
*/
|
|
|
|
struct rte_vhost_async_desc {
|
|
|
|
/** source memory iov_iter */
|
|
|
|
struct rte_vhost_iov_iter *src;
|
|
|
|
/** destination memory iov_iter */
|
|
|
|
struct rte_vhost_iov_iter *dst;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* dma transfer status
|
|
|
|
*/
|
|
|
|
struct rte_vhost_async_status {
|
|
|
|
/** An array of application specific data for source memory */
|
|
|
|
uintptr_t *src_opaque_data;
|
|
|
|
/** An array of application specific data for destination memory */
|
|
|
|
uintptr_t *dst_opaque_data;
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* dma operation callbacks to be implemented by applications
|
|
|
|
*/
|
|
|
|
struct rte_vhost_async_channel_ops {
|
|
|
|
/**
|
|
|
|
* instruct async engines to perform copies for a batch of packets
|
|
|
|
*
|
|
|
|
* @param vid
|
|
|
|
* id of vhost device to perform data copies
|
|
|
|
* @param queue_id
|
|
|
|
* queue id to perform data copies
|
|
|
|
* @param descs
|
|
|
|
* an array of DMA transfer memory descriptors
|
|
|
|
* @param opaque_data
|
|
|
|
* opaque data pair sending to DMA engine
|
|
|
|
* @param count
|
|
|
|
* number of elements in the "descs" array
|
|
|
|
* @return
|
2020-07-23 13:39:06 +08:00
|
|
|
* number of descs processed
|
2020-07-07 13:07:08 +08:00
|
|
|
*/
|
2020-07-23 13:39:06 +08:00
|
|
|
uint32_t (*transfer_data)(int vid, uint16_t queue_id,
|
2020-07-07 13:07:08 +08:00
|
|
|
struct rte_vhost_async_desc *descs,
|
|
|
|
struct rte_vhost_async_status *opaque_data,
|
|
|
|
uint16_t count);
|
|
|
|
/**
|
|
|
|
* check copy-completed packets from the async engine
|
|
|
|
* @param vid
|
|
|
|
* id of vhost device to check copy completion
|
|
|
|
* @param queue_id
|
2020-07-23 13:39:06 +08:00
|
|
|
* queue id to check copy completion
|
2020-07-07 13:07:08 +08:00
|
|
|
* @param opaque_data
|
|
|
|
* buffer to receive the opaque data pair from DMA engine
|
|
|
|
* @param max_packets
|
|
|
|
* max number of packets could be completed
|
|
|
|
* @return
|
2020-10-13 09:45:43 +08:00
|
|
|
* number of async descs completed
|
2020-07-07 13:07:08 +08:00
|
|
|
*/
|
2020-07-23 13:39:06 +08:00
|
|
|
uint32_t (*check_completed_copies)(int vid, uint16_t queue_id,
|
2020-07-07 13:07:08 +08:00
|
|
|
struct rte_vhost_async_status *opaque_data,
|
|
|
|
uint16_t max_packets);
|
|
|
|
};
|
|
|
|
|
2020-10-13 09:45:43 +08:00
|
|
|
/**
|
|
|
|
* inflight async packet information
|
|
|
|
*/
|
|
|
|
struct async_inflight_info {
|
2021-01-11 07:16:27 -05:00
|
|
|
struct rte_mbuf *mbuf;
|
|
|
|
uint16_t descs; /* num of descs inflight */
|
2021-04-27 08:03:33 +00:00
|
|
|
uint16_t nr_buffers; /* num of buffers inflight for packed ring */
|
2020-10-13 09:45:43 +08:00
|
|
|
};
|
|
|
|
|
2020-07-07 13:07:08 +08:00
|
|
|
/**
|
|
|
|
* dma channel feature bit definition
|
|
|
|
*/
|
|
|
|
struct rte_vhost_async_features {
|
|
|
|
union {
|
|
|
|
uint32_t intval;
|
|
|
|
struct {
|
|
|
|
uint32_t async_inorder:1;
|
|
|
|
uint32_t resvd_0:15;
|
|
|
|
uint32_t async_threshold:12;
|
|
|
|
uint32_t resvd_1:4;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
2021-01-11 07:16:26 -05:00
|
|
|
* register an async channel for vhost
|
2020-07-07 13:07:08 +08:00
|
|
|
*
|
|
|
|
* @param vid
|
|
|
|
* vhost device id async channel to be attached to
|
|
|
|
* @param queue_id
|
|
|
|
* vhost queue id async channel to be attached to
|
|
|
|
* @param features
|
|
|
|
* DMA channel feature bit
|
|
|
|
* b0 : DMA supports inorder data transfer
|
|
|
|
* b1 - b15: reserved
|
|
|
|
* b16 - b27: Packet length threshold for DMA transfer
|
|
|
|
* b28 - b31: reserved
|
|
|
|
* @param ops
|
|
|
|
* DMA operation callbacks
|
|
|
|
* @return
|
|
|
|
* 0 on success, -1 on failures
|
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
int rte_vhost_async_channel_register(int vid, uint16_t queue_id,
|
|
|
|
uint32_t features, struct rte_vhost_async_channel_ops *ops);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* unregister a dma channel for vhost
|
|
|
|
*
|
|
|
|
* @param vid
|
|
|
|
* vhost device id DMA channel to be detached
|
|
|
|
* @param queue_id
|
|
|
|
* vhost queue id DMA channel to be detached
|
|
|
|
* @return
|
|
|
|
* 0 on success, -1 on failures
|
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
int rte_vhost_async_channel_unregister(int vid, uint16_t queue_id);
|
|
|
|
|
2020-07-07 13:07:09 +08:00
|
|
|
/**
|
2021-01-11 07:16:27 -05:00
|
|
|
* This function submits enqueue data to async engine. Successfully
|
|
|
|
* enqueued packets can be transfer completed or being occupied by DMA
|
|
|
|
* engines, when this API returns. Transfer completed packets are returned
|
|
|
|
* in comp_pkts, so users need to guarantee its size is greater than or
|
|
|
|
* equal to the size of pkts; for packets that are successfully enqueued
|
|
|
|
* but not transfer completed, users should poll transfer status by
|
|
|
|
* rte_vhost_poll_enqueue_completed().
|
2020-07-07 13:07:09 +08:00
|
|
|
*
|
|
|
|
* @param vid
|
|
|
|
* id of vhost device to enqueue data
|
|
|
|
* @param queue_id
|
|
|
|
* queue id to enqueue data
|
|
|
|
* @param pkts
|
|
|
|
* array of packets to be enqueued
|
|
|
|
* @param count
|
|
|
|
* packets num to be enqueued
|
2021-01-11 07:16:27 -05:00
|
|
|
* @param comp_pkts
|
|
|
|
* empty array to get transfer completed packets. Users need to
|
|
|
|
* guarantee its size is greater than or equal to that of pkts
|
|
|
|
* @param comp_count
|
|
|
|
* num of packets that are transfer completed, when this API returns.
|
|
|
|
* If no packets are transfer completed, its value is set to 0.
|
2020-07-07 13:07:09 +08:00
|
|
|
* @return
|
2021-01-11 07:16:27 -05:00
|
|
|
* num of packets enqueued, including in-flight and transfer completed
|
2020-07-07 13:07:09 +08:00
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
uint16_t rte_vhost_submit_enqueue_burst(int vid, uint16_t queue_id,
|
2021-01-11 07:16:27 -05:00
|
|
|
struct rte_mbuf **pkts, uint16_t count,
|
|
|
|
struct rte_mbuf **comp_pkts, uint32_t *comp_count);
|
2020-07-07 13:07:09 +08:00
|
|
|
|
|
|
|
/**
|
2021-01-11 07:16:26 -05:00
|
|
|
* This function checks async completion status for a specific vhost
|
2020-07-07 13:07:09 +08:00
|
|
|
* device queue. Packets which finish copying (enqueue) operation
|
|
|
|
* will be returned in an array.
|
|
|
|
*
|
|
|
|
* @param vid
|
|
|
|
* id of vhost device to enqueue data
|
|
|
|
* @param queue_id
|
|
|
|
* queue id to enqueue data
|
|
|
|
* @param pkts
|
|
|
|
* blank array to get return packet pointer
|
|
|
|
* @param count
|
|
|
|
* size of the packet array
|
|
|
|
* @return
|
|
|
|
* num of packets returned
|
|
|
|
*/
|
|
|
|
__rte_experimental
|
|
|
|
uint16_t rte_vhost_poll_enqueue_completed(int vid, uint16_t queue_id,
|
|
|
|
struct rte_mbuf **pkts, uint16_t count);
|
|
|
|
|
2020-07-07 13:07:08 +08:00
|
|
|
#endif /* _RTE_VHOST_ASYNC_H_ */
|