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)8*a4d9b3ecSHoratiu Vultur static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
9*a4d9b3ecSHoratiu Vultur struct vcap_admin *admin,
10*a4d9b3ecSHoratiu Vultur struct vcap_output_print *out)
11*a4d9b3ecSHoratiu Vultur {
12*a4d9b3ecSHoratiu Vultur struct lan966x *lan966x = port->lan966x;
13*a4d9b3ecSHoratiu Vultur u32 val;
14*a4d9b3ecSHoratiu Vultur
15*a4d9b3ecSHoratiu Vultur out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
16*a4d9b3ecSHoratiu Vultur netdev_name(port->dev));
17*a4d9b3ecSHoratiu Vultur
18*a4d9b3ecSHoratiu Vultur val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
19*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n state: ");
20*a4d9b3ecSHoratiu Vultur if (ANA_VCAP_CFG_S1_ENA_GET(val))
21*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "on");
22*a4d9b3ecSHoratiu Vultur else
23*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "off");
24*a4d9b3ecSHoratiu Vultur
25*a4d9b3ecSHoratiu Vultur for (int l = 0; l < admin->lookups; ++l) {
26*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n Lookup %d: ", l);
27*a4d9b3ecSHoratiu Vultur
28*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n other: ");
29*a4d9b3ecSHoratiu Vultur switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
30*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_OTHER_NORMAL:
31*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "normal");
32*a4d9b3ecSHoratiu Vultur break;
33*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_OTHER_7TUPLE:
34*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "7tuple");
35*a4d9b3ecSHoratiu Vultur break;
36*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_OTHER_DBL_VID:
37*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dbl_vid");
38*a4d9b3ecSHoratiu Vultur break;
39*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_OTHER_DMAC_VID:
40*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dmac_vid");
41*a4d9b3ecSHoratiu Vultur break;
42*a4d9b3ecSHoratiu Vultur default:
43*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "-");
44*a4d9b3ecSHoratiu Vultur break;
45*a4d9b3ecSHoratiu Vultur }
46*a4d9b3ecSHoratiu Vultur
47*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n ipv4: ");
48*a4d9b3ecSHoratiu Vultur switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
49*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV4_NORMAL:
50*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "normal");
51*a4d9b3ecSHoratiu Vultur break;
52*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV4_7TUPLE:
53*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "7tuple");
54*a4d9b3ecSHoratiu Vultur break;
55*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
56*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "5tuple_ipv4");
57*a4d9b3ecSHoratiu Vultur break;
58*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV4_DBL_VID:
59*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dbl_vid");
60*a4d9b3ecSHoratiu Vultur break;
61*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV4_DMAC_VID:
62*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dmac_vid");
63*a4d9b3ecSHoratiu Vultur break;
64*a4d9b3ecSHoratiu Vultur default:
65*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "-");
66*a4d9b3ecSHoratiu Vultur break;
67*a4d9b3ecSHoratiu Vultur }
68*a4d9b3ecSHoratiu Vultur
69*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n ipv6: ");
70*a4d9b3ecSHoratiu Vultur switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
71*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_NORMAL:
72*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "normal");
73*a4d9b3ecSHoratiu Vultur break;
74*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_7TUPLE:
75*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "7tuple");
76*a4d9b3ecSHoratiu Vultur break;
77*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
78*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "5tuple_ip4");
79*a4d9b3ecSHoratiu Vultur break;
80*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_NORMAL_IP6:
81*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "normal_ip6");
82*a4d9b3ecSHoratiu Vultur break;
83*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
84*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "5tuple_ip6");
85*a4d9b3ecSHoratiu Vultur break;
86*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_DBL_VID:
87*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dbl_vid");
88*a4d9b3ecSHoratiu Vultur break;
89*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_IPV6_DMAC_VID:
90*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dmac_vid");
91*a4d9b3ecSHoratiu Vultur break;
92*a4d9b3ecSHoratiu Vultur default:
93*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "-");
94*a4d9b3ecSHoratiu Vultur break;
95*a4d9b3ecSHoratiu Vultur }
96*a4d9b3ecSHoratiu Vultur
97*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n rt: ");
98*a4d9b3ecSHoratiu Vultur switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
99*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_RT_NORMAL:
100*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "normal");
101*a4d9b3ecSHoratiu Vultur break;
102*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_RT_7TUPLE:
103*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "7tuple");
104*a4d9b3ecSHoratiu Vultur break;
105*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_RT_DBL_VID:
106*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dbl_vid");
107*a4d9b3ecSHoratiu Vultur break;
108*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_RT_DMAC_VID:
109*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "dmac_vid");
110*a4d9b3ecSHoratiu Vultur break;
111*a4d9b3ecSHoratiu Vultur case VCAP_IS1_PS_RT_FOLLOW_OTHER:
112*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "follow_other");
113*a4d9b3ecSHoratiu Vultur break;
114*a4d9b3ecSHoratiu Vultur default:
115*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "-");
116*a4d9b3ecSHoratiu Vultur break;
117*a4d9b3ecSHoratiu Vultur }
118*a4d9b3ecSHoratiu Vultur }
119*a4d9b3ecSHoratiu Vultur
120*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n");
121*a4d9b3ecSHoratiu Vultur }
122*a4d9b3ecSHoratiu Vultur
lan966x_vcap_is2_port_keys(struct lan966x_port * port,struct vcap_admin * admin,struct vcap_output_print * out)123*a4d9b3ecSHoratiu 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)19394281484SHoratiu Vultur static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
19494281484SHoratiu Vultur struct vcap_admin *admin,
19594281484SHoratiu Vultur struct vcap_output_print *out)
19694281484SHoratiu Vultur {
19794281484SHoratiu Vultur struct lan966x *lan966x = port->lan966x;
19894281484SHoratiu Vultur u32 val;
19994281484SHoratiu Vultur
20094281484SHoratiu Vultur out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
20194281484SHoratiu Vultur netdev_name(port->dev));
20294281484SHoratiu Vultur
20394281484SHoratiu Vultur val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
20494281484SHoratiu Vultur out->prf(out->dst, "\n state: ");
20594281484SHoratiu Vultur if (REW_PORT_CFG_ES0_EN_GET(val))
206*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "on");
207*a4d9b3ecSHoratiu Vultur else
208*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "off");
209*a4d9b3ecSHoratiu Vultur
210*a4d9b3ecSHoratiu Vultur out->prf(out->dst, "\n");
211*a4d9b3ecSHoratiu Vultur }
212*a4d9b3ecSHoratiu Vultur
lan966x_vcap_port_info(struct net_device * dev,struct vcap_admin * admin,struct vcap_output_print * out)213*a4d9b3ecSHoratiu Vultur int lan966x_vcap_port_info(struct net_device *dev,
214*a4d9b3ecSHoratiu Vultur struct vcap_admin *admin,
215*a4d9b3ecSHoratiu Vultur struct vcap_output_print *out)
216*a4d9b3ecSHoratiu Vultur {
21794281484SHoratiu Vultur struct lan966x_port *port = netdev_priv(dev);
21894281484SHoratiu Vultur struct lan966x *lan966x = port->lan966x;
21994281484SHoratiu Vultur const struct vcap_info *vcap;
220 struct vcap_control *vctrl;
221
222 vctrl = lan966x->vcap_ctrl;
223 vcap = &vctrl->vcaps[admin->vtype];
224
225 out->prf(out->dst, "%s:\n", vcap->name);
226 switch (admin->vtype) {
227 case VCAP_TYPE_IS2:
228 lan966x_vcap_is2_port_keys(port, admin, out);
229 break;
230 case VCAP_TYPE_IS1:
231 lan966x_vcap_is1_port_keys(port, admin, out);
232 break;
233 case VCAP_TYPE_ES0:
234 lan966x_vcap_es0_port_keys(port, admin, out);
235 break;
236 default:
237 out->prf(out->dst, " no info\n");
238 break;
239 }
240
241 return 0;
242 }
243