1 /******************************************************************************
3 Copyright (c) 2001-2017, Intel Corporation
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
9 1. Redistributions of source code must retain the above copyright notice,
10 this list of conditions and the following disclaimer.
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.
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.
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.
32 ******************************************************************************/
36 #include "ixgbe_type.h"
37 #include "ixgbe_dcb.h"
38 #include "ixgbe_dcb_82599.h"
41 * ixgbe_dcb_get_tc_stats_82599 - Returns status for each traffic class
42 * @hw: pointer to hardware structure
43 * @stats: pointer to statistics structure
44 * @tc_count: Number of elements in bwg_array.
46 * This function returns the status data for each of the Traffic Classes in use.
48 s32 ixgbe_dcb_get_tc_stats_82599(struct ixgbe_hw *hw,
49 struct ixgbe_hw_stats *stats,
54 DEBUGFUNC("dcb_get_tc_stats");
56 if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
57 return IXGBE_ERR_PARAM;
59 /* Statistics pertaining to each traffic class */
60 for (tc = 0; tc < tc_count; tc++) {
61 /* Transmitted Packets */
62 stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc));
63 /* Transmitted Bytes (read low first to prevent missed carry) */
64 stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC_L(tc));
66 (((u64)(IXGBE_READ_REG(hw, IXGBE_QBTC_H(tc)))) << 32);
67 /* Received Packets */
68 stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc));
69 /* Received Bytes (read low first to prevent missed carry) */
70 stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC_L(tc));
72 (((u64)(IXGBE_READ_REG(hw, IXGBE_QBRC_H(tc)))) << 32);
74 /* Received Dropped Packet */
75 stats->qprdc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRDC(tc));
82 * ixgbe_dcb_get_pfc_stats_82599 - Return CBFC status data
83 * @hw: pointer to hardware structure
84 * @stats: pointer to statistics structure
85 * @tc_count: Number of elements in bwg_array.
87 * This function returns the CBFC status data for each of the Traffic Classes.
89 s32 ixgbe_dcb_get_pfc_stats_82599(struct ixgbe_hw *hw,
90 struct ixgbe_hw_stats *stats,
95 DEBUGFUNC("dcb_get_pfc_stats");
97 if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
98 return IXGBE_ERR_PARAM;
100 for (tc = 0; tc < tc_count; tc++) {
101 /* Priority XOFF Transmitted */
102 stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc));
103 /* Priority XOFF Received */
104 stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(tc));
107 return IXGBE_SUCCESS;
111 * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter
112 * @hw: pointer to hardware structure
113 * @refill: refill credits index by traffic class
114 * @max: max credits index by traffic class
115 * @bwg_id: bandwidth grouping indexed by traffic class
116 * @tsa: transmission selection algorithm indexed by traffic class
117 * @map: priority to tc assignments indexed by priority
119 * Configure Rx Packet Arbiter and credits for each traffic class.
121 s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
122 u16 *max, u8 *bwg_id, u8 *tsa,
126 u32 credit_refill = 0;
131 * Disable the arbiter before changing parameters
132 * (always enable recycle mode; WSP)
134 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
135 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
138 * map all UPs to TCs. up_to_tc_bitmap for each TC has corresponding
139 * bits sets for the UPs that needs to be mappped to that TC.
140 * e.g if priorities 6 and 7 are to be mapped to a TC then the
141 * up_to_tc_bitmap value for that TC will be 11000000 in binary.
144 for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++)
145 reg |= (map[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT));
147 IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg);
149 /* Configure traffic class credits and priority */
150 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
151 credit_refill = refill[i];
153 reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
155 reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT;
157 if (tsa[i] == ixgbe_dcb_tsa_strict)
158 reg |= IXGBE_RTRPT4C_LSP;
160 IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
164 * Configure Rx packet plane (recycle mode; WSP) and
167 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
168 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
170 return IXGBE_SUCCESS;
174 * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter
175 * @hw: pointer to hardware structure
176 * @refill: refill credits index by traffic class
177 * @max: max credits index by traffic class
178 * @bwg_id: bandwidth grouping indexed by traffic class
179 * @tsa: transmission selection algorithm indexed by traffic class
181 * Configure Tx Descriptor Arbiter and credits for each traffic class.
183 s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
184 u16 *max, u8 *bwg_id, u8 *tsa)
186 u32 reg, max_credits;
189 /* Clear the per-Tx queue credits; we use per-TC instead */
190 for (i = 0; i < 128; i++) {
191 IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i);
192 IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0);
195 /* Configure traffic class credits and priority */
196 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
197 max_credits = max[i];
198 reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
200 reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT;
202 if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
203 reg |= IXGBE_RTTDT2C_GSP;
205 if (tsa[i] == ixgbe_dcb_tsa_strict)
206 reg |= IXGBE_RTTDT2C_LSP;
208 IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
212 * Configure Tx descriptor plane (recycle mode; WSP) and
215 reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM;
216 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
218 return IXGBE_SUCCESS;
222 * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter
223 * @hw: pointer to hardware structure
224 * @refill: refill credits index by traffic class
225 * @max: max credits index by traffic class
226 * @bwg_id: bandwidth grouping indexed by traffic class
227 * @tsa: transmission selection algorithm indexed by traffic class
228 * @map: priority to tc assignments indexed by priority
230 * Configure Tx Packet Arbiter and credits for each traffic class.
232 s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, u16 *refill,
233 u16 *max, u8 *bwg_id, u8 *tsa,
240 * Disable the arbiter before changing parameters
241 * (always enable recycle mode; SP; arb delay)
243 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
244 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) |
246 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
249 * map all UPs to TCs. up_to_tc_bitmap for each TC has corresponding
250 * bits sets for the UPs that needs to be mappped to that TC.
251 * e.g if priorities 6 and 7 are to be mapped to a TC then the
252 * up_to_tc_bitmap value for that TC will be 11000000 in binary.
255 for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++)
256 reg |= (map[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT));
258 IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg);
260 /* Configure traffic class credits and priority */
261 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
263 reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT;
264 reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT;
266 if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
267 reg |= IXGBE_RTTPT2C_GSP;
269 if (tsa[i] == ixgbe_dcb_tsa_strict)
270 reg |= IXGBE_RTTPT2C_LSP;
272 IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
276 * Configure Tx packet plane (recycle mode; SP; arb delay) and
279 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
280 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT);
281 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
283 return IXGBE_SUCCESS;
287 * ixgbe_dcb_config_pfc_82599 - Configure priority flow control
288 * @hw: pointer to hardware structure
289 * @pfc_en: enabled pfc bitmask
290 * @map: priority to tc assignments indexed by priority
292 * Configure Priority Flow Control (PFC) for each traffic class.
294 s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en, u8 *map)
296 u32 i, j, fcrtl, reg;
299 /* Enable Transmit Priority Flow Control */
300 IXGBE_WRITE_REG(hw, IXGBE_FCCFG, IXGBE_FCCFG_TFCE_PRIORITY);
302 /* Enable Receive Priority Flow Control */
303 reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
304 reg |= IXGBE_MFLCN_DPF;
307 * X540 supports per TC Rx priority flow control. So
308 * clear all TCs and only enable those that should be
311 reg &= ~(IXGBE_MFLCN_RPFCE_MASK | IXGBE_MFLCN_RFCE);
313 if (hw->mac.type >= ixgbe_mac_X540)
314 reg |= pfc_en << IXGBE_MFLCN_RPFCE_SHIFT;
317 reg |= IXGBE_MFLCN_RPFCE;
319 IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg);
321 for (i = 0; i < IXGBE_DCB_MAX_USER_PRIORITY; i++) {
327 /* Configure PFC Tx thresholds per TC */
328 for (i = 0; i <= max_tc; i++) {
331 for (j = 0; j < IXGBE_DCB_MAX_USER_PRIORITY; j++) {
332 if ((map[j] == i) && (pfc_en & (1 << j))) {
339 reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
340 fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
341 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), fcrtl);
344 * In order to prevent Tx hangs when the internal Tx
345 * switch is enabled we must set the high water mark
346 * to the Rx packet buffer size - 24KB. This allows
347 * the Tx switch to function even under heavy Rx
350 reg = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 24576;
351 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
354 IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
357 for (; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
358 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0);
359 IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), 0);
362 /* Configure pause time (2 TCs per register) */
363 reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
364 for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
365 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
367 /* Configure flow control refresh threshold value */
368 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
370 return IXGBE_SUCCESS;
374 * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics
375 * @hw: pointer to hardware structure
376 * @dcb_config: pointer to ixgbe_dcb_config structure
378 * Configure queue statistics registers, all queues belonging to same traffic
379 * class uses a single set of queue statistics counters.
381 s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw,
382 struct ixgbe_dcb_config *dcb_config)
387 bool vt_mode = FALSE;
389 if (dcb_config != NULL) {
390 tc_count = dcb_config->num_tcs.pg_tcs;
391 vt_mode = dcb_config->vt_mode;
394 if (!((tc_count == 8 && vt_mode == FALSE) || tc_count == 4))
395 return IXGBE_ERR_PARAM;
397 if (tc_count == 8 && vt_mode == FALSE) {
399 * Receive Queues stats setting
400 * 32 RQSMR registers, each configuring 4 queues.
402 * Set all 16 queues of each TC to the same stat
403 * with TC 'n' going to stat 'n'.
405 for (i = 0; i < 32; i++) {
406 reg = 0x01010101 * (i / 4);
407 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
410 * Transmit Queues stats setting
411 * 32 TQSM registers, each controlling 4 queues.
413 * Set all queues of each TC to the same stat
414 * with TC 'n' going to stat 'n'.
415 * Tx queues are allocated non-uniformly to TCs:
416 * 32, 32, 16, 16, 8, 8, 8, 8.
418 for (i = 0; i < 32; i++) {
435 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
437 } else if (tc_count == 4 && vt_mode == FALSE) {
439 * Receive Queues stats setting
440 * 32 RQSMR registers, each configuring 4 queues.
442 * Set all 16 queues of each TC to the same stat
443 * with TC 'n' going to stat 'n'.
445 for (i = 0; i < 32; i++) {
447 /* In 4 TC mode, odd 16-queue ranges are
451 reg = 0x01010101 * (i / 8);
452 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
455 * Transmit Queues stats setting
456 * 32 TQSM registers, each controlling 4 queues.
458 * Set all queues of each TC to the same stat
459 * with TC 'n' going to stat 'n'.
460 * Tx queues are allocated non-uniformly to TCs:
463 for (i = 0; i < 32; i++) {
472 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
474 } else if (tc_count == 4 && vt_mode == TRUE) {
476 * Receive Queues stats setting
477 * 32 RQSMR registers, each configuring 4 queues.
479 * Queue Indexing in 32 VF with DCB mode maps 4 TC's to each
480 * pool. Set all 32 queues of each TC across pools to the same
481 * stat with TC 'n' going to stat 'n'.
483 for (i = 0; i < 32; i++)
484 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), 0x03020100);
486 * Transmit Queues stats setting
487 * 32 TQSM registers, each controlling 4 queues.
489 * Queue Indexing in 32 VF with DCB mode maps 4 TC's to each
490 * pool. Set all 32 queues of each TC across pools to the same
491 * stat with TC 'n' going to stat 'n'.
493 for (i = 0; i < 32; i++)
494 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), 0x03020100);
497 return IXGBE_SUCCESS;
501 * ixgbe_dcb_config_82599 - Configure general DCB parameters
502 * @hw: pointer to hardware structure
503 * @dcb_config: pointer to ixgbe_dcb_config structure
505 * Configure general DCB parameters.
507 s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw,
508 struct ixgbe_dcb_config *dcb_config)
513 /* Disable the Tx desc arbiter so that MTQC can be changed */
514 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
515 reg |= IXGBE_RTTDCS_ARBDIS;
516 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
518 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
519 if (dcb_config->num_tcs.pg_tcs == 8) {
520 /* Enable DCB for Rx with 8 TCs */
521 switch (reg & IXGBE_MRQC_MRQE_MASK) {
523 case IXGBE_MRQC_RT4TCEN:
524 /* RSS disabled cases */
525 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
528 case IXGBE_MRQC_RSSEN:
529 case IXGBE_MRQC_RTRSS4TCEN:
530 /* RSS enabled cases */
531 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
532 IXGBE_MRQC_RTRSS8TCEN;
536 * Unsupported value, assume stale data,
540 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
544 if (dcb_config->num_tcs.pg_tcs == 4) {
545 /* We support both VT-on and VT-off with 4 TCs. */
546 if (dcb_config->vt_mode)
547 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
548 IXGBE_MRQC_VMDQRT4TCEN;
550 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) |
551 IXGBE_MRQC_RTRSS4TCEN;
553 IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
555 /* Enable DCB for Tx with 8 TCs */
556 if (dcb_config->num_tcs.pg_tcs == 8)
557 reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
559 /* We support both VT-on and VT-off with 4 TCs. */
560 reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_4TC_4TQ;
561 if (dcb_config->vt_mode)
562 reg |= IXGBE_MTQC_VT_ENA;
564 IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
566 /* Disable drop for all queues */
567 for (q = 0; q < 128; q++)
568 IXGBE_WRITE_REG(hw, IXGBE_QDE,
569 (IXGBE_QDE_WRITE | (q << IXGBE_QDE_IDX_SHIFT)));
571 /* Enable the Tx desc arbiter */
572 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
573 reg &= ~IXGBE_RTTDCS_ARBDIS;
574 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
576 /* Enable Security TX Buffer IFG for DCB */
577 reg = IXGBE_READ_REG(hw, IXGBE_SECTXMINIFG);
578 reg |= IXGBE_SECTX_DCB;
579 IXGBE_WRITE_REG(hw, IXGBE_SECTXMINIFG, reg);
581 return IXGBE_SUCCESS;
585 * ixgbe_dcb_hw_config_82599 - Configure and enable DCB
586 * @hw: pointer to hardware structure
587 * @link_speed: unused
588 * @refill: refill credits index by traffic class
589 * @max: max credits index by traffic class
590 * @bwg_id: bandwidth grouping indexed by traffic class
591 * @tsa: transmission selection algorithm indexed by traffic class
592 * @map: priority to tc assignments indexed by priority
594 * Configure dcb settings and enable dcb mode.
596 s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, int link_speed,
597 u16 *refill, u16 *max, u8 *bwg_id, u8 *tsa,
600 UNREFERENCED_1PARAMETER(link_speed);
602 ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, tsa,
604 ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, bwg_id,
606 ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, bwg_id,
609 return IXGBE_SUCCESS;