1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2018 Intel Corporation 3 */ 4 5 #ifndef _VDPA_DRIVER_H_ 6 #define _VDPA_DRIVER_H_ 7 8 #include <stdbool.h> 9 10 #include <rte_compat.h> 11 12 #include "rte_vhost.h" 13 #include "rte_vdpa.h" 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 #define RTE_VHOST_QUEUE_ALL UINT16_MAX 20 21 /** 22 * vdpa device operations 23 */ 24 struct rte_vdpa_dev_ops { 25 /** Get capabilities of this device (Mandatory) */ 26 int (*get_queue_num)(struct rte_vdpa_device *dev, uint32_t *queue_num); 27 28 /** Get supported features of this device (Mandatory) */ 29 int (*get_features)(struct rte_vdpa_device *dev, uint64_t *features); 30 31 /** Get supported protocol features of this device (Mandatory) */ 32 int (*get_protocol_features)(struct rte_vdpa_device *dev, 33 uint64_t *protocol_features); 34 35 /** Driver configure the device (Mandatory) */ 36 int (*dev_conf)(int vid); 37 38 /** Driver close the device (Mandatory) */ 39 int (*dev_close)(int vid); 40 41 /** Connection closed, clean up resources */ 42 int (*dev_cleanup)(int vid); 43 44 /** Enable/disable this vring (Mandatory) */ 45 int (*set_vring_state)(int vid, int vring, int state); 46 47 /** Set features when changed (Mandatory) */ 48 int (*set_features)(int vid); 49 50 /** Destination operations when migration done */ 51 int (*migration_done)(int vid); 52 53 /** Get the vfio group fd */ 54 int (*get_vfio_group_fd)(int vid); 55 56 /** Get the vfio device fd */ 57 int (*get_vfio_device_fd)(int vid); 58 59 /** Get the notify area info of the queue */ 60 int (*get_notify_area)(int vid, int qid, 61 uint64_t *offset, uint64_t *size); 62 63 /** Get statistics name */ 64 int (*get_stats_names)(struct rte_vdpa_device *dev, 65 struct rte_vdpa_stat_name *stats_names, 66 unsigned int size); 67 68 /** Get statistics of the queue */ 69 int (*get_stats)(struct rte_vdpa_device *dev, int qid, 70 struct rte_vdpa_stat *stats, unsigned int n); 71 72 /** Reset statistics of the queue */ 73 int (*reset_stats)(struct rte_vdpa_device *dev, int qid); 74 75 /** Get the device configuration space */ 76 int (*get_config)(int vid, uint8_t *config, uint32_t size); 77 78 /** Set the device configuration space */ 79 int (*set_config)(int vid, uint8_t *config, uint32_t offset, 80 uint32_t size, uint32_t flags); 81 82 /** get device type: net device, blk device... */ 83 int (*get_dev_type)(struct rte_vdpa_device *dev, uint32_t *type); 84 }; 85 86 /** 87 * vdpa device structure includes device address and device operations. 88 */ 89 struct rte_vdpa_device { 90 RTE_TAILQ_ENTRY(rte_vdpa_device) next; 91 /** Generic device information */ 92 struct rte_device *device; 93 /** vdpa device operations */ 94 struct rte_vdpa_dev_ops *ops; 95 /** vdpa device type: net, blk... */ 96 uint32_t type; 97 }; 98 99 /** 100 * Register a vdpa device 101 * 102 * @param rte_dev 103 * the generic device pointer 104 * @param ops 105 * the vdpa device operations 106 * @return 107 * vDPA device pointer on success, NULL on failure 108 */ 109 __rte_internal 110 struct rte_vdpa_device * 111 rte_vdpa_register_device(struct rte_device *rte_dev, 112 struct rte_vdpa_dev_ops *ops); 113 114 /** 115 * Unregister a vdpa device 116 * 117 * @param dev 118 * vDPA device pointer 119 * @return 120 * device id on success, -1 on failure 121 */ 122 __rte_internal 123 int 124 rte_vdpa_unregister_device(struct rte_vdpa_device *dev); 125 126 /** 127 * Enable/Disable host notifier mapping for a vdpa port. 128 * 129 * @param vid 130 * vhost device id 131 * @param enable 132 * true for host notifier map, false for host notifier unmap 133 * @param qid 134 * vhost queue id, RTE_VHOST_QUEUE_ALL to configure all the device queues 135 * @return 136 * 0 on success, -1 on failure 137 */ 138 __rte_internal 139 int 140 rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable); 141 142 /** 143 * Synchronize the used ring from mediated ring to guest, log dirty 144 * page for each writeable buffer, caller should handle the used 145 * ring logging before device stop. 146 * 147 * @param vid 148 * vhost device id 149 * @param qid 150 * vhost queue id 151 * @param vring_m 152 * mediated virtio ring pointer 153 * @return 154 * number of synced used entries on success, -1 on failure 155 */ 156 __rte_internal 157 int 158 rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m); 159 160 #ifdef __cplusplus 161 } 162 #endif 163 164 #endif /* _VDPA_DRIVER_H_ */ 165