1e0305cc1SSteen Hegelund // SPDX-License-Identifier: GPL-2.0+
2e0305cc1SSteen Hegelund /* Microchip Sparx5 Switch driver VCAP debugFS implementation
3e0305cc1SSteen Hegelund  *
4e0305cc1SSteen Hegelund  * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
5e0305cc1SSteen Hegelund  */
6e0305cc1SSteen Hegelund 
7e0305cc1SSteen Hegelund #include <linux/types.h>
8e0305cc1SSteen Hegelund #include <linux/list.h>
9e0305cc1SSteen Hegelund 
10e0305cc1SSteen Hegelund #include "sparx5_vcap_debugfs.h"
11e0305cc1SSteen Hegelund #include "sparx5_main_regs.h"
12e0305cc1SSteen Hegelund #include "sparx5_main.h"
13e0305cc1SSteen Hegelund #include "sparx5_vcap_impl.h"
14e0305cc1SSteen Hegelund #include "sparx5_vcap_ag_api.h"
15e0305cc1SSteen Hegelund 
sparx5_vcap_is0_etype_str(u32 value)16545609fdSSteen Hegelund static const char *sparx5_vcap_is0_etype_str(u32 value)
17545609fdSSteen Hegelund {
18545609fdSSteen Hegelund 	switch (value) {
19545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_DEFAULT:
20545609fdSSteen Hegelund 		return "default";
21545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_NORMAL_7TUPLE:
22545609fdSSteen Hegelund 		return "normal_7tuple";
23545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_NORMAL_5TUPLE_IP4:
24545609fdSSteen Hegelund 		return "normal_5tuple_ip4";
25545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_MLL:
26545609fdSSteen Hegelund 		return "mll";
27545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_LL_FULL:
28545609fdSSteen Hegelund 		return "ll_full";
29545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_PURE_5TUPLE_IP4:
30545609fdSSteen Hegelund 		return "pure_5tuple_ip4";
31545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_ETAG:
32545609fdSSteen Hegelund 		return "etag";
33545609fdSSteen Hegelund 	case VCAP_IS0_PS_ETYPE_NO_LOOKUP:
34545609fdSSteen Hegelund 		return "no lookup";
35545609fdSSteen Hegelund 	default:
36545609fdSSteen Hegelund 		return "unknown";
37545609fdSSteen Hegelund 	}
38545609fdSSteen Hegelund }
39545609fdSSteen Hegelund 
sparx5_vcap_is0_mpls_str(u32 value)40545609fdSSteen Hegelund static const char *sparx5_vcap_is0_mpls_str(u32 value)
41545609fdSSteen Hegelund {
42545609fdSSteen Hegelund 	switch (value) {
43545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_FOLLOW_ETYPE:
44545609fdSSteen Hegelund 		return "follow_etype";
45545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_NORMAL_7TUPLE:
46545609fdSSteen Hegelund 		return "normal_7tuple";
47545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_NORMAL_5TUPLE_IP4:
48545609fdSSteen Hegelund 		return "normal_5tuple_ip4";
49545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_MLL:
50545609fdSSteen Hegelund 		return "mll";
51545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_LL_FULL:
52545609fdSSteen Hegelund 		return "ll_full";
53545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_PURE_5TUPLE_IP4:
54545609fdSSteen Hegelund 		return "pure_5tuple_ip4";
55545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_ETAG:
56545609fdSSteen Hegelund 		return "etag";
57545609fdSSteen Hegelund 	case VCAP_IS0_PS_MPLS_NO_LOOKUP:
58545609fdSSteen Hegelund 		return "no lookup";
59545609fdSSteen Hegelund 	default:
60545609fdSSteen Hegelund 		return "unknown";
61545609fdSSteen Hegelund 	}
62545609fdSSteen Hegelund }
63545609fdSSteen Hegelund 
sparx5_vcap_is0_mlbs_str(u32 value)64545609fdSSteen Hegelund static const char *sparx5_vcap_is0_mlbs_str(u32 value)
65545609fdSSteen Hegelund {
66545609fdSSteen Hegelund 	switch (value) {
67545609fdSSteen Hegelund 	case VCAP_IS0_PS_MLBS_FOLLOW_ETYPE:
68545609fdSSteen Hegelund 		return "follow_etype";
69545609fdSSteen Hegelund 	case VCAP_IS0_PS_MLBS_NO_LOOKUP:
70545609fdSSteen Hegelund 		return "no lookup";
71545609fdSSteen Hegelund 	default:
72545609fdSSteen Hegelund 		return "unknown";
73545609fdSSteen Hegelund 	}
74545609fdSSteen Hegelund }
75545609fdSSteen Hegelund 
sparx5_vcap_is0_port_keys(struct sparx5 * sparx5,struct vcap_admin * admin,struct sparx5_port * port,struct vcap_output_print * out)76545609fdSSteen Hegelund static void sparx5_vcap_is0_port_keys(struct sparx5 *sparx5,
77545609fdSSteen Hegelund 				      struct vcap_admin *admin,
78545609fdSSteen Hegelund 				      struct sparx5_port *port,
79545609fdSSteen Hegelund 				      struct vcap_output_print *out)
80545609fdSSteen Hegelund {
81545609fdSSteen Hegelund 	int lookup;
82545609fdSSteen Hegelund 	u32 value, val;
83545609fdSSteen Hegelund 
84545609fdSSteen Hegelund 	out->prf(out->dst, "  port[%02d] (%s): ", port->portno,
85545609fdSSteen Hegelund 		 netdev_name(port->ndev));
86545609fdSSteen Hegelund 	for (lookup = 0; lookup < admin->lookups; ++lookup) {
87545609fdSSteen Hegelund 		out->prf(out->dst, "\n    Lookup %d: ", lookup);
88545609fdSSteen Hegelund 
89545609fdSSteen Hegelund 		/* Get lookup state */
90545609fdSSteen Hegelund 		value = spx5_rd(sparx5,
91545609fdSSteen Hegelund 				ANA_CL_ADV_CL_CFG(port->portno, lookup));
92545609fdSSteen Hegelund 		out->prf(out->dst, "\n      state: ");
93545609fdSSteen Hegelund 		if (ANA_CL_ADV_CL_CFG_LOOKUP_ENA_GET(value))
94545609fdSSteen Hegelund 			out->prf(out->dst, "on");
95545609fdSSteen Hegelund 		else
96545609fdSSteen Hegelund 			out->prf(out->dst, "off");
97545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_ETYPE_CLM_KEY_SEL_GET(value);
98545609fdSSteen Hegelund 		out->prf(out->dst, "\n      etype: %s",
99545609fdSSteen Hegelund 			 sparx5_vcap_is0_etype_str(val));
100545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_IP4_CLM_KEY_SEL_GET(value);
101545609fdSSteen Hegelund 		out->prf(out->dst, "\n      ipv4: %s",
102545609fdSSteen Hegelund 			 sparx5_vcap_is0_etype_str(val));
103545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_IP6_CLM_KEY_SEL_GET(value);
104545609fdSSteen Hegelund 		out->prf(out->dst, "\n      ipv6: %s",
105545609fdSSteen Hegelund 			 sparx5_vcap_is0_etype_str(val));
106545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_MPLS_UC_CLM_KEY_SEL_GET(value);
107545609fdSSteen Hegelund 		out->prf(out->dst, "\n      mpls_uc: %s",
108545609fdSSteen Hegelund 			 sparx5_vcap_is0_mpls_str(val));
109545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_MPLS_MC_CLM_KEY_SEL_GET(value);
110545609fdSSteen Hegelund 		out->prf(out->dst, "\n      mpls_mc: %s",
111545609fdSSteen Hegelund 			 sparx5_vcap_is0_mpls_str(val));
112545609fdSSteen Hegelund 		val = ANA_CL_ADV_CL_CFG_MLBS_CLM_KEY_SEL_GET(value);
113545609fdSSteen Hegelund 		out->prf(out->dst, "\n      mlbs: %s",
114545609fdSSteen Hegelund 			 sparx5_vcap_is0_mlbs_str(val));
115545609fdSSteen Hegelund 	}
116545609fdSSteen Hegelund 	out->prf(out->dst, "\n");
117545609fdSSteen Hegelund }
118545609fdSSteen Hegelund 
sparx5_vcap_is2_port_keys(struct sparx5 * sparx5,struct vcap_admin * admin,struct sparx5_port * port,struct vcap_output_print * out)119545609fdSSteen Hegelund static void sparx5_vcap_is2_port_keys(struct sparx5 *sparx5,
120d4134d41SSteen Hegelund 				      struct vcap_admin *admin,
121d4134d41SSteen Hegelund 				      struct sparx5_port *port,
122d4134d41SSteen Hegelund 				      struct vcap_output_print *out)
123d4134d41SSteen Hegelund {
124d4134d41SSteen Hegelund 	int lookup;
125d4134d41SSteen Hegelund 	u32 value;
126d4134d41SSteen Hegelund 
127d4134d41SSteen Hegelund 	out->prf(out->dst, "  port[%02d] (%s): ", port->portno,
128d4134d41SSteen Hegelund 	   netdev_name(port->ndev));
129d4134d41SSteen Hegelund 	for (lookup = 0; lookup < admin->lookups; ++lookup) {
130d4134d41SSteen Hegelund 		out->prf(out->dst, "\n    Lookup %d: ", lookup);
131d4134d41SSteen Hegelund 
132d4134d41SSteen Hegelund 		/* Get lookup state */
133d4134d41SSteen Hegelund 		value = spx5_rd(sparx5, ANA_ACL_VCAP_S2_CFG(port->portno));
134d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      state: ");
13501ef75a2SSteen Hegelund 		if (ANA_ACL_VCAP_S2_CFG_SEC_ENA_GET(value) & BIT(lookup))
136d4134d41SSteen Hegelund 			out->prf(out->dst, "on");
137d4134d41SSteen Hegelund 		else
138d4134d41SSteen Hegelund 			out->prf(out->dst, "off");
139d4134d41SSteen Hegelund 
140d4134d41SSteen Hegelund 		/* Get key selection state */
141d4134d41SSteen Hegelund 		value = spx5_rd(sparx5,
142d4134d41SSteen Hegelund 				ANA_ACL_VCAP_S2_KEY_SEL(port->portno, lookup));
143d4134d41SSteen Hegelund 
144d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      noneth: ");
145d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_NON_ETH_KEY_SEL_GET(value)) {
146d4134d41SSteen Hegelund 		case VCAP_IS2_PS_NONETH_MAC_ETYPE:
147d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
148d4134d41SSteen Hegelund 			break;
149d4134d41SSteen Hegelund 		case VCAP_IS2_PS_NONETH_CUSTOM_1:
150d4134d41SSteen Hegelund 			out->prf(out->dst, "custom1");
151d4134d41SSteen Hegelund 			break;
152d4134d41SSteen Hegelund 		case VCAP_IS2_PS_NONETH_CUSTOM_2:
153d4134d41SSteen Hegelund 			out->prf(out->dst, "custom2");
154d4134d41SSteen Hegelund 			break;
155d4134d41SSteen Hegelund 		case VCAP_IS2_PS_NONETH_NO_LOOKUP:
156d4134d41SSteen Hegelund 			out->prf(out->dst, "none");
157d4134d41SSteen Hegelund 			break;
158d4134d41SSteen Hegelund 		}
159d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      ipv4_mc: ");
160d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP4_MC_KEY_SEL_GET(value)) {
161d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_MC_MAC_ETYPE:
162d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
163d4134d41SSteen Hegelund 			break;
164d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_MC_IP4_TCP_UDP_OTHER:
165d4134d41SSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_other");
166d4134d41SSteen Hegelund 			break;
167d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_MC_IP_7TUPLE:
168d4134d41SSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
169d4134d41SSteen Hegelund 			break;
170d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_MC_IP4_VID:
171d4134d41SSteen Hegelund 			out->prf(out->dst, "ip4_vid");
172d4134d41SSteen Hegelund 			break;
173d4134d41SSteen Hegelund 		}
174d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      ipv4_uc: ");
175d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP4_UC_KEY_SEL_GET(value)) {
176d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_UC_MAC_ETYPE:
177d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
178d4134d41SSteen Hegelund 			break;
179d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_UC_IP4_TCP_UDP_OTHER:
180d4134d41SSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_other");
181d4134d41SSteen Hegelund 			break;
182d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV4_UC_IP_7TUPLE:
183d4134d41SSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
184d4134d41SSteen Hegelund 			break;
185d4134d41SSteen Hegelund 		}
186d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      ipv6_mc: ");
187d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP6_MC_KEY_SEL_GET(value)) {
188d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_MC_MAC_ETYPE:
189d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
190d4134d41SSteen Hegelund 			break;
191d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_MC_IP_7TUPLE:
192d4134d41SSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
193d4134d41SSteen Hegelund 			break;
194d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_MC_IP6_VID:
195d4134d41SSteen Hegelund 			out->prf(out->dst, "ip6_vid");
196d4134d41SSteen Hegelund 			break;
197d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_MC_IP6_STD:
198d4134d41SSteen Hegelund 			out->prf(out->dst, "ip6_std");
199d4134d41SSteen Hegelund 			break;
200d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_MC_IP4_TCP_UDP_OTHER:
201*fbd3dce9SSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_other");
202d4134d41SSteen Hegelund 			break;
203d4134d41SSteen Hegelund 		}
204d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      ipv6_uc: ");
205d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP6_UC_KEY_SEL_GET(value)) {
206d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_UC_MAC_ETYPE:
207d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
208d4134d41SSteen Hegelund 			break;
209d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_UC_IP_7TUPLE:
210d4134d41SSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
211d4134d41SSteen Hegelund 			break;
212d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_UC_IP6_STD:
213d4134d41SSteen Hegelund 			out->prf(out->dst, "ip6_std");
214d4134d41SSteen Hegelund 			break;
215d4134d41SSteen Hegelund 		case VCAP_IS2_PS_IPV6_UC_IP4_TCP_UDP_OTHER:
216d4134d41SSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_other");
217d4134d41SSteen Hegelund 			break;
218d4134d41SSteen Hegelund 		}
219d4134d41SSteen Hegelund 		out->prf(out->dst, "\n      arp: ");
220d4134d41SSteen Hegelund 		switch (ANA_ACL_VCAP_S2_KEY_SEL_ARP_KEY_SEL_GET(value)) {
221d4134d41SSteen Hegelund 		case VCAP_IS2_PS_ARP_MAC_ETYPE:
222d4134d41SSteen Hegelund 			out->prf(out->dst, "mac_etype");
223d4134d41SSteen Hegelund 			break;
224d4134d41SSteen Hegelund 		case VCAP_IS2_PS_ARP_ARP:
225d4134d41SSteen Hegelund 			out->prf(out->dst, "arp");
226d4134d41SSteen Hegelund 			break;
227d4134d41SSteen Hegelund 		}
228d4134d41SSteen Hegelund 	}
229d4134d41SSteen Hegelund 	out->prf(out->dst, "\n");
230d4134d41SSteen Hegelund }
231d4134d41SSteen Hegelund 
sparx5_vcap_is2_port_stickies(struct sparx5 * sparx5,struct vcap_admin * admin,struct vcap_output_print * out)232545609fdSSteen Hegelund static void sparx5_vcap_is2_port_stickies(struct sparx5 *sparx5,
233d4134d41SSteen Hegelund 					  struct vcap_admin *admin,
234d4134d41SSteen Hegelund 					  struct vcap_output_print *out)
235d4134d41SSteen Hegelund {
236d4134d41SSteen Hegelund 	int lookup;
237d4134d41SSteen Hegelund 	u32 value;
238d4134d41SSteen Hegelund 
239d4134d41SSteen Hegelund 	out->prf(out->dst, "  Sticky bits: ");
240d4134d41SSteen Hegelund 	for (lookup = 0; lookup < admin->lookups; ++lookup) {
241d4134d41SSteen Hegelund 		out->prf(out->dst, "\n    Lookup %d: ", lookup);
242d4134d41SSteen Hegelund 		/* Get lookup sticky bits */
243d4134d41SSteen Hegelund 		value = spx5_rd(sparx5, ANA_ACL_SEC_LOOKUP_STICKY(lookup));
244d4134d41SSteen Hegelund 
245d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_CLM_STICKY_GET(value))
246d4134d41SSteen Hegelund 			out->prf(out->dst, " sel_clm");
247d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_IRLEG_STICKY_GET(value))
248d4134d41SSteen Hegelund 			out->prf(out->dst, " sel_irleg");
249d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_ERLEG_STICKY_GET(value))
250d4134d41SSteen Hegelund 			out->prf(out->dst, " sel_erleg");
251d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_PORT_STICKY_GET(value))
252d4134d41SSteen Hegelund 			out->prf(out->dst, " sel_port");
253d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_CUSTOM2_STICKY_GET(value))
254d4134d41SSteen Hegelund 			out->prf(out->dst, " custom2");
255d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_CUSTOM1_STICKY_GET(value))
256d4134d41SSteen Hegelund 			out->prf(out->dst, " custom1");
257d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_OAM_STICKY_GET(value))
258d4134d41SSteen Hegelund 			out->prf(out->dst, " oam");
259d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_VID_STICKY_GET(value))
260d4134d41SSteen Hegelund 			out->prf(out->dst, " ip6_vid");
261d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_STD_STICKY_GET(value))
262d4134d41SSteen Hegelund 			out->prf(out->dst, " ip6_std");
263d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_TCPUDP_STICKY_GET(value))
264d4134d41SSteen Hegelund 			out->prf(out->dst, " ip6_tcpudp");
265d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP_7TUPLE_STICKY_GET(value))
266d4134d41SSteen Hegelund 			out->prf(out->dst, " ip_7tuple");
267d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_VID_STICKY_GET(value))
268d4134d41SSteen Hegelund 			out->prf(out->dst, " ip4_vid");
269d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_TCPUDP_STICKY_GET(value))
270d4134d41SSteen Hegelund 			out->prf(out->dst, " ip4_tcpudp");
271d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_OTHER_STICKY_GET(value))
272d4134d41SSteen Hegelund 			out->prf(out->dst, " ip4_other");
273d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_ARP_STICKY_GET(value))
274d4134d41SSteen Hegelund 			out->prf(out->dst, " arp");
275d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_SNAP_STICKY_GET(value))
276d4134d41SSteen Hegelund 			out->prf(out->dst, " mac_snap");
277d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_LLC_STICKY_GET(value))
278d4134d41SSteen Hegelund 			out->prf(out->dst, " mac_llc");
279d4134d41SSteen Hegelund 		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_ETYPE_STICKY_GET(value))
280d4134d41SSteen Hegelund 			out->prf(out->dst, " mac_etype");
281d4134d41SSteen Hegelund 		/* Clear stickies */
282d4134d41SSteen Hegelund 		spx5_wr(value, sparx5, ANA_ACL_SEC_LOOKUP_STICKY(lookup));
283d4134d41SSteen Hegelund 	}
284d4134d41SSteen Hegelund 	out->prf(out->dst, "\n");
285d4134d41SSteen Hegelund }
286d4134d41SSteen Hegelund 
sparx5_vcap_es0_port_keys(struct sparx5 * sparx5,struct vcap_admin * admin,struct sparx5_port * port,struct vcap_output_print * out)2873cbe7537SSteen Hegelund static void sparx5_vcap_es0_port_keys(struct sparx5 *sparx5,
2883cbe7537SSteen Hegelund 				      struct vcap_admin *admin,
2893cbe7537SSteen Hegelund 				      struct sparx5_port *port,
2903cbe7537SSteen Hegelund 				      struct vcap_output_print *out)
2913cbe7537SSteen Hegelund {
2923cbe7537SSteen Hegelund 	u32 value;
2933cbe7537SSteen Hegelund 
2943cbe7537SSteen Hegelund 	out->prf(out->dst, "  port[%02d] (%s): ", port->portno,
2953cbe7537SSteen Hegelund 		 netdev_name(port->ndev));
2963cbe7537SSteen Hegelund 	out->prf(out->dst, "\n    Lookup 0: ");
2973cbe7537SSteen Hegelund 
2983cbe7537SSteen Hegelund 	/* Get lookup state */
2993cbe7537SSteen Hegelund 	value = spx5_rd(sparx5, REW_ES0_CTRL);
3003cbe7537SSteen Hegelund 	out->prf(out->dst, "\n      state: ");
3013cbe7537SSteen Hegelund 	if (REW_ES0_CTRL_ES0_LU_ENA_GET(value))
3023cbe7537SSteen Hegelund 		out->prf(out->dst, "on");
3033cbe7537SSteen Hegelund 	else
3043cbe7537SSteen Hegelund 		out->prf(out->dst, "off");
3053cbe7537SSteen Hegelund 
3063cbe7537SSteen Hegelund 	out->prf(out->dst, "\n      keyset: ");
3073cbe7537SSteen Hegelund 	value = spx5_rd(sparx5, REW_RTAG_ETAG_CTRL(port->portno));
3083cbe7537SSteen Hegelund 	switch (REW_RTAG_ETAG_CTRL_ES0_ISDX_KEY_ENA_GET(value)) {
3093cbe7537SSteen Hegelund 	case VCAP_ES0_PS_NORMAL_SELECTION:
3103cbe7537SSteen Hegelund 		out->prf(out->dst, "normal");
3113cbe7537SSteen Hegelund 		break;
3123cbe7537SSteen Hegelund 	case VCAP_ES0_PS_FORCE_ISDX_LOOKUPS:
3133cbe7537SSteen Hegelund 		out->prf(out->dst, "isdx");
3143cbe7537SSteen Hegelund 		break;
3153cbe7537SSteen Hegelund 	case VCAP_ES0_PS_FORCE_VID_LOOKUPS:
3163cbe7537SSteen Hegelund 		out->prf(out->dst, "vid");
3173cbe7537SSteen Hegelund 		break;
3183cbe7537SSteen Hegelund 	case VCAP_ES0_PS_RESERVED:
3193cbe7537SSteen Hegelund 		out->prf(out->dst, "reserved");
3203cbe7537SSteen Hegelund 		break;
3213cbe7537SSteen Hegelund 	}
3223cbe7537SSteen Hegelund 	out->prf(out->dst, "\n");
3233cbe7537SSteen Hegelund }
3243cbe7537SSteen Hegelund 
sparx5_vcap_es2_port_keys(struct sparx5 * sparx5,struct vcap_admin * admin,struct sparx5_port * port,struct vcap_output_print * out)325b95d9e2cSSteen Hegelund static void sparx5_vcap_es2_port_keys(struct sparx5 *sparx5,
326b95d9e2cSSteen Hegelund 				      struct vcap_admin *admin,
327b95d9e2cSSteen Hegelund 				      struct sparx5_port *port,
328b95d9e2cSSteen Hegelund 				      struct vcap_output_print *out)
329b95d9e2cSSteen Hegelund {
330b95d9e2cSSteen Hegelund 	int lookup;
331b95d9e2cSSteen Hegelund 	u32 value;
332b95d9e2cSSteen Hegelund 
333b95d9e2cSSteen Hegelund 	out->prf(out->dst, "  port[%02d] (%s): ", port->portno,
334b95d9e2cSSteen Hegelund 	   netdev_name(port->ndev));
335b95d9e2cSSteen Hegelund 	for (lookup = 0; lookup < admin->lookups; ++lookup) {
336b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n    Lookup %d: ", lookup);
337b95d9e2cSSteen Hegelund 
338b95d9e2cSSteen Hegelund 		/* Get lookup state */
339b95d9e2cSSteen Hegelund 		value = spx5_rd(sparx5, EACL_VCAP_ES2_KEY_SEL(port->portno,
340b95d9e2cSSteen Hegelund 							      lookup));
341b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n      state: ");
342b95d9e2cSSteen Hegelund 		if (EACL_VCAP_ES2_KEY_SEL_KEY_ENA_GET(value))
343b95d9e2cSSteen Hegelund 			out->prf(out->dst, "on");
344b95d9e2cSSteen Hegelund 		else
345b95d9e2cSSteen Hegelund 			out->prf(out->dst, "off");
346b95d9e2cSSteen Hegelund 
347b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n      arp: ");
348b95d9e2cSSteen Hegelund 		switch (EACL_VCAP_ES2_KEY_SEL_ARP_KEY_SEL_GET(value)) {
349b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_ARP_MAC_ETYPE:
350b95d9e2cSSteen Hegelund 			out->prf(out->dst, "mac_etype");
351b95d9e2cSSteen Hegelund 			break;
352b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_ARP_ARP:
353b95d9e2cSSteen Hegelund 			out->prf(out->dst, "arp");
354b95d9e2cSSteen Hegelund 			break;
355b95d9e2cSSteen Hegelund 		}
356b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n      ipv4: ");
357b95d9e2cSSteen Hegelund 		switch (EACL_VCAP_ES2_KEY_SEL_IP4_KEY_SEL_GET(value)) {
358b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_MAC_ETYPE:
359b95d9e2cSSteen Hegelund 			out->prf(out->dst, "mac_etype");
360b95d9e2cSSteen Hegelund 			break;
361b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_IP_7TUPLE:
362b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
363b95d9e2cSSteen Hegelund 			break;
364b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_IP4_TCP_UDP_VID:
365b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_vid");
366b95d9e2cSSteen Hegelund 			break;
367b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_IP4_TCP_UDP_OTHER:
368b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip4_tcp_udp ip4_other");
369b95d9e2cSSteen Hegelund 			break;
370b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_IP4_VID:
371b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip4_vid");
372b95d9e2cSSteen Hegelund 			break;
373b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV4_IP4_OTHER:
374b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip4_other");
375b95d9e2cSSteen Hegelund 			break;
376b95d9e2cSSteen Hegelund 		}
377b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n      ipv6: ");
378b95d9e2cSSteen Hegelund 		switch (EACL_VCAP_ES2_KEY_SEL_IP6_KEY_SEL_GET(value)) {
379b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_MAC_ETYPE:
380b95d9e2cSSteen Hegelund 			out->prf(out->dst, "mac_etype");
381b95d9e2cSSteen Hegelund 			break;
382b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP_7TUPLE:
383b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip_7tuple");
384b95d9e2cSSteen Hegelund 			break;
385b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP_7TUPLE_VID:
386b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip_7tuple ip6_vid");
387b95d9e2cSSteen Hegelund 			break;
388b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP_7TUPLE_STD:
389b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip_7tuple ip6_std");
390b95d9e2cSSteen Hegelund 			break;
391b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP6_VID:
392b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip6_vid");
393b95d9e2cSSteen Hegelund 			break;
394b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP6_STD:
395b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip6_std");
396b95d9e2cSSteen Hegelund 			break;
397b95d9e2cSSteen Hegelund 		case VCAP_ES2_PS_IPV6_IP4_DOWNGRADE:
398b95d9e2cSSteen Hegelund 			out->prf(out->dst, "ip4_downgrade");
399b95d9e2cSSteen Hegelund 			break;
400b95d9e2cSSteen Hegelund 		}
401b95d9e2cSSteen Hegelund 	}
402b95d9e2cSSteen Hegelund 	out->prf(out->dst, "\n");
403b95d9e2cSSteen Hegelund }
404b95d9e2cSSteen Hegelund 
sparx5_vcap_es2_port_stickies(struct sparx5 * sparx5,struct vcap_admin * admin,struct vcap_output_print * out)405b95d9e2cSSteen Hegelund static void sparx5_vcap_es2_port_stickies(struct sparx5 *sparx5,
406b95d9e2cSSteen Hegelund 					  struct vcap_admin *admin,
407b95d9e2cSSteen Hegelund 					  struct vcap_output_print *out)
408b95d9e2cSSteen Hegelund {
409b95d9e2cSSteen Hegelund 	int lookup;
410b95d9e2cSSteen Hegelund 	u32 value;
411b95d9e2cSSteen Hegelund 
412b95d9e2cSSteen Hegelund 	out->prf(out->dst, "  Sticky bits: ");
413b95d9e2cSSteen Hegelund 	for (lookup = 0; lookup < admin->lookups; ++lookup) {
414b95d9e2cSSteen Hegelund 		value = spx5_rd(sparx5, EACL_SEC_LOOKUP_STICKY(lookup));
415b95d9e2cSSteen Hegelund 		out->prf(out->dst, "\n    Lookup %d: ", lookup);
416b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP_7TUPLE_STICKY_GET(value))
417b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip_7tuple");
418b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_VID_STICKY_GET(value))
419b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip6_vid");
420b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_STD_STICKY_GET(value))
421b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip6_std");
422b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_TCPUDP_STICKY_GET(value))
423b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip4_tcp_udp");
424b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_VID_STICKY_GET(value))
425b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip4_vid");
426b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_OTHER_STICKY_GET(value))
427b95d9e2cSSteen Hegelund 			out->prf(out->dst, " ip4_other");
428b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_ARP_STICKY_GET(value))
429b95d9e2cSSteen Hegelund 			out->prf(out->dst, " arp");
430b95d9e2cSSteen Hegelund 		if (EACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_ETYPE_STICKY_GET(value))
431b95d9e2cSSteen Hegelund 			out->prf(out->dst, " mac_etype");
432b95d9e2cSSteen Hegelund 		/* Clear stickies */
433b95d9e2cSSteen Hegelund 		spx5_wr(value, sparx5, EACL_SEC_LOOKUP_STICKY(lookup));
434b95d9e2cSSteen Hegelund 	}
435b95d9e2cSSteen Hegelund 	out->prf(out->dst, "\n");
436b95d9e2cSSteen Hegelund }
437b95d9e2cSSteen Hegelund 
438e0305cc1SSteen Hegelund /* Provide port information via a callback interface */
sparx5_port_info(struct net_device * ndev,struct vcap_admin * admin,struct vcap_output_print * out)439e0305cc1SSteen Hegelund int sparx5_port_info(struct net_device *ndev,
440e0305cc1SSteen Hegelund 		     struct vcap_admin *admin,
441e0305cc1SSteen Hegelund 		     struct vcap_output_print *out)
442e0305cc1SSteen Hegelund {
443d4134d41SSteen Hegelund 	struct sparx5_port *port = netdev_priv(ndev);
444d4134d41SSteen Hegelund 	struct sparx5 *sparx5 = port->sparx5;
445d4134d41SSteen Hegelund 	const struct vcap_info *vcap;
446d4134d41SSteen Hegelund 	struct vcap_control *vctrl;
447d4134d41SSteen Hegelund 
448d4134d41SSteen Hegelund 	vctrl = sparx5->vcap_ctrl;
449d4134d41SSteen Hegelund 	vcap = &vctrl->vcaps[admin->vtype];
450d4134d41SSteen Hegelund 	out->prf(out->dst, "%s:\n", vcap->name);
451545609fdSSteen Hegelund 	switch (admin->vtype) {
452545609fdSSteen Hegelund 	case VCAP_TYPE_IS0:
453545609fdSSteen Hegelund 		sparx5_vcap_is0_port_keys(sparx5, admin, port, out);
454545609fdSSteen Hegelund 		break;
455545609fdSSteen Hegelund 	case VCAP_TYPE_IS2:
456545609fdSSteen Hegelund 		sparx5_vcap_is2_port_keys(sparx5, admin, port, out);
457545609fdSSteen Hegelund 		sparx5_vcap_is2_port_stickies(sparx5, admin, out);
458545609fdSSteen Hegelund 		break;
4593cbe7537SSteen Hegelund 	case VCAP_TYPE_ES0:
4603cbe7537SSteen Hegelund 		sparx5_vcap_es0_port_keys(sparx5, admin, port, out);
4613cbe7537SSteen Hegelund 		break;
462b95d9e2cSSteen Hegelund 	case VCAP_TYPE_ES2:
463b95d9e2cSSteen Hegelund 		sparx5_vcap_es2_port_keys(sparx5, admin, port, out);
464b95d9e2cSSteen Hegelund 		sparx5_vcap_es2_port_stickies(sparx5, admin, out);
465b95d9e2cSSteen Hegelund 		break;
466545609fdSSteen Hegelund 	default:
467545609fdSSteen Hegelund 		out->prf(out->dst, "  no info\n");
468545609fdSSteen Hegelund 		break;
469545609fdSSteen Hegelund 	}
470e0305cc1SSteen Hegelund 	return 0;
471e0305cc1SSteen Hegelund }
472