brintos

brintos / linux-shallow public Read only

0
0
Text · 6.1 KiB · 3a01e13 Raw
245 lines · 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 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	else23		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	else140		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		else149			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		else155			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		else161			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		else167			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		else173			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	else210		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}245