if_sriov.c revision 1.1 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: head/sys/dev/ixgbe/if_sriov.c 320688 2017-07-05 17:27:03Z erj $*/
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
915