1 // SPDX-License-Identifier: GPL-2.0+
3 #include "lan966x_main.h"
4 #include "lan966x_vcap_ag_api.h"
6 #include "vcap_api_client.h"
8 static void lan966x_vcap_is1_port_keys(struct lan966x_port *port,
9 struct vcap_admin *admin,
10 struct vcap_output_print *out)
12 struct lan966x *lan966x = port->lan966x;
15 out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
16 netdev_name(port->dev));
18 val = lan_rd(lan966x, ANA_VCAP_CFG(port->chip_port));
19 out->prf(out->dst, "\n state: ");
20 if (ANA_VCAP_CFG_S1_ENA_GET(val))
21 out->prf(out->dst, "on");
23 out->prf(out->dst, "off");
25 for (int l = 0; l < admin->lookups; ++l) {
26 out->prf(out->dst, "\n Lookup %d: ", l);
28 val = lan_rd(lan966x, ANA_VCAP_S1_CFG(port->chip_port, l));
30 out->prf(out->dst, "\n other: ");
31 switch (ANA_VCAP_S1_CFG_KEY_OTHER_CFG_GET(val)) {
32 case VCAP_IS1_PS_OTHER_NORMAL:
33 out->prf(out->dst, "normal");
35 case VCAP_IS1_PS_OTHER_7TUPLE:
36 out->prf(out->dst, "7tuple");
38 case VCAP_IS1_PS_OTHER_DBL_VID:
39 out->prf(out->dst, "dbl_vid");
41 case VCAP_IS1_PS_OTHER_DMAC_VID:
42 out->prf(out->dst, "dmac_vid");
45 out->prf(out->dst, "-");
49 out->prf(out->dst, "\n ipv4: ");
50 switch (ANA_VCAP_S1_CFG_KEY_IP4_CFG_GET(val)) {
51 case VCAP_IS1_PS_IPV4_NORMAL:
52 out->prf(out->dst, "normal");
54 case VCAP_IS1_PS_IPV4_7TUPLE:
55 out->prf(out->dst, "7tuple");
57 case VCAP_IS1_PS_IPV4_5TUPLE_IP4:
58 out->prf(out->dst, "5tuple_ipv4");
60 case VCAP_IS1_PS_IPV4_DBL_VID:
61 out->prf(out->dst, "dbl_vid");
63 case VCAP_IS1_PS_IPV4_DMAC_VID:
64 out->prf(out->dst, "dmac_vid");
67 out->prf(out->dst, "-");
71 out->prf(out->dst, "\n ipv6: ");
72 switch (ANA_VCAP_S1_CFG_KEY_IP6_CFG_GET(val)) {
73 case VCAP_IS1_PS_IPV6_NORMAL:
74 out->prf(out->dst, "normal");
76 case VCAP_IS1_PS_IPV6_7TUPLE:
77 out->prf(out->dst, "7tuple");
79 case VCAP_IS1_PS_IPV6_5TUPLE_IP4:
80 out->prf(out->dst, "5tuple_ip4");
82 case VCAP_IS1_PS_IPV6_NORMAL_IP6:
83 out->prf(out->dst, "normal_ip6");
85 case VCAP_IS1_PS_IPV6_5TUPLE_IP6:
86 out->prf(out->dst, "5tuple_ip6");
88 case VCAP_IS1_PS_IPV6_DBL_VID:
89 out->prf(out->dst, "dbl_vid");
91 case VCAP_IS1_PS_IPV6_DMAC_VID:
92 out->prf(out->dst, "dmac_vid");
95 out->prf(out->dst, "-");
99 out->prf(out->dst, "\n rt: ");
100 switch (ANA_VCAP_S1_CFG_KEY_RT_CFG_GET(val)) {
101 case VCAP_IS1_PS_RT_NORMAL:
102 out->prf(out->dst, "normal");
104 case VCAP_IS1_PS_RT_7TUPLE:
105 out->prf(out->dst, "7tuple");
107 case VCAP_IS1_PS_RT_DBL_VID:
108 out->prf(out->dst, "dbl_vid");
110 case VCAP_IS1_PS_RT_DMAC_VID:
111 out->prf(out->dst, "dmac_vid");
113 case VCAP_IS1_PS_RT_FOLLOW_OTHER:
114 out->prf(out->dst, "follow_other");
117 out->prf(out->dst, "-");
122 out->prf(out->dst, "\n");
125 static void lan966x_vcap_is2_port_keys(struct lan966x_port *port,
126 struct vcap_admin *admin,
127 struct vcap_output_print *out)
129 struct lan966x *lan966x = port->lan966x;
132 out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
133 netdev_name(port->dev));
135 val = lan_rd(lan966x, ANA_VCAP_S2_CFG(port->chip_port));
136 out->prf(out->dst, "\n state: ");
137 if (ANA_VCAP_S2_CFG_ENA_GET(val))
138 out->prf(out->dst, "on");
140 out->prf(out->dst, "off");
142 for (int l = 0; l < admin->lookups; ++l) {
143 out->prf(out->dst, "\n Lookup %d: ", l);
145 out->prf(out->dst, "\n snap: ");
146 if (ANA_VCAP_S2_CFG_SNAP_DIS_GET(val) & (BIT(0) << l))
147 out->prf(out->dst, "mac_llc");
149 out->prf(out->dst, "mac_snap");
151 out->prf(out->dst, "\n oam: ");
152 if (ANA_VCAP_S2_CFG_OAM_DIS_GET(val) & (BIT(0) << l))
153 out->prf(out->dst, "mac_etype");
155 out->prf(out->dst, "mac_oam");
157 out->prf(out->dst, "\n arp: ");
158 if (ANA_VCAP_S2_CFG_ARP_DIS_GET(val) & (BIT(0) << l))
159 out->prf(out->dst, "mac_etype");
161 out->prf(out->dst, "mac_arp");
163 out->prf(out->dst, "\n ipv4_other: ");
164 if (ANA_VCAP_S2_CFG_IP_OTHER_DIS_GET(val) & (BIT(0) << l))
165 out->prf(out->dst, "mac_etype");
167 out->prf(out->dst, "ip4_other");
169 out->prf(out->dst, "\n ipv4_tcp_udp: ");
170 if (ANA_VCAP_S2_CFG_IP_TCPUDP_DIS_GET(val) & (BIT(0) << l))
171 out->prf(out->dst, "mac_etype");
173 out->prf(out->dst, "ipv4_tcp_udp");
175 out->prf(out->dst, "\n ipv6: ");
176 switch (ANA_VCAP_S2_CFG_IP6_CFG_GET(val) & (0x3 << l)) {
177 case VCAP_IS2_PS_IPV6_TCPUDP_OTHER:
178 out->prf(out->dst, "ipv6_tcp_udp ipv6_tcp_udp");
180 case VCAP_IS2_PS_IPV6_STD:
181 out->prf(out->dst, "ipv6_std");
183 case VCAP_IS2_PS_IPV6_IP4_TCPUDP_IP4_OTHER:
184 out->prf(out->dst, "ipv4_tcp_udp ipv4_tcp_udp");
186 case VCAP_IS2_PS_IPV6_MAC_ETYPE:
187 out->prf(out->dst, "mac_etype");
192 out->prf(out->dst, "\n");
195 static void lan966x_vcap_es0_port_keys(struct lan966x_port *port,
196 struct vcap_admin *admin,
197 struct vcap_output_print *out)
199 struct lan966x *lan966x = port->lan966x;
202 out->prf(out->dst, " port[%d] (%s): ", port->chip_port,
203 netdev_name(port->dev));
205 val = lan_rd(lan966x, REW_PORT_CFG(port->chip_port));
206 out->prf(out->dst, "\n state: ");
207 if (REW_PORT_CFG_ES0_EN_GET(val))
208 out->prf(out->dst, "on");
210 out->prf(out->dst, "off");
212 out->prf(out->dst, "\n");
215 int lan966x_vcap_port_info(struct net_device *dev,
216 struct vcap_admin *admin,
217 struct vcap_output_print *out)
219 struct lan966x_port *port = netdev_priv(dev);
220 struct lan966x *lan966x = port->lan966x;
221 const struct vcap_info *vcap;
222 struct vcap_control *vctrl;
224 vctrl = lan966x->vcap_ctrl;
225 vcap = &vctrl->vcaps[admin->vtype];
227 out->prf(out->dst, "%s:\n", vcap->name);
228 switch (admin->vtype) {
230 lan966x_vcap_is2_port_keys(port, admin, out);
233 lan966x_vcap_is1_port_keys(port, admin, out);
236 lan966x_vcap_es0_port_keys(port, admin, out);
239 out->prf(out->dst, " no info\n");