lan966x_vcap_debugfs.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. // SPDX-License-Identifier: GPL-2.0+
  2. #include "lan966x_main.h"
  3. #include "lan966x_vcap_ag_api.h"
  4. #include "vcap_api.h"
  5. #include "vcap_api_client.h"
  6. static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
  7. struct vcap_admin *admin,
  8. struct vcap_output_print *out)
  9. {
  10. struct lan966x *lan966x = port->lan966x;
  11. u32 val;
  12. out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
  13. netdev_name(port->dev));
  14. val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
  15. out->prf(out->dst, "\n state: ");
  16. if (ANA_VCAP_CFG_S1_ENA_GET(val))
  17. out->prf(out->dst, "on");
  18. else
  19. out->prf(out->dst, "off");
  20. for (int l = 0; l < admin->lookups; ++l) {
  21. out->prf(out->dst, "\n Lookup %d: ", l);
  22. val = lan_rd(lan966x, ANA_VCAP_S1_CFG(port->chip_port, l));
  23. out->prf(out->dst, "\n other: ");
  24. switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
  25. case VCAP_IS1_PS_OTHER_NORMAL:
  26. out->prf(out->dst, "normal");
  27. break;
  28. case VCAP_IS1_PS_OTHER_7TUPLE:
  29. out->prf(out->dst, "7tuple");
  30. break;
  31. case VCAP_IS1_PS_OTHER_DBL_VID:
  32. out->prf(out->dst, "dbl_vid");
  33. break;
  34. case VCAP_IS1_PS_OTHER_DMAC_VID:
  35. out->prf(out->dst, "dmac_vid");
  36. break;
  37. default:
  38. out->prf(out->dst, "-");
  39. break;
  40. }
  41. out->prf(out->dst, "\n ipv4: ");
  42. switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
  43. case VCAP_IS1_PS_IPV4_NORMAL:
  44. out->prf(out->dst, "normal");
  45. break;
  46. case VCAP_IS1_PS_IPV4_7TUPLE:
  47. out->prf(out->dst, "7tuple");
  48. break;
  49. case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
  50. out->prf(out->dst, "5tuple_ipv4");
  51. break;
  52. case VCAP_IS1_PS_IPV4_DBL_VID:
  53. out->prf(out->dst, "dbl_vid");
  54. break;
  55. case VCAP_IS1_PS_IPV4_DMAC_VID:
  56. out->prf(out->dst, "dmac_vid");
  57. break;
  58. default:
  59. out->prf(out->dst, "-");
  60. break;
  61. }
  62. out->prf(out->dst, "\n ipv6: ");
  63. switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
  64. case VCAP_IS1_PS_IPV6_NORMAL:
  65. out->prf(out->dst, "normal");
  66. break;
  67. case VCAP_IS1_PS_IPV6_7TUPLE:
  68. out->prf(out->dst, "7tuple");
  69. break;
  70. case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
  71. out->prf(out->dst, "5tuple_ip4");
  72. break;
  73. case VCAP_IS1_PS_IPV6_NORMAL_IP6:
  74. out->prf(out->dst, "normal_ip6");
  75. break;
  76. case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
  77. out->prf(out->dst, "5tuple_ip6");
  78. break;
  79. case VCAP_IS1_PS_IPV6_DBL_VID:
  80. out->prf(out->dst, "dbl_vid");
  81. break;
  82. case VCAP_IS1_PS_IPV6_DMAC_VID:
  83. out->prf(out->dst, "dmac_vid");
  84. break;
  85. default:
  86. out->prf(out->dst, "-");
  87. break;
  88. }
  89. out->prf(out->dst, "\n rt: ");
  90. switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
  91. case VCAP_IS1_PS_RT_NORMAL:
  92. out->prf(out->dst, "normal");
  93. break;
  94. case VCAP_IS1_PS_RT_7TUPLE:
  95. out->prf(out->dst, "7tuple");
  96. break;
  97. case VCAP_IS1_PS_RT_DBL_VID:
  98. out->prf(out->dst, "dbl_vid");
  99. break;
  100. case VCAP_IS1_PS_RT_DMAC_VID:
  101. out->prf(out->dst, "dmac_vid");
  102. break;
  103. case VCAP_IS1_PS_RT_FOLLOW_OTHER:
  104. out->prf(out->dst, "follow_other");
  105. break;
  106. default:
  107. out->prf(out->dst, "-");
  108. break;
  109. }
  110. }
  111. out->prf(out->dst, "\n");
  112. }
  113. static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
  114. struct vcap_admin *admin,
  115. struct vcap_output_print *out)
  116. {
  117. struct lan966x *lan966x = port->lan966x;
  118. u32 val;
  119. out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
  120. netdev_name(port->dev));
  121. val = lan_rd(lan966x, ANA_VCAP_S2_CFG(port->chip_port));
  122. out->prf(out->dst, "\n state: ");
  123. if (ANA_VCAP_S2_CFG_ENA_GET(val))
  124. out->prf(out->dst, "on");
  125. else
  126. out->prf(out->dst, "off");
  127. for (int l = 0; l < admin->lookups; ++l) {
  128. out->prf(out->dst, "\n Lookup %d: ", l);
  129. out->prf(out->dst, "\n snap: ");
  130. if (ANA_VCAP_S2_CFG_SNAP_DIS_GET(val) & (BIT(0) << l))
  131. out->prf(out->dst, "mac_llc");
  132. else
  133. out->prf(out->dst, "mac_snap");
  134. out->prf(out->dst, "\n oam: ");
  135. if (ANA_VCAP_S2_CFG_OAM_DIS_GET(val) & (BIT(0) << l))
  136. out->prf(out->dst, "mac_etype");
  137. else
  138. out->prf(out->dst, "mac_oam");
  139. out->prf(out->dst, "\n arp: ");
  140. if (ANA_VCAP_S2_CFG_ARP_DIS_GET(val) & (BIT(0) << l))
  141. out->prf(out->dst, "mac_etype");
  142. else
  143. out->prf(out->dst, "mac_arp");
  144. out->prf(out->dst, "\n ipv4_other: ");
  145. if (ANA_VCAP_S2_CFG_IP_OTHER_DIS_GET(val) & (BIT(0) << l))
  146. out->prf(out->dst, "mac_etype");
  147. else
  148. out->prf(out->dst, "ip4_other");
  149. out->prf(out->dst, "\n ipv4_tcp_udp: ");
  150. if (ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_GET(val) & (BIT(0) << l))
  151. out->prf(out->dst, "mac_etype");
  152. else
  153. out->prf(out->dst, "ipv4_tcp_udp");
  154. out->prf(out->dst, "\n ipv6: ");
  155. switch (ANA_VCAP_S2_CFG_IP6_CFG_GET(val) & (0x3 << l)) {
  156. case VCAP_IS2_PS_IPV6_TCPUDP_OTHER:
  157. out->prf(out->dst, "ipv6_tcp_udp ipv6_tcp_udp");
  158. break;
  159. case VCAP_IS2_PS_IPV6_STD:
  160. out->prf(out->dst, "ipv6_std");
  161. break;
  162. case VCAP_IS2_PS_IPV6_IP4_TCPUDP_IP4_OTHER:
  163. out->prf(out->dst, "ipv4_tcp_udp ipv4_tcp_udp");
  164. break;
  165. case VCAP_IS2_PS_IPV6_MAC_ETYPE:
  166. out->prf(out->dst, "mac_etype");
  167. break;
  168. }
  169. }
  170. out->prf(out->dst, "\n");
  171. }
  172. static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
  173. struct vcap_admin *admin,
  174. struct vcap_output_print *out)
  175. {
  176. struct lan966x *lan966x = port->lan966x;
  177. u32 val;
  178. out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
  179. netdev_name(port->dev));
  180. val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
  181. out->prf(out->dst, "\n state: ");
  182. if (REW_PORT_CFG_ES0_EN_GET(val))
  183. out->prf(out->dst, "on");
  184. else
  185. out->prf(out->dst, "off");
  186. out->prf(out->dst, "\n");
  187. }
  188. int lan966x_vcap_port_info(struct net_device *dev,
  189. struct vcap_admin *admin,
  190. struct vcap_output_print *out)
  191. {
  192. struct lan966x_port *port = netdev_priv(dev);
  193. struct lan966x *lan966x = port->lan966x;
  194. const struct vcap_info *vcap;
  195. struct vcap_control *vctrl;
  196. vctrl = lan966x->vcap_ctrl;
  197. vcap = &vctrl->vcaps[admin->vtype];
  198. out->prf(out->dst, "%s:\n", vcap->name);
  199. switch (admin->vtype) {
  200. case VCAP_TYPE_IS2:
  201. lan966x_vcap_is2_port_keys(port, admin, out);
  202. break;
  203. case VCAP_TYPE_IS1:
  204. lan966x_vcap_is1_port_keys(port, admin, out);
  205. break;
  206. case VCAP_TYPE_ES0:
  207. lan966x_vcap_es0_port_keys(port, admin, out);
  208. break;
  209. default:
  210. out->prf(out->dst, " no info\n");
  211. break;
  212. }
  213. return 0;
  214. }