dpsw-cmd.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Copyright 2014-2016 Freescale Semiconductor Inc.
  4. * Copyright 2017-2021 NXP
  5. *
  6. */
  7. #ifndef __FSL_DPSW_CMD_H
  8. #define __FSL_DPSW_CMD_H
  9. #include "dpsw.h"
  10. /* DPSW Version */
  11. #define DPSW_VER_MAJOR 8
  12. #define DPSW_VER_MINOR 9
  13. #define DPSW_CMD_BASE_VERSION 1
  14. #define DPSW_CMD_VERSION_2 2
  15. #define DPSW_CMD_ID_OFFSET 4
  16. #define DPSW_CMD_ID(id) (((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_BASE_VERSION)
  17. #define DPSW_CMD_V2(id) (((id) << DPSW_CMD_ID_OFFSET) | DPSW_CMD_VERSION_2)
  18. /* Command IDs */
  19. #define DPSW_CMDID_CLOSE DPSW_CMD_ID(0x800)
  20. #define DPSW_CMDID_OPEN DPSW_CMD_ID(0x802)
  21. #define DPSW_CMDID_GET_API_VERSION DPSW_CMD_ID(0xa02)
  22. #define DPSW_CMDID_ENABLE DPSW_CMD_ID(0x002)
  23. #define DPSW_CMDID_DISABLE DPSW_CMD_ID(0x003)
  24. #define DPSW_CMDID_GET_ATTR DPSW_CMD_V2(0x004)
  25. #define DPSW_CMDID_RESET DPSW_CMD_ID(0x005)
  26. #define DPSW_CMDID_SET_IRQ_ENABLE DPSW_CMD_ID(0x012)
  27. #define DPSW_CMDID_SET_IRQ_MASK DPSW_CMD_ID(0x014)
  28. #define DPSW_CMDID_GET_IRQ_STATUS DPSW_CMD_ID(0x016)
  29. #define DPSW_CMDID_CLEAR_IRQ_STATUS DPSW_CMD_ID(0x017)
  30. #define DPSW_CMDID_SET_REFLECTION_IF DPSW_CMD_ID(0x022)
  31. #define DPSW_CMDID_IF_SET_TCI DPSW_CMD_ID(0x030)
  32. #define DPSW_CMDID_IF_SET_STP DPSW_CMD_ID(0x031)
  33. #define DPSW_CMDID_IF_GET_COUNTER DPSW_CMD_V2(0x034)
  34. #define DPSW_CMDID_IF_ADD_REFLECTION DPSW_CMD_ID(0x037)
  35. #define DPSW_CMDID_IF_REMOVE_REFLECTION DPSW_CMD_ID(0x038)
  36. #define DPSW_CMDID_IF_ENABLE DPSW_CMD_ID(0x03D)
  37. #define DPSW_CMDID_IF_DISABLE DPSW_CMD_ID(0x03E)
  38. #define DPSW_CMDID_IF_GET_ATTR DPSW_CMD_ID(0x042)
  39. #define DPSW_CMDID_IF_SET_MAX_FRAME_LENGTH DPSW_CMD_ID(0x044)
  40. #define DPSW_CMDID_IF_GET_LINK_STATE DPSW_CMD_ID(0x046)
  41. #define DPSW_CMDID_IF_GET_TCI DPSW_CMD_ID(0x04A)
  42. #define DPSW_CMDID_IF_SET_LINK_CFG DPSW_CMD_ID(0x04C)
  43. #define DPSW_CMDID_VLAN_ADD DPSW_CMD_ID(0x060)
  44. #define DPSW_CMDID_VLAN_ADD_IF DPSW_CMD_V2(0x061)
  45. #define DPSW_CMDID_VLAN_ADD_IF_UNTAGGED DPSW_CMD_ID(0x062)
  46. #define DPSW_CMDID_VLAN_REMOVE_IF DPSW_CMD_ID(0x064)
  47. #define DPSW_CMDID_VLAN_REMOVE_IF_UNTAGGED DPSW_CMD_ID(0x065)
  48. #define DPSW_CMDID_VLAN_REMOVE_IF_FLOODING DPSW_CMD_ID(0x066)
  49. #define DPSW_CMDID_VLAN_REMOVE DPSW_CMD_ID(0x067)
  50. #define DPSW_CMDID_FDB_ADD DPSW_CMD_ID(0x082)
  51. #define DPSW_CMDID_FDB_REMOVE DPSW_CMD_ID(0x083)
  52. #define DPSW_CMDID_FDB_ADD_UNICAST DPSW_CMD_ID(0x084)
  53. #define DPSW_CMDID_FDB_REMOVE_UNICAST DPSW_CMD_ID(0x085)
  54. #define DPSW_CMDID_FDB_ADD_MULTICAST DPSW_CMD_ID(0x086)
  55. #define DPSW_CMDID_FDB_REMOVE_MULTICAST DPSW_CMD_ID(0x087)
  56. #define DPSW_CMDID_FDB_DUMP DPSW_CMD_ID(0x08A)
  57. #define DPSW_CMDID_ACL_ADD DPSW_CMD_ID(0x090)
  58. #define DPSW_CMDID_ACL_REMOVE DPSW_CMD_ID(0x091)
  59. #define DPSW_CMDID_ACL_ADD_ENTRY DPSW_CMD_ID(0x092)
  60. #define DPSW_CMDID_ACL_REMOVE_ENTRY DPSW_CMD_ID(0x093)
  61. #define DPSW_CMDID_ACL_ADD_IF DPSW_CMD_ID(0x094)
  62. #define DPSW_CMDID_ACL_REMOVE_IF DPSW_CMD_ID(0x095)
  63. #define DPSW_CMDID_IF_GET_PORT_MAC_ADDR DPSW_CMD_ID(0x0A7)
  64. #define DPSW_CMDID_CTRL_IF_GET_ATTR DPSW_CMD_ID(0x0A0)
  65. #define DPSW_CMDID_CTRL_IF_SET_POOLS DPSW_CMD_ID(0x0A1)
  66. #define DPSW_CMDID_CTRL_IF_ENABLE DPSW_CMD_ID(0x0A2)
  67. #define DPSW_CMDID_CTRL_IF_DISABLE DPSW_CMD_ID(0x0A3)
  68. #define DPSW_CMDID_CTRL_IF_SET_QUEUE DPSW_CMD_ID(0x0A6)
  69. #define DPSW_CMDID_SET_EGRESS_FLOOD DPSW_CMD_ID(0x0AC)
  70. #define DPSW_CMDID_IF_SET_LEARNING_MODE DPSW_CMD_ID(0x0AD)
  71. /* Macros for accessing command fields smaller than 1byte */
  72. #define DPSW_MASK(field) \
  73. GENMASK(DPSW_##field##_SHIFT + DPSW_##field##_SIZE - 1, \
  74. DPSW_##field##_SHIFT)
  75. #define dpsw_set_field(var, field, val) \
  76. ((var) |= (((val) << DPSW_##field##_SHIFT) & DPSW_MASK(field)))
  77. #define dpsw_get_field(var, field) \
  78. (((var) & DPSW_MASK(field)) >> DPSW_##field##_SHIFT)
  79. #define dpsw_get_bit(var, bit) \
  80. (((var) >> (bit)) & GENMASK(0, 0))
  81. #pragma pack(push, 1)
  82. struct dpsw_cmd_open {
  83. __le32 dpsw_id;
  84. };
  85. #define DPSW_COMPONENT_TYPE_SHIFT 0
  86. #define DPSW_COMPONENT_TYPE_SIZE 4
  87. struct dpsw_cmd_create {
  88. /* cmd word 0 */
  89. __le16 num_ifs;
  90. u8 max_fdbs;
  91. u8 max_meters_per_if;
  92. /* from LSB: only the first 4 bits */
  93. u8 component_type;
  94. u8 pad[3];
  95. /* cmd word 1 */
  96. __le16 max_vlans;
  97. __le16 max_fdb_entries;
  98. __le16 fdb_aging_time;
  99. __le16 max_fdb_mc_groups;
  100. /* cmd word 2 */
  101. __le64 options;
  102. };
  103. struct dpsw_cmd_destroy {
  104. __le32 dpsw_id;
  105. };
  106. #define DPSW_ENABLE_SHIFT 0
  107. #define DPSW_ENABLE_SIZE 1
  108. struct dpsw_rsp_is_enabled {
  109. /* from LSB: enable:1 */
  110. u8 enabled;
  111. };
  112. struct dpsw_cmd_set_irq_enable {
  113. u8 enable_state;
  114. u8 pad[3];
  115. u8 irq_index;
  116. };
  117. struct dpsw_cmd_get_irq_enable {
  118. __le32 pad;
  119. u8 irq_index;
  120. };
  121. struct dpsw_rsp_get_irq_enable {
  122. u8 enable_state;
  123. };
  124. struct dpsw_cmd_set_irq_mask {
  125. __le32 mask;
  126. u8 irq_index;
  127. };
  128. struct dpsw_cmd_get_irq_mask {
  129. __le32 pad;
  130. u8 irq_index;
  131. };
  132. struct dpsw_rsp_get_irq_mask {
  133. __le32 mask;
  134. };
  135. struct dpsw_cmd_get_irq_status {
  136. __le32 status;
  137. u8 irq_index;
  138. };
  139. struct dpsw_rsp_get_irq_status {
  140. __le32 status;
  141. };
  142. struct dpsw_cmd_clear_irq_status {
  143. __le32 status;
  144. u8 irq_index;
  145. };
  146. #define DPSW_COMPONENT_TYPE_SHIFT 0
  147. #define DPSW_COMPONENT_TYPE_SIZE 4
  148. #define DPSW_FLOODING_CFG_SHIFT 0
  149. #define DPSW_FLOODING_CFG_SIZE 4
  150. #define DPSW_BROADCAST_CFG_SHIFT 4
  151. #define DPSW_BROADCAST_CFG_SIZE 4
  152. struct dpsw_rsp_get_attr {
  153. /* cmd word 0 */
  154. __le16 num_ifs;
  155. u8 max_fdbs;
  156. u8 num_fdbs;
  157. __le16 max_vlans;
  158. __le16 num_vlans;
  159. /* cmd word 1 */
  160. __le16 max_fdb_entries;
  161. __le16 fdb_aging_time;
  162. __le32 dpsw_id;
  163. /* cmd word 2 */
  164. __le16 mem_size;
  165. __le16 max_fdb_mc_groups;
  166. u8 max_meters_per_if;
  167. /* from LSB only the first 4 bits */
  168. u8 component_type;
  169. /* [0:3] - flooding configuration
  170. * [4:7] - broadcast configuration
  171. */
  172. u8 repl_cfg;
  173. u8 pad;
  174. /* cmd word 3 */
  175. __le64 options;
  176. };
  177. #define DPSW_VLAN_ID_SHIFT 0
  178. #define DPSW_VLAN_ID_SIZE 12
  179. #define DPSW_DEI_SHIFT 12
  180. #define DPSW_DEI_SIZE 1
  181. #define DPSW_PCP_SHIFT 13
  182. #define DPSW_PCP_SIZE 3
  183. struct dpsw_cmd_if_set_tci {
  184. __le16 if_id;
  185. /* from LSB: VLAN_ID:12 DEI:1 PCP:3 */
  186. __le16 conf;
  187. };
  188. struct dpsw_cmd_if_get_tci {
  189. __le16 if_id;
  190. };
  191. struct dpsw_rsp_if_get_tci {
  192. __le16 pad;
  193. __le16 vlan_id;
  194. u8 dei;
  195. u8 pcp;
  196. };
  197. #define DPSW_STATE_SHIFT 0
  198. #define DPSW_STATE_SIZE 4
  199. struct dpsw_cmd_if_set_stp {
  200. __le16 if_id;
  201. __le16 vlan_id;
  202. /* only the first LSB 4 bits */
  203. u8 state;
  204. };
  205. #define DPSW_COUNTER_TYPE_SHIFT 0
  206. #define DPSW_COUNTER_TYPE_SIZE 5
  207. struct dpsw_cmd_if_get_counter {
  208. __le16 if_id;
  209. /* from LSB: type:5 */
  210. u8 type;
  211. };
  212. struct dpsw_rsp_if_get_counter {
  213. __le64 pad;
  214. __le64 counter;
  215. };
  216. struct dpsw_cmd_if {
  217. __le16 if_id;
  218. };
  219. #define DPSW_ADMIT_UNTAGGED_SHIFT 0
  220. #define DPSW_ADMIT_UNTAGGED_SIZE 4
  221. #define DPSW_ENABLED_SHIFT 5
  222. #define DPSW_ENABLED_SIZE 1
  223. #define DPSW_ACCEPT_ALL_VLAN_SHIFT 6
  224. #define DPSW_ACCEPT_ALL_VLAN_SIZE 1
  225. struct dpsw_rsp_if_get_attr {
  226. /* cmd word 0 */
  227. /* from LSB: admit_untagged:4 enabled:1 accept_all_vlan:1 */
  228. u8 conf;
  229. u8 pad1;
  230. u8 num_tcs;
  231. u8 pad2;
  232. __le16 qdid;
  233. /* cmd word 1 */
  234. __le32 options;
  235. __le32 pad3;
  236. /* cmd word 2 */
  237. __le32 rate;
  238. };
  239. struct dpsw_cmd_if_set_max_frame_length {
  240. __le16 if_id;
  241. __le16 frame_length;
  242. };
  243. struct dpsw_cmd_if_set_link_cfg {
  244. /* cmd word 0 */
  245. __le16 if_id;
  246. u8 pad[6];
  247. /* cmd word 1 */
  248. __le32 rate;
  249. __le32 pad1;
  250. /* cmd word 2 */
  251. __le64 options;
  252. };
  253. struct dpsw_cmd_if_get_link_state {
  254. __le16 if_id;
  255. };
  256. #define DPSW_UP_SHIFT 0
  257. #define DPSW_UP_SIZE 1
  258. struct dpsw_rsp_if_get_link_state {
  259. /* cmd word 0 */
  260. __le32 pad0;
  261. u8 up;
  262. u8 pad1[3];
  263. /* cmd word 1 */
  264. __le32 rate;
  265. __le32 pad2;
  266. /* cmd word 2 */
  267. __le64 options;
  268. };
  269. struct dpsw_vlan_add {
  270. __le16 fdb_id;
  271. __le16 vlan_id;
  272. };
  273. struct dpsw_cmd_vlan_add_if {
  274. /* cmd word 0 */
  275. __le16 options;
  276. __le16 vlan_id;
  277. __le16 fdb_id;
  278. __le16 pad0;
  279. /* cmd word 1-4 */
  280. __le64 if_id;
  281. };
  282. struct dpsw_cmd_vlan_manage_if {
  283. /* cmd word 0 */
  284. __le16 pad0;
  285. __le16 vlan_id;
  286. __le32 pad1;
  287. /* cmd word 1-4 */
  288. __le64 if_id;
  289. };
  290. struct dpsw_cmd_vlan_remove {
  291. __le16 pad;
  292. __le16 vlan_id;
  293. };
  294. struct dpsw_cmd_fdb_add {
  295. __le32 pad;
  296. __le16 fdb_ageing_time;
  297. __le16 num_fdb_entries;
  298. };
  299. struct dpsw_rsp_fdb_add {
  300. __le16 fdb_id;
  301. };
  302. struct dpsw_cmd_fdb_remove {
  303. __le16 fdb_id;
  304. };
  305. #define DPSW_ENTRY_TYPE_SHIFT 0
  306. #define DPSW_ENTRY_TYPE_SIZE 4
  307. struct dpsw_cmd_fdb_unicast_op {
  308. /* cmd word 0 */
  309. __le16 fdb_id;
  310. u8 mac_addr[6];
  311. /* cmd word 1 */
  312. __le16 if_egress;
  313. /* only the first 4 bits from LSB */
  314. u8 type;
  315. };
  316. struct dpsw_cmd_fdb_multicast_op {
  317. /* cmd word 0 */
  318. __le16 fdb_id;
  319. __le16 num_ifs;
  320. /* only the first 4 bits from LSB */
  321. u8 type;
  322. u8 pad[3];
  323. /* cmd word 1 */
  324. u8 mac_addr[6];
  325. __le16 pad2;
  326. /* cmd word 2-5 */
  327. __le64 if_id;
  328. };
  329. struct dpsw_cmd_fdb_dump {
  330. __le16 fdb_id;
  331. __le16 pad0;
  332. __le32 pad1;
  333. __le64 iova_addr;
  334. __le32 iova_size;
  335. };
  336. struct dpsw_rsp_fdb_dump {
  337. __le16 num_entries;
  338. };
  339. struct dpsw_rsp_ctrl_if_get_attr {
  340. __le64 pad;
  341. __le32 rx_fqid;
  342. __le32 rx_err_fqid;
  343. __le32 tx_err_conf_fqid;
  344. };
  345. #define DPSW_BACKUP_POOL(val, order) (((val) & 0x1) << (order))
  346. struct dpsw_cmd_ctrl_if_set_pools {
  347. u8 num_dpbp;
  348. u8 backup_pool_mask;
  349. __le16 pad;
  350. __le32 dpbp_id[DPSW_MAX_DPBP];
  351. __le16 buffer_size[DPSW_MAX_DPBP];
  352. };
  353. #define DPSW_DEST_TYPE_SHIFT 0
  354. #define DPSW_DEST_TYPE_SIZE 4
  355. struct dpsw_cmd_ctrl_if_set_queue {
  356. __le32 dest_id;
  357. u8 dest_priority;
  358. u8 pad;
  359. /* from LSB: dest_type:4 */
  360. u8 dest_type;
  361. u8 qtype;
  362. __le64 user_ctx;
  363. __le32 options;
  364. };
  365. struct dpsw_rsp_get_api_version {
  366. __le16 version_major;
  367. __le16 version_minor;
  368. };
  369. struct dpsw_rsp_if_get_mac_addr {
  370. __le16 pad;
  371. u8 mac_addr[6];
  372. };
  373. struct dpsw_cmd_set_egress_flood {
  374. __le16 fdb_id;
  375. u8 flood_type;
  376. u8 pad[5];
  377. __le64 if_id;
  378. };
  379. #define DPSW_LEARNING_MODE_SHIFT 0
  380. #define DPSW_LEARNING_MODE_SIZE 4
  381. struct dpsw_cmd_if_set_learning_mode {
  382. __le16 if_id;
  383. /* only the first 4 bits from LSB */
  384. u8 mode;
  385. };
  386. struct dpsw_cmd_acl_add {
  387. __le16 pad;
  388. __le16 max_entries;
  389. };
  390. struct dpsw_rsp_acl_add {
  391. __le16 acl_id;
  392. };
  393. struct dpsw_cmd_acl_remove {
  394. __le16 acl_id;
  395. };
  396. struct dpsw_cmd_acl_if {
  397. __le16 acl_id;
  398. __le16 num_ifs;
  399. __le32 pad;
  400. __le64 if_id;
  401. };
  402. struct dpsw_prep_acl_entry {
  403. u8 match_l2_dest_mac[6];
  404. __le16 match_l2_tpid;
  405. u8 match_l2_source_mac[6];
  406. __le16 match_l2_vlan_id;
  407. __le32 match_l3_dest_ip;
  408. __le32 match_l3_source_ip;
  409. __le16 match_l4_dest_port;
  410. __le16 match_l4_source_port;
  411. __le16 match_l2_ether_type;
  412. u8 match_l2_pcp_dei;
  413. u8 match_l3_dscp;
  414. u8 mask_l2_dest_mac[6];
  415. __le16 mask_l2_tpid;
  416. u8 mask_l2_source_mac[6];
  417. __le16 mask_l2_vlan_id;
  418. __le32 mask_l3_dest_ip;
  419. __le32 mask_l3_source_ip;
  420. __le16 mask_l4_dest_port;
  421. __le16 mask_l4_source_port;
  422. __le16 mask_l2_ether_type;
  423. u8 mask_l2_pcp_dei;
  424. u8 mask_l3_dscp;
  425. u8 match_l3_protocol;
  426. u8 mask_l3_protocol;
  427. };
  428. #define DPSW_RESULT_ACTION_SHIFT 0
  429. #define DPSW_RESULT_ACTION_SIZE 4
  430. struct dpsw_cmd_acl_entry {
  431. __le16 acl_id;
  432. __le16 result_if_id;
  433. __le32 precedence;
  434. /* from LSB only the first 4 bits */
  435. u8 result_action;
  436. u8 pad[7];
  437. __le64 pad2[4];
  438. __le64 key_iova;
  439. };
  440. struct dpsw_cmd_set_reflection_if {
  441. __le16 if_id;
  442. };
  443. #define DPSW_FILTER_SHIFT 0
  444. #define DPSW_FILTER_SIZE 2
  445. struct dpsw_cmd_if_reflection {
  446. __le16 if_id;
  447. __le16 vlan_id;
  448. /* only 2 bits from the LSB */
  449. u8 filter;
  450. };
  451. #pragma pack(pop)
  452. #endif /* __FSL_DPSW_CMD_H */