Data Accelerator Offload
Loading...
Searching...
No Matches
dao_virtio_blkdev.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: Marvell-Proprietary
2 * Copyright (c) 2025 Marvell
3 */
4
11#ifndef __INCLUDE_DAO_VIRTIO_BLK_H__
12#define __INCLUDE_DAO_VIRTIO_BLK_H__
13
14#include <dao_virtio.h>
15#include <dao_util.h>
16
17#include <spec/virtio_blk.h>
18
22 uint16_t pem_devid;
24 uint64_t capacity;
26 uint32_t blk_size;
28 uint32_t seg_size_max;
30 uint32_t seg_max;
32 uint16_t dma_vchan;
33#define DAO_VIRTIO_BLKDEV_EXTBUF DAO_BIT_ULL(0)
34 /* Config flags */
35 uint16_t flags;
36 union {
37 struct {
39 struct rte_mempool *pool;
40 };
42 struct {
43 uint16_t dataroom_size;
44 };
45 };
49 uint64_t feat_bits;
52};
53
54/* End of structure dao_virtio_blkdev_conf. */
55
59 union {
60 struct vring_packed_desc vio_desc;
61 uint64_t desc_data[2];
62 };
63
67 uint8_t *status;
69 uint32_t write_buf_len;
71 uint32_t cur_len;
73 uint32_t tot_segs;
75 uint32_t tot_bufs;
77 uint8_t hdr_data[];
78} __rte_packed;
79
81typedef struct dao_virtio_blkdev {
85 uint16_t deq_fn_id;
87 uint16_t compl_fn_id;
89 uint16_t mgmt_fn_id;
90
91#define DAO_VIRTIO_BLKDEV_MEM_SZ 8192
92 uint8_t reserved[DAO_VIRTIO_BLKDEV_MEM_SZ];
94
102
105
106/* Fast path data */
108typedef uint16_t (*dao_virtio_blk_deq_fn_t)(void *q, void **mbufs,
109 uint16_t nb_mbufs);
111typedef uint16_t (*dao_virtio_blk_deq_ext_fn_t)(void *q, void **vbufs,
112 uint16_t nb_bufs);
114typedef uint16_t (*dao_virtio_blk_process_compl_fn_t)(void *q,
115 void **mbufs, uint16_t nb_compl);
117typedef uint16_t (*dao_virtio_blk_process_compl_ext_fn_t)(void *q, void **vbufs,
118 uint16_t nb_compl);
120typedef int (*dao_virtio_blk_desc_manage_fn_t)(uint16_t devid, uint16_t qp_count);
122typedef int (*dao_virtio_blk_desc_manage_ext_fn_t)(uint16_t devid, uint16_t qp_count);
123
136
138typedef int (*dao_virtio_blkdev_status_cb_t)(uint16_t devid, uint8_t status);
140typedef int (*dao_virtio_blkdev_mq_cfg_t)(uint16_t devid, bool qmap_set);
142typedef int (*dao_virtio_blkdev_extbuf_get)(uint16_t devid, void *buffs[],
143 uint16_t nb_buffs);
145typedef int (*dao_virtio_blkdev_extbuf_put)(uint16_t devid, void *buffs[],
146 uint16_t nb_buffs);
147
157
158/* End of structure dao_virtio_blkdev_cbs. */
159
170int dao_virtio_blkdev_init(uint16_t devid, struct dao_virtio_blkdev_conf *conf);
171
181int dao_virtio_blkdev_fini(uint16_t devid);
182
190
195
205
214uint64_t dao_virtio_blkdev_feature_bits_get(uint16_t devid);
215
228int dao_virtio_blkdev_queue_count_max(uint16_t pem_devid, uint16_t devid);
229
243static __rte_always_inline int
244dao_virtio_blk_io_desc_manage(uint16_t devid, uint16_t q_count)
245{
246 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
248
249 mgmt_fn = dao_blk_desc_manage_fns[blkdev->mgmt_fn_id];
250
251 return (*mgmt_fn)(devid, q_count);
252}
253
268static __rte_always_inline uint16_t
269dao_virtio_blk_process_compl(uint16_t devid, uint16_t qid,
270 void **mbufs, uint16_t nb_compl)
271{
272 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
274 void *q = blkdev->qs[qid];
275
276 if (unlikely(!q))
277 return 0;
278
280
281 return (*compl_fn)(q, mbufs, nb_compl);
282}
283
298static __rte_always_inline uint16_t
299dao_virtio_blk_process_compl_ext(uint16_t devid, uint16_t qid, void **vbufs,
300 uint16_t nb_compl)
301{
302 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
304 void *q = blkdev->qs[qid];
305
306 if (unlikely(!q))
307 return 0;
308
310
311 return (*compl_fn)(q, vbufs, nb_compl);
312}
313
328static __rte_always_inline uint16_t
329dao_virtio_blk_dequeue_burst(uint16_t devid, uint16_t qid,
330 void **mbufs, uint16_t nb_mbufs)
331{
332 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
334 void *q = blkdev->qs[qid];
335
336 if (unlikely(!q))
337 return 0;
338
339 deq_fn = dao_virtio_blk_deq_fns[blkdev->deq_fn_id];
340
341 return (*deq_fn)(q, mbufs, nb_mbufs);
342}
343
358static __rte_always_inline uint16_t
359dao_virtio_blk_dequeue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs,
360 uint16_t nb_bufs)
361{
362 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
364 void *q = blkdev->qs[qid];
365
366 if (unlikely(!q))
367 return 0;
368
369 deq_fn = dao_virtio_blk_deq_ext_fns[blkdev->deq_fn_id];
370
371 return (*deq_fn)(q, vbufs, nb_bufs);
372}
373
374#endif /* __INCLUDE_DAO_VIRTIO_BLK_H__ */
#define DAO_VIRTIO_MAX_QUEUES
Definition dao_virtio.h:21
struct dao_virtio_blkdev dao_virtio_blkdevs[]
void dao_virtio_blkdev_cb_register(struct dao_virtio_blkdev_cbs *cbs)
uint16_t(* dao_virtio_blk_deq_fn_t)(void *q, void **mbufs, uint16_t nb_mbufs)
static __rte_always_inline uint16_t dao_virtio_blk_dequeue_burst(uint16_t devid, uint16_t qid, void **mbufs, uint16_t nb_mbufs)
struct dao_virtio_blkdev dao_virtio_blkdev_t
dao_virtio_blk_desc_manage_fn_t dao_blk_desc_manage_fns[]
int(* dao_virtio_blkdev_mq_cfg_t)(uint16_t devid, bool qmap_set)
uint16_t(* dao_virtio_blk_process_compl_fn_t)(void *q, void **mbufs, uint16_t nb_compl)
dao_virtio_blk_process_compl_ext_fn_t dao_virtio_blk_process_compl_ext_fns[]
void dao_virtio_blkdev_cb_unregister(void)
uint16_t(* dao_virtio_blk_process_compl_ext_fn_t)(void *q, void **vbufs, uint16_t nb_compl)
dao_virtio_blk_deq_fn_t dao_virtio_blk_deq_fns[]
static __rte_always_inline uint16_t dao_virtio_blk_dequeue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_bufs)
int(* dao_virtio_blkdev_extbuf_put)(uint16_t devid, void *buffs[], uint16_t nb_buffs)
int(* dao_virtio_blkdev_extbuf_get)(uint16_t devid, void *buffs[], uint16_t nb_buffs)
int dao_virtio_blkdev_queue_count_max(uint16_t pem_devid, uint16_t devid)
uint64_t dao_virtio_blkdev_feature_bits_get(uint16_t devid)
dao_virtio_blk_deq_ext_fn_t dao_virtio_blk_deq_ext_fns[]
static __rte_always_inline uint16_t dao_virtio_blk_process_compl_ext(uint16_t devid, uint16_t qid, void **vbufs, uint16_t nb_compl)
dao_virtio_blk_process_compl_fn_t dao_virtio_blk_process_compl_fns[]
static __rte_always_inline int dao_virtio_blk_io_desc_manage(uint16_t devid, uint16_t q_count)
int(* dao_virtio_blk_desc_manage_fn_t)(uint16_t devid, uint16_t qp_count)
dao_virtio_blk_desc_manage_ext_fn_t dao_blk_desc_manage_ext_fns[]
static __rte_always_inline uint16_t dao_virtio_blk_process_compl(uint16_t devid, uint16_t qid, void **mbufs, uint16_t nb_compl)
int(* dao_virtio_blkdev_status_cb_t)(uint16_t devid, uint8_t status)
int dao_virtio_blkdev_init(uint16_t devid, struct dao_virtio_blkdev_conf *conf)
uint16_t(* dao_virtio_blk_deq_ext_fn_t)(void *q, void **vbufs, uint16_t nb_bufs)
int dao_virtio_blkdev_fini(uint16_t devid)
int dao_virtio_blkdev_queue_count(uint16_t devid)
dao_virtio_blk_req_status_t
@ DAO_VIRTIO_BLK_REQ_IN_PROGRESS
@ DAO_VIRTIO_BLK_REQ_COMPLETE
int(* dao_virtio_blk_desc_manage_ext_fn_t)(uint16_t devid, uint16_t qp_count)
struct dao_virtio_blk_hdr * next
dao_virtio_blkdev_extbuf_put extbuf_put
dao_virtio_blkdev_status_cb_t status_cb
dao_virtio_blkdev_extbuf_get extbuf_get
struct rte_mempool * pool
void *qs[DAO_VIRTIO_MAX_QUEUES] __rte_cache_aligned