xref: /freebsd/sys/dev/ixgbe/ixgbe_dcb_82598.c (revision 7ef62cebc2f965b0f640263e179276928885e33d)
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 
41 /**
42  * ixgbe_dcb_get_tc_stats_82598 - Return status data for each traffic class
43  * @hw: pointer to hardware structure
44  * @stats: pointer to statistics structure
45  * @tc_count:  Number of elements in bwg_array.
46  *
47  * This function returns the status data for each of the Traffic Classes in use.
48  */
49 s32 ixgbe_dcb_get_tc_stats_82598(struct ixgbe_hw *hw,
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 
75 /**
76  * ixgbe_dcb_get_pfc_stats_82598 - Returns CBFC status data
77  * @hw: pointer to hardware structure
78  * @stats: pointer to statistics structure
79  * @tc_count:  Number of elements in bwg_array.
80  *
81  * This function returns the CBFC status data for each of the Traffic Classes.
82  */
83 s32 ixgbe_dcb_get_pfc_stats_82598(struct ixgbe_hw *hw,
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 
104 /**
105  * ixgbe_dcb_config_rx_arbiter_82598 - Config Rx data arbiter
106  * @hw: pointer to hardware structure
107  * @refill: refill credits index by traffic class
108  * @max: max credits index by traffic class
109  * @tsa: transmission selection algorithm indexed by traffic class
110  *
111  * Configure Rx Data Arbiter and credits for each traffic class.
112  */
113 s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw, u16 *refill,
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 
121 	reg = IXGBE_READ_REG(hw, IXGBE_RUPPBMR) | IXGBE_RUPPBMR_MQA;
122 	IXGBE_WRITE_REG(hw, IXGBE_RUPPBMR, reg);
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);
148 	reg |= IXGBE_RDRXCTL_RDMTS_1_2;
149 	reg |= IXGBE_RDRXCTL_MPBEN;
150 	reg |= IXGBE_RDRXCTL_MCEN;
151 	IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
152 
153 	reg = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
154 	/* Make sure there is enough descriptors before arbitration */
155 	reg &= ~IXGBE_RXCTRL_DMBYPS;
156 	IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg);
157 
158 	return IXGBE_SUCCESS;
159 }
160 
161 /**
162  * ixgbe_dcb_config_tx_desc_arbiter_82598 - Config Tx Desc. arbiter
163  * @hw: pointer to hardware structure
164  * @refill: refill credits index by traffic class
165  * @max: max credits index by traffic class
166  * @bwg_id: bandwidth grouping indexed by traffic class
167  * @tsa: transmission selection algorithm indexed by traffic class
168  *
169  * Configure Tx Descriptor Arbiter and credits for each traffic class.
170  */
171 s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
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 
187 	IXGBE_WRITE_REG(hw, IXGBE_DPMCS, reg);
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 
208 /**
209  * ixgbe_dcb_config_tx_data_arbiter_82598 - Config Tx data arbiter
210  * @hw: pointer to hardware structure
211  * @refill: refill credits index by traffic class
212  * @max: max credits index by traffic class
213  * @bwg_id: bandwidth grouping indexed by traffic class
214  * @tsa: transmission selection algorithm indexed by traffic class
215  *
216  * Configure Tx Data Arbiter and credits for each traffic class.
217  */
218 s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw,
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 */
229 	reg |= (IXGBE_PDPMCS_TPPAC | IXGBE_PDPMCS_TRM);
230 
231 	IXGBE_WRITE_REG(hw, IXGBE_PDPMCS, reg);
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);
250 	reg |= IXGBE_DTXCTL_ENDBUBD;
251 	IXGBE_WRITE_REG(hw, IXGBE_DTXCTL, reg);
252 
253 	return IXGBE_SUCCESS;
254 }
255 
256 /**
257  * ixgbe_dcb_config_pfc_82598 - Config priority flow control
258  * @hw: pointer to hardware structure
259  * @pfc_en: enabled pfc bitmask
260  *
261  * Configure Priority Flow Control for each traffic class.
262  */
263 s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
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;
271 	reg |= IXGBE_RMCS_TFCE_PRIORITY;
272 	IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
273 
274 	/* Enable Receive Priority Flow Control */
275 	reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
276 	reg &= ~(IXGBE_FCTRL_RPFCE | IXGBE_FCTRL_RFCE);
277 
278 	if (pfc_en)
279 		reg |= IXGBE_FCTRL_RPFCE;
280 
281 	IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
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 */
303 	IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
304 
305 	return IXGBE_SUCCESS;
306 }
307 
308 /**
309  * ixgbe_dcb_config_tc_stats_82598 - Configure traffic class statistics
310  * @hw: pointer to hardware structure
311  *
312  * Configure queue statistics registers, all queues belonging to same traffic
313  * class uses a single set of queue statistics counters.
314  */
315 s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw)
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 
340 /**
341  * ixgbe_dcb_hw_config_82598 - Config and enable DCB
342  * @hw: pointer to hardware structure
343  * @link_speed: unused
344  * @refill: refill credits index by traffic class
345  * @max: max credits index by traffic class
346  * @bwg_id: bandwidth grouping indexed by traffic class
347  * @tsa: transmission selection algorithm indexed by traffic class
348  *
349  * Configure dcb settings and enable dcb mode.
350  */
351 s32 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);
362 	ixgbe_dcb_config_tc_stats_82598(hw);
363 
364 
365 	return IXGBE_SUCCESS;
366 }
367