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