xref: /dpdk/examples/vhost_blk/vhost_blk.h (revision 7e06c0de1952d3109a5b0c4779d7e7d8059c9d78)
1c19beb3fSJin Yu /* SPDX-License-Identifier: BSD-3-Clause
2c19beb3fSJin Yu  * Copyright(c) 2010-2017 Intel Corporation
3c19beb3fSJin Yu  */
4c19beb3fSJin Yu 
5c19beb3fSJin Yu #ifndef _VHOST_BLK_H_
6c19beb3fSJin Yu #define _VHOST_BLK_H_
7c19beb3fSJin Yu 
8c19beb3fSJin Yu #include <stdio.h>
9c19beb3fSJin Yu #include <sys/uio.h>
10c19beb3fSJin Yu #include <stdint.h>
11c19beb3fSJin Yu #include <stdbool.h>
12c19beb3fSJin Yu #include <linux/virtio_blk.h>
13c19beb3fSJin Yu #include <linux/virtio_ring.h>
14c19beb3fSJin Yu 
15c19beb3fSJin Yu #include <rte_vhost.h>
16c19beb3fSJin Yu 
17c19beb3fSJin Yu #ifndef VIRTIO_F_RING_PACKED
18c19beb3fSJin Yu #define VIRTIO_F_RING_PACKED 34
19c19beb3fSJin Yu 
20c19beb3fSJin Yu struct vring_packed_desc {
21c19beb3fSJin Yu 	/* Buffer Address. */
22c19beb3fSJin Yu 	__le64 addr;
23c19beb3fSJin Yu 	/* Buffer Length. */
24c19beb3fSJin Yu 	__le32 len;
25c19beb3fSJin Yu 	/* Buffer ID. */
26c19beb3fSJin Yu 	__le16 id;
27c19beb3fSJin Yu 	/* The flags depending on descriptor type. */
28c19beb3fSJin Yu 	__le16 flags;
29c19beb3fSJin Yu };
30c19beb3fSJin Yu #endif
31c19beb3fSJin Yu 
32c19beb3fSJin Yu struct vhost_blk_queue {
3391d3e2d4SJin Yu 	struct rte_vhost_vring vring;
3491d3e2d4SJin Yu 	struct rte_vhost_ring_inflight inflight_ring;
3591d3e2d4SJin Yu 
36c19beb3fSJin Yu 	uint16_t last_avail_idx;
37c19beb3fSJin Yu 	uint16_t last_used_idx;
3891d3e2d4SJin Yu 	uint16_t id;
3991d3e2d4SJin Yu 
40c19beb3fSJin Yu 	bool avail_wrap_counter;
41c19beb3fSJin Yu 	bool used_wrap_counter;
4291d3e2d4SJin Yu 	bool packed_ring;
4391d3e2d4SJin Yu 
4491d3e2d4SJin Yu 	struct vhost_blk_task *tasks;
45c19beb3fSJin Yu };
46c19beb3fSJin Yu 
47c19beb3fSJin Yu #define NUM_OF_BLK_QUEUES 1
48c19beb3fSJin Yu 
49c19beb3fSJin Yu struct vhost_block_dev {
50c19beb3fSJin Yu 	/** Unique name for this block device. */
51c19beb3fSJin Yu 	char name[64];
52c19beb3fSJin Yu 
53c19beb3fSJin Yu 	/** Unique product name for this kind of block device. */
54c19beb3fSJin Yu 	char product_name[256];
55c19beb3fSJin Yu 
56c19beb3fSJin Yu 	/** Size in bytes of a logical block for the backend */
57c19beb3fSJin Yu 	uint32_t blocklen;
58c19beb3fSJin Yu 
59c19beb3fSJin Yu 	/** Number of blocks */
60c19beb3fSJin Yu 	uint64_t blockcnt;
61c19beb3fSJin Yu 
62c19beb3fSJin Yu 	/** write cache enabled, not used at the moment */
63c19beb3fSJin Yu 	int write_cache;
64c19beb3fSJin Yu 
65c19beb3fSJin Yu 	/** use memory as disk storage space */
66c19beb3fSJin Yu 	uint8_t *data;
67c19beb3fSJin Yu };
68c19beb3fSJin Yu 
69*7e06c0deSTyler Retzlaff struct __rte_cache_aligned vhost_blk_ctrlr {
70c19beb3fSJin Yu 	uint8_t started;
7191d3e2d4SJin Yu 	/** ID for vhost library. */
7291d3e2d4SJin Yu 	int vid;
7391d3e2d4SJin Yu 	/** Queues for the block device */
7491d3e2d4SJin Yu 	struct vhost_blk_queue queues[NUM_OF_BLK_QUEUES];
75c19beb3fSJin Yu 	/** Only support 1 LUN for the example */
76c19beb3fSJin Yu 	struct vhost_block_dev *bdev;
77c19beb3fSJin Yu 	/** VM memory region */
78c19beb3fSJin Yu 	struct rte_vhost_memory *mem;
79*7e06c0deSTyler Retzlaff };
80c19beb3fSJin Yu 
81c19beb3fSJin Yu #define VHOST_BLK_MAX_IOVS 128
82c19beb3fSJin Yu 
83c19beb3fSJin Yu enum blk_data_dir {
84c19beb3fSJin Yu 	BLK_DIR_NONE = 0,
85c19beb3fSJin Yu 	BLK_DIR_TO_DEV = 1,
86c19beb3fSJin Yu 	BLK_DIR_FROM_DEV = 2,
87c19beb3fSJin Yu };
88c19beb3fSJin Yu 
89c19beb3fSJin Yu struct vhost_blk_task {
90c19beb3fSJin Yu 	uint8_t req_idx;
9191d3e2d4SJin Yu 	uint16_t chain_num;
92c19beb3fSJin Yu 	uint16_t inflight_idx;
93c19beb3fSJin Yu 	uint16_t buffer_id;
94c19beb3fSJin Yu 	uint32_t dxfer_dir;
95c19beb3fSJin Yu 	uint32_t data_len;
9691d3e2d4SJin Yu 
97c19beb3fSJin Yu 	struct virtio_blk_outhdr *req;
98c19beb3fSJin Yu 	volatile uint8_t *status;
99c19beb3fSJin Yu 	struct iovec iovs[VHOST_BLK_MAX_IOVS];
100c19beb3fSJin Yu 	uint32_t iovs_cnt;
101c19beb3fSJin Yu 
10291d3e2d4SJin Yu 	struct vhost_blk_queue *vq;
10391d3e2d4SJin Yu 	struct vhost_blk_ctrlr *ctrlr;
104c19beb3fSJin Yu };
105c19beb3fSJin Yu 
106be848992STimothy Redaelli extern struct vhost_blk_ctrlr *g_vhost_ctrlr;
107ab4bb424SMaxime Coquelin extern struct rte_vhost_device_ops vhost_blk_device_ops;
108c19beb3fSJin Yu 
109c19beb3fSJin Yu int vhost_bdev_process_blk_commands(struct vhost_block_dev *bdev,
110c19beb3fSJin Yu 				     struct vhost_blk_task *task);
111c19beb3fSJin Yu 
112c19beb3fSJin Yu void vhost_session_install_rte_compat_hooks(uint32_t vid);
113c19beb3fSJin Yu 
114c19beb3fSJin Yu void vhost_dev_install_rte_compat_hooks(const char *path);
115c19beb3fSJin Yu 
116c19beb3fSJin Yu struct vhost_blk_ctrlr *vhost_blk_ctrlr_find(const char *ctrlr_name);
117c19beb3fSJin Yu 
118c19beb3fSJin Yu #endif /* _VHOST_blk_H_ */
119