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
57 uint64_t desc_data[2];
59 uint8_t *status;
61 uint32_t tot_len;
63 uint32_t tot_segs;
65 uint32_t tot_bufs;
67 uint8_t hdr_data[];
68} __rte_packed;
69
71typedef struct dao_virtio_blkdev {
75 uint16_t deq_fn_id;
77 uint16_t compl_fn_id;
79 uint16_t mgmt_fn_id;
80
81#define DAO_VIRTIO_BLKDEV_MEM_SZ 8192
82 uint8_t reserved[DAO_VIRTIO_BLKDEV_MEM_SZ];
84
92
95
96/* Fast path data */
98typedef uint16_t (*dao_virtio_blk_deq_fn_t)(void *q, void **mbufs,
99 uint16_t nb_mbufs);
101typedef uint16_t (*dao_virtio_blk_deq_ext_fn_t)(void *q, void **vbufs,
102 uint16_t nb_bufs);
104typedef uint16_t (*dao_virtio_blk_process_compl_fn_t)(void *q,
105 void **mbufs, uint16_t nb_compl);
107typedef uint16_t (*dao_virtio_blk_process_compl_ext_fn_t)(void *q, void **vbufs,
108 uint16_t nb_compl);
110typedef int (*dao_virtio_blk_desc_manage_fn_t)(uint16_t devid, uint16_t qp_count);
112typedef int (*dao_virtio_blk_desc_manage_ext_fn_t)(uint16_t devid, uint16_t qp_count);
113
126
128typedef int (*dao_virtio_blkdev_status_cb_t)(uint16_t devid, uint8_t status);
130typedef int (*dao_virtio_blkdev_mq_cfg_t)(uint16_t devid, bool qmap_set);
132typedef int (*dao_virtio_blkdev_extbuf_get)(uint16_t devid, void *buffs[],
133 uint16_t nb_buffs);
135typedef int (*dao_virtio_blkdev_extbuf_put)(uint16_t devid, void *buffs[],
136 uint16_t nb_buffs);
137
147
148/* End of structure dao_virtio_blkdev_cbs. */
149
160int dao_virtio_blkdev_init(uint16_t devid, struct dao_virtio_blkdev_conf *conf);
161
171int dao_virtio_blkdev_fini(uint16_t devid);
172
180
185
195
204uint64_t dao_virtio_blkdev_feature_bits_get(uint16_t devid);
205
218int dao_virtio_blkdev_queue_count_max(uint16_t pem_devid, uint16_t devid);
219
233static __rte_always_inline int
234dao_virtio_blk_io_desc_manage(uint16_t devid, uint16_t q_count)
235{
236 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
238
239 mgmt_fn = dao_blk_desc_manage_fns[blkdev->mgmt_fn_id];
240
241 return (*mgmt_fn)(devid, q_count);
242}
243
258static __rte_always_inline uint16_t
259dao_virtio_blk_process_compl(uint16_t devid, uint16_t qid,
260 void **mbufs, uint16_t nb_compl)
261{
262 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
264 void *q = blkdev->qs[qid];
265
266 if (unlikely(!q))
267 return 0;
268
270
271 return (*compl_fn)(q, mbufs, nb_compl);
272}
273
288static __rte_always_inline uint16_t
289dao_virtio_blk_process_compl_ext(uint16_t devid, uint16_t qid, void **vbufs,
290 uint16_t nb_compl)
291{
292 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
294 void *q = blkdev->qs[qid];
295
296 if (unlikely(!q))
297 return 0;
298
300
301 return (*compl_fn)(q, vbufs, nb_compl);
302}
303
318static __rte_always_inline uint16_t
319dao_virtio_blk_dequeue_burst(uint16_t devid, uint16_t qid,
320 void **mbufs, uint16_t nb_mbufs)
321{
322 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
324 void *q = blkdev->qs[qid];
325
326 if (unlikely(!q))
327 return 0;
328
329 deq_fn = dao_virtio_blk_deq_fns[blkdev->deq_fn_id];
330
331 return (*deq_fn)(q, mbufs, nb_mbufs);
332}
333
348static __rte_always_inline uint16_t
349dao_virtio_blk_dequeue_burst_ext(uint16_t devid, uint16_t qid, void **vbufs,
350 uint16_t nb_bufs)
351{
352 struct dao_virtio_blkdev *blkdev = &dao_virtio_blkdevs[devid];
354 void *q = blkdev->qs[qid];
355
356 if (unlikely(!q))
357 return 0;
358
359 deq_fn = dao_virtio_blk_deq_ext_fns[blkdev->deq_fn_id];
360
361 return (*deq_fn)(q, vbufs, nb_bufs);
362}
363
364#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)
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