spectrum.h 38.3 KB
Newer Older
1 2
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
/* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
3 4 5 6 7 8

#ifndef _MLXSW_SPECTRUM_H
#define _MLXSW_SPECTRUM_H

#include <linux/types.h>
#include <linux/netdevice.h>
9
#include <linux/rhashtable.h>
10
#include <linux/bitops.h>
11
#include <linux/if_bridge.h>
12
#include <linux/if_vlan.h>
13
#include <linux/list.h>
14
#include <linux/dcbnl.h>
15
#include <linux/in6.h>
16
#include <linux/notifier.h>
17
#include <linux/net_namespace.h>
18
#include <net/psample.h>
19
#include <net/pkt_cls.h>
20
#include <net/red.h>
21
#include <net/vxlan.h>
22
#include <net/flow_offload.h>
23

24
#include "port.h"
25
#include "core.h"
26 27
#include "core_acl_flex_keys.h"
#include "core_acl_flex_actions.h"
28
#include "reg.h"
29

30
#define MLXSW_SP_DEFAULT_VID (VLAN_N_VID - 1)
31

32
#define MLXSW_SP_FID_8021D_MAX 1024
33

34 35
#define MLXSW_SP_MID_MAX 7000

36
#define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
37
#define MLXSW_SP_KVD_GRANULARITY 128
38

39 40 41 42
#define MLXSW_SP_RESOURCE_NAME_KVD "kvd"
#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR "linear"
#define MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE "hash_single"
#define MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE "hash_double"
43 44 45
#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES "singles"
#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks"
#define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks"
46

47 48
#define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents"

49 50 51 52
#define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif"

53
enum mlxsw_sp_resource_id {
54
	MLXSW_SP_RESOURCE_KVD = 1,
55 56 57
	MLXSW_SP_RESOURCE_KVD_LINEAR,
	MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
	MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
58 59 60
	MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
	MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
	MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
61
	MLXSW_SP_RESOURCE_SPAN,
62 63 64
	MLXSW_SP_RESOURCE_COUNTERS,
	MLXSW_SP_RESOURCE_COUNTERS_FLOW,
	MLXSW_SP_RESOURCE_COUNTERS_RIF,
65 66
};

67
struct mlxsw_sp_port;
68
struct mlxsw_sp_rif;
69
struct mlxsw_sp_span_entry;
70 71
enum mlxsw_sp_l3proto;
union mlxsw_sp_l3addr;
72

73 74 75 76 77
struct mlxsw_sp_upper {
	struct net_device *dev;
	unsigned int ref_count;
};

78 79 80 81
enum mlxsw_sp_rif_type {
	MLXSW_SP_RIF_TYPE_SUBPORT,
	MLXSW_SP_RIF_TYPE_VLAN,
	MLXSW_SP_RIF_TYPE_FID,
82
	MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */
83 84 85
	MLXSW_SP_RIF_TYPE_MAX,
};

86 87 88 89 90
struct mlxsw_sp_rif_ops;

extern const struct mlxsw_sp_rif_ops *mlxsw_sp1_rif_ops_arr[];
extern const struct mlxsw_sp_rif_ops *mlxsw_sp2_rif_ops_arr[];

91 92 93 94 95 96
enum mlxsw_sp_fid_type {
	MLXSW_SP_FID_TYPE_8021Q,
	MLXSW_SP_FID_TYPE_8021D,
	MLXSW_SP_FID_TYPE_RFID,
	MLXSW_SP_FID_TYPE_DUMMY,
	MLXSW_SP_FID_TYPE_MAX,
97 98
};

99 100 101 102
enum mlxsw_sp_nve_type {
	MLXSW_SP_NVE_TYPE_VXLAN,
};

103 104 105
struct mlxsw_sp_mid {
	struct list_head list;
	unsigned char addr[ETH_ALEN];
106
	u16 fid;
107
	u16 mid;
108
	bool in_hw;
109
	unsigned long *ports_in_mid; /* bits array */
110 111
};

112
struct mlxsw_sp_sb;
113
struct mlxsw_sp_bridge;
114
struct mlxsw_sp_router;
115
struct mlxsw_sp_mr;
116
struct mlxsw_sp_acl;
117
struct mlxsw_sp_counter_pool;
118
struct mlxsw_sp_fid_core;
119
struct mlxsw_sp_kvdl;
120
struct mlxsw_sp_nve;
121
struct mlxsw_sp_kvdl_ops;
122
struct mlxsw_sp_mr_tcam_ops;
123
struct mlxsw_sp_acl_tcam_ops;
124
struct mlxsw_sp_nve_ops;
125
struct mlxsw_sp_sb_vals;
126
struct mlxsw_sp_port_type_speed_ops;
127
struct mlxsw_sp_ptp_state;
128
struct mlxsw_sp_ptp_ops;
129
struct mlxsw_sp_span_ops;
130
struct mlxsw_sp_qdisc_state;
131

132 133 134 135 136 137
struct mlxsw_sp_port_mapping {
	u8 module;
	u8 width;
	u8 lane;
};

