xref: /dpdk/lib/vhost/vdpa_driver.h (revision 719834a6849e1daf4a70ff7742bbcc3ae7e25607)
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