ixgbe_dcb_82598.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright(c) 1999 - 2018 Intel Corporation. */
  3. #include "ixgbe.h"
  4. #include "ixgbe_type.h"
  5. #include "ixgbe_dcb.h"
  6. #include "ixgbe_dcb_82598.h"
  7. /**
  8. * ixgbe_dcb_config_rx_arbiter_82598 - Config Rx data arbiter
  9. * @hw: pointer to hardware structure
  10. * @refill: refill credits index by traffic class
  11. * @max: max credits index by traffic class
  12. * @prio_type: priority type indexed by traffic class
  13. *
  14. * Configure Rx Data Arbiter and credits for each traffic class.
  15. */
  16. s32 ixgbe_dcb_config_rx_arbiter_82598(struct ixgbe_hw *hw,
  17. u16 *refill,
  18. u16 *max,
  19. u8 *prio_type)
  20. {
  21. u32 reg = 0;
  22. u32 credit_refill = 0;
  23. u32 credit_max = 0;
  24. u8 i = 0;
  25. reg = IXGBE_READ_REG(hw, IXGBE_RUPPBMR) | IXGBE_RUPPBMR_MQA;
  26. IXGBE_WRITE_REG(hw, IXGBE_RUPPBMR, reg);
  27. reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
  28. /* Enable Arbiter */
  29. reg &= ~IXGBE_RMCS_ARBDIS;
  30. /* Enable Receive Recycle within the BWG */
  31. reg |= IXGBE_RMCS_RRM;
  32. /* Enable Deficit Fixed Priority arbitration*/
  33. reg |= IXGBE_RMCS_DFP;
  34. IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
  35. /* Configure traffic class credits and priority */
  36. for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
  37. credit_refill = refill[i];
  38. credit_max = max[i];
  39. reg = credit_refill | (credit_max << IXGBE_RT2CR_MCL_SHIFT);
  40. if (prio_type[i] == prio_link)
  41. reg |= IXGBE_RT2CR_LSP;
  42. IXGBE_WRITE_REG(hw, IXGBE_RT2CR(i), reg);
  43. }
  44. reg = IXGBE_READ_REG(hw, IXGBE_RDRXCTL);
  45. reg |= IXGBE_RDRXCTL_RDMTS_1_2;
  46. reg |= IXGBE_RDRXCTL_MPBEN;
  47. reg |= IXGBE_RDRXCTL_MCEN;
  48. IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, reg);
  49. reg = IXGBE_READ_REG(hw, IXGBE_RXCTRL);
  50. /* Make sure there is enough descriptors before arbitration */
  51. reg &= ~IXGBE_RXCTRL_DMBYPS;
  52. IXGBE_WRITE_REG(hw, IXGBE_RXCTRL, reg);
  53. return 0;
  54. }
  55. /**
  56. * ixgbe_dcb_config_tx_desc_arbiter_82598 - Config Tx Desc. arbiter
  57. * @hw: pointer to hardware structure
  58. * @refill: refill credits index by traffic class
  59. * @max: max credits index by traffic class
  60. * @bwg_id: bandwidth grouping indexed by traffic class
  61. * @prio_type: priority type indexed by traffic class
  62. *
  63. * Configure Tx Descriptor Arbiter and credits for each traffic class.
  64. */
  65. s32 ixgbe_dcb_config_tx_desc_arbiter_82598(struct ixgbe_hw *hw,
  66. u16 *refill,
  67. u16 *max,
  68. u8 *bwg_id,
  69. u8 *prio_type)
  70. {
  71. u32 reg, max_credits;
  72. u8 i;
  73. reg = IXGBE_READ_REG(hw, IXGBE_DPMCS);
  74. /* Enable arbiter */
  75. reg &= ~IXGBE_DPMCS_ARBDIS;
  76. reg |= IXGBE_DPMCS_TSOEF;
  77. /* Configure Max TSO packet size 34KB including payload and headers */
  78. reg |= (0x4 << IXGBE_DPMCS_MTSOS_SHIFT);
  79. IXGBE_WRITE_REG(hw, IXGBE_DPMCS, reg);
  80. /* Configure traffic class credits and priority */
  81. for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
  82. max_credits = max[i];
  83. reg = max_credits << IXGBE_TDTQ2TCCR_MCL_SHIFT;
  84. reg |= refill[i];
  85. reg |= (u32)(bwg_id[i]) << IXGBE_TDTQ2TCCR_BWG_SHIFT;
  86. if (prio_type[i] == prio_group)
  87. reg |= IXGBE_TDTQ2TCCR_GSP;
  88. if (prio_type[i] == prio_link)
  89. reg |= IXGBE_TDTQ2TCCR_LSP;
  90. IXGBE_WRITE_REG(hw, IXGBE_TDTQ2TCCR(i), reg);
  91. }
  92. return 0;
  93. }
  94. /**
  95. * ixgbe_dcb_config_tx_data_arbiter_82598 - Config Tx data arbiter
  96. * @hw: pointer to hardware structure
  97. * @refill: refill credits index by traffic class
  98. * @max: max credits index by traffic class
  99. * @bwg_id: bandwidth grouping indexed by traffic class
  100. * @prio_type: priority type indexed by traffic class
  101. *
  102. * Configure Tx Data Arbiter and credits for each traffic class.
  103. */
  104. s32 ixgbe_dcb_config_tx_data_arbiter_82598(struct ixgbe_hw *hw,
  105. u16 *refill,
  106. u16 *max,
  107. u8 *bwg_id,
  108. u8 *prio_type)
  109. {
  110. u32 reg;
  111. u8 i;
  112. reg = IXGBE_READ_REG(hw, IXGBE_PDPMCS);
  113. /* Enable Data Plane Arbiter */
  114. reg &= ~IXGBE_PDPMCS_ARBDIS;
  115. /* Enable DFP and Transmit Recycle Mode */
  116. reg |= (IXGBE_PDPMCS_TPPAC | IXGBE_PDPMCS_TRM);
  117. IXGBE_WRITE_REG(hw, IXGBE_PDPMCS, reg);
  118. /* Configure traffic class credits and priority */
  119. for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
  120. reg = refill[i];
  121. reg |= (u32)(max[i]) << IXGBE_TDPT2TCCR_MCL_SHIFT;
  122. reg |= (u32)(bwg_id[i]) << IXGBE_TDPT2TCCR_BWG_SHIFT;
  123. if (prio_type[i] == prio_group)
  124. reg |= IXGBE_TDPT2TCCR_GSP;
  125. if (prio_type[i] == prio_link)
  126. reg |= IXGBE_TDPT2TCCR_LSP;
  127. IXGBE_WRITE_REG(hw, IXGBE_TDPT2TCCR(i), reg);
  128. }
  129. /* Enable Tx packet buffer division */
  130. reg = IXGBE_READ_REG(hw, IXGBE_DTXCTL);
  131. reg |= IXGBE_DTXCTL_ENDBUBD;
  132. IXGBE_WRITE_REG(hw, IXGBE_DTXCTL, reg);
  133. return 0;
  134. }
  135. /**
  136. * ixgbe_dcb_config_pfc_82598 - Config priority flow control
  137. * @hw: pointer to hardware structure
  138. * @pfc_en: enabled pfc bitmask
  139. *
  140. * Configure Priority Flow Control for each traffic class.
  141. */
  142. s32 ixgbe_dcb_config_pfc_82598(struct ixgbe_hw *hw, u8 pfc_en)
  143. {
  144. u32 fcrtl, reg;
  145. u8 i;
  146. /* Enable Transmit Priority Flow Control */
  147. reg = IXGBE_READ_REG(hw, IXGBE_RMCS);
  148. reg &= ~IXGBE_RMCS_TFCE_802_3X;
  149. reg |= IXGBE_RMCS_TFCE_PRIORITY;
  150. IXGBE_WRITE_REG(hw, IXGBE_RMCS, reg);
  151. /* Enable Receive Priority Flow Control */
  152. reg = IXGBE_READ_REG(hw, IXGBE_FCTRL);
  153. reg &= ~(IXGBE_FCTRL_RPFCE | IXGBE_FCTRL_RFCE);
  154. if (pfc_en)
  155. reg |= IXGBE_FCTRL_RPFCE;
  156. IXGBE_WRITE_REG(hw, IXGBE_FCTRL, reg);
  157. /* Configure PFC Tx thresholds per TC */
  158. for (i = 0; i < MAX_TRAFFIC_CLASS; i++) {
  159. if (!(pfc_en & BIT(i))) {
  160. IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), 0);
  161. IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), 0);
  162. continue;
  163. }
  164. fcrtl = (hw->fc.low_water[i] << 10) | IXGBE_FCRTL_XONE;
  165. reg = (hw->fc.high_water[i] << 10) | IXGBE_FCRTH_FCEN;
  166. IXGBE_WRITE_REG(hw, IXGBE_FCRTL(i), fcrtl);
  167. IXGBE_WRITE_REG(hw, IXGBE_FCRTH(i), reg);
  168. }
  169. /* Configure pause time */
  170. reg = hw->fc.pause_time * 0x00010001;
  171. for (i = 0; i < (MAX_TRAFFIC_CLASS / 2); i++)
  172. IXGBE_WRITE_REG(hw, IXGBE_FCTTV(i), reg);
  173. /* Configure flow control refresh threshold value */
  174. IXGBE_WRITE_REG(hw, IXGBE_FCRTV, hw->fc.pause_time / 2);
  175. return 0;
  176. }
  177. /**
  178. * ixgbe_dcb_config_tc_stats_82598 - Configure traffic class statistics
  179. * @hw: pointer to hardware structure
  180. *
  181. * Configure queue statistics registers, all queues belonging to same traffic
  182. * class uses a single set of queue statistics counters.
  183. */
  184. static s32 ixgbe_dcb_config_tc_stats_82598(struct ixgbe_hw *hw)
  185. {
  186. u32 reg = 0;
  187. u8 i = 0;
  188. u8 j = 0;
  189. /* Receive Queues stats setting - 8 queues per statistics reg */
  190. for (i = 0, j = 0; i < 15 && j < 8; i = i + 2, j++) {
  191. reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i));
  192. reg |= ((0x1010101) * j);
  193. IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i), reg);
  194. reg = IXGBE_READ_REG(hw, IXGBE_RQSMR(i + 1));
  195. reg |= ((0x1010101) * j);
  196. IXGBE_WRITE_REG(hw, IXGBE_RQSMR(i + 1), reg);
  197. }
  198. /* Transmit Queues stats setting - 4 queues per statistics reg */
  199. for (i = 0; i < 8; i++) {
  200. reg = IXGBE_READ_REG(hw, IXGBE_TQSMR(i));
  201. reg |= ((0x1010101) * i);
  202. IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i), reg);
  203. }
  204. return 0;
  205. }
  206. /**
  207. * ixgbe_dcb_hw_config_82598 - Config and enable DCB
  208. * @hw: pointer to hardware structure
  209. * @pfc_en: enabled pfc bitmask
  210. * @refill: refill credits index by traffic class
  211. * @max: max credits index by traffic class
  212. * @bwg_id: bandwidth grouping indexed by traffic class
  213. * @prio_type: priority type indexed by traffic class
  214. *
  215. * Configure dcb settings and enable dcb mode.
  216. */
  217. s32 ixgbe_dcb_hw_config_82598(struct ixgbe_hw *hw, u8 pfc_en, u16 *refill,
  218. u16 *max, u8 *bwg_id, u8 *prio_type)
  219. {
  220. ixgbe_dcb_config_rx_arbiter_82598(hw, refill, max, prio_type);
  221. ixgbe_dcb_config_tx_desc_arbiter_82598(hw, refill, max,
  222. bwg_id, prio_type);
  223. ixgbe_dcb_config_tx_data_arbiter_82598(hw, refill, max,
  224. bwg_id, prio_type);
  225. ixgbe_dcb_config_pfc_82598(hw, pfc_en);
  226. ixgbe_dcb_config_tc_stats_82598(hw);
  227. return 0;
  228. }