138 139 140 141 142
struct mlxsw_sp {
	struct mlxsw_sp_port **ports;
	struct mlxsw_core *core;
	const struct mlxsw_bus_info *bus_info;
	unsigned char base_mac[ETH_ALEN];
143
	const unsigned char *mac_mask;
144
	struct mlxsw_sp_upper *lags;
145
	struct mlxsw_sp_port_mapping **port_mapping;
146
	struct mlxsw_sp_sb *sb;
147
	struct mlxsw_sp_bridge *bridge;
148
	struct mlxsw_sp_router *router;
149
	struct mlxsw_sp_mr *mr;
150
	struct mlxsw_afa *afa;
151
	struct mlxsw_sp_acl *acl;
152
	struct mlxsw_sp_fid_core *fid_core;
153
	struct mlxsw_sp_kvdl *kvdl;
154
	struct mlxsw_sp_nve *nve;
155
	struct notifier_block netdevice_nb;
156
	struct mlxsw_sp_ptp_clock *clock;
157
	struct mlxsw_sp_ptp_state *ptp_state;
158
	struct mlxsw_sp_counter_pool *counter_pool;
159
	struct mlxsw_sp_span *span;
160
	struct mlxsw_sp_trap *trap;
161 162
	const struct mlxsw_fw_rev *req_rev;
	const char *fw_filename;
163
	const struct mlxsw_sp_kvdl_ops *kvdl_ops;
164
	const struct mlxsw_afa_ops *afa_ops;
165
	const struct mlxsw_afk_ops *afk_ops;
166
	const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
167
	const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
168
	const struct mlxsw_sp_nve_ops **nve_ops_arr;
169
	const struct mlxsw_sp_rif_ops **rif_ops_arr;
170
	const struct mlxsw_sp_sb_vals *sb_vals;
171
	const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;
172
	const struct mlxsw_sp_ptp_ops *ptp_ops;
173
	const struct mlxsw_sp_span_ops *span_ops;
174 175
	const struct mlxsw_listener *listeners;
	size_t listeners_count;
176
	u32 lowest_shaper_bs;
177 178
};

179 180 181 182 183 184
static inline struct mlxsw_sp_upper *
mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
{
	return &mlxsw_sp->lags[lag_id];
}

185 186 187 188 189 190 191 192 193
struct mlxsw_sp_port_pcpu_stats {
	u64			rx_packets;
	u64			rx_bytes;
	u64			tx_packets;
	u64			tx_bytes;
	struct u64_stats_sync	syncp;
	u32			tx_dropped;
};

194
struct mlxsw_sp_port_sample {
195
	struct psample_group *psample_group;
196 197 198 199 200
	u32 trunc_size;
	u32 rate;
	bool truncate;
};

201
struct mlxsw_sp_bridge_port;
202
struct mlxsw_sp_fid;
203

204 205 206 207 208
struct mlxsw_sp_port_vlan {
	struct list_head list;
	struct mlxsw_sp_port *mlxsw_sp_port;
	struct mlxsw_sp_fid *fid;
	u16 vid;
209 210
	struct mlxsw_sp_bridge_port *bridge_port;
	struct list_head bridge_vlan_node;
211 212
};

213 214 215 216 217 218
/* No need an internal lock; At worse - miss a single periodic iteration */
struct mlxsw_sp_port_xstats {
	u64 ecn;
	u64 wred_drop[TC_MAX_QUEUE];
	u64 tail_drop[TC_MAX_QUEUE];
	u64 backlog[TC_MAX_QUEUE];
219 220
	u64 tx_bytes[IEEE_8021QAZ_MAX_TCS];
	u64 tx_packets[IEEE_8021QAZ_MAX_TCS];
221 222
};

223 224 225 226 227 228 229 230 231 232
struct mlxsw_sp_ptp_port_dir_stats {
	u64 packets;
	u64 timestamps;
};

struct mlxsw_sp_ptp_port_stats {
	struct mlxsw_sp_ptp_port_dir_stats rx_gcd;
	struct mlxsw_sp_ptp_port_dir_stats tx_gcd;
};

