908aba759624524a09cbf3f83b5314b887a1c8e7
[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->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO |
529                 VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD;
530             }
531         }
532       else if (csum_offload_enabled
533                && (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CSUM)))
534         {
535           if (virtio_pci_enable_checksum_offload (vm, vif))
536             {
537               virtio_log_warning (vif, "checksum offload is not enabled");
538             }
539           else
540             {
541               vif->csum_offload_enabled = 1;
542               vif->gso_enabled = 0;
543               hw->flags &= ~VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO;
544               hw->flags |=
545                 VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD;
546             }
547         }
548       else
549         {
550           if (virtio_pci_disable_offload (vm, vif))
551             {
552               virtio_log_warning (vif, "offloads are not disabled");
553             }
554           else
555             {
556               vif->csum_offload_enabled = 0;
557               vif->gso_enabled = 0;
558               hw->flags &= ~(VNET_HW_INTERFACE_FLAG_SUPPORTS_GSO |
559                              VNET_HW_INTERFACE_FLAG_SUPPORTS_TX_L4_CKSUM_OFFLOAD);
560             }
561         }
562     }
563
564   return 0;
565 }
566
567 static int
568 virtio_pci_enable_multiqueue (vlib_main_t * vm, virtio_if_t * vif,
569                               u16 num_queues)
570 {
571   virtio_ctrl_msg_t mq_hdr;
572   virtio_net_ctrl_ack_t status = VIRTIO_NET_ERR;
573
574   mq_hdr.ctrl.class = VIRTIO_NET_CTRL_MQ;
575   mq_hdr.ctrl.cmd = VIRTIO_NET_CTRL_MQ_VQ_PAIRS_SET;
576   mq_hdr.status = VIRTIO_NET_ERR;
577   clib_memcpy (mq_hdr.data, &num_queues, sizeof (num_queues));
578
579   status = virtio_pci_send_ctrl_msg (vm, vif, &mq_hdr, sizeof (num_queues));
580   virtio_log_debug (vif, "multi-queue enable %u queues", num_queues);
581   return status;
582 }
583
584 static u8
585 virtio_pci_queue_size_valid (u16 qsz)
586 {
587   if (qsz < 64 || qsz > 4096)
588     return 0;
589   if ((qsz % 64) != 0)
590     return 0;
591   return 1;
592 }
593
594 clib_error_t *
595 virtio_pci_control_vring_packed_init (vlib_main_t * vm, virtio_if_t * vif,
596                                       u16 queue_num)
597 {
598   clib_error_t *error = 0;
599   u16 queue_size = 0;
600   virtio_vring_t *vring;
601   u32 i = 0;
602   void *ptr = NULL;
603
604   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
605
606   if (queue_size > 32768)
607     return clib_error_return (0, "ring size must be 32768 or lower");
608
609   if (queue_size == 0)
610     queue_size = 256;
611
612   vec_validate_aligned (vif->cxq_vring, 0, CLIB_CACHE_LINE_BYTES);
613   vring = vec_elt_at_index (vif->cxq_vring, 0);
614
615   i =
616     (((queue_size * sizeof (vring_packed_desc_t)) +
617       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
618       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1)) + sizeof (vring_desc_event_t);
619
620   ptr =
621     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
622                                         vif->numa_node);
623   if (!ptr)
624     return vlib_physmem_last_error (vm);
625   clib_memset (ptr, 0, i);
626
627   vring->packed_desc = ptr;
628
629   vring->driver_event = ptr + (queue_size * sizeof (vring_packed_desc_t));
630   vring->driver_event->off_wrap = 0;
631   vring->driver_event->flags = VRING_EVENT_F_DISABLE;
632
633   vring->device_event =
634     ptr +
635     (((queue_size * sizeof (vring_packed_desc_t)) +
636       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
637       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1));
638   vring->device_event->off_wrap = 0;
639   vring->device_event->flags = 0;
640
641   vring->queue_id = queue_num;
642   vring->size = queue_size;
643   vring->avail_wrap_counter = 1;
644   vring->used_wrap_counter = 1;
645
646   ASSERT (vring->buffers == 0);
647
648   virtio_log_debug (vif, "control-queue: number %u, size %u", queue_num,
649                     queue_size);
650   vif->virtio_pci_func->setup_queue (vm, vif, queue_num, (void *) vring);
651   vring->queue_notify_offset =
652     vif->notify_off_multiplier *
653     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
654   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
655                     queue_num, vring->queue_notify_offset);
656   return error;
657 }
658
659 clib_error_t *
660 virtio_pci_control_vring_split_init (vlib_main_t * vm, virtio_if_t * vif,
661                                      u16 queue_num)
662 {
663   clib_error_t *error = 0;
664   u16 queue_size = 0;
665   virtio_vring_t *vring;
666   vring_t vr;
667   u32 i = 0;
668   void *ptr = NULL;
669
670   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
671   if (!virtio_pci_queue_size_valid (queue_size))
672     clib_warning ("queue size is not valid");
673
674   if (!is_pow2 (queue_size))
675     return clib_error_return (0, "ring size must be power of 2");
676
677   if (queue_size > 32768)
678     return clib_error_return (0, "ring size must be 32768 or lower");
679
680   if (queue_size == 0)
681     queue_size = 256;
682
683   vec_validate_aligned (vif->cxq_vring, 0, CLIB_CACHE_LINE_BYTES);
684   vring = vec_elt_at_index (vif->cxq_vring, 0);
685   i = vring_size (queue_size, VIRTIO_PCI_VRING_ALIGN);
686   i = round_pow2 (i, VIRTIO_PCI_VRING_ALIGN);
687   ptr =
688     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
689                                         vif->numa_node);
690   if (!ptr)
691     return vlib_physmem_last_error (vm);
692   clib_memset (ptr, 0, i);
693   vring_init (&vr, queue_size, ptr, VIRTIO_PCI_VRING_ALIGN);
694   vring->desc = vr.desc;
695   vring->avail = vr.avail;
696   vring->used = vr.used;
697   vring->queue_id = queue_num;
698   vring->avail->flags = VIRTIO_RING_FLAG_MASK_INT;
699
700   ASSERT (vring->buffers == 0);
701
702   vring->size = queue_size;
703   virtio_log_debug (vif, "control-queue: number %u, size %u", queue_num,
704                     queue_size);
705   vif->virtio_pci_func->setup_queue (vm, vif, queue_num, ptr);
706   vring->queue_notify_offset =
707     vif->notify_off_multiplier *
708     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
709   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
710                     queue_num, vring->queue_notify_offset);
711
712   return error;
713 }
714
715 clib_error_t *
716 virtio_pci_control_vring_init (vlib_main_t * vm, virtio_if_t * vif,
717                                u16 queue_num)
718 {
719   if (vif->is_packed)
720     return virtio_pci_control_vring_packed_init (vm, vif, queue_num);
721   else
722     return virtio_pci_control_vring_split_init (vm, vif, queue_num);
723 }
724
725 clib_error_t *
726 virtio_pci_vring_split_init (vlib_main_t * vm, virtio_if_t * vif,
727                              u16 queue_num)
728 {
729   vlib_thread_main_t *vtm = vlib_get_thread_main ();
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       if (vif->max_queue_pairs < vtm->n_vlib_mains)
756         clib_spinlock_init (&vring->lockp);
757     }
758   else
759     {
760       vec_validate_aligned (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num),
761                             CLIB_CACHE_LINE_BYTES);
762       vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num));
763     }
764   i = vring_size (queue_size, VIRTIO_PCI_VRING_ALIGN);
765   i = round_pow2 (i, VIRTIO_PCI_VRING_ALIGN);
766   ptr =
767     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
768                                         vif->numa_node);
769   if (!ptr)
770     return vlib_physmem_last_error (vm);
771   clib_memset (ptr, 0, i);
772   vring_init (&vr, queue_size, ptr, VIRTIO_PCI_VRING_ALIGN);
773   vring->desc = vr.desc;
774   vring->avail = vr.avail;
775   vring->used = vr.used;
776   vring->queue_id = queue_num;
777   vring->avail->flags = VIRTIO_RING_FLAG_MASK_INT;
778   vring->flow_table = 0;
779
780   ASSERT (vring->buffers == 0);
781   vec_validate_aligned (vring->buffers, queue_size, CLIB_CACHE_LINE_BYTES);
782   if (queue_num % 2)
783     {
784       virtio_log_debug (vif, "tx-queue: number %u, size %u", queue_num,
785                         queue_size);
786       clib_memset_u32 (vring->buffers, ~0, queue_size);
787     }
788   else
789     {
790       virtio_log_debug (vif, "rx-queue: number %u, size %u", queue_num,
791                         queue_size);
792     }
793   vring->size = queue_size;
794   if (vif->virtio_pci_func->setup_queue (vm, vif, queue_num, ptr))
795     return clib_error_return (0, "error in queue address setup");
796
797   vring->queue_notify_offset =
798     vif->notify_off_multiplier *
799     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
800   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
801                     queue_num, vring->queue_notify_offset);
802   return error;
803 }
804
805 clib_error_t *
806 virtio_pci_vring_packed_init (vlib_main_t * vm, virtio_if_t * vif,
807                               u16 queue_num)
808 {
809   vlib_thread_main_t *vtm = vlib_get_thread_main ();
810   clib_error_t *error = 0;
811   u16 queue_size = 0;
812   virtio_vring_t *vring;
813   u32 i = 0;
814   void *ptr = NULL;
815
816   queue_size = vif->virtio_pci_func->get_queue_size (vm, vif, queue_num);
817
818   if (queue_size > 32768)
819     return clib_error_return (0, "ring size must be 32768 or lower");
820
821   if (queue_size == 0)
822     queue_size = 256;
823
824   if (queue_num % 2)
825     {
826       vec_validate_aligned (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num),
827                             CLIB_CACHE_LINE_BYTES);
828       vring = vec_elt_at_index (vif->txq_vrings, TX_QUEUE_ACCESS (queue_num));
829       if (vif->max_queue_pairs < vtm->n_vlib_mains)
830         clib_spinlock_init (&vring->lockp);
831     }
832   else
833     {
834       vec_validate_aligned (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num),
835                             CLIB_CACHE_LINE_BYTES);
836       vring = vec_elt_at_index (vif->rxq_vrings, RX_QUEUE_ACCESS (queue_num));
837     }
838
839   i =
840     (((queue_size * sizeof (vring_packed_desc_t)) +
841       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
842       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1)) + sizeof (vring_desc_event_t);
843
844   ptr =
845     vlib_physmem_alloc_aligned_on_numa (vm, i, VIRTIO_PCI_VRING_ALIGN,
846                                         vif->numa_node);
847   if (!ptr)
848     return vlib_physmem_last_error (vm);
849
850   clib_memset (ptr, 0, i);
851   vring->packed_desc = ptr;
852
853   vring->driver_event = ptr + (queue_size * sizeof (vring_packed_desc_t));
854   vring->driver_event->off_wrap = 0;
855   vring->driver_event->flags = VRING_EVENT_F_DISABLE;
856
857   vring->device_event =
858     ptr +
859     (((queue_size * sizeof (vring_packed_desc_t)) +
860       sizeof (vring_desc_event_t) + VIRTIO_PCI_VRING_ALIGN -
861       1) & ~(VIRTIO_PCI_VRING_ALIGN - 1));
862   vring->device_event->off_wrap = 0;
863   vring->device_event->flags = 0;
864
865   vring->queue_id = queue_num;
866
867   vring->avail_wrap_counter = 1;
868   vring->used_wrap_counter = 1;
869
870   ASSERT (vring->buffers == 0);
871   vec_validate_aligned (vring->buffers, queue_size, CLIB_CACHE_LINE_BYTES);
872   if (queue_num % 2)
873     {
874       virtio_log_debug (vif, "tx-queue: number %u, size %u", queue_num,
875                         queue_size);
876       clib_memset_u32 (vring->buffers, ~0, queue_size);
877     }
878   else
879     {
880       virtio_log_debug (vif, "rx-queue: number %u, size %u", queue_num,
881                         queue_size);
882     }
883   vring->size = queue_size;
884   if (vif->virtio_pci_func->setup_queue (vm, vif, queue_num, (void *) vring))
885     return clib_error_return (0, "error in queue address setup");
886
887   vring->queue_notify_offset =
888     vif->notify_off_multiplier *
889     vif->virtio_pci_func->get_queue_notify_off (vm, vif, queue_num);
890   virtio_log_debug (vif, "queue-notify-offset: number %u, offset %u",
891                     queue_num, vring->queue_notify_offset);
892
893   return error;
894 }
895
896 clib_error_t *
897 virtio_pci_vring_init (vlib_main_t * vm, virtio_if_t * vif, u16 queue_num)
898 {
899   if (vif->is_packed)
900     return virtio_pci_vring_packed_init (vm, vif, queue_num);
901   else
902     return virtio_pci_vring_split_init (vm, vif, queue_num);
903 }
904
905 static void
906 virtio_negotiate_features (vlib_main_t * vm, virtio_if_t * vif,
907                            u64 req_features)
908 {
909   /*
910    * if features are not requested
911    * default: all supported features
912    */
913   u64 supported_features = VIRTIO_FEATURE (VIRTIO_NET_F_CSUM)
914     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_CSUM)
915     | VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_GUEST_OFFLOADS)
916     | VIRTIO_FEATURE (VIRTIO_NET_F_MTU)
917     | VIRTIO_FEATURE (VIRTIO_NET_F_MAC)
918     | VIRTIO_FEATURE (VIRTIO_NET_F_GSO)
919     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO4)
920     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_TSO6)
921     | VIRTIO_FEATURE (VIRTIO_NET_F_GUEST_UFO)
922     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO4)
923     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_TSO6)
924     | VIRTIO_FEATURE (VIRTIO_NET_F_HOST_UFO)
925     | VIRTIO_FEATURE (VIRTIO_NET_F_MRG_RXBUF)
926     | VIRTIO_FEATURE (VIRTIO_NET_F_STATUS)
927     | VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)
928     | VIRTIO_FEATURE (VIRTIO_NET_F_MQ)
929     | VIRTIO_FEATURE (VIRTIO_F_NOTIFY_ON_EMPTY)
930     | VIRTIO_FEATURE (VIRTIO_F_ANY_LAYOUT)
931     | VIRTIO_FEATURE (VIRTIO_RING_F_INDIRECT_DESC);
932
933   if (vif->is_modern)
934     supported_features |= VIRTIO_FEATURE (VIRTIO_F_VERSION_1);
935
936   if (vif->is_packed)
937     {
938       supported_features |=
939         (VIRTIO_FEATURE (VIRTIO_F_RING_PACKED) |
940          VIRTIO_FEATURE (VIRTIO_F_IN_ORDER));
941     }
942
943   if (req_features == 0)
944     {
945       req_features = supported_features;
946     }
947
948   vif->features = req_features & vif->remote_features & supported_features;
949
950   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MTU))
951     {
952       u16 mtu = 0;
953       mtu = vif->virtio_pci_func->get_mtu (vm, vif);
954
955       if (mtu < 64)
956         vif->features &= ~VIRTIO_FEATURE (VIRTIO_NET_F_MTU);
957     }
958
959   if ((vif->features & (VIRTIO_FEATURE (VIRTIO_F_RING_PACKED))) == 0)
960     vif->is_packed = 0;
961
962   vif->virtio_pci_func->set_driver_features (vm, vif, vif->features);
963   vif->features = vif->virtio_pci_func->get_driver_features (vm, vif);
964 }
965
966 void
967 virtio_pci_read_device_feature (vlib_main_t * vm, virtio_if_t * vif)
968 {
969   vif->remote_features = vif->virtio_pci_func->get_device_features (vm, vif);
970 }
971
972 int
973 virtio_pci_reset_device (vlib_main_t * vm, virtio_if_t * vif)
974 {
975   u8 status = 0;
976
977   /*
978    * Reset the device
979    */
980   status = vif->virtio_pci_func->device_reset (vm, vif);
981
982   /*
983    * Set the Acknowledge status bit
984    */
985   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_ACK);
986
987   /*
988    * Set the Driver status bit
989    */
990   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_DRIVER);
991
992   /*
993    * Read the status and verify it
994    */
995   status = vif->virtio_pci_func->get_status (vm, vif);
996   if ((status & VIRTIO_CONFIG_STATUS_ACK)
997       && (status & VIRTIO_CONFIG_STATUS_DRIVER))
998     vif->status = status;
999   else
1000     return -1;
1001
1002   return 0;
1003 }
1004
1005 clib_error_t *
1006 virtio_pci_read_caps (vlib_main_t * vm, virtio_if_t * vif, void **bar)
1007 {
1008   clib_error_t *error = 0;
1009   virtio_pci_cap_t cap;
1010   u8 pos, common_cfg = 0, notify = 0, dev_cfg = 0, isr = 0, pci_cfg = 0;
1011   vlib_pci_dev_handle_t h = vif->pci_dev_handle;
1012
1013   if ((error = vlib_pci_read_config_u8 (vm, h, PCI_CAPABILITY_LIST, &pos)))
1014     {
1015       virtio_log_error (vif, "error in reading capabilty list position");
1016       return clib_error_return (error,
1017                                 "error in reading capabilty list position");
1018     }
1019   while (pos)
1020     {
1021       if ((error =
1022            vlib_pci_read_write_config (vm, h, VLIB_READ, pos, &cap,
1023                                        sizeof (cap))))
1024         {
1025           virtio_log_error (vif, "%s [%2x]",
1026                             "error in reading the capability at", pos);
1027           return clib_error_return (error,
1028                                     "error in reading the capability at [%2x]",
1029                                     pos);
1030         }
1031
1032       if (cap.cap_vndr == PCI_CAP_ID_MSIX)
1033         {
1034           u16 flags, table_size, table_size_mask = 0x07FF;
1035
1036           if ((error =
1037                vlib_pci_read_write_config (vm, h, VLIB_READ, pos + 2, &flags,
1038                                            sizeof (flags))))
1039             return clib_error_return (error,
1040                                       "error in reading the capability at [%2x]",
1041                                       pos + 2);
1042
1043           table_size = flags & table_size_mask;
1044           virtio_log_debug (vif, "flags:0x%x %s 0x%x", flags,
1045                             "msix interrupt vector table-size", table_size);
1046
1047           if (flags & PCI_MSIX_ENABLE)
1048             {
1049               virtio_log_debug (vif, "msix interrupt enabled");
1050               vif->msix_enabled = VIRTIO_MSIX_ENABLED;
1051               vif->msix_table_size = table_size;
1052             }
1053           else
1054             {
1055               virtio_log_debug (vif, "msix interrupt disabled");
1056               vif->msix_enabled = VIRTIO_MSIX_DISABLED;
1057               vif->msix_table_size = 0;
1058             }
1059         }
1060
1061       if (cap.cap_vndr != PCI_CAP_ID_VNDR)
1062         {
1063           virtio_log_debug (vif, "[%2x] %s %2x ", pos,
1064                             "skipping non VNDR cap id:", cap.cap_vndr);
1065           goto next;
1066         }
1067
1068       virtio_log_debug (vif,
1069                         "[%4x] cfg type: %u, bar: %u, offset: %04x, len: %u",
1070                         pos, cap.cfg_type, cap.bar, cap.offset, cap.length);
1071
1072       if (cap.bar >= 0 && cap.bar <= 5)
1073         {
1074           vif->bar = bar[cap.bar];
1075           vif->bar_id = cap.bar;
1076         }
1077       else
1078         return clib_error_return (error, "invalid bar %u", cap.bar);
1079
1080       switch (cap.cfg_type)
1081         {
1082         case VIRTIO_PCI_CAP_COMMON_CFG:
1083           vif->common_offset = cap.offset;
1084           common_cfg = 1;
1085           break;
1086         case VIRTIO_PCI_CAP_NOTIFY_CFG:
1087           if ((error =
1088                vlib_pci_read_write_config (vm, h, VLIB_READ,
1089                                            pos + sizeof (cap),
1090                                            &vif->notify_off_multiplier,
1091                                            sizeof
1092                                            (vif->notify_off_multiplier))))
1093             {
1094               virtio_log_error (vif, "notify off multiplier is not given");
1095             }
1096           else
1097             {
1098               virtio_log_debug (vif, "notify off multiplier is %u",
1099                                 vif->notify_off_multiplier);
1100               vif->notify_offset = cap.offset;
1101               notify = 1;
1102             }
1103           break;
1104         case VIRTIO_PCI_CAP_DEVICE_CFG:
1105           vif->device_offset = cap.offset;
1106           dev_cfg = 1;
1107           break;
1108         case VIRTIO_PCI_CAP_ISR_CFG:
1109           vif->isr_offset = cap.offset;
1110           isr = 1;
1111           break;
1112         case VIRTIO_PCI_CAP_PCI_CFG:
1113           if (cap.bar == 0)
1114             pci_cfg = 1;
1115           break;
1116         }
1117     next:
1118       pos = cap.cap_next;
1119     }
1120
1121   if (common_cfg == 0 || notify == 0 || dev_cfg == 0 || isr == 0)
1122     {
1123       vif->virtio_pci_func = &virtio_pci_legacy_func;
1124       vif->notify_off_multiplier = 0;
1125       virtio_log_debug (vif, "legacy virtio pci device found");
1126       return error;
1127     }
1128
1129   vif->is_modern = 1;
1130   vif->virtio_pci_func = &virtio_pci_modern_func;
1131
1132   if (!pci_cfg)
1133     {
1134       virtio_log_debug (vif, "modern virtio pci device found");
1135     }
1136   else
1137     {
1138       virtio_log_debug (vif, "transitional virtio pci device found");
1139     }
1140
1141   return error;
1142 }
1143
1144 static clib_error_t *
1145 virtio_pci_device_init (vlib_main_t * vm, virtio_if_t * vif,
1146                         virtio_pci_create_if_args_t * args, void **bar)
1147 {
1148   clib_error_t *error = 0;
1149   vlib_thread_main_t *vtm = vlib_get_thread_main ();
1150   u8 status = 0;
1151
1152   if ((error = virtio_pci_read_caps (vm, vif, bar)))
1153     {
1154       args->rv = VNET_API_ERROR_UNSUPPORTED;
1155       virtio_log_error (vif, "Device is not supported");
1156       return clib_error_return (error, "Device is not supported");
1157     }
1158
1159   if (virtio_pci_reset_device (vm, vif) < 0)
1160     {
1161       args->rv = VNET_API_ERROR_INIT_FAILED;
1162       virtio_log_error (vif, "Failed to reset the device");
1163       return clib_error_return (error, "Failed to reset the device");
1164     }
1165   /*
1166    * read device features and negotiate (user) requested features
1167    */
1168   virtio_pci_read_device_feature (vm, vif);
1169   if ((vif->remote_features & VIRTIO_FEATURE (VIRTIO_RING_F_INDIRECT_DESC)) ==
1170       0)
1171     {
1172       virtio_log_warning (vif, "error encountered: vhost-net backend doesn't "
1173                           "support VIRTIO_RING_F_INDIRECT_DESC features");
1174     }
1175   if ((vif->remote_features & VIRTIO_FEATURE (VIRTIO_NET_F_MRG_RXBUF)) == 0)
1176     {
1177       virtio_log_warning (vif, "error encountered: vhost-net backend doesn't "
1178                           "support VIRTIO_NET_F_MRG_RXBUF features");
1179     }
1180   virtio_negotiate_features (vm, vif, args->features);
1181
1182   /*
1183    * After FEATURE_OK, driver should not accept new feature bits
1184    */
1185   vif->virtio_pci_func->set_status (vm, vif,
1186                                     VIRTIO_CONFIG_STATUS_FEATURES_OK);
1187   status = vif->virtio_pci_func->get_status (vm, vif);
1188   if (!(status & VIRTIO_CONFIG_STATUS_FEATURES_OK))
1189     {
1190       args->rv = VNET_API_ERROR_UNSUPPORTED;
1191       virtio_log_error (vif,
1192                         "error encountered: Device doesn't support requested features");
1193       return clib_error_return (error,
1194                                 "Device doesn't support requested features");
1195     }
1196   vif->status = status;
1197
1198   /*
1199    * get or set the mac address
1200    */
1201   if (virtio_pci_get_mac (vm, vif))
1202     {
1203       f64 now = vlib_time_now (vm);
1204       u32 rnd;
1205       rnd = (u32) (now * 1e6);
1206       rnd = random_u32 (&rnd);
1207
1208       memcpy (vif->mac_addr + 2, &rnd, sizeof (rnd));
1209       vif->mac_addr[0] = 2;
1210       vif->mac_addr[1] = 0xfe;
1211       virtio_pci_set_mac (vm, vif);
1212     }
1213
1214   virtio_set_net_hdr_size (vif);
1215
1216   /*
1217    * Initialize the virtqueues
1218    */
1219   if ((error = virtio_pci_get_max_virtqueue_pairs (vm, vif)))
1220     {
1221       args->rv = VNET_API_ERROR_EXCEEDED_NUMBER_OF_RANGES_CAPACITY;
1222       goto err;
1223     }
1224
1225   if (vif->msix_enabled == VIRTIO_MSIX_ENABLED)
1226     {
1227       if (vif->msix_table_size <= vif->max_queue_pairs)
1228         {
1229           virtio_log_error (vif,
1230                             "error MSIX lines (%u) <= Number of RXQs (%u)",
1231                             vif->msix_table_size, vif->max_queue_pairs);
1232           return clib_error_return (error,
1233                                     "error MSIX lines (%u) <= Number of RXQs (%u)",
1234                                     vif->msix_table_size,
1235                                     vif->max_queue_pairs);
1236         }
1237     }
1238
1239   for (int i = 0; i < vif->max_queue_pairs; i++)
1240     {
1241       if ((error = virtio_pci_vring_init (vm, vif, RX_QUEUE (i))))
1242         {
1243           args->rv = VNET_API_ERROR_INIT_FAILED;
1244           virtio_log_error (vif, "%s (%u) %s", "error in rxq-queue",
1245                             RX_QUEUE (i), "initialization");
1246           error =
1247             clib_error_return (error, "%s (%u) %s", "error in rxq-queue",
1248                                RX_QUEUE (i), "initialization");
1249           goto err;
1250         }
1251       else
1252         {
1253           vif->num_rxqs++;
1254         }
1255
1256       if (i >= vtm->n_vlib_mains)
1257         {
1258           /*
1259            * There is 1:1 mapping between tx queue and vpp worker thread.
1260            * tx queue 0 is bind with thread index 0, tx queue 1 on thread
1261            * index 1 and so on.
1262            * Multiple worker threads can poll same tx queue when number of
1263            * workers are more than tx queues. In this case, 1:N mapping
1264            * between tx queue and vpp worker thread.
1265            */
1266           virtio_log_debug (vif, "%s %u, %s", "tx-queue: number",
1267                             TX_QUEUE (i),
1268                             "no VPP worker thread is available");
1269           continue;
1270         }
1271
1272       if ((error = virtio_pci_vring_init (vm, vif, TX_QUEUE (i))))
1273         {
1274           args->rv = VNET_API_ERROR_INIT_FAILED;
1275           virtio_log_error (vif, "%s (%u) %s", "error in txq-queue",
1276                             TX_QUEUE (i), "initialization");
1277           error =
1278             clib_error_return (error, "%s (%u) %s", "error in txq-queue",
1279                                TX_QUEUE (i), "initialization");
1280           goto err;
1281         }
1282       else
1283         {
1284           vif->num_txqs++;
1285         }
1286     }
1287
1288   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
1289     {
1290       if ((error =
1291            virtio_pci_control_vring_init (vm, vif, vif->max_queue_pairs * 2)))
1292         {
1293           virtio_log_warning (vif, "%s (%u) %s", "error in control-queue",
1294                               vif->max_queue_pairs * 2, "initialization");
1295           if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MQ))
1296             vif->features &= ~VIRTIO_FEATURE (VIRTIO_NET_F_MQ);
1297         }
1298     }
1299   else
1300     {
1301       virtio_log_debug (vif, "control queue is not available");
1302       vif->cxq_vring = NULL;
1303     }
1304
1305   /*
1306    * set the msix interrupts
1307    */
1308   if (vif->msix_enabled == VIRTIO_MSIX_ENABLED)
1309     {
1310       int i, j;
1311       if (vif->virtio_pci_func->set_config_irq (vm, vif, 0) ==
1312           VIRTIO_MSI_NO_VECTOR)
1313         {
1314           virtio_log_warning (vif, "config vector 0 is not set");
1315         }
1316       else
1317         {
1318           virtio_log_debug (vif, "config msix vector is set at 0");
1319         }
1320       for (i = 0, j = 1; i < vif->max_queue_pairs; i++, j++)
1321         {
1322           if (vif->virtio_pci_func->set_queue_irq (vm, vif, j,
1323                                                    RX_QUEUE (i)) ==
1324               VIRTIO_MSI_NO_VECTOR)
1325             {
1326               virtio_log_warning (vif, "queue (%u) vector is not set at %u",
1327                                   RX_QUEUE (i), j);
1328             }
1329           else
1330             {
1331               virtio_log_debug (vif, "%s (%u) %s %u", "queue",
1332                                 RX_QUEUE (i), "msix vector is set at", j);
1333             }
1334         }
1335     }
1336
1337   /*
1338    * set the driver status OK
1339    */
1340   vif->virtio_pci_func->set_status (vm, vif, VIRTIO_CONFIG_STATUS_DRIVER_OK);
1341   vif->status = vif->virtio_pci_func->get_status (vm, vif);
1342 err:
1343   return error;
1344 }
1345
1346 void
1347 virtio_pci_create_if (vlib_main_t * vm, virtio_pci_create_if_args_t * args)
1348 {
1349   vnet_main_t *vnm = vnet_get_main ();
1350   virtio_main_t *vim = &virtio_main;
1351   virtio_if_t *vif;
1352   vlib_pci_dev_handle_t h;
1353   clib_error_t *error = 0;
1354   u32 interrupt_count = 0;
1355
1356   /* *INDENT-OFF* */
1357   pool_foreach (vif, vim->interfaces)  {
1358     if (vif->pci_addr.as_u32 == args->addr)
1359       {
1360         args->rv = VNET_API_ERROR_ADDRESS_IN_USE;
1361         args->error =
1362           clib_error_return (error, "PCI address in use");
1363           vlib_log (VLIB_LOG_LEVEL_ERR, vim->log_default, "%U: %s",
1364                 format_vlib_pci_addr, &args->addr,
1365                 " PCI address in use");
1366         return;
1367       }
1368   }
1369   /* *INDENT-ON* */
1370
1371   pool_get (vim->interfaces, vif);
1372   vif->dev_instance = vif - vim->interfaces;
1373   vif->per_interface_next_index = ~0;
1374   vif->pci_addr.as_u32 = args->addr;
1375   if (args->virtio_flags & VIRTIO_FLAG_PACKED)
1376     vif->is_packed = 1;
1377
1378   if ((error =
1379        vlib_pci_device_open (vm, (vlib_pci_addr_t *) & vif->pci_addr,
1380                              virtio_pci_device_ids, &h)))
1381     {
1382       args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1383       args->error =
1384         clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
1385                            &vif->pci_addr);
1386       vlib_log (VLIB_LOG_LEVEL_ERR, vim->log_default, "%U: %s",
1387                 format_vlib_pci_addr, &vif->pci_addr,
1388                 "error encountered on pci device open");
1389       pool_put (vim->interfaces, vif);
1390       return;
1391     }
1392   vif->pci_dev_handle = h;
1393   vlib_pci_set_private_data (vm, h, vif->dev_instance);
1394   vif->numa_node = vlib_pci_get_numa_node (vm, h);
1395   vif->type = VIRTIO_IF_TYPE_PCI;
1396
1397   if ((error = vlib_pci_bus_master_enable (vm, h)))
1398     {
1399       virtio_log_error (vif, "error encountered on pci bus master enable");
1400       goto error;
1401     }
1402
1403   void *bar[6];
1404   for (u32 i = 0; i <= 5; i++)
1405     {
1406
1407       if ((error = vlib_pci_map_region (vm, h, i, &bar[i])))
1408         {
1409           virtio_log_debug (vif, "no pci map region for bar %u", i);
1410         }
1411       else
1412         {
1413           virtio_log_debug (vif, "pci map region for bar %u at %p", i,
1414                             bar[i]);
1415         }
1416     }
1417
1418   if ((error = vlib_pci_io_region (vm, h, 0)))
1419     {
1420       virtio_log_error (vif, "error encountered on pci io region");
1421       goto error;
1422     }
1423
1424   interrupt_count = vlib_pci_get_num_msix_interrupts (vm, h);
1425   if (interrupt_count > 1)
1426     {
1427       if ((error = vlib_pci_register_msix_handler (vm, h, 0, 1,
1428                                                    &virtio_pci_irq_config_handler)))
1429         {
1430           args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1431           virtio_log_error (vif,
1432                             "error encountered on pci register msix handler 0");
1433           goto error;
1434         }
1435
1436       if ((error =
1437            vlib_pci_register_msix_handler (vm, h, 1, (interrupt_count - 1),
1438                                            &virtio_pci_irq_queue_handler)))
1439         {
1440           args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1441           virtio_log_error (vif,
1442                             "error encountered on pci register msix handler 1");
1443           goto error;
1444         }
1445
1446       if ((error = vlib_pci_enable_msix_irq (vm, h, 0, interrupt_count)))
1447         {
1448           virtio_log_error (vif, "error encountered on pci enable msix irq");
1449           goto error;
1450         }
1451       vif->support_int_mode = 1;
1452       virtio_log_debug (vif, "device supports msix interrupts");
1453     }
1454   else if (interrupt_count == 1)
1455     {
1456       /*
1457        * if msix table-size is 1, fall back to intX.
1458        */
1459       if ((error =
1460            vlib_pci_register_intx_handler (vm, h, &virtio_pci_irq_handler)))
1461         {
1462           virtio_log_error (vif,
1463                             "error encountered on pci register interrupt handler");
1464           goto error;
1465         }
1466       vif->support_int_mode = 1;
1467       virtio_log_debug (vif, "pci register interrupt handler");
1468     }
1469   else
1470     {
1471       /*
1472        * WARN: intX is showing some weird behaviour.
1473        * Please don't use interrupt mode with UIO driver.
1474        */
1475       vif->support_int_mode = 0;
1476       virtio_log_debug (vif, "driver is configured in poll mode only");
1477     }
1478
1479   if ((error = vlib_pci_intr_enable (vm, h)))
1480     {
1481       virtio_log_error (vif, "error encountered on pci interrupt enable");
1482       goto error;
1483     }
1484
1485   if ((error = virtio_pci_device_init (vm, vif, args, bar)))
1486     {
1487       virtio_log_error (vif, "error encountered on device init");
1488       goto error;
1489     }
1490
1491   /* create interface */
1492   error = ethernet_register_interface (vnm, virtio_device_class.index,
1493                                        vif->dev_instance, vif->mac_addr,
1494                                        &vif->hw_if_index,
1495                                        virtio_pci_flag_change);
1496
1497   if (error)
1498     {
1499       args->rv = VNET_API_ERROR_INVALID_REGISTRATION;
1500       virtio_log_error (vif,
1501                         "error encountered on ethernet register interface");
1502       goto error;
1503     }
1504
1505   vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, vif->hw_if_index);
1506   vif->sw_if_index = sw->sw_if_index;
1507   args->sw_if_index = sw->sw_if_index;
1508
1509   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, vif->hw_if_index);
1510   hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE;
1511
1512   if (args->virtio_flags & VIRTIO_FLAG_BUFFERING)
1513     {
1514       error = virtio_set_packet_buffering (vif, args->buffering_size);
1515       if (error)
1516         {
1517           args->rv = VNET_API_ERROR_INIT_FAILED;
1518           virtio_log_error (vif,
1519                             "error encountered during packet buffering init");
1520           goto error;
1521         }
1522     }
1523
1524   virtio_vring_set_rx_queues (vm, vif);
1525
1526   if (virtio_pci_is_link_up (vm, vif) & VIRTIO_NET_S_LINK_UP)
1527     {
1528       vif->flags |= VIRTIO_IF_FLAG_ADMIN_UP;
1529       vnet_hw_interface_set_flags (vnm, vif->hw_if_index,
1530                                    VNET_HW_INTERFACE_FLAG_LINK_UP);
1531     }
1532   else
1533     vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
1534
1535   virtio_pci_offloads (vm, vif, args->gso_enabled,
1536                        args->checksum_offload_enabled);
1537
1538   if ((vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ)) &&
1539       (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_MQ)))
1540     {
1541       if (virtio_pci_enable_multiqueue (vm, vif, vif->max_queue_pairs))
1542         virtio_log_warning (vif, "multiqueue is not set");
1543     }
1544   return;
1545
1546 error:
1547   virtio_pci_delete_if (vm, vif);
1548   if (args->rv == 0)
1549     args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1550   args->error = error;
1551 }
1552
1553 int
1554 virtio_pci_delete_if (vlib_main_t * vm, virtio_if_t * vif)
1555 {
1556   vnet_main_t *vnm = vnet_get_main ();
1557   virtio_main_t *vim = &virtio_main;
1558   u32 i = 0;
1559
1560   if (vif->type != VIRTIO_IF_TYPE_PCI)
1561     return VNET_API_ERROR_INVALID_INTERFACE;
1562
1563   vlib_pci_intr_disable (vm, vif->pci_dev_handle);
1564
1565   for (i = 0; i < vif->max_queue_pairs; i++)
1566     {
1567       vif->virtio_pci_func->del_queue (vm, vif, RX_QUEUE (i));
1568       vif->virtio_pci_func->del_queue (vm, vif, TX_QUEUE (i));
1569     }
1570
1571   if (vif->features & VIRTIO_FEATURE (VIRTIO_NET_F_CTRL_VQ))
1572     vif->virtio_pci_func->del_queue (vm, vif, vif->max_queue_pairs * 2);
1573
1574   if (vif->virtio_pci_func)
1575     vif->virtio_pci_func->device_reset (vm, vif);
1576
1577   if (vif->hw_if_index)
1578     {
1579       vnet_hw_interface_set_flags (vnm, vif->hw_if_index, 0);
1580       ethernet_delete_interface (vnm, vif->hw_if_index);
1581     }
1582
1583   vlib_pci_device_close (vm, vif->pci_dev_handle);
1584
1585   vec_foreach_index (i, vif->rxq_vrings)
1586   {
1587     virtio_vring_t *vring = vec_elt_at_index (vif->rxq_vrings, i);
1588     if (vring->used)
1589       {
1590         virtio_free_buffers (vm, vring);
1591       }
1592     vec_free (vring->buffers);
1593     vlib_physmem_free (vm, vring->desc);
1594   }
1595
1596   vec_foreach_index (i, vif->txq_vrings)
1597   {
1598     virtio_vring_t *vring = vec_elt_at_index (vif->txq_vrings, i);
1599     if (vring->used)
1600       {
1601         virtio_free_buffers (vm, vring);
1602       }
1603     vec_free (vring->buffers);
1604     gro_flow_table_free (vring->flow_table);
1605     virtio_vring_buffering_free (vm, vring->buffering);
1606     clib_spinlock_free (&vring->lockp);
1607     vlib_physmem_free (vm, vring->desc);
1608   }
1609
1610   if (vif->cxq_vring != NULL)
1611     {
1612       u16 last = vif->cxq_vring->last_used_idx;
1613       u16 n_left = vif->cxq_vring->used->idx - last;
1614       while (n_left)
1615         {
1616           last++;
1617           n_left--;
1618         }
1619
1620       vif->cxq_vring->last_used_idx = last;
1621       vlib_physmem_free (vm, vif->cxq_vring->desc);
1622     }
1623
1624   vec_free (vif->rxq_vrings);
1625   vec_free (vif->txq_vrings);
1626   vec_free (vif->cxq_vring);
1627
1628   clib_error_free (vif->error);
1629   memset (vif, 0, sizeof (*vif));
1630   pool_put (vim->interfaces, vif);
1631
1632   return 0;
1633 }
1634
1635 int
1636 virtio_pci_enable_disable_offloads (vlib_main_t * vm, virtio_if_t * vif,
1637                                     int gso_enabled,
1638                                     int checksum_offload_enabled,
1639                                     int offloads_disabled)
1640 {
1641   if (vif->type != VIRTIO_IF_TYPE_PCI)
1642     return VNET_API_ERROR_INVALID_INTERFACE;
1643
1644   if (gso_enabled)
1645     virtio_pci_offloads (vm, vif, 1, 0);
1646   else if (checksum_offload_enabled)
1647     virtio_pci_offloads (vm, vif, 0, 1);
1648   else if (offloads_disabled)
1649     virtio_pci_offloads (vm, vif, 0, 0);
1650
1651   return 0;
1652 }
1653
1654 /*
1655  * fd.io coding-style-patch-verification: ON
1656  *
1657  * Local Variables:
1658  * eval: (c-set-style "gnu")
1659  * End:
1660  */