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