233 234 235 236 237
struct mlxsw_sp_port {
	struct net_device *dev;
	struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
	struct mlxsw_sp *mlxsw_sp;
	u8 local_port;
238
	u8 lagged:1,
239
	   split:1;
240
	u16 pvid;
241
	u16 lag_id;
242 243
	struct {
		u8 tx_pause:1,
244 245
		   rx_pause:1,
		   autoneg:1;
246
	} link;
247 248
	struct {
		struct ieee_ets *ets;
249
		struct ieee_maxrate *maxrate;
250
		struct ieee_pfc *pfc;
251
		enum mlxsw_reg_qpts_trust_state trust_state;
252
	} dcb;
253 254 255 256 257
	struct mlxsw_sp_port_mapping mapping; /* mapping is constant during the
					       * mlxsw_sp_port lifetime, however
					       * the same localport can have
					       * different mapping.
					       */
258 259
	struct {
		#define MLXSW_HW_STATS_UPDATE_TIME HZ
260
		struct rtnl_link_stats64 stats;
261
		struct mlxsw_sp_port_xstats xstats;
262
		struct delayed_work update_dw;
263
	} periodic_hw_stats;
264
	struct mlxsw_sp_port_sample __rcu *sample;
265
	struct list_head vlans_list;
266
	struct mlxsw_sp_port_vlan *default_vlan;
267
	struct mlxsw_sp_qdisc_state *qdisc;
268
	unsigned acl_rule_count;
269 270
	struct mlxsw_sp_flow_block *ing_flow_block;
	struct mlxsw_sp_flow_block *eg_flow_block;
271
	struct {
272
		struct delayed_work shaper_dw;
273 274 275
		struct hwtstamp_config hwtstamp_config;
		u16 ing_types;
		u16 egr_types;
276
		struct mlxsw_sp_ptp_port_stats stats;
277
	} ptp;
278
	u8 split_base_local_port;
279 280 281
	struct {
		struct delayed_work speed_update_dw;
	} span;
282 283
};

284 285 286 287 288
struct mlxsw_sp_port_type_speed_ops {
	void (*from_ptys_supported_port)(struct mlxsw_sp *mlxsw_sp,
					 u32 ptys_eth_proto,
					 struct ethtool_link_ksettings *cmd);
	void (*from_ptys_link)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto,
289
			       u8 width, unsigned long *mode);
290
	u32 (*from_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto);
291 292 293
	void (*from_ptys_speed_duplex)(struct mlxsw_sp *mlxsw_sp,
				       bool carrier_ok, u32 ptys_eth_proto,
				       struct ethtool_link_ksettings *cmd);
294
	u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp, u8 width,
295
				   const struct ethtool_link_ksettings *cmd);
296
	u32 (*to_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u8 width, u32 speed);
297 298 299 300 301 302 303 304
	void (*reg_ptys_eth_pack)(struct mlxsw_sp *mlxsw_sp, char *payload,
				  u8 local_port, u32 proto_admin, bool autoneg);
	void (*reg_ptys_eth_unpack)(struct mlxsw_sp *mlxsw_sp, char *payload,
				    u32 *p_eth_proto_cap,
				    u32 *p_eth_proto_admin,
				    u32 *p_eth_proto_oper);
};

305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
static inline struct net_device *
mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev)
{
	struct net_device *dev;
	struct list_head *iter;

	netdev_for_each_lower_dev(br_dev, dev, iter) {
		if (netif_is_vxlan(dev))
			return dev;
	}

	return NULL;
}

static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev)
{
	return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev);
}

324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343
static inline int
mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid)
{
	struct bridge_vlan_info vinfo;
	u16 vid = 0;
	int err;

	err = br_vlan_get_pvid(vxlan_dev, &vid);
	if (err || !vid)
		goto out;

	err = br_vlan_get_info(vxlan_dev, vid, &vinfo);
	if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED))
		vid = 0;

out:
	*p_vid = vid;
	return err;
}

344 345 346 347 348 349
static inline bool
mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
{
	return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
}

350 351 352 353 354 355 356 357 358 359 360 361
static inline struct mlxsw_sp_port *
mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
{
	struct mlxsw_sp_port *mlxsw_sp_port;
	u8 local_port;

	local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
						lag_id, port_index);
	mlxsw_sp_port = mlxsw_sp->ports[local_port];
	return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
}

362 363 364 365 366 367 368 369 370 371 372 373 374 375 376
static inline struct mlxsw_sp_port_vlan *
mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
			       u16 vid)
{
	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;

	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
			    list) {
		if (mlxsw_sp_port_vlan->vid == vid)
			return mlxsw_sp_port_vlan;
	}

	return NULL;
}

377 378 379 380
enum mlxsw_sp_flood_type {
	MLXSW_SP_FLOOD_TYPE_UC,
	MLXSW_SP_FLOOD_TYPE_BC,
	MLXSW_SP_FLOOD_TYPE_MC,
381 382
};

383
/* spectrum_buffers.c */
384
int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
385
void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
386
int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
387 388 389 390 391
int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
			 unsigned int sb_index, u16 pool_index,
			 struct devlink_sb_pool_info *pool_info);
int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
			 unsigned int sb_index, u16 pool_index, u32 size,
392 393
			 enum devlink_sb_threshold_type threshold_type,
			 struct netlink_ext_ack *extack);
394 395 396 397 398
int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
			      unsigned int sb_index, u16 pool_index,
			      u32 *p_threshold);
int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
			      unsigned int sb_index, u16 pool_index,
399
			      u32 threshold, struct netlink_ext_ack *extack);
400 401 402 403 404 405 406
int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
				 unsigned int sb_index, u16 tc_index,
				 enum devlink_sb_pool_type pool_type,
				 u16 *p_pool_index, u32 *p_threshold);
int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
				 unsigned int sb_index, u16 tc_index,
				 enum devlink_sb_pool_type pool_type,
