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 #ifdef __cplusplus 9 extern "C" { 10 #endif 11 12 #include <stdbool.h> 13 14 #include <rte_compat.h> 15 16 #include "rte_vhost.h" 17 #include "rte_vdpa.h" 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 }; 96 97 /** 98 * Register a vdpa device 99 * 100 * @param rte_dev 101 * the generic device pointer 102 * @param ops 103 * the vdpa device operations 104 * @return 105 * vDPA device pointer on success, NULL on failure 106 */ 107 __rte_internal 108 struct rte_vdpa_device * 109 rte_vdpa_register_device(struct rte_device *rte_dev, 110 struct rte_vdpa_dev_ops *ops); 111 112 /** 113 * Unregister a vdpa device 114 * 115 * @param dev 116 * vDPA device pointer 117 * @return 118 * device id on success, -1 on failure 119 */ 120 __rte_internal 121 int 122 rte_vdpa_unregister_device(struct rte_vdpa_device *dev); 123 124 /** 125 * Enable/Disable host notifier mapping for a vdpa port. 126 * 127 * @param vid 128 * vhost device id 129 * @param enable 130 * true for host notifier map, false for host notifier unmap 131 * @param qid 132 * vhost queue id, RTE_VHOST_QUEUE_ALL to configure all the device queues 133 * @return 134 * 0 on success, -1 on failure 135 */ 136 __rte_internal 137 int 138 rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable); 139 140 /** 141 * Synchronize the used ring from mediated ring to guest, log dirty 142 * page for each writeable buffer, caller should handle the used 143 * ring logging before device stop. 144 * 145 * @param vid 146 * vhost device id 147 * @param qid 148 * vhost queue id 149 * @param vring_m 150 * mediated virtio ring pointer 151 * @return 152 * number of synced used entries on success, -1 on failure 153 */ 154 __rte_internal 155 int 156 rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m); 157 158 #ifdef __cplusplus 159 } 160 #endif 161 162 #endif /* _VDPA_DRIVER_H_ */ 163