xref: /openbmc/linux/drivers/net/ethernet/microchip/sparx5/sparx5_vcap_impl.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1c9da1ac1SSteen Hegelund /* SPDX-License-Identifier: GPL-2.0+ */
2c9da1ac1SSteen Hegelund /* Microchip Sparx5 Switch driver VCAP implementation
3c9da1ac1SSteen Hegelund  *
4c9da1ac1SSteen Hegelund  * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
5c9da1ac1SSteen Hegelund  *
6c9da1ac1SSteen Hegelund  * The Sparx5 Chip Register Model can be browsed at this location:
7c9da1ac1SSteen Hegelund  * https://github.com/microchip-ung/sparx-5_reginfo
8c9da1ac1SSteen Hegelund  */
9c9da1ac1SSteen Hegelund 
10c9da1ac1SSteen Hegelund #ifndef __SPARX5_VCAP_IMPL_H__
11c9da1ac1SSteen Hegelund #define __SPARX5_VCAP_IMPL_H__
12c9da1ac1SSteen Hegelund 
130ca60948SSteen Hegelund #include <linux/types.h>
140ca60948SSteen Hegelund #include <linux/list.h>
150ca60948SSteen Hegelund 
160ca60948SSteen Hegelund #include "vcap_api.h"
170ca60948SSteen Hegelund #include "vcap_api_client.h"
180ca60948SSteen Hegelund 
19545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L0 VCAP_CID_INGRESS_L0 /* IS0/CLM lookup 0 */
20545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L1 VCAP_CID_INGRESS_L1 /* IS0/CLM lookup 1 */
21545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L2 VCAP_CID_INGRESS_L2 /* IS0/CLM lookup 2 */
22545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L3 VCAP_CID_INGRESS_L3 /* IS0/CLM lookup 3 */
23545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L4 VCAP_CID_INGRESS_L4 /* IS0/CLM lookup 4 */
24545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_L5 VCAP_CID_INGRESS_L5 /* IS0/CLM lookup 5 */
25545609fdSSteen Hegelund #define SPARX5_VCAP_CID_IS0_MAX \
26545609fdSSteen Hegelund 	(VCAP_CID_INGRESS_L5 + VCAP_CID_LOOKUP_SIZE - 1) /* IS0/CLM Max */
27545609fdSSteen Hegelund 
28c9da1ac1SSteen Hegelund #define SPARX5_VCAP_CID_IS2_L0 VCAP_CID_INGRESS_STAGE2_L0 /* IS2 lookup 0 */
29c9da1ac1SSteen Hegelund #define SPARX5_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */
30c9da1ac1SSteen Hegelund #define SPARX5_VCAP_CID_IS2_L2 VCAP_CID_INGRESS_STAGE2_L2 /* IS2 lookup 2 */
31c9da1ac1SSteen Hegelund #define SPARX5_VCAP_CID_IS2_L3 VCAP_CID_INGRESS_STAGE2_L3 /* IS2 lookup 3 */
32c9da1ac1SSteen Hegelund #define SPARX5_VCAP_CID_IS2_MAX \
33c9da1ac1SSteen Hegelund 	(VCAP_CID_INGRESS_STAGE2_L3 + VCAP_CID_LOOKUP_SIZE - 1) /* IS2 Max */
34c9da1ac1SSteen Hegelund 
353cbe7537SSteen Hegelund #define SPARX5_VCAP_CID_ES0_L0 VCAP_CID_EGRESS_L0 /* ES0 lookup 0 */
363cbe7537SSteen Hegelund #define SPARX5_VCAP_CID_ES0_MAX (VCAP_CID_EGRESS_L1 - 1) /* ES0 Max */
373cbe7537SSteen Hegelund 
38b95d9e2cSSteen Hegelund #define SPARX5_VCAP_CID_ES2_L0 VCAP_CID_EGRESS_STAGE2_L0 /* ES2 lookup 0 */
39b95d9e2cSSteen Hegelund #define SPARX5_VCAP_CID_ES2_L1 VCAP_CID_EGRESS_STAGE2_L1 /* ES2 lookup 1 */
40b95d9e2cSSteen Hegelund #define SPARX5_VCAP_CID_ES2_MAX \
41b95d9e2cSSteen Hegelund 	(VCAP_CID_EGRESS_STAGE2_L1 + VCAP_CID_LOOKUP_SIZE - 1) /* ES2 Max */
42b95d9e2cSSteen Hegelund 
43545609fdSSteen Hegelund /* IS0 port keyset selection control */
44545609fdSSteen Hegelund 
45545609fdSSteen Hegelund /* IS0 ethernet, IPv4, IPv6 traffic type keyset generation */
46545609fdSSteen Hegelund enum vcap_is0_port_sel_etype {
47545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_DEFAULT, /* None or follow depending on class */
48545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_MLL,
49545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_SGL_MLBS,
50545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_DBL_MLBS,
51545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_TRI_MLBS,
52545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_TRI_VID,
53545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_LL_FULL,
54545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_NORMAL_SRC,
55545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_NORMAL_DST,
56545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_NORMAL_7TUPLE,
57545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_NORMAL_5TUPLE_IP4,
58545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_PURE_5TUPLE_IP4,
59545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_DBL_VID_IDX,
60545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_ETAG,
61545609fdSSteen Hegelund 	VCAP_IS0_PS_ETYPE_NO_LOOKUP,
62545609fdSSteen Hegelund };
63545609fdSSteen Hegelund 
64545609fdSSteen Hegelund /* IS0 MPLS traffic type keyset generation */
65545609fdSSteen Hegelund enum vcap_is0_port_sel_mpls_uc_mc {
66545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_FOLLOW_ETYPE,
67545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_MLL,
68545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_SGL_MLBS,
69545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_DBL_MLBS,
70545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_TRI_MLBS,
71545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_TRI_VID,
72545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_LL_FULL,
73545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_NORMAL_SRC,
74545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_NORMAL_DST,
75545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_NORMAL_7TUPLE,
76545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_NORMAL_5TUPLE_IP4,
77545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_PURE_5TUPLE_IP4,
78545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_DBL_VID_IDX,
79545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_ETAG,
80545609fdSSteen Hegelund 	VCAP_IS0_PS_MPLS_NO_LOOKUP,
81545609fdSSteen Hegelund };
82545609fdSSteen Hegelund 
83545609fdSSteen Hegelund /* IS0 MBLS traffic type keyset generation */
84545609fdSSteen Hegelund enum vcap_is0_port_sel_mlbs {
85545609fdSSteen Hegelund 	VCAP_IS0_PS_MLBS_FOLLOW_ETYPE,
86545609fdSSteen Hegelund 	VCAP_IS0_PS_MLBS_SGL_MLBS,
87545609fdSSteen Hegelund 	VCAP_IS0_PS_MLBS_DBL_MLBS,
88545609fdSSteen Hegelund 	VCAP_IS0_PS_MLBS_TRI_MLBS,
89545609fdSSteen Hegelund 	VCAP_IS0_PS_MLBS_NO_LOOKUP = 17,
90545609fdSSteen Hegelund };
91545609fdSSteen Hegelund 
92e0305cc1SSteen Hegelund /* IS2 port keyset selection control */
93e0305cc1SSteen Hegelund 
94e0305cc1SSteen Hegelund /* IS2 non-ethernet traffic type keyset generation */
95e0305cc1SSteen Hegelund enum vcap_is2_port_sel_noneth {
96e0305cc1SSteen Hegelund 	VCAP_IS2_PS_NONETH_MAC_ETYPE,
97e0305cc1SSteen Hegelund 	VCAP_IS2_PS_NONETH_CUSTOM_1,
98e0305cc1SSteen Hegelund 	VCAP_IS2_PS_NONETH_CUSTOM_2,
99e0305cc1SSteen Hegelund 	VCAP_IS2_PS_NONETH_NO_LOOKUP
100e0305cc1SSteen Hegelund };
101e0305cc1SSteen Hegelund 
102e0305cc1SSteen Hegelund /* IS2 IPv4 unicast traffic type keyset generation */
103e0305cc1SSteen Hegelund enum vcap_is2_port_sel_ipv4_uc {
104e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_UC_MAC_ETYPE,
105e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_UC_IP4_TCP_UDP_OTHER,
106e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_UC_IP_7TUPLE,
107e0305cc1SSteen Hegelund };
108e0305cc1SSteen Hegelund 
109e0305cc1SSteen Hegelund /* IS2 IPv4 multicast traffic type keyset generation */
110e0305cc1SSteen Hegelund enum vcap_is2_port_sel_ipv4_mc {
111e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_MC_MAC_ETYPE,
112e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_MC_IP4_TCP_UDP_OTHER,
113e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_MC_IP_7TUPLE,
114e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV4_MC_IP4_VID,
115e0305cc1SSteen Hegelund };
116e0305cc1SSteen Hegelund 
117e0305cc1SSteen Hegelund /* IS2 IPv6 unicast traffic type keyset generation */
118e0305cc1SSteen Hegelund enum vcap_is2_port_sel_ipv6_uc {
119e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_UC_MAC_ETYPE,
120e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_UC_IP_7TUPLE,
121e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_UC_IP6_STD,
122e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_UC_IP4_TCP_UDP_OTHER,
123e0305cc1SSteen Hegelund };
124e0305cc1SSteen Hegelund 
125e0305cc1SSteen Hegelund /* IS2 IPv6 multicast traffic type keyset generation */
126e0305cc1SSteen Hegelund enum vcap_is2_port_sel_ipv6_mc {
127e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_MC_MAC_ETYPE,
128e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_MC_IP_7TUPLE,
129e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_MC_IP6_VID,
130e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_MC_IP6_STD,
131e0305cc1SSteen Hegelund 	VCAP_IS2_PS_IPV6_MC_IP4_TCP_UDP_OTHER,
132e0305cc1SSteen Hegelund };
133e0305cc1SSteen Hegelund 
134e0305cc1SSteen Hegelund /* IS2 ARP traffic type keyset generation */
135e0305cc1SSteen Hegelund enum vcap_is2_port_sel_arp {
136e0305cc1SSteen Hegelund 	VCAP_IS2_PS_ARP_MAC_ETYPE,
137e0305cc1SSteen Hegelund 	VCAP_IS2_PS_ARP_ARP,
138e0305cc1SSteen Hegelund };
139e0305cc1SSteen Hegelund 
1403cbe7537SSteen Hegelund /* ES0 port keyset selection control */
1413cbe7537SSteen Hegelund 
1423cbe7537SSteen Hegelund /* ES0 Egress port traffic type classification */
1433cbe7537SSteen Hegelund enum vcap_es0_port_sel {
1443cbe7537SSteen Hegelund 	VCAP_ES0_PS_NORMAL_SELECTION,
1453cbe7537SSteen Hegelund 	VCAP_ES0_PS_FORCE_ISDX_LOOKUPS,
1463cbe7537SSteen Hegelund 	VCAP_ES0_PS_FORCE_VID_LOOKUPS,
1473cbe7537SSteen Hegelund 	VCAP_ES0_PS_RESERVED,
1483cbe7537SSteen Hegelund };
1493cbe7537SSteen Hegelund 
150b95d9e2cSSteen Hegelund /* ES2 port keyset selection control */
151b95d9e2cSSteen Hegelund 
152b95d9e2cSSteen Hegelund /* ES2 IPv4 traffic type keyset generation */
153b95d9e2cSSteen Hegelund enum vcap_es2_port_sel_ipv4 {
154b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_MAC_ETYPE,
155b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_IP_7TUPLE,
156b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_IP4_TCP_UDP_VID,
157b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_IP4_TCP_UDP_OTHER,
158b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_IP4_VID,
159b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV4_IP4_OTHER,
160b95d9e2cSSteen Hegelund };
161b95d9e2cSSteen Hegelund 
162b95d9e2cSSteen Hegelund /* ES2 IPv6 traffic type keyset generation */
163b95d9e2cSSteen Hegelund enum vcap_es2_port_sel_ipv6 {
164b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_MAC_ETYPE,
165b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP_7TUPLE,
166b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP_7TUPLE_VID,
167b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP_7TUPLE_STD,
168b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP6_VID,
169b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP6_STD,
170b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_IPV6_IP4_DOWNGRADE,
171b95d9e2cSSteen Hegelund };
172b95d9e2cSSteen Hegelund 
173b95d9e2cSSteen Hegelund /* ES2 ARP traffic type keyset generation */
174b95d9e2cSSteen Hegelund enum vcap_es2_port_sel_arp {
175b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_ARP_MAC_ETYPE,
176b95d9e2cSSteen Hegelund 	VCAP_ES2_PS_ARP_ARP,
177b95d9e2cSSteen Hegelund };
178b95d9e2cSSteen Hegelund 
179ebf44dedSSteen Hegelund /* Selects TPID for ES0 matching */
180ebf44dedSSteen Hegelund enum SPX5_TPID_SEL {
181ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_UNTAGGED,
182ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_8100,
183ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_UNUSED_0,
184ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_UNUSED_1,
185ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_88A8,
186ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_TPIDCFG_1,
187ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_TPIDCFG_2,
188ebf44dedSSteen Hegelund 	SPX5_TPID_SEL_TPIDCFG_3,
189ebf44dedSSteen Hegelund };
190ebf44dedSSteen Hegelund 
1910ca60948SSteen Hegelund /* Get the port keyset for the vcap lookup */
1920ca60948SSteen Hegelund int sparx5_vcap_get_port_keyset(struct net_device *ndev,
1930ca60948SSteen Hegelund 				struct vcap_admin *admin,
1940ca60948SSteen Hegelund 				int cid,
1950ca60948SSteen Hegelund 				u16 l3_proto,
1960ca60948SSteen Hegelund 				struct vcap_keyset_list *kslist);
1970ca60948SSteen Hegelund 
198*d9f175b0SSteen Hegelund /* Change the port keyset for the lookup and protocol */
199*d9f175b0SSteen Hegelund void sparx5_vcap_set_port_keyset(struct net_device *ndev,
200*d9f175b0SSteen Hegelund 				 struct vcap_admin *admin, int cid,
201*d9f175b0SSteen Hegelund 				 u16 l3_proto, enum vcap_keyfield_set keyset,
202*d9f175b0SSteen Hegelund 				 struct vcap_keyset_list *orig);
203*d9f175b0SSteen Hegelund 
20463e35645SSteen Hegelund /* Check if the ethertype is supported by the vcap port classification */
20563e35645SSteen Hegelund bool sparx5_vcap_is_known_etype(struct vcap_admin *admin, u16 etype);
20663e35645SSteen Hegelund 
207c9da1ac1SSteen Hegelund #endif /* __SPARX5_VCAP_IMPL_H__ */
208