407 408
				 u16 pool_index, u32 threshold,
				 struct netlink_ext_ack *extack);
409 410 411 412 413 414 415 416 417 418 419
int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
			     unsigned int sb_index);
int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
			      unsigned int sb_index);
int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
				  unsigned int sb_index, u16 pool_index,
				  u32 *p_cur, u32 *p_max);
int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
				     unsigned int sb_index, u16 tc_index,
				     enum devlink_sb_pool_type pool_type,
				     u32 *p_cur, u32 *p_max);
420 421
u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);
u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);
422
u32 mlxsw_sp_sb_max_headroom_cells(const struct mlxsw_sp *mlxsw_sp);
423

424 425 426
extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals;
extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals;

427
/* spectrum_switchdev.c */
428 429
int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
430 431
int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
			bool adding);
432 433 434 435
void
mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
			      struct net_device *brport_dev,
436 437
			      struct net_device *br_dev,
			      struct netlink_ext_ack *extack);
438 439 440
void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
				struct net_device *brport_dev,
				struct net_device *br_dev);
441 442
bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
					 const struct net_device *br_dev);
443 444
int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
			       const struct net_device *br_dev,
445
			       const struct net_device *vxlan_dev, u16 vid,
446 447 448
			       struct netlink_ext_ack *extack);
void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
				 const struct net_device *vxlan_dev);
449
extern struct notifier_block mlxsw_sp_switchdev_notifier;
450

451
/* spectrum.c */
452 453
void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
				       u8 local_port, void *priv);
454 455
void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
			  u8 local_port);
456
int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);
457 458 459 460 461 462
int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
			  enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
			  bool dwrr, u8 dwrr_weight);
int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
			      u8 switch_prio, u8 tclass);
int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
463 464
				 u8 *prio_tc, bool pause_en,
				 struct ieee_pfc *my_pfc);
465 466
int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
				  enum mlxsw_reg_qeec_hr hr, u8 index,
467
				  u8 next_index, u32 maxrate, u8 burst_size);
468
enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state);
469 470
int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
			      u8 state);
471
int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
472 473
int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
				   bool learn_enable);
474
int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
475
struct mlxsw_sp_port_vlan *
476 477
mlxsw_sp_port_vlan_create(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
void mlxsw_sp_port_vlan_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
478 479 480 481 482 483 484 485 486
int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
			   u16 vid_end, bool is_member, bool untagged);
int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
			      unsigned int counter_index, u64 *packets,
			      u64 *bytes);
int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,
				unsigned int *p_counter_index);
void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,
				unsigned int counter_index);
487
u32 mlxsw_sp_span_buffsize_get(struct mlxsw_sp *mlxsw_sp, int mtu, u32 speed);
488 489 490 491 492
bool mlxsw_sp_port_dev_check(const struct net_device *dev);
struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);
struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);
struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port);
493
struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
494

495
/* spectrum_dcb.c */
496 497 498 499 500 501 502 503 504 505 506 507
#ifdef CONFIG_MLXSW_SPECTRUM_DCB
int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
#else
static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
{
	return 0;
}
static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
{}
#endif

508
/* spectrum_router.c */
509 510 511 512 513 514 515 516 517 518 519
enum mlxsw_sp_l3proto {
	MLXSW_SP_L3_PROTO_IPV4,
	MLXSW_SP_L3_PROTO_IPV6,
#define MLXSW_SP_L3_PROTO_MAX	(MLXSW_SP_L3_PROTO_IPV6 + 1)
};

union mlxsw_sp_l3addr {
	__be32 addr4;
	struct in6_addr addr6;
};

520 521
int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
			 struct netlink_ext_ack *extack);
522
void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
523 524
int mlxsw_sp_netdevice_router_port_event(struct net_device *dev,
					 unsigned long event, void *ptr);
525 526
void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,
			      const struct net_device *macvlan_dev);
527 528 529 530
int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
				  unsigned long event, void *ptr);
int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
				   unsigned long event, void *ptr);
531 532
int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
				 struct netdev_notifier_changeupper_info *info);
533 534
bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp,
				const struct net_device *dev);
535
bool mlxsw_sp_netdev_is_ipip_ul(struct mlxsw_sp *mlxsw_sp,
536
				const struct net_device *dev);
537 538 539 540
int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp,
				     struct net_device *l3_dev,
				     unsigned long event,
				     struct netdev_notifier_info *info);
541 542 543 544 545
int
mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp,
				 struct net_device *l3_dev,
				 unsigned long event,
				 struct netdev_notifier_info *info);
546 547
void
mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
548 549
void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp,
				 struct net_device *dev);
550 551
bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp,
			 const struct net_device *dev);
552
u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev);
553
u8 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp);
554 555 556 557 558 559 560
int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
				      enum mlxsw_sp_l3proto ul_proto,
				      const union mlxsw_sp_l3addr *ul_sip,
				      u32 tunnel_index);
void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
				      enum mlxsw_sp_l3proto ul_proto,
				      const union mlxsw_sp_l3addr *ul_sip);
