xref: /freebsd/sys/dev/ixgbe/if_sriov.c (revision 7c1b51d6dc2e165ae7333373513b080f17cf79bd)
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
915