brintos

brintos / linux-shallow public Read only

0
0
Text · 51.4 KiB · 8d3c612 Raw
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