1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#include "ixgbe.h"
29#include "ixgbe_type.h"
30#include "ixgbe_dcb.h"
31#include "ixgbe_dcb_82599.h"
32
33
34
35
36
37
38
39
40
41s32 ixgbe_dcb_get_tc_stats_82599(struct ixgbe_hw *hw,
42 struct ixgbe_hw_stats *stats,
43 u8 tc_count)
44{
45 int tc;
46
47 if (tc_count > MAX_TRAFFIC_CLASS)
48 return DCB_ERR_PARAM;
49
50 for (tc = 0; tc < tc_count; tc++) {
51
52 stats->qptc[tc] += IXGBE_READ_REG(hw, IXGBE_QPTC(tc));
53
54 stats->qbtc[tc] += IXGBE_READ_REG(hw, IXGBE_QBTC(tc));
55
56 stats->qprc[tc] += IXGBE_READ_REG(hw, IXGBE_QPRC(tc));
57
58 stats->qbrc[tc] += IXGBE_READ_REG(hw, IXGBE_QBRC(tc));
59 }
60
61 return 0;
62}
63
64
65
66
67
68
69
70
71
72s32 ixgbe_dcb_get_pfc_stats_82599(struct ixgbe_hw *hw,
73 struct ixgbe_hw_stats *stats,
74 u8 tc_count)
75{
76 int tc;
77
78 if (tc_count > MAX_TRAFFIC_CLASS)
79 return DCB_ERR_PARAM;
80 for (tc = 0; tc < tc_count; tc++) {
81
82 stats->pxofftxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFTXC(tc));
83
84 stats->pxoffrxc[tc] += IXGBE_READ_REG(hw, IXGBE_PXOFFRXCNT(tc));
85 }
86
87 return 0;
88}
89
90
91
92
93
94
95
96
97s32 ixgbe_dcb_config_packet_buffers_82599(struct ixgbe_hw *hw,
98 struct ixgbe_dcb_config *dcb_config)
99{
100 s32 ret_val = 0;
101 u32 value = IXGBE_RXPBSIZE_64KB;
102 u8 i = 0;
103
104
105 switch (dcb_config->rx_pba_cfg) {
106 case pba_80_48:
107
108 value = IXGBE_RXPBSIZE_80KB;
109 for (; i < 4; i++)
110 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), value);
111
112 value = IXGBE_RXPBSIZE_48KB;
113
114 case pba_equal:
115 default:
116 for (; i < IXGBE_MAX_PACKET_BUFFERS; i++)
117 IXGBE_WRITE_REG(hw, IXGBE_RXPBSIZE(i), value);
118
119
120 for (i = 0; i < IXGBE_MAX_PACKET_BUFFERS; i++) {
121 IXGBE_WRITE_REG(hw, IXGBE_TXPBSIZE(i),
122 IXGBE_TXPBSIZE_20KB);
123 IXGBE_WRITE_REG(hw, IXGBE_TXPBTHRESH(i),
124 IXGBE_TXPBTHRESH_DCB);
125 }
126 break;
127 }
128
129 return ret_val;
130}
131
132
133
134
135
136
137
138
139s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw,
140 struct ixgbe_dcb_config *dcb_config)
141{
142 struct tc_bw_alloc *p;
143 u32 reg = 0;
144 u32 credit_refill = 0;
145 u32 credit_max = 0;
146 u8 i = 0;
147
148
149
150
151
152 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS;
153 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
154
155
156 reg = 0;
157 for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
158 reg |= (i << (i * IXGBE_RTRUP2TC_UP_SHIFT));
159 IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg);
160
161
162 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
163 p = &dcb_config->tc_config[i].path[DCB_RX_CONFIG];
164
165 credit_refill = p->data_credits_refill;
166 credit_max = p->data_credits_max;
167 reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT);
168
169 reg |= (u32)(p->bwg_id) << IXGBE_RTRPT4C_BWG_SHIFT;
170
171 if (p->prio_type == prio_link)
172 reg |= IXGBE_RTRPT4C_LSP;
173
174 IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg);
175 }
176
177
178
179
180
181 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC;
182 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg);
183
184 return 0;
185}
186
187
188
189
190
191
192
193
194s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw,
195 struct ixgbe_dcb_config *dcb_config)
196{
197 struct tc_bw_alloc *p;
198 u32 reg, max_credits;
199 u8 i;
200
201
202 for (i = 0; i < 128; i++) {
203 IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i);
204 IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0);
205 }
206
207
208 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
209 p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
210 max_credits = dcb_config->tc_config[i].desc_credits_max;
211 reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT;
212 reg |= p->data_credits_refill;
213 reg |= (u32)(p->bwg_id) << IXGBE_RTTDT2C_BWG_SHIFT;
214
215 if (p->prio_type == prio_group)
216 reg |= IXGBE_RTTDT2C_GSP;
217
218 if (p->prio_type == prio_link)
219 reg |= IXGBE_RTTDT2C_LSP;
220
221 IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg);
222 }
223
224
225
226
227
228 reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM;
229 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
230
231 return 0;
232}
233
234
235
236
237
238
239
240
241s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw,
242 struct ixgbe_dcb_config *dcb_config)
243{
244 struct tc_bw_alloc *p;
245 u32 reg;
246 u8 i;
247
248
249
250
251
252 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
253 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) |
254 IXGBE_RTTPCS_ARBDIS;
255 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
256
257
258 reg = 0;
259 for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
260 reg |= (i << (i * IXGBE_RTTUP2TC_UP_SHIFT));
261 IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg);
262
263
264 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
265 p = &dcb_config->tc_config[i].path[DCB_TX_CONFIG];
266 reg = p->data_credits_refill;
267 reg |= (u32)(p->data_credits_max) << IXGBE_RTTPT2C_MCL_SHIFT;
268 reg |= (u32)(p->bwg_id) << IXGBE_RTTPT2C_BWG_SHIFT;
269
270 if (p->prio_type == prio_group)
271 reg |= IXGBE_RTTPT2C_GSP;
272
273 if (p->prio_type == prio_link)
274 reg |= IXGBE_RTTPT2C_LSP;
275
276 IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg);
277 }
278
279
280
281
282
283 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM |
284 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT);
285 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg);
286
287 return 0;
288}
289
290
291
292
293
294
295
296
297s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw,
298 struct ixgbe_dcb_config *dcb_config)
299{
300 u32 i, reg, rx_pba_size;
301
302
303 if (!dcb_config->pfc_mode_enable) {
304 for (i = 0; i < MAX_TRAFFIC_CLASS; i++)
305 hw->mac.ops.fc_enable(hw, i);
306 goto out;
307 }
308
309
310 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
311 if (dcb_config->rx_pba_cfg == pba_equal)
312 rx_pba_size = IXGBE_RXPBSIZE_64KB;
313 else
314 rx_pba_size = (i < 4) ? IXGBE_RXPBSIZE_80KB
315 : IXGBE_RXPBSIZE_48KB;
316
317 reg = ((rx_pba_size >> 5) & 0xFFE0);
318 if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
319 dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
320 reg |= IXGBE_FCRTL_XONE;
321 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), reg);
322
323 reg = ((rx_pba_size >> 2) & 0xFFE0);
324 if (dcb_config->tc_config[i].dcb_pfc == pfc_enabled_full ||
325 dcb_config->tc_config[i].dcb_pfc == pfc_enabled_tx)
326 reg |= IXGBE_FCRTH_FCEN;
327 IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg);
328 }
329
330
331 reg = hw->fc.pause_time | (hw->fc.pause_time << 16);
332 for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
333 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
334
335
336 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
337
338
339 reg = IXGBE_FCCFG_TFCE_PRIORITY;
340 IXGBE_WRITE_REG(hw, IXGBE_FCCFG, reg);
341
342
343
344
345
346
347 reg = IXGBE_READ_REG(hw, IXGBE_MFLCN);
348 reg &= ~IXGBE_MFLCN_RFCE;
349 reg |= IXGBE_MFLCN_RPFCE;
350 IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg);
351out:
352 return 0;
353}
354
355
356
357
358
359
360
361
362s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw)
363{
364 u32 reg = 0;
365 u8 i = 0;
366
367
368
369
370
371
372
373 for (i = 0; i < 32; i++) {
374 reg = 0x01010101 * (i / 4);
375 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
376 }
377
378
379
380
381
382
383
384
385 for (i = 0; i < 32; i++) {
386 if (i < 8)
387 reg = 0x00000000;
388 else if (i < 16)
389 reg = 0x01010101;
390 else if (i < 20)
391 reg = 0x02020202;
392 else if (i < 24)
393 reg = 0x03030303;
394 else if (i < 26)
395 reg = 0x04040404;
396 else if (i < 28)
397 reg = 0x05050505;
398 else if (i < 30)
399 reg = 0x06060606;
400 else
401 reg = 0x07070707;
402 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg);
403 }
404
405 return 0;
406}
407
408
409
410
411
412
413
414
415s32 ixgbe_dcb_config_82599(struct ixgbe_hw *hw)
416{
417 u32 reg;
418 u32 q;
419
420
421 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
422 reg |= IXGBE_RTTDCS_ARBDIS;
423 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
424
425
426 reg = IXGBE_READ_REG(hw, IXGBE_MRQC);
427 switch (reg & IXGBE_MRQC_MRQE_MASK) {
428 case 0:
429 case IXGBE_MRQC_RT4TCEN:
430
431 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RT8TCEN;
432 break;
433 case IXGBE_MRQC_RSSEN:
434 case IXGBE_MRQC_RTRSS4TCEN:
435
436 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RTRSS8TCEN;
437 break;
438 default:
439
440 reg = (reg & ~IXGBE_MRQC_MRQE_MASK) | IXGBE_MRQC_RT8TCEN;
441 }
442 IXGBE_WRITE_REG(hw, IXGBE_MRQC, reg);
443
444
445 reg = IXGBE_MTQC_RT_ENA | IXGBE_MTQC_8TC_8TQ;
446 IXGBE_WRITE_REG(hw, IXGBE_MTQC, reg);
447
448
449 for (q = 0; q < 128; q++)
450 IXGBE_WRITE_REG(hw, IXGBE_QDE, q << IXGBE_QDE_IDX_SHIFT);
451
452
453 reg = IXGBE_READ_REG(hw, IXGBE_RTTDCS);
454 reg &= ~IXGBE_RTTDCS_ARBDIS;
455 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg);
456
457 return 0;
458}
459
460
461
462
463
464
465
466
467s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw,
468 struct ixgbe_dcb_config *dcb_config)
469{
470 ixgbe_dcb_config_packet_buffers_82599(hw, dcb_config);
471 ixgbe_dcb_config_82599(hw);
472 ixgbe_dcb_config_rx_arbiter_82599(hw, dcb_config);
473 ixgbe_dcb_config_tx_desc_arbiter_82599(hw, dcb_config);
474 ixgbe_dcb_config_tx_data_arbiter_82599(hw, dcb_config);
475 ixgbe_dcb_config_pfc_82599(hw, dcb_config);
476 ixgbe_dcb_config_tc_stats_82599(hw);
477
478 return 0;
479}
480
481