194281484SHoratiu Vultur // SPDX-License-Identifier: GPL-2.0+
294281484SHoratiu Vultur 
394281484SHoratiu Vultur #include "lan966x_main.h"
494281484SHoratiu Vultur #include "lan966x_vcap_ag_api.h"
594281484SHoratiu Vultur #include "vcap_api.h"
694281484SHoratiu Vultur #include "vcap_api_client.h"
794281484SHoratiu Vultur 
lan966x_vcap_is1_port_keys(struct lan966x_port * port,struct vcap_admin * admin,struct vcap_output_print * out)8a4d9b3ecSHoratiu Vultur static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
9a4d9b3ecSHoratiu Vultur 				       struct vcap_admin *admin,
10a4d9b3ecSHoratiu Vultur 				       struct vcap_output_print *out)
11a4d9b3ecSHoratiu Vultur {
12a4d9b3ecSHoratiu Vultur 	struct lan966x *lan966x = port->lan966x;
13a4d9b3ecSHoratiu Vultur 	u32 val;
14a4d9b3ecSHoratiu Vultur 
15a4d9b3ecSHoratiu Vultur 	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
16a4d9b3ecSHoratiu Vultur 		 netdev_name(port->dev));
17a4d9b3ecSHoratiu Vultur 
18a4d9b3ecSHoratiu Vultur 	val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
19a4d9b3ecSHoratiu Vultur 	out->prf(out->dst, "\n    state: ");
20a4d9b3ecSHoratiu Vultur 	if (ANA_VCAP_CFG_S1_ENA_GET(val))
21a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "on");
22a4d9b3ecSHoratiu Vultur 	else
23a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "off");
24a4d9b3ecSHoratiu Vultur 
25a4d9b3ecSHoratiu Vultur 	for (int l = 0; l < admin->lookups; ++l) {
26a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "\n    Lookup %d: ", l);
27a4d9b3ecSHoratiu Vultur 
28a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "\n      other: ");
29a4d9b3ecSHoratiu Vultur 		switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
30a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_OTHER_NORMAL:
31a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "normal");
32a4d9b3ecSHoratiu Vultur 			break;
33a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_OTHER_7TUPLE:
34a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "7tuple");
35a4d9b3ecSHoratiu Vultur 			break;
36a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_OTHER_DBL_VID:
37a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dbl_vid");
38a4d9b3ecSHoratiu Vultur 			break;
39a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_OTHER_DMAC_VID:
40a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dmac_vid");
41a4d9b3ecSHoratiu Vultur 			break;
42a4d9b3ecSHoratiu Vultur 		default:
43a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "-");
44a4d9b3ecSHoratiu Vultur 			break;
45a4d9b3ecSHoratiu Vultur 		}
46a4d9b3ecSHoratiu Vultur 
47a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "\n      ipv4: ");
48a4d9b3ecSHoratiu Vultur 		switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
49a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV4_NORMAL:
50a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "normal");
51a4d9b3ecSHoratiu Vultur 			break;
52a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV4_7TUPLE:
53a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "7tuple");
54a4d9b3ecSHoratiu Vultur 			break;
55a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
56a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "5tuple_ipv4");
57a4d9b3ecSHoratiu Vultur 			break;
58a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV4_DBL_VID:
59a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dbl_vid");
60a4d9b3ecSHoratiu Vultur 			break;
61a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV4_DMAC_VID:
62a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dmac_vid");
63a4d9b3ecSHoratiu Vultur 			break;
64a4d9b3ecSHoratiu Vultur 		default:
65a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "-");
66a4d9b3ecSHoratiu Vultur 			break;
67a4d9b3ecSHoratiu Vultur 		}
68a4d9b3ecSHoratiu Vultur 
69a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "\n      ipv6: ");
70a4d9b3ecSHoratiu Vultur 		switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
71a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_NORMAL:
72a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "normal");
73a4d9b3ecSHoratiu Vultur 			break;
74a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_7TUPLE:
75a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "7tuple");
76a4d9b3ecSHoratiu Vultur 			break;
77a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
78a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "5tuple_ip4");
79a4d9b3ecSHoratiu Vultur 			break;
80a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_NORMAL_IP6:
81a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "normal_ip6");
82a4d9b3ecSHoratiu Vultur 			break;
83a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
84a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "5tuple_ip6");
85a4d9b3ecSHoratiu Vultur 			break;
86a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_DBL_VID:
87a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dbl_vid");
88a4d9b3ecSHoratiu Vultur 			break;
89a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_IPV6_DMAC_VID:
90a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dmac_vid");
91a4d9b3ecSHoratiu Vultur 			break;
92a4d9b3ecSHoratiu Vultur 		default:
93a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "-");
94a4d9b3ecSHoratiu Vultur 			break;
95a4d9b3ecSHoratiu Vultur 		}
96a4d9b3ecSHoratiu Vultur 
97a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "\n      rt: ");
98a4d9b3ecSHoratiu Vultur 		switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
99a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_RT_NORMAL:
100a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "normal");
101a4d9b3ecSHoratiu Vultur 			break;
102a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_RT_7TUPLE:
103a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "7tuple");
104a4d9b3ecSHoratiu Vultur 			break;
105a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_RT_DBL_VID:
106a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dbl_vid");
107a4d9b3ecSHoratiu Vultur 			break;
108a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_RT_DMAC_VID:
109a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "dmac_vid");
110a4d9b3ecSHoratiu Vultur 			break;
111a4d9b3ecSHoratiu Vultur 		case VCAP_IS1_PS_RT_FOLLOW_OTHER:
112a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "follow_other");
113a4d9b3ecSHoratiu Vultur 			break;
114a4d9b3ecSHoratiu Vultur 		default:
115a4d9b3ecSHoratiu Vultur 			out->prf(out->dst, "-");
116a4d9b3ecSHoratiu Vultur 			break;
117a4d9b3ecSHoratiu Vultur 		}
118a4d9b3ecSHoratiu Vultur 	}
119a4d9b3ecSHoratiu Vultur 
120a4d9b3ecSHoratiu Vultur 	out->prf(out->dst, "\n");
121a4d9b3ecSHoratiu Vultur }
122a4d9b3ecSHoratiu Vultur 
lan966x_vcap_is2_port_keys(struct lan966x_port * port,struct vcap_admin * admin,struct vcap_output_print * out)123a4d9b3ecSHoratiu Vultur static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
12494281484SHoratiu Vultur 				       struct vcap_admin *admin,
12594281484SHoratiu Vultur 				       struct vcap_output_print *out)
12694281484SHoratiu Vultur {
12794281484SHoratiu Vultur 	struct lan966x *lan966x = port->lan966x;
12894281484SHoratiu Vultur 	u32 val;
12994281484SHoratiu Vultur 
13094281484SHoratiu Vultur 	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
13194281484SHoratiu Vultur 		 netdev_name(port->dev));
13294281484SHoratiu Vultur 
13394281484SHoratiu Vultur 	val = lan_rd(lan966x, ANA_VCAP_S2_CFG(port->chip_port));
13494281484SHoratiu Vultur 	out->prf(out->dst, "\n    state: ");
13594281484SHoratiu Vultur 	if (ANA_VCAP_S2_CFG_ENA_GET(val))
13694281484SHoratiu Vultur 		out->prf(out->dst, "on");
13794281484SHoratiu Vultur 	else
13894281484SHoratiu Vultur 		out->prf(out->dst, "off");
13994281484SHoratiu Vultur 
14094281484SHoratiu Vultur 	for (int l = 0; l < admin->lookups; ++l) {
14194281484SHoratiu Vultur 		out->prf(out->dst, "\n    Lookup %d: ", l);
14294281484SHoratiu Vultur 
14394281484SHoratiu Vultur 		out->prf(out->dst, "\n      snap: ");
14494281484SHoratiu Vultur 		if (ANA_VCAP_S2_CFG_SNAP_DIS_GET(val) & (BIT(0) << l))
14594281484SHoratiu Vultur 			out->prf(out->dst, "mac_llc");
14694281484SHoratiu Vultur 		else
14794281484SHoratiu Vultur 			out->prf(out->dst, "mac_snap");
14894281484SHoratiu Vultur 
14994281484SHoratiu Vultur 		out->prf(out->dst, "\n      oam: ");
15094281484SHoratiu Vultur 		if (ANA_VCAP_S2_CFG_OAM_DIS_GET(val) & (BIT(0) << l))
15194281484SHoratiu Vultur 			out->prf(out->dst, "mac_etype");
15294281484SHoratiu Vultur 		else
15394281484SHoratiu Vultur 			out->prf(out->dst, "mac_oam");
15494281484SHoratiu Vultur 
15594281484SHoratiu Vultur 		out->prf(out->dst, "\n      arp: ");
15694281484SHoratiu Vultur 		if (ANA_VCAP_S2_CFG_ARP_DIS_GET(val) & (BIT(0) << l))
15794281484SHoratiu Vultur 			out->prf(out->dst, "mac_etype");
15894281484SHoratiu Vultur 		else
15994281484SHoratiu Vultur 			out->prf(out->dst, "mac_arp");
16094281484SHoratiu Vultur 
16194281484SHoratiu Vultur 		out->prf(out->dst, "\n      ipv4_other: ");
16294281484SHoratiu Vultur 		if (ANA_VCAP_S2_CFG_IP_OTHER_DIS_GET(val) & (BIT(0) << l))
16394281484SHoratiu Vultur 			out->prf(out->dst, "mac_etype");
16494281484SHoratiu Vultur 		else
16594281484SHoratiu Vultur 			out->prf(out->dst, "ip4_other");
16694281484SHoratiu Vultur 
16794281484SHoratiu Vultur 		out->prf(out->dst, "\n      ipv4_tcp_udp: ");
16894281484SHoratiu Vultur 		if (ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_GET(val) & (BIT(0) << l))
16994281484SHoratiu Vultur 			out->prf(out->dst, "mac_etype");
17094281484SHoratiu Vultur 		else
17194281484SHoratiu Vultur 			out->prf(out->dst, "ipv4_tcp_udp");
17294281484SHoratiu Vultur 
17394281484SHoratiu Vultur 		out->prf(out->dst, "\n      ipv6: ");
17494281484SHoratiu Vultur 		switch (ANA_VCAP_S2_CFG_IP6_CFG_GET(val) & (0x3 << l)) {
17594281484SHoratiu Vultur 		case VCAP_IS2_PS_IPV6_TCPUDP_OTHER:
17694281484SHoratiu Vultur 			out->prf(out->dst, "ipv6_tcp_udp ipv6_tcp_udp");
17794281484SHoratiu Vultur 			break;
17894281484SHoratiu Vultur 		case VCAP_IS2_PS_IPV6_STD:
17994281484SHoratiu Vultur 			out->prf(out->dst, "ipv6_std");
18094281484SHoratiu Vultur 			break;
18194281484SHoratiu Vultur 		case VCAP_IS2_PS_IPV6_IP4_TCPUDP_IP4_OTHER:
18294281484SHoratiu Vultur 			out->prf(out->dst, "ipv4_tcp_udp ipv4_tcp_udp");
18394281484SHoratiu Vultur 			break;
18494281484SHoratiu Vultur 		case VCAP_IS2_PS_IPV6_MAC_ETYPE:
18594281484SHoratiu Vultur 			out->prf(out->dst, "mac_etype");
18694281484SHoratiu Vultur 			break;
18794281484SHoratiu Vultur 		}
18894281484SHoratiu Vultur 	}
18994281484SHoratiu Vultur 
19094281484SHoratiu Vultur 	out->prf(out->dst, "\n");
19194281484SHoratiu Vultur }
19294281484SHoratiu Vultur 
lan966x_vcap_es0_port_keys(struct lan966x_port * port,struct vcap_admin * admin,struct vcap_output_print * out)193*96b6c8a6SHoratiu Vultur static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
194*96b6c8a6SHoratiu Vultur 				       struct vcap_admin *admin,
195*96b6c8a6SHoratiu Vultur 				       struct vcap_output_print *out)
196*96b6c8a6SHoratiu Vultur {
197*96b6c8a6SHoratiu Vultur 	struct lan966x *lan966x = port->lan966x;
198*96b6c8a6SHoratiu Vultur 	u32 val;
199*96b6c8a6SHoratiu Vultur 
200*96b6c8a6SHoratiu Vultur 	out->prf(out->dst, "  port[%d] (%s): ", port->chip_port,
201*96b6c8a6SHoratiu Vultur 		 netdev_name(port->dev));
202*96b6c8a6SHoratiu Vultur 
203*96b6c8a6SHoratiu Vultur 	val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
204*96b6c8a6SHoratiu Vultur 	out->prf(out->dst, "\n    state: ");
205*96b6c8a6SHoratiu Vultur 	if (REW_PORT_CFG_ES0_EN_GET(val))
206*96b6c8a6SHoratiu Vultur 		out->prf(out->dst, "on");
207*96b6c8a6SHoratiu Vultur 	else
208*96b6c8a6SHoratiu Vultur 		out->prf(out->dst, "off");
209*96b6c8a6SHoratiu Vultur 
210*96b6c8a6SHoratiu Vultur 	out->prf(out->dst, "\n");
211*96b6c8a6SHoratiu Vultur }
212*96b6c8a6SHoratiu Vultur 
lan966x_vcap_port_info(struct net_device * dev,struct vcap_admin * admin,struct vcap_output_print * out)21394281484SHoratiu Vultur int lan966x_vcap_port_info(struct net_device *dev,
21494281484SHoratiu Vultur 			   struct vcap_admin *admin,
21594281484SHoratiu Vultur 			   struct vcap_output_print *out)
21694281484SHoratiu Vultur {
21794281484SHoratiu Vultur 	struct lan966x_port *port = netdev_priv(dev);
21894281484SHoratiu Vultur 	struct lan966x *lan966x = port->lan966x;
21994281484SHoratiu Vultur 	const struct vcap_info *vcap;
22094281484SHoratiu Vultur 	struct vcap_control *vctrl;
22194281484SHoratiu Vultur 
22294281484SHoratiu Vultur 	vctrl = lan966x->vcap_ctrl;
22394281484SHoratiu Vultur 	vcap = &vctrl->vcaps[admin->vtype];
22494281484SHoratiu Vultur 
22594281484SHoratiu Vultur 	out->prf(out->dst, "%s:\n", vcap->name);
226a4d9b3ecSHoratiu Vultur 	switch (admin->vtype) {
227a4d9b3ecSHoratiu Vultur 	case VCAP_TYPE_IS2:
228a4d9b3ecSHoratiu Vultur 		lan966x_vcap_is2_port_keys(port, admin, out);
229a4d9b3ecSHoratiu Vultur 		break;
230a4d9b3ecSHoratiu Vultur 	case VCAP_TYPE_IS1:
231a4d9b3ecSHoratiu Vultur 		lan966x_vcap_is1_port_keys(port, admin, out);
232a4d9b3ecSHoratiu Vultur 		break;
233*96b6c8a6SHoratiu Vultur 	case VCAP_TYPE_ES0:
234*96b6c8a6SHoratiu Vultur 		lan966x_vcap_es0_port_keys(port, admin, out);
235*96b6c8a6SHoratiu Vultur 		break;
236a4d9b3ecSHoratiu Vultur 	default:
237a4d9b3ecSHoratiu Vultur 		out->prf(out->dst, "  no info\n");
238a4d9b3ecSHoratiu Vultur 		break;
239a4d9b3ecSHoratiu Vultur 	}
24094281484SHoratiu Vultur 
24194281484SHoratiu Vultur 	return 0;
24294281484SHoratiu Vultur }
243