1 /* SPDX-License-Identifier: (GPL-2.0 OR MIT) */ 2 /* Microsemi Ocelot Switch driver 3 * Copyright (c) 2019 Microsemi Corporation 4 */ 5 6 #ifndef _MSCC_OCELOT_VCAP_H_ 7 #define _MSCC_OCELOT_VCAP_H_ 8 9 #include "ocelot.h" 10 #include "ocelot_police.h" 11 #include <net/sch_generic.h> 12 #include <net/pkt_cls.h> 13 14 #define OCELOT_POLICER_DISCARD 0x17f 15 16 struct ocelot_ipv4 { 17 u8 addr[4]; 18 }; 19 20 enum ocelot_vcap_bit { 21 OCELOT_VCAP_BIT_ANY, 22 OCELOT_VCAP_BIT_0, 23 OCELOT_VCAP_BIT_1 24 }; 25 26 struct ocelot_vcap_u8 { 27 u8 value[1]; 28 u8 mask[1]; 29 }; 30 31 struct ocelot_vcap_u16 { 32 u8 value[2]; 33 u8 mask[2]; 34 }; 35 36 struct ocelot_vcap_u24 { 37 u8 value[3]; 38 u8 mask[3]; 39 }; 40 41 struct ocelot_vcap_u32 { 42 u8 value[4]; 43 u8 mask[4]; 44 }; 45 46 struct ocelot_vcap_u40 { 47 u8 value[5]; 48 u8 mask[5]; 49 }; 50 51 struct ocelot_vcap_u48 { 52 u8 value[6]; 53 u8 mask[6]; 54 }; 55 56 struct ocelot_vcap_u64 { 57 u8 value[8]; 58 u8 mask[8]; 59 }; 60 61 struct ocelot_vcap_u128 { 62 u8 value[16]; 63 u8 mask[16]; 64 }; 65 66 struct ocelot_vcap_vid { 67 u16 value; 68 u16 mask; 69 }; 70 71 struct ocelot_vcap_ipv4 { 72 struct ocelot_ipv4 value; 73 struct ocelot_ipv4 mask; 74 }; 75 76 struct ocelot_vcap_udp_tcp { 77 u16 value; 78 u16 mask; 79 }; 80 81 struct ocelot_vcap_port { 82 u8 value; 83 u8 mask; 84 }; 85 86 enum ocelot_vcap_key_type { 87 OCELOT_VCAP_KEY_ANY, 88 OCELOT_VCAP_KEY_ETYPE, 89 OCELOT_VCAP_KEY_LLC, 90 OCELOT_VCAP_KEY_SNAP, 91 OCELOT_VCAP_KEY_ARP, 92 OCELOT_VCAP_KEY_IPV4, 93 OCELOT_VCAP_KEY_IPV6 94 }; 95 96 struct ocelot_vcap_key_vlan { 97 struct ocelot_vcap_vid vid; /* VLAN ID (12 bit) */ 98 struct ocelot_vcap_u8 pcp; /* PCP (3 bit) */ 99 enum ocelot_vcap_bit dei; /* DEI */ 100 enum ocelot_vcap_bit tagged; /* Tagged/untagged frame */ 101 }; 102 103 struct ocelot_vcap_key_etype { 104 struct ocelot_vcap_u48 dmac; 105 struct ocelot_vcap_u48 smac; 106 struct ocelot_vcap_u16 etype; 107 struct ocelot_vcap_u16 data; /* MAC data */ 108 }; 109 110 struct ocelot_vcap_key_llc { 111 struct ocelot_vcap_u48 dmac; 112 struct ocelot_vcap_u48 smac; 113 114 /* LLC header: DSAP at byte 0, SSAP at byte 1, Control at byte 2 */ 115 struct ocelot_vcap_u32 llc; 116 }; 117 118 struct ocelot_vcap_key_snap { 119 struct ocelot_vcap_u48 dmac; 120 struct ocelot_vcap_u48 smac; 121 122 /* SNAP header: Organization Code at byte 0, Type at byte 3 */ 123 struct ocelot_vcap_u40 snap; 124 }; 125 126 struct ocelot_vcap_key_arp { 127 struct ocelot_vcap_u48 smac; 128 enum ocelot_vcap_bit arp; /* Opcode ARP/RARP */ 129 enum ocelot_vcap_bit req; /* Opcode request/reply */ 130 enum ocelot_vcap_bit unknown; /* Opcode unknown */ 131 enum ocelot_vcap_bit smac_match; /* Sender MAC matches SMAC */ 132 enum ocelot_vcap_bit dmac_match; /* Target MAC matches DMAC */ 133 134 /**< Protocol addr. length 4, hardware length 6 */ 135 enum ocelot_vcap_bit length; 136 137 enum ocelot_vcap_bit ip; /* Protocol address type IP */ 138 enum ocelot_vcap_bit ethernet; /* Hardware address type Ethernet */ 139 struct ocelot_vcap_ipv4 sip; /* Sender IP address */ 140 struct ocelot_vcap_ipv4 dip; /* Target IP address */ 141 }; 142 143 struct ocelot_vcap_key_ipv4 { 144 enum ocelot_vcap_bit ttl; /* TTL zero */ 145 enum ocelot_vcap_bit fragment; /* Fragment */ 146 enum ocelot_vcap_bit options; /* Header options */ 147 struct ocelot_vcap_u8 ds; 148 struct ocelot_vcap_u8 proto; /* Protocol */ 149 struct ocelot_vcap_ipv4 sip; /* Source IP address */ 150 struct ocelot_vcap_ipv4 dip; /* Destination IP address */ 151 struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 152 struct ocelot_vcap_udp_tcp sport; /* UDP/TCP: Source port */ 153 struct ocelot_vcap_udp_tcp dport; /* UDP/TCP: Destination port */ 154 enum ocelot_vcap_bit tcp_fin; 155 enum ocelot_vcap_bit tcp_syn; 156 enum ocelot_vcap_bit tcp_rst; 157 enum ocelot_vcap_bit tcp_psh; 158 enum ocelot_vcap_bit tcp_ack; 159 enum ocelot_vcap_bit tcp_urg; 160 enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 161 enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 162 enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 163 }; 164 165 struct ocelot_vcap_key_ipv6 { 166 struct ocelot_vcap_u8 proto; /* IPv6 protocol */ 167 struct ocelot_vcap_u128 sip; /* IPv6 source (byte 0-7 ignored) */ 168 struct ocelot_vcap_u128 dip; /* IPv6 destination (byte 0-7 ignored) */ 169 enum ocelot_vcap_bit ttl; /* TTL zero */ 170 struct ocelot_vcap_u8 ds; 171 struct ocelot_vcap_u48 data; /* Not UDP/TCP: IP data */ 172 struct ocelot_vcap_udp_tcp sport; 173 struct ocelot_vcap_udp_tcp dport; 174 enum ocelot_vcap_bit tcp_fin; 175 enum ocelot_vcap_bit tcp_syn; 176 enum ocelot_vcap_bit tcp_rst; 177 enum ocelot_vcap_bit tcp_psh; 178 enum ocelot_vcap_bit tcp_ack; 179 enum ocelot_vcap_bit tcp_urg; 180 enum ocelot_vcap_bit sip_eq_dip; /* SIP equals DIP */ 181 enum ocelot_vcap_bit sport_eq_dport; /* SPORT equals DPORT */ 182 enum ocelot_vcap_bit seq_zero; /* TCP sequence number is zero */ 183 }; 184 185 enum ocelot_mask_mode { 186 OCELOT_MASK_MODE_NONE, 187 OCELOT_MASK_MODE_PERMIT_DENY, 188 OCELOT_MASK_MODE_POLICY, 189 OCELOT_MASK_MODE_REDIRECT, 190 }; 191 192 enum ocelot_es0_tag { 193 OCELOT_NO_ES0_TAG, 194 OCELOT_ES0_TAG, 195 OCELOT_FORCE_PORT_TAG, 196 OCELOT_FORCE_UNTAG, 197 }; 198 199 enum ocelot_tag_tpid_sel { 200 OCELOT_TAG_TPID_SEL_8021Q, 201 OCELOT_TAG_TPID_SEL_8021AD, 202 }; 203 204 struct ocelot_vcap_action { 205 union { 206 /* VCAP ES0 */ 207 struct { 208 enum ocelot_es0_tag push_outer_tag; 209 enum ocelot_es0_tag push_inner_tag; 210 enum ocelot_tag_tpid_sel tag_a_tpid_sel; 211 int tag_a_vid_sel; 212 int tag_a_pcp_sel; 213 u16 vid_a_val; 214 u8 pcp_a_val; 215 u8 dei_a_val; 216 enum ocelot_tag_tpid_sel tag_b_tpid_sel; 217 int tag_b_vid_sel; 218 int tag_b_pcp_sel; 219 u16 vid_b_val; 220 u8 pcp_b_val; 221 u8 dei_b_val; 222 }; 223 224 /* VCAP IS1 */ 225 struct { 226 bool vid_replace_ena; 227 u16 vid; 228 bool vlan_pop_cnt_ena; 229 int vlan_pop_cnt; 230 bool pcp_dei_ena; 231 u8 pcp; 232 u8 dei; 233 bool qos_ena; 234 u8 qos_val; 235 u8 pag_override_mask; 236 u8 pag_val; 237 }; 238 239 /* VCAP IS2 */ 240 struct { 241 bool cpu_copy_ena; 242 u8 cpu_qu_num; 243 enum ocelot_mask_mode mask_mode; 244 unsigned long port_mask; 245 bool police_ena; 246 struct ocelot_policer pol; 247 u32 pol_ix; 248 }; 249 }; 250 }; 251 252 struct ocelot_vcap_stats { 253 u64 bytes; 254 u64 pkts; 255 u64 used; 256 }; 257 258 enum ocelot_vcap_filter_type { 259 OCELOT_VCAP_FILTER_DUMMY, 260 OCELOT_VCAP_FILTER_PAG, 261 OCELOT_VCAP_FILTER_OFFLOAD, 262 }; 263 264 struct ocelot_vcap_filter { 265 struct list_head list; 266 267 enum ocelot_vcap_filter_type type; 268 int block_id; 269 int goto_target; 270 int lookup; 271 u8 pag; 272 u16 prio; 273 u32 id; 274 275 struct ocelot_vcap_action action; 276 struct ocelot_vcap_stats stats; 277 /* For VCAP IS1 and IS2 */ 278 unsigned long ingress_port_mask; 279 /* For VCAP ES0 */ 280 struct ocelot_vcap_port ingress_port; 281 struct ocelot_vcap_port egress_port; 282 283 enum ocelot_vcap_bit dmac_mc; 284 enum ocelot_vcap_bit dmac_bc; 285 struct ocelot_vcap_key_vlan vlan; 286 287 enum ocelot_vcap_key_type key_type; 288 union { 289 /* OCELOT_VCAP_KEY_ANY: No specific fields */ 290 struct ocelot_vcap_key_etype etype; 291 struct ocelot_vcap_key_llc llc; 292 struct ocelot_vcap_key_snap snap; 293 struct ocelot_vcap_key_arp arp; 294 struct ocelot_vcap_key_ipv4 ipv4; 295 struct ocelot_vcap_key_ipv6 ipv6; 296 } key; 297 }; 298 299 int ocelot_vcap_filter_add(struct ocelot *ocelot, 300 struct ocelot_vcap_filter *rule, 301 struct netlink_ext_ack *extack); 302 int ocelot_vcap_filter_del(struct ocelot *ocelot, 303 struct ocelot_vcap_filter *rule); 304 int ocelot_vcap_filter_stats_update(struct ocelot *ocelot, 305 struct ocelot_vcap_filter *rule); 306 struct ocelot_vcap_filter * 307 ocelot_vcap_block_find_filter_by_id(struct ocelot_vcap_block *block, int id); 308 309 void ocelot_detect_vcap_constants(struct ocelot *ocelot); 310 int ocelot_vcap_init(struct ocelot *ocelot); 311 312 int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv, 313 struct flow_cls_offload *f, 314 bool ingress); 315 316 #endif /* _MSCC_OCELOT_VCAP_H_ */ 317