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