avf: allocate descriptor memory from local numa
[vpp.git] / src / plugins / avf / device.c
1 /*
2  *------------------------------------------------------------------
3  * Copyright (c) 2018 Cisco and/or its affiliates.
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at:
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *------------------------------------------------------------------
16  */
17
18 #include <vlib/vlib.h>
19 #include <vppinfra/ring.h>
20 #include <vlib/unix/unix.h>
21 #include <vlib/pci/pci.h>
22 #include <vnet/ethernet/ethernet.h>
23
24 #include <avf/avf.h>
25
26 #define AVF_MBOX_LEN 64
27 #define AVF_MBOX_BUF_SZ 512
28 #define AVF_RXQ_SZ 512
29 #define AVF_TXQ_SZ 512
30 #define AVF_ITR_INT 8160
31
32 #define PCI_VENDOR_ID_INTEL                     0x8086
33 #define PCI_DEVICE_ID_INTEL_AVF                 0x1889
34 #define PCI_DEVICE_ID_INTEL_X710_VF             0x154c
35 #define PCI_DEVICE_ID_INTEL_X722_VF             0x37cd
36
37 avf_main_t avf_main;
38
39 static pci_device_id_t avf_pci_device_ids[] = {
40   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_AVF},
41   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_X710_VF},
42   {.vendor_id = PCI_VENDOR_ID_INTEL,.device_id = PCI_DEVICE_ID_INTEL_X722_VF},
43   {0},
44 };
45
46 static inline void
47 avf_irq_0_disable (avf_device_t * ad)
48 {
49   u32 dyn_ctl0 = 0, icr0_ena = 0;
50
51   dyn_ctl0 |= (3 << 3);         /* 11b = No ITR update */
52
53   avf_reg_write (ad, AVFINT_ICR0_ENA1, icr0_ena);
54   avf_reg_write (ad, AVFINT_DYN_CTL0, dyn_ctl0);
55   avf_reg_flush (ad);
56 }
57
58 static inline void
59 avf_irq_0_enable (avf_device_t * ad)
60 {
61   u32 dyn_ctl0 = 0, icr0_ena = 0;
62
63   icr0_ena |= (1 << 30);        /* [30] Admin Queue Enable */
64
65   dyn_ctl0 |= (1 << 0);         /* [0] Interrupt Enable */
66   dyn_ctl0 |= (1 << 1);         /* [1] Clear PBA */
67   //dyn_ctl0 |= (3 << 3);               /* [4:3] ITR Index, 11b = No ITR update */
68   dyn_ctl0 |= ((AVF_ITR_INT / 2) << 5); /* [16:5] ITR Interval in 2us steps */
69
70   avf_irq_0_disable (ad);
71   avf_reg_write (ad, AVFINT_ICR0_ENA1, icr0_ena);
72   avf_reg_write (ad, AVFINT_DYN_CTL0, dyn_ctl0);
73   avf_reg_flush (ad);
74 }
75
76 static inline void
77 avf_irq_n_disable (avf_device_t * ad, u8 line)
78 {
79   u32 dyn_ctln = 0;
80
81   avf_reg_write (ad, AVFINT_DYN_CTLN (line), dyn_ctln);
82   avf_reg_flush (ad);
83 }
84
85 static inline void
86 avf_irq_n_enable (avf_device_t * ad, u8 line)
87 {
88   u32 dyn_ctln = 0;
89
90   dyn_ctln |= (1 << 0);         /* [0] Interrupt Enable */
91   dyn_ctln |= (1 << 1);         /* [1] Clear PBA */
92   dyn_ctln |= ((AVF_ITR_INT / 2) << 5); /* [16:5] ITR Interval in 2us steps */
93
94   avf_irq_n_disable (ad, line);
95   avf_reg_write (ad, AVFINT_DYN_CTLN (line), dyn_ctln);
96   avf_reg_flush (ad);
97 }
98
99
100 clib_error_t *
101 avf_aq_desc_enq (vlib_main_t * vm, avf_device_t * ad, avf_aq_desc_t * dt,
102                  void *data, int len)
103 {
104   avf_main_t *am = &avf_main;
105   clib_error_t *err = 0;
106   avf_aq_desc_t *d, dc;
107   int n_retry = 5;
108
109   d = &ad->atq[ad->atq_next_slot];
110   clib_memcpy_fast (d, dt, sizeof (avf_aq_desc_t));
111   d->flags |= AVF_AQ_F_RD | AVF_AQ_F_SI;
112   if (len)
113     d->datalen = len;
114   if (len)
115     {
116       u64 pa;
117       pa = ad->atq_bufs_pa + ad->atq_next_slot * AVF_MBOX_BUF_SZ;
118       d->addr_hi = (u32) (pa >> 32);
119       d->addr_lo = (u32) pa;
120       clib_memcpy_fast (ad->atq_bufs + ad->atq_next_slot * AVF_MBOX_BUF_SZ,
121                         data, len);
122       d->flags |= AVF_AQ_F_BUF;
123     }
124
125   if (ad->flags & AVF_DEVICE_F_ELOG)
126     clib_memcpy_fast (&dc, d, sizeof (avf_aq_desc_t));
127
128   CLIB_MEMORY_BARRIER ();
129   vlib_log_debug (am->log_class, "%U", format_hexdump, data, len);
130   ad->atq_next_slot = (ad->atq_next_slot + 1) % AVF_MBOX_LEN;
131   avf_reg_write (ad, AVF_ATQT, ad->atq_next_slot);
132   avf_reg_flush (ad);
133
134 retry:
135   vlib_process_suspend (vm, 10e-6);
136
137   if (((d->flags & AVF_AQ_F_DD) == 0) || ((d->flags & AVF_AQ_F_CMP) == 0))
138     {
139       if (--n_retry == 0)
140         {
141           err = clib_error_return (0, "adminq enqueue timeout [opcode 0x%x]",
142                                    d->opcode);
143           goto done;
144         }
145       goto retry;
146     }
147
148   clib_memcpy_fast (dt, d, sizeof (avf_aq_desc_t));
149   if (d->flags & AVF_AQ_F_ERR)
150     return clib_error_return (0, "adminq enqueue error [opcode 0x%x, retval "
151                               "%d]", d->opcode, d->retval);
152
153 done:
154   if (ad->flags & AVF_DEVICE_F_ELOG)
155     {
156       /* *INDENT-OFF* */
157       ELOG_TYPE_DECLARE (el) =
158         {
159           .format = "avf[%d] aq enq: s_flags 0x%x r_flags 0x%x opcode 0x%x "
160             "datalen %d retval %d",
161           .format_args = "i4i2i2i2i2i2",
162         };
163       struct
164         {
165           u32 dev_instance;
166           u16 s_flags;
167           u16 r_flags;
168           u16 opcode;
169           u16 datalen;
170           u16 retval;
171         } *ed;
172       ed = ELOG_DATA (&vm->elog_main, el);
173       ed->dev_instance = ad->dev_instance;
174       ed->s_flags = dc.flags;
175       ed->r_flags = d->flags;
176       ed->opcode = dc.opcode;
177       ed->datalen = dc.datalen;
178       ed->retval = d->retval;
179       /* *INDENT-ON* */
180     }
181
182   return err;
183 }
184
185 clib_error_t *
186 avf_cmd_rx_ctl_reg_write (vlib_main_t * vm, avf_device_t * ad, u32 reg,
187                           u32 val)
188 {
189   clib_error_t *err;
190   avf_aq_desc_t d = {.opcode = 0x207,.param1 = reg,.param3 = val };
191   err = avf_aq_desc_enq (vm, ad, &d, 0, 0);
192
193   if (ad->flags & AVF_DEVICE_F_ELOG)
194     {
195       /* *INDENT-OFF* */
196       ELOG_TYPE_DECLARE (el) =
197         {
198           .format = "avf[%d] rx ctl reg write: reg 0x%x val 0x%x ",
199           .format_args = "i4i4i4",
200         };
201       struct
202         {
203           u32 dev_instance;
204           u32 reg;
205           u32 val;
206         } *ed;
207       ed = ELOG_DATA (&vm->elog_main, el);
208       ed->dev_instance = ad->dev_instance;
209       ed->reg = reg;
210       ed->val = val;
211       /* *INDENT-ON* */
212     }
213   return err;
214 }
215
216 clib_error_t *
217 avf_rxq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 rxq_size)
218 {
219   clib_error_t *err;
220   avf_rxq_t *rxq;
221   u32 n_alloc, i;
222
223   vec_validate_aligned (ad->rxqs, qid, CLIB_CACHE_LINE_BYTES);
224   rxq = vec_elt_at_index (ad->rxqs, qid);
225   rxq->size = rxq_size;
226   rxq->next = 0;
227   rxq->descs = vlib_physmem_alloc_aligned_on_numa (vm, rxq->size *
228                                                    sizeof (avf_rx_desc_t),
229                                                    2 * CLIB_CACHE_LINE_BYTES,
230                                                    ad->numa_node);
231
232   if (rxq->descs == 0)
233     return vlib_physmem_last_error (vm);
234
235   if ((err = vlib_pci_map_dma (vm, ad->pci_dev_handle, (void *) rxq->descs)))
236     return err;
237
238   clib_memset ((void *) rxq->descs, 0, rxq->size * sizeof (avf_rx_desc_t));
239   vec_validate_aligned (rxq->bufs, rxq->size, CLIB_CACHE_LINE_BYTES);
240   rxq->qrx_tail = ad->bar0 + AVF_QRX_TAIL (qid);
241
242   n_alloc = vlib_buffer_alloc (vm, rxq->bufs, rxq->size - 8);
243
244   if (n_alloc == 0)
245     return clib_error_return (0, "buffer allocation error");
246
247   rxq->n_enqueued = n_alloc;
248   avf_rx_desc_t *d = rxq->descs;
249   for (i = 0; i < n_alloc; i++)
250     {
251       vlib_buffer_t *b = vlib_get_buffer (vm, rxq->bufs[i]);
252       if (ad->flags & AVF_DEVICE_F_VA_DMA)
253         d->qword[0] = vlib_buffer_get_va (b);
254       else
255         d->qword[0] = vlib_buffer_get_pa (vm, b);
256       d++;
257     }
258
259   ad->n_rx_queues = clib_min (ad->num_queue_pairs, qid + 1);
260   return 0;
261 }
262
263 clib_error_t *
264 avf_txq_init (vlib_main_t * vm, avf_device_t * ad, u16 qid, u16 txq_size)
265 {
266   clib_error_t *err;
267   avf_txq_t *txq;
268
269   if (qid >= ad->num_queue_pairs)
270     {
271       qid = qid % ad->num_queue_pairs;
272       txq = vec_elt_at_index (ad->txqs, qid);
273       if (txq->lock == 0)
274         clib_spinlock_init (&txq->lock);
275       ad->flags |= AVF_DEVICE_F_SHARED_TXQ_LOCK;
276       return 0;
277     }
278
279   vec_validate_aligned (ad->txqs, qid, CLIB_CACHE_LINE_BYTES);
280   txq = vec_elt_at_index (ad->txqs, qid);
281   txq->size = txq_size;
282   txq->next = 0;
283   txq->descs = vlib_physmem_alloc_aligned_on_numa (vm, txq->size *
284                                                    sizeof (avf_tx_desc_t),
285                                                    2 * CLIB_CACHE_LINE_BYTES,
286                                                    ad->numa_node);
287   if (txq->descs == 0)
288     return vlib_physmem_last_error (vm);
289
290   if ((err = vlib_pci_map_dma (vm, ad->pci_dev_handle, (void *) txq->descs)))
291     return err;
292
293   vec_validate_aligned (txq->bufs, txq->size, CLIB_CACHE_LINE_BYTES);
294   txq->qtx_tail = ad->bar0 + AVF_QTX_TAIL (qid);
295
296   /* initialize ring of pending RS slots */
297   clib_ring_new_aligned (txq->rs_slots, 32, CLIB_CACHE_LINE_BYTES);
298
299   ad->n_tx_queues = clib_min (ad->num_queue_pairs, qid + 1);
300   return 0;
301 }
302
303 typedef struct
304 {
305   u16 vsi_id;
306   u16 flags;
307 } virtchnl_promisc_info_t;
308
309 void
310 avf_arq_slot_init (avf_device_t * ad, u16 slot)
311 {
312   avf_aq_desc_t *d;
313   u64 pa = ad->arq_bufs_pa + slot * AVF_MBOX_BUF_SZ;
314   d = &ad->arq[slot];
315   clib_memset (d, 0, sizeof (avf_aq_desc_t));
316   d->flags = AVF_AQ_F_BUF;
317   d->datalen = AVF_MBOX_BUF_SZ;
318   d->addr_hi = (u32) (pa >> 32);
319   d->addr_lo = (u32) pa;
320 }
321
322 static inline uword
323 avf_dma_addr (vlib_main_t * vm, avf_device_t * ad, void *p)
324 {
325   return (ad->flags & AVF_DEVICE_F_VA_DMA) ?
326     pointer_to_uword (p) : vlib_physmem_get_pa (vm, p);
327 }
328
329 static void
330 avf_adminq_init (vlib_main_t * vm, avf_device_t * ad)
331 {
332   u64 pa;
333   int i;
334
335   /* VF MailBox Transmit */
336   clib_memset (ad->atq, 0, sizeof (avf_aq_desc_t) * AVF_MBOX_LEN);
337   ad->atq_bufs_pa = avf_dma_addr (vm, ad, ad->atq_bufs);
338
339   pa = avf_dma_addr (vm, ad, ad->atq);
340   avf_reg_write (ad, AVF_ATQT, 0);      /* Tail */
341   avf_reg_write (ad, AVF_ATQH, 0);      /* Head */
342   avf_reg_write (ad, AVF_ATQLEN, AVF_MBOX_LEN | (1ULL << 31));  /* len & ena */
343   avf_reg_write (ad, AVF_ATQBAL, (u32) pa);     /* Base Address Low */
344   avf_reg_write (ad, AVF_ATQBAH, (u32) (pa >> 32));     /* Base Address High */
345
346   /* VF MailBox Receive */
347   clib_memset (ad->arq, 0, sizeof (avf_aq_desc_t) * AVF_MBOX_LEN);
348   ad->arq_bufs_pa = avf_dma_addr (vm, ad, ad->arq_bufs);
349
350   for (i = 0; i < AVF_MBOX_LEN; i++)
351     avf_arq_slot_init (ad, i);
352
353   pa = avf_dma_addr (vm, ad, ad->arq);
354
355   avf_reg_write (ad, AVF_ARQH, 0);      /* Head */
356   avf_reg_write (ad, AVF_ARQT, 0);      /* Head */
357   avf_reg_write (ad, AVF_ARQLEN, AVF_MBOX_LEN | (1ULL << 31));  /* len & ena */
358   avf_reg_write (ad, AVF_ARQBAL, (u32) pa);     /* Base Address Low */
359   avf_reg_write (ad, AVF_ARQBAH, (u32) (pa >> 32));     /* Base Address High */
360   avf_reg_write (ad, AVF_ARQT, AVF_MBOX_LEN - 1);       /* Tail */
361
362   ad->atq_next_slot = 0;
363   ad->arq_next_slot = 0;
364 }
365
366 clib_error_t *
367 avf_send_to_pf (vlib_main_t * vm, avf_device_t * ad, virtchnl_ops_t op,
368                 void *in, int in_len, void *out, int out_len)
369 {
370   clib_error_t *err;
371   avf_aq_desc_t *d, dt = {.opcode = 0x801,.v_opcode = op };
372   u32 head;
373   int n_retry = 5;
374
375
376   /* supppres interrupt in the next adminq receive slot
377      as we are going to wait for response
378      we only need interrupts when event is received */
379   d = &ad->arq[ad->arq_next_slot];
380   d->flags |= AVF_AQ_F_SI;
381
382   if ((err = avf_aq_desc_enq (vm, ad, &dt, in, in_len)))
383     return err;
384
385 retry:
386   head = avf_get_u32 (ad->bar0, AVF_ARQH);
387
388   if (ad->arq_next_slot == head)
389     {
390       if (--n_retry == 0)
391         return clib_error_return (0, "timeout");
392       vlib_process_suspend (vm, 10e-3);
393       goto retry;
394     }
395
396   d = &ad->arq[ad->arq_next_slot];
397
398   if (d->v_opcode == VIRTCHNL_OP_EVENT)
399     {
400       void *buf = ad->arq_bufs + ad->arq_next_slot * AVF_MBOX_BUF_SZ;
401       virtchnl_pf_event_t *e;
402
403       if ((d->datalen != sizeof (virtchnl_pf_event_t)) ||
404           ((d->flags & AVF_AQ_F_BUF) == 0))
405         return clib_error_return (0, "event message error");
406
407       vec_add2 (ad->events, e, 1);
408       clib_memcpy_fast (e, buf, sizeof (virtchnl_pf_event_t));
409       avf_arq_slot_init (ad, ad->arq_next_slot);
410       ad->arq_next_slot++;
411       n_retry = 5;
412       goto retry;
413     }
414
415   if (d->v_opcode != op)
416     {
417       err =
418         clib_error_return (0,
419                            "unexpected message receiver [v_opcode = %u, "
420                            "expected %u, v_retval %d]", d->v_opcode, op,
421                            d->v_retval);
422       goto done;
423     }
424
425   if (d->v_retval)
426     {
427       err = clib_error_return (0, "error [v_opcode = %u, v_retval %d]",
428                                d->v_opcode, d->v_retval);
429       goto done;
430     }
431
432   if (d->flags & AVF_AQ_F_BUF)
433     {
434       void *buf = ad->arq_bufs + ad->arq_next_slot * AVF_MBOX_BUF_SZ;
435       clib_memcpy_fast (out, buf, out_len);
436     }
437
438   avf_arq_slot_init (ad, ad->arq_next_slot);
439   avf_reg_write (ad, AVF_ARQT, ad->arq_next_slot);
440   avf_reg_flush (ad);
441   ad->arq_next_slot = (ad->arq_next_slot + 1) % AVF_MBOX_LEN;
442
443 done:
444
445   if (ad->flags & AVF_DEVICE_F_ELOG)
446     {
447       /* *INDENT-OFF* */
448       ELOG_TYPE_DECLARE (el) =
449         {
450           .format = "avf[%d] send to pf: v_opcode %s (%d) v_retval 0x%x",
451           .format_args = "i4t4i4i4",
452           .n_enum_strings = VIRTCHNL_N_OPS,
453           .enum_strings = {
454 #define _(v, n) [v] = #n,
455               foreach_virtchnl_op
456 #undef _
457           },
458         };
459       struct
460         {
461           u32 dev_instance;
462           u32 v_opcode;
463           u32 v_opcode_val;
464           u32 v_retval;
465         } *ed;
466       ed = ELOG_DATA (&vm->elog_main, el);
467       ed->dev_instance = ad->dev_instance;
468       ed->v_opcode = op;
469       ed->v_opcode_val = op;
470       ed->v_retval = d->v_retval;
471       /* *INDENT-ON* */
472     }
473   return err;
474 }
475
476 clib_error_t *
477 avf_op_version (vlib_main_t * vm, avf_device_t * ad,
478                 virtchnl_version_info_t * ver)
479 {
480   clib_error_t *err = 0;
481   virtchnl_version_info_t myver = {
482     .major = VIRTCHNL_VERSION_MAJOR,
483     .minor = VIRTCHNL_VERSION_MINOR,
484   };
485
486   err = avf_send_to_pf (vm, ad, VIRTCHNL_OP_VERSION, &myver,
487                         sizeof (virtchnl_version_info_t), ver,
488                         sizeof (virtchnl_version_info_t));
489
490   if (err)
491     return err;
492
493   return err;
494 }
495
496 clib_error_t *
497 avf_op_get_vf_resources (vlib_main_t * vm, avf_device_t * ad,
498                          virtchnl_vf_resource_t * res)
499 {
500   u32 bitmap = (VIRTCHNL_VF_OFFLOAD_L2 | VIRTCHNL_VF_OFFLOAD_RSS_PF |
501                 VIRTCHNL_VF_OFFLOAD_WB_ON_ITR | VIRTCHNL_VF_OFFLOAD_VLAN |
502                 VIRTCHNL_VF_OFFLOAD_RX_POLLING);
503
504   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_VF_RESOURCES, &bitmap,
505                          sizeof (u32), res, sizeof (virtchnl_vf_resource_t));
506 }
507
508 clib_error_t *
509 avf_op_config_rss_lut (vlib_main_t * vm, avf_device_t * ad)
510 {
511   int msg_len = sizeof (virtchnl_rss_lut_t) + ad->rss_lut_size - 1;
512   int i;
513   u8 msg[msg_len];
514   virtchnl_rss_lut_t *rl;
515
516   clib_memset (msg, 0, msg_len);
517   rl = (virtchnl_rss_lut_t *) msg;
518   rl->vsi_id = ad->vsi_id;
519   rl->lut_entries = ad->rss_lut_size;
520   for (i = 0; i < ad->rss_lut_size; i++)
521     rl->lut[i] = i % ad->n_rx_queues;
522
523   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_RSS_LUT, msg, msg_len, 0,
524                          0);
525 }
526
527 clib_error_t *
528 avf_op_config_rss_key (vlib_main_t * vm, avf_device_t * ad)
529 {
530   int msg_len = sizeof (virtchnl_rss_key_t) + ad->rss_key_size - 1;
531   int i;
532   u8 msg[msg_len];
533   virtchnl_rss_key_t *rk;
534
535   clib_memset (msg, 0, msg_len);
536   rk = (virtchnl_rss_key_t *) msg;
537   rk->vsi_id = ad->vsi_id;
538   rk->key_len = ad->rss_key_size;
539   u32 seed = random_default_seed ();
540   for (i = 0; i < ad->rss_key_size; i++)
541     rk->key[i] = (u8) random_u32 (&seed);
542
543   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_RSS_KEY, msg, msg_len, 0,
544                          0);
545 }
546
547 clib_error_t *
548 avf_op_disable_vlan_stripping (vlib_main_t * vm, avf_device_t * ad)
549 {
550   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_DISABLE_VLAN_STRIPPING, 0, 0, 0,
551                          0);
552 }
553
554 clib_error_t *
555 avf_config_promisc_mode (vlib_main_t * vm, avf_device_t * ad)
556 {
557   virtchnl_promisc_info_t pi = { 0 };
558
559   pi.vsi_id = ad->vsi_id;
560   pi.flags = 1;
561   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_PROMISCUOUS_MODE, &pi,
562                          sizeof (virtchnl_promisc_info_t), 0, 0);
563 }
564
565
566 clib_error_t *
567 avf_op_config_vsi_queues (vlib_main_t * vm, avf_device_t * ad)
568 {
569   int i;
570   int n_qp = clib_max (vec_len (ad->rxqs), vec_len (ad->txqs));
571   int msg_len = sizeof (virtchnl_vsi_queue_config_info_t) + n_qp *
572     sizeof (virtchnl_queue_pair_info_t);
573   u8 msg[msg_len];
574   virtchnl_vsi_queue_config_info_t *ci;
575
576   clib_memset (msg, 0, msg_len);
577   ci = (virtchnl_vsi_queue_config_info_t *) msg;
578   ci->vsi_id = ad->vsi_id;
579   ci->num_queue_pairs = n_qp;
580
581   for (i = 0; i < n_qp; i++)
582     {
583       virtchnl_txq_info_t *txq = &ci->qpair[i].txq;
584       virtchnl_rxq_info_t *rxq = &ci->qpair[i].rxq;
585
586       rxq->vsi_id = ad->vsi_id;
587       rxq->queue_id = i;
588       rxq->max_pkt_size = ETHERNET_MAX_PACKET_BYTES;
589       if (i < vec_len (ad->rxqs))
590         {
591           avf_rxq_t *q = vec_elt_at_index (ad->rxqs, i);
592           rxq->ring_len = q->size;
593           rxq->databuffer_size = VLIB_BUFFER_DEFAULT_FREE_LIST_BYTES;
594           rxq->dma_ring_addr = avf_dma_addr (vm, ad, (void *) q->descs);
595           avf_reg_write (ad, AVF_QRX_TAIL (i), q->size - 1);
596         }
597
598       avf_txq_t *q = vec_elt_at_index (ad->txqs, i);
599       txq->vsi_id = ad->vsi_id;
600       if (i < vec_len (ad->txqs))
601         {
602           txq->queue_id = i;
603           txq->ring_len = q->size;
604           txq->dma_ring_addr = avf_dma_addr (vm, ad, (void *) q->descs);
605         }
606     }
607
608   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_VSI_QUEUES, msg, msg_len,
609                          0, 0);
610 }
611
612 clib_error_t *
613 avf_op_config_irq_map (vlib_main_t * vm, avf_device_t * ad)
614 {
615   int count = 1;
616   int msg_len = sizeof (virtchnl_irq_map_info_t) +
617     count * sizeof (virtchnl_vector_map_t);
618   u8 msg[msg_len];
619   virtchnl_irq_map_info_t *imi;
620
621   clib_memset (msg, 0, msg_len);
622   imi = (virtchnl_irq_map_info_t *) msg;
623   imi->num_vectors = count;
624
625   imi->vecmap[0].vector_id = 1;
626   imi->vecmap[0].vsi_id = ad->vsi_id;
627   imi->vecmap[0].rxq_map = 1;
628   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_CONFIG_IRQ_MAP, msg, msg_len, 0,
629                          0);
630 }
631
632 clib_error_t *
633 avf_op_add_eth_addr (vlib_main_t * vm, avf_device_t * ad, u8 count, u8 * macs)
634 {
635   int msg_len =
636     sizeof (virtchnl_ether_addr_list_t) +
637     count * sizeof (virtchnl_ether_addr_t);
638   u8 msg[msg_len];
639   virtchnl_ether_addr_list_t *al;
640   int i;
641
642   clib_memset (msg, 0, msg_len);
643   al = (virtchnl_ether_addr_list_t *) msg;
644   al->vsi_id = ad->vsi_id;
645   al->num_elements = count;
646   for (i = 0; i < count; i++)
647     clib_memcpy_fast (&al->list[i].addr, macs + i * 6, 6);
648   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_ADD_ETH_ADDR, msg, msg_len, 0,
649                          0);
650 }
651
652 clib_error_t *
653 avf_op_enable_queues (vlib_main_t * vm, avf_device_t * ad, u32 rx, u32 tx)
654 {
655   virtchnl_queue_select_t qs = { 0 };
656   int i;
657   qs.vsi_id = ad->vsi_id;
658   qs.rx_queues = rx;
659   qs.tx_queues = tx;
660   for (i = 0; i < ad->n_rx_queues; i++)
661     {
662       avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, i);
663       avf_reg_write (ad, AVF_QRX_TAIL (i), rxq->n_enqueued);
664     }
665   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_ENABLE_QUEUES, &qs,
666                          sizeof (virtchnl_queue_select_t), 0, 0);
667 }
668
669 clib_error_t *
670 avf_op_get_stats (vlib_main_t * vm, avf_device_t * ad,
671                   virtchnl_eth_stats_t * es)
672 {
673   virtchnl_queue_select_t qs = { 0 };
674   qs.vsi_id = ad->vsi_id;
675   return avf_send_to_pf (vm, ad, VIRTCHNL_OP_GET_STATS,
676                          &qs, sizeof (virtchnl_queue_select_t),
677                          es, sizeof (virtchnl_eth_stats_t));
678 }
679
680 clib_error_t *
681 avf_device_reset (vlib_main_t * vm, avf_device_t * ad)
682 {
683   avf_aq_desc_t d = { 0 };
684   clib_error_t *error;
685   u32 rstat;
686   int n_retry = 20;
687
688   d.opcode = 0x801;
689   d.v_opcode = VIRTCHNL_OP_RESET_VF;
690   if ((error = avf_aq_desc_enq (vm, ad, &d, 0, 0)))
691     return error;
692
693 retry:
694   vlib_process_suspend (vm, 10e-3);
695   rstat = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
696
697   if (rstat == 2 || rstat == 3)
698     return 0;
699
700   if (--n_retry == 0)
701     return clib_error_return (0, "reset failed (timeout)");
702
703   goto retry;
704 }
705
706 clib_error_t *
707 avf_request_queues (vlib_main_t * vm, avf_device_t * ad, u16 num_queue_pairs)
708 {
709   virtchnl_vf_res_request_t res_req = { 0 };
710   clib_error_t *error;
711   u32 rstat;
712   int n_retry = 20;
713
714   res_req.num_queue_pairs = num_queue_pairs;
715
716   error = avf_send_to_pf (vm, ad, VIRTCHNL_OP_REQUEST_QUEUES, &res_req,
717                           sizeof (virtchnl_vf_res_request_t), &res_req,
718                           sizeof (virtchnl_vf_res_request_t));
719
720   /*
721    * if PF respondes, the request failed
722    * else PF initializes restart and avf_send_to_pf returns an error
723    */
724   if (!error)
725     {
726       return clib_error_return (0, "requested more than %u queue pairs",
727                                 res_req.num_queue_pairs);
728     }
729
730 retry:
731   vlib_process_suspend (vm, 10e-3);
732   rstat = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
733
734   if ((rstat == VIRTCHNL_VFR_COMPLETED) || (rstat == VIRTCHNL_VFR_VFACTIVE))
735     goto done;
736
737   if (--n_retry == 0)
738     return clib_error_return (0, "reset failed (timeout)");
739
740   goto retry;
741
742 done:
743   return NULL;
744 }
745
746 clib_error_t *
747 avf_device_init (vlib_main_t * vm, avf_main_t * am, avf_device_t * ad,
748                  avf_create_if_args_t * args)
749 {
750   virtchnl_version_info_t ver = { 0 };
751   virtchnl_vf_resource_t res = { 0 };
752   clib_error_t *error;
753   vlib_thread_main_t *tm = vlib_get_thread_main ();
754   int i;
755
756   avf_adminq_init (vm, ad);
757
758   /* request more queues only if we need them */
759   if ((error = avf_request_queues (vm, ad, tm->n_vlib_mains)))
760     {
761       /* we failed to get more queues, but still we want to proceed */
762       clib_error_free (error);
763
764       if ((error = avf_device_reset (vm, ad)))
765         return error;
766     }
767
768   avf_adminq_init (vm, ad);
769
770   /*
771    * OP_VERSION
772    */
773   if ((error = avf_op_version (vm, ad, &ver)))
774     return error;
775
776   if (ver.major != VIRTCHNL_VERSION_MAJOR ||
777       ver.minor != VIRTCHNL_VERSION_MINOR)
778     return clib_error_return (0, "incompatible protocol version "
779                               "(remote %d.%d)", ver.major, ver.minor);
780
781   /*
782    * OP_GET_VF_RESOUCES
783    */
784   if ((error = avf_op_get_vf_resources (vm, ad, &res)))
785     return error;
786
787   if (res.num_vsis != 1 || res.vsi_res[0].vsi_type != VIRTCHNL_VSI_SRIOV)
788     return clib_error_return (0, "unexpected GET_VF_RESOURCE reply received");
789
790   ad->vsi_id = res.vsi_res[0].vsi_id;
791   ad->feature_bitmap = res.vf_offload_flags;
792   ad->num_queue_pairs = res.num_queue_pairs;
793   ad->max_vectors = res.max_vectors;
794   ad->max_mtu = res.max_mtu;
795   ad->rss_key_size = res.rss_key_size;
796   ad->rss_lut_size = res.rss_lut_size;
797
798   clib_memcpy_fast (ad->hwaddr, res.vsi_res[0].default_mac_addr, 6);
799
800   /*
801    * Disable VLAN stripping
802    */
803   if ((error = avf_op_disable_vlan_stripping (vm, ad)))
804     return error;
805
806   if ((error = avf_config_promisc_mode (vm, ad)))
807     return error;
808
809   /*
810    * Init Queues
811    */
812   if (args->rxq_num == 0)
813     {
814       args->rxq_num = 1;
815     }
816   else if (args->rxq_num > ad->num_queue_pairs)
817     {
818       args->rxq_num = ad->num_queue_pairs;
819       vlib_log_warn (am->log_class, "Requested more rx queues than"
820                      "queue pairs available. Using %u rx queues.",
821                      args->rxq_num);
822     }
823
824   for (i = 0; i < args->rxq_num; i++)
825     if ((error = avf_rxq_init (vm, ad, i, args->rxq_size)))
826       return error;
827
828   for (i = 0; i < tm->n_vlib_mains; i++)
829     if ((error = avf_txq_init (vm, ad, i, args->txq_size)))
830       return error;
831
832   if ((ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
833       (error = avf_op_config_rss_lut (vm, ad)))
834     return error;
835
836   if ((ad->feature_bitmap & VIRTCHNL_VF_OFFLOAD_RSS_PF) &&
837       (error = avf_op_config_rss_key (vm, ad)))
838     return error;
839
840   if ((error = avf_op_config_vsi_queues (vm, ad)))
841     return error;
842
843   if ((error = avf_op_config_irq_map (vm, ad)))
844     return error;
845
846   avf_irq_0_enable (ad);
847   for (i = 0; i < ad->n_rx_queues; i++)
848     avf_irq_n_enable (ad, i);
849
850   if ((error = avf_op_add_eth_addr (vm, ad, 1, ad->hwaddr)))
851     return error;
852
853   if ((error = avf_op_enable_queues (vm, ad, ad->n_rx_queues, 0)))
854     return error;
855
856   if ((error = avf_op_enable_queues (vm, ad, 0, ad->n_tx_queues)))
857     return error;
858
859   ad->flags |= AVF_DEVICE_F_INITIALIZED;
860   return error;
861 }
862
863 void
864 avf_process_one_device (vlib_main_t * vm, avf_device_t * ad, int is_irq)
865 {
866   avf_main_t *am = &avf_main;
867   vnet_main_t *vnm = vnet_get_main ();
868   virtchnl_pf_event_t *e;
869   u32 r;
870
871   if (ad->flags & AVF_DEVICE_F_ERROR)
872     return;
873
874   if ((ad->flags & AVF_DEVICE_F_INITIALIZED) == 0)
875     return;
876
877   ASSERT (ad->error == 0);
878
879   /* do not process device in reset state */
880   r = avf_get_u32 (ad->bar0, AVFGEN_RSTAT);
881   if (r != VIRTCHNL_VFR_VFACTIVE)
882     return;
883
884   r = avf_get_u32 (ad->bar0, AVF_ARQLEN);
885   if ((r & 0xf0000000) != (1ULL << 31))
886     {
887       ad->error = clib_error_return (0, "arq not enabled, arqlen = 0x%x", r);
888       goto error;
889     }
890
891   r = avf_get_u32 (ad->bar0, AVF_ATQLEN);
892   if ((r & 0xf0000000) != (1ULL << 31))
893     {
894       ad->error = clib_error_return (0, "atq not enabled, atqlen = 0x%x", r);
895       goto error;
896     }
897
898   if (is_irq == 0)
899     avf_op_get_stats (vm, ad, &ad->eth_stats);
900
901   /* *INDENT-OFF* */
902   vec_foreach (e, ad->events)
903     {
904       if (e->event == VIRTCHNL_EVENT_LINK_CHANGE)
905         {
906           int link_up = e->event_data.link_event.link_status;
907           virtchnl_link_speed_t speed = e->event_data.link_event.link_speed;
908           u32 flags = 0;
909           u32 kbps = 0;
910
911           if (link_up && (ad->flags & AVF_DEVICE_F_LINK_UP) == 0)
912             {
913               ad->flags |= AVF_DEVICE_F_LINK_UP;
914               flags |= (VNET_HW_INTERFACE_FLAG_FULL_DUPLEX |
915                         VNET_HW_INTERFACE_FLAG_LINK_UP);
916               if (speed == VIRTCHNL_LINK_SPEED_40GB)
917                 kbps = 40000000;
918               else if (speed == VIRTCHNL_LINK_SPEED_25GB)
919                 kbps = 25000000;
920               else if (speed == VIRTCHNL_LINK_SPEED_10GB)
921                 kbps = 10000000;
922               else if (speed == VIRTCHNL_LINK_SPEED_1GB)
923                 kbps = 1000000;
924               else if (speed == VIRTCHNL_LINK_SPEED_100MB)
925                 kbps = 100000;
926               vnet_hw_interface_set_flags (vnm, ad->hw_if_index, flags);
927               vnet_hw_interface_set_link_speed (vnm, ad->hw_if_index, kbps);
928               ad->link_speed = speed;
929             }
930           else if (!link_up && (ad->flags & AVF_DEVICE_F_LINK_UP) != 0)
931             {
932               ad->flags &= ~AVF_DEVICE_F_LINK_UP;
933               ad->link_speed = 0;
934             }
935
936           if (ad->flags & AVF_DEVICE_F_ELOG)
937             {
938               ELOG_TYPE_DECLARE (el) =
939                 {
940                   .format = "avf[%d] link change: link_status %d "
941                     "link_speed %d",
942                   .format_args = "i4i1i1",
943                 };
944               struct
945                 {
946                   u32 dev_instance;
947                   u8 link_status;
948                   u8 link_speed;
949                 } *ed;
950               ed = ELOG_DATA (&vm->elog_main, el);
951               ed->dev_instance = ad->dev_instance;
952               ed->link_status = link_up;
953               ed->link_speed = speed;
954             }
955         }
956       else
957         {
958           if (ad->flags & AVF_DEVICE_F_ELOG)
959             {
960               ELOG_TYPE_DECLARE (el) =
961                 {
962                   .format = "avf[%d] unknown event: event %d severity %d",
963                   .format_args = "i4i4i1i1",
964                 };
965               struct
966                 {
967                   u32 dev_instance;
968                   u32 event;
969                   u32 severity;
970                 } *ed;
971               ed = ELOG_DATA (&vm->elog_main, el);
972               ed->dev_instance = ad->dev_instance;
973               ed->event = e->event;
974               ed->severity = e->severity;
975             }
976         }
977     }
978   /* *INDENT-ON* */
979   vec_reset_length (ad->events);
980
981   return;
982
983 error:
984   ad->flags |= AVF_DEVICE_F_ERROR;
985   ASSERT (ad->error != 0);
986   vlib_log_err (am->log_class, "%U", format_clib_error, ad->error);
987 }
988
989 static u32
990 avf_flag_change (vnet_main_t * vnm, vnet_hw_interface_t * hw, u32 flags)
991 {
992   avf_main_t *am = &avf_main;
993   vlib_log_warn (am->log_class, "TODO");
994   return 0;
995 }
996
997 static uword
998 avf_process (vlib_main_t * vm, vlib_node_runtime_t * rt, vlib_frame_t * f)
999 {
1000   avf_main_t *am = &avf_main;
1001   avf_device_t *ad;
1002   uword *event_data = 0, event_type;
1003   int enabled = 0, irq;
1004   f64 last_run_duration = 0;
1005   f64 last_periodic_time = 0;
1006
1007   while (1)
1008     {
1009       if (enabled)
1010         vlib_process_wait_for_event_or_clock (vm, 5.0 - last_run_duration);
1011       else
1012         vlib_process_wait_for_event (vm);
1013
1014       event_type = vlib_process_get_events (vm, &event_data);
1015       vec_reset_length (event_data);
1016       irq = 0;
1017
1018       switch (event_type)
1019         {
1020         case ~0:
1021           last_periodic_time = vlib_time_now (vm);
1022           break;
1023         case AVF_PROCESS_EVENT_START:
1024           enabled = 1;
1025           break;
1026         case AVF_PROCESS_EVENT_STOP:
1027           enabled = 0;
1028           continue;
1029         case AVF_PROCESS_EVENT_AQ_INT:
1030           irq = 1;
1031           break;
1032         default:
1033           ASSERT (0);
1034         }
1035
1036       /* *INDENT-OFF* */
1037       pool_foreach (ad, am->devices,
1038         {
1039           avf_process_one_device (vm, ad, irq);
1040         });
1041       /* *INDENT-ON* */
1042       last_run_duration = vlib_time_now (vm) - last_periodic_time;
1043     }
1044   return 0;
1045 }
1046
1047 /* *INDENT-OFF* */
1048 VLIB_REGISTER_NODE (avf_process_node, static)  = {
1049   .function = avf_process,
1050   .type = VLIB_NODE_TYPE_PROCESS,
1051   .name = "avf-process",
1052 };
1053 /* *INDENT-ON* */
1054
1055 static void
1056 avf_irq_0_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line)
1057 {
1058   avf_main_t *am = &avf_main;
1059   uword pd = vlib_pci_get_private_data (vm, h);
1060   avf_device_t *ad = pool_elt_at_index (am->devices, pd);
1061   u32 icr0;
1062
1063   icr0 = avf_reg_read (ad, AVFINT_ICR0);
1064
1065   if (ad->flags & AVF_DEVICE_F_ELOG)
1066     {
1067       /* *INDENT-OFF* */
1068       ELOG_TYPE_DECLARE (el) =
1069         {
1070           .format = "avf[%d] irq 0: icr0 0x%x",
1071           .format_args = "i4i4",
1072         };
1073       /* *INDENT-ON* */
1074       struct
1075       {
1076         u32 dev_instance;
1077         u32 icr0;
1078       } *ed;
1079
1080       ed = ELOG_DATA (&vm->elog_main, el);
1081       ed->dev_instance = ad->dev_instance;
1082       ed->icr0 = icr0;
1083     }
1084
1085   avf_irq_0_enable (ad);
1086
1087   /* bit 30 - Send/Receive Admin queue interrupt indication */
1088   if (icr0 & (1 << 30))
1089     vlib_process_signal_event (vm, avf_process_node.index,
1090                                AVF_PROCESS_EVENT_AQ_INT, 0);
1091 }
1092
1093 static void
1094 avf_irq_n_handler (vlib_main_t * vm, vlib_pci_dev_handle_t h, u16 line)
1095 {
1096   vnet_main_t *vnm = vnet_get_main ();
1097   avf_main_t *am = &avf_main;
1098   uword pd = vlib_pci_get_private_data (vm, h);
1099   avf_device_t *ad = pool_elt_at_index (am->devices, pd);
1100   u16 qid;
1101   int i;
1102
1103   if (ad->flags & AVF_DEVICE_F_ELOG)
1104     {
1105       /* *INDENT-OFF* */
1106       ELOG_TYPE_DECLARE (el) =
1107         {
1108           .format = "avf[%d] irq %d: received",
1109           .format_args = "i4i2",
1110         };
1111       /* *INDENT-ON* */
1112       struct
1113       {
1114         u32 dev_instance;
1115         u16 line;
1116       } *ed;
1117
1118       ed = ELOG_DATA (&vm->elog_main, el);
1119       ed->dev_instance = ad->dev_instance;
1120       ed->line = line;
1121     }
1122
1123   qid = line - 1;
1124   if (vec_len (ad->rxqs) > qid && ad->rxqs[qid].int_mode != 0)
1125     vnet_device_input_set_interrupt_pending (vnm, ad->hw_if_index, qid);
1126   for (i = 0; i < vec_len (ad->rxqs); i++)
1127     avf_irq_n_enable (ad, i);
1128 }
1129
1130 void
1131 avf_delete_if (vlib_main_t * vm, avf_device_t * ad)
1132 {
1133   vnet_main_t *vnm = vnet_get_main ();
1134   avf_main_t *am = &avf_main;
1135   int i;
1136
1137   if (ad->hw_if_index)
1138     {
1139       vnet_hw_interface_set_flags (vnm, ad->hw_if_index, 0);
1140       vnet_hw_interface_unassign_rx_thread (vnm, ad->hw_if_index, 0);
1141       ethernet_delete_interface (vnm, ad->hw_if_index);
1142     }
1143
1144   vlib_pci_device_close (vm, ad->pci_dev_handle);
1145
1146   vlib_physmem_free (vm, ad->atq);
1147   vlib_physmem_free (vm, ad->arq);
1148   vlib_physmem_free (vm, ad->atq_bufs);
1149   vlib_physmem_free (vm, ad->arq_bufs);
1150
1151   /* *INDENT-OFF* */
1152   vec_foreach_index (i, ad->rxqs)
1153     {
1154       avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, i);
1155       vlib_physmem_free (vm, (void *) rxq->descs);
1156       if (rxq->n_enqueued)
1157         vlib_buffer_free_from_ring (vm, rxq->bufs, rxq->next, rxq->size,
1158                                     rxq->n_enqueued);
1159       vec_free (rxq->bufs);
1160     }
1161   /* *INDENT-ON* */
1162   vec_free (ad->rxqs);
1163
1164   /* *INDENT-OFF* */
1165   vec_foreach_index (i, ad->txqs)
1166     {
1167       avf_txq_t *txq = vec_elt_at_index (ad->txqs, i);
1168       vlib_physmem_free (vm, (void *) txq->descs);
1169       if (txq->n_enqueued)
1170         {
1171           u16 first = (txq->next - txq->n_enqueued) & (txq->size -1);
1172           vlib_buffer_free_from_ring (vm, txq->bufs, first, txq->size,
1173                                       txq->n_enqueued);
1174         }
1175       vec_free (txq->bufs);
1176       clib_ring_free (txq->rs_slots);
1177     }
1178   /* *INDENT-ON* */
1179   vec_free (ad->txqs);
1180   vec_free (ad->name);
1181
1182   clib_error_free (ad->error);
1183   clib_memset (ad, 0, sizeof (*ad));
1184   pool_put (am->devices, ad);
1185 }
1186
1187 void
1188 avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args)
1189 {
1190   vnet_main_t *vnm = vnet_get_main ();
1191   avf_main_t *am = &avf_main;
1192   avf_device_t *ad;
1193   vlib_pci_dev_handle_t h;
1194   clib_error_t *error = 0;
1195   int i;
1196
1197   /* check input args */
1198   args->rxq_size = (args->rxq_size == 0) ? AVF_RXQ_SZ : args->rxq_size;
1199   args->txq_size = (args->txq_size == 0) ? AVF_TXQ_SZ : args->txq_size;
1200
1201   if ((args->rxq_size & (args->rxq_size - 1))
1202       || (args->txq_size & (args->txq_size - 1)))
1203     {
1204       args->rv = VNET_API_ERROR_INVALID_VALUE;
1205       args->error =
1206         clib_error_return (error, "queue size must be a power of two");
1207       return;
1208     }
1209
1210   pool_get (am->devices, ad);
1211   ad->dev_instance = ad - am->devices;
1212   ad->per_interface_next_index = ~0;
1213   ad->name = vec_dup (args->name);
1214
1215   if (args->enable_elog)
1216     ad->flags |= AVF_DEVICE_F_ELOG;
1217
1218   if ((error = vlib_pci_device_open (vm, &args->addr, avf_pci_device_ids,
1219                                      &h)))
1220     {
1221       pool_put (am->devices, ad);
1222       args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1223       args->error =
1224         clib_error_return (error, "pci-addr %U", format_vlib_pci_addr,
1225                            &args->addr);
1226       return;
1227     }
1228   ad->pci_dev_handle = h;
1229   ad->numa_node = vlib_pci_get_numa_node (vm, h);
1230
1231   vlib_pci_set_private_data (vm, h, ad->dev_instance);
1232
1233   if ((error = vlib_pci_bus_master_enable (vm, h)))
1234     goto error;
1235
1236   if ((error = vlib_pci_map_region (vm, h, 0, &ad->bar0)))
1237     goto error;
1238
1239   if ((error = vlib_pci_register_msix_handler (vm, h, 0, 1,
1240                                                &avf_irq_0_handler)))
1241     goto error;
1242
1243   if ((error = vlib_pci_register_msix_handler (vm, h, 1, 1,
1244                                                &avf_irq_n_handler)))
1245     goto error;
1246
1247   if ((error = vlib_pci_enable_msix_irq (vm, h, 0, 2)))
1248     goto error;
1249
1250   ad->atq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
1251                                                 AVF_MBOX_LEN,
1252                                                 CLIB_CACHE_LINE_BYTES,
1253                                                 ad->numa_node);
1254   if (ad->atq == 0)
1255     {
1256       error = vlib_physmem_last_error (vm);
1257       goto error;
1258     }
1259
1260   if ((error = vlib_pci_map_dma (vm, h, ad->atq)))
1261     goto error;
1262
1263   ad->arq = vlib_physmem_alloc_aligned_on_numa (vm, sizeof (avf_aq_desc_t) *
1264                                                 AVF_MBOX_LEN,
1265                                                 CLIB_CACHE_LINE_BYTES,
1266                                                 ad->numa_node);
1267   if (ad->arq == 0)
1268     {
1269       error = vlib_physmem_last_error (vm);
1270       goto error;
1271     }
1272
1273   if ((error = vlib_pci_map_dma (vm, h, ad->arq)))
1274     goto error;
1275
1276   ad->atq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
1277                                                      AVF_MBOX_LEN,
1278                                                      CLIB_CACHE_LINE_BYTES,
1279                                                      ad->numa_node);
1280   if (ad->atq_bufs == 0)
1281     {
1282       error = vlib_physmem_last_error (vm);
1283       goto error;
1284     }
1285
1286   if ((error = vlib_pci_map_dma (vm, h, ad->atq_bufs)))
1287     goto error;
1288
1289   ad->arq_bufs = vlib_physmem_alloc_aligned_on_numa (vm, AVF_MBOX_BUF_SZ *
1290                                                      AVF_MBOX_LEN,
1291                                                      CLIB_CACHE_LINE_BYTES,
1292                                                      ad->numa_node);
1293   if (ad->arq_bufs == 0)
1294     {
1295       error = vlib_physmem_last_error (vm);
1296       goto error;
1297     }
1298
1299   if ((error = vlib_pci_map_dma (vm, h, ad->arq_bufs)))
1300     goto error;
1301
1302   if ((error = vlib_pci_intr_enable (vm, h)))
1303     goto error;
1304
1305   if (vlib_pci_supports_virtual_addr_dma (vm, h))
1306     ad->flags |= AVF_DEVICE_F_VA_DMA;
1307
1308   if ((error = avf_device_init (vm, am, ad, args)))
1309     goto error;
1310
1311   /* create interface */
1312   error = ethernet_register_interface (vnm, avf_device_class.index,
1313                                        ad->dev_instance, ad->hwaddr,
1314                                        &ad->hw_if_index, avf_flag_change);
1315
1316   if (error)
1317     goto error;
1318
1319   vnet_sw_interface_t *sw = vnet_get_hw_sw_interface (vnm, ad->hw_if_index);
1320   args->sw_if_index = ad->sw_if_index = sw->sw_if_index;
1321
1322   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, ad->hw_if_index);
1323   hw->flags |= VNET_HW_INTERFACE_FLAG_SUPPORTS_INT_MODE;
1324   vnet_hw_interface_set_input_node (vnm, ad->hw_if_index,
1325                                     avf_input_node.index);
1326
1327   for (i = 0; i < ad->n_rx_queues; i++)
1328     vnet_hw_interface_assign_rx_thread (vnm, ad->hw_if_index, i, ~0);
1329
1330   if (pool_elts (am->devices) == 1)
1331     vlib_process_signal_event (vm, avf_process_node.index,
1332                                AVF_PROCESS_EVENT_START, 0);
1333
1334   return;
1335
1336 error:
1337   avf_delete_if (vm, ad);
1338   args->rv = VNET_API_ERROR_INVALID_INTERFACE;
1339   args->error = clib_error_return (error, "pci-addr %U",
1340                                    format_vlib_pci_addr, &args->addr);
1341   vlib_log_err (am->log_class, "%U", format_clib_error, args->error);
1342 }
1343
1344 static clib_error_t *
1345 avf_interface_admin_up_down (vnet_main_t * vnm, u32 hw_if_index, u32 flags)
1346 {
1347   vnet_hw_interface_t *hi = vnet_get_hw_interface (vnm, hw_if_index);
1348   avf_main_t *am = &avf_main;
1349   avf_device_t *ad = vec_elt_at_index (am->devices, hi->dev_instance);
1350   uword is_up = (flags & VNET_SW_INTERFACE_FLAG_ADMIN_UP) != 0;
1351
1352   if (ad->flags & AVF_DEVICE_F_ERROR)
1353     return clib_error_return (0, "device is in error state");
1354
1355   if (is_up)
1356     {
1357       vnet_hw_interface_set_flags (vnm, ad->hw_if_index,
1358                                    VNET_HW_INTERFACE_FLAG_LINK_UP);
1359       ad->flags |= AVF_DEVICE_F_ADMIN_UP;
1360     }
1361   else
1362     {
1363       vnet_hw_interface_set_flags (vnm, ad->hw_if_index, 0);
1364       ad->flags &= ~AVF_DEVICE_F_ADMIN_UP;
1365     }
1366   return 0;
1367 }
1368
1369 static clib_error_t *
1370 avf_interface_rx_mode_change (vnet_main_t * vnm, u32 hw_if_index, u32 qid,
1371                               vnet_hw_interface_rx_mode mode)
1372 {
1373   avf_main_t *am = &avf_main;
1374   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
1375   avf_device_t *ad = pool_elt_at_index (am->devices, hw->dev_instance);
1376   avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, qid);
1377
1378   if (mode == VNET_HW_INTERFACE_RX_MODE_POLLING)
1379     rxq->int_mode = 0;
1380   else
1381     rxq->int_mode = 1;
1382
1383   return 0;
1384 }
1385
1386 static void
1387 avf_set_interface_next_node (vnet_main_t * vnm, u32 hw_if_index,
1388                              u32 node_index)
1389 {
1390   avf_main_t *am = &avf_main;
1391   vnet_hw_interface_t *hw = vnet_get_hw_interface (vnm, hw_if_index);
1392   avf_device_t *ad = pool_elt_at_index (am->devices, hw->dev_instance);
1393
1394   /* Shut off redirection */
1395   if (node_index == ~0)
1396     {
1397       ad->per_interface_next_index = node_index;
1398       return;
1399     }
1400
1401   ad->per_interface_next_index =
1402     vlib_node_add_next (vlib_get_main (), avf_input_node.index, node_index);
1403 }
1404
1405 static char *avf_tx_func_error_strings[] = {
1406 #define _(n,s) s,
1407   foreach_avf_tx_func_error
1408 #undef _
1409 };
1410
1411 /* *INDENT-OFF* */
1412 VNET_DEVICE_CLASS (avf_device_class,) =
1413 {
1414   .name = "Adaptive Virtual Function (AVF) interface",
1415   .format_device = format_avf_device,
1416   .format_device_name = format_avf_device_name,
1417   .admin_up_down_function = avf_interface_admin_up_down,
1418   .rx_mode_change_function = avf_interface_rx_mode_change,
1419   .rx_redirect_to_node = avf_set_interface_next_node,
1420   .tx_function_n_errors = AVF_TX_N_ERROR,
1421   .tx_function_error_strings = avf_tx_func_error_strings,
1422 };
1423 /* *INDENT-ON* */
1424
1425 clib_error_t *
1426 avf_init (vlib_main_t * vm)
1427 {
1428   avf_main_t *am = &avf_main;
1429   clib_error_t *error;
1430   vlib_thread_main_t *tm = vlib_get_thread_main ();
1431
1432   if ((error = vlib_call_init_function (vm, pci_bus_init)))
1433     return error;
1434
1435   vec_validate_aligned (am->per_thread_data, tm->n_vlib_mains - 1,
1436                         CLIB_CACHE_LINE_BYTES);
1437
1438   am->log_class = vlib_log_register_class ("avf_plugin", 0);
1439   vlib_log_debug (am->log_class, "initialized");
1440
1441   return 0;
1442 }
1443
1444 VLIB_INIT_FUNCTION (avf_init);
1445
1446 /*
1447  * fd.io coding-style-patch-verification: ON
1448  *
1449  * Local Variables:
1450  * eval: (c-set-style "gnu")
1451  * End:
1452  */