561 562
int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id,
				u16 *vr_id);
563 564 565
int mlxsw_sp_router_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
			       u16 *ul_rif_index);
void mlxsw_sp_router_ul_rif_put(struct mlxsw_sp *mlxsw_sp, u16 ul_rif_index);
566

567
/* spectrum_kvdl.c */
568 569 570 571 572
enum mlxsw_sp_kvdl_entry_type {
	MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,
	MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET,
	MLXSW_SP_KVDL_ENTRY_TYPE_PBS,
	MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,
573
	MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT,
574 575 576 577 578 579 580 581 582 583
};

static inline unsigned int
mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)
{
	switch (type) {
	case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ: /* fall through */
	case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET: /* fall through */
	case MLXSW_SP_KVDL_ENTRY_TYPE_PBS: /* fall through */
	case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR: /* fall through */
584
	case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT: /* fall through */
585 586 587 588 589
	default:
		return 1;
	}
}

590 591 592 593 594
struct mlxsw_sp_kvdl_ops {
	size_t priv_size;
	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
	int (*alloc)(struct mlxsw_sp *mlxsw_sp, void *priv,
595
		     enum mlxsw_sp_kvdl_entry_type type,
596 597
		     unsigned int entry_count, u32 *p_entry_index);
	void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv,
598
		     enum mlxsw_sp_kvdl_entry_type type,
599
		     unsigned int entry_count, int entry_index);
600
	int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv,
601
				enum mlxsw_sp_kvdl_entry_type type,
602
				unsigned int entry_count,
603
				unsigned int *p_alloc_count);
604 605 606
	int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv);
};

607 608
int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
609 610 611 612 613
int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp,
			enum mlxsw_sp_kvdl_entry_type type,
			unsigned int entry_count, u32 *p_entry_index);
void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp,
			enum mlxsw_sp_kvdl_entry_type type,
614
			unsigned int entry_count, int entry_index);
615 616 617 618
int mlxsw_sp_kvdl_alloc_count_query(struct mlxsw_sp *mlxsw_sp,
				    enum mlxsw_sp_kvdl_entry_type type,
				    unsigned int entry_count,
				    unsigned int *p_alloc_count);
619 620 621 622

/* spectrum1_kvdl.c */
extern const struct mlxsw_sp_kvdl_ops mlxsw_sp1_kvdl_ops;
int mlxsw_sp1_kvdl_resources_register(struct mlxsw_core *mlxsw_core);
623

624 625 626
/* spectrum2_kvdl.c */
extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops;

627 628 629 630
struct mlxsw_sp_acl_rule_info {
	unsigned int priority;
	struct mlxsw_afk_element_values values;
	struct mlxsw_afa_block *act_block;
631
	u8 action_created:1,
632
	   ingress_bind_blocker:1,
633 634
	   egress_bind_blocker:1,
	   counter_valid:1;
635
	unsigned int counter_index;
636 637
};

638
/* spectrum_flow.c */
639
struct mlxsw_sp_flow_block {
640
	struct list_head binding_list;
641 642
	struct {
		struct list_head list;
643 644
		unsigned int min_prio;
		unsigned int max_prio;
645
	} mall;
646 647 648 649
	struct mlxsw_sp_acl_ruleset *ruleset_zero;
	struct mlxsw_sp *mlxsw_sp;
	unsigned int rule_count;
	unsigned int disable_count;
650
	unsigned int ingress_blocker_rule_count;
651
	unsigned int egress_blocker_rule_count;
652 653
	unsigned int ingress_binding_count;
	unsigned int egress_binding_count;
654 655 656
	struct net *net;
};

657 658 659 660 661 662
struct mlxsw_sp_flow_block_binding {
	struct list_head list;
	struct net_device *dev;
	struct mlxsw_sp_port *mlxsw_sp_port;
	bool ingress;
};
663 664

static inline struct mlxsw_sp *
665
mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block *block)
666 667 668 669 670
{
	return block->mlxsw_sp;
}

static inline unsigned int
671
mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block *block)
672 673 674 675 676
{
	return block ? block->rule_count : 0;
}

static inline void
677
mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block *block)
678 679 680 681 682 683
{
	if (block)
		block->disable_count++;
}

static inline void
684
mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block *block)
685 686 687 688 689 690
{
	if (block)
		block->disable_count--;
}

static inline bool
691
mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block *block)
692 693 694 695 696
{
	return block->disable_count;
}

static inline bool
697
mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block *block)
698 699 700 701 702
{
	return block->egress_binding_count;
}

static inline bool
703
mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block *block)
704 705 706 707 708
{
	return block->ingress_binding_count;
}

static inline bool
709
mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block *block)
710 711 712 713
{
	return block->ingress_binding_count && block->egress_binding_count;
}

714 715 716
struct mlxsw_sp_flow_block *mlxsw_sp_flow_block_create(struct mlxsw_sp *mlxsw_sp,
						       struct net *net);
