ixgbe_dcb_82599.c (9584B)
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright(c) 1999 - 2018 Intel Corporation. */ 3 4#include "ixgbe.h" 5#include "ixgbe_type.h" 6#include "ixgbe_dcb.h" 7#include "ixgbe_dcb_82599.h" 8 9/** 10 * ixgbe_dcb_config_rx_arbiter_82599 - Config Rx Data arbiter 11 * @hw: pointer to hardware structure 12 * @refill: refill credits index by traffic class 13 * @max: max credits index by traffic class 14 * @bwg_id: bandwidth grouping indexed by traffic class 15 * @prio_type: priority type indexed by traffic class 16 * @prio_tc: priority to tc assignments indexed by priority 17 * 18 * Configure Rx Packet Arbiter and credits for each traffic class. 19 */ 20s32 ixgbe_dcb_config_rx_arbiter_82599(struct ixgbe_hw *hw, 21 u16 *refill, 22 u16 *max, 23 u8 *bwg_id, 24 u8 *prio_type, 25 u8 *prio_tc) 26{ 27 u32 reg = 0; 28 u32 credit_refill = 0; 29 u32 credit_max = 0; 30 u8 i = 0; 31 32 /* 33 * Disable the arbiter before changing parameters 34 * (always enable recycle mode; WSP) 35 */ 36 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC | IXGBE_RTRPCS_ARBDIS; 37 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); 38 39 /* Map all traffic classes to their UP */ 40 reg = 0; 41 for (i = 0; i < MAX_USER_PRIORITY; i++) 42 reg |= (prio_tc[i] << (i * IXGBE_RTRUP2TC_UP_SHIFT)); 43 IXGBE_WRITE_REG(hw, IXGBE_RTRUP2TC, reg); 44 45 /* Configure traffic class credits and priority */ 46 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 47 credit_refill = refill[i]; 48 credit_max = max[i]; 49 reg = credit_refill | (credit_max << IXGBE_RTRPT4C_MCL_SHIFT); 50 51 reg |= (u32)(bwg_id[i]) << IXGBE_RTRPT4C_BWG_SHIFT; 52 53 if (prio_type[i] == prio_link) 54 reg |= IXGBE_RTRPT4C_LSP; 55 56 IXGBE_WRITE_REG(hw, IXGBE_RTRPT4C(i), reg); 57 } 58 59 /* 60 * Configure Rx packet plane (recycle mode; WSP) and 61 * enable arbiter 62 */ 63 reg = IXGBE_RTRPCS_RRM | IXGBE_RTRPCS_RAC; 64 IXGBE_WRITE_REG(hw, IXGBE_RTRPCS, reg); 65 66 return 0; 67} 68 69/** 70 * ixgbe_dcb_config_tx_desc_arbiter_82599 - Config Tx Desc. arbiter 71 * @hw: pointer to hardware structure 72 * @refill: refill credits index by traffic class 73 * @max: max credits index by traffic class 74 * @bwg_id: bandwidth grouping indexed by traffic class 75 * @prio_type: priority type indexed by traffic class 76 * 77 * Configure Tx Descriptor Arbiter and credits for each traffic class. 78 */ 79s32 ixgbe_dcb_config_tx_desc_arbiter_82599(struct ixgbe_hw *hw, 80 u16 *refill, 81 u16 *max, 82 u8 *bwg_id, 83 u8 *prio_type) 84{ 85 u32 reg, max_credits; 86 u8 i; 87 88 /* Clear the per-Tx queue credits; we use per-TC instead */ 89 for (i = 0; i < 128; i++) { 90 IXGBE_WRITE_REG(hw, IXGBE_RTTDQSEL, i); 91 IXGBE_WRITE_REG(hw, IXGBE_RTTDT1C, 0); 92 } 93 94 /* Configure traffic class credits and priority */ 95 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 96 max_credits = max[i]; 97 reg = max_credits << IXGBE_RTTDT2C_MCL_SHIFT; 98 reg |= refill[i]; 99 reg |= (u32)(bwg_id[i]) << IXGBE_RTTDT2C_BWG_SHIFT; 100 101 if (prio_type[i] == prio_group) 102 reg |= IXGBE_RTTDT2C_GSP; 103 104 if (prio_type[i] == prio_link) 105 reg |= IXGBE_RTTDT2C_LSP; 106 107 IXGBE_WRITE_REG(hw, IXGBE_RTTDT2C(i), reg); 108 } 109 110 /* 111 * Configure Tx descriptor plane (recycle mode; WSP) and 112 * enable arbiter 113 */ 114 reg = IXGBE_RTTDCS_TDPAC | IXGBE_RTTDCS_TDRM; 115 IXGBE_WRITE_REG(hw, IXGBE_RTTDCS, reg); 116 117 return 0; 118} 119 120/** 121 * ixgbe_dcb_config_tx_data_arbiter_82599 - Config Tx Data arbiter 122 * @hw: pointer to hardware structure 123 * @refill: refill credits index by traffic class 124 * @max: max credits index by traffic class 125 * @bwg_id: bandwidth grouping indexed by traffic class 126 * @prio_type: priority type indexed by traffic class 127 * @prio_tc: priority to tc assignments indexed by priority 128 * 129 * Configure Tx Packet Arbiter and credits for each traffic class. 130 */ 131s32 ixgbe_dcb_config_tx_data_arbiter_82599(struct ixgbe_hw *hw, 132 u16 *refill, 133 u16 *max, 134 u8 *bwg_id, 135 u8 *prio_type, 136 u8 *prio_tc) 137{ 138 u32 reg; 139 u8 i; 140 141 /* 142 * Disable the arbiter before changing parameters 143 * (always enable recycle mode; SP; arb delay) 144 */ 145 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | 146 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT) | 147 IXGBE_RTTPCS_ARBDIS; 148 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); 149 150 /* Map all traffic classes to their UP */ 151 reg = 0; 152 for (i = 0; i < MAX_USER_PRIORITY; i++) 153 reg |= (prio_tc[i] << (i * IXGBE_RTTUP2TC_UP_SHIFT)); 154 IXGBE_WRITE_REG(hw, IXGBE_RTTUP2TC, reg); 155 156 /* Configure traffic class credits and priority */ 157 for (i = 0; i < MAX_TRAFFIC_CLASS; i++) { 158 reg = refill[i]; 159 reg |= (u32)(max[i]) << IXGBE_RTTPT2C_MCL_SHIFT; 160 reg |= (u32)(bwg_id[i]) << IXGBE_RTTPT2C_BWG_SHIFT; 161 162 if (prio_type[i] == prio_group) 163 reg |= IXGBE_RTTPT2C_GSP; 164 165 if (prio_type[i] == prio_link) 166 reg |= IXGBE_RTTPT2C_LSP; 167 168 IXGBE_WRITE_REG(hw, IXGBE_RTTPT2C(i), reg); 169 } 170 171 /* 172 * Configure Tx packet plane (recycle mode; SP; arb delay) and 173 * enable arbiter 174 */ 175 reg = IXGBE_RTTPCS_TPPAC | IXGBE_RTTPCS_TPRM | 176 (IXGBE_RTTPCS_ARBD_DCB << IXGBE_RTTPCS_ARBD_SHIFT); 177 IXGBE_WRITE_REG(hw, IXGBE_RTTPCS, reg); 178 179 return 0; 180} 181 182/** 183 * ixgbe_dcb_config_pfc_82599 - Configure priority flow control 184 * @hw: pointer to hardware structure 185 * @pfc_en: enabled pfc bitmask 186 * @prio_tc: priority to tc assignments indexed by priority 187 * 188 * Configure Priority Flow Control (PFC) for each traffic class. 189 */ 190s32 ixgbe_dcb_config_pfc_82599(struct ixgbe_hw *hw, u8 pfc_en, u8 *prio_tc) 191{ 192 u32 i, j, fcrtl, reg; 193 u8 max_tc = 0; 194 195 /* Enable Transmit Priority Flow Control */ 196 IXGBE_WRITE_REG(hw, IXGBE_FCCFG, IXGBE_FCCFG_TFCE_PRIORITY); 197 198 /* Enable Receive Priority Flow Control */ 199 reg = IXGBE_READ_REG(hw, IXGBE_MFLCN); 200 reg |= IXGBE_MFLCN_DPF; 201 202 /* 203 * X540 & X550 supports per TC Rx priority flow control. 204 * So clear all TCs and only enable those that should be 205 * enabled. 206 */ 207 reg &= ~(IXGBE_MFLCN_RPFCE_MASK | IXGBE_MFLCN_RFCE); 208 209 if (hw->mac.type >= ixgbe_mac_X540) 210 reg |= pfc_en << IXGBE_MFLCN_RPFCE_SHIFT; 211 212 if (pfc_en) 213 reg |= IXGBE_MFLCN_RPFCE; 214 215 IXGBE_WRITE_REG(hw, IXGBE_MFLCN, reg); 216 217 for (i = 0; i < MAX_USER_PRIORITY; i++) { 218 if (prio_tc[i] > max_tc) 219 max_tc = prio_tc[i]; 220 } 221 222 223 /* Configure PFC Tx thresholds per TC */ 224 for (i = 0; i <= max_tc; i++) { 225 int enabled = 0; 226 227 for (j = 0; j < MAX_USER_PRIORITY; j++) { 228 if ((prio_tc[j] == i) && (pfc_en & BIT(j))) { 229 enabled = 1; 230 break; 231 } 232 } 233 234 if (enabled) { 235 reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN; 236 fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE; 237 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), fcrtl); 238 } else { 239 /* In order to prevent Tx hangs when the internal Tx 240 * switch is enabled we must set the high water mark 241 * to the Rx packet buffer size - 24KB. This allows 242 * the Tx switch to function even under heavy Rx 243 * workloads. 244 */ 245 reg = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(i)) - 24576; 246 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0); 247 } 248 249 IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), reg); 250 } 251 252 for (; i < MAX_TRAFFIC_CLASS; i++) { 253 IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(i), 0); 254 IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(i), 0); 255 } 256 257 /* Configure pause time (2 TCs per register) */ 258 reg = hw->fc.pause_time * 0x00010001; 259 for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++) 260 IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg); 261 262 /* Configure flow control refresh threshold value */ 263 IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2); 264 265 return 0; 266} 267 268/** 269 * ixgbe_dcb_config_tc_stats_82599 - Config traffic class statistics 270 * @hw: pointer to hardware structure 271 * 272 * Configure queue statistics registers, all queues belonging to same traffic 273 * class uses a single set of queue statistics counters. 274 */ 275static s32 ixgbe_dcb_config_tc_stats_82599(struct ixgbe_hw *hw) 276{ 277 u32 reg = 0; 278 u8 i = 0; 279 280 /* 281 * Receive Queues stats setting 282 * 32 RQSMR registers, each configuring 4 queues. 283 * Set all 16 queues of each TC to the same stat 284 * with TC 'n' going to stat 'n'. 285 */ 286 for (i = 0; i < 32; i++) { 287 reg = 0x01010101 * (i / 4); 288 IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg); 289 } 290 /* 291 * Transmit Queues stats setting 292 * 32 TQSM registers, each controlling 4 queues. 293 * Set all queues of each TC to the same stat 294 * with TC 'n' going to stat 'n'. 295 * Tx queues are allocated non-uniformly to TCs: 296 * 32, 32, 16, 16, 8, 8, 8, 8. 297 */ 298 for (i = 0; i < 32; i++) { 299 if (i < 8) 300 reg = 0x00000000; 301 else if (i < 16) 302 reg = 0x01010101; 303 else if (i < 20) 304 reg = 0x02020202; 305 else if (i < 24) 306 reg = 0x03030303; 307 else if (i < 26) 308 reg = 0x04040404; 309 else if (i < 28) 310 reg = 0x05050505; 311 else if (i < 30) 312 reg = 0x06060606; 313 else 314 reg = 0x07070707; 315 IXGBE_WRITE_REG(hw, IXGBE_TQSM(i), reg); 316 } 317 318 return 0; 319} 320 321/** 322 * ixgbe_dcb_hw_config_82599 - Configure and enable DCB 323 * @hw: pointer to hardware structure 324 * @pfc_en: enabled pfc bitmask 325 * @refill: refill credits index by traffic class 326 * @max: max credits index by traffic class 327 * @bwg_id: bandwidth grouping indexed by traffic class 328 * @prio_type: priority type indexed by traffic class 329 * @prio_tc: priority to tc assignments indexed by priority 330 * 331 * Configure dcb settings and enable dcb mode. 332 */ 333s32 ixgbe_dcb_hw_config_82599(struct ixgbe_hw *hw, u8 pfc_en, u16 *refill, 334 u16 *max, u8 *bwg_id, u8 *prio_type, u8 *prio_tc) 335{ 336 ixgbe_dcb_config_rx_arbiter_82599(hw, refill, max, bwg_id, 337 prio_type, prio_tc); 338 ixgbe_dcb_config_tx_desc_arbiter_82599(hw, refill, max, 339 bwg_id, prio_type); 340 ixgbe_dcb_config_tx_data_arbiter_82599(hw, refill, max, 341 bwg_id, prio_type, prio_tc); 342 ixgbe_dcb_config_pfc_82599(hw, pfc_en, prio_tc); 343 ixgbe_dcb_config_tc_stats_82599(hw); 344 345 return 0; 346} 347