FreeBSD kernel IXGBE device code
ixgbe_dcb_82598.c
Go to the documentation of this file.
1/******************************************************************************
2 SPDX-License-Identifier: BSD-3-Clause
3
4 Copyright (c) 2001-2020, 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$*/
35
36
37#include "ixgbe_type.h"
38#include "ixgbe_dcb.h"
39#include "ixgbe_dcb_82598.h"
40
50 struct ixgbe_hw_stats *stats,
51 u8 tc_count)
52{
53 int tc;
54
55 DEBUGFUNC("dcb_get_tc_stats");
56
57 if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
58 return IXGBE_ERR_PARAM;
59
60 /* Statistics pertaining to each traffic class */
61 for (tc = 0; tc < tc_count; tc++) {
62 /* Transmitted Packets */
63 stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc));
64 /* Transmitted Bytes */
65 stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC(tc));
66 /* Received Packets */
67 stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc));
68 /* Received Bytes */
69 stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC(tc));
70 }
71
72 return IXGBE_SUCCESS;
73}
74
84 struct ixgbe_hw_stats *stats,
85 u8 tc_count)
86{
87 int tc;
88
89 DEBUGFUNC("dcb_get_pfc_stats");
90
91 if (tc_count > IXGBE_DCB_MAX_TRAFFIC_CLASS)
92 return IXGBE_ERR_PARAM;
93
94 for (tc = 0; tc < tc_count; tc++) {
95 /* Priority XOFF Transmitted */
96 stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc));
97 /* Priority XOFF Received */
98 stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXC(tc));
99 }
100
101 return IXGBE_SUCCESS;
102}
103
114 u16 *max, u8 *tsa)
115{
116 u32 reg = 0;
117 u32 credit_refill = 0;
118 u32 credit_max = 0;
119 u8 i = 0;
120
123
124 reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
125 /* Enable Arbiter */
126 reg &= ~IXGBE_RMCS_ARBDIS;
127 /* Enable Receive Recycle within the BWG */
128 reg |= IXGBE_RMCS_RRM;
129 /* Enable Deficit Fixed Priority arbitration*/
130 reg |= IXGBE_RMCS_DFP;
131
132 IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
133
134 /* Configure traffic class credits and priority */
135 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
136 credit_refill = refill[i];
137 credit_max = max[i];
138
139 reg = credit_refill | (credit_max << IXGBE_RT2CR_MCL_SHIFT);
140
141 if (tsa[i] == ixgbe_dcb_tsa_strict)
142 reg |= IXGBE_RT2CR_LSP;
143
144 IXGBE_WRITE_REG(hw, IXGBE_RT2CR(i), reg);
145 }
146
147 reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
149 reg |= IXGBE_RDRXCTL_MPBEN;
150 reg |= IXGBE_RDRXCTL_MCEN;
152
153 reg = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
154 /* Make sure there is enough descriptors before arbitration */
155 reg &= ~IXGBE_RXCTRL_DMBYPS;
157
158 return IXGBE_SUCCESS;
159}
160
172 u16 *refill, u16 *max, u8 *bwg_id,
173 u8 *tsa)
174{
175 u32 reg, max_credits;
176 u8 i;
177
178 reg = IXGBE_READ_REG(hw, IXGBE_DPMCS);
179
180 /* Enable arbiter */
181 reg &= ~IXGBE_DPMCS_ARBDIS;
182 reg |= IXGBE_DPMCS_TSOEF;
183
184 /* Configure Max TSO packet size 34KB including payload and headers */
185 reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
186
188
189 /* Configure traffic class credits and priority */
190 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
191 max_credits = max[i];
192 reg = max_credits << IXGBE_TDTQ2TCCR_MCL_SHIFT;
193 reg |= (u32)(refill[i]);
194 reg |= (u32)(bwg_id[i]) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
195
196 if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
197 reg |= IXGBE_TDTQ2TCCR_GSP;
198
199 if (tsa[i] == ixgbe_dcb_tsa_strict)
200 reg |= IXGBE_TDTQ2TCCR_LSP;
201
202 IXGBE_WRITE_REG(hw, IXGBE_TDTQ2TCCR(i), reg);
203 }
204
205 return IXGBE_SUCCESS;
206}
207
219 u16 *refill, u16 *max, u8 *bwg_id,
220 u8 *tsa)
221{
222 u32 reg;
223 u8 i;
224
225 reg = IXGBE_READ_REG(hw, IXGBE_PDPMCS);
226 /* Enable Data Plane Arbiter */
227 reg &= ~IXGBE_PDPMCS_ARBDIS;
228 /* Enable DFP and Transmit Recycle Mode */
230
232
233 /* Configure traffic class credits and priority */
234 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
235 reg = refill[i];
236 reg |= (u32)(max[i]) << IXGBE_TDPT2TCCR_MCL_SHIFT;
237 reg |= (u32)(bwg_id[i]) << IXGBE_TDPT2TCCR_BWG_SHIFT;
238
239 if (tsa[i] == ixgbe_dcb_tsa_group_strict_cee)
240 reg |= IXGBE_TDPT2TCCR_GSP;
241
242 if (tsa[i] == ixgbe_dcb_tsa_strict)
243 reg |= IXGBE_TDPT2TCCR_LSP;
244
245 IXGBE_WRITE_REG(hw, IXGBE_TDPT2TCCR(i), reg);
246 }
247
248 /* Enable Tx packet buffer division */
249 reg = IXGBE_READ_REG(hw, IXGBE_DTXCTL);
252
253 return IXGBE_SUCCESS;
254}
255
264{
265 u32 fcrtl, reg;
266 u8 i;
267
268 /* Enable Transmit Priority Flow Control */
269 reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
270 reg &= ~IXGBE_RMCS_TFCE_802_3X;
272 IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
273
274 /* Enable Receive Priority Flow Control */
275 reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
277
278 if (pfc_en)
279 reg |= IXGBE_FCTRL_RPFCE;
280
282
283 /* Configure PFC Tx thresholds per TC */
284 for (i = 0; i < IXGBE_DCB_MAX_TRAFFIC_CLASS; i++) {
285 if (!(pfc_en & (1 << i))) {
286 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
287 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
288 continue;
289 }
290
291 fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
292 reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
293 IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
294 IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), reg);
295 }
296
297 /* Configure pause time */
298 reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
299 for (i = 0; i < (IXGBE_DCB_MAX_TRAFFIC_CLASS / 2); i++)
300 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
301
302 /* Configure flow control refresh threshold value */
304
305 return IXGBE_SUCCESS;
306}
307
316{
317 u32 reg = 0;
318 u8 i = 0;
319 u8 j = 0;
320
321 /* Receive Queues stats setting - 8 queues per statistics reg */
322 for (i = 0, j = 0; i < 15 && j < 8; i = i + 2, j++) {
323 reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i));
324 reg |= ((0x1010101) * j);
325 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
326 reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i + 1));
327 reg |= ((0x1010101) * j);
328 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i + 1), reg);
329 }
330 /* Transmit Queues stats setting - 4 queues per statistics reg*/
331 for (i = 0; i < 8; i++) {
332 reg = IXGBE_READ_REG(hw, IXGBE_TQSMR(i));
333 reg |= ((0x1010101) * i);
334 IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i), reg);
335 }
336
337 return IXGBE_SUCCESS;
338}
339
351s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, int link_speed,
352 u16 *refill, u16 *max, u8 *bwg_id,
353 u8 *tsa)
354{
355 UNREFERENCED_1PARAMETER(link_speed);
356
357 ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, tsa);
358 ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max, bwg_id,
359 tsa);
360 ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max, bwg_id,
361 tsa);
363
364
365 return IXGBE_SUCCESS;
366}
@ ixgbe_dcb_tsa_group_strict_cee
Definition: ixgbe_dcb.h:78
@ ixgbe_dcb_tsa_strict
Definition: ixgbe_dcb.h:79
s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw, u16 *refill, u16 *max, u8 *tsa)
s32 ixgbe_dcb_get_pfc_stats_82598(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, u8 tc_count)
s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw)
s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, int link_speed, u16 *refill, u16 *max, u8 *bwg_id, u8 *tsa)
s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw, u16 *refill, u16 *max, u8 *bwg_id, u8 *tsa)
s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw, u16 *refill, u16 *max, u8 *bwg_id, u8 *tsa)
s32 ixgbe_dcb_get_tc_stats_82598(struct ixgbe_hw *hw, struct ixgbe_hw_stats *stats, u8 tc_count)
#define IXGBE_DTXCTL_ENDBUBD
#define IXGBE_TDPT2TCCR_LSP
#define IXGBE_PDPMCS_TRM
#define IXGBE_TDPT2TCCR_BWG_SHIFT
#define IXGBE_PDPMCS_TPPAC
#define IXGBE_DPMCS_TSOEF
#define IXGBE_TDTQ2TCCR_GSP
#define IXGBE_TDPT2TCCR_GSP
#define IXGBE_RUPPBMR_MQA
#define IXGBE_TDTQ2TCCR_MCL_SHIFT
#define IXGBE_RDRXCTL_MPBEN
#define IXGBE_RT2CR_MCL_SHIFT
#define IXGBE_DPMCS_MTSOS_SHIFT
#define IXGBE_RDRXCTL_MCEN
#define IXGBE_TDPT2TCCR_MCL_SHIFT
#define IXGBE_TDTQ2TCCR_BWG_SHIFT
#define IXGBE_TDTQ2TCCR_LSP
#define IXGBE_RT2CR_LSP
#define IXGBE_READ_REG(a, reg)
Definition: ixgbe_osdep.h:224
uint8_t u8
Definition: ixgbe_osdep.h:143
#define DEBUGFUNC(F)
Definition: ixgbe_osdep.h:76
#define UNREFERENCED_1PARAMETER(_p)
Definition: ixgbe_osdep.h:126
#define IXGBE_WRITE_REG(a, reg, val)
Definition: ixgbe_osdep.h:227
uint16_t u16
Definition: ixgbe_osdep.h:145
int32_t s32
Definition: ixgbe_osdep.h:148
uint32_t u32
Definition: ixgbe_osdep.h:147
#define IXGBE_PDPMCS
Definition: ixgbe_type.h:712
#define IXGBE_RXCTRL
Definition: ixgbe_type.h:437
#define IXGBE_RMCS_TFCE_PRIORITY
Definition: ixgbe_type.h:1898
#define IXGBE_PXOFFTXC(_i)
Definition: ixgbe_type.h:1001
#define IXGBE_RDRXCTL_RDMTS_1_2
Definition: ixgbe_type.h:1454
#define IXGBE_FCRTH_FCEN
Definition: ixgbe_type.h:1886
#define IXGBE_DCB_MAX_TRAFFIC_CLASS
Definition: ixgbe_type.h:709
#define IXGBE_FCRTL(_i)
Definition: ixgbe_type.h:391
#define IXGBE_TQSMR(_i)
Definition: ixgbe_type.h:1041
#define IXGBE_SUCCESS
Definition: ixgbe_type.h:4234
#define IXGBE_RMCS
Definition: ixgbe_type.h:710
#define IXGBE_QBRC(_i)
Definition: ixgbe_type.h:1047
#define IXGBE_FCTRL_RFCE
Definition: ixgbe_type.h:2661
#define IXGBE_FCTTV(_i)
Definition: ixgbe_type.h:390
#define IXGBE_FCRTH(_i)
Definition: ixgbe_type.h:392
#define IXGBE_FCTRL_RPFCE
Definition: ixgbe_type.h:2660
#define IXGBE_PXOFFRXC(_i)
Definition: ixgbe_type.h:1002
#define IXGBE_FCTRL
Definition: ixgbe_type.h:464
#define IXGBE_RQSMR(_i)
Definition: ixgbe_type.h:1040
#define IXGBE_QBTC(_i)
Definition: ixgbe_type.h:1048
#define IXGBE_RUPPBMR
Definition: ixgbe_type.h:713
#define IXGBE_ERR_PARAM
Definition: ixgbe_type.h:4239
#define IXGBE_FCRTL_XONE
Definition: ixgbe_type.h:1885
#define IXGBE_TDPT2TCCR(_i)
Definition: ixgbe_type.h:718
#define IXGBE_RDRXCTL
Definition: ixgbe_type.h:434
#define IXGBE_DTXCTL
Definition: ixgbe_type.h:561
#define IXGBE_QPTC(_i)
Definition: ixgbe_type.h:1046
#define IXGBE_FCRTV
Definition: ixgbe_type.h:393
#define IXGBE_QPRC(_i)
Definition: ixgbe_type.h:1045
#define IXGBE_RMCS_RRM
Definition: ixgbe_type.h:1892
#define IXGBE_TDTQ2TCCR(_i)
Definition: ixgbe_type.h:716
#define IXGBE_DPMCS
Definition: ixgbe_type.h:711
#define IXGBE_RT2CR(_i)
Definition: ixgbe_type.h:714
#define IXGBE_RMCS_DFP
Definition: ixgbe_type.h:1896
u32 low_water[IXGBE_DCB_MAX_TRAFFIC_CLASS]
Definition: ixgbe_type.h:3839
u32 high_water[IXGBE_DCB_MAX_TRAFFIC_CLASS]
Definition: ixgbe_type.h:3838
struct ixgbe_fc_info fc
Definition: ixgbe_type.h:4209