vhost: add vDPA operations for block device
[dpdk.git] / lib / vhost / vdpa_driver.h
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
83 /**
84  * vdpa device structure includes device address and device operations.
85  */
86 struct rte_vdpa_device {
87         RTE_TAILQ_ENTRY(rte_vdpa_device) next;
88         /** Generic device information */
89         struct rte_device *device;
90         /** vdpa device operations */
91         struct rte_vdpa_dev_ops *ops;
92 };
93
94 /**
95  * Register a vdpa device
96  *
97  * @param rte_dev
98  *  the generic device pointer
99  * @param ops
100  *  the vdpa device operations
101  * @return
102  *  vDPA device pointer on success, NULL on failure
103  */
104 __rte_internal
105 struct rte_vdpa_device *
106 rte_vdpa_register_device(struct rte_device *rte_dev,
107                 struct rte_vdpa_dev_ops *ops);
108
109 /**
110  * Unregister a vdpa device
111  *
112  * @param dev
113  *  vDPA device pointer
114  * @return
115  *  device id on success, -1 on failure
116  */
117 __rte_internal
118 int
119 rte_vdpa_unregister_device(struct rte_vdpa_device *dev);
120
121 /**
122  * Enable/Disable host notifier mapping for a vdpa port.
123  *
124  * @param vid
125  *  vhost device id
126  * @param enable
127  *  true for host notifier map, false for host notifier unmap
128  * @param qid
129  *  vhost queue id, RTE_VHOST_QUEUE_ALL to configure all the device queues
130  * @return
131  *  0 on success, -1 on failure
132  */
133 __rte_internal
134 int
135 rte_vhost_host_notifier_ctrl(int vid, uint16_t qid, bool enable);
136
137 /**
138  * Synchronize the used ring from mediated ring to guest, log dirty
139  * page for each writeable buffer, caller should handle the used
140  * ring logging before device stop.
141  *
142  * @param vid
143  *  vhost device id
144  * @param qid
145  *  vhost queue id
146  * @param vring_m
147  *  mediated virtio ring pointer
148  * @return
149  *  number of synced used entries on success, -1 on failure
150  */
151 __rte_internal
152 int
153 rte_vdpa_relay_vring_used(int vid, uint16_t qid, void *vring_m);
154
155 #ifdef __cplusplus
156 }
157 #endif
158
159 #endif /* _VDPA_DRIVER_H_ */