1509 lines · c
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_H5#define _MLXSW_SPECTRUM_H6 7#include <linux/ethtool.h>8#include <linux/types.h>9#include <linux/netdevice.h>10#include <linux/rhashtable.h>11#include <linux/bitops.h>12#include <linux/if_bridge.h>13#include <linux/if_vlan.h>14#include <linux/list.h>15#include <linux/dcbnl.h>16#include <linux/in6.h>17#include <linux/notifier.h>18#include <linux/net_namespace.h>19#include <linux/spinlock.h>20#include <net/psample.h>21#include <net/pkt_cls.h>22#include <net/red.h>23#include <net/vxlan.h>24#include <net/flow_offload.h>25#include <net/inet_ecn.h>26 27#include "port.h"28#include "core.h"29#include "core_acl_flex_keys.h"30#include "core_acl_flex_actions.h"31#include "reg.h"32 33#define MLXSW_SP_DEFAULT_VID (VLAN_N_VID - 1)34 35#define MLXSW_SP_FID_8021D_MAX 102436 37#define MLXSW_SP_MID_MAX 700038 39#define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */40#define MLXSW_SP_KVD_GRANULARITY 12841 42#define MLXSW_SP_RESOURCE_NAME_KVD "kvd"43#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR "linear"44#define MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE "hash_single"45#define MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE "hash_double"46#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES "singles"47#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks"48#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks"49 50#define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents"51 52#define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters"53#define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow"54#define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif"55 56enum mlxsw_sp_resource_id {57 MLXSW_SP_RESOURCE_KVD = MLXSW_CORE_RESOURCE_MAX,58 MLXSW_SP_RESOURCE_KVD_LINEAR,59 MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,60 MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,61 MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,62 MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,63 MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,64 MLXSW_SP_RESOURCE_SPAN,65 MLXSW_SP_RESOURCE_COUNTERS,66 MLXSW_SP_RESOURCE_COUNTERS_FLOW,67 MLXSW_SP_RESOURCE_COUNTERS_RIF,68 MLXSW_SP_RESOURCE_GLOBAL_POLICERS,69 MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS,70 MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,71 MLXSW_SP_RESOURCE_RIFS,72 MLXSW_SP_RESOURCE_PORT_RANGE_REGISTERS,73};74 75struct mlxsw_sp_port;76struct mlxsw_sp_rif;77struct mlxsw_sp_span_entry;78enum mlxsw_sp_l3proto;79union mlxsw_sp_l3addr;80 81enum mlxsw_sp_rif_type {82 MLXSW_SP_RIF_TYPE_SUBPORT,83 MLXSW_SP_RIF_TYPE_VLAN,84 MLXSW_SP_RIF_TYPE_FID,85 MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */86 MLXSW_SP_RIF_TYPE_MAX,87};88 89struct mlxsw_sp_router_ops;90 91extern const struct mlxsw_sp_router_ops mlxsw_sp1_router_ops;92extern const struct mlxsw_sp_router_ops mlxsw_sp2_router_ops;93 94struct mlxsw_sp_switchdev_ops;95 96extern const struct mlxsw_sp_switchdev_ops mlxsw_sp1_switchdev_ops;97extern const struct mlxsw_sp_switchdev_ops mlxsw_sp2_switchdev_ops;98 99enum mlxsw_sp_fid_type {100 MLXSW_SP_FID_TYPE_8021Q,101 MLXSW_SP_FID_TYPE_8021D,102 MLXSW_SP_FID_TYPE_RFID,103 MLXSW_SP_FID_TYPE_DUMMY,104 MLXSW_SP_FID_TYPE_MAX,105};106 107enum mlxsw_sp_nve_type {108 MLXSW_SP_NVE_TYPE_VXLAN,109};110 111struct mlxsw_sp_sb;112struct mlxsw_sp_bridge;113struct mlxsw_sp_router;114struct mlxsw_sp_mr;115struct mlxsw_sp_acl;116struct mlxsw_sp_counter_pool;117struct mlxsw_sp_fid_core;118struct mlxsw_sp_kvdl;119struct mlxsw_sp_nve;120struct mlxsw_sp_kvdl_ops;121struct mlxsw_sp_mr_tcam_ops;122struct mlxsw_sp_acl_rulei_ops;123struct mlxsw_sp_acl_tcam_ops;124struct mlxsw_sp_nve_ops;125struct mlxsw_sp_sb_ops;126struct mlxsw_sp_sb_vals;127struct mlxsw_sp_port_type_speed_ops;128struct mlxsw_sp_ptp_state;129struct mlxsw_sp_ptp_ops;130struct mlxsw_sp_span_ops;131struct mlxsw_sp_qdisc_state;132struct mlxsw_sp_mall_entry;133struct mlxsw_sp_pgt;134struct mlxsw_sp_lag;135 136struct mlxsw_sp_port_mapping {137 u8 module;138 u8 slot_index;139 u8 width; /* Number of lanes used by the port */140 u8 module_width; /* Number of lanes in the module (static) */141 u8 lane;142};143 144struct mlxsw_sp_port_mapping_events {145 struct list_head queue;146 spinlock_t queue_lock; /* protects queue */147 struct work_struct work;148};149 150struct mlxsw_sp_parsing {151 refcount_t parsing_depth_ref;152 u16 parsing_depth;153 u16 vxlan_udp_dport;154 struct mutex lock; /* Protects parsing configuration */155};156 157struct mlxsw_sp {158 struct mlxsw_sp_port **ports;159 struct mlxsw_core *core;160 const struct mlxsw_bus_info *bus_info;161 unsigned char base_mac[ETH_ALEN];162 const unsigned char *mac_mask;163 struct mlxsw_sp_lag *lags;164 u16 max_lag;165 struct mlxsw_sp_port_mapping *port_mapping;166 struct mlxsw_sp_port_mapping_events port_mapping_events;167 struct rhashtable sample_trigger_ht;168 struct mlxsw_sp_sb *sb;169 struct mlxsw_sp_bridge *bridge;170 struct mlxsw_sp_router *router;171 struct mlxsw_sp_mr *mr;172 struct mlxsw_afa *afa;173 struct mlxsw_sp_acl *acl;174 struct mlxsw_sp_fid_core *fid_core;175 struct mlxsw_sp_policer_core *policer_core;176 struct mlxsw_sp_port_range_core *pr_core;177 struct mlxsw_sp_kvdl *kvdl;178 struct mlxsw_sp_nve *nve;179 struct notifier_block netdevice_nb;180 struct mlxsw_sp_ptp_clock *clock;181 struct mlxsw_sp_ptp_state *ptp_state;182 struct mlxsw_sp_counter_pool *counter_pool;183 struct mlxsw_sp_span *span;184 struct mlxsw_sp_trap *trap;185 struct mlxsw_sp_parsing parsing;186 const struct mlxsw_sp_switchdev_ops *switchdev_ops;187 const struct mlxsw_sp_kvdl_ops *kvdl_ops;188 const struct mlxsw_afa_ops *afa_ops;189 const struct mlxsw_afk_ops *afk_ops;190 const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;191 const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;192 const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;193 const struct mlxsw_sp_acl_bf_ops *acl_bf_ops;194 const struct mlxsw_sp_nve_ops **nve_ops_arr;195 const struct mlxsw_sp_sb_vals *sb_vals;196 const struct mlxsw_sp_sb_ops *sb_ops;197 const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;198 const struct mlxsw_sp_ptp_ops *ptp_ops;199 const struct mlxsw_sp_span_ops *span_ops;200 const struct mlxsw_sp_policer_core_ops *policer_core_ops;201 const struct mlxsw_sp_trap_ops *trap_ops;202 const struct mlxsw_sp_mall_ops *mall_ops;203 const struct mlxsw_sp_router_ops *router_ops;204 const struct mlxsw_listener *listeners;205 const struct mlxsw_sp_fid_core_ops *fid_core_ops;206 size_t listeners_count;207 u32 lowest_shaper_bs;208 struct rhashtable ipv6_addr_ht;209 struct mutex ipv6_addr_ht_lock; /* Protects ipv6_addr_ht */210 struct mlxsw_sp_pgt *pgt;211 bool pgt_smpe_index_valid;212 u16 lag_pgt_base;213};214 215struct mlxsw_sp_ptp_ops {216 struct mlxsw_sp_ptp_clock *217 (*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev);218 void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock);219 220 struct mlxsw_sp_ptp_state *(*init)(struct mlxsw_sp *mlxsw_sp);221 void (*fini)(struct mlxsw_sp_ptp_state *ptp_state);222 223 /* Notify a driver that a packet that might be PTP was received. Driver224 * is responsible for freeing the passed-in SKB.225 */226 void (*receive)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,227 u16 local_port);228 229 /* Notify a driver that a timestamped packet was transmitted. Driver230 * is responsible for freeing the passed-in SKB.231 */232 void (*transmitted)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,233 u16 local_port);234 235 int (*hwtstamp_get)(struct mlxsw_sp_port *mlxsw_sp_port,236 struct hwtstamp_config *config);237 int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port,238 struct hwtstamp_config *config);239 void (*shaper_work)(struct work_struct *work);240 int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp,241 struct kernel_ethtool_ts_info *info);242 int (*get_stats_count)(void);243 void (*get_stats_strings)(u8 **p);244 void (*get_stats)(struct mlxsw_sp_port *mlxsw_sp_port,245 u64 *data, int data_index);246 int (*txhdr_construct)(struct mlxsw_core *mlxsw_core,247 struct mlxsw_sp_port *mlxsw_sp_port,248 struct sk_buff *skb,249 const struct mlxsw_tx_info *tx_info);250};251 252struct mlxsw_sp_fid_core_ops {253 int (*init)(struct mlxsw_sp *mlxsw_sp);254 void (*fini)(struct mlxsw_sp *mlxsw_sp);255};256 257struct mlxsw_sp_port_pcpu_stats {258 u64 rx_packets;259 u64 rx_bytes;260 u64 tx_packets;261 u64 tx_bytes;262 struct u64_stats_sync syncp;263 u32 tx_dropped;264};265 266enum mlxsw_sp_sample_trigger_type {267 MLXSW_SP_SAMPLE_TRIGGER_TYPE_INGRESS,268 MLXSW_SP_SAMPLE_TRIGGER_TYPE_EGRESS,269 MLXSW_SP_SAMPLE_TRIGGER_TYPE_POLICY_ENGINE,270};271 272struct mlxsw_sp_sample_trigger {273 enum mlxsw_sp_sample_trigger_type type;274 u16 local_port; /* Reserved when trigger type is not ingress / egress. */275};276 277struct mlxsw_sp_sample_params {278 struct psample_group *psample_group;279 u32 trunc_size;280 u32 rate;281 bool truncate;282};283 284struct mlxsw_sp_bridge_port;285struct mlxsw_sp_fid;286 287struct mlxsw_sp_port_vlan {288 struct list_head list;289 struct mlxsw_sp_port *mlxsw_sp_port;290 struct mlxsw_sp_fid *fid;291 u16 vid;292 struct mlxsw_sp_bridge_port *bridge_port;293 struct list_head bridge_vlan_node;294};295 296/* No need an internal lock; At worse - miss a single periodic iteration */297struct mlxsw_sp_port_xstats {298 u64 ecn;299 u64 tc_ecn[TC_MAX_QUEUE];300 u64 wred_drop[TC_MAX_QUEUE];301 u64 tail_drop[TC_MAX_QUEUE];302 u64 backlog[TC_MAX_QUEUE];303 u64 tx_bytes[IEEE_8021QAZ_MAX_TCS];304 u64 tx_packets[IEEE_8021QAZ_MAX_TCS];305};306 307struct mlxsw_sp_ptp_port_dir_stats {308 u64 packets;309 u64 timestamps;310};311 312struct mlxsw_sp_ptp_port_stats {313 struct mlxsw_sp_ptp_port_dir_stats rx_gcd;314 struct mlxsw_sp_ptp_port_dir_stats tx_gcd;315};316 317struct mlxsw_sp_port {318 struct net_device *dev;319 struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;320 struct mlxsw_sp *mlxsw_sp;321 u16 local_port;322 u8 lagged:1,323 split:1,324 security:1;325 u16 pvid;326 u16 lag_id;327 struct {328 u8 tx_pause:1,329 rx_pause:1,330 autoneg:1;331 } link;332 struct {333 struct ieee_ets *ets;334 struct ieee_maxrate *maxrate;335 struct ieee_pfc *pfc;336 enum mlxsw_reg_qpts_trust_state trust_state;337 } dcb;338 struct mlxsw_sp_port_mapping mapping; /* mapping is constant during the339 * mlxsw_sp_port lifetime, however340 * the same localport can have341 * different mapping.342 */343 struct {344 #define MLXSW_HW_STATS_UPDATE_TIME HZ345 struct rtnl_link_stats64 stats;346 struct mlxsw_sp_port_xstats xstats;347 struct delayed_work update_dw;348 } periodic_hw_stats;349 struct list_head vlans_list;350 struct mlxsw_sp_port_vlan *default_vlan;351 struct mlxsw_sp_qdisc_state *qdisc;352 unsigned acl_rule_count;353 struct mlxsw_sp_flow_block *ing_flow_block;354 struct mlxsw_sp_flow_block *eg_flow_block;355 struct {356 struct delayed_work shaper_dw;357 struct hwtstamp_config hwtstamp_config;358 u16 ing_types;359 u16 egr_types;360 struct mlxsw_sp_ptp_port_stats stats;361 } ptp;362 u32 max_speed;363 struct mlxsw_sp_hdroom *hdroom;364 u64 module_overheat_initial_val;365};366 367struct mlxsw_sp_port_type_speed_ops {368 void (*from_ptys_supported_port)(struct mlxsw_sp *mlxsw_sp,369 u32 ptys_eth_proto,370 struct ethtool_link_ksettings *cmd);371 void (*from_ptys_link)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto,372 unsigned long *mode);373 u32 (*from_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto);374 void (*from_ptys_link_mode)(struct mlxsw_sp *mlxsw_sp,375 bool carrier_ok, u32 ptys_eth_proto,376 struct ethtool_link_ksettings *cmd);377 int (*ptys_max_speed)(struct mlxsw_sp_port *mlxsw_sp_port, u32 *p_max_speed);378 u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp,379 const struct ethtool_link_ksettings *cmd);380 u32 (*to_ptys_speed_lanes)(struct mlxsw_sp *mlxsw_sp, u8 width,381 const struct ethtool_link_ksettings *cmd);382 void (*reg_ptys_eth_pack)(struct mlxsw_sp *mlxsw_sp, char *payload,383 u16 local_port, u32 proto_admin, bool autoneg);384 void (*reg_ptys_eth_unpack)(struct mlxsw_sp *mlxsw_sp, char *payload,385 u32 *p_eth_proto_cap,386 u32 *p_eth_proto_admin,387 u32 *p_eth_proto_oper);388 u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap);389};390 391struct mlxsw_sp_ports_bitmap {392 unsigned long *bitmap;393 unsigned int nbits;394};395 396static inline int397mlxsw_sp_port_bitmap_init(struct mlxsw_sp *mlxsw_sp,398 struct mlxsw_sp_ports_bitmap *ports_bm)399{400 unsigned int nbits = mlxsw_core_max_ports(mlxsw_sp->core);401 402 ports_bm->nbits = nbits;403 ports_bm->bitmap = bitmap_zalloc(nbits, GFP_KERNEL);404 if (!ports_bm->bitmap)405 return -ENOMEM;406 407 return 0;408}409 410static inline void411mlxsw_sp_port_bitmap_fini(struct mlxsw_sp_ports_bitmap *ports_bm)412{413 bitmap_free(ports_bm->bitmap);414}415 416static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn,417 bool *trap_en)418{419 bool set_ce = false;420 421 *trap_en = !!__INET_ECN_decapsulate(outer_ecn, inner_ecn, &set_ce);422 if (set_ce)423 return INET_ECN_CE;424 else if (outer_ecn == INET_ECN_ECT_1 && inner_ecn == INET_ECN_ECT_0)425 return INET_ECN_ECT_1;426 else427 return inner_ecn;428}429 430static inline struct net_device *431mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev)432{433 struct net_device *dev;434 struct list_head *iter;435 436 netdev_for_each_lower_dev(br_dev, dev, iter) {437 if (netif_is_vxlan(dev))438 return dev;439 }440 441 return NULL;442}443 444static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev)445{446 return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev);447}448 449static inline int450mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid)451{452 struct bridge_vlan_info vinfo;453 u16 vid = 0;454 int err;455 456 err = br_vlan_get_pvid(vxlan_dev, &vid);457 if (err || !vid)458 goto out;459 460 err = br_vlan_get_info(vxlan_dev, vid, &vinfo);461 if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED))462 vid = 0;463 464out:465 *p_vid = vid;466 return err;467}468 469static inline bool470mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)471{472 return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;473}474 475static inline struct mlxsw_sp_port *476mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)477{478 struct mlxsw_sp_port *mlxsw_sp_port;479 u16 local_port;480 481 local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,482 lag_id, port_index);483 mlxsw_sp_port = mlxsw_sp->ports[local_port];484 return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;485}486 487static inline struct mlxsw_sp_port_vlan *488mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,489 u16 vid)490{491 struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;492 493 list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,494 list) {495 if (mlxsw_sp_port_vlan->vid == vid)496 return mlxsw_sp_port_vlan;497 }498 499 return NULL;500}501 502enum mlxsw_sp_flood_type {503 MLXSW_SP_FLOOD_TYPE_UC,504 MLXSW_SP_FLOOD_TYPE_BC,505 MLXSW_SP_FLOOD_TYPE_MC,506 /* For RSP FIDs in CFF mode. */507 MLXSW_SP_FLOOD_TYPE_NOT_UC,508 /* For NVE traffic. */509 MLXSW_SP_FLOOD_TYPE_ANY,510};511 512int mlxsw_sp_port_get_stats_raw(struct net_device *dev, int grp,513 int prio, char *ppcnt_pl);514int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port,515 bool is_up);516int517mlxsw_sp_port_vlan_classification_set(struct mlxsw_sp_port *mlxsw_sp_port,518 bool is_8021ad_tagged,519 bool is_8021q_tagged);520static inline bool521mlxsw_sp_local_port_is_valid(struct mlxsw_sp *mlxsw_sp, u16 local_port)522{523 unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);524 525 return local_port < max_ports && local_port;526}527 528/* spectrum_buffers.c */529struct mlxsw_sp_hdroom_prio {530 /* Number of port buffer associated with this priority. This is the531 * actually configured value.532 */533 u8 buf_idx;534 /* Value of buf_idx deduced from the DCB ETS configuration. */535 u8 ets_buf_idx;536 /* Value of buf_idx taken from the dcbnl_setbuffer configuration. */537 u8 set_buf_idx;538 bool lossy;539};540 541struct mlxsw_sp_hdroom_buf {542 u32 thres_cells;543 u32 size_cells;544 /* Size requirement form dcbnl_setbuffer. */545 u32 set_size_cells;546 bool lossy;547};548 549enum mlxsw_sp_hdroom_mode {550 MLXSW_SP_HDROOM_MODE_DCB,551 MLXSW_SP_HDROOM_MODE_TC,552};553 554#define MLXSW_SP_PB_COUNT 10555 556struct mlxsw_sp_hdroom {557 enum mlxsw_sp_hdroom_mode mode;558 559 struct {560 struct mlxsw_sp_hdroom_prio prio[IEEE_8021Q_MAX_PRIORITIES];561 } prios;562 struct {563 struct mlxsw_sp_hdroom_buf buf[MLXSW_SP_PB_COUNT];564 } bufs;565 struct {566 /* Size actually configured for the internal buffer. Equal to567 * reserve when internal buffer is enabled.568 */569 u32 size_cells;570 /* Space reserved in the headroom for the internal buffer. Port571 * buffers are not allowed to grow into this space.572 */573 u32 reserve_cells;574 bool enable;575 } int_buf;576 int delay_bytes;577 int mtu;578};579 580int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);581void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);582int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);583void mlxsw_sp_port_buffers_fini(struct mlxsw_sp_port *mlxsw_sp_port);584int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,585 unsigned int sb_index, u16 pool_index,586 struct devlink_sb_pool_info *pool_info);587int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,588 unsigned int sb_index, u16 pool_index, u32 size,589 enum devlink_sb_threshold_type threshold_type,590 struct netlink_ext_ack *extack);591int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,592 unsigned int sb_index, u16 pool_index,593 u32 *p_threshold);594int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,595 unsigned int sb_index, u16 pool_index,596 u32 threshold, struct netlink_ext_ack *extack);597int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,598 unsigned int sb_index, u16 tc_index,599 enum devlink_sb_pool_type pool_type,600 u16 *p_pool_index, u32 *p_threshold);601int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,602 unsigned int sb_index, u16 tc_index,603 enum devlink_sb_pool_type pool_type,604 u16 pool_index, u32 threshold,605 struct netlink_ext_ack *extack);606int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,607 unsigned int sb_index);608int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,609 unsigned int sb_index);610int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,611 unsigned int sb_index, u16 pool_index,612 u32 *p_cur, u32 *p_max);613int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,614 unsigned int sb_index, u16 tc_index,615 enum devlink_sb_pool_type pool_type,616 u32 *p_cur, u32 *p_max);617u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);618u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);619void mlxsw_sp_hdroom_prios_reset_buf_idx(struct mlxsw_sp_hdroom *hdroom);620void mlxsw_sp_hdroom_bufs_reset_lossiness(struct mlxsw_sp_hdroom *hdroom);621void mlxsw_sp_hdroom_bufs_reset_sizes(struct mlxsw_sp_port *mlxsw_sp_port,622 struct mlxsw_sp_hdroom *hdroom);623int mlxsw_sp_hdroom_configure(struct mlxsw_sp_port *mlxsw_sp_port,624 const struct mlxsw_sp_hdroom *hdroom);625struct mlxsw_sp_sample_params *626mlxsw_sp_sample_trigger_params_lookup(struct mlxsw_sp *mlxsw_sp,627 const struct mlxsw_sp_sample_trigger *trigger);628int629mlxsw_sp_sample_trigger_params_set(struct mlxsw_sp *mlxsw_sp,630 const struct mlxsw_sp_sample_trigger *trigger,631 const struct mlxsw_sp_sample_params *params,632 struct netlink_ext_ack *extack);633void634mlxsw_sp_sample_trigger_params_unset(struct mlxsw_sp *mlxsw_sp,635 const struct mlxsw_sp_sample_trigger *trigger);636int mlxsw_sp_ipv6_addr_kvdl_index_get(struct mlxsw_sp *mlxsw_sp,637 const struct in6_addr *addr6,638 u32 *p_kvdl_index);639void640mlxsw_sp_ipv6_addr_put(struct mlxsw_sp *mlxsw_sp, const struct in6_addr *addr6);641 642extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals;643extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals;644 645extern const struct mlxsw_sp_sb_ops mlxsw_sp1_sb_ops;646extern const struct mlxsw_sp_sb_ops mlxsw_sp2_sb_ops;647extern const struct mlxsw_sp_sb_ops mlxsw_sp3_sb_ops;648 649/* spectrum_switchdev.c */650int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);651void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);652int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,653 bool adding);654void655mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);656int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,657 struct net_device *brport_dev,658 struct net_device *br_dev,659 struct netlink_ext_ack *extack);660void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,661 struct net_device *brport_dev,662 struct net_device *br_dev);663bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,664 const struct net_device *br_dev);665int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,666 const struct net_device *br_dev,667 const struct net_device *vxlan_dev, u16 vid,668 struct netlink_ext_ack *extack);669void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,670 const struct net_device *vxlan_dev);671extern struct notifier_block mlxsw_sp_switchdev_notifier;672 673/* spectrum.c */674void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,675 u16 local_port, void *priv);676void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,677 u16 local_port);678int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);679int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,680 enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,681 bool dwrr, u8 dwrr_weight);682int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,683 u8 switch_prio, u8 tclass);684int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,685 enum mlxsw_reg_qeec_hr hr, u8 index,686 u8 next_index, u32 maxrate, u8 burst_size);687enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state);688int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,689 u8 state);690int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);691int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,692 bool learn_enable);693int mlxsw_sp_port_security_set(struct mlxsw_sp_port *mlxsw_sp_port,694 bool enable);695int mlxsw_sp_ethtype_to_sver_type(u16 ethtype, u8 *p_sver_type);696int mlxsw_sp_port_egress_ethtype_set(struct mlxsw_sp_port *mlxsw_sp_port,697 u16 ethtype);698int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,699 u16 ethtype);700struct mlxsw_sp_port_vlan *701mlxsw_sp_port_vlan_create(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);702void mlxsw_sp_port_vlan_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);703int mlxsw_sp_port_kill_vid(struct net_device *dev,704 __be16 __always_unused proto, u16 vid);705int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,706 u16 vid_end, bool is_member, bool untagged);707int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,708 unsigned int counter_index, bool clear,709 u64 *packets, u64 *bytes);710int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,711 unsigned int *p_counter_index);712void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,713 unsigned int counter_index);714void mlxsw_sp_txhdr_construct(struct sk_buff *skb,715 const struct mlxsw_tx_info *tx_info);716int mlxsw_sp_txhdr_ptp_data_construct(struct mlxsw_core *mlxsw_core,717 struct mlxsw_sp_port *mlxsw_sp_port,718 struct sk_buff *skb,719 const struct mlxsw_tx_info *tx_info);720bool mlxsw_sp_port_dev_check(const struct net_device *dev);721struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);722struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);723struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);724int mlxsw_sp_parsing_depth_inc(struct mlxsw_sp *mlxsw_sp);725void mlxsw_sp_parsing_depth_dec(struct mlxsw_sp *mlxsw_sp);726int mlxsw_sp_parsing_vxlan_udp_dport_set(struct mlxsw_sp *mlxsw_sp,727 __be16 udp_dport);728 729/* spectrum_dcb.c */730#ifdef CONFIG_MLXSW_SPECTRUM_DCB731int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);732void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);733#else734static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)735{736 return 0;737}738static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)739{}740#endif741 742/* spectrum_router.c */743enum mlxsw_sp_l3proto {744 MLXSW_SP_L3_PROTO_IPV4,745 MLXSW_SP_L3_PROTO_IPV6,746#define MLXSW_SP_L3_PROTO_MAX (MLXSW_SP_L3_PROTO_IPV6 + 1)747};748 749union mlxsw_sp_l3addr {750 __be32 addr4;751 struct in6_addr addr6;752};753 754u16 mlxsw_sp_rif_index(const struct mlxsw_sp_rif *rif);755int mlxsw_sp_rif_subport_port(const struct mlxsw_sp_rif *rif,756 u16 *port, bool *is_lag);757int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,758 struct netlink_ext_ack *extack);759void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);760void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,761 const struct net_device *macvlan_dev);762void763mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);764void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp,765 struct net_device *dev);766bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp,767 const struct net_device *dev);768u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev);769u16 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp);770int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,771 enum mlxsw_sp_l3proto ul_proto,772 const union mlxsw_sp_l3addr *ul_sip,773 u32 tunnel_index);774void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,775 enum mlxsw_sp_l3proto ul_proto,776 const union mlxsw_sp_l3addr *ul_sip);777int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id,778 u16 *vr_id);779int mlxsw_sp_router_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,780 u16 *ul_rif_index);781void mlxsw_sp_router_ul_rif_put(struct mlxsw_sp *mlxsw_sp, u16 ul_rif_index);782 783/* spectrum_kvdl.c */784enum mlxsw_sp_kvdl_entry_type {785 MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,786 MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET,787 MLXSW_SP_KVDL_ENTRY_TYPE_PBS,788 MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,789 MLXSW_SP_KVDL_ENTRY_TYPE_IPV6_ADDRESS,790 MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT,791};792 793static inline unsigned int794mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)795{796 switch (type) {797 case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ:798 case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET:799 case MLXSW_SP_KVDL_ENTRY_TYPE_PBS:800 case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR:801 case MLXSW_SP_KVDL_ENTRY_TYPE_IPV6_ADDRESS:802 case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT:803 default:804 return 1;805 }806}807 808struct mlxsw_sp_kvdl_ops {809 size_t priv_size;810 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);811 void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);812 int (*alloc)(struct mlxsw_sp *mlxsw_sp, void *priv,813 enum mlxsw_sp_kvdl_entry_type type,814 unsigned int entry_count, u32 *p_entry_index);815 void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv,816 enum mlxsw_sp_kvdl_entry_type type,817 unsigned int entry_count, int entry_index);818 int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv,819 enum mlxsw_sp_kvdl_entry_type type,820 unsigned int entry_count,821 unsigned int *p_alloc_count);822 int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv);823};824 825int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);826void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);827int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp,828 enum mlxsw_sp_kvdl_entry_type type,829 unsigned int entry_count, u32 *p_entry_index);830void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp,831 enum mlxsw_sp_kvdl_entry_type type,832 unsigned int entry_count, int entry_index);833int mlxsw_sp_kvdl_alloc_count_query(struct mlxsw_sp *mlxsw_sp,834 enum mlxsw_sp_kvdl_entry_type type,835 unsigned int entry_count,836 unsigned int *p_alloc_count);837 838/* spectrum1_kvdl.c */839extern const struct mlxsw_sp_kvdl_ops mlxsw_sp1_kvdl_ops;840int mlxsw_sp1_kvdl_resources_register(struct mlxsw_core *mlxsw_core);841 842/* spectrum2_kvdl.c */843extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops;844 845enum mlxsw_sp_acl_mangle_field {846 MLXSW_SP_ACL_MANGLE_FIELD_IP_DSFIELD,847 MLXSW_SP_ACL_MANGLE_FIELD_IP_DSCP,848 MLXSW_SP_ACL_MANGLE_FIELD_IP_ECN,849 MLXSW_SP_ACL_MANGLE_FIELD_IP_SPORT,850 MLXSW_SP_ACL_MANGLE_FIELD_IP_DPORT,851 MLXSW_SP_ACL_MANGLE_FIELD_IP4_SIP,852 MLXSW_SP_ACL_MANGLE_FIELD_IP4_DIP,853 MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_1,854 MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_2,855 MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_3,856 MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_4,857 MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_1,858 MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_2,859 MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_3,860 MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_4,861};862 863struct mlxsw_sp_acl_rule_info {864 unsigned int priority;865 struct mlxsw_afk_element_values values;866 struct mlxsw_afa_block *act_block;867 u8 action_created:1,868 ingress_bind_blocker:1,869 egress_bind_blocker:1,870 counter_valid:1,871 policer_index_valid:1,872 ipv6_valid:1,873 src_port_range_reg_valid:1,874 dst_port_range_reg_valid:1;875 unsigned int counter_index;876 u16 policer_index;877 u8 src_port_range_reg_index;878 u8 dst_port_range_reg_index;879 struct {880 u32 prev_val;881 enum mlxsw_sp_acl_mangle_field prev_field;882 } ipv6;883};884 885/* spectrum_flow.c */886struct mlxsw_sp_flow_block {887 struct list_head binding_list;888 struct {889 struct list_head list;890 unsigned int min_prio;891 unsigned int max_prio;892 } mall;893 struct mlxsw_sp_acl_ruleset *ruleset_zero;894 struct mlxsw_sp *mlxsw_sp;895 unsigned int rule_count;896 unsigned int disable_count;897 unsigned int ingress_blocker_rule_count;898 unsigned int egress_blocker_rule_count;899 unsigned int ingress_binding_count;900 unsigned int egress_binding_count;901 struct net *net;902};903 904struct mlxsw_sp_flow_block_binding {905 struct list_head list;906 struct mlxsw_sp_port *mlxsw_sp_port;907 bool ingress;908};909 910static inline struct mlxsw_sp *911mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block *block)912{913 return block->mlxsw_sp;914}915 916static inline unsigned int917mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block *block)918{919 return block ? block->rule_count : 0;920}921 922static inline void923mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block *block)924{925 if (block)926 block->disable_count++;927}928 929static inline void930mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block *block)931{932 if (block)933 block->disable_count--;934}935 936static inline bool937mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block *block)938{939 return block->disable_count;940}941 942static inline bool943mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block *block)944{945 return block->egress_binding_count;946}947 948static inline bool949mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block *block)950{951 return block->ingress_binding_count;952}953 954static inline bool955mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block *block)956{957 return block->ingress_binding_count && block->egress_binding_count;958}959 960struct mlxsw_sp_flow_block *mlxsw_sp_flow_block_create(struct mlxsw_sp *mlxsw_sp,961 struct net *net);962void mlxsw_sp_flow_block_destroy(struct mlxsw_sp_flow_block *block);963int mlxsw_sp_setup_tc_block_clsact(struct mlxsw_sp_port *mlxsw_sp_port,964 struct flow_block_offload *f,965 bool ingress);966 967/* spectrum_acl.c */968struct mlxsw_sp_acl_ruleset;969 970enum mlxsw_sp_acl_profile {971 MLXSW_SP_ACL_PROFILE_FLOWER,972 MLXSW_SP_ACL_PROFILE_MR,973};974 975struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);976struct mlxsw_sp_acl_tcam *mlxsw_sp_acl_to_tcam(struct mlxsw_sp_acl *acl);977 978int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,979 struct mlxsw_sp_flow_block *block,980 struct mlxsw_sp_flow_block_binding *binding);981void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,982 struct mlxsw_sp_flow_block *block,983 struct mlxsw_sp_flow_block_binding *binding);984struct mlxsw_sp_acl_ruleset *985mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp,986 struct mlxsw_sp_flow_block *block, u32 chain_index,987 enum mlxsw_sp_acl_profile profile);988struct mlxsw_sp_acl_ruleset *989mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,990 struct mlxsw_sp_flow_block *block, u32 chain_index,991 enum mlxsw_sp_acl_profile profile,992 struct mlxsw_afk_element_usage *tmplt_elusage);993void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,994 struct mlxsw_sp_acl_ruleset *ruleset);995u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);996void mlxsw_sp_acl_ruleset_prio_get(struct mlxsw_sp_acl_ruleset *ruleset,997 unsigned int *p_min_prio,998 unsigned int *p_max_prio);999 1000struct mlxsw_sp_acl_rule_info *1001mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl,1002 struct mlxsw_afa_block *afa_block);1003void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp *mlxsw_sp,1004 struct mlxsw_sp_acl_rule_info *rulei);1005int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);1006void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,1007 unsigned int priority);1008void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,1009 enum mlxsw_afk_element element,1010 u32 key_value, u32 mask_value);1011void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,1012 enum mlxsw_afk_element element,1013 const char *key_value,1014 const char *mask_value, unsigned int len);1015int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);1016int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,1017 u16 group_id);1018int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei);1019int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei,1020 bool ingress,1021 const struct flow_action_cookie *fa_cookie,1022 struct netlink_ext_ack *extack);1023int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);1024int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp,1025 struct mlxsw_sp_acl_rule_info *rulei,1026 struct mlxsw_sp_flow_block *block,1027 struct net_device *out_dev,1028 struct netlink_ext_ack *extack);1029int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,1030 struct mlxsw_sp_acl_rule_info *rulei,1031 struct net_device *out_dev,1032 struct netlink_ext_ack *extack);1033int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,1034 struct mlxsw_sp_acl_rule_info *rulei,1035 u32 action, u16 vid, u16 proto, u8 prio,1036 struct netlink_ext_ack *extack);1037int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp,1038 struct mlxsw_sp_acl_rule_info *rulei,1039 u32 prio, struct netlink_ext_ack *extack);1040int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,1041 struct mlxsw_sp_acl_rule_info *rulei,1042 enum flow_action_mangle_base htype,1043 u32 offset, u32 mask, u32 val,1044 struct netlink_ext_ack *extack);1045int mlxsw_sp_acl_rulei_act_police(struct mlxsw_sp *mlxsw_sp,1046 struct mlxsw_sp_acl_rule_info *rulei,1047 u32 index, u64 rate_bytes_ps,1048 u32 burst, struct netlink_ext_ack *extack);1049int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,1050 struct mlxsw_sp_acl_rule_info *rulei,1051 struct netlink_ext_ack *extack);1052int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,1053 struct mlxsw_sp_acl_rule_info *rulei,1054 u16 fid, struct netlink_ext_ack *extack);1055int mlxsw_sp_acl_rulei_act_ignore(struct mlxsw_sp *mlxsw_sp,1056 struct mlxsw_sp_acl_rule_info *rulei,1057 bool disable_learning, bool disable_security);1058int mlxsw_sp_acl_rulei_act_sample(struct mlxsw_sp *mlxsw_sp,1059 struct mlxsw_sp_acl_rule_info *rulei,1060 struct mlxsw_sp_flow_block *block,1061 struct psample_group *psample_group, u32 rate,1062 u32 trunc_size, bool truncate,1063 struct netlink_ext_ack *extack);1064 1065struct mlxsw_sp_acl_rule;1066 1067struct mlxsw_sp_acl_rule *1068mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,1069 struct mlxsw_sp_acl_ruleset *ruleset,1070 unsigned long cookie,1071 struct mlxsw_afa_block *afa_block,1072 struct netlink_ext_ack *extack);1073void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,1074 struct mlxsw_sp_acl_rule *rule);1075int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,1076 struct mlxsw_sp_acl_rule *rule);1077void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,1078 struct mlxsw_sp_acl_rule *rule);1079int mlxsw_sp_acl_rule_action_replace(struct mlxsw_sp *mlxsw_sp,1080 struct mlxsw_sp_acl_rule *rule,1081 struct mlxsw_afa_block *afa_block);1082struct mlxsw_sp_acl_rule *1083mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,1084 struct mlxsw_sp_acl_ruleset *ruleset,1085 unsigned long cookie);1086struct mlxsw_sp_acl_rule_info *1087mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);1088int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,1089 struct mlxsw_sp_acl_rule *rule,1090 u64 *packets, u64 *bytes, u64 *drops,1091 u64 *last_use,1092 enum flow_action_hw_stats *used_hw_stats);1093 1094struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);1095 1096static inline const struct flow_action_cookie *1097mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp *mlxsw_sp, u32 cookie_index)1098{1099 return mlxsw_afa_cookie_lookup(mlxsw_sp->afa, cookie_index);1100}1101 1102int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);1103void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);1104 1105struct mlxsw_sp_acl_mangle_action;1106 1107struct mlxsw_sp_acl_rulei_ops {1108 int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei,1109 struct mlxsw_sp_acl_mangle_action *mact, u32 val,1110 struct netlink_ext_ack *extack);1111};1112 1113extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops;1114extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops;1115 1116/* spectrum_acl_tcam.c */1117struct mlxsw_sp_acl_tcam;1118struct mlxsw_sp_acl_tcam_region;1119 1120struct mlxsw_sp_acl_tcam_ops {1121 enum mlxsw_reg_ptar_key_type key_type;1122 size_t priv_size;1123 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv,1124 struct mlxsw_sp_acl_tcam *tcam);1125 void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);1126 size_t region_priv_size;1127 int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,1128 void *tcam_priv,1129 struct mlxsw_sp_acl_tcam_region *region,1130 void *hints_priv);1131 void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);1132 int (*region_associate)(struct mlxsw_sp *mlxsw_sp,1133 struct mlxsw_sp_acl_tcam_region *region);1134 void * (*region_rehash_hints_get)(void *region_priv);1135 void (*region_rehash_hints_put)(void *hints_priv);1136 size_t chunk_priv_size;1137 void (*chunk_init)(void *region_priv, void *chunk_priv,1138 unsigned int priority);1139 void (*chunk_fini)(void *chunk_priv);1140 size_t entry_priv_size;1141 int (*entry_add)(struct mlxsw_sp *mlxsw_sp,1142 void *region_priv, void *chunk_priv,1143 void *entry_priv,1144 struct mlxsw_sp_acl_rule_info *rulei);1145 void (*entry_del)(struct mlxsw_sp *mlxsw_sp,1146 void *region_priv, void *chunk_priv,1147 void *entry_priv);1148 int (*entry_action_replace)(struct mlxsw_sp *mlxsw_sp,1149 void *region_priv, void *entry_priv,1150 struct mlxsw_sp_acl_rule_info *rulei);1151 int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp,1152 void *region_priv, void *entry_priv,1153 bool *activity);1154};1155 1156/* spectrum1_acl_tcam.c */1157extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops;1158 1159/* spectrum2_acl_tcam.c */1160extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops;1161 1162/* spectrum_acl_flex_actions.c */1163extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops;1164extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;1165 1166/* spectrum_acl_flex_keys.c */1167extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;1168extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;1169extern const struct mlxsw_afk_ops mlxsw_sp4_afk_ops;1170 1171/* spectrum_acl_bloom_filter.c */1172extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp2_acl_bf_ops;1173extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp4_acl_bf_ops;1174 1175/* spectrum_matchall.c */1176struct mlxsw_sp_mall_ops {1177 int (*sample_add)(struct mlxsw_sp *mlxsw_sp,1178 struct mlxsw_sp_port *mlxsw_sp_port,1179 struct mlxsw_sp_mall_entry *mall_entry,1180 struct netlink_ext_ack *extack);1181 void (*sample_del)(struct mlxsw_sp *mlxsw_sp,1182 struct mlxsw_sp_port *mlxsw_sp_port,1183 struct mlxsw_sp_mall_entry *mall_entry);1184};1185 1186extern const struct mlxsw_sp_mall_ops mlxsw_sp1_mall_ops;1187extern const struct mlxsw_sp_mall_ops mlxsw_sp2_mall_ops;1188 1189enum mlxsw_sp_mall_action_type {1190 MLXSW_SP_MALL_ACTION_TYPE_MIRROR,1191 MLXSW_SP_MALL_ACTION_TYPE_SAMPLE,1192 MLXSW_SP_MALL_ACTION_TYPE_TRAP,1193};1194 1195struct mlxsw_sp_mall_mirror_entry {1196 const struct net_device *to_dev;1197 int span_id;1198};1199 1200struct mlxsw_sp_mall_trap_entry {1201 int span_id;1202};1203 1204struct mlxsw_sp_mall_sample_entry {1205 struct mlxsw_sp_sample_params params;1206 int span_id; /* Relevant for Spectrum-2 onwards. */1207};1208 1209struct mlxsw_sp_mall_entry {1210 struct list_head list;1211 unsigned long cookie;1212 unsigned int priority;1213 enum mlxsw_sp_mall_action_type type;1214 bool ingress;1215 union {1216 struct mlxsw_sp_mall_mirror_entry mirror;1217 struct mlxsw_sp_mall_trap_entry trap;1218 struct mlxsw_sp_mall_sample_entry sample;1219 };1220 struct rcu_head rcu;1221};1222 1223int mlxsw_sp_mall_replace(struct mlxsw_sp *mlxsw_sp,1224 struct mlxsw_sp_flow_block *block,1225 struct tc_cls_matchall_offload *f);1226void mlxsw_sp_mall_destroy(struct mlxsw_sp_flow_block *block,1227 struct tc_cls_matchall_offload *f);1228int mlxsw_sp_mall_port_bind(struct mlxsw_sp_flow_block *block,1229 struct mlxsw_sp_port *mlxsw_sp_port,1230 struct netlink_ext_ack *extack);1231void mlxsw_sp_mall_port_unbind(struct mlxsw_sp_flow_block *block,1232 struct mlxsw_sp_port *mlxsw_sp_port);1233int mlxsw_sp_mall_prio_get(struct mlxsw_sp_flow_block *block, u32 chain_index,1234 unsigned int *p_min_prio, unsigned int *p_max_prio);1235 1236/* spectrum_flower.c */1237int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp,1238 struct mlxsw_sp_flow_block *block,1239 struct flow_cls_offload *f);1240void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp,1241 struct mlxsw_sp_flow_block *block,1242 struct flow_cls_offload *f);1243int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,1244 struct mlxsw_sp_flow_block *block,1245 struct flow_cls_offload *f);1246int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp,1247 struct mlxsw_sp_flow_block *block,1248 struct flow_cls_offload *f);1249void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp,1250 struct mlxsw_sp_flow_block *block,1251 struct flow_cls_offload *f);1252int mlxsw_sp_flower_prio_get(struct mlxsw_sp *mlxsw_sp,1253 struct mlxsw_sp_flow_block *block,1254 u32 chain_index, unsigned int *p_min_prio,1255 unsigned int *p_max_prio);1256 1257/* spectrum_qdisc.c */1258int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port);1259void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port);1260int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,1261 struct tc_red_qopt_offload *p);1262int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,1263 struct tc_prio_qopt_offload *p);1264int mlxsw_sp_setup_tc_ets(struct mlxsw_sp_port *mlxsw_sp_port,1265 struct tc_ets_qopt_offload *p);1266int mlxsw_sp_setup_tc_tbf(struct mlxsw_sp_port *mlxsw_sp_port,1267 struct tc_tbf_qopt_offload *p);1268int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,1269 struct tc_fifo_qopt_offload *p);1270int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_port,1271 struct flow_block_offload *f);1272int mlxsw_sp_setup_tc_block_qevent_mark(struct mlxsw_sp_port *mlxsw_sp_port,1273 struct flow_block_offload *f);1274 1275/* spectrum_fid.c */1276struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,1277 u16 fid_index);1278int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);1279int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,1280 enum mlxsw_sp_nve_type *p_type);1281struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp,1282 __be32 vni);1283int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni);1284int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,1285 u32 nve_flood_index);1286void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid);1287bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid);1288int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,1289 __be32 vni, int nve_ifindex);1290void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid);1291bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid);1292void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,1293 const struct net_device *nve_dev);1294int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,1295 enum mlxsw_sp_flood_type packet_type, u16 local_port,1296 bool member);1297int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,1298 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);1299void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,1300 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);1301u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);1302enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);1303int mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);1304void mlxsw_sp_fid_rif_unset(struct mlxsw_sp_fid *fid);1305struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid);1306enum mlxsw_sp_rif_type1307mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,1308 enum mlxsw_sp_fid_type type);1309u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);1310struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);1311struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,1312 int br_ifindex);1313struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp,1314 u16 vid);1315struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp,1316 int br_ifindex);1317struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,1318 u16 rif_index);1319struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);1320void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);1321int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);1322void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);1323int mlxsw_sp_fid_port_join_lag(const struct mlxsw_sp_port *mlxsw_sp_port);1324void mlxsw_sp_fid_port_leave_lag(const struct mlxsw_sp_port *mlxsw_sp_port);1325 1326extern const struct mlxsw_sp_fid_core_ops mlxsw_sp1_fid_core_ops;1327extern const struct mlxsw_sp_fid_core_ops mlxsw_sp2_fid_core_ops;1328 1329/* spectrum_mr.c */1330enum mlxsw_sp_mr_route_prio {1331 MLXSW_SP_MR_ROUTE_PRIO_SG,1332 MLXSW_SP_MR_ROUTE_PRIO_STARG,1333 MLXSW_SP_MR_ROUTE_PRIO_CATCHALL,1334 __MLXSW_SP_MR_ROUTE_PRIO_MAX1335};1336 1337#define MLXSW_SP_MR_ROUTE_PRIO_MAX (__MLXSW_SP_MR_ROUTE_PRIO_MAX - 1)1338 1339struct mlxsw_sp_mr_route_key;1340 1341struct mlxsw_sp_mr_tcam_ops {1342 size_t priv_size;1343 int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);1344 void (*fini)(void *priv);1345 size_t route_priv_size;1346 int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv,1347 void *route_priv,1348 struct mlxsw_sp_mr_route_key *key,1349 struct mlxsw_afa_block *afa_block,1350 enum mlxsw_sp_mr_route_prio prio);1351 void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv,1352 void *route_priv,1353 struct mlxsw_sp_mr_route_key *key);1354 int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv,1355 struct mlxsw_sp_mr_route_key *key,1356 struct mlxsw_afa_block *afa_block);1357};1358 1359/* spectrum1_mr_tcam.c */1360extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp1_mr_tcam_ops;1361 1362/* spectrum2_mr_tcam.c */1363extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops;1364 1365/* spectrum_nve.c */1366struct mlxsw_sp_nve_params {1367 enum mlxsw_sp_nve_type type;1368 __be32 vni;1369 const struct net_device *dev;1370 u16 ethertype;1371};1372 1373extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[];1374extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[];1375 1376int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip,1377 enum mlxsw_sp_l3proto proto,1378 union mlxsw_sp_l3addr *addr);1379int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp,1380 struct mlxsw_sp_fid *fid,1381 enum mlxsw_sp_l3proto proto,1382 union mlxsw_sp_l3addr *addr);1383void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp,1384 struct mlxsw_sp_fid *fid,1385 enum mlxsw_sp_l3proto proto,1386 union mlxsw_sp_l3addr *addr);1387int mlxsw_sp_nve_ipv6_addr_kvdl_set(struct mlxsw_sp *mlxsw_sp,1388 const struct in6_addr *addr6,1389 u32 *p_kvdl_index);1390void mlxsw_sp_nve_ipv6_addr_kvdl_unset(struct mlxsw_sp *mlxsw_sp,1391 const struct in6_addr *addr6);1392int1393mlxsw_sp_nve_ipv6_addr_map_replace(struct mlxsw_sp *mlxsw_sp, const char *mac,1394 u16 fid_index,1395 const struct in6_addr *new_addr6);1396void mlxsw_sp_nve_ipv6_addr_map_del(struct mlxsw_sp *mlxsw_sp, const char *mac,1397 u16 fid_index);1398int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,1399 struct mlxsw_sp_nve_params *params,1400 struct netlink_ext_ack *extack);1401void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp,1402 struct mlxsw_sp_fid *fid);1403int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port);1404void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port);1405int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp);1406void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp);1407 1408/* spectrum_trap.c */1409int mlxsw_sp_devlink_traps_init(struct mlxsw_sp *mlxsw_sp);1410void mlxsw_sp_devlink_traps_fini(struct mlxsw_sp *mlxsw_sp);1411int mlxsw_sp_trap_init(struct mlxsw_core *mlxsw_core,1412 const struct devlink_trap *trap, void *trap_ctx);1413void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core,1414 const struct devlink_trap *trap, void *trap_ctx);1415int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,1416 const struct devlink_trap *trap,1417 enum devlink_trap_action action,1418 struct netlink_ext_ack *extack);1419int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,1420 const struct devlink_trap_group *group);1421int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,1422 const struct devlink_trap_group *group,1423 const struct devlink_trap_policer *policer,1424 struct netlink_ext_ack *extack);1425int1426mlxsw_sp_trap_policer_init(struct mlxsw_core *mlxsw_core,1427 const struct devlink_trap_policer *policer);1428void mlxsw_sp_trap_policer_fini(struct mlxsw_core *mlxsw_core,1429 const struct devlink_trap_policer *policer);1430int1431mlxsw_sp_trap_policer_set(struct mlxsw_core *mlxsw_core,1432 const struct devlink_trap_policer *policer,1433 u64 rate, u64 burst, struct netlink_ext_ack *extack);1434int1435mlxsw_sp_trap_policer_counter_get(struct mlxsw_core *mlxsw_core,1436 const struct devlink_trap_policer *policer,1437 u64 *p_drops);1438int mlxsw_sp_trap_group_policer_hw_id_get(struct mlxsw_sp *mlxsw_sp, u16 id,1439 bool *p_enabled, u16 *p_hw_id);1440 1441static inline struct net *mlxsw_sp_net(struct mlxsw_sp *mlxsw_sp)1442{1443 return mlxsw_core_net(mlxsw_sp->core);1444}1445 1446/* spectrum_ethtool.c */1447extern const struct ethtool_ops mlxsw_sp_port_ethtool_ops;1448extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp1_port_type_speed_ops;1449extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp2_port_type_speed_ops;1450 1451/* spectrum_policer.c */1452extern const struct mlxsw_sp_policer_core_ops mlxsw_sp1_policer_core_ops;1453extern const struct mlxsw_sp_policer_core_ops mlxsw_sp2_policer_core_ops;1454 1455enum mlxsw_sp_policer_type {1456 MLXSW_SP_POLICER_TYPE_SINGLE_RATE,1457 1458 __MLXSW_SP_POLICER_TYPE_MAX,1459 MLXSW_SP_POLICER_TYPE_MAX = __MLXSW_SP_POLICER_TYPE_MAX - 1,1460};1461 1462struct mlxsw_sp_policer_params {1463 u64 rate;1464 u64 burst;1465 bool bytes;1466};1467 1468int mlxsw_sp_policer_add(struct mlxsw_sp *mlxsw_sp,1469 enum mlxsw_sp_policer_type type,1470 const struct mlxsw_sp_policer_params *params,1471 struct netlink_ext_ack *extack, u16 *p_policer_index);1472void mlxsw_sp_policer_del(struct mlxsw_sp *mlxsw_sp,1473 enum mlxsw_sp_policer_type type,1474 u16 policer_index);1475int mlxsw_sp_policer_drops_counter_get(struct mlxsw_sp *mlxsw_sp,1476 enum mlxsw_sp_policer_type type,1477 u16 policer_index, u64 *p_drops);1478int mlxsw_sp_policers_init(struct mlxsw_sp *mlxsw_sp);1479void mlxsw_sp_policers_fini(struct mlxsw_sp *mlxsw_sp);1480int mlxsw_sp_policer_resources_register(struct mlxsw_core *mlxsw_core);1481 1482/* spectrum_pgt.c */1483int mlxsw_sp_pgt_mid_alloc(struct mlxsw_sp *mlxsw_sp, u16 *p_mid);1484void mlxsw_sp_pgt_mid_free(struct mlxsw_sp *mlxsw_sp, u16 mid_base);1485int mlxsw_sp_pgt_mid_alloc_range(struct mlxsw_sp *mlxsw_sp, u16 *mid_base,1486 u16 count);1487void mlxsw_sp_pgt_mid_free_range(struct mlxsw_sp *mlxsw_sp, u16 mid_base,1488 u16 count);1489int mlxsw_sp_pgt_entry_port_set(struct mlxsw_sp *mlxsw_sp, u16 mid,1490 u16 smpe, u16 local_port, bool member);1491int mlxsw_sp_pgt_init(struct mlxsw_sp *mlxsw_sp);1492void mlxsw_sp_pgt_fini(struct mlxsw_sp *mlxsw_sp);1493 1494/* spectrum_port_range.c */1495struct mlxsw_sp_port_range {1496 u16 min;1497 u16 max;1498 u8 source:1; /* Source or destination */1499};1500 1501int mlxsw_sp_port_range_reg_get(struct mlxsw_sp *mlxsw_sp,1502 const struct mlxsw_sp_port_range *range,1503 struct netlink_ext_ack *extack,1504 u8 *p_prr_index);1505void mlxsw_sp_port_range_reg_put(struct mlxsw_sp *mlxsw_sp, u8 prr_index);1506int mlxsw_sp_port_range_init(struct mlxsw_sp *mlxsw_sp);1507void mlxsw_sp_port_range_fini(struct mlxsw_sp *mlxsw_sp);1508#endif1509