void mlxsw_sp_flow_block_destroy(struct mlxsw_sp_flow_block *block);
717 718
int mlxsw_sp_setup_tc_block(struct mlxsw_sp_port *mlxsw_sp_port,
			    struct flow_block_offload *f);
719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735

/* spectrum_acl.c */
struct mlxsw_sp_acl_ruleset;

enum mlxsw_sp_acl_profile {
	MLXSW_SP_ACL_PROFILE_FLOWER,
	MLXSW_SP_ACL_PROFILE_MR,
};

struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);

int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
			      struct mlxsw_sp_flow_block *block,
			      struct mlxsw_sp_flow_block_binding *binding);
void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,
				 struct mlxsw_sp_flow_block *block,
				 struct mlxsw_sp_flow_block_binding *binding);
736
struct mlxsw_sp_acl_ruleset *
737
mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp,
738
			    struct mlxsw_sp_flow_block *block, u32 chain_index,
739 740
			    enum mlxsw_sp_acl_profile profile);
struct mlxsw_sp_acl_ruleset *
741
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
742
			 struct mlxsw_sp_flow_block *block, u32 chain_index,
743 744
			 enum mlxsw_sp_acl_profile profile,
			 struct mlxsw_afk_element_usage *tmplt_elusage);
745 746
void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
			      struct mlxsw_sp_acl_ruleset *ruleset);
747
u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);
748 749 750
void mlxsw_sp_acl_ruleset_prio_get(struct mlxsw_sp_acl_ruleset *ruleset,
				   unsigned int *p_min_prio,
				   unsigned int *p_max_prio);
751 752

struct mlxsw_sp_acl_rule_info *
753 754
mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl,
			  struct mlxsw_afa_block *afa_block);
755 756 757 758 759 760 761 762 763 764 765
void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei);
int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);
void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,
				 unsigned int priority);
void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,
				    enum mlxsw_afk_element element,
				    u32 key_value, u32 mask_value);
void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,
				    enum mlxsw_afk_element element,
				    const char *key_value,
				    const char *mask_value, unsigned int len);
766 767 768
int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);
int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,
				u16 group_id);
769
int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei);
770
int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei,
771 772 773
				bool ingress,
				const struct flow_action_cookie *fa_cookie,
				struct netlink_ext_ack *extack);
J
Jiri Pirko 已提交
774
int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
775 776
int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp,
				  struct mlxsw_sp_acl_rule_info *rulei,
777
				  struct mlxsw_sp_flow_block *block,
778 779
				  struct net_device *out_dev,
				  struct netlink_ext_ack *extack);
780 781
int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
			       struct mlxsw_sp_acl_rule_info *rulei,
782 783
			       struct net_device *out_dev,
			       struct netlink_ext_ack *extack);
784 785
int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_rule_info *rulei,
786 787
				u32 action, u16 vid, u16 proto, u8 prio,
				struct netlink_ext_ack *extack);
788 789 790
int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp,
				    struct mlxsw_sp_acl_rule_info *rulei,
				    u32 prio, struct netlink_ext_ack *extack);
791 792 793 794 795
int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
				  struct mlxsw_sp_acl_rule_info *rulei,
				  enum flow_action_mangle_base htype,
				  u32 offset, u32 mask, u32 val,
				  struct netlink_ext_ack *extack);
796
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
797 798
				 struct mlxsw_sp_acl_rule_info *rulei,
				 struct netlink_ext_ack *extack);
799 800
int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
				   struct mlxsw_sp_acl_rule_info *rulei,
801
				   u16 fid, struct netlink_ext_ack *extack);
802 803 804 805 806 807

struct mlxsw_sp_acl_rule;

struct mlxsw_sp_acl_rule *
mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
			 struct mlxsw_sp_acl_ruleset *ruleset,
808
			 unsigned long cookie,
809
			 struct mlxsw_afa_block *afa_block,
810
			 struct netlink_ext_ack *extack);
811 812 813 814 815 816
void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
			       struct mlxsw_sp_acl_rule *rule);
int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
			  struct mlxsw_sp_acl_rule *rule);
void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
			   struct mlxsw_sp_acl_rule *rule);
817 818 819
int mlxsw_sp_acl_rule_action_replace(struct mlxsw_sp *mlxsw_sp,
				     struct mlxsw_sp_acl_rule *rule,
				     struct mlxsw_afa_block *afa_block);
820 821 822 823 824 825
struct mlxsw_sp_acl_rule *
mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,
			 struct mlxsw_sp_acl_ruleset *ruleset,
			 unsigned long cookie);
struct mlxsw_sp_acl_rule_info *
mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);
826 827
int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_rule *rule,
828 829
				u64 *packets, u64 *bytes, u64 *last_use,
				enum flow_action_hw_stats *used_hw_stats);
830

831 832
struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);

833 834 835 836 837 838
static inline const struct flow_action_cookie *
mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp *mlxsw_sp, u32 cookie_index)
{
	return mlxsw_afa_cookie_lookup(mlxsw_sp->afa, cookie_index);
}

