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