virtio: integrate with new tx infra
[vpp.git] / src / vnet / devices / virtio / pci.c
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 #include <fcntl.h>
17 #include <sys/ioctl.h>
18
19 #include <vppinfra/types.h>
20 #include <vlib/vlib.h>
21 #include <vlib/pci/pci.h>
22 #include <vnet/ethernet/ethernet.h>
23 #include <vnet/ip/ip4_packet.h>
24 #include <vnet/ip/ip6_packet.h>
25 #include <vnet/devices/virtio/virtio.h>
26 #include <vnet/devices/virtio/pci.h>
27 #include <vnet/interface/rx_queue_funcs.h>
28
29 #define PCI_VENDOR_ID_VIRTIO                            0x1af4
30 #define PCI_DEVICE_ID_VIRTIO_NIC                        0x1000
31 /* Doesn't support modern device */
32 #define PCI_DEVICE_ID_VIRTIO_NIC_MODERN                 0x1041
33
34 #define PCI_CAPABILITY_LIST     0x34
35 #define PCI_CAP_ID_VNDR         0x09
36 #define PCI_CAP_ID_MSIX         0x11
37
38 #define PCI_MSIX_ENABLE 0x8000
39
40 static pci_device_id_t virtio_pci_device_ids[] = {
41   {
42    .vendor_id = PCI_VENDOR_ID_VIRTIO,
43    .device_id = PCI_DEVICE_ID_VIRTIO_NIC},
44   {
45    .vendor_id = PCI_VENDOR_ID_VIRTIO,
46    .device_id = PCI_DEVICE_ID_VIRTIO_NIC_MODERN},
47   {0},
48 };
49
50 static u32
51 virtio_pci_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw,
52                         u32 flags)
53 {
54   return 0;
55 }
56
57 static clib_error_t *
58 virtio_pci_get_max_virtqueue_pairs (vlib_main_t * vm, virtio_if_t * vif)
59 {
60   clib_error_t *error = 0;
61   u16 max_queue_pairs = 1;
62
63   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MQ))
64     {
65       max_queue_pairs = vif->virtio_pci_func->get_max_queue_pairs (vm, vif);
66     }
67
68   virtio_log_debug (vif, "max queue pair is %x", max_queue_pairs);
69   if (max_queue_pairs < 1 || max_queue_pairs > 0x8000)
70     return clib_error_return (error, "max queue pair is %x,"
71                               " should be in range [1, 0x8000]",
72                               max_queue_pairs);
73
74   vif->max_queue_pairs = max_queue_pairs;
75   return error;
76 }
77
78 static void
79 virtio_pci_set_mac (vlib_main_t * vm, virtio_if_t * vif)
80 {
81   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MAC))
82     vif->virtio_pci_func->set_mac (vm, vif);
83 }
84
85 static u32
86 virtio_pci_get_mac (vlib_main_t * vm, virtio_if_t * vif)
87 {
88   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MAC))
89     {
90       vif->virtio_pci_func->get_mac (vm, vif);
91       return 0;
92     }
93   return 1;
94 }
95
96 static u16
97 virtio_pci_is_link_up (vlib_main_t * vm, virtio_if_t * vif)
98 {
99   /*
100    * Minimal driver: assumes link is up
101    */
102   u16 status = 1;
103   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_STATUS))
104     status = vif->virtio_pci_func->get_device_status (vm, vif);
105   return status;
106 }
107
108 static void
109 virtio_pci_irq_queue_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h,
110                               u16 line)
111 {
112   vnet_main_t *vnm = vnet_get_main ();
113   virtio_main_t *vim = &virtio_main;
114   uword pd = vlib_pci_get_private_data (vm, h);
115   virtio_if_t *vif = pool_elt_at_index (vim->interfaces, pd);
116   line--;
117   u16 qid = line;
118
119   virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, qid);
120   vnet_hw_if_rx_queue_set_int_pending (vnm, vring->queue_index);
121 }
122
123 static void
124 virtio_pci_irq_config_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h,
125                                u16 line)
126 {
127   vnet_main_t *vnm = vnet_get_main ();
128   virtio_main_t *vim = &virtio_main;
129   uword pd = vlib_pci_get_private_data (vm, h);
130   virtio_if_t *vif = pool_elt_at_index (vim->interfaces, pd);
131
132   if (virtio_pci_is_link_up (vm, vif) & VIRTIO_NET_S_LINK_UP)
133     {
134       vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
135       vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
136                                    VNET_HW_INTERFACE_FLAG_LINK_UP);
137     }
138   else
139     {
140       vif->flags &= ~VIRTIO_IF_FLAG_ADMIN_UP;
141       vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
142     }
143 }
144
145 static void
146 virtio_pci_irq_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h)
147 {
148   virtio_main_t *vim = &virtio_main;
149   uword pd = vlib_pci_get_private_data (vm, h);
150   virtio_if_t *vif = pool_elt_at_index (vim->interfaces, pd);
151   u8 isr = 0;
152   u16 line = 0;
153
154   isr = vif->virtio_pci_func->get_isr (vm, vif);
155
156   /*
157    * If the lower bit is set: look through the used rings of
158    * all virtqueues for the device, to see if any progress has
159    * been made by the device which requires servicing.
160    */
161   if (isr & VIRTIO_PCI_ISR_INTR)
162     {
163       for (; line < vif->num_rxqs; line++)
164         virtio_pci_irq_queue_handler (vm, h, (line + 1));
165     }
166
167   if (isr & VIRTIO_PCI_ISR_CONFIG)
168     virtio_pci_irq_config_handler (vm, h, line);
169 }
170
171 inline void
172 device_status (vlib_main_t * vm, virtio_if_t * vif)
173 {
174   struct status_struct
175   {
176     u8 bit;
177     char *str;
178   };
179   struct status_struct *status_entry;
180   static struct status_struct status_array[] = {
181 #define _(s,b) { .str = #s, .bit = b, },
182     foreach_virtio_config_status_flags
183 #undef _
184     {.str = NULL}
185   };
186
187   vlib_cli_output (vm, "  status 0x%x", vif->status);
188
189   status_entry = (struct status_struct *) &status_array;
190   while (status_entry->str)
191     {
192       if (vif->status & status_entry->bit)
193         vlib_cli_output (vm, "    %s (%x)", status_entry->str,
194                          status_entry->bit);
195       status_entry++;
196     }
197 }
198
199 static int
200 virtio_pci_send_ctrl_msg_packed (vlib_main_t * vm, virtio_if_t * vif,
201                                  virtio_ctrl_msg_t * data, u32 len)
202 {
203   virtio_vring_t *vring = vif->cxq_vring;
204   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
205   virtio_ctrl_msg_t result;
206   u32 buffer_index;
207   vlib_buffer_t *b;
208   u16 used, next;
209   u16 sz = vring->size;
210   u16 flags = 0, first_desc_flags = 0;
211
212   used = vring->desc_in_use;
213   next = vring->desc_next;
214   vring_packed_desc_t *d = &vring->packed_desc[next];
215
216   if (vlib_buffer_alloc (vm, &buffer_index, 1))
217     b = vlib_get_buffer (vm, buffer_index);
218   else
219     return VIRTIO_NET_ERR;
220   /*
221    * current_data may not be initialized with 0 and may contain
222    * previous offset.
223    */
224   b->current_data = 0;
225   clib_memcpy (vlib_buffer_get_current (b), data, sizeof (virtio_ctrl_msg_t));
226
227   first_desc_flags = VRING_DESC_F_NEXT;
228   if (vring->avail_wrap_counter)
229     {
230       first_desc_flags |= VRING_DESC_F_AVAIL;
231       first_desc_flags &= ~VRING_DESC_F_USED;
232     }
233   else
234     {
235       first_desc_flags &= ~VRING_DESC_F_AVAIL;
236       first_desc_flags |= VRING_DESC_F_USED;
237     }
238   d->addr = vlib_buffer_get_current_pa (vm, b);
239   d->len = sizeof (virtio_net_ctrl_hdr_t);
240   d->id = next;
241
242   next++;
243   if (next >= sz)
244     {
245       next = 0;
246       vring->avail_wrap_counter ^= 1;
247     }
248   used++;
249
250   d = &vring->packed_desc[next];
251   flags = VRING_DESC_F_NEXT;
252   if (vring->avail_wrap_counter)
253     {
254       flags |= VRING_DESC_F_AVAIL;
255       flags &= ~VRING_DESC_F_USED;
256     }
257   else
258     {
259       flags &= ~VRING_DESC_F_AVAIL;
260       flags |= VRING_DESC_F_USED;
261     }
262   d->addr = vlib_buffer_get_current_pa (vm, b) +
263     STRUCT_OFFSET_OF (virtio_ctrl_msg_t, data);
264   d->len = len;
265   d->id = next;
266   d->flags = flags;
267
268   next++;
269   if (next >= sz)
270     {
271       next = 0;
272       vring->avail_wrap_counter ^= 1;
273     }
274   used++;
275
276   d = &vring->packed_desc[next];
277   flags = VRING_DESC_F_WRITE;
278   if (vring->avail_wrap_counter)
279     {
280       flags |= VRING_DESC_F_AVAIL;
281       flags &= ~VRING_DESC_F_USED;
282     }
283   else
284     {
285       flags &= ~VRING_DESC_F_AVAIL;
286       flags |= VRING_DESC_F_USED;
287     }
288   d->addr = vlib_buffer_get_current_pa (vm, b) +
289     STRUCT_OFFSET_OF (virtio_ctrl_msg_t, status);
290   d->len = sizeof (data->status);
291   d->id = next;
292   d->flags = flags;
293
294   next++;
295   if (next >= sz)
296     {
297       next = 0;
298       vring->avail_wrap_counter ^= 1;
299     }
300   used++;
301
302   CLIB_MEMORY_STORE_BARRIER ();
303   vring->packed_desc[vring->desc_next].flags = first_desc_flags;
304   vring->desc_next = next;
305   vring->desc_in_use = used;
306   CLIB_MEMORY_BARRIER ();
307   if (vring->device_event->flags != VRING_EVENT_F_DISABLE)
308     {
309       virtio_kick (vm, vring, vif);
310     }
311
312   u16 last = vring->last_used_idx;
313   d = &vring->packed_desc[last];
314   do
315     {
316       flags = d->flags;
317     }
318   while ((flags & VRING_DESC_F_AVAIL) != (vring->used_wrap_counter << 7)
319          || (flags & VRING_DESC_F_USED) != (vring->used_wrap_counter << 15));
320
321   last += 3;
322   if (last >= vring->size)
323     {
324       last = last - vring->size;
325       vring->used_wrap_counter ^= 1;
326     }
327   vring->desc_in_use -= 3;
328   vring->last_used_idx = last;
329
330   CLIB_MEMORY_BARRIER ();
331   clib_memcpy (&result, vlib_buffer_get_current (b),
332                sizeof (virtio_ctrl_msg_t));
333   virtio_log_debug (vif, "ctrl-queue: status %u", result.status);
334   status = result.status;
335   vlib_buffer_free (vm, &buffer_index, 1);
336   return status;
337 }
338
339 static int
340 virtio_pci_send_ctrl_msg_split (vlib_main_t * vm, virtio_if_t * vif,
341                                 virtio_ctrl_msg_t * data, u32 len)
342 {
343   virtio_vring_t *vring = vif->cxq_vring;
344   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
345   virtio_ctrl_msg_t result;
346   u32 buffer_index;
347   vlib_buffer_t *b;
348   u16 used, next, avail;
349   u16 sz = vring->size;
350   u16 mask = sz - 1;
351
352   used = vring->desc_in_use;
353   next = vring->desc_next;
354   avail = vring->avail->idx;
355   vring_desc_t *d = &vring->desc[next];
356
357   if (vlib_buffer_alloc (vm, &buffer_index, 1))
358     b = vlib_get_buffer (vm, buffer_index);
359   else
360     return VIRTIO_NET_ERR;
361   /*
362    * current_data may not be initialized with 0 and may contain
363    * previous offset.
364    */
365   b->current_data = 0;
366   clib_memcpy (vlib_buffer_get_current (b), data, sizeof (virtio_ctrl_msg_t));
367   d->flags = VRING_DESC_F_NEXT;
368   d->addr = vlib_buffer_get_current_pa (vm, b);
369   d->len = sizeof (virtio_net_ctrl_hdr_t);
370   vring->avail->ring[avail & mask] = next;
371   avail++;
372   next = (next + 1) & mask;
373   d->next = next;
374   used++;
375
376   d = &vring->desc[next];
377   d->flags = VRING_DESC_F_NEXT;
378   d->addr = vlib_buffer_get_current_pa (vm, b) +
379     STRUCT_OFFSET_OF (virtio_ctrl_msg_t, data);
380   d->len = len;
381   next = (next + 1) & mask;
382   d->next = next;
383   used++;
384
385   d = &vring->desc[next];
386   d->flags = VRING_DESC_F_WRITE;
387   d->addr = vlib_buffer_get_current_pa (vm, b) +
388     STRUCT_OFFSET_OF (virtio_ctrl_msg_t, status);
389   d->len = sizeof (data->status);
390   next = (next + 1) & mask;
391   used++;
392
393   CLIB_MEMORY_STORE_BARRIER ();
394   vring->avail->idx = avail;
395   vring->desc_next = next;
396   vring->desc_in_use = used;
397
398   if ((vring->used->flags & VIRTIO_RING_FLAG_MASK_INT) == 0)
399     {
400       virtio_kick (vm, vring, vif);
401     }
402
403   u16 last = vring->last_used_idx, n_left = 0;
404   n_left = vring->used->idx - last;
405
406   while (n_left)
407     {
408       vring_used_elem_t *e = &vring->used->ring[last & mask];
409       u16 slot = e->id;
410
411       d = &vring->desc[slot];
412       while (d->flags & VRING_DESC_F_NEXT)
413         {
414           used--;
415           slot = d->next;
416           d = &vring->desc[slot];
417         }
418       used--;
419       last++;
420       n_left--;
421     }
422   vring->desc_in_use = used;
423   vring->last_used_idx = last;
424
425   CLIB_MEMORY_BARRIER ();
426   clib_memcpy (&result, vlib_buffer_get_current (b),
427                sizeof (virtio_ctrl_msg_t));
428   virtio_log_debug (vif, "ctrl-queue: status %u", result.status);
429   status = result.status;
430   vlib_buffer_free (vm, &buffer_index, 1);
431   return status;
432 }
433
434 static int
435 virtio_pci_send_ctrl_msg (vlib_main_t * vm, virtio_if_t * vif,
436                           virtio_ctrl_msg_t * data, u32 len)
437 {
438   if (vif->is_packed)
439     return virtio_pci_send_ctrl_msg_packed (vm, vif, data, len);
440   else
441     return virtio_pci_send_ctrl_msg_split (vm, vif, data, len);
442 }
443
444 static int
445 virtio_pci_disable_offload (vlib_main_t * vm, virtio_if_t * vif)
446 {
447   virtio_ctrl_msg_t offload_hdr;
448   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
449
450   offload_hdr.ctrl.class = VIRTIO_NET_CTRL_GUEST_OFFLOADS;
451   offload_hdr.ctrl.cmd = VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET;
452   offload_hdr.status = VIRTIO_NET_ERR;
453   u64 offloads = 0ULL;
454   clib_memcpy (offload_hdr.data, &offloads, sizeof (offloads));
455
456   status =
457     virtio_pci_send_ctrl_msg (vm, vif, &offload_hdr, sizeof (offloads));
458   virtio_log_debug (vif, "disable offloads");
459   vif->remote_features = vif->virtio_pci_func->get_device_features (vm, vif);
460   vif->virtio_pci_func->get_driver_features (vm, vif);
461   return status;
462 }
463
464 static int
465 virtio_pci_enable_checksum_offload (vlib_main_t * vm, virtio_if_t * vif)
466 {
467   virtio_ctrl_msg_t csum_offload_hdr;
468   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
469
470   csum_offload_hdr.ctrl.class = VIRTIO_NET_CTRL_GUEST_OFFLOADS;
471   csum_offload_hdr.ctrl.cmd = VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET;
472   csum_offload_hdr.status = VIRTIO_NET_ERR;
473   u64 offloads = 0ULL;
474   offloads |= VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_CSUM);
475   clib_memcpy (csum_offload_hdr.data, &offloads, sizeof (offloads));
476
477   status =
478     virtio_pci_send_ctrl_msg (vm, vif, &csum_offload_hdr, sizeof (offloads));
479   virtio_log_debug (vif, "enable checksum offload");
480   vif->remote_features = vif->virtio_pci_func->get_device_features (vm, vif);
481   vif->features = vif->virtio_pci_func->get_driver_features (vm, vif);
482   return status;
483 }
484
485 static int
486 virtio_pci_enable_gso (vlib_main_t * vm, virtio_if_t * vif)
487 {
488   virtio_ctrl_msg_t gso_hdr;
489   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
490
491   gso_hdr.ctrl.class = VIRTIO_NET_CTRL_GUEST_OFFLOADS;
492   gso_hdr.ctrl.cmd = VIRTIO_NET_CTRL_GUEST_OFFLOADS_SET;
493   gso_hdr.status = VIRTIO_NET_ERR;
494   u64 offloads = VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_CSUM)
495     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO4)
496     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO6);
497   clib_memcpy (gso_hdr.data, &offloads, sizeof (offloads));
498
499   status = virtio_pci_send_ctrl_msg (vm, vif, &gso_hdr, sizeof (offloads));
500   virtio_log_debug (vif, "enable gso");
501   vif->remote_features = vif->virtio_pci_func->get_device_features (vm, vif);
502   vif->virtio_pci_func->get_driver_features (vm, vif);
503   return status;
504 }
505
506 static int
507 virtio_pci_offloads (vlib_main_t * vm, virtio_if_t * vif, int gso_enabled,
508                      int csum_offload_enabled)
509 {
510   vnet_main_t *vnm = vnet_get_main ();
511   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
512
513   if ((vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)) &&
514       (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)))
515     {
516       if (gso_enabled
517           && (vif->features & (VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO4) |
518                                VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO6))))
519         {
520           if (virtio_pci_enable_gso (vm, vif))
521             {
522               virtio_log_warning (vif, "gso is not enabled");
523             }
524           else
525             {
526               vif->gso_enabled = 1;
527               vif->csum_offload_enabled = 0;
528               hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO |
529                           VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
530                           VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
531             }
532         }
533       else if (csum_offload_enabled
534                && (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CSUM)))
535         {
536           if (virtio_pci_enable_checksum_offload (vm, vif))
537             {
538               virtio_log_warning (vif, "checksum offload is not enabled");
539             }
540           else
541             {
542               vif->csum_offload_enabled = 1;
543               vif->gso_enabled = 0;
544               hw->caps &= ~VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO;
545               hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_TX_TCP_CKSUM |
546                           VNET_HW_INTERFACE_CAP_SUPPORTS_TX_UDP_CKSUM;
547             }
548         }
549       else
550         {
551           if (virtio_pci_disable_offload (vm, vif))
552             {
553               virtio_log_warning (vif, "offloads are not disabled");
554             }
555           else
556             {
557               vif->csum_offload_enabled = 0;
558               vif->gso_enabled = 0;
559               hw->caps &= ~(VNET_HW_INTERFACE_CAP_SUPPORTS_L4_TX_CKSUM |
560                             VNET_HW_INTERFACE_CAP_SUPPORTS_TCP_GSO);
561             }
562         }
563     }
564
565   return 0;
566 }
567
568 static int
569 virtio_pci_enable_multiqueue (vlib_main_t * vm, virtio_if_t * vif,
570                               u16 num_queues)
571 {
572   virtio_ctrl_msg_t mq_hdr;
573   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
574
575   mq_hdr.ctrl.class = VIRTIO_NET_CTRL_MQ;
576   mq_hdr.ctrl.cmd = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET;
577   mq_hdr.status = VIRTIO_NET_ERR;
578   clib_memcpy (mq_hdr.data, &num_queues, sizeof (num_queues));
579
580   status = virtio_pci_send_ctrl_msg (vm, vif, &mq_hdr, sizeof (num_queues));
581   virtio_log_debug (vif, "multi-queue enable %u queues", num_queues);
582   return status;
583 }
584
585 static u8
586 virtio_pci_queue_size_valid (u16 qsz)
587 {
588   if (qsz < 64 || qsz > 4096)
589     return 0;
590   if ((qsz % 64) != 0)
591     return 0;
592   return 1;
593 }
594
595 clib_error_t *
596 virtio_pci_control_vring_packed_init (vlib_main_t * vm, virtio_if_t * vif,
597                                       u16 queue_num)
598 {
599   clib_error_t *error = 0;
600   u16 queue_size = 0;
601   virtio_vring_t *vring;
602   u32 i = 0;
603   void *ptr = NULL;
604
605   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
606
607   if (queue_size > 32768)
608     return clib_error_return (0, "ring size must be 32768 or lower");
609
610   if (queue_size == 0)
611     queue_size = 256;
612
613   vec_validate_aligned (vif->cxq_vring, 0, CLIB_CACHE_LINE_BYTES);
614   vring = vec_elt_at_index (vif->cxq_vring, 0);
615
616   i =
617     (((queue_size * sizeof (vring_packed_desc_t)) +
618       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
619       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1)) + sizeof (vring_desc_event_t);
620
621   ptr =
622     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
623                                         vif->numa_node);
624   if (!ptr)
625     return vlib_physmem_last_error (vm);
626   clib_memset (ptr, 0, i);
627
628   vring->packed_desc = ptr;
629
630   vring->driver_event = ptr + (queue_size * sizeof (vring_packed_desc_t));
631   vring->driver_event->off_wrap = 0;
632   vring->driver_event->flags = VRING_EVENT_F_DISABLE;
633
634   vring->device_event =
635     ptr +
636     (((queue_size * sizeof (vring_packed_desc_t)) +
637       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
638       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1));
639   vring->device_event->off_wrap = 0;
640   vring->device_event->flags = 0;
641
642   vring->queue_id = queue_num;
643   vring->size = queue_size;
644   vring->avail_wrap_counter = 1;
645   vring->used_wrap_counter = 1;
646
647   ASSERT (vring->buffers == 0);
648
649   virtio_log_debug (vif, "control-queue: number %u, size %u", queue_num,
650                     queue_size);
651   vif->virtio_pci_func->setup_queue (vm, vif, queue_num, (void *) vring);
652   vring->queue_notify_offset =
653     vif->notify_off_multiplier *
654     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
655   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
656                     queue_num, vring->queue_notify_offset);
657   return error;
658 }
659
660 clib_error_t *
661 virtio_pci_control_vring_split_init (vlib_main_t * vm, virtio_if_t * vif,
662                                      u16 queue_num)
663 {
664   clib_error_t *error = 0;
665   u16 queue_size = 0;
666   virtio_vring_t *vring;
667   vring_t vr;
668   u32 i = 0;
669   void *ptr = NULL;
670
671   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
672   if (!virtio_pci_queue_size_valid (queue_size))
673     clib_warning ("queue size is not valid");
674
675   if (!is_pow2 (queue_size))
676     return clib_error_return (0, "ring size must be power of 2");
677
678   if (queue_size > 32768)
679     return clib_error_return (0, "ring size must be 32768 or lower");
680
681   if (queue_size == 0)
682     queue_size = 256;
683
684   vec_validate_aligned (vif->cxq_vring, 0, CLIB_CACHE_LINE_BYTES);
685   vring = vec_elt_at_index (vif->cxq_vring, 0);
686   i = vring_size (queue_size, VIRTIO_PCI_VRING_ALIGN);
687   i = round_pow2 (i, VIRTIO_PCI_VRING_ALIGN);
688   ptr =
689     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
690                                         vif->numa_node);
691   if (!ptr)
692     return vlib_physmem_last_error (vm);
693   clib_memset (ptr, 0, i);
694   vring_init (&vr, queue_size, ptr, VIRTIO_PCI_VRING_ALIGN);
695   vring->desc = vr.desc;
696   vring->avail = vr.avail;
697   vring->used = vr.used;
698   vring->queue_id = queue_num;
699   vring->avail->flags = VIRTIO_RING_FLAG_MASK_INT;
700
701   ASSERT (vring->buffers == 0);
702
703   vring->size = queue_size;
704   virtio_log_debug (vif, "control-queue: number %u, size %u", queue_num,
705                     queue_size);
706   vif->virtio_pci_func->setup_queue (vm, vif, queue_num, ptr);
707   vring->queue_notify_offset =
708     vif->notify_off_multiplier *
709     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
710   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
711                     queue_num, vring->queue_notify_offset);
712
713   return error;
714 }
715
716 clib_error_t *
717 virtio_pci_control_vring_init (vlib_main_t * vm, virtio_if_t * vif,
718                                u16 queue_num)
719 {
720   if (vif->is_packed)
721     return virtio_pci_control_vring_packed_init (vm, vif, queue_num);
722   else
723     return virtio_pci_control_vring_split_init (vm, vif, queue_num);
724 }
725
726 clib_error_t *
727 virtio_pci_vring_split_init (vlib_main_t * vm, virtio_if_t * vif,
728                              u16 queue_num)
729 {
730   clib_error_t *error = 0;
731   u16 queue_size = 0;
732   virtio_vring_t *vring;
733   vring_t vr;
734   u32 i = 0;
735   void *ptr = NULL;
736
737   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
738   if (!virtio_pci_queue_size_valid (queue_size))
739     clib_warning ("queue size is not valid");
740
741   if (!is_pow2 (queue_size))
742     return clib_error_return (0, "ring size must be power of 2");
743
744   if (queue_size > 32768)
745     return clib_error_return (0, "ring size must be 32768 or lower");
746
747   if (queue_size == 0)
748     queue_size = 256;
749
750   if (queue_num % 2)
751     {
752       vec_validate_aligned (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num),
753                             CLIB_CACHE_LINE_BYTES);
754       vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num));
755       clib_spinlock_init (&vring->lockp);
756     }
757   else
758     {
759       vec_validate_aligned (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num),
760                             CLIB_CACHE_LINE_BYTES);
761       vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num));
762     }
763   i = vring_size (queue_size, VIRTIO_PCI_VRING_ALIGN);
764   i = round_pow2 (i, VIRTIO_PCI_VRING_ALIGN);
765   ptr =
766     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
767                                         vif->numa_node);
768   if (!ptr)
769     return vlib_physmem_last_error (vm);
770   clib_memset (ptr, 0, i);
771   vring_init (&vr, queue_size, ptr, VIRTIO_PCI_VRING_ALIGN);
772   vring->desc = vr.desc;
773   vring->avail = vr.avail;
774   vring->used = vr.used;
775   vring->queue_id = queue_num;
776   vring->avail->flags = VIRTIO_RING_FLAG_MASK_INT;
777   vring->flow_table = 0;
778
779   ASSERT (vring->buffers == 0);
780   vec_validate_aligned (vring->buffers, queue_size, CLIB_CACHE_LINE_BYTES);
781   if (queue_num % 2)
782     {
783       virtio_log_debug (vif, "tx-queue: number %u, size %u", queue_num,
784                         queue_size);
785       clib_memset_u32 (vring->buffers, ~0, queue_size);
786     }
787   else
788     {
789       virtio_log_debug (vif, "rx-queue: number %u, size %u", queue_num,
790                         queue_size);
791     }
792   vring->size = queue_size;
793   if (vif->virtio_pci_func->setup_queue (vm, vif, queue_num, ptr))
794     return clib_error_return (0, "error in queue address setup");
795
796   vring->queue_notify_offset =
797     vif->notify_off_multiplier *
798     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
799   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
800                     queue_num, vring->queue_notify_offset);
801   return error;
802 }
803
804 clib_error_t *
805 virtio_pci_vring_packed_init (vlib_main_t * vm, virtio_if_t * vif,
806                               u16 queue_num)
807 {
808   clib_error_t *error = 0;
809   u16 queue_size = 0;
810   virtio_vring_t *vring;
811   u32 i = 0;
812   void *ptr = NULL;
813
814   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
815
816   if (queue_size > 32768)
817     return clib_error_return (0, "ring size must be 32768 or lower");
818
819   if (queue_size == 0)
820     queue_size = 256;
821
822   if (queue_num % 2)
823     {
824       vec_validate_aligned (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num),
825                             CLIB_CACHE_LINE_BYTES);
826       vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num));
827       clib_spinlock_init (&vring->lockp);
828     }
829   else
830     {
831       vec_validate_aligned (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num),
832                             CLIB_CACHE_LINE_BYTES);
833       vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num));
834     }
835
836   i =
837     (((queue_size * sizeof (vring_packed_desc_t)) +
838       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
839       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1)) + sizeof (vring_desc_event_t);
840
841   ptr =
842     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
843                                         vif->numa_node);
844   if (!ptr)
845     return vlib_physmem_last_error (vm);
846
847   clib_memset (ptr, 0, i);
848   vring->packed_desc = ptr;
849
850   vring->driver_event = ptr + (queue_size * sizeof (vring_packed_desc_t));
851   vring->driver_event->off_wrap = 0;
852   vring->driver_event->flags = VRING_EVENT_F_DISABLE;
853
854   vring->device_event =
855     ptr +
856     (((queue_size * sizeof (vring_packed_desc_t)) +
857       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
858       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1));
859   vring->device_event->off_wrap = 0;
860   vring->device_event->flags = 0;
861
862   vring->queue_id = queue_num;
863
864   vring->avail_wrap_counter = 1;
865   vring->used_wrap_counter = 1;
866
867   ASSERT (vring->buffers == 0);
868   vec_validate_aligned (vring->buffers, queue_size, CLIB_CACHE_LINE_BYTES);
869   if (queue_num % 2)
870     {
871       virtio_log_debug (vif, "tx-queue: number %u, size %u", queue_num,
872                         queue_size);
873       clib_memset_u32 (vring->buffers, ~0, queue_size);
874     }
875   else
876     {
877       virtio_log_debug (vif, "rx-queue: number %u, size %u", queue_num,
878                         queue_size);
879     }
880   vring->size = queue_size;
881   if (vif->virtio_pci_func->setup_queue (vm, vif, queue_num, (void *) vring))
882     return clib_error_return (0, "error in queue address setup");
883
884   vring->queue_notify_offset =
885     vif->notify_off_multiplier *
886     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
887   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
888                     queue_num, vring->queue_notify_offset);
889
890   return error;
891 }
892
893 clib_error_t *
894 virtio_pci_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 queue_num)
895 {
896   if (vif->is_packed)
897     return virtio_pci_vring_packed_init (vm, vif, queue_num);
898   else
899     return virtio_pci_vring_split_init (vm, vif, queue_num);
900 }
901
902 static void
903 virtio_negotiate_features (vlib_main_t * vm, virtio_if_t * vif,
904                            u64 req_features)
905 {
906   /*
907    * if features are not requested
908    * default: all supported features
909    */
910   u64 supported_features = VIRTIO_FEATURE (VIRTIO_NET_F_CSUM)
911     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_CSUM)
912     | VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)
913     | VIRTIO_FEATURE (VIRTIO_NET_F_MTU)
914     | VIRTIO_FEATURE (VIRTIO_NET_F_MAC)
915     | VIRTIO_FEATURE (VIRTIO_NET_F_GSO)
916     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO4)
917     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO6)
918     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_UFO)
919     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO4)
920     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO6)
921     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_UFO)
922     | VIRTIO_FEATURE (VIRTIO_NET_F_MRG_RXBUF)
923     | VIRTIO_FEATURE (VIRTIO_NET_F_STATUS)
924     | VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)
925     | VIRTIO_FEATURE (VIRTIO_NET_F_MQ)
926     | VIRTIO_FEATURE (VIRTIO_F_NOTIFY_ON_EMPTY)
927     | VIRTIO_FEATURE (VIRTIO_F_ANY_LAYOUT)
928     | VIRTIO_FEATURE (VIRTIO_RING_F_INDIRECT_DESC);
929
930   if (vif->is_modern)
931     supported_features |= VIRTIO_FEATURE (VIRTIO_F_VERSION_1);
932
933   if (vif->is_packed)
934     {
935       supported_features |=
936         (VIRTIO_FEATURE (VIRTIO_F_RING_PACKED) |
937          VIRTIO_FEATURE (VIRTIO_F_IN_ORDER));
938     }
939
940   if (req_features == 0)
941     {
942       req_features = supported_features;
943     }
944
945   vif->features = req_features & vif->remote_features & supported_features;
946
947   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MTU))
948     {
949       u16 mtu = 0;
950       mtu = vif->virtio_pci_func->get_mtu (vm, vif);
951
952       if (mtu < 64)
953         vif->features &= ~VIRTIO_FEATURE (VIRTIO_NET_F_MTU);
954     }
955
956   if ((vif->features & (VIRTIO_FEATURE (VIRTIO_F_RING_PACKED))) == 0)
957     vif->is_packed = 0;
958
959   vif->virtio_pci_func->set_driver_features (vm, vif, vif->features);
960   vif->features = vif->virtio_pci_func->get_driver_features (vm, vif);
961 }
962
963 void
964 virtio_pci_read_device_feature (vlib_main_t * vm, virtio_if_t * vif)
965 {
966   vif->remote_features = vif->virtio_pci_func->get_device_features (vm, vif);
967 }
968
969 int
970 virtio_pci_reset_device (vlib_main_t * vm, virtio_if_t * vif)
971 {
972   u8 status = 0;
973
974   /*
975    * Reset the device
976    */
977   status = vif->virtio_pci_func->device_reset (vm, vif);
978
979   /*
980    * Set the Acknowledge status bit
981    */
982   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_ACK);
983
984   /*
985    * Set the Driver status bit
986    */
987   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_DRIVER);
988
989   /*
990    * Read the status and verify it
991    */
992   status = vif->virtio_pci_func->get_status (vm, vif);
993   if ((status & VIRTIO_CONFIG_STATUS_ACK)
994       && (status & VIRTIO_CONFIG_STATUS_DRIVER))
995     vif->status = status;
996   else
997     return -1;
998
999   return 0;
1000 }
1001
1002 clib_error_t *
1003 virtio_pci_read_caps (vlib_main_t * vm, virtio_if_t * vif, void **bar)
1004 {
1005   clib_error_t *error = 0;
1006   virtio_pci_cap_t cap;
1007   u8 pos, common_cfg = 0, notify = 0, dev_cfg = 0, isr = 0, pci_cfg = 0;
1008   vlib_pci_dev_handle_t h = vif->pci_dev_handle;
1009
1010   if ((error = vlib_pci_read_config_u8 (vm, h, PCI_CAPABILITY_LIST, &pos)))
1011     {
1012       virtio_log_error (vif, "error in reading capabilty list position");
1013       return clib_error_return (error,
1014                                 "error in reading capabilty list position");
1015     }
1016   while (pos)
1017     {
1018       if ((error =
1019            vlib_pci_read_write_config (vm, h, VLIB_READ, pos, &cap,
1020                                        sizeof (cap))))
1021         {
1022           virtio_log_error (vif, "%s [%2x]",
1023                             "error in reading the capability at", pos);
1024           return clib_error_return (error,
1025                                     "error in reading the capability at [%2x]",
1026                                     pos);
1027         }
1028
1029       if (cap.cap_vndr == PCI_CAP_ID_MSIX)
1030         {
1031           u16 flags, table_size, table_size_mask = 0x07FF;
1032
1033           if ((error =
1034                vlib_pci_read_write_config (vm, h, VLIB_READ, pos + 2, &flags,
1035                                            sizeof (flags))))
1036             return clib_error_return (error,
1037                                       "error in reading the capability at [%2x]",
1038                                       pos + 2);
1039
1040           table_size = flags & table_size_mask;
1041           virtio_log_debug (vif, "flags:0x%x %s 0x%x", flags,
1042                             "msix interrupt vector table-size", table_size);
1043
1044           if (flags & PCI_MSIX_ENABLE)
1045             {
1046               virtio_log_debug (vif, "msix interrupt enabled");
1047               vif->msix_enabled = VIRTIO_MSIX_ENABLED;
1048               vif->msix_table_size = table_size;
1049             }
1050           else
1051             {
1052               virtio_log_debug (vif, "msix interrupt disabled");
1053               vif->msix_enabled = VIRTIO_MSIX_DISABLED;
1054               vif->msix_table_size = 0;
1055             }
1056         }
1057
1058       if (cap.cap_vndr != PCI_CAP_ID_VNDR)
1059         {
1060           virtio_log_debug (vif, "[%2x] %s %2x ", pos,
1061                             "skipping non VNDR cap id:", cap.cap_vndr);
1062           goto next;
1063         }
1064
1065       virtio_log_debug (vif,
1066                         "[%4x] cfg type: %u, bar: %u, offset: %04x, len: %u",
1067                         pos, cap.cfg_type, cap.bar, cap.offset, cap.length);
1068
1069       if (cap.bar >= 0 && cap.bar <= 5)
1070         {
1071           vif->bar = bar[cap.bar];
1072           vif->bar_id = cap.bar;
1073         }
1074       else
1075         return clib_error_return (error, "invalid bar %u", cap.bar);
1076
1077       switch (cap.cfg_type)
1078         {
1079         case VIRTIO_PCI_CAP_COMMON_CFG:
1080           vif->common_offset = cap.offset;
1081           common_cfg = 1;
1082           break;
1083         case VIRTIO_PCI_CAP_NOTIFY_CFG:
1084           if ((error =
1085                vlib_pci_read_write_config (vm, h, VLIB_READ,
1086                                            pos + sizeof (cap),
1087                                            &vif->notify_off_multiplier,
1088                                            sizeof
1089                                            (vif->notify_off_multiplier))))
1090             {
1091               virtio_log_error (vif, "notify off multiplier is not given");
1092             }
1093           else
1094             {
1095               virtio_log_debug (vif, "notify off multiplier is %u",
1096                                 vif->notify_off_multiplier);
1097               vif->notify_offset = cap.offset;
1098               notify = 1;
1099             }
1100           break;
1101         case VIRTIO_PCI_CAP_DEVICE_CFG:
1102           vif->device_offset = cap.offset;
1103           dev_cfg = 1;
1104           break;
1105         case VIRTIO_PCI_CAP_ISR_CFG:
1106           vif->isr_offset = cap.offset;
1107           isr = 1;
1108           break;
1109         case VIRTIO_PCI_CAP_PCI_CFG:
1110           if (cap.bar == 0)
1111             pci_cfg = 1;
1112           break;
1113         }
1114     next:
1115       pos = cap.cap_next;
1116     }
1117
1118   if (common_cfg == 0 || notify == 0 || dev_cfg == 0 || isr == 0)
1119     {
1120       vif->virtio_pci_func = &virtio_pci_legacy_func;
1121       vif->notify_off_multiplier = 0;
1122       virtio_log_debug (vif, "legacy virtio pci device found");
1123       return error;
1124     }
1125
1126   vif->is_modern = 1;
1127   vif->virtio_pci_func = &virtio_pci_modern_func;
1128
1129   if (!pci_cfg)
1130     {
1131       virtio_log_debug (vif, "modern virtio pci device found");
1132     }
1133   else
1134     {
1135       virtio_log_debug (vif, "transitional virtio pci device found");
1136     }
1137
1138   return error;
1139 }
1140
1141 static clib_error_t *
1142 virtio_pci_device_init (vlib_main_t * vm, virtio_if_t * vif,
1143                         virtio_pci_create_if_args_t * args, void **bar)
1144 {
1145   clib_error_t *error = 0;
1146   u8 status = 0;
1147
1148   if ((error = virtio_pci_read_caps (vm, vif, bar)))
1149     {
1150       args->rv = VNET_API_ERROR_UNSUPPORTED;
1151       virtio_log_error (vif, "Device is not supported");
1152       return clib_error_return (error, "Device is not supported");
1153     }
1154
1155   if (virtio_pci_reset_device (vm, vif) < 0)
1156     {
1157       args->rv = VNET_API_ERROR_INIT_FAILED;
1158       virtio_log_error (vif, "Failed to reset the device");
1159       return clib_error_return (error, "Failed to reset the device");
1160     }
1161   /*
1162    * read device features and negotiate (user) requested features
1163    */
1164   virtio_pci_read_device_feature (vm, vif);
1165   if ((vif->remote_features & VIRTIO_FEATURE (VIRTIO_RING_F_INDIRECT_DESC)) ==
1166       0)
1167     {
1168       virtio_log_warning (vif, "error encountered: vhost-net backend doesn't "
1169                           "support VIRTIO_RING_F_INDIRECT_DESC features");
1170     }
1171   if ((vif->remote_features & VIRTIO_FEATURE (VIRTIO_NET_F_MRG_RXBUF)) == 0)
1172     {
1173       virtio_log_warning (vif, "error encountered: vhost-net backend doesn't "
1174                           "support VIRTIO_NET_F_MRG_RXBUF features");
1175     }
1176   virtio_negotiate_features (vm, vif, args->features);
1177
1178   /*
1179    * After FEATURE_OK, driver should not accept new feature bits
1180    */
1181   vif->virtio_pci_func->set_status (vm, vif,
1182                                     VIRTIO_CONFIG_STATUS_FEATURES_OK);
1183   status = vif->virtio_pci_func->get_status (vm, vif);
1184   if (!(status & VIRTIO_CONFIG_STATUS_FEATURES_OK))
1185     {
1186       args->rv = VNET_API_ERROR_UNSUPPORTED;
1187       virtio_log_error (vif,
1188                         "error encountered: Device doesn't support requested features");
1189       return clib_error_return (error,
1190                                 "Device doesn't support requested features");
1191     }
1192   vif->status = status;
1193
1194   /*
1195    * get or set the mac address
1196    */
1197   if (virtio_pci_get_mac (vm, vif))
1198     {
1199       f64 now = vlib_time_now (vm);
1200       u32 rnd;
1201       rnd = (u32) (now * 1e6);
1202       rnd = random_u32 (&rnd);
1203
1204       memcpy (vif->mac_addr + 2, &rnd, sizeof (rnd));
1205       vif->mac_addr[0] = 2;
1206       vif->mac_addr[1] = 0xfe;
1207       virtio_pci_set_mac (vm, vif);
1208     }
1209
1210   virtio_set_net_hdr_size (vif);
1211
1212   /*
1213    * Initialize the virtqueues
1214    */
1215   if ((error = virtio_pci_get_max_virtqueue_pairs (vm, vif)))
1216     {
1217       args->rv = VNET_API_ERROR_EXCEEDED_NUMBER_OF_RANGES_CAPACITY;
1218       goto err;
1219     }
1220
1221   if (vif->msix_enabled == VIRTIO_MSIX_ENABLED)
1222     {
1223       if (vif->msix_table_size <= vif->max_queue_pairs)
1224         {
1225           virtio_log_error (vif,
1226                             "error MSIX lines (%u) <= Number of RXQs (%u)",
1227                             vif->msix_table_size, vif->max_queue_pairs);
1228           return clib_error_return (error,
1229                                     "error MSIX lines (%u) <= Number of RXQs (%u)",
1230                                     vif->msix_table_size,
1231                                     vif->max_queue_pairs);
1232         }
1233     }
1234
1235   for (int i = 0; i < vif->max_queue_pairs; i++)
1236     {
1237       if ((error = virtio_pci_vring_init (vm, vif, RX_QUEUE (i))))
1238         {
1239           args->rv = VNET_API_ERROR_INIT_FAILED;
1240           virtio_log_error (vif, "%s (%u) %s", "error in rxq-queue",
1241                             RX_QUEUE (i), "initialization");
1242           error =
1243             clib_error_return (error, "%s (%u) %s", "error in rxq-queue",
1244                                RX_QUEUE (i), "initialization");
1245           goto err;
1246         }
1247       else
1248         {
1249           vif->num_rxqs++;
1250         }
1251
1252       if ((error = virtio_pci_vring_init (vm, vif, TX_QUEUE (i))))
1253         {
1254           args->rv = VNET_API_ERROR_INIT_FAILED;
1255           virtio_log_error (vif, "%s (%u) %s", "error in txq-queue",
1256                             TX_QUEUE (i), "initialization");
1257           error =
1258             clib_error_return (error, "%s (%u) %s", "error in txq-queue",
1259                                TX_QUEUE (i), "initialization");
1260           goto err;
1261         }
1262       else
1263         {
1264           vif->num_txqs++;
1265         }
1266     }
1267
1268   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
1269     {
1270       if ((error =
1271            virtio_pci_control_vring_init (vm, vif, vif->max_queue_pairs * 2)))
1272         {
1273           virtio_log_warning (vif, "%s (%u) %s", "error in control-queue",
1274                               vif->max_queue_pairs * 2, "initialization");
1275           if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MQ))
1276             vif->features &= ~VIRTIO_FEATURE (VIRTIO_NET_F_MQ);
1277         }
1278     }
1279   else
1280     {
1281       virtio_log_debug (vif, "control queue is not available");
1282       vif->cxq_vring = NULL;
1283     }
1284
1285   /*
1286    * set the msix interrupts
1287    */
1288   if (vif->msix_enabled == VIRTIO_MSIX_ENABLED)
1289     {
1290       int i, j;
1291       if (vif->virtio_pci_func->set_config_irq (vm, vif, 0) ==
1292           VIRTIO_MSI_NO_VECTOR)
1293         {
1294           virtio_log_warning (vif, "config vector 0 is not set");
1295         }
1296       else
1297         {
1298           virtio_log_debug (vif, "config msix vector is set at 0");
1299         }
1300       for (i = 0, j = 1; i < vif->max_queue_pairs; i++, j++)
1301         {
1302           if (vif->virtio_pci_func->set_queue_irq (vm, vif, j,
1303                                                    RX_QUEUE (i)) ==
1304               VIRTIO_MSI_NO_VECTOR)
1305             {
1306               virtio_log_warning (vif, "queue (%u) vector is not set at %u",
1307                                   RX_QUEUE (i), j);
1308             }
1309           else
1310             {
1311               virtio_log_debug (vif, "%s (%u) %s %u", "queue",
1312                                 RX_QUEUE (i), "msix vector is set at", j);
1313             }
1314         }
1315     }
1316
1317   /*
1318    * set the driver status OK
1319    */
1320   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_DRIVER_OK);
1321   vif->status = vif->virtio_pci_func->get_status (vm, vif);
1322 err:
1323   return error;
1324 }
1325
1326 void
1327 virtio_pci_create_if (vlib_main_t * vm, virtio_pci_create_if_args_t * args)
1328 {
1329   vnet_main_t *vnm = vnet_get_main ();
1330   virtio_main_t *vim = &virtio_main;
1331   virtio_if_t *vif;
1332   vlib_pci_dev_handle_t h;
1333   clib_error_t *error = 0;
1334   u32 interrupt_count = 0;
1335
1336   /* *INDENT-OFF* */
1337   pool_foreach (vif, vim->interfaces)  {
1338     if (vif->pci_addr.as_u32 == args->addr)
1339       {
1340         args->rv = VNET_API_ERROR_ADDRESS_IN_USE;
1341         args->error =
1342           clib_error_return (error, "PCI address in use");
1343           vlib_log (VLIB_LOG_LEVEL_ERR, vim->log_default, "%U: %s",
1344                 format_vlib_pci_addr, &args->addr,
1345                 " PCI address in use");
1346         return;
1347       }
1348   }
1349   /* *INDENT-ON* */
1350
1351   pool_get (vim->interfaces, vif);
1352   vif->dev_instance = vif - vim->interfaces;
1353   vif->per_interface_next_index = ~0;
1354   vif->pci_addr.as_u32 = args->addr;
1355   if (args->virtio_flags & VIRTIO_FLAG_PACKED)
1356     vif->is_packed = 1;
1357
1358   if ((error =
1359        vlib_pci_device_open (vm, (vlib_pci_addr_t *) & vif->pci_addr,
1360                              virtio_pci_device_ids, &h)))
1361     {
1362       args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1363       args->error =
1364         clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
1365                            &vif->pci_addr);
1366       vlib_log (VLIB_LOG_LEVEL_ERR, vim->log_default, "%U: %s",
1367                 format_vlib_pci_addr, &vif->pci_addr,
1368                 "error encountered on pci device open");
1369       pool_put (vim->interfaces, vif);
1370       return;
1371     }
1372   vif->pci_dev_handle = h;
1373   vlib_pci_set_private_data (vm, h, vif->dev_instance);
1374   vif->numa_node = vlib_pci_get_numa_node (vm, h);
1375   vif->type = VIRTIO_IF_TYPE_PCI;
1376
1377   if ((error = vlib_pci_bus_master_enable (vm, h)))
1378     {
1379       virtio_log_error (vif, "error encountered on pci bus master enable");
1380       goto error;
1381     }
1382
1383   void *bar[6];
1384   for (u32 i = 0; i <= 5; i++)
1385     {
1386
1387       if ((error = vlib_pci_map_region (vm, h, i, &bar[i])))
1388         {
1389           virtio_log_debug (vif, "no pci map region for bar %u", i);
1390         }
1391       else
1392         {
1393           virtio_log_debug (vif, "pci map region for bar %u at %p", i,
1394                             bar[i]);
1395         }
1396     }
1397
1398   if ((error = vlib_pci_io_region (vm, h, 0)))
1399     {
1400       virtio_log_error (vif, "error encountered on pci io region");
1401       goto error;
1402     }
1403
1404   interrupt_count = vlib_pci_get_num_msix_interrupts (vm, h);
1405   if (interrupt_count > 1)
1406     {
1407       if ((error = vlib_pci_register_msix_handler (vm, h, 0, 1,
1408                                                    &virtio_pci_irq_config_handler)))
1409         {
1410           args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1411           virtio_log_error (vif,
1412                             "error encountered on pci register msix handler 0");
1413           goto error;
1414         }
1415
1416       if ((error =
1417            vlib_pci_register_msix_handler (vm, h, 1, (interrupt_count - 1),
1418                                            &virtio_pci_irq_queue_handler)))
1419         {
1420           args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1421           virtio_log_error (vif,
1422                             "error encountered on pci register msix handler 1");
1423           goto error;
1424         }
1425
1426       if ((error = vlib_pci_enable_msix_irq (vm, h, 0, interrupt_count)))
1427         {
1428           virtio_log_error (vif, "error encountered on pci enable msix irq");
1429           goto error;
1430         }
1431       vif->support_int_mode = 1;
1432       virtio_log_debug (vif, "device supports msix interrupts");
1433     }
1434   else
1435     {
1436       /*
1437        * WARN: performance will be sub-optimal.
1438        * Fall back to intX, if msix table-size is 1 or
1439        * if UIO driver is being used.
1440        */
1441       if ((error =
1442            vlib_pci_register_intx_handler (vm, h, &virtio_pci_irq_handler)))
1443         {
1444           virtio_log_error (vif,
1445                             "error encountered on pci register interrupt handler");
1446           goto error;
1447         }
1448       vif->support_int_mode = 1;
1449       virtio_log_debug (vif, "pci register interrupt handler");
1450     }
1451
1452   if ((error = vlib_pci_intr_enable (vm, h)))
1453     {
1454       virtio_log_error (vif, "error encountered on pci interrupt enable");
1455       goto error;
1456     }
1457
1458   if ((error = virtio_pci_device_init (vm, vif, args, bar)))
1459     {
1460       virtio_log_error (vif, "error encountered on device init");
1461       goto error;
1462     }
1463
1464   /* create interface */
1465   error = ethernet_register_interface (vnm, virtio_device_class.index,
1466                                        vif->dev_instance, vif->mac_addr,
1467                                        &vif->hw_if_index,
1468                                        virtio_pci_flag_change);
1469
1470   if (error)
1471     {
1472       args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1473       virtio_log_error (vif,
1474                         "error encountered on ethernet register interface");
1475       goto error;
1476     }
1477
1478   vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, vif->hw_if_index);
1479   vif->sw_if_index = sw->sw_if_index;
1480   args->sw_if_index = sw->sw_if_index;
1481
1482   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
1483   hw->caps |= VNET_HW_INTERFACE_CAP_SUPPORTS_INT_MODE;
1484
1485   if (args->virtio_flags & VIRTIO_FLAG_BUFFERING)
1486     {
1487       error = virtio_set_packet_buffering (vif, args->buffering_size);
1488       if (error)
1489         {
1490           args->rv = VNET_API_ERROR_INIT_FAILED;
1491           virtio_log_error (vif,
1492                             "error encountered during packet buffering init");
1493           goto error;
1494         }
1495     }
1496
1497   virtio_pre_input_node_enable (vm, vif);
1498   virtio_vring_set_rx_queues (vm, vif);
1499   virtio_vring_set_tx_queues (vm, vif);
1500
1501   if (virtio_pci_is_link_up (vm, vif) & VIRTIO_NET_S_LINK_UP)
1502     {
1503       vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
1504       vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
1505                                    VNET_HW_INTERFACE_FLAG_LINK_UP);
1506     }
1507   else
1508     vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
1509
1510   virtio_pci_offloads (vm, vif, args->gso_enabled,
1511                        args->checksum_offload_enabled);
1512
1513   if ((vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)) &&
1514       (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MQ)))
1515     {
1516       if (virtio_pci_enable_multiqueue (vm, vif, vif->max_queue_pairs))
1517         virtio_log_warning (vif, "multiqueue is not set");
1518     }
1519   return;
1520
1521 error:
1522   virtio_pci_delete_if (vm, vif);
1523   if (args->rv == 0)
1524     args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1525   args->error = error;
1526 }
1527
1528 int
1529 virtio_pci_delete_if (vlib_main_t * vm, virtio_if_t * vif)
1530 {
1531   vnet_main_t *vnm = vnet_get_main ();
1532   virtio_main_t *vim = &virtio_main;
1533   u32 i = 0;
1534
1535   if (vif->type != VIRTIO_IF_TYPE_PCI)
1536     return VNET_API_ERROR_INVALID_INTERFACE;
1537
1538   vlib_pci_intr_disable (vm, vif->pci_dev_handle);
1539
1540   for (i = 0; i < vif->max_queue_pairs; i++)
1541     {
1542       vif->virtio_pci_func->del_queue (vm, vif, RX_QUEUE (i));
1543       vif->virtio_pci_func->del_queue (vm, vif, TX_QUEUE (i));
1544     }
1545
1546   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
1547     vif->virtio_pci_func->del_queue (vm, vif, vif->max_queue_pairs * 2);
1548
1549   if (vif->virtio_pci_func)
1550     vif->virtio_pci_func->device_reset (vm, vif);
1551
1552   if (vif->hw_if_index)
1553     {
1554       vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
1555       ethernet_delete_interface (vnm, vif->hw_if_index);
1556     }
1557
1558   vlib_pci_device_close (vm, vif->pci_dev_handle);
1559
1560   vec_foreach_index (i, vif->rxq_vrings)
1561   {
1562     virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, i);
1563     if (vring->used)
1564       {
1565         virtio_free_buffers (vm, vring);
1566       }
1567     vec_free (vring->buffers);
1568     vlib_physmem_free (vm, vring->desc);
1569   }
1570
1571   virtio_pre_input_node_disable (vm, vif);
1572
1573   vec_foreach_index (i, vif->txq_vrings)
1574   {
1575     virtio_vring_t *vring = vec_elt_at_index (vif->txq_vrings, i);
1576     if (vring->used)
1577       {
1578         virtio_free_buffers (vm, vring);
1579       }
1580     vec_free (vring->buffers);
1581     gro_flow_table_free (vring->flow_table);
1582     virtio_vring_buffering_free (vm, vring->buffering);
1583     clib_spinlock_free (&vring->lockp);
1584     vlib_physmem_free (vm, vring->desc);
1585   }
1586
1587   if (vif->cxq_vring != NULL)
1588     {
1589       u16 last = vif->cxq_vring->last_used_idx;
1590       u16 n_left = vif->cxq_vring->used->idx - last;
1591       while (n_left)
1592         {
1593           last++;
1594           n_left--;
1595         }
1596
1597       vif->cxq_vring->last_used_idx = last;
1598       vlib_physmem_free (vm, vif->cxq_vring->desc);
1599     }
1600
1601   vec_free (vif->rxq_vrings);
1602   vec_free (vif->txq_vrings);
1603   vec_free (vif->cxq_vring);
1604
1605   clib_error_free (vif->error);
1606   memset (vif, 0, sizeof (*vif));
1607   pool_put (vim->interfaces, vif);
1608
1609   return 0;
1610 }
1611
1612 int
1613 virtio_pci_enable_disable_offloads (vlib_main_t * vm, virtio_if_t * vif,
1614                                     int gso_enabled,
1615                                     int checksum_offload_enabled,
1616                                     int offloads_disabled)
1617 {
1618   if (vif->type != VIRTIO_IF_TYPE_PCI)
1619     return VNET_API_ERROR_INVALID_INTERFACE;
1620
1621   if (gso_enabled)
1622     virtio_pci_offloads (vm, vif, 1, 0);
1623   else if (checksum_offload_enabled)
1624     virtio_pci_offloads (vm, vif, 0, 1);
1625   else if (offloads_disabled)
1626     virtio_pci_offloads (vm, vif, 0, 0);
1627
1628   return 0;
1629 }
1630
1631 /*
1632  * fd.io coding-style-patch-verification: ON
1633  *
1634  * Local Variables:
1635  * eval: (c-set-style "gnu")
1636  * End:
1637  */