i40e_lan_hmc.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*******************************************************************************
  3. *
  4. * Intel Ethernet Controller XL710 Family Linux Driver
  5. * Copyright(c) 2013 - 2014 Intel Corporation.
  6. *
  7. * This program is free software; you can redistribute it and/or modify it
  8. * under the terms and conditions of the GNU General Public License,
  9. * version 2, as published by the Free Software Foundation.
  10. *
  11. * This program is distributed in the hope it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  14. * more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program. If not, see <http://www.gnu.org/licenses/>.
  18. *
  19. * The full GNU General Public License is included in this distribution in
  20. * the file called "COPYING".
  21. *
  22. * Contact Information:
  23. * e1000-devel Mailing List <e1000-devel@lists.sourceforge.net>
  24. * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
  25. *
  26. ******************************************************************************/
  27. #ifndef _I40E_LAN_HMC_H_
  28. #define _I40E_LAN_HMC_H_
  29. /* forward-declare the HW struct for the compiler */
  30. struct i40e_hw;
  31. /* HMC element context information */
  32. /* Rx queue context data
  33. *
  34. * The sizes of the variables may be larger than needed due to crossing byte
  35. * boundaries. If we do not have the width of the variable set to the correct
  36. * size then we could end up shifting bits off the top of the variable when the
  37. * variable is at the top of a byte and crosses over into the next byte.
  38. */
  39. struct i40e_hmc_obj_rxq {
  40. u16 head;
  41. u16 cpuid; /* bigger than needed, see above for reason */
  42. u64 base;
  43. u16 qlen;
  44. #define I40E_RXQ_CTX_DBUFF_SHIFT 7
  45. u16 dbuff; /* bigger than needed, see above for reason */
  46. #define I40E_RXQ_CTX_HBUFF_SHIFT 6
  47. u16 hbuff; /* bigger than needed, see above for reason */
  48. u8 dtype;
  49. u8 dsize;
  50. u8 crcstrip;
  51. u8 fc_ena;
  52. u8 l2tsel;
  53. u8 hsplit_0;
  54. u8 hsplit_1;
  55. u8 showiv;
  56. u32 rxmax; /* bigger than needed, see above for reason */
  57. u8 tphrdesc_ena;
  58. u8 tphwdesc_ena;
  59. u8 tphdata_ena;
  60. u8 tphhead_ena;
  61. u16 lrxqthresh; /* bigger than needed, see above for reason */
  62. u8 prefena; /* NOTE: normally must be set to 1 at init */
  63. };
  64. /* Tx queue context data
  65. *
  66. * The sizes of the variables may be larger than needed due to crossing byte
  67. * boundaries. If we do not have the width of the variable set to the correct
  68. * size then we could end up shifting bits off the top of the variable when the
  69. * variable is at the top of a byte and crosses over into the next byte.
  70. */
  71. struct i40e_hmc_obj_txq {
  72. u16 head;
  73. u8 new_context;
  74. u64 base;
  75. u8 fc_ena;
  76. u8 timesync_ena;
  77. u8 fd_ena;
  78. u8 alt_vlan_ena;
  79. u16 thead_wb;
  80. u8 cpuid;
  81. u8 head_wb_ena;
  82. u16 qlen;
  83. u8 tphrdesc_ena;
  84. u8 tphrpacket_ena;
  85. u8 tphwdesc_ena;
  86. u64 head_wb_addr;
  87. u32 crc;
  88. u16 rdylist;
  89. u8 rdylist_act;
  90. };
  91. /* for hsplit_0 field of Rx HMC context */
  92. enum i40e_hmc_obj_rx_hsplit_0 {
  93. I40E_HMC_OBJ_RX_HSPLIT_0_NO_SPLIT = 0,
  94. I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_L2 = 1,
  95. I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_IP = 2,
  96. I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_TCP_UDP = 4,
  97. I40E_HMC_OBJ_RX_HSPLIT_0_SPLIT_SCTP = 8,
  98. };
  99. /* fcoe_cntx and fcoe_filt are for debugging purpose only */
  100. struct i40e_hmc_obj_fcoe_cntx {
  101. u32 rsv[32];
  102. };
  103. struct i40e_hmc_obj_fcoe_filt {
  104. u32 rsv[8];
  105. };
  106. /* Context sizes for LAN objects */
  107. enum i40e_hmc_lan_object_size {
  108. I40E_HMC_LAN_OBJ_SZ_8 = 0x3,
  109. I40E_HMC_LAN_OBJ_SZ_16 = 0x4,
  110. I40E_HMC_LAN_OBJ_SZ_32 = 0x5,
  111. I40E_HMC_LAN_OBJ_SZ_64 = 0x6,
  112. I40E_HMC_LAN_OBJ_SZ_128 = 0x7,
  113. I40E_HMC_LAN_OBJ_SZ_256 = 0x8,
  114. I40E_HMC_LAN_OBJ_SZ_512 = 0x9,
  115. };
  116. #define I40E_HMC_L2OBJ_BASE_ALIGNMENT 512
  117. #define I40E_HMC_OBJ_SIZE_TXQ 128
  118. #define I40E_HMC_OBJ_SIZE_RXQ 32
  119. #define I40E_HMC_OBJ_SIZE_FCOE_CNTX 64
  120. #define I40E_HMC_OBJ_SIZE_FCOE_FILT 64
  121. enum i40e_hmc_lan_rsrc_type {
  122. I40E_HMC_LAN_FULL = 0,
  123. I40E_HMC_LAN_TX = 1,
  124. I40E_HMC_LAN_RX = 2,
  125. I40E_HMC_FCOE_CTX = 3,
  126. I40E_HMC_FCOE_FILT = 4,
  127. I40E_HMC_LAN_MAX = 5
  128. };
  129. enum i40e_hmc_model {
  130. I40E_HMC_MODEL_DIRECT_PREFERRED = 0,
  131. I40E_HMC_MODEL_DIRECT_ONLY = 1,
  132. I40E_HMC_MODEL_PAGED_ONLY = 2,
  133. I40E_HMC_MODEL_UNKNOWN,
  134. };
  135. struct i40e_hmc_lan_create_obj_info {
  136. struct i40e_hmc_info *hmc_info;
  137. u32 rsrc_type;
  138. u32 start_idx;
  139. u32 count;
  140. enum i40e_sd_entry_type entry_type;
  141. u64 direct_mode_sz;
  142. };
  143. struct i40e_hmc_lan_delete_obj_info {
  144. struct i40e_hmc_info *hmc_info;
  145. u32 rsrc_type;
  146. u32 start_idx;
  147. u32 count;
  148. };
  149. i40e_status i40e_init_lan_hmc(struct i40e_hw *hw, u32 txq_num,
  150. u32 rxq_num, u32 fcoe_cntx_num,
  151. u32 fcoe_filt_num);
  152. i40e_status i40e_configure_lan_hmc(struct i40e_hw *hw,
  153. enum i40e_hmc_model model);
  154. i40e_status i40e_shutdown_lan_hmc(struct i40e_hw *hw);
  155. i40e_status i40e_clear_lan_tx_queue_context(struct i40e_hw *hw,
  156. u16 queue);
  157. i40e_status i40e_set_lan_tx_queue_context(struct i40e_hw *hw,
  158. u16 queue,
  159. struct i40e_hmc_obj_txq *s);
  160. i40e_status i40e_clear_lan_rx_queue_context(struct i40e_hw *hw,
  161. u16 queue);
  162. i40e_status i40e_set_lan_rx_queue_context(struct i40e_hw *hw,
  163. u16 queue,
  164. struct i40e_hmc_obj_rxq *s);
  165. #endif /* _I40E_LAN_HMC_H_ */