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