virtio: add packet buffering on tx
[vpp.git] / src / vnet / devices / virtio / pci.h
1 /*
2  * Copyright (c) 2018 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 #ifndef __included_virtio_pci_h__
17 #define __included_virtio_pci_h__
18
19 /* VirtIO ABI version, this must match exactly. */
20 #define VIRTIO_PCI_ABI_VERSION 0
21
22 /* VirtIO device IDs. */
23 #define VIRTIO_ID_NETWORK  0x01
24
25 /*
26  * Vector value used to disable MSI for queue.
27  * define in include/linux/virtio_pci.h
28  */
29 #define VIRTIO_MSI_NO_VECTOR 0xFFFF
30
31 /* The bit of the ISR which indicates a device has an interrupt. */
32 #define VIRTIO_PCI_ISR_INTR   0x1
33 /* The bit of the ISR which indicates a device configuration change. */
34 #define VIRTIO_PCI_ISR_CONFIG 0x2
35
36 /* Status byte for guest to report progress. */
37 #define foreach_virtio_config_status_flags      \
38   _ (VIRTIO_CONFIG_STATUS_RESET, 0x00)          \
39   _ (VIRTIO_CONFIG_STATUS_ACK, 0x01)            \
40   _ (VIRTIO_CONFIG_STATUS_DRIVER, 0x02)         \
41   _ (VIRTIO_CONFIG_STATUS_DRIVER_OK, 0x04)      \
42   _ (VIRTIO_CONFIG_STATUS_FEATURES_OK, 0x08)    \
43   _ (VIRTIO_CONFIG_STATUS_DEVICE_NEEDS_RESET, 0x40) \
44   _ (VIRTIO_CONFIG_STATUS_FAILED, 0x80)
45
46 typedef enum
47 {
48 #define _(a, b) a = b,
49   foreach_virtio_config_status_flags
50 #undef _
51 } virtio_config_status_flags_t;
52
53
54 #define VIRTIO_NET_S_LINK_UP    1       /* Link is up */
55 #define VIRTIO_NET_S_ANNOUNCE   2       /* Announcement is needed */
56
57 #define VIRTIO_NET_OK     0
58 #define VIRTIO_NET_ERR    1
59
60 /* If multiqueue is provided by host, then we support it. */
61 #define VIRTIO_NET_CTRL_MQ   4
62 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET        0
63 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MIN        1
64 #define VIRTIO_NET_CTRL_MQ_VQ_PAIRS_MAX        0x8000
65
66 /*
67  * Control network offloads
68  * Reconfigures the network offloads that Guest can handle.
69  * Available with the VIRTIO_NET_F_CTRL_GUEST_OFFLOADS feature bit.
70  * Command data format matches the feature bit mask exactly.
71  * See VIRTIO_NET_F_GUEST_* for the list of offloads
72  * that can be enabled/disabled.
73  */
74 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS 5
75 #define VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET 0
76
77 /* Common configuration */
78 #define VIRTIO_PCI_CAP_COMMON_CFG       1
79 /* Notifications */
80 #define VIRTIO_PCI_CAP_NOTIFY_CFG       2
81 /* ISR Status */
82 #define VIRTIO_PCI_CAP_ISR_CFG          3
83 /* Device specific configuration */
84 #define VIRTIO_PCI_CAP_DEVICE_CFG       4
85 /* PCI configuration access */
86 #define VIRTIO_PCI_CAP_PCI_CFG          5
87
88 #define VIRTIO_PCI_QUEUE_ADDR_SHIFT 12
89
90 #define VIRTIO_PCI_VRING_ALIGN 4096
91
92 typedef enum
93 {
94   VIRTIO_MSIX_NONE = 0,
95   VIRTIO_MSIX_DISABLED = 1,
96   VIRTIO_MSIX_ENABLED = 2
97 } virtio_msix_status_t;
98
99 /* This is the PCI capability header: */
100 typedef struct
101 {
102   u8 cap_vndr;                  /* Generic PCI field: PCI_CAP_ID_VNDR */
103   u8 cap_next;                  /* Generic PCI field: next ptr. */
104   u8 cap_len;                   /* Generic PCI field: capability length */
105   u8 cfg_type;                  /* Identifies the structure. */
106   u8 bar;                       /* Where to find it. */
107   u8 padding[3];                /* Pad to full dword. */
108   u32 offset;                   /* Offset within bar. */
109   u32 length;                   /* Length of the structure, in bytes. */
110 } virtio_pci_cap_t;
111
112 typedef struct
113 {
114   virtio_pci_cap_t cap;
115   u32 notify_off_multiplier;    /* Multiplier for queue_notify_off. */
116 } virtio_pci_notify_cap_t;
117
118 /* Fields in VIRTIO_PCI_CAP_COMMON_CFG: */
119 typedef struct
120 {
121   /* About the whole device. */
122   u32 device_feature_select;    /* read-write */
123   u32 device_feature;           /* read-only */
124   u32 driver_feature_select;    /* read-write */
125   u32 driver_feature;           /* read-write */
126   u16 msix_config;              /* read-write */
127   u16 num_queues;               /* read-only */
128   u8 device_status;             /* read-write */
129   u8 config_generation;         /* read-only */
130
131   /* About a specific virtqueue. */
132   u16 queue_select;             /* read-write */
133   u16 queue_size;               /* read-write, power of 2. */
134   u16 queue_msix_vector;        /* read-write */
135   u16 queue_enable;             /* read-write */
136   u16 queue_notify_off;         /* read-only */
137   u64 queue_desc;               /* read-write */
138   u64 queue_driver;             /* read-write */
139   u64 queue_device;             /* read-write */
140 } virtio_pci_common_cfg_t;
141
142 typedef struct
143 {
144   u8 mac[6];
145   u16 status;
146   u16 max_virtqueue_pairs;
147   u16 mtu;
148 } virtio_net_config_t;
149
150 /*
151  * Control virtqueue data structures
152  *
153  * The control virtqueue expects a header in the first sg entry
154  * and an ack/status response in the last entry.  Data for the
155  * command goes in between.
156  */
157 /* *INDENT-OFF* */
158 typedef CLIB_PACKED (struct
159 {
160   u8 class;
161   u8 cmd;
162 }) virtio_net_ctrl_hdr_t;
163 /* *INDENT-ON* */
164
165 typedef u8 virtio_net_ctrl_ack_t;
166
167 typedef struct
168 {
169   virtio_net_ctrl_hdr_t ctrl;
170   virtio_net_ctrl_ack_t status;
171   u8 data[1024];
172 } virtio_ctrl_msg_t;
173
174 typedef struct _virtio_pci_func
175 {
176   void (*read_config) (vlib_main_t * vm, virtio_if_t * vif, void *dst,
177                        int len, u32 addr);
178   void (*write_config) (vlib_main_t * vm, virtio_if_t * vif, void *src,
179                         int len, u32 addr);
180
181     u64 (*get_device_features) (vlib_main_t * vm, virtio_if_t * vif);
182     u64 (*get_driver_features) (vlib_main_t * vm, virtio_if_t * vif);
183   void (*set_driver_features) (vlib_main_t * vm, virtio_if_t * vif,
184                                u64 features);
185
186     u8 (*get_status) (vlib_main_t * vm, virtio_if_t * vif);
187   void (*set_status) (vlib_main_t * vm, virtio_if_t * vif, u8 status);
188     u8 (*device_reset) (vlib_main_t * vm, virtio_if_t * vif);
189
190     u8 (*get_isr) (vlib_main_t * vm, virtio_if_t * vif);
191
192     u16 (*get_queue_size) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
193   void (*set_queue_size) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id,
194                           u16 queue_size);
195     u8 (*setup_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id,
196                        void *p);
197   void (*del_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
198   void (*notify_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id);
199
200     u16 (*set_config_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec);
201     u16 (*set_queue_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec,
202                           u16 queue_id);
203
204   void (*get_mac) (vlib_main_t * vm, virtio_if_t * vif);
205   void (*set_mac) (vlib_main_t * vm, virtio_if_t * vif);
206     u16 (*get_device_status) (vlib_main_t * vm, virtio_if_t * vif);
207     u16 (*get_max_queue_pairs) (vlib_main_t * vm, virtio_if_t * vif);
208     u16 (*get_mtu) (vlib_main_t * vm, virtio_if_t * vif);
209   void (*device_debug_config_space) (vlib_main_t * vm, virtio_if_t * vif);
210 } virtio_pci_func_t;
211
212 #define foreach_virtio_flags  \
213   _ (GSO, 0)                  \
214   _ (CSUM_OFFLOAD, 1)         \
215   _ (GRO_COALESCE, 2)         \
216   _ (PACKED, 3)               \
217   _ (IN_ORDER, 4)             \
218   _ (BUFFERING, 5)
219
220 typedef enum
221 {
222 #define _(a, b) VIRTIO_FLAG_##a = (1 << b),
223   foreach_virtio_flags
224 #undef _
225 } virtio_flag_t;
226
227 typedef struct
228 {
229   u32 addr;
230   /* return */
231   i32 rv;
232   u32 sw_if_index;
233   u8 mac_addr_set;
234   u8 mac_addr[6];
235   u64 features;
236   u8 gso_enabled;
237   u8 checksum_offload_enabled;
238   u32 buffering_size;
239   u32 virtio_flags;
240   clib_error_t *error;
241 } virtio_pci_create_if_args_t;
242
243 extern const virtio_pci_func_t virtio_pci_legacy_func;
244 extern const virtio_pci_func_t virtio_pci_modern_func;
245
246 extern void device_status (vlib_main_t * vm, virtio_if_t * vif);
247 void virtio_pci_create_if (vlib_main_t * vm,
248                            virtio_pci_create_if_args_t * args);
249 int virtio_pci_delete_if (vlib_main_t * vm, virtio_if_t * ad);
250 int virtio_pci_enable_disable_offloads (vlib_main_t * vm, virtio_if_t * vif,
251                                         int gso_enabled,
252                                         int checksum_offload_enabled,
253                                         int offloads_disabled);
254 #endif /* __included_virtio_pci_h__ */
255 /*
256  * fd.io coding-style-patch-verification: ON
257  *
258  * Local Variables:
259  * eval: (c-set-style "gnu")
260  * End:
261  */