i40e_lan_hmc.h 5.2 KB

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