]> Git Repo - J-linux.git/blob - drivers/net/ethernet/microchip/lan966x/lan966x_vcap_debugfs.c
Merge tag 'vfs-6.13-rc7.fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[J-linux.git] / drivers / net / ethernet / microchip / lan966x / lan966x_vcap_debugfs.c
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
8 static 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
125 static 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
195 static 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
215 int 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 }
This page took 0.041559 seconds and 4 git commands to generate.