839 840
int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
841 842
u32 mlxsw_sp_acl_region_rehash_intrvl_get(struct mlxsw_sp *mlxsw_sp);
int mlxsw_sp_acl_region_rehash_intrvl_set(struct mlxsw_sp *mlxsw_sp, u32 val);
843

844
/* spectrum_acl_tcam.c */
845
struct mlxsw_sp_acl_tcam;
846 847 848 849
struct mlxsw_sp_acl_tcam_region;

struct mlxsw_sp_acl_tcam_ops {
	enum mlxsw_reg_ptar_key_type key_type;
850 851 852 853
	size_t priv_size;
	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv,
		    struct mlxsw_sp_acl_tcam *tcam);
	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
854 855
	size_t region_priv_size;
	int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,
856
			   void *tcam_priv,
857 858
			   struct mlxsw_sp_acl_tcam_region *region,
			   void *hints_priv);
859
	void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);
860 861
	int (*region_associate)(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_tcam_region *region);
862 863
	void * (*region_rehash_hints_get)(void *region_priv);
	void (*region_rehash_hints_put)(void *hints_priv);
864 865 866 867 868 869 870 871 872 873 874 875
	size_t chunk_priv_size;
	void (*chunk_init)(void *region_priv, void *chunk_priv,
			   unsigned int priority);
	void (*chunk_fini)(void *chunk_priv);
	size_t entry_priv_size;
	int (*entry_add)(struct mlxsw_sp *mlxsw_sp,
			 void *region_priv, void *chunk_priv,
			 void *entry_priv,
			 struct mlxsw_sp_acl_rule_info *rulei);
	void (*entry_del)(struct mlxsw_sp *mlxsw_sp,
			  void *region_priv, void *chunk_priv,
			  void *entry_priv);
876
	int (*entry_action_replace)(struct mlxsw_sp *mlxsw_sp,
877
				    void *region_priv, void *entry_priv,
878
				    struct mlxsw_sp_acl_rule_info *rulei);
879 880 881 882 883 884 885
	int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp,
				  void *region_priv, void *entry_priv,
				  bool *activity);
};

/* spectrum1_acl_tcam.c */
extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops;
886

887 888 889
/* spectrum2_acl_tcam.c */
extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops;

890 891
/* spectrum_acl_flex_actions.c */
extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops;
892
extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;
893

894 895
/* spectrum_acl_flex_keys.c */
extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;
896
extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;
897

898
/* spectrum_matchall.c */
899 900
int mlxsw_sp_mall_replace(struct mlxsw_sp *mlxsw_sp,
			  struct mlxsw_sp_flow_block *block,
901 902
			  struct tc_cls_matchall_offload *f);
void mlxsw_sp_mall_destroy(struct mlxsw_sp_flow_block *block,
903
			   struct tc_cls_matchall_offload *f);
904 905 906 907
int mlxsw_sp_mall_port_bind(struct mlxsw_sp_flow_block *block,
			    struct mlxsw_sp_port *mlxsw_sp_port);
void mlxsw_sp_mall_port_unbind(struct mlxsw_sp_flow_block *block,
			       struct mlxsw_sp_port *mlxsw_sp_port);
908 909
int mlxsw_sp_mall_prio_get(struct mlxsw_sp_flow_block *block, u32 chain_index,
			   unsigned int *p_min_prio, unsigned int *p_max_prio);
910

911
/* spectrum_flower.c */
912
int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp,
913
			    struct mlxsw_sp_flow_block *block,
914
			    struct flow_cls_offload *f);
915
void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp,
916
			     struct mlxsw_sp_flow_block *block,
917
			     struct flow_cls_offload *f);
918
int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
919
			  struct mlxsw_sp_flow_block *block,
920
			  struct flow_cls_offload *f);
921
int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp,
922
				 struct mlxsw_sp_flow_block *block,
923
				 struct flow_cls_offload *f);
924
void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp,
925
				   struct mlxsw_sp_flow_block *block,
926
				   struct flow_cls_offload *f);
927 928 929 930
int mlxsw_sp_flower_prio_get(struct mlxsw_sp *mlxsw_sp,
			     struct mlxsw_sp_flow_block *block,
			     u32 chain_index, unsigned int *p_min_prio,
			     unsigned int *p_max_prio);
931

932
/* spectrum_qdisc.c */
933 934
int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port);
void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port);
935 936
int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_red_qopt_offload *p);
937 938
int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
			   struct tc_prio_qopt_offload *p);
939 940
int mlxsw_sp_setup_tc_ets(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_ets_qopt_offload *p);
941 942
int mlxsw_sp_setup_tc_tbf(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_tbf_qopt_offload *p);
943 944
int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
			   struct tc_fifo_qopt_offload *p);
945

946
/* spectrum_fid.c */
947
bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index);
948
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid);
949 950
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
						  u16 fid_index);
951
int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
952 953
int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,
			  enum mlxsw_sp_nve_type *p_type);
954 955
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp,
						__be32 vni);
