FD.io VPP  v20.09-64-g4f7b92f0a
Vector Packet Processing
pci.h
Go to the documentation of this file.
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,
50 #undef _
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 {
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. */
111 
112 typedef struct
113 {
115  u32 notify_off_multiplier; /* Multiplier for queue_notify_off. */
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 */
141 
142 typedef struct
143 {
144  u8 mac[6];
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 
166 
167 typedef struct
168 {
169  virtio_net_ctrl_hdr_t ctrl;
170  virtio_net_ctrl_ack_t status;
171  u8 data[1024];
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  u16 (*get_queue_notify_off) (vlib_main_t * vm, virtio_if_t * vif,
199  u16 queue_id);
200  void (*notify_queue) (vlib_main_t * vm, virtio_if_t * vif, u16 queue_id,
201  u16 queue_notify_offset);
202 
203  u16 (*set_config_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec);
204  u16 (*set_queue_irq) (vlib_main_t * vm, virtio_if_t * vif, u16 vec,
205  u16 queue_id);
206 
207  void (*get_mac) (vlib_main_t * vm, virtio_if_t * vif);
208  void (*set_mac) (vlib_main_t * vm, virtio_if_t * vif);
209  u16 (*get_device_status) (vlib_main_t * vm, virtio_if_t * vif);
210  u16 (*get_max_queue_pairs) (vlib_main_t * vm, virtio_if_t * vif);
211  u16 (*get_mtu) (vlib_main_t * vm, virtio_if_t * vif);
212  void (*device_debug_config_space) (vlib_main_t * vm, virtio_if_t * vif);
214 
215 #define foreach_virtio_flags \
216  _ (GSO, 0) \
217  _ (CSUM_OFFLOAD, 1) \
218  _ (GRO_COALESCE, 2) \
219  _ (PACKED, 3) \
220  _ (IN_ORDER, 4)
221 
222 typedef enum
223 {
224 #define _(a, b) VIRTIO_FLAG_##a = (1 << b),
226 #undef _
227 } virtio_flag_t;
228 
229 typedef struct
230 {
232  /* return */
243 
244 extern const virtio_pci_func_t virtio_pci_legacy_func;
245 extern const virtio_pci_func_t virtio_pci_modern_func;
246 
247 extern void device_status (vlib_main_t * vm, virtio_if_t * vif);
252  int gso_enabled,
253  int checksum_offload_enabled,
254  int offloads_disabled);
255 #endif /* __included_virtio_pci_h__ */
256 /*
257  * fd.io coding-style-patch-verification: ON
258  *
259  * Local Variables:
260  * eval: (c-set-style "gnu")
261  * End:
262  */
int virtio_pci_enable_disable_offloads(vlib_main_t *vm, virtio_if_t *vif, int gso_enabled, int checksum_offload_enabled, int offloads_disabled)
Definition: pci.c:1294
vl_api_mac_address_t mac
Definition: l2.api:502
u16 max_virtqueue_pairs
Definition: pci.h:146
unsigned long u64
Definition: types.h:89
int virtio_pci_delete_if(vlib_main_t *vm, virtio_if_t *ad)
Definition: pci.c:1210
vl_api_address_t src
Definition: gre.api:54
vlib_main_t * vm
Definition: in2out_ed.c:1582
void device_status(vlib_main_t *vm, virtio_if_t *vif)
Definition: pci.c:170
vhost_vring_addr_t addr
Definition: vhost_user.h:111
unsigned char u8
Definition: types.h:56
u32 notify_off_multiplier
Definition: pci.h:115
u8 data[128]
Definition: ipsec_types.api:89
u32 offset
Definition: pci.h:108
const virtio_pci_func_t virtio_pci_legacy_func
#define foreach_virtio_config_status_flags
Definition: pci.h:37
unsigned int u32
Definition: types.h:88
u32 padding
Definition: vhost_user.h:105
u32 driver_feature_select
Definition: pci.h:124
#define foreach_virtio_flags
Definition: pci.h:215
unsigned short u16
Definition: types.h:57
vl_api_address_t dst
Definition: gre.api:55
virtio_net_ctrl_hdr_t ctrl
Definition: pci.h:169
u8 len
Definition: ip_types.api:92
u32 length
Definition: pci.h:109
typedef CLIB_PACKED(struct { u8 class;u8 cmd;}) virtio_net_ctrl_hdr_t
virtio_config_status_flags_t
Definition: pci.h:46
signed int i32
Definition: types.h:77
virtio_pci_cap_t cap
Definition: pci.h:114
virtio_flag_t
Definition: pci.h:222
const virtio_pci_func_t virtio_pci_modern_func
clib_error_t * error
Definition: pci.h:241
virtio_net_ctrl_ack_t status
Definition: pci.h:170
u32 device_feature_select
Definition: pci.h:122
struct _virtio_pci_func virtio_pci_func_t
vl_api_mac_address_t mac_addr
Definition: l2.api:180
u8 virtio_net_ctrl_ack_t
Definition: pci.h:165
virtio_msix_status_t
Definition: pci.h:92
void virtio_pci_create_if(vlib_main_t *vm, virtio_pci_create_if_args_t *args)
Definition: pci.c:1009