]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/ixgbe/if_sriov.c
Merge ^/head r319973 through 321382.
[FreeBSD/FreeBSD.git] / sys / dev / ixgbe / if_sriov.c
1 /******************************************************************************
2
3   Copyright (c) 2001-2017, Intel Corporation
4   All rights reserved.
5
6   Redistribution and use in source and binary forms, with or without
7   modification, are permitted provided that the following conditions are met:
8
9    1. Redistributions of source code must retain the above copyright notice,
10       this list of conditions and the following disclaimer.
11
12    2. Redistributions in binary form must reproduce the above copyright
13       notice, this list of conditions and the following disclaimer in the
14       documentation and/or other materials provided with the distribution.
15
16    3. Neither the name of the Intel Corporation nor the names of its
17       contributors may be used to endorse or promote products derived from
18       this software without specific prior written permission.
19
20   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23   ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30   POSSIBILITY OF SUCH DAMAGE.
31
32 ******************************************************************************/
33 /*$FreeBSD$*/
34
35 #include "ixgbe.h"
36
37 #ifdef PCI_IOV
38
39 MALLOC_DEFINE(M_IXGBE_SRIOV, "ix_sriov", "ix SR-IOV allocations");
40
41 /************************************************************************
42  * ixgbe_pci_iov_detach
43  ************************************************************************/
44 int
45 ixgbe_pci_iov_detach(device_t dev)
46 {
47         return pci_iov_detach(dev);
48 }
49
50 /************************************************************************
51  * ixgbe_define_iov_schemas
52  ************************************************************************/
53 void
54 ixgbe_define_iov_schemas(device_t dev, int *error)
55 {
56         nvlist_t *pf_schema, *vf_schema;
57
58         pf_schema = pci_iov_schema_alloc_node();
59         vf_schema = pci_iov_schema_alloc_node();
60         pci_iov_schema_add_unicast_mac(vf_schema, "mac-addr", 0, NULL);
61         pci_iov_schema_add_bool(vf_schema, "mac-anti-spoof",
62             IOV_SCHEMA_HASDEFAULT, TRUE);
63         pci_iov_schema_add_bool(vf_schema, "allow-set-mac",
64             IOV_SCHEMA_HASDEFAULT, FALSE);
65         pci_iov_schema_add_bool(vf_schema, "allow-promisc",
66             IOV_SCHEMA_HASDEFAULT, FALSE);
67         *error = pci_iov_attach(dev, pf_schema, vf_schema);
68         if (*error != 0) {
69                 device_printf(dev,
70                     "Error %d setting up SR-IOV\n", *error);
71         }
72 } /* ixgbe_define_iov_schemas */
73
74 /************************************************************************
75  * ixgbe_align_all_queue_indices
76  ************************************************************************/
77 inline void
78 ixgbe_align_all_queue_indices(struct adapter *adapter)
79 {
80         int i;
81         int index;
82
83         for (i = 0; i < adapter->num_queues; i++) {
84                 index = ixgbe_vf_que_index(adapter->iov_mode, adapter->pool, i);
85                 adapter->rx_rings[i].me = index;
86                 adapter->tx_rings[i].me = index;
87         }
88 }
89
90 /* Support functions for SR-IOV/VF management */
91 static inline void
92 ixgbe_send_vf_msg(struct adapter *adapter, struct ixgbe_vf *vf, u32 msg)
93 {
94         if (vf->flags & IXGBE_VF_CTS)
95                 msg |= IXGBE_VT_MSGTYPE_CTS;
96
97         adapter->hw.mbx.ops.write(&adapter->hw, &msg, 1, vf->pool);
98 }
99
100 static inline void
101 ixgbe_send_vf_ack(struct adapter *adapter, struct ixgbe_vf *vf, u32 msg)
102 {
103         msg &= IXGBE_VT_MSG_MASK;
104         ixgbe_send_vf_msg(adapter, vf, msg | IXGBE_VT_MSGTYPE_ACK);
105 }
106
107 static inline void
108 ixgbe_send_vf_nack(struct adapter *adapter, struct ixgbe_vf *vf, u32 msg)
109 {
110         msg &= IXGBE_VT_MSG_MASK;
111         ixgbe_send_vf_msg(adapter, vf, msg | IXGBE_VT_MSGTYPE_NACK);
112 }
113
114 static inline void
115 ixgbe_process_vf_ack(struct adapter *adapter, struct ixgbe_vf *vf)
116 {
117         if (!(vf->flags & IXGBE_VF_CTS))
118                 ixgbe_send_vf_nack(adapter, vf, 0);
119 }
120
121 static inline boolean_t
122 ixgbe_vf_mac_changed(struct ixgbe_vf *vf, const uint8_t *mac)
123 {
124         return (bcmp(mac, vf->ether_addr, ETHER_ADDR_LEN) != 0);
125 }
126
127 static inline int
128 ixgbe_vf_queues(int mode)
129 {
130         switch (mode) {
131         case IXGBE_64_VM:
132                 return (2);
133         case IXGBE_32_VM:
134                 return (4);
135         case IXGBE_NO_VM:
136         default:
137                 return (0);
138         }
139 }
140
141 inline int
142 ixgbe_vf_que_index(int mode, int vfnum, int num)
143 {
144         return ((vfnum * ixgbe_vf_queues(mode)) + num);
145 }
146
147 static inline void
148 ixgbe_update_max_frame(struct adapter * adapter, int max_frame)
149 {
150         if (adapter->max_frame_size < max_frame)
151                 adapter->max_frame_size = max_frame;
152 }
153
154 inline u32
155 ixgbe_get_mrqc(int iov_mode)
156 {
157         u32 mrqc;
158
159         switch (iov_mode) {
160         case IXGBE_64_VM:
161                 mrqc = IXGBE_MRQC_VMDQRSS64EN;
162                 break;
163         case IXGBE_32_VM:
164                 mrqc = IXGBE_MRQC_VMDQRSS32EN;
165                 break;
166         case IXGBE_NO_VM:
167                 mrqc = 0;
168                 break;
169         default:
170                 panic("Unexpected SR-IOV mode %d", iov_mode);
171         }
172
173         return mrqc;
174 }
175
176
177 inline u32
178 ixgbe_get_mtqc(int iov_mode)
179 {
180         uint32_t mtqc;
181
182         switch (iov_mode) {
183         case IXGBE_64_VM:
184                 mtqc = IXGBE_MTQC_64VF | IXGBE_MTQC_VT_ENA;
185                 break;
186         case IXGBE_32_VM:
187                 mtqc = IXGBE_MTQC_32VF | IXGBE_MTQC_VT_ENA;
188                 break;
189         case IXGBE_NO_VM:
190                 mtqc = IXGBE_MTQC_64Q_1PB;
191                 break;
192         default:
193                 panic("Unexpected SR-IOV mode %d", iov_mode);
194         }
195
196         return mtqc;
197 }
198
199 void
200 ixgbe_ping_all_vfs(struct adapter *adapter)
201 {
202         struct ixgbe_vf *vf;
203
204         for (int i = 0; i < adapter->num_vfs; i++) {
205                 vf = &adapter->vfs[i];
206                 if (vf->flags & IXGBE_VF_ACTIVE)
207                         ixgbe_send_vf_msg(adapter, vf, IXGBE_PF_CONTROL_MSG);
208         }
209 } /* ixgbe_ping_all_vfs */
210
211
212 static void
213 ixgbe_vf_set_default_vlan(struct adapter *adapter, struct ixgbe_vf *vf,
214                           uint16_t tag)
215 {
216         struct ixgbe_hw *hw;
217         uint32_t vmolr, vmvir;
218
219         hw = &adapter->hw;
220
221         vf->vlan_tag = tag;
222
223         vmolr = IXGBE_READ_REG(hw, IXGBE_VMOLR(vf->pool));
224
225         /* Do not receive packets that pass inexact filters. */
226         vmolr &= ~(IXGBE_VMOLR_ROMPE | IXGBE_VMOLR_ROPE);
227
228         /* Disable Multicast Promicuous Mode. */
229         vmolr &= ~IXGBE_VMOLR_MPE;
230
231         /* Accept broadcasts. */
232         vmolr |= IXGBE_VMOLR_BAM;
233
234         if (tag == 0) {
235                 /* Accept non-vlan tagged traffic. */
236                 //vmolr |= IXGBE_VMOLR_AUPE;
237
238                 /* Allow VM to tag outgoing traffic; no default tag. */
239                 vmvir = 0;
240         } else {
241                 /* Require vlan-tagged traffic. */
242                 vmolr &= ~IXGBE_VMOLR_AUPE;
243
244                 /* Tag all traffic with provided vlan tag. */
245                 vmvir = (tag | IXGBE_VMVIR_VLANA_DEFAULT);
246         }
247         IXGBE_WRITE_REG(hw, IXGBE_VMOLR(vf->pool), vmolr);
248         IXGBE_WRITE_REG(hw, IXGBE_VMVIR(vf->pool), vmvir);
249 } /* ixgbe_vf_set_default_vlan */
250
251
252 static boolean_t
253 ixgbe_vf_frame_size_compatible(struct adapter *adapter, struct ixgbe_vf *vf)
254 {
255
256         /*
257          * Frame size compatibility between PF and VF is only a problem on
258          * 82599-based cards.  X540 and later support any combination of jumbo
259          * frames on PFs and VFs.
260          */
261         if (adapter->hw.mac.type != ixgbe_mac_82599EB)
262                 return (TRUE);
263
264         switch (vf->api_ver) {
265         case IXGBE_API_VER_1_0:
266         case IXGBE_API_VER_UNKNOWN:
267                 /*
268                  * On legacy (1.0 and older) VF versions, we don't support jumbo
269                  * frames on either the PF or the VF.
270                  */
271                 if (adapter->max_frame_size > ETHER_MAX_LEN ||
272                     vf->max_frame_size > ETHER_MAX_LEN)
273                         return (FALSE);
274
275                 return (TRUE);
276
277                 break;
278         case IXGBE_API_VER_1_1:
279         default:
280                 /*
281                  * 1.1 or later VF versions always work if they aren't using
282                  * jumbo frames.
283                  */
284                 if (vf->max_frame_size <= ETHER_MAX_LEN)
285                         return (TRUE);
286
287                 /*
288                  * Jumbo frames only work with VFs if the PF is also using jumbo
289                  * frames.
290                  */
291                 if (adapter->max_frame_size <= ETHER_MAX_LEN)
292                         return (TRUE);
293
294                 return (FALSE);
295
296         }
297 } /* ixgbe_vf_frame_size_compatible */
298
299
300 static void
301 ixgbe_process_vf_reset(struct adapter *adapter, struct ixgbe_vf *vf)
302 {
303         ixgbe_vf_set_default_vlan(adapter, vf, vf->default_vlan);
304
305         // XXX clear multicast addresses
306
307         ixgbe_clear_rar(&adapter->hw, vf->rar_index);
308
309         vf->api_ver = IXGBE_API_VER_UNKNOWN;
310 } /* ixgbe_process_vf_reset */
311
312
313 static void
314 ixgbe_vf_enable_transmit(struct adapter *adapter, struct ixgbe_vf *vf)
315 {
316         struct ixgbe_hw *hw;
317         uint32_t vf_index, vfte;
318
319         hw = &adapter->hw;
320
321         vf_index = IXGBE_VF_INDEX(vf->pool);
322         vfte = IXGBE_READ_REG(hw, IXGBE_VFTE(vf_index));
323         vfte |= IXGBE_VF_BIT(vf->pool);
324         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_index), vfte);
325 } /* ixgbe_vf_enable_transmit */
326
327
328 static void
329 ixgbe_vf_enable_receive(struct adapter *adapter, struct ixgbe_vf *vf)
330 {
331         struct ixgbe_hw *hw;
332         uint32_t vf_index, vfre;
333
334         hw = &adapter->hw;
335
336         vf_index = IXGBE_VF_INDEX(vf->pool);
337         vfre = IXGBE_READ_REG(hw, IXGBE_VFRE(vf_index));
338         if (ixgbe_vf_frame_size_compatible(adapter, vf))
339                 vfre |= IXGBE_VF_BIT(vf->pool);
340         else
341                 vfre &= ~IXGBE_VF_BIT(vf->pool);
342         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_index), vfre);
343 } /* ixgbe_vf_enable_receive */
344
345
346 static void
347 ixgbe_vf_reset_msg(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
348 {
349         struct ixgbe_hw *hw;
350         uint32_t ack;
351         uint32_t resp[IXGBE_VF_PERMADDR_MSG_LEN];
352
353         hw = &adapter->hw;
354
355         ixgbe_process_vf_reset(adapter, vf);
356
357         if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
358                 ixgbe_set_rar(&adapter->hw, vf->rar_index, vf->ether_addr,
359                     vf->pool, TRUE);
360                 ack = IXGBE_VT_MSGTYPE_ACK;
361         } else
362                 ack = IXGBE_VT_MSGTYPE_NACK;
363
364         ixgbe_vf_enable_transmit(adapter, vf);
365         ixgbe_vf_enable_receive(adapter, vf);
366
367         vf->flags |= IXGBE_VF_CTS;
368
369         resp[0] = IXGBE_VF_RESET | ack | IXGBE_VT_MSGTYPE_CTS;
370         bcopy(vf->ether_addr, &resp[1], ETHER_ADDR_LEN);
371         resp[3] = hw->mac.mc_filter_type;
372         hw->mbx.ops.write(hw, resp, IXGBE_VF_PERMADDR_MSG_LEN, vf->pool);
373 } /* ixgbe_vf_reset_msg */
374
375
376 static void
377 ixgbe_vf_set_mac(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
378 {
379         uint8_t *mac;
380
381         mac = (uint8_t*)&msg[1];
382
383         /* Check that the VF has permission to change the MAC address. */
384         if (!(vf->flags & IXGBE_VF_CAP_MAC) && ixgbe_vf_mac_changed(vf, mac)) {
385                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
386                 return;
387         }
388
389         if (ixgbe_validate_mac_addr(mac) != 0) {
390                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
391                 return;
392         }
393
394         bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
395
396         ixgbe_set_rar(&adapter->hw, vf->rar_index, vf->ether_addr, vf->pool,
397             TRUE);
398
399         ixgbe_send_vf_ack(adapter, vf, msg[0]);
400 } /* ixgbe_vf_set_mac */
401
402
403 /*
404  * VF multicast addresses are set by using the appropriate bit in
405  * 1 of 128 32 bit addresses (4096 possible).
406  */
407 static void
408 ixgbe_vf_set_mc_addr(struct adapter *adapter, struct ixgbe_vf *vf, u32 *msg)
409 {
410         u16     *list = (u16*)&msg[1];
411         int     entries;
412         u32     vmolr, vec_bit, vec_reg, mta_reg;
413
414         entries = (msg[0] & IXGBE_VT_MSGINFO_MASK) >> IXGBE_VT_MSGINFO_SHIFT;
415         entries = min(entries, IXGBE_MAX_VF_MC);
416
417         vmolr = IXGBE_READ_REG(&adapter->hw, IXGBE_VMOLR(vf->pool));
418
419         vf->num_mc_hashes = entries;
420
421         /* Set the appropriate MTA bit */
422         for (int i = 0; i < entries; i++) {
423                 vf->mc_hash[i] = list[i];
424                 vec_reg = (vf->mc_hash[i] >> 5) & 0x7F;
425                 vec_bit = vf->mc_hash[i] & 0x1F;
426                 mta_reg = IXGBE_READ_REG(&adapter->hw, IXGBE_MTA(vec_reg));
427                 mta_reg |= (1 << vec_bit);
428                 IXGBE_WRITE_REG(&adapter->hw, IXGBE_MTA(vec_reg), mta_reg);
429         }
430
431         vmolr |= IXGBE_VMOLR_ROMPE;
432         IXGBE_WRITE_REG(&adapter->hw, IXGBE_VMOLR(vf->pool), vmolr);
433         ixgbe_send_vf_ack(adapter, vf, msg[0]);
434 } /* ixgbe_vf_set_mc_addr */
435
436
437 static void
438 ixgbe_vf_set_vlan(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
439 {
440         struct ixgbe_hw *hw;
441         int enable;
442         uint16_t tag;
443
444         hw = &adapter->hw;
445         enable = IXGBE_VT_MSGINFO(msg[0]);
446         tag = msg[1] & IXGBE_VLVF_VLANID_MASK;
447
448         if (!(vf->flags & IXGBE_VF_CAP_VLAN)) {
449                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
450                 return;
451         }
452
453         /* It is illegal to enable vlan tag 0. */
454         if (tag == 0 && enable != 0){
455                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
456                 return;
457         }
458
459         ixgbe_set_vfta(hw, tag, vf->pool, enable, false);
460         ixgbe_send_vf_ack(adapter, vf, msg[0]);
461 } /* ixgbe_vf_set_vlan */
462
463
464 static void
465 ixgbe_vf_set_lpe(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
466 {
467         struct ixgbe_hw *hw;
468         uint32_t vf_max_size, pf_max_size, mhadd;
469
470         hw = &adapter->hw;
471         vf_max_size = msg[1];
472
473         if (vf_max_size < ETHER_CRC_LEN) {
474                 /* We intentionally ACK invalid LPE requests. */
475                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
476                 return;
477         }
478
479         vf_max_size -= ETHER_CRC_LEN;
480
481         if (vf_max_size > IXGBE_MAX_FRAME_SIZE) {
482                 /* We intentionally ACK invalid LPE requests. */
483                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
484                 return;
485         }
486
487         vf->max_frame_size = vf_max_size;
488         ixgbe_update_max_frame(adapter, vf->max_frame_size);
489
490         /*
491          * We might have to disable reception to this VF if the frame size is
492          * not compatible with the config on the PF.
493          */
494         ixgbe_vf_enable_receive(adapter, vf);
495
496         mhadd = IXGBE_READ_REG(hw, IXGBE_MHADD);
497         pf_max_size = (mhadd & IXGBE_MHADD_MFS_MASK) >> IXGBE_MHADD_MFS_SHIFT;
498
499         if (pf_max_size < adapter->max_frame_size) {
500                 mhadd &= ~IXGBE_MHADD_MFS_MASK;
501                 mhadd |= adapter->max_frame_size << IXGBE_MHADD_MFS_SHIFT;
502                 IXGBE_WRITE_REG(hw, IXGBE_MHADD, mhadd);
503         }
504
505         ixgbe_send_vf_ack(adapter, vf, msg[0]);
506 } /* ixgbe_vf_set_lpe */
507
508
509 static void
510 ixgbe_vf_set_macvlan(struct adapter *adapter, struct ixgbe_vf *vf,
511                      uint32_t *msg)
512 {
513         //XXX implement this
514         ixgbe_send_vf_nack(adapter, vf, msg[0]);
515 } /* ixgbe_vf_set_macvlan */
516
517
518 static void
519 ixgbe_vf_api_negotiate(struct adapter *adapter, struct ixgbe_vf *vf,
520     uint32_t *msg)
521 {
522
523         switch (msg[1]) {
524         case IXGBE_API_VER_1_0:
525         case IXGBE_API_VER_1_1:
526                 vf->api_ver = msg[1];
527                 ixgbe_send_vf_ack(adapter, vf, msg[0]);
528                 break;
529         default:
530                 vf->api_ver = IXGBE_API_VER_UNKNOWN;
531                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
532                 break;
533         }
534 } /* ixgbe_vf_api_negotiate */
535
536
537 static void
538 ixgbe_vf_get_queues(struct adapter *adapter, struct ixgbe_vf *vf, uint32_t *msg)
539 {
540         struct ixgbe_hw *hw;
541         uint32_t resp[IXGBE_VF_GET_QUEUES_RESP_LEN];
542         int num_queues;
543
544         hw = &adapter->hw;
545
546         /* GET_QUEUES is not supported on pre-1.1 APIs. */
547         switch (msg[0]) {
548         case IXGBE_API_VER_1_0:
549         case IXGBE_API_VER_UNKNOWN:
550                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
551                 return;
552         }
553
554         resp[0] = IXGBE_VF_GET_QUEUES | IXGBE_VT_MSGTYPE_ACK |
555             IXGBE_VT_MSGTYPE_CTS;
556
557         num_queues = ixgbe_vf_queues(adapter->iov_mode);
558         resp[IXGBE_VF_TX_QUEUES] = num_queues;
559         resp[IXGBE_VF_RX_QUEUES] = num_queues;
560         resp[IXGBE_VF_TRANS_VLAN] = (vf->default_vlan != 0);
561         resp[IXGBE_VF_DEF_QUEUE] = 0;
562
563         hw->mbx.ops.write(hw, resp, IXGBE_VF_GET_QUEUES_RESP_LEN, vf->pool);
564 } /* ixgbe_vf_get_queues */
565
566
567 static void
568 ixgbe_process_vf_msg(struct adapter *adapter, struct ixgbe_vf *vf)
569 {
570         struct ixgbe_hw *hw;
571         uint32_t msg[IXGBE_VFMAILBOX_SIZE];
572         int error;
573
574         hw = &adapter->hw;
575
576         error = hw->mbx.ops.read(hw, msg, IXGBE_VFMAILBOX_SIZE, vf->pool);
577
578         if (error != 0)
579                 return;
580
581         CTR3(KTR_MALLOC, "%s: received msg %x from %d",
582             adapter->ifp->if_xname, msg[0], vf->pool);
583         if (msg[0] == IXGBE_VF_RESET) {
584                 ixgbe_vf_reset_msg(adapter, vf, msg);
585                 return;
586         }
587
588         if (!(vf->flags & IXGBE_VF_CTS)) {
589                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
590                 return;
591         }
592
593         switch (msg[0] & IXGBE_VT_MSG_MASK) {
594         case IXGBE_VF_SET_MAC_ADDR:
595                 ixgbe_vf_set_mac(adapter, vf, msg);
596                 break;
597         case IXGBE_VF_SET_MULTICAST:
598                 ixgbe_vf_set_mc_addr(adapter, vf, msg);
599                 break;
600         case IXGBE_VF_SET_VLAN:
601                 ixgbe_vf_set_vlan(adapter, vf, msg);
602                 break;
603         case IXGBE_VF_SET_LPE:
604                 ixgbe_vf_set_lpe(adapter, vf, msg);
605                 break;
606         case IXGBE_VF_SET_MACVLAN:
607                 ixgbe_vf_set_macvlan(adapter, vf, msg);
608                 break;
609         case IXGBE_VF_API_NEGOTIATE:
610                 ixgbe_vf_api_negotiate(adapter, vf, msg);
611                 break;
612         case IXGBE_VF_GET_QUEUES:
613                 ixgbe_vf_get_queues(adapter, vf, msg);
614                 break;
615         default:
616                 ixgbe_send_vf_nack(adapter, vf, msg[0]);
617         }
618 } /* ixgbe_process_vf_msg */
619
620
621 /* Tasklet for handling VF -> PF mailbox messages */
622 void
623 ixgbe_handle_mbx(void *context, int pending)
624 {
625         struct adapter *adapter;
626         struct ixgbe_hw *hw;
627         struct ixgbe_vf *vf;
628         int i;
629
630         adapter = context;
631         hw = &adapter->hw;
632
633         IXGBE_CORE_LOCK(adapter);
634         for (i = 0; i < adapter->num_vfs; i++) {
635                 vf = &adapter->vfs[i];
636
637                 if (vf->flags & IXGBE_VF_ACTIVE) {
638                         if (hw->mbx.ops.check_for_rst(hw, vf->pool) == 0)
639                                 ixgbe_process_vf_reset(adapter, vf);
640
641                         if (hw->mbx.ops.check_for_msg(hw, vf->pool) == 0)
642                                 ixgbe_process_vf_msg(adapter, vf);
643
644                         if (hw->mbx.ops.check_for_ack(hw, vf->pool) == 0)
645                                 ixgbe_process_vf_ack(adapter, vf);
646                 }
647         }
648         IXGBE_CORE_UNLOCK(adapter);
649 } /* ixgbe_handle_mbx */
650
651 int
652 ixgbe_init_iov(device_t dev, u16 num_vfs, const nvlist_t *config)
653 {
654         struct adapter *adapter;
655         int retval = 0;
656
657         adapter = device_get_softc(dev);
658         adapter->iov_mode = IXGBE_NO_VM;
659
660         if (num_vfs == 0) {
661                 /* Would we ever get num_vfs = 0? */
662                 retval = EINVAL;
663                 goto err_init_iov;
664         }
665
666         /*
667          * We've got to reserve a VM's worth of queues for the PF,
668          * thus we go into "64 VF mode" if 32+ VFs are requested.
669          * With 64 VFs, you can only have two queues per VF.
670          * With 32 VFs, you can have up to four queues per VF.
671          */
672         if (num_vfs >= IXGBE_32_VM)
673                 adapter->iov_mode = IXGBE_64_VM;
674         else
675                 adapter->iov_mode = IXGBE_32_VM;
676
677         /* Again, reserving 1 VM's worth of queues for the PF */
678         adapter->pool = adapter->iov_mode - 1;
679
680         if ((num_vfs > adapter->pool) || (num_vfs >= IXGBE_64_VM)) {
681                 retval = ENOSPC;
682                 goto err_init_iov;
683         }
684
685         IXGBE_CORE_LOCK(adapter);
686
687         adapter->vfs = malloc(sizeof(*adapter->vfs) * num_vfs, M_IXGBE_SRIOV,
688             M_NOWAIT | M_ZERO);
689
690         if (adapter->vfs == NULL) {
691                 retval = ENOMEM;
692                 IXGBE_CORE_UNLOCK(adapter);
693                 goto err_init_iov;
694         }
695
696         adapter->num_vfs = num_vfs;
697         adapter->init_locked(adapter);
698         adapter->feat_en |= IXGBE_FEATURE_SRIOV;
699
700         IXGBE_CORE_UNLOCK(adapter);
701
702         return retval;
703
704 err_init_iov:
705         adapter->num_vfs = 0;
706         adapter->pool = 0;
707         adapter->iov_mode = IXGBE_NO_VM;
708
709         return retval;
710 } /* ixgbe_init_iov */
711
712 void
713 ixgbe_uninit_iov(device_t dev)
714 {
715         struct ixgbe_hw *hw;
716         struct adapter *adapter;
717         uint32_t pf_reg, vf_reg;
718
719         adapter = device_get_softc(dev);
720         hw = &adapter->hw;
721
722         IXGBE_CORE_LOCK(adapter);
723
724         /* Enable rx/tx for the PF and disable it for all VFs. */
725         pf_reg = IXGBE_VF_INDEX(adapter->pool);
726         IXGBE_WRITE_REG(hw, IXGBE_VFRE(pf_reg), IXGBE_VF_BIT(adapter->pool));
727         IXGBE_WRITE_REG(hw, IXGBE_VFTE(pf_reg), IXGBE_VF_BIT(adapter->pool));
728
729         if (pf_reg == 0)
730                 vf_reg = 1;
731         else
732                 vf_reg = 0;
733         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), 0);
734         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), 0);
735
736         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, 0);
737
738         free(adapter->vfs, M_IXGBE_SRIOV);
739         adapter->vfs = NULL;
740         adapter->num_vfs = 0;
741         adapter->feat_en &= ~IXGBE_FEATURE_SRIOV;
742
743         IXGBE_CORE_UNLOCK(adapter);
744 } /* ixgbe_uninit_iov */
745
746 static void
747 ixgbe_init_vf(struct adapter *adapter, struct ixgbe_vf *vf)
748 {
749         struct ixgbe_hw *hw;
750         uint32_t vf_index, pfmbimr;
751
752         IXGBE_CORE_LOCK_ASSERT(adapter);
753
754         hw = &adapter->hw;
755
756         if (!(vf->flags & IXGBE_VF_ACTIVE))
757                 return;
758
759         vf_index = IXGBE_VF_INDEX(vf->pool);
760         pfmbimr = IXGBE_READ_REG(hw, IXGBE_PFMBIMR(vf_index));
761         pfmbimr |= IXGBE_VF_BIT(vf->pool);
762         IXGBE_WRITE_REG(hw, IXGBE_PFMBIMR(vf_index), pfmbimr);
763
764         ixgbe_vf_set_default_vlan(adapter, vf, vf->vlan_tag);
765
766         // XXX multicast addresses
767
768         if (ixgbe_validate_mac_addr(vf->ether_addr) == 0) {
769                 ixgbe_set_rar(&adapter->hw, vf->rar_index,
770                     vf->ether_addr, vf->pool, TRUE);
771         }
772
773         ixgbe_vf_enable_transmit(adapter, vf);
774         ixgbe_vf_enable_receive(adapter, vf);
775
776         ixgbe_send_vf_msg(adapter, vf, IXGBE_PF_CONTROL_MSG);
777 } /* ixgbe_init_vf */
778
779 void
780 ixgbe_initialize_iov(struct adapter *adapter)
781 {
782         struct ixgbe_hw *hw = &adapter->hw;
783         uint32_t mrqc, mtqc, vt_ctl, vf_reg, gcr_ext, gpie;
784         int i;
785
786         if (adapter->iov_mode == IXGBE_NO_VM)
787                 return;
788
789         IXGBE_CORE_LOCK_ASSERT(adapter);
790
791         /* RMW appropriate registers based on IOV mode */
792         /* Read... */
793         mrqc    = IXGBE_READ_REG(hw, IXGBE_MRQC);
794         gcr_ext = IXGBE_READ_REG(hw, IXGBE_GCR_EXT);
795         gpie    = IXGBE_READ_REG(hw, IXGBE_GPIE);
796         /* Modify... */
797         mrqc    &= ~IXGBE_MRQC_MRQE_MASK;
798         mtqc     =  IXGBE_MTQC_VT_ENA;      /* No initial MTQC read needed */
799         gcr_ext |=  IXGBE_GCR_EXT_MSIX_EN;
800         gcr_ext &= ~IXGBE_GCR_EXT_VT_MODE_MASK;
801         gpie    &= ~IXGBE_GPIE_VTMODE_MASK;
802         switch (adapter->iov_mode) {
803         case IXGBE_64_VM:
804                 mrqc    |= IXGBE_MRQC_VMDQRSS64EN;
805                 mtqc    |= IXGBE_MTQC_64VF;
806                 gcr_ext |= IXGBE_GCR_EXT_VT_MODE_64;
807                 gpie    |= IXGBE_GPIE_VTMODE_64;
808                 break;
809         case IXGBE_32_VM:
810                 mrqc    |= IXGBE_MRQC_VMDQRSS32EN;
811                 mtqc    |= IXGBE_MTQC_32VF;
812                 gcr_ext |= IXGBE_GCR_EXT_VT_MODE_32;
813                 gpie    |= IXGBE_GPIE_VTMODE_32;
814                 break;
815         default:
816                 panic("Unexpected SR-IOV mode %d", adapter->iov_mode);
817         }
818         /* Write... */
819         IXGBE_WRITE_REG(hw, IXGBE_MRQC, mrqc);
820         IXGBE_WRITE_REG(hw, IXGBE_MTQC, mtqc);
821         IXGBE_WRITE_REG(hw, IXGBE_GCR_EXT, gcr_ext);
822         IXGBE_WRITE_REG(hw, IXGBE_GPIE, gpie);
823
824         /* Enable rx/tx for the PF. */
825         vf_reg = IXGBE_VF_INDEX(adapter->pool);
826         IXGBE_WRITE_REG(hw, IXGBE_VFRE(vf_reg), IXGBE_VF_BIT(adapter->pool));
827         IXGBE_WRITE_REG(hw, IXGBE_VFTE(vf_reg), IXGBE_VF_BIT(adapter->pool));
828
829         /* Allow VM-to-VM communication. */
830         IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
831
832         vt_ctl = IXGBE_VT_CTL_VT_ENABLE | IXGBE_VT_CTL_REPLEN;
833         vt_ctl |= (adapter->pool << IXGBE_VT_CTL_POOL_SHIFT);
834         IXGBE_WRITE_REG(hw, IXGBE_VT_CTL, vt_ctl);
835
836         for (i = 0; i < adapter->num_vfs; i++)
837                 ixgbe_init_vf(adapter, &adapter->vfs[i]);
838 } /* ixgbe_initialize_iov */
839
840
841 /* Check the max frame setting of all active VF's */
842 void
843 ixgbe_recalculate_max_frame(struct adapter *adapter)
844 {
845         struct ixgbe_vf *vf;
846
847         IXGBE_CORE_LOCK_ASSERT(adapter);
848
849         for (int i = 0; i < adapter->num_vfs; i++) {
850                 vf = &adapter->vfs[i];
851                 if (vf->flags & IXGBE_VF_ACTIVE)
852                         ixgbe_update_max_frame(adapter, vf->max_frame_size);
853         }
854 } /* ixgbe_recalculate_max_frame */
855
856 int
857 ixgbe_add_vf(device_t dev, u16 vfnum, const nvlist_t *config)
858 {
859         struct adapter *adapter;
860         struct ixgbe_vf *vf;
861         const void *mac;
862
863         adapter = device_get_softc(dev);
864
865         KASSERT(vfnum < adapter->num_vfs, ("VF index %d is out of range %d",
866             vfnum, adapter->num_vfs));
867
868         IXGBE_CORE_LOCK(adapter);
869         vf = &adapter->vfs[vfnum];
870         vf->pool= vfnum;
871
872         /* RAR[0] is used by the PF so use vfnum + 1 for VF RAR. */
873         vf->rar_index = vfnum + 1;
874         vf->default_vlan = 0;
875         vf->max_frame_size = ETHER_MAX_LEN;
876         ixgbe_update_max_frame(adapter, vf->max_frame_size);
877
878         if (nvlist_exists_binary(config, "mac-addr")) {
879                 mac = nvlist_get_binary(config, "mac-addr", NULL);
880                 bcopy(mac, vf->ether_addr, ETHER_ADDR_LEN);
881                 if (nvlist_get_bool(config, "allow-set-mac"))
882                         vf->flags |= IXGBE_VF_CAP_MAC;
883         } else
884                 /*
885                  * If the administrator has not specified a MAC address then
886                  * we must allow the VF to choose one.
887                  */
888                 vf->flags |= IXGBE_VF_CAP_MAC;
889
890         vf->flags |= IXGBE_VF_ACTIVE;
891
892         ixgbe_init_vf(adapter, vf);
893         IXGBE_CORE_UNLOCK(adapter);
894
895         return (0);
896 } /* ixgbe_add_vf */
897
898 #else
899
900 void
901 ixgbe_handle_mbx(void *context, int pending)
902 {
903         UNREFERENCED_2PARAMETER(context, pending);
904 } /* ixgbe_handle_mbx */
905
906 inline int
907 ixgbe_vf_que_index(int mode, int vfnum, int num)
908 {
909         UNREFERENCED_2PARAMETER(mode, vfnum);
910
911         return num;
912 } /* ixgbe_vf_que_index */
913
914 #endif