mvpp2_prs.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Header Parser definitions for Marvell PPv2 Network Controller
  4. *
  5. * Copyright (C) 2014 Marvell
  6. *
  7. * Marcin Wojtas <mw@semihalf.com>
  8. */
  9. #ifndef _MVPP2_PRS_H_
  10. #define _MVPP2_PRS_H_
  11. #include <linux/kernel.h>
  12. #include <linux/netdevice.h>
  13. #include <linux/platform_device.h>
  14. #include "mvpp2.h"
  15. /* Parser constants */
  16. #define MVPP2_PRS_TCAM_SRAM_SIZE 256
  17. #define MVPP2_PRS_TCAM_WORDS 6
  18. #define MVPP2_PRS_SRAM_WORDS 4
  19. #define MVPP2_PRS_FLOW_ID_SIZE 64
  20. #define MVPP2_PRS_FLOW_ID_MASK 0x3f
  21. #define MVPP2_PRS_TCAM_ENTRY_INVALID 1
  22. #define MVPP2_PRS_TCAM_DSA_TAGGED_BIT BIT(5)
  23. #define MVPP2_PRS_IPV4_HEAD 0x40
  24. #define MVPP2_PRS_IPV4_HEAD_MASK 0xf0
  25. #define MVPP2_PRS_IPV4_MC 0xe0
  26. #define MVPP2_PRS_IPV4_MC_MASK 0xf0
  27. #define MVPP2_PRS_IPV4_BC_MASK 0xff
  28. #define MVPP2_PRS_IPV4_IHL 0x5
  29. #define MVPP2_PRS_IPV4_IHL_MASK 0xf
  30. #define MVPP2_PRS_IPV6_MC 0xff
  31. #define MVPP2_PRS_IPV6_MC_MASK 0xff
  32. #define MVPP2_PRS_IPV6_HOP_MASK 0xff
  33. #define MVPP2_PRS_TCAM_PROTO_MASK 0xff
  34. #define MVPP2_PRS_TCAM_PROTO_MASK_L 0x3f
  35. #define MVPP2_PRS_DBL_VLANS_MAX 100
  36. #define MVPP2_PRS_CAST_MASK BIT(0)
  37. #define MVPP2_PRS_MCAST_VAL BIT(0)
  38. #define MVPP2_PRS_UCAST_VAL 0x0
  39. /* Tcam structure:
  40. * - lookup ID - 4 bits
  41. * - port ID - 1 byte
  42. * - additional information - 1 byte
  43. * - header data - 8 bytes
  44. * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(5)->(0).
  45. */
  46. #define MVPP2_PRS_AI_BITS 8
  47. #define MVPP2_PRS_AI_MASK 0xff
  48. #define MVPP2_PRS_PORT_MASK 0xff
  49. #define MVPP2_PRS_LU_MASK 0xf
  50. /* TCAM entries in registers are accessed using 16 data bits + 16 enable bits */
  51. #define MVPP2_PRS_BYTE_TO_WORD(byte) ((byte) / 2)
  52. #define MVPP2_PRS_BYTE_IN_WORD(byte) ((byte) % 2)
  53. #define MVPP2_PRS_TCAM_EN(data) ((data) << 16)
  54. #define MVPP2_PRS_TCAM_AI_WORD 4
  55. #define MVPP2_PRS_TCAM_AI(ai) (ai)
  56. #define MVPP2_PRS_TCAM_AI_EN(ai) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_AI(ai))
  57. #define MVPP2_PRS_TCAM_PORT_WORD 4
  58. #define MVPP2_PRS_TCAM_PORT(p) ((p) << 8)
  59. #define MVPP2_PRS_TCAM_PORT_EN(p) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_PORT(p))
  60. #define MVPP2_PRS_TCAM_LU_WORD 5
  61. #define MVPP2_PRS_TCAM_LU(lu) (lu)
  62. #define MVPP2_PRS_TCAM_LU_EN(lu) MVPP2_PRS_TCAM_EN(MVPP2_PRS_TCAM_LU(lu))
  63. #define MVPP2_PRS_TCAM_INV_WORD 5
  64. #define MVPP2_PRS_VID_TCAM_BYTE 2
  65. /* TCAM range for unicast and multicast filtering. We have 25 entries per port,
  66. * with 4 dedicated to UC filtering and the rest to multicast filtering.
  67. * Additionnally we reserve one entry for the broadcast address, and one for
  68. * each port's own address.
  69. */
  70. #define MVPP2_PRS_MAC_UC_MC_FILT_MAX 25
  71. #define MVPP2_PRS_MAC_RANGE_SIZE 80
  72. /* Number of entries per port dedicated to UC and MC filtering */
  73. #define MVPP2_PRS_MAC_UC_FILT_MAX 4
  74. #define MVPP2_PRS_MAC_MC_FILT_MAX (MVPP2_PRS_MAC_UC_MC_FILT_MAX - \
  75. MVPP2_PRS_MAC_UC_FILT_MAX)
  76. /* There is a TCAM range reserved for VLAN filtering entries, range size is 33
  77. * 10 VLAN ID filter entries per port
  78. * 1 default VLAN filter entry per port
  79. * It is assumed that there are 3 ports for filter, not including loopback port
  80. */
  81. #define MVPP2_PRS_VLAN_FILT_MAX 11
  82. #define MVPP2_PRS_VLAN_FILT_RANGE_SIZE 33
  83. #define MVPP2_PRS_VLAN_FILT_MAX_ENTRY (MVPP2_PRS_VLAN_FILT_MAX - 2)
  84. #define MVPP2_PRS_VLAN_FILT_DFLT_ENTRY (MVPP2_PRS_VLAN_FILT_MAX - 1)
  85. /* Tcam entries ID */
  86. #define MVPP2_PE_DROP_ALL 0
  87. #define MVPP2_PE_FIRST_FREE_TID 1
  88. /* MAC filtering range */
  89. #define MVPP2_PE_MAC_RANGE_END (MVPP2_PE_VID_FILT_RANGE_START - 1)
  90. #define MVPP2_PE_MAC_RANGE_START (MVPP2_PE_MAC_RANGE_END - \
  91. MVPP2_PRS_MAC_RANGE_SIZE + 1)
  92. /* VLAN filtering range */
  93. #define MVPP2_PE_VID_FILT_RANGE_END (MVPP2_PRS_TCAM_SRAM_SIZE - 31)
  94. #define MVPP2_PE_VID_FILT_RANGE_START (MVPP2_PE_VID_FILT_RANGE_END - \
  95. MVPP2_PRS_VLAN_FILT_RANGE_SIZE + 1)
  96. #define MVPP2_PE_LAST_FREE_TID (MVPP2_PE_MAC_RANGE_START - 1)
  97. #define MVPP2_PE_IP6_EXT_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 30)
  98. #define MVPP2_PE_IP6_ADDR_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 29)
  99. #define MVPP2_PE_IP4_ADDR_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 28)
  100. #define MVPP2_PE_LAST_DEFAULT_FLOW (MVPP2_PRS_TCAM_SRAM_SIZE - 27)
  101. #define MVPP2_PE_FIRST_DEFAULT_FLOW (MVPP2_PRS_TCAM_SRAM_SIZE - 22)
  102. #define MVPP2_PE_EDSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 21)
  103. #define MVPP2_PE_EDSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 20)
  104. #define MVPP2_PE_DSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 19)
  105. #define MVPP2_PE_DSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 18)
  106. #define MVPP2_PE_ETYPE_EDSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 17)
  107. #define MVPP2_PE_ETYPE_EDSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 16)
  108. #define MVPP2_PE_ETYPE_DSA_TAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 15)
  109. #define MVPP2_PE_ETYPE_DSA_UNTAGGED (MVPP2_PRS_TCAM_SRAM_SIZE - 14)
  110. #define MVPP2_PE_MH_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 13)
  111. #define MVPP2_PE_DSA_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 12)
  112. #define MVPP2_PE_IP6_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 11)
  113. #define MVPP2_PE_IP4_PROTO_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 10)
  114. #define MVPP2_PE_ETH_TYPE_UN (MVPP2_PRS_TCAM_SRAM_SIZE - 9)
  115. #define MVPP2_PE_VID_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 8)
  116. #define MVPP2_PE_VID_EDSA_FLTR_DEFAULT (MVPP2_PRS_TCAM_SRAM_SIZE - 7)
  117. #define MVPP2_PE_VLAN_DBL (MVPP2_PRS_TCAM_SRAM_SIZE - 6)
  118. #define MVPP2_PE_VLAN_NONE (MVPP2_PRS_TCAM_SRAM_SIZE - 5)
  119. /* reserved */
  120. #define MVPP2_PE_MAC_MC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 3)
  121. #define MVPP2_PE_MAC_UC_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 2)
  122. #define MVPP2_PE_MAC_NON_PROMISCUOUS (MVPP2_PRS_TCAM_SRAM_SIZE - 1)
  123. #define MVPP2_PRS_VID_PORT_FIRST(port) (MVPP2_PE_VID_FILT_RANGE_START + \
  124. ((port) * MVPP2_PRS_VLAN_FILT_MAX))
  125. #define MVPP2_PRS_VID_PORT_LAST(port) (MVPP2_PRS_VID_PORT_FIRST(port) \
  126. + MVPP2_PRS_VLAN_FILT_MAX_ENTRY)
  127. /* Index of default vid filter for given port */
  128. #define MVPP2_PRS_VID_PORT_DFLT(port) (MVPP2_PRS_VID_PORT_FIRST(port) \
  129. + MVPP2_PRS_VLAN_FILT_DFLT_ENTRY)
  130. /* Sram structure
  131. * The fields are represented by MVPP2_PRS_TCAM_DATA_REG(3)->(0).
  132. */
  133. #define MVPP2_PRS_SRAM_RI_OFFS 0
  134. #define MVPP2_PRS_SRAM_RI_WORD 0
  135. #define MVPP2_PRS_SRAM_RI_CTRL_OFFS 32
  136. #define MVPP2_PRS_SRAM_RI_CTRL_WORD 1
  137. #define MVPP2_PRS_SRAM_RI_CTRL_BITS 32
  138. #define MVPP2_PRS_SRAM_SHIFT_OFFS 64
  139. #define MVPP2_PRS_SRAM_SHIFT_SIGN_BIT 72
  140. #define MVPP2_PRS_SRAM_SHIFT_MASK 0xff
  141. #define MVPP2_PRS_SRAM_UDF_OFFS 73
  142. #define MVPP2_PRS_SRAM_UDF_BITS 8
  143. #define MVPP2_PRS_SRAM_UDF_MASK 0xff
  144. #define MVPP2_PRS_SRAM_UDF_SIGN_BIT 81
  145. #define MVPP2_PRS_SRAM_UDF_TYPE_OFFS 82
  146. #define MVPP2_PRS_SRAM_UDF_TYPE_MASK 0x7
  147. #define MVPP2_PRS_SRAM_UDF_TYPE_L3 1
  148. #define MVPP2_PRS_SRAM_UDF_TYPE_L4 4
  149. #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS 85
  150. #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_MASK 0x3
  151. #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_ADD 1
  152. #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP4_ADD 2
  153. #define MVPP2_PRS_SRAM_OP_SEL_SHIFT_IP6_ADD 3
  154. #define MVPP2_PRS_SRAM_OP_SEL_UDF_OFFS 87
  155. #define MVPP2_PRS_SRAM_OP_SEL_UDF_BITS 2
  156. #define MVPP2_PRS_SRAM_OP_SEL_UDF_MASK 0x3
  157. #define MVPP2_PRS_SRAM_OP_SEL_UDF_ADD 0
  158. #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP4_ADD 2
  159. #define MVPP2_PRS_SRAM_OP_SEL_UDF_IP6_ADD 3
  160. #define MVPP2_PRS_SRAM_OP_SEL_BASE_OFFS 89
  161. #define MVPP2_PRS_SRAM_AI_OFFS 90
  162. #define MVPP2_PRS_SRAM_AI_CTRL_OFFS 98
  163. #define MVPP2_PRS_SRAM_AI_CTRL_BITS 8
  164. #define MVPP2_PRS_SRAM_AI_MASK 0xff
  165. #define MVPP2_PRS_SRAM_NEXT_LU_OFFS 106
  166. #define MVPP2_PRS_SRAM_NEXT_LU_MASK 0xf
  167. #define MVPP2_PRS_SRAM_LU_DONE_BIT 110
  168. #define MVPP2_PRS_SRAM_LU_GEN_BIT 111
  169. /* Sram result info bits assignment */
  170. #define MVPP2_PRS_RI_MAC_ME_MASK 0x1
  171. #define MVPP2_PRS_RI_DSA_MASK 0x2
  172. #define MVPP2_PRS_RI_VLAN_MASK (BIT(2) | BIT(3))
  173. #define MVPP2_PRS_RI_VLAN_NONE 0x0
  174. #define MVPP2_PRS_RI_VLAN_SINGLE BIT(2)
  175. #define MVPP2_PRS_RI_VLAN_DOUBLE BIT(3)
  176. #define MVPP2_PRS_RI_VLAN_TRIPLE (BIT(2) | BIT(3))
  177. #define MVPP2_PRS_RI_CPU_CODE_MASK 0x70
  178. #define MVPP2_PRS_RI_CPU_CODE_RX_SPEC BIT(4)
  179. #define MVPP2_PRS_RI_L2_CAST_MASK (BIT(9) | BIT(10))
  180. #define MVPP2_PRS_RI_L2_UCAST 0x0
  181. #define MVPP2_PRS_RI_L2_MCAST BIT(9)
  182. #define MVPP2_PRS_RI_L2_BCAST BIT(10)
  183. #define MVPP2_PRS_RI_PPPOE_MASK 0x800
  184. #define MVPP2_PRS_RI_L3_PROTO_MASK (BIT(12) | BIT(13) | BIT(14))
  185. #define MVPP2_PRS_RI_L3_UN 0x0
  186. #define MVPP2_PRS_RI_L3_IP4 BIT(12)
  187. #define MVPP2_PRS_RI_L3_IP4_OPT BIT(13)
  188. #define MVPP2_PRS_RI_L3_IP4_OTHER (BIT(12) | BIT(13))
  189. #define MVPP2_PRS_RI_L3_IP6 BIT(14)
  190. #define MVPP2_PRS_RI_L3_IP6_EXT (BIT(12) | BIT(14))
  191. #define MVPP2_PRS_RI_L3_ARP (BIT(13) | BIT(14))
  192. #define MVPP2_PRS_RI_L3_ADDR_MASK (BIT(15) | BIT(16))
  193. #define MVPP2_PRS_RI_L3_UCAST 0x0
  194. #define MVPP2_PRS_RI_L3_MCAST BIT(15)
  195. #define MVPP2_PRS_RI_L3_BCAST (BIT(15) | BIT(16))
  196. #define MVPP2_PRS_RI_IP_FRAG_MASK 0x20000
  197. #define MVPP2_PRS_RI_IP_FRAG_TRUE BIT(17)
  198. #define MVPP2_PRS_RI_UDF3_MASK 0x300000
  199. #define MVPP2_PRS_RI_UDF3_RX_SPECIAL BIT(21)
  200. #define MVPP2_PRS_RI_L4_PROTO_MASK 0x1c00000
  201. #define MVPP2_PRS_RI_L4_TCP BIT(22)
  202. #define MVPP2_PRS_RI_L4_UDP BIT(23)
  203. #define MVPP2_PRS_RI_L4_OTHER (BIT(22) | BIT(23))
  204. #define MVPP2_PRS_RI_UDF7_MASK 0x60000000
  205. #define MVPP2_PRS_RI_UDF7_IP6_LITE BIT(29)
  206. #define MVPP2_PRS_RI_DROP_MASK 0x80000000
  207. #define MVPP2_PRS_IP_MASK (MVPP2_PRS_RI_L3_PROTO_MASK | \
  208. MVPP2_PRS_RI_IP_FRAG_MASK | \
  209. MVPP2_PRS_RI_L4_PROTO_MASK)
  210. /* Sram additional info bits assignment */
  211. #define MVPP2_PRS_IPV4_DIP_AI_BIT BIT(0)
  212. #define MVPP2_PRS_IPV6_NO_EXT_AI_BIT BIT(0)
  213. #define MVPP2_PRS_IPV6_EXT_AI_BIT BIT(1)
  214. #define MVPP2_PRS_IPV6_EXT_AH_AI_BIT BIT(2)
  215. #define MVPP2_PRS_IPV6_EXT_AH_LEN_AI_BIT BIT(3)
  216. #define MVPP2_PRS_IPV6_EXT_AH_L4_AI_BIT BIT(4)
  217. #define MVPP2_PRS_SINGLE_VLAN_AI 0
  218. #define MVPP2_PRS_DBL_VLAN_AI_BIT BIT(7)
  219. #define MVPP2_PRS_EDSA_VID_AI_BIT BIT(0)
  220. /* DSA/EDSA type */
  221. #define MVPP2_PRS_TAGGED true
  222. #define MVPP2_PRS_UNTAGGED false
  223. #define MVPP2_PRS_EDSA true
  224. #define MVPP2_PRS_DSA false
  225. /* MAC entries, shadow udf */
  226. enum mvpp2_prs_udf {
  227. MVPP2_PRS_UDF_MAC_DEF,
  228. MVPP2_PRS_UDF_MAC_RANGE,
  229. MVPP2_PRS_UDF_L2_DEF,
  230. MVPP2_PRS_UDF_L2_DEF_COPY,
  231. MVPP2_PRS_UDF_L2_USER,
  232. };
  233. /* Lookup ID */
  234. enum mvpp2_prs_lookup {
  235. MVPP2_PRS_LU_MH,
  236. MVPP2_PRS_LU_MAC,
  237. MVPP2_PRS_LU_DSA,
  238. MVPP2_PRS_LU_VLAN,
  239. MVPP2_PRS_LU_VID,
  240. MVPP2_PRS_LU_L2,
  241. MVPP2_PRS_LU_PPPOE,
  242. MVPP2_PRS_LU_IP4,
  243. MVPP2_PRS_LU_IP6,
  244. MVPP2_PRS_LU_FLOWS,
  245. MVPP2_PRS_LU_LAST,
  246. };
  247. struct mvpp2_prs_entry {
  248. u32 index;
  249. u32 tcam[MVPP2_PRS_TCAM_WORDS];
  250. u32 sram[MVPP2_PRS_SRAM_WORDS];
  251. };
  252. struct mvpp2_prs_result_info {
  253. u32 ri;
  254. u32 ri_mask;
  255. };
  256. struct mvpp2_prs_shadow {
  257. bool valid;
  258. bool finish;
  259. /* Lookup ID */
  260. int lu;
  261. /* User defined offset */
  262. int udf;
  263. /* Result info */
  264. u32 ri;
  265. u32 ri_mask;
  266. };
  267. int mvpp2_prs_default_init(struct platform_device *pdev, struct mvpp2 *priv);
  268. int mvpp2_prs_init_from_hw(struct mvpp2 *priv, struct mvpp2_prs_entry *pe,
  269. int tid);
  270. unsigned int mvpp2_prs_tcam_port_map_get(struct mvpp2_prs_entry *pe);
  271. void mvpp2_prs_tcam_data_byte_get(struct mvpp2_prs_entry *pe,
  272. unsigned int offs, unsigned char *byte,
  273. unsigned char *enable);
  274. int mvpp2_prs_mac_da_accept(struct mvpp2_port *port, const u8 *da, bool add);
  275. int mvpp2_prs_tag_mode_set(struct mvpp2 *priv, int port, int type);
  276. int mvpp2_prs_add_flow(struct mvpp2 *priv, int flow, u32 ri, u32 ri_mask);
  277. int mvpp2_prs_def_flow(struct mvpp2_port *port);
  278. void mvpp2_prs_vid_enable_filtering(struct mvpp2_port *port);
  279. void mvpp2_prs_vid_disable_filtering(struct mvpp2_port *port);
  280. int mvpp2_prs_vid_entry_add(struct mvpp2_port *port, u16 vid);
  281. void mvpp2_prs_vid_entry_remove(struct mvpp2_port *port, u16 vid);
  282. void mvpp2_prs_vid_remove_all(struct mvpp2_port *port);
  283. void mvpp2_prs_mac_promisc_set(struct mvpp2 *priv, int port,
  284. enum mvpp2_prs_l2_cast l2_cast, bool add);
  285. void mvpp2_prs_mac_del_all(struct mvpp2_port *port);
  286. int mvpp2_prs_update_mac_da(struct net_device *dev, const u8 *da);
  287. int mvpp2_prs_hits(struct mvpp2 *priv, int index);
  288. #endif