Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1// SPDX-License-Identifier: GPL-2.0+
  2/* Microchip Sparx5 Switch driver VCAP debugFS implementation
  3 *
  4 * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
  5 */
  6
  7#include <linux/types.h>
  8#include <linux/list.h>
  9
 10#include "sparx5_vcap_debugfs.h"
 11#include "sparx5_main_regs.h"
 12#include "sparx5_main.h"
 13#include "sparx5_vcap_impl.h"
 14#include "sparx5_vcap_ag_api.h"
 15
 16static void sparx5_vcap_port_keys(struct sparx5 *sparx5,
 17				  struct vcap_admin *admin,
 18				  struct sparx5_port *port,
 19				  struct vcap_output_print *out)
 20{
 21	int lookup;
 22	u32 value;
 23
 24	out->prf(out->dst, "  port[%02d] (%s): ", port->portno,
 25	   netdev_name(port->ndev));
 26	for (lookup = 0; lookup < admin->lookups; ++lookup) {
 27		out->prf(out->dst, "\n    Lookup %d: ", lookup);
 28
 29		/* Get lookup state */
 30		value = spx5_rd(sparx5, ANA_ACL_VCAP_S2_CFG(port->portno));
 31		out->prf(out->dst, "\n      state: ");
 32		if (ANA_ACL_VCAP_S2_CFG_SEC_ENA_GET(value))
 33			out->prf(out->dst, "on");
 34		else
 35			out->prf(out->dst, "off");
 36
 37		/* Get key selection state */
 38		value = spx5_rd(sparx5,
 39				ANA_ACL_VCAP_S2_KEY_SEL(port->portno, lookup));
 40
 41		out->prf(out->dst, "\n      noneth: ");
 42		switch (ANA_ACL_VCAP_S2_KEY_SEL_NON_ETH_KEY_SEL_GET(value)) {
 43		case VCAP_IS2_PS_NONETH_MAC_ETYPE:
 44			out->prf(out->dst, "mac_etype");
 45			break;
 46		case VCAP_IS2_PS_NONETH_CUSTOM_1:
 47			out->prf(out->dst, "custom1");
 48			break;
 49		case VCAP_IS2_PS_NONETH_CUSTOM_2:
 50			out->prf(out->dst, "custom2");
 51			break;
 52		case VCAP_IS2_PS_NONETH_NO_LOOKUP:
 53			out->prf(out->dst, "none");
 54			break;
 55		}
 56		out->prf(out->dst, "\n      ipv4_mc: ");
 57		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP4_MC_KEY_SEL_GET(value)) {
 58		case VCAP_IS2_PS_IPV4_MC_MAC_ETYPE:
 59			out->prf(out->dst, "mac_etype");
 60			break;
 61		case VCAP_IS2_PS_IPV4_MC_IP4_TCP_UDP_OTHER:
 62			out->prf(out->dst, "ip4_tcp_udp ip4_other");
 63			break;
 64		case VCAP_IS2_PS_IPV4_MC_IP_7TUPLE:
 65			out->prf(out->dst, "ip_7tuple");
 66			break;
 67		case VCAP_IS2_PS_IPV4_MC_IP4_VID:
 68			out->prf(out->dst, "ip4_vid");
 69			break;
 70		}
 71		out->prf(out->dst, "\n      ipv4_uc: ");
 72		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP4_UC_KEY_SEL_GET(value)) {
 73		case VCAP_IS2_PS_IPV4_UC_MAC_ETYPE:
 74			out->prf(out->dst, "mac_etype");
 75			break;
 76		case VCAP_IS2_PS_IPV4_UC_IP4_TCP_UDP_OTHER:
 77			out->prf(out->dst, "ip4_tcp_udp ip4_other");
 78			break;
 79		case VCAP_IS2_PS_IPV4_UC_IP_7TUPLE:
 80			out->prf(out->dst, "ip_7tuple");
 81			break;
 82		}
 83		out->prf(out->dst, "\n      ipv6_mc: ");
 84		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP6_MC_KEY_SEL_GET(value)) {
 85		case VCAP_IS2_PS_IPV6_MC_MAC_ETYPE:
 86			out->prf(out->dst, "mac_etype");
 87			break;
 88		case VCAP_IS2_PS_IPV6_MC_IP_7TUPLE:
 89			out->prf(out->dst, "ip_7tuple");
 90			break;
 91		case VCAP_IS2_PS_IPV6_MC_IP6_VID:
 92			out->prf(out->dst, "ip6_vid");
 93			break;
 94		case VCAP_IS2_PS_IPV6_MC_IP6_STD:
 95			out->prf(out->dst, "ip6_std");
 96			break;
 97		case VCAP_IS2_PS_IPV6_MC_IP4_TCP_UDP_OTHER:
 98			out->prf(out->dst, "ip4_tcp_udp ipv4_other");
 99			break;
100		}
101		out->prf(out->dst, "\n      ipv6_uc: ");
102		switch (ANA_ACL_VCAP_S2_KEY_SEL_IP6_UC_KEY_SEL_GET(value)) {
103		case VCAP_IS2_PS_IPV6_UC_MAC_ETYPE:
104			out->prf(out->dst, "mac_etype");
105			break;
106		case VCAP_IS2_PS_IPV6_UC_IP_7TUPLE:
107			out->prf(out->dst, "ip_7tuple");
108			break;
109		case VCAP_IS2_PS_IPV6_UC_IP6_STD:
110			out->prf(out->dst, "ip6_std");
111			break;
112		case VCAP_IS2_PS_IPV6_UC_IP4_TCP_UDP_OTHER:
113			out->prf(out->dst, "ip4_tcp_udp ip4_other");
114			break;
115		}
116		out->prf(out->dst, "\n      arp: ");
117		switch (ANA_ACL_VCAP_S2_KEY_SEL_ARP_KEY_SEL_GET(value)) {
118		case VCAP_IS2_PS_ARP_MAC_ETYPE:
119			out->prf(out->dst, "mac_etype");
120			break;
121		case VCAP_IS2_PS_ARP_ARP:
122			out->prf(out->dst, "arp");
123			break;
124		}
125	}
126	out->prf(out->dst, "\n");
127}
128
129static void sparx5_vcap_port_stickies(struct sparx5 *sparx5,
130				      struct vcap_admin *admin,
131				      struct vcap_output_print *out)
132{
133	int lookup;
134	u32 value;
135
136	out->prf(out->dst, "  Sticky bits: ");
137	for (lookup = 0; lookup < admin->lookups; ++lookup) {
138		out->prf(out->dst, "\n    Lookup %d: ", lookup);
139		/* Get lookup sticky bits */
140		value = spx5_rd(sparx5, ANA_ACL_SEC_LOOKUP_STICKY(lookup));
141
142		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_CLM_STICKY_GET(value))
143			out->prf(out->dst, " sel_clm");
144		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_IRLEG_STICKY_GET(value))
145			out->prf(out->dst, " sel_irleg");
146		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_ERLEG_STICKY_GET(value))
147			out->prf(out->dst, " sel_erleg");
148		if (ANA_ACL_SEC_LOOKUP_STICKY_KEY_SEL_PORT_STICKY_GET(value))
149			out->prf(out->dst, " sel_port");
150		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_CUSTOM2_STICKY_GET(value))
151			out->prf(out->dst, " custom2");
152		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_CUSTOM1_STICKY_GET(value))
153			out->prf(out->dst, " custom1");
154		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_OAM_STICKY_GET(value))
155			out->prf(out->dst, " oam");
156		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_VID_STICKY_GET(value))
157			out->prf(out->dst, " ip6_vid");
158		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_STD_STICKY_GET(value))
159			out->prf(out->dst, " ip6_std");
160		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP6_TCPUDP_STICKY_GET(value))
161			out->prf(out->dst, " ip6_tcpudp");
162		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP_7TUPLE_STICKY_GET(value))
163			out->prf(out->dst, " ip_7tuple");
164		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_VID_STICKY_GET(value))
165			out->prf(out->dst, " ip4_vid");
166		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_TCPUDP_STICKY_GET(value))
167			out->prf(out->dst, " ip4_tcpudp");
168		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_IP4_OTHER_STICKY_GET(value))
169			out->prf(out->dst, " ip4_other");
170		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_ARP_STICKY_GET(value))
171			out->prf(out->dst, " arp");
172		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_SNAP_STICKY_GET(value))
173			out->prf(out->dst, " mac_snap");
174		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_LLC_STICKY_GET(value))
175			out->prf(out->dst, " mac_llc");
176		if (ANA_ACL_SEC_LOOKUP_STICKY_SEC_TYPE_MAC_ETYPE_STICKY_GET(value))
177			out->prf(out->dst, " mac_etype");
178		/* Clear stickies */
179		spx5_wr(value, sparx5, ANA_ACL_SEC_LOOKUP_STICKY(lookup));
180	}
181	out->prf(out->dst, "\n");
182}
183
184/* Provide port information via a callback interface */
185int sparx5_port_info(struct net_device *ndev,
186		     struct vcap_admin *admin,
187		     struct vcap_output_print *out)
188{
189	struct sparx5_port *port = netdev_priv(ndev);
190	struct sparx5 *sparx5 = port->sparx5;
191	const struct vcap_info *vcap;
192	struct vcap_control *vctrl;
193
194	vctrl = sparx5->vcap_ctrl;
195	vcap = &vctrl->vcaps[admin->vtype];
196	out->prf(out->dst, "%s:\n", vcap->name);
197	sparx5_vcap_port_keys(sparx5, admin, port, out);
198	sparx5_vcap_port_stickies(sparx5, admin, out);
199	return 0;
200}