1/* SPDX-License-Identifier: GPL-2.0+ */ 2/* Microchip Sparx5 Switch driver VCAP implementation 3 * 4 * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries. 5 * 6 * The Sparx5 Chip Register Model can be browsed at this location: 7 * https://github.com/microchip-ung/sparx-5_reginfo 8 */ 9 10#ifndef __SPARX5_VCAP_IMPL_H__ 11#define __SPARX5_VCAP_IMPL_H__ 12 13#include <linux/types.h> 14#include <linux/list.h> 15 16#include "vcap_api.h" 17#include "vcap_api_client.h" 18 19#define SPARX5_VCAP_CID_IS0_L0 VCAP_CID_INGRESS_L0 /* IS0/CLM lookup 0 */ 20#define SPARX5_VCAP_CID_IS0_L1 VCAP_CID_INGRESS_L1 /* IS0/CLM lookup 1 */ 21#define SPARX5_VCAP_CID_IS0_L2 VCAP_CID_INGRESS_L2 /* IS0/CLM lookup 2 */ 22#define SPARX5_VCAP_CID_IS0_L3 VCAP_CID_INGRESS_L3 /* IS0/CLM lookup 3 */ 23#define SPARX5_VCAP_CID_IS0_L4 VCAP_CID_INGRESS_L4 /* IS0/CLM lookup 4 */ 24#define SPARX5_VCAP_CID_IS0_L5 VCAP_CID_INGRESS_L5 /* IS0/CLM lookup 5 */ 25#define SPARX5_VCAP_CID_IS0_MAX \ 26 (VCAP_CID_INGRESS_L5 + VCAP_CID_LOOKUP_SIZE - 1) /* IS0/CLM Max */ 27 28#define SPARX5_VCAP_CID_IS2_L0 VCAP_CID_INGRESS_STAGE2_L0 /* IS2 lookup 0 */ 29#define SPARX5_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */ 30#define SPARX5_VCAP_CID_IS2_L2 VCAP_CID_INGRESS_STAGE2_L2 /* IS2 lookup 2 */ 31#define SPARX5_VCAP_CID_IS2_L3 VCAP_CID_INGRESS_STAGE2_L3 /* IS2 lookup 3 */ 32#define SPARX5_VCAP_CID_IS2_MAX \ 33 (VCAP_CID_INGRESS_STAGE2_L3 + VCAP_CID_LOOKUP_SIZE - 1) /* IS2 Max */ 34 35#define SPARX5_VCAP_CID_ES0_L0 VCAP_CID_EGRESS_L0 /* ES0 lookup 0 */ 36#define SPARX5_VCAP_CID_ES0_MAX (VCAP_CID_EGRESS_L1 - 1) /* ES0 Max */ 37 38#define SPARX5_VCAP_CID_ES2_L0 VCAP_CID_EGRESS_STAGE2_L0 /* ES2 lookup 0 */ 39#define SPARX5_VCAP_CID_ES2_L1 VCAP_CID_EGRESS_STAGE2_L1 /* ES2 lookup 1 */ 40#define SPARX5_VCAP_CID_ES2_MAX \ 41 (VCAP_CID_EGRESS_STAGE2_L1 + VCAP_CID_LOOKUP_SIZE - 1) /* ES2 Max */ 42 43/* IS0 port keyset selection control */ 44 45/* IS0 ethernet, IPv4, IPv6 traffic type keyset generation */ 46enum vcap_is0_port_sel_etype { 47 VCAP_IS0_PS_ETYPE_DEFAULT, /* None or follow depending on class */ 48 VCAP_IS0_PS_ETYPE_MLL, 49 VCAP_IS0_PS_ETYPE_SGL_MLBS, 50 VCAP_IS0_PS_ETYPE_DBL_MLBS, 51 VCAP_IS0_PS_ETYPE_TRI_MLBS, 52 VCAP_IS0_PS_ETYPE_TRI_VID, 53 VCAP_IS0_PS_ETYPE_LL_FULL, 54 VCAP_IS0_PS_ETYPE_NORMAL_SRC, 55 VCAP_IS0_PS_ETYPE_NORMAL_DST, 56 VCAP_IS0_PS_ETYPE_NORMAL_7TUPLE, 57 VCAP_IS0_PS_ETYPE_NORMAL_5TUPLE_IP4, 58 VCAP_IS0_PS_ETYPE_PURE_5TUPLE_IP4, 59 VCAP_IS0_PS_ETYPE_DBL_VID_IDX, 60 VCAP_IS0_PS_ETYPE_ETAG, 61 VCAP_IS0_PS_ETYPE_NO_LOOKUP, 62}; 63 64/* IS0 MPLS traffic type keyset generation */ 65enum vcap_is0_port_sel_mpls_uc_mc { 66 VCAP_IS0_PS_MPLS_FOLLOW_ETYPE, 67 VCAP_IS0_PS_MPLS_MLL, 68 VCAP_IS0_PS_MPLS_SGL_MLBS, 69 VCAP_IS0_PS_MPLS_DBL_MLBS, 70 VCAP_IS0_PS_MPLS_TRI_MLBS, 71 VCAP_IS0_PS_MPLS_TRI_VID, 72 VCAP_IS0_PS_MPLS_LL_FULL, 73 VCAP_IS0_PS_MPLS_NORMAL_SRC, 74 VCAP_IS0_PS_MPLS_NORMAL_DST, 75 VCAP_IS0_PS_MPLS_NORMAL_7TUPLE, 76 VCAP_IS0_PS_MPLS_NORMAL_5TUPLE_IP4, 77 VCAP_IS0_PS_MPLS_PURE_5TUPLE_IP4, 78 VCAP_IS0_PS_MPLS_DBL_VID_IDX, 79 VCAP_IS0_PS_MPLS_ETAG, 80 VCAP_IS0_PS_MPLS_NO_LOOKUP, 81}; 82 83/* IS0 MBLS traffic type keyset generation */ 84enum vcap_is0_port_sel_mlbs { 85 VCAP_IS0_PS_MLBS_FOLLOW_ETYPE, 86 VCAP_IS0_PS_MLBS_SGL_MLBS, 87 VCAP_IS0_PS_MLBS_DBL_MLBS, 88 VCAP_IS0_PS_MLBS_TRI_MLBS, 89 VCAP_IS0_PS_MLBS_NO_LOOKUP = 17, 90}; 91 92/* IS2 port keyset selection control */ 93 94/* IS2 non-ethernet traffic type keyset generation */ 95enum vcap_is2_port_sel_noneth { 96 VCAP_IS2_PS_NONETH_MAC_ETYPE, 97 VCAP_IS2_PS_NONETH_CUSTOM_1, 98 VCAP_IS2_PS_NONETH_CUSTOM_2, 99 VCAP_IS2_PS_NONETH_NO_LOOKUP 100}; 101 102/* IS2 IPv4 unicast traffic type keyset generation */ 103enum vcap_is2_port_sel_ipv4_uc { 104 VCAP_IS2_PS_IPV4_UC_MAC_ETYPE, 105 VCAP_IS2_PS_IPV4_UC_IP4_TCP_UDP_OTHER, 106 VCAP_IS2_PS_IPV4_UC_IP_7TUPLE, 107}; 108 109/* IS2 IPv4 multicast traffic type keyset generation */ 110enum vcap_is2_port_sel_ipv4_mc { 111 VCAP_IS2_PS_IPV4_MC_MAC_ETYPE, 112 VCAP_IS2_PS_IPV4_MC_IP4_TCP_UDP_OTHER, 113 VCAP_IS2_PS_IPV4_MC_IP_7TUPLE, 114 VCAP_IS2_PS_IPV4_MC_IP4_VID, 115}; 116 117/* IS2 IPv6 unicast traffic type keyset generation */ 118enum vcap_is2_port_sel_ipv6_uc { 119 VCAP_IS2_PS_IPV6_UC_MAC_ETYPE, 120 VCAP_IS2_PS_IPV6_UC_IP_7TUPLE, 121 VCAP_IS2_PS_IPV6_UC_IP6_STD, 122 VCAP_IS2_PS_IPV6_UC_IP4_TCP_UDP_OTHER, 123}; 124 125/* IS2 IPv6 multicast traffic type keyset generation */ 126enum vcap_is2_port_sel_ipv6_mc { 127 VCAP_IS2_PS_IPV6_MC_MAC_ETYPE, 128 VCAP_IS2_PS_IPV6_MC_IP_7TUPLE, 129 VCAP_IS2_PS_IPV6_MC_IP6_VID, 130 VCAP_IS2_PS_IPV6_MC_IP6_STD, 131 VCAP_IS2_PS_IPV6_MC_IP4_TCP_UDP_OTHER, 132}; 133 134/* IS2 ARP traffic type keyset generation */ 135enum vcap_is2_port_sel_arp { 136 VCAP_IS2_PS_ARP_MAC_ETYPE, 137 VCAP_IS2_PS_ARP_ARP, 138}; 139 140/* ES0 port keyset selection control */ 141 142/* ES0 Egress port traffic type classification */ 143enum vcap_es0_port_sel { 144 VCAP_ES0_PS_NORMAL_SELECTION, 145 VCAP_ES0_PS_FORCE_ISDX_LOOKUPS, 146 VCAP_ES0_PS_FORCE_VID_LOOKUPS, 147 VCAP_ES0_PS_RESERVED, 148}; 149 150/* ES2 port keyset selection control */ 151 152/* ES2 IPv4 traffic type keyset generation */ 153enum vcap_es2_port_sel_ipv4 { 154 VCAP_ES2_PS_IPV4_MAC_ETYPE, 155 VCAP_ES2_PS_IPV4_IP_7TUPLE, 156 VCAP_ES2_PS_IPV4_IP4_TCP_UDP_VID, 157 VCAP_ES2_PS_IPV4_IP4_TCP_UDP_OTHER, 158 VCAP_ES2_PS_IPV4_IP4_VID, 159 VCAP_ES2_PS_IPV4_IP4_OTHER, 160}; 161 162/* ES2 IPv6 traffic type keyset generation */ 163enum vcap_es2_port_sel_ipv6 { 164 VCAP_ES2_PS_IPV6_MAC_ETYPE, 165 VCAP_ES2_PS_IPV6_IP_7TUPLE, 166 VCAP_ES2_PS_IPV6_IP_7TUPLE_VID, 167 VCAP_ES2_PS_IPV6_IP_7TUPLE_STD, 168 VCAP_ES2_PS_IPV6_IP6_VID, 169 VCAP_ES2_PS_IPV6_IP6_STD, 170 VCAP_ES2_PS_IPV6_IP4_DOWNGRADE, 171}; 172 173/* ES2 ARP traffic type keyset generation */ 174enum vcap_es2_port_sel_arp { 175 VCAP_ES2_PS_ARP_MAC_ETYPE, 176 VCAP_ES2_PS_ARP_ARP, 177}; 178 179/* Selects TPID for ES0 matching */ 180enum SPX5_TPID_SEL { 181 SPX5_TPID_SEL_UNTAGGED, 182 SPX5_TPID_SEL_8100, 183 SPX5_TPID_SEL_UNUSED_0, 184 SPX5_TPID_SEL_UNUSED_1, 185 SPX5_TPID_SEL_88A8, 186 SPX5_TPID_SEL_TPIDCFG_1, 187 SPX5_TPID_SEL_TPIDCFG_2, 188 SPX5_TPID_SEL_TPIDCFG_3, 189}; 190 191/* Get the port keyset for the vcap lookup */ 192int sparx5_vcap_get_port_keyset(struct net_device *ndev, 193 struct vcap_admin *admin, 194 int cid, 195 u16 l3_proto, 196 struct vcap_keyset_list *kslist); 197 198/* Change the port keyset for the lookup and protocol */ 199void sparx5_vcap_set_port_keyset(struct net_device *ndev, 200 struct vcap_admin *admin, int cid, 201 u16 l3_proto, enum vcap_keyfield_set keyset, 202 struct vcap_keyset_list *orig); 203 204/* Check if the ethertype is supported by the vcap port classification */ 205bool sparx5_vcap_is_known_etype(struct vcap_admin *admin, u16 etype); 206 207#endif /* __SPARX5_VCAP_IMPL_H__ */ 208