1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */ 2 /* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */ 3 4 #ifndef _MLXSW_SPECTRUM_H 5 #define _MLXSW_SPECTRUM_H 6 7 #include <linux/types.h> 8 #include <linux/netdevice.h> 9 #include <linux/rhashtable.h> 10 #include <linux/bitops.h> 11 #include <linux/if_bridge.h> 12 #include <linux/if_vlan.h> 13 #include <linux/list.h> 14 #include <linux/dcbnl.h> 15 #include <linux/in6.h> 16 #include <linux/notifier.h> 17 #include <net/psample.h> 18 #include <net/pkt_cls.h> 19 #include <net/red.h> 20 #include <net/vxlan.h> 21 22 #include "port.h" 23 #include "core.h" 24 #include "core_acl_flex_keys.h" 25 #include "core_acl_flex_actions.h" 26 #include "reg.h" 27 28 #define MLXSW_SP_FID_8021D_MAX 1024 29 30 #define MLXSW_SP_MID_MAX 7000 31 32 #define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4 33 34 #define MLXSW_SP_PORT_BASE_SPEED 25000 /* Mb/s */ 35 36 #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */ 37 #define MLXSW_SP_KVD_GRANULARITY 128 38 39 #define MLXSW_SP_RESOURCE_NAME_KVD "kvd" 40 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR "linear" 41 #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE "hash_single" 42 #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE "hash_double" 43 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES "singles" 44 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks" 45 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks" 46 47 enum mlxsw_sp_resource_id { 48 MLXSW_SP_RESOURCE_KVD = 1, 49 MLXSW_SP_RESOURCE_KVD_LINEAR, 50 MLXSW_SP_RESOURCE_KVD_HASH_SINGLE, 51 MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE, 52 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE, 53 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS, 54 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS, 55 }; 56 57 struct mlxsw_sp_port; 58 struct mlxsw_sp_rif; 59 struct mlxsw_sp_span_entry; 60 enum mlxsw_sp_l3proto; 61 union mlxsw_sp_l3addr; 62 63 struct mlxsw_sp_upper { 64 struct net_device *dev; 65 unsigned int ref_count; 66 }; 67 68 enum mlxsw_sp_rif_type { 69 MLXSW_SP_RIF_TYPE_SUBPORT, 70 MLXSW_SP_RIF_TYPE_VLAN, 71 MLXSW_SP_RIF_TYPE_FID, 72 MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */ 73 MLXSW_SP_RIF_TYPE_MAX, 74 }; 75 76 enum mlxsw_sp_fid_type { 77 MLXSW_SP_FID_TYPE_8021Q, 78 MLXSW_SP_FID_TYPE_8021D, 79 MLXSW_SP_FID_TYPE_RFID, 80 MLXSW_SP_FID_TYPE_DUMMY, 81 MLXSW_SP_FID_TYPE_MAX, 82 }; 83 84 enum mlxsw_sp_nve_type { 85 MLXSW_SP_NVE_TYPE_VXLAN, 86 }; 87 88 struct mlxsw_sp_mid { 89 struct list_head list; 90 unsigned char addr[ETH_ALEN]; 91 u16 fid; 92 u16 mid; 93 bool in_hw; 94 unsigned long *ports_in_mid; /* bits array */ 95 }; 96 97 enum mlxsw_sp_port_mall_action_type { 98 MLXSW_SP_PORT_MALL_MIRROR, 99 MLXSW_SP_PORT_MALL_SAMPLE, 100 }; 101 102 struct mlxsw_sp_port_mall_mirror_tc_entry { 103 int span_id; 104 bool ingress; 105 }; 106 107 struct mlxsw_sp_port_mall_tc_entry { 108 struct list_head list; 109 unsigned long cookie; 110 enum mlxsw_sp_port_mall_action_type type; 111 union { 112 struct mlxsw_sp_port_mall_mirror_tc_entry mirror; 113 }; 114 }; 115 116 struct mlxsw_sp_sb; 117 struct mlxsw_sp_bridge; 118 struct mlxsw_sp_router; 119 struct mlxsw_sp_mr; 120 struct mlxsw_sp_acl; 121 struct mlxsw_sp_counter_pool; 122 struct mlxsw_sp_fid_core; 123 struct mlxsw_sp_kvdl; 124 struct mlxsw_sp_nve; 125 struct mlxsw_sp_kvdl_ops; 126 struct mlxsw_sp_mr_tcam_ops; 127 struct mlxsw_sp_acl_tcam_ops; 128 struct mlxsw_sp_nve_ops; 129 130 struct mlxsw_sp { 131 struct mlxsw_sp_port **ports; 132 struct mlxsw_core *core; 133 const struct mlxsw_bus_info *bus_info; 134 unsigned char base_mac[ETH_ALEN]; 135 struct mlxsw_sp_upper *lags; 136 int *port_to_module; 137 struct mlxsw_sp_sb *sb; 138 struct mlxsw_sp_bridge *bridge; 139 struct mlxsw_sp_router *router; 140 struct mlxsw_sp_mr *mr; 141 struct mlxsw_afa *afa; 142 struct mlxsw_sp_acl *acl; 143 struct mlxsw_sp_fid_core *fid_core; 144 struct mlxsw_sp_kvdl *kvdl; 145 struct mlxsw_sp_nve *nve; 146 struct notifier_block netdevice_nb; 147 148 struct mlxsw_sp_counter_pool *counter_pool; 149 struct { 150 struct mlxsw_sp_span_entry *entries; 151 int entries_count; 152 } span; 153 const struct mlxsw_fw_rev *req_rev; 154 const char *fw_filename; 155 const struct mlxsw_sp_kvdl_ops *kvdl_ops; 156 const struct mlxsw_afa_ops *afa_ops; 157 const struct mlxsw_afk_ops *afk_ops; 158 const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops; 159 const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops; 160 const struct mlxsw_sp_nve_ops **nve_ops_arr; 161 }; 162 163 static inline struct mlxsw_sp_upper * 164 mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id) 165 { 166 return &mlxsw_sp->lags[lag_id]; 167 } 168 169 struct mlxsw_sp_port_pcpu_stats { 170 u64 rx_packets; 171 u64 rx_bytes; 172 u64 tx_packets; 173 u64 tx_bytes; 174 struct u64_stats_sync syncp; 175 u32 tx_dropped; 176 }; 177 178 struct mlxsw_sp_port_sample { 179 struct psample_group __rcu *psample_group; 180 u32 trunc_size; 181 u32 rate; 182 bool truncate; 183 }; 184 185 struct mlxsw_sp_bridge_port; 186 struct mlxsw_sp_fid; 187 188 struct mlxsw_sp_port_vlan { 189 struct list_head list; 190 struct mlxsw_sp_port *mlxsw_sp_port; 191 struct mlxsw_sp_fid *fid; 192 unsigned int ref_count; 193 u16 vid; 194 struct mlxsw_sp_bridge_port *bridge_port; 195 struct list_head bridge_vlan_node; 196 }; 197 198 /* No need an internal lock; At worse - miss a single periodic iteration */ 199 struct mlxsw_sp_port_xstats { 200 u64 ecn; 201 u64 wred_drop[TC_MAX_QUEUE]; 202 u64 tail_drop[TC_MAX_QUEUE]; 203 u64 backlog[TC_MAX_QUEUE]; 204 u64 tx_bytes[IEEE_8021QAZ_MAX_TCS]; 205 u64 tx_packets[IEEE_8021QAZ_MAX_TCS]; 206 }; 207 208 struct mlxsw_sp_port { 209 struct net_device *dev; 210 struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats; 211 struct mlxsw_sp *mlxsw_sp; 212 u8 local_port; 213 u8 lagged:1, 214 split:1; 215 u16 pvid; 216 u16 lag_id; 217 struct { 218 u8 tx_pause:1, 219 rx_pause:1, 220 autoneg:1; 221 } link; 222 struct { 223 struct ieee_ets *ets; 224 struct ieee_maxrate *maxrate; 225 struct ieee_pfc *pfc; 226 enum mlxsw_reg_qpts_trust_state trust_state; 227 } dcb; 228 struct { 229 u8 module; 230 u8 width; 231 u8 lane; 232 } mapping; 233 /* TC handles */ 234 struct list_head mall_tc_list; 235 struct { 236 #define MLXSW_HW_STATS_UPDATE_TIME HZ 237 struct rtnl_link_stats64 stats; 238 struct mlxsw_sp_port_xstats xstats; 239 struct delayed_work update_dw; 240 } periodic_hw_stats; 241 struct mlxsw_sp_port_sample *sample; 242 struct list_head vlans_list; 243 struct mlxsw_sp_qdisc *root_qdisc; 244 struct mlxsw_sp_qdisc *tclass_qdiscs; 245 unsigned acl_rule_count; 246 struct mlxsw_sp_acl_block *ing_acl_block; 247 struct mlxsw_sp_acl_block *eg_acl_block; 248 }; 249 250 static inline struct net_device * 251 mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev) 252 { 253 struct net_device *dev; 254 struct list_head *iter; 255 256 netdev_for_each_lower_dev(br_dev, dev, iter) { 257 if (netif_is_vxlan(dev)) 258 return dev; 259 } 260 261 return NULL; 262 } 263 264 static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev) 265 { 266 return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev); 267 } 268 269 static inline int 270 mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid) 271 { 272 struct bridge_vlan_info vinfo; 273 u16 vid = 0; 274 int err; 275 276 err = br_vlan_get_pvid(vxlan_dev, &vid); 277 if (err || !vid) 278 goto out; 279 280 err = br_vlan_get_info(vxlan_dev, vid, &vinfo); 281 if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED)) 282 vid = 0; 283 284 out: 285 *p_vid = vid; 286 return err; 287 } 288 289 static inline bool 290 mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port) 291 { 292 return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause; 293 } 294 295 static inline struct mlxsw_sp_port * 296 mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index) 297 { 298 struct mlxsw_sp_port *mlxsw_sp_port; 299 u8 local_port; 300 301 local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core, 302 lag_id, port_index); 303 mlxsw_sp_port = mlxsw_sp->ports[local_port]; 304 return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL; 305 } 306 307 static inline struct mlxsw_sp_port_vlan * 308 mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port, 309 u16 vid) 310 { 311 struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan; 312 313 list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list, 314 list) { 315 if (mlxsw_sp_port_vlan->vid == vid) 316 return mlxsw_sp_port_vlan; 317 } 318 319 return NULL; 320 } 321 322 enum mlxsw_sp_flood_type { 323 MLXSW_SP_FLOOD_TYPE_UC, 324 MLXSW_SP_FLOOD_TYPE_BC, 325 MLXSW_SP_FLOOD_TYPE_MC, 326 }; 327 328 /* spectrum_buffers.c */ 329 int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp); 330 void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp); 331 int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port); 332 int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core, 333 unsigned int sb_index, u16 pool_index, 334 struct devlink_sb_pool_info *pool_info); 335 int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core, 336 unsigned int sb_index, u16 pool_index, u32 size, 337 enum devlink_sb_threshold_type threshold_type); 338 int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, 339 unsigned int sb_index, u16 pool_index, 340 u32 *p_threshold); 341 int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port, 342 unsigned int sb_index, u16 pool_index, 343 u32 threshold); 344 int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port, 345 unsigned int sb_index, u16 tc_index, 346 enum devlink_sb_pool_type pool_type, 347 u16 *p_pool_index, u32 *p_threshold); 348 int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port, 349 unsigned int sb_index, u16 tc_index, 350 enum devlink_sb_pool_type pool_type, 351 u16 pool_index, u32 threshold); 352 int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core, 353 unsigned int sb_index); 354 int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core, 355 unsigned int sb_index); 356 int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port, 357 unsigned int sb_index, u16 pool_index, 358 u32 *p_cur, u32 *p_max); 359 int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port, 360 unsigned int sb_index, u16 tc_index, 361 enum devlink_sb_pool_type pool_type, 362 u32 *p_cur, u32 *p_max); 363 u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells); 364 u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes); 365 366 /* spectrum_switchdev.c */ 367 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp); 368 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp); 369 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port); 370 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port); 371 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid, 372 bool adding); 373 void 374 mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 375 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port, 376 struct net_device *brport_dev, 377 struct net_device *br_dev, 378 struct netlink_ext_ack *extack); 379 void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port, 380 struct net_device *brport_dev, 381 struct net_device *br_dev); 382 bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp, 383 const struct net_device *br_dev); 384 int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp, 385 const struct net_device *br_dev, 386 const struct net_device *vxlan_dev, u16 vid, 387 struct netlink_ext_ack *extack); 388 void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp, 389 const struct net_device *vxlan_dev); 390 extern struct notifier_block mlxsw_sp_switchdev_notifier; 391 392 /* spectrum.c */ 393 int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port, 394 enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index, 395 bool dwrr, u8 dwrr_weight); 396 int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port, 397 u8 switch_prio, u8 tclass); 398 int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu, 399 u8 *prio_tc, bool pause_en, 400 struct ieee_pfc *my_pfc); 401 int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port, 402 enum mlxsw_reg_qeec_hr hr, u8 index, 403 u8 next_index, u32 maxrate); 404 enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state); 405 int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid, 406 u8 state); 407 int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable); 408 int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid, 409 bool learn_enable); 410 int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 411 struct mlxsw_sp_port_vlan * 412 mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 413 void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 414 int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin, 415 u16 vid_end, bool is_member, bool untagged); 416 int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp, 417 unsigned int counter_index, u64 *packets, 418 u64 *bytes); 419 int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp, 420 unsigned int *p_counter_index); 421 void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp, 422 unsigned int counter_index); 423 bool mlxsw_sp_port_dev_check(const struct net_device *dev); 424 struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev); 425 struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev); 426 struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev); 427 void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port); 428 struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev); 429 430 /* spectrum_dcb.c */ 431 #ifdef CONFIG_MLXSW_SPECTRUM_DCB 432 int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port); 433 void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port); 434 #else 435 static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port) 436 { 437 return 0; 438 } 439 static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port) 440 {} 441 #endif 442 443 /* spectrum_router.c */ 444 enum mlxsw_sp_l3proto { 445 MLXSW_SP_L3_PROTO_IPV4, 446 MLXSW_SP_L3_PROTO_IPV6, 447 #define MLXSW_SP_L3_PROTO_MAX (MLXSW_SP_L3_PROTO_IPV6 + 1) 448 }; 449 450 union mlxsw_sp_l3addr { 451 __be32 addr4; 452 struct in6_addr addr6; 453 }; 454 455 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp); 456 void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp); 457 int mlxsw_sp_netdevice_router_port_event(struct net_device *dev); 458 void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp, 459 const struct net_device *macvlan_dev); 460 int mlxsw_sp_inetaddr_event(struct notifier_block *unused, 461 unsigned long event, void *ptr); 462 int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused, 463 unsigned long event, void *ptr); 464 int mlxsw_sp_inet6addr_event(struct notifier_block *unused, 465 unsigned long event, void *ptr); 466 int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused, 467 unsigned long event, void *ptr); 468 int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event, 469 struct netdev_notifier_changeupper_info *info); 470 bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp, 471 const struct net_device *dev); 472 bool mlxsw_sp_netdev_is_ipip_ul(const struct mlxsw_sp *mlxsw_sp, 473 const struct net_device *dev); 474 int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp, 475 struct net_device *l3_dev, 476 unsigned long event, 477 struct netdev_notifier_info *info); 478 int 479 mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp, 480 struct net_device *l3_dev, 481 unsigned long event, 482 struct netdev_notifier_info *info); 483 void 484 mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan); 485 void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif); 486 void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp, 487 struct net_device *dev); 488 struct mlxsw_sp_rif *mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp, 489 const struct net_device *dev); 490 u8 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp); 491 struct mlxsw_sp_fid *mlxsw_sp_rif_fid(const struct mlxsw_sp_rif *rif); 492 int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, 493 enum mlxsw_sp_l3proto ul_proto, 494 const union mlxsw_sp_l3addr *ul_sip, 495 u32 tunnel_index); 496 void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id, 497 enum mlxsw_sp_l3proto ul_proto, 498 const union mlxsw_sp_l3addr *ul_sip); 499 int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id, 500 u16 *vr_id); 501 502 /* spectrum_kvdl.c */ 503 enum mlxsw_sp_kvdl_entry_type { 504 MLXSW_SP_KVDL_ENTRY_TYPE_ADJ, 505 MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET, 506 MLXSW_SP_KVDL_ENTRY_TYPE_PBS, 507 MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR, 508 MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT, 509 }; 510 511 static inline unsigned int 512 mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type) 513 { 514 switch (type) { 515 case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ: /* fall through */ 516 case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET: /* fall through */ 517 case MLXSW_SP_KVDL_ENTRY_TYPE_PBS: /* fall through */ 518 case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR: /* fall through */ 519 case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT: /* fall through */ 520 default: 521 return 1; 522 } 523 } 524 525 struct mlxsw_sp_kvdl_ops { 526 size_t priv_size; 527 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv); 528 void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv); 529 int (*alloc)(struct mlxsw_sp *mlxsw_sp, void *priv, 530 enum mlxsw_sp_kvdl_entry_type type, 531 unsigned int entry_count, u32 *p_entry_index); 532 void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv, 533 enum mlxsw_sp_kvdl_entry_type type, 534 unsigned int entry_count, int entry_index); 535 int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv, 536 enum mlxsw_sp_kvdl_entry_type type, 537 unsigned int entry_count, 538 unsigned int *p_alloc_count); 539 int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv); 540 }; 541 542 int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp); 543 void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp); 544 int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, 545 enum mlxsw_sp_kvdl_entry_type type, 546 unsigned int entry_count, u32 *p_entry_index); 547 void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, 548 enum mlxsw_sp_kvdl_entry_type type, 549 unsigned int entry_count, int entry_index); 550 int mlxsw_sp_kvdl_alloc_count_query(struct mlxsw_sp *mlxsw_sp, 551 enum mlxsw_sp_kvdl_entry_type type, 552 unsigned int entry_count, 553 unsigned int *p_alloc_count); 554 555 /* spectrum1_kvdl.c */ 556 extern const struct mlxsw_sp_kvdl_ops mlxsw_sp1_kvdl_ops; 557 int mlxsw_sp1_kvdl_resources_register(struct mlxsw_core *mlxsw_core); 558 559 /* spectrum2_kvdl.c */ 560 extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops; 561 562 struct mlxsw_sp_acl_rule_info { 563 unsigned int priority; 564 struct mlxsw_afk_element_values values; 565 struct mlxsw_afa_block *act_block; 566 unsigned int counter_index; 567 }; 568 569 struct mlxsw_sp_acl_block; 570 struct mlxsw_sp_acl_ruleset; 571 572 /* spectrum_acl.c */ 573 enum mlxsw_sp_acl_profile { 574 MLXSW_SP_ACL_PROFILE_FLOWER, 575 }; 576 577 struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl); 578 struct mlxsw_sp *mlxsw_sp_acl_block_mlxsw_sp(struct mlxsw_sp_acl_block *block); 579 unsigned int mlxsw_sp_acl_block_rule_count(struct mlxsw_sp_acl_block *block); 580 void mlxsw_sp_acl_block_disable_inc(struct mlxsw_sp_acl_block *block); 581 void mlxsw_sp_acl_block_disable_dec(struct mlxsw_sp_acl_block *block); 582 bool mlxsw_sp_acl_block_disabled(struct mlxsw_sp_acl_block *block); 583 struct mlxsw_sp_acl_block *mlxsw_sp_acl_block_create(struct mlxsw_sp *mlxsw_sp, 584 struct net *net); 585 void mlxsw_sp_acl_block_destroy(struct mlxsw_sp_acl_block *block); 586 int mlxsw_sp_acl_block_bind(struct mlxsw_sp *mlxsw_sp, 587 struct mlxsw_sp_acl_block *block, 588 struct mlxsw_sp_port *mlxsw_sp_port, 589 bool ingress); 590 int mlxsw_sp_acl_block_unbind(struct mlxsw_sp *mlxsw_sp, 591 struct mlxsw_sp_acl_block *block, 592 struct mlxsw_sp_port *mlxsw_sp_port, 593 bool ingress); 594 bool mlxsw_sp_acl_block_is_egress_bound(struct mlxsw_sp_acl_block *block); 595 struct mlxsw_sp_acl_ruleset * 596 mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp, 597 struct mlxsw_sp_acl_block *block, u32 chain_index, 598 enum mlxsw_sp_acl_profile profile); 599 struct mlxsw_sp_acl_ruleset * 600 mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, 601 struct mlxsw_sp_acl_block *block, u32 chain_index, 602 enum mlxsw_sp_acl_profile profile, 603 struct mlxsw_afk_element_usage *tmplt_elusage); 604 void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp, 605 struct mlxsw_sp_acl_ruleset *ruleset); 606 u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset); 607 608 struct mlxsw_sp_acl_rule_info * 609 mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl); 610 void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei); 611 int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei); 612 void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei, 613 unsigned int priority); 614 void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei, 615 enum mlxsw_afk_element element, 616 u32 key_value, u32 mask_value); 617 void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei, 618 enum mlxsw_afk_element element, 619 const char *key_value, 620 const char *mask_value, unsigned int len); 621 int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei); 622 int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei, 623 u16 group_id); 624 int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei); 625 int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei); 626 int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei); 627 int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp, 628 struct mlxsw_sp_acl_rule_info *rulei, 629 struct mlxsw_sp_acl_block *block, 630 struct net_device *out_dev, 631 struct netlink_ext_ack *extack); 632 int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp, 633 struct mlxsw_sp_acl_rule_info *rulei, 634 struct net_device *out_dev, 635 struct netlink_ext_ack *extack); 636 int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp, 637 struct mlxsw_sp_acl_rule_info *rulei, 638 u32 action, u16 vid, u16 proto, u8 prio, 639 struct netlink_ext_ack *extack); 640 int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp, 641 struct mlxsw_sp_acl_rule_info *rulei, 642 struct netlink_ext_ack *extack); 643 int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp, 644 struct mlxsw_sp_acl_rule_info *rulei, 645 u16 fid, struct netlink_ext_ack *extack); 646 647 struct mlxsw_sp_acl_rule; 648 649 struct mlxsw_sp_acl_rule * 650 mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp, 651 struct mlxsw_sp_acl_ruleset *ruleset, 652 unsigned long cookie, 653 struct netlink_ext_ack *extack); 654 void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp, 655 struct mlxsw_sp_acl_rule *rule); 656 int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp, 657 struct mlxsw_sp_acl_rule *rule); 658 void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp, 659 struct mlxsw_sp_acl_rule *rule); 660 struct mlxsw_sp_acl_rule * 661 mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp, 662 struct mlxsw_sp_acl_ruleset *ruleset, 663 unsigned long cookie); 664 struct mlxsw_sp_acl_rule_info * 665 mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule); 666 int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp, 667 struct mlxsw_sp_acl_rule *rule, 668 u64 *packets, u64 *bytes, u64 *last_use); 669 670 struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp); 671 672 int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp); 673 void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp); 674 675 /* spectrum_acl_tcam.c */ 676 struct mlxsw_sp_acl_tcam; 677 struct mlxsw_sp_acl_tcam_region; 678 679 struct mlxsw_sp_acl_tcam_ops { 680 enum mlxsw_reg_ptar_key_type key_type; 681 size_t priv_size; 682 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv, 683 struct mlxsw_sp_acl_tcam *tcam); 684 void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv); 685 size_t region_priv_size; 686 int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv, 687 void *tcam_priv, 688 struct mlxsw_sp_acl_tcam_region *region); 689 void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv); 690 int (*region_associate)(struct mlxsw_sp *mlxsw_sp, 691 struct mlxsw_sp_acl_tcam_region *region); 692 size_t chunk_priv_size; 693 void (*chunk_init)(void *region_priv, void *chunk_priv, 694 unsigned int priority); 695 void (*chunk_fini)(void *chunk_priv); 696 size_t entry_priv_size; 697 int (*entry_add)(struct mlxsw_sp *mlxsw_sp, 698 void *region_priv, void *chunk_priv, 699 void *entry_priv, 700 struct mlxsw_sp_acl_rule_info *rulei); 701 void (*entry_del)(struct mlxsw_sp *mlxsw_sp, 702 void *region_priv, void *chunk_priv, 703 void *entry_priv); 704 int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp, 705 void *region_priv, void *entry_priv, 706 bool *activity); 707 }; 708 709 /* spectrum1_acl_tcam.c */ 710 extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops; 711 712 /* spectrum2_acl_tcam.c */ 713 extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops; 714 715 /* spectrum_acl_flex_actions.c */ 716 extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops; 717 extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops; 718 719 /* spectrum_acl_flex_keys.c */ 720 extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops; 721 extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops; 722 723 /* spectrum_flower.c */ 724 int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp, 725 struct mlxsw_sp_acl_block *block, 726 struct tc_cls_flower_offload *f); 727 void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp, 728 struct mlxsw_sp_acl_block *block, 729 struct tc_cls_flower_offload *f); 730 int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp, 731 struct mlxsw_sp_acl_block *block, 732 struct tc_cls_flower_offload *f); 733 int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp, 734 struct mlxsw_sp_acl_block *block, 735 struct tc_cls_flower_offload *f); 736 void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp, 737 struct mlxsw_sp_acl_block *block, 738 struct tc_cls_flower_offload *f); 739 740 /* spectrum_qdisc.c */ 741 int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port); 742 void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port); 743 int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port, 744 struct tc_red_qopt_offload *p); 745 int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port, 746 struct tc_prio_qopt_offload *p); 747 748 /* spectrum_fid.c */ 749 bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid); 750 struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp, 751 u16 fid_index); 752 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex); 753 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid, 754 enum mlxsw_sp_nve_type *p_type); 755 struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp, 756 __be32 vni); 757 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni); 758 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid, 759 u32 nve_flood_index); 760 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid); 761 bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid); 762 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type, 763 __be32 vni, int nve_ifindex); 764 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid); 765 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid); 766 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid, 767 const struct net_device *nve_dev); 768 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid, 769 enum mlxsw_sp_flood_type packet_type, u8 local_port, 770 bool member); 771 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid, 772 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 773 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid, 774 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid); 775 enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid); 776 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid); 777 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid); 778 void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif); 779 enum mlxsw_sp_rif_type 780 mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp, 781 enum mlxsw_sp_fid_type type); 782 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid); 783 struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid); 784 struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp, 785 int br_ifindex); 786 struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp, 787 u16 vid); 788 struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp, 789 int br_ifindex); 790 struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp, 791 u16 rif_index); 792 struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp); 793 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid); 794 int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port); 795 void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port); 796 int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp); 797 void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp); 798 799 /* spectrum_mr.c */ 800 enum mlxsw_sp_mr_route_prio { 801 MLXSW_SP_MR_ROUTE_PRIO_SG, 802 MLXSW_SP_MR_ROUTE_PRIO_STARG, 803 MLXSW_SP_MR_ROUTE_PRIO_CATCHALL, 804 __MLXSW_SP_MR_ROUTE_PRIO_MAX 805 }; 806 807 #define MLXSW_SP_MR_ROUTE_PRIO_MAX (__MLXSW_SP_MR_ROUTE_PRIO_MAX - 1) 808 809 struct mlxsw_sp_mr_route_key; 810 811 struct mlxsw_sp_mr_tcam_ops { 812 size_t priv_size; 813 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv); 814 void (*fini)(void *priv); 815 size_t route_priv_size; 816 int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv, 817 void *route_priv, 818 struct mlxsw_sp_mr_route_key *key, 819 struct mlxsw_afa_block *afa_block, 820 enum mlxsw_sp_mr_route_prio prio); 821 void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv, 822 void *route_priv, 823 struct mlxsw_sp_mr_route_key *key); 824 int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv, 825 struct mlxsw_sp_mr_route_key *key, 826 struct mlxsw_afa_block *afa_block); 827 }; 828 829 /* spectrum1_mr_tcam.c */ 830 extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp1_mr_tcam_ops; 831 832 /* spectrum2_mr_tcam.c */ 833 extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops; 834 835 /* spectrum_nve.c */ 836 struct mlxsw_sp_nve_params { 837 enum mlxsw_sp_nve_type type; 838 __be32 vni; 839 const struct net_device *dev; 840 }; 841 842 extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[]; 843 extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[]; 844 845 int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip, 846 enum mlxsw_sp_l3proto proto, 847 union mlxsw_sp_l3addr *addr); 848 int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp, 849 struct mlxsw_sp_fid *fid, 850 enum mlxsw_sp_l3proto proto, 851 union mlxsw_sp_l3addr *addr); 852 void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp, 853 struct mlxsw_sp_fid *fid, 854 enum mlxsw_sp_l3proto proto, 855 union mlxsw_sp_l3addr *addr); 856 u32 mlxsw_sp_nve_decap_tunnel_index_get(const struct mlxsw_sp *mlxsw_sp); 857 bool mlxsw_sp_nve_ipv4_route_is_decap(const struct mlxsw_sp *mlxsw_sp, 858 u32 tb_id, __be32 addr); 859 int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid, 860 struct mlxsw_sp_nve_params *params, 861 struct netlink_ext_ack *extack); 862 void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp, 863 struct mlxsw_sp_fid *fid); 864 int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port); 865 void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port); 866 int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp); 867 void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp); 868 869 #endif 870