956 957 958 959 960
int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni);
int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,
				     u32 nve_flood_index);
void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid);
bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid);
961 962
int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
			 __be32 vni, int nve_ifindex);
963 964
void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid);
bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid);
965 966
void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
				    const struct net_device *nve_dev);
967 968 969 970 971 972 973 974 975 976
int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
			   enum mlxsw_sp_flood_type packet_type, u8 local_port,
			   bool member);
int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
			      struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
				 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);
enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);
void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);
977
struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid);
978 979 980 981
enum mlxsw_sp_rif_type
mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,
			   enum mlxsw_sp_fid_type type);
u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);
982 983 984
struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);
struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,
					    int br_ifindex);
985 986
struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp,
					       u16 vid);
987 988
struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp,
					       int br_ifindex);
989 990 991 992 993 994 995 996 997
struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,
					   u16 rif_index);
struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);
int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);
void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);

998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030
/* spectrum_mr.c */
enum mlxsw_sp_mr_route_prio {
	MLXSW_SP_MR_ROUTE_PRIO_SG,
	MLXSW_SP_MR_ROUTE_PRIO_STARG,
	MLXSW_SP_MR_ROUTE_PRIO_CATCHALL,
	__MLXSW_SP_MR_ROUTE_PRIO_MAX
};

#define MLXSW_SP_MR_ROUTE_PRIO_MAX (__MLXSW_SP_MR_ROUTE_PRIO_MAX - 1)

struct mlxsw_sp_mr_route_key;

struct mlxsw_sp_mr_tcam_ops {
	size_t priv_size;
	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
	void (*fini)(void *priv);
	size_t route_priv_size;
	int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv,
			    void *route_priv,
			    struct mlxsw_sp_mr_route_key *key,
			    struct mlxsw_afa_block *afa_block,
			    enum mlxsw_sp_mr_route_prio prio);
	void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv,
			      void *route_priv,
			      struct mlxsw_sp_mr_route_key *key);
	int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv,
			    struct mlxsw_sp_mr_route_key *key,
			    struct mlxsw_afa_block *afa_block);
};

/* spectrum1_mr_tcam.c */
extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp1_mr_tcam_ops;

1031 1032 1033
/* spectrum2_mr_tcam.c */
extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops;

1034 1035 1036 1037 1038 1039 1040 1041 1042 1043
/* spectrum_nve.c */
struct mlxsw_sp_nve_params {
	enum mlxsw_sp_nve_type type;
	__be32 vni;
	const struct net_device *dev;
};

extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[];
extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[];

1044 1045 1046
int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip,
				    enum mlxsw_sp_l3proto proto,
				    union mlxsw_sp_l3addr *addr);
1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064
int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp,
			      struct mlxsw_sp_fid *fid,
			      enum mlxsw_sp_l3proto proto,
			      union mlxsw_sp_l3addr *addr);
void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp,
			       struct mlxsw_sp_fid *fid,
			       enum mlxsw_sp_l3proto proto,
			       union mlxsw_sp_l3addr *addr);
int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
			    struct mlxsw_sp_nve_params *params,
			    struct netlink_ext_ack *extack);
void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp,
			      struct mlxsw_sp_fid *fid);
int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port);
void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port);
int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp);

1065 1066 1067 1068
/* spectrum_nve_vxlan.c */
int mlxsw_sp_nve_inc_parsing_depth_get(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_nve_inc_parsing_depth_put(struct mlxsw_sp *mlxsw_sp);

1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080
/* spectrum_trap.c */
int mlxsw_sp_devlink_traps_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_devlink_traps_fini(struct mlxsw_sp *mlxsw_sp);
int mlxsw_sp_trap_init(struct mlxsw_core *mlxsw_core,
		       const struct devlink_trap *trap, void *trap_ctx);
void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core,
			const struct devlink_trap *trap, void *trap_ctx);
int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,
			     const struct devlink_trap *trap,
			     enum devlink_trap_action action);
int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
			     const struct devlink_trap_group *group);
1081 1082 1083
int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,
			    const struct devlink_trap_group *group,
			    const struct devlink_trap_policer *policer);
1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
int
mlxsw_sp_trap_policer_init(struct mlxsw_core *mlxsw_core,
			   const struct devlink_trap_policer *policer);
void mlxsw_sp_trap_policer_fini(struct mlxsw_core *mlxsw_core,
				const struct devlink_trap_policer *policer);
int
mlxsw_sp_trap_policer_set(struct mlxsw_core *mlxsw_core,
			  const struct devlink_trap_policer *policer,
			  u64 rate, u64 burst, struct netlink_ext_ack *extack);
int
mlxsw_sp_trap_policer_counter_get(struct mlxsw_core *mlxsw_core,
				  const struct devlink_trap_policer *policer,
				  u64 *p_drops);
1097

1098 1099 1100 1101 1102
static inline struct net *mlxsw_sp_net(struct mlxsw_sp *mlxsw_sp)
{
	return mlxsw_core_net(mlxsw_sp->core);
}

1103
#endif