spectrum.h 45.2 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

#ifndef _MLXSW_SPECTRUM_H
#define _MLXSW_SPECTRUM_H

7
#include <linux/ethtool.h>
8 9
#include <linux/types.h>
#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 <net/psample.h>
20
#include <net/pkt_cls.h>
21
#include <net/red.h>
22
#include <net/vxlan.h>
23
#include <net/flow_offload.h>
24
#include <net/inet_ecn.h>
25

26
#include "port.h"
27
#include "core.h"
28 29
#include "core_acl_flex_keys.h"
#include "core_acl_flex_actions.h"
30
#include "reg.h"
31

32
#define MLXSW_SP_DEFAULT_VID (VLAN_N_VID - 1)
33

34
#define MLXSW_SP_FID_8021D_MAX 1024
35

36 37
#define MLXSW_SP_MID_MAX 7000

38
#define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
39
#define MLXSW_SP_KVD_GRANULARITY 128
40

41 42 43 44
#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"
45 46 47
#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"
48

49 50
#define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents"

51 52 53 54
#define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow"
#define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif"

55
enum mlxsw_sp_resource_id {
56
	MLXSW_SP_RESOURCE_KVD = MLXSW_CORE_RESOURCE_MAX,
57 58 59
	MLXSW_SP_RESOURCE_KVD_LINEAR,
	MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
	MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
60 61 62
	MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
	MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
	MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
63
	MLXSW_SP_RESOURCE_SPAN,
64 65 66
	MLXSW_SP_RESOURCE_COUNTERS,
	MLXSW_SP_RESOURCE_COUNTERS_FLOW,
	MLXSW_SP_RESOURCE_COUNTERS_RIF,
67 68
	MLXSW_SP_RESOURCE_GLOBAL_POLICERS,
	MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS,
69 70
};

71
struct mlxsw_sp_port;
72
struct mlxsw_sp_rif;
73
struct mlxsw_sp_span_entry;
74 75
enum mlxsw_sp_l3proto;
union mlxsw_sp_l3addr;
76

77 78 79 80 81
struct mlxsw_sp_upper {
	struct net_device *dev;
	unsigned int ref_count;
};

82 83 84 85
enum mlxsw_sp_rif_type {
	MLXSW_SP_RIF_TYPE_SUBPORT,
	MLXSW_SP_RIF_TYPE_VLAN,
	MLXSW_SP_RIF_TYPE_FID,
86
	MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */
87 88 89
	MLXSW_SP_RIF_TYPE_MAX,
};

90 91 92 93 94
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[];

95 96 97 98 99 100
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,
101 102
};

103 104 105 106
enum mlxsw_sp_nve_type {
	MLXSW_SP_NVE_TYPE_VXLAN,
};

107 108 109
struct mlxsw_sp_mid {
	struct list_head list;
	unsigned char addr[ETH_ALEN];
110
	u16 fid;
111
	u16 mid;
112
	bool in_hw;
113
	unsigned long *ports_in_mid; /* bits array */
114 115
};

116
struct mlxsw_sp_sb;
117
struct mlxsw_sp_bridge;
118
struct mlxsw_sp_router;
119
struct mlxsw_sp_mr;
120
struct mlxsw_sp_acl;
121
struct mlxsw_sp_counter_pool;
122
struct mlxsw_sp_fid_core;
123
struct mlxsw_sp_kvdl;
124
struct mlxsw_sp_nve;
125
struct mlxsw_sp_kvdl_ops;
126
struct mlxsw_sp_mr_tcam_ops;
127
struct mlxsw_sp_acl_rulei_ops;
128
struct mlxsw_sp_acl_tcam_ops;
129
struct mlxsw_sp_nve_ops;
130
struct mlxsw_sp_sb_ops;
131
struct mlxsw_sp_sb_vals;
132
struct mlxsw_sp_port_type_speed_ops;
133
struct mlxsw_sp_ptp_state;
134
struct mlxsw_sp_ptp_ops;
135
struct mlxsw_sp_span_ops;
136
struct mlxsw_sp_qdisc_state;
137

138 139 140 141 142 143
struct mlxsw_sp_port_mapping {
	u8 module;
	u8 width;
	u8 lane;
};

144 145 146 147 148
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];
149
	const unsigned char *mac_mask;
150
	struct mlxsw_sp_upper *lags;
151
	struct mlxsw_sp_port_mapping **port_mapping;
152
	struct mlxsw_sp_sb *sb;
153
	struct mlxsw_sp_bridge *bridge;
154
	struct mlxsw_sp_router *router;
155
	struct mlxsw_sp_mr *mr;
156
	struct mlxsw_afa *afa;
157
	struct mlxsw_sp_acl *acl;
158
	struct mlxsw_sp_fid_core *fid_core;
159
	struct mlxsw_sp_policer_core *policer_core;
160
	struct mlxsw_sp_kvdl *kvdl;
161
	struct mlxsw_sp_nve *nve;
162
	struct notifier_block netdevice_nb;
163
	struct mlxsw_sp_ptp_clock *clock;
164
	struct mlxsw_sp_ptp_state *ptp_state;
165
	struct mlxsw_sp_counter_pool *counter_pool;
166
	struct mlxsw_sp_span *span;
167
	struct mlxsw_sp_trap *trap;
168
	const struct mlxsw_sp_kvdl_ops *kvdl_ops;
169
	const struct mlxsw_afa_ops *afa_ops;
170
	const struct mlxsw_afk_ops *afk_ops;
171
	const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
172
	const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;
173
	const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
174
	const struct mlxsw_sp_nve_ops **nve_ops_arr;
175
	const struct mlxsw_sp_rif_ops **rif_ops_arr;
176
	const struct mlxsw_sp_sb_vals *sb_vals;
177
	const struct mlxsw_sp_sb_ops *sb_ops;
178
	const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;
179
	const struct mlxsw_sp_ptp_ops *ptp_ops;
180
	const struct mlxsw_sp_span_ops *span_ops;
181
	const struct mlxsw_sp_policer_core_ops *policer_core_ops;
182
	const struct mlxsw_sp_trap_ops *trap_ops;
183 184
	const struct mlxsw_listener *listeners;
	size_t listeners_count;
185
	u32 lowest_shaper_bs;
186 187
};

188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
struct mlxsw_sp_ptp_ops {
	struct mlxsw_sp_ptp_clock *
		(*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev);
	void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock);

	struct mlxsw_sp_ptp_state *(*init)(struct mlxsw_sp *mlxsw_sp);
	void (*fini)(struct mlxsw_sp_ptp_state *ptp_state);

	/* Notify a driver that a packet that might be PTP was received. Driver
	 * is responsible for freeing the passed-in SKB.
	 */
	void (*receive)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
			u8 local_port);

	/* Notify a driver that a timestamped packet was transmitted. Driver
	 * is responsible for freeing the passed-in SKB.
	 */
	void (*transmitted)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
			    u8 local_port);

	int (*hwtstamp_get)(struct mlxsw_sp_port *mlxsw_sp_port,
			    struct hwtstamp_config *config);
	int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port,
			    struct hwtstamp_config *config);
	void (*shaper_work)(struct work_struct *work);
	int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp,
			   struct ethtool_ts_info *info);
	int (*get_stats_count)(void);
	void (*get_stats_strings)(u8 **p);
	void (*get_stats)(struct mlxsw_sp_port *mlxsw_sp_port,
			  u64 *data, int data_index);
};

221 222 223 224 225 226
static inline struct mlxsw_sp_upper *
mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
{
	return &mlxsw_sp->lags[lag_id];
}

227 228 229 230 231 232 233 234 235
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;
};

236
struct mlxsw_sp_port_sample {
237
	struct psample_group *psample_group;
238 239 240 241 242
	u32 trunc_size;
	u32 rate;
	bool truncate;
};

243
struct mlxsw_sp_bridge_port;
244
struct mlxsw_sp_fid;
245

246 247 248 249 250
struct mlxsw_sp_port_vlan {
	struct list_head list;
	struct mlxsw_sp_port *mlxsw_sp_port;
	struct mlxsw_sp_fid *fid;
	u16 vid;
251 252
	struct mlxsw_sp_bridge_port *bridge_port;
	struct list_head bridge_vlan_node;
253 254
};

255 256 257 258 259 260
/* 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];
261 262
	u64 tx_bytes[IEEE_8021QAZ_MAX_TCS];
	u64 tx_packets[IEEE_8021QAZ_MAX_TCS];
263 264
};

265 266 267 268 269 270 271 272 273 274
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;
};

275 276 277 278 279
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;
280
	u8 lagged:1,
281
	   split:1;
282
	u16 pvid;
283
	u16 lag_id;
284 285
	struct {
		u8 tx_pause:1,
286 287
		   rx_pause:1,
		   autoneg:1;
288
	} link;
289 290
	struct {
		struct ieee_ets *ets;
291
		struct ieee_maxrate *maxrate;
292
		struct ieee_pfc *pfc;
293
		enum mlxsw_reg_qpts_trust_state trust_state;
294
	} dcb;
295 296 297 298 299
	struct mlxsw_sp_port_mapping mapping; /* mapping is constant during the
					       * mlxsw_sp_port lifetime, however
					       * the same localport can have
					       * different mapping.
					       */
300 301
	struct {
		#define MLXSW_HW_STATS_UPDATE_TIME HZ
302
		struct rtnl_link_stats64 stats;
303
		struct mlxsw_sp_port_xstats xstats;
304
		struct delayed_work update_dw;
305
	} periodic_hw_stats;
306
	struct mlxsw_sp_port_sample __rcu *sample;
307
	struct list_head vlans_list;
308
	struct mlxsw_sp_port_vlan *default_vlan;
309
	struct mlxsw_sp_qdisc_state *qdisc;
310
	unsigned acl_rule_count;
311 312
	struct mlxsw_sp_flow_block *ing_flow_block;
	struct mlxsw_sp_flow_block *eg_flow_block;
313
	struct {
314
		struct delayed_work shaper_dw;
315 316 317
		struct hwtstamp_config hwtstamp_config;
		u16 ing_types;
		u16 egr_types;
318
		struct mlxsw_sp_ptp_port_stats stats;
319
	} ptp;
320
	u8 split_base_local_port;
321
	int max_mtu;
322
	u32 max_speed;
323
	struct mlxsw_sp_hdroom *hdroom;
324
	u64 module_overheat_initial_val;
325 326
};

327 328 329 330 331
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,
332
			       unsigned long *mode);
333
	u32 (*from_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto);
334 335 336
	void (*from_ptys_link_mode)(struct mlxsw_sp *mlxsw_sp,
				    bool carrier_ok, u32 ptys_eth_proto,
				    struct ethtool_link_ksettings *cmd);
337
	int (*ptys_max_speed)(struct mlxsw_sp_port *mlxsw_sp_port, u32 *p_max_speed);
338
	u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp,
339
				   const struct ethtool_link_ksettings *cmd);
340 341
	u32 (*to_ptys_speed_lanes)(struct mlxsw_sp *mlxsw_sp, u8 width,
				   const struct ethtool_link_ksettings *cmd);
342 343 344 345 346 347
	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);
348
	u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap);
349 350
};

351 352 353 354 355 356 357 358 359 360 361 362 363 364
static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn,
					   bool *trap_en)
{
	bool set_ce = false;

	*trap_en = !!__INET_ECN_decapsulate(outer_ecn, inner_ecn, &set_ce);
	if (set_ce)
		return INET_ECN_CE;
	else if (outer_ecn == INET_ECN_ECT_1 && inner_ecn == INET_ECN_ECT_0)
		return INET_ECN_ECT_1;
	else
		return inner_ecn;
}

365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383
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);
}

384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403
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;
}

404 405 406 407 408 409
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;
}

410 411 412 413 414 415 416 417 418 419 420 421
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;
}

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
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;
}

437 438 439 440
enum mlxsw_sp_flood_type {
	MLXSW_SP_FLOOD_TYPE_UC,
	MLXSW_SP_FLOOD_TYPE_BC,
	MLXSW_SP_FLOOD_TYPE_MC,
441 442
};

443 444 445 446
int mlxsw_sp_port_get_stats_raw(struct net_device *dev, int grp,
				int prio, char *ppcnt_pl);
int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port,
				   bool is_up);
447 448 449 450
int
mlxsw_sp_port_vlan_classification_set(struct mlxsw_sp_port *mlxsw_sp_port,
				      bool is_8021ad_tagged,
				      bool is_8021q_tagged);
451

452
/* spectrum_buffers.c */
453 454 455 456 457 458 459
struct mlxsw_sp_hdroom_prio {
	/* Number of port buffer associated with this priority. This is the
	 * actually configured value.
	 */
	u8 buf_idx;
	/* Value of buf_idx deduced from the DCB ETS configuration. */
	u8 ets_buf_idx;
460 461
	/* Value of buf_idx taken from the dcbnl_setbuffer configuration. */
	u8 set_buf_idx;
462 463 464 465
	bool lossy;
};

struct mlxsw_sp_hdroom_buf {
466 467
	u32 thres_cells;
	u32 size_cells;
468 469
	/* Size requirement form dcbnl_setbuffer. */
	u32 set_size_cells;
470
	bool lossy;
471 472
};

473 474 475 476 477
enum mlxsw_sp_hdroom_mode {
	MLXSW_SP_HDROOM_MODE_DCB,
	MLXSW_SP_HDROOM_MODE_TC,
};

478 479
#define MLXSW_SP_PB_COUNT 10

480
struct mlxsw_sp_hdroom {
481 482
	enum mlxsw_sp_hdroom_mode mode;

483 484 485
	struct {
		struct mlxsw_sp_hdroom_prio prio[IEEE_8021Q_MAX_PRIORITIES];
	} prios;
486 487 488
	struct {
		struct mlxsw_sp_hdroom_buf buf[MLXSW_SP_PB_COUNT];
	} bufs;
489 490 491 492 493 494 495 496 497 498 499
	struct {
		/* Size actually configured for the internal buffer. Equal to
		 * reserve when internal buffer is enabled.
		 */
		u32 size_cells;
		/* Space reserved in the headroom for the internal buffer. Port
		 * buffers are not allowed to grow into this space.
		 */
		u32 reserve_cells;
		bool enable;
	} int_buf;
500
	int delay_bytes;
501
	int mtu;
502 503
};

504
int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
505
void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
506
int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
507
void mlxsw_sp_port_buffers_fini(struct mlxsw_sp_port *mlxsw_sp_port);
508 509 510 511 512
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,
513 514
			 enum devlink_sb_threshold_type threshold_type,
			 struct netlink_ext_ack *extack);
515 516 517 518 519
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,
520
			      u32 threshold, struct netlink_ext_ack *extack);
521 522 523 524 525 526 527
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,
528 529
				 u16 pool_index, u32 threshold,
				 struct netlink_ext_ack *extack);
530 531 532 533 534 535 536 537 538 539 540
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);
541 542
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);
543
void mlxsw_sp_hdroom_prios_reset_buf_idx(struct mlxsw_sp_hdroom *hdroom);
544
void mlxsw_sp_hdroom_bufs_reset_lossiness(struct mlxsw_sp_hdroom *hdroom);
545 546 547 548
void mlxsw_sp_hdroom_bufs_reset_sizes(struct mlxsw_sp_port *mlxsw_sp_port,
				      struct mlxsw_sp_hdroom *hdroom);
int mlxsw_sp_hdroom_configure(struct mlxsw_sp_port *mlxsw_sp_port,
			      const struct mlxsw_sp_hdroom *hdroom);
549

550 551 552
extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals;
extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals;

553 554 555 556
extern const struct mlxsw_sp_sb_ops mlxsw_sp1_sb_ops;
extern const struct mlxsw_sp_sb_ops mlxsw_sp2_sb_ops;
extern const struct mlxsw_sp_sb_ops mlxsw_sp3_sb_ops;

557
/* spectrum_switchdev.c */
558 559
int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
560 561
int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
			bool adding);
562 563 564 565
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,
566 567
			      struct net_device *br_dev,
			      struct netlink_ext_ack *extack);
568 569 570
void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
				struct net_device *brport_dev,
				struct net_device *br_dev);
571 572
bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
					 const struct net_device *br_dev);
573 574
int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
			       const struct net_device *br_dev,
575
			       const struct net_device *vxlan_dev, u16 vid,
576 577 578
			       struct netlink_ext_ack *extack);
void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
				 const struct net_device *vxlan_dev);
579
extern struct notifier_block mlxsw_sp_switchdev_notifier;
580

581
/* spectrum.c */
582 583
void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
				       u8 local_port, void *priv);
584 585
void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
			  u8 local_port);
586 587
void mlxsw_sp_sample_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
			     u8 local_port);
588
int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);
589 590 591 592 593
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);
594 595
int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
				  enum mlxsw_reg_qeec_hr hr, u8 index,
596
				  u8 next_index, u32 maxrate, u8 burst_size);
597
enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state);
598 599
int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
			      u8 state);
600
int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
601 602
int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
				   bool learn_enable);
603
int mlxsw_sp_ethtype_to_sver_type(u16 ethtype, u8 *p_sver_type);
604 605
int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
			   u16 ethtype);
606
struct mlxsw_sp_port_vlan *
607 608
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);
609 610 611 612 613 614 615 616 617 618 619 620 621 622
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);
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);
623
struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
624

625
/* spectrum_dcb.c */
626 627 628 629 630 631 632 633 634 635 636 637
#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

638
/* spectrum_router.c */
639 640 641 642 643 644 645 646 647 648 649
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;
};

650 651
int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
			 struct netlink_ext_ack *extack);
652
void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
653 654
int mlxsw_sp_netdevice_router_port_event(struct net_device *dev,
					 unsigned long event, void *ptr);
655 656
void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,
			      const struct net_device *macvlan_dev);
657 658 659 660
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);
661 662
int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
				 struct netdev_notifier_changeupper_info *info);
663 664
bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp,
				const struct net_device *dev);
665
bool mlxsw_sp_netdev_is_ipip_ul(struct mlxsw_sp *mlxsw_sp,
666
				const struct net_device *dev);
667 668 669 670
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);
671 672 673 674 675
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);
676 677 678 679
int
mlxsw_sp_port_vlan_router_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
			       struct net_device *l3_dev,
			       struct netlink_ext_ack *extack);
680 681
void
mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
682 683
void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp,
				 struct net_device *dev);
684 685
bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp,
			 const struct net_device *dev);
686
u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev);
687
u8 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp);
688 689 690 691 692 693 694
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);
695 696
int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id,
				u16 *vr_id);
697 698 699
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);
700

701
/* spectrum_kvdl.c */
702 703 704 705 706
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,
707
	MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT,
708 709 710 711 712 713
};

static inline unsigned int
mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)
{
	switch (type) {
714 715 716 717 718
	case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ:
	case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET:
	case MLXSW_SP_KVDL_ENTRY_TYPE_PBS:
	case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR:
	case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT:
719 720 721 722 723
	default:
		return 1;
	}
}

724 725 726 727 728
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,
729
		     enum mlxsw_sp_kvdl_entry_type type,
730 731
		     unsigned int entry_count, u32 *p_entry_index);
	void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv,
732
		     enum mlxsw_sp_kvdl_entry_type type,
733
		     unsigned int entry_count, int entry_index);
734
	int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv,
735
				enum mlxsw_sp_kvdl_entry_type type,
736
				unsigned int entry_count,
737
				unsigned int *p_alloc_count);
738 739 740
	int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv);
};

741 742
int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
743 744 745 746 747
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,
748
			unsigned int entry_count, int entry_index);
749 750 751 752
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);
753 754 755 756

/* 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);
757

758 759 760
/* spectrum2_kvdl.c */
extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops;

761 762 763 764
struct mlxsw_sp_acl_rule_info {
	unsigned int priority;
	struct mlxsw_afk_element_values values;
	struct mlxsw_afa_block *act_block;
765
	u8 action_created:1,
766
	   ingress_bind_blocker:1,
767
	   egress_bind_blocker:1,
768 769
	   counter_valid:1,
	   policer_index_valid:1;
770
	unsigned int counter_index;
771
	u16 policer_index;
772 773
};

774
/* spectrum_flow.c */
775
struct mlxsw_sp_flow_block {
776
	struct list_head binding_list;
777 778
	struct {
		struct list_head list;
779 780
		unsigned int min_prio;
		unsigned int max_prio;
781
	} mall;
782 783 784 785
	struct mlxsw_sp_acl_ruleset *ruleset_zero;
	struct mlxsw_sp *mlxsw_sp;
	unsigned int rule_count;
	unsigned int disable_count;
786
	unsigned int ingress_blocker_rule_count;
787
	unsigned int egress_blocker_rule_count;
788 789
	unsigned int ingress_binding_count;
	unsigned int egress_binding_count;
790 791 792
	struct net *net;
};

793 794 795 796 797
struct mlxsw_sp_flow_block_binding {
	struct list_head list;
	struct mlxsw_sp_port *mlxsw_sp_port;
	bool ingress;
};
798 799

static inline struct mlxsw_sp *
800
mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block *block)
801 802 803 804 805
{
	return block->mlxsw_sp;
}

static inline unsigned int
806
mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block *block)
807 808 809 810 811
{
	return block ? block->rule_count : 0;
}

static inline void
812
mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block *block)
813 814 815 816 817 818
{
	if (block)
		block->disable_count++;
}

static inline void
819
mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block *block)
820 821 822 823 824 825
{
	if (block)
		block->disable_count--;
}

static inline bool
826
mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block *block)
827 828 829 830 831
{
	return block->disable_count;
}

static inline bool
832
mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block *block)
833 834 835 836 837
{
	return block->egress_binding_count;
}

static inline bool
838
mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block *block)
839 840 841 842 843
{
	return block->ingress_binding_count;
}

static inline bool
844
mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block *block)
845 846 847 848
{
	return block->ingress_binding_count && block->egress_binding_count;
}

849 850 851
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);
852 853 854
int mlxsw_sp_setup_tc_block_clsact(struct mlxsw_sp_port *mlxsw_sp_port,
				   struct flow_block_offload *f,
				   bool ingress);
855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871

/* 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);
872
struct mlxsw_sp_acl_ruleset *
873
mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp,
874
			    struct mlxsw_sp_flow_block *block, u32 chain_index,
875 876
			    enum mlxsw_sp_acl_profile profile);
struct mlxsw_sp_acl_ruleset *
877
mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
878
			 struct mlxsw_sp_flow_block *block, u32 chain_index,
879 880
			 enum mlxsw_sp_acl_profile profile,
			 struct mlxsw_afk_element_usage *tmplt_elusage);
881 882
void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
			      struct mlxsw_sp_acl_ruleset *ruleset);
883
u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);
884 885 886
void mlxsw_sp_acl_ruleset_prio_get(struct mlxsw_sp_acl_ruleset *ruleset,
				   unsigned int *p_min_prio,
				   unsigned int *p_max_prio);
887 888

struct mlxsw_sp_acl_rule_info *
889 890
mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl,
			  struct mlxsw_afa_block *afa_block);
891 892 893 894 895 896 897 898 899 900 901
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);
902 903 904
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);
905
int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei);
906
int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei,
907 908 909
				bool ingress,
				const struct flow_action_cookie *fa_cookie,
				struct netlink_ext_ack *extack);
J
Jiri Pirko 已提交
910
int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
911 912
int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp,
				  struct mlxsw_sp_acl_rule_info *rulei,
913
				  struct mlxsw_sp_flow_block *block,
914 915
				  struct net_device *out_dev,
				  struct netlink_ext_ack *extack);
916 917
int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
			       struct mlxsw_sp_acl_rule_info *rulei,
918 919
			       struct net_device *out_dev,
			       struct netlink_ext_ack *extack);
920 921
int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_rule_info *rulei,
922 923
				u32 action, u16 vid, u16 proto, u8 prio,
				struct netlink_ext_ack *extack);
924 925 926
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);
927 928 929 930 931
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);
932 933 934 935
int mlxsw_sp_acl_rulei_act_police(struct mlxsw_sp *mlxsw_sp,
				  struct mlxsw_sp_acl_rule_info *rulei,
				  u32 index, u64 rate_bytes_ps,
				  u32 burst, struct netlink_ext_ack *extack);
936
int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
937 938
				 struct mlxsw_sp_acl_rule_info *rulei,
				 struct netlink_ext_ack *extack);
939 940
int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
				   struct mlxsw_sp_acl_rule_info *rulei,
941
				   u16 fid, struct netlink_ext_ack *extack);
942 943 944 945 946 947

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,
948
			 unsigned long cookie,
949
			 struct mlxsw_afa_block *afa_block,
950
			 struct netlink_ext_ack *extack);
951 952 953 954 955 956
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);
957 958 959
int mlxsw_sp_acl_rule_action_replace(struct mlxsw_sp *mlxsw_sp,
				     struct mlxsw_sp_acl_rule *rule,
				     struct mlxsw_afa_block *afa_block);
960 961 962 963 964 965
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);
966 967
int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_rule *rule,
968 969
				u64 *packets, u64 *bytes, u64 *drops,
				u64 *last_use,
970
				enum flow_action_hw_stats *used_hw_stats);
971

972 973
struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);

974 975 976 977 978 979
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);
}

980 981
int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
982 983
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);
984

985 986 987 988 989 990 991 992 993 994 995
struct mlxsw_sp_acl_mangle_action;

struct mlxsw_sp_acl_rulei_ops {
	int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei,
				struct mlxsw_sp_acl_mangle_action *mact, u32 val,
				struct netlink_ext_ack *extack);
};

extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops;
extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops;

996
/* spectrum_acl_tcam.c */
997
struct mlxsw_sp_acl_tcam;
998 999 1000 1001
struct mlxsw_sp_acl_tcam_region;

struct mlxsw_sp_acl_tcam_ops {
	enum mlxsw_reg_ptar_key_type key_type;
1002 1003 1004 1005
	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);
1006 1007
	size_t region_priv_size;
	int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,
1008
			   void *tcam_priv,
1009 1010
			   struct mlxsw_sp_acl_tcam_region *region,
			   void *hints_priv);
1011
	void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);
1012 1013
	int (*region_associate)(struct mlxsw_sp *mlxsw_sp,
				struct mlxsw_sp_acl_tcam_region *region);
1014 1015
	void * (*region_rehash_hints_get)(void *region_priv);
	void (*region_rehash_hints_put)(void *hints_priv);
1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
	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);
1028
	int (*entry_action_replace)(struct mlxsw_sp *mlxsw_sp,
1029
				    void *region_priv, void *entry_priv,
1030
				    struct mlxsw_sp_acl_rule_info *rulei);
1031 1032 1033 1034 1035 1036 1037
	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;
1038

1039 1040 1041
/* spectrum2_acl_tcam.c */
extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops;

1042 1043
/* spectrum_acl_flex_actions.c */
extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops;
1044
extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;
1045

1046 1047
/* spectrum_acl_flex_keys.c */
extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;
1048
extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;
1049

1050
/* spectrum_matchall.c */
1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061
enum mlxsw_sp_mall_action_type {
	MLXSW_SP_MALL_ACTION_TYPE_MIRROR,
	MLXSW_SP_MALL_ACTION_TYPE_SAMPLE,
	MLXSW_SP_MALL_ACTION_TYPE_TRAP,
};

struct mlxsw_sp_mall_mirror_entry {
	const struct net_device *to_dev;
	int span_id;
};

1062 1063 1064 1065
struct mlxsw_sp_mall_trap_entry {
	int span_id;
};

1066 1067 1068 1069 1070 1071 1072 1073
struct mlxsw_sp_mall_entry {
	struct list_head list;
	unsigned long cookie;
	unsigned int priority;
	enum mlxsw_sp_mall_action_type type;
	bool ingress;
	union {
		struct mlxsw_sp_mall_mirror_entry mirror;
1074
		struct mlxsw_sp_mall_trap_entry trap;
1075 1076 1077 1078 1079
		struct mlxsw_sp_port_sample sample;
	};
	struct rcu_head rcu;
};

1080 1081
int mlxsw_sp_mall_replace(struct mlxsw_sp *mlxsw_sp,
			  struct mlxsw_sp_flow_block *block,
1082 1083
			  struct tc_cls_matchall_offload *f);
void mlxsw_sp_mall_destroy(struct mlxsw_sp_flow_block *block,
1084
			   struct tc_cls_matchall_offload *f);
1085 1086 1087 1088
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);
1089 1090
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);
1091

1092
/* spectrum_flower.c */
1093
int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp,
1094
			    struct mlxsw_sp_flow_block *block,
1095
			    struct flow_cls_offload *f);
1096
void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp,
1097
			     struct mlxsw_sp_flow_block *block,
1098
			     struct flow_cls_offload *f);
1099
int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
1100
			  struct mlxsw_sp_flow_block *block,
1101
			  struct flow_cls_offload *f);
1102
int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp,
1103
				 struct mlxsw_sp_flow_block *block,
1104
				 struct flow_cls_offload *f);
1105
void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp,
1106
				   struct mlxsw_sp_flow_block *block,
1107
				   struct flow_cls_offload *f);
1108 1109 1110 1111
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);
1112

1113
/* spectrum_qdisc.c */
1114 1115
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);
1116 1117
int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_red_qopt_offload *p);
1118 1119
int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
			   struct tc_prio_qopt_offload *p);
1120 1121
int mlxsw_sp_setup_tc_ets(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_ets_qopt_offload *p);
1122 1123
int mlxsw_sp_setup_tc_tbf(struct mlxsw_sp_port *mlxsw_sp_port,
			  struct tc_tbf_qopt_offload *p);
1124 1125
int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
			   struct tc_fifo_qopt_offload *p);
1126 1127
int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_port,
					      struct flow_block_offload *f);
1128

1129
/* spectrum_fid.c */
1130
bool mlxsw_sp_fid_is_dummy(struct mlxsw_sp *mlxsw_sp, u16 fid_index);
1131
bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid);
1132 1133
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
						  u16 fid_index);
1134
int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
1135 1136
int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,
			  enum mlxsw_sp_nve_type *p_type);
1137 1138
struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp,
						__be32 vni);
1139 1140 1141 1142 1143
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);
1144 1145
int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
			 __be32 vni, int nve_ifindex);
1146 1147
void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid);
bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid);
1148 1149
void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
				    const struct net_device *nve_dev);
1150 1151 1152 1153 1154 1155 1156 1157 1158 1159
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);
1160
struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid);
1161 1162 1163 1164
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);
1165 1166 1167
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);
1168 1169
struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp,
					       u16 vid);
1170 1171
struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp,
					       int br_ifindex);
1172 1173 1174 1175 1176 1177 1178 1179 1180
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);

1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213
/* 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;

1214 1215 1216
/* spectrum2_mr_tcam.c */
extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops;

1217 1218 1219 1220 1221
/* spectrum_nve.c */
struct mlxsw_sp_nve_params {
	enum mlxsw_sp_nve_type type;
	__be32 vni;
	const struct net_device *dev;
1222
	u16 ethertype;
1223 1224 1225 1226 1227
};

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

1228 1229 1230
int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip,
				    enum mlxsw_sp_l3proto proto,
				    union mlxsw_sp_l3addr *addr);
1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248
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);

1249 1250 1251 1252
/* 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);

1253 1254 1255 1256 1257 1258 1259 1260 1261
/* 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,
1262 1263
			     enum devlink_trap_action action,
			     struct netlink_ext_ack *extack);
1264 1265
int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
			     const struct devlink_trap_group *group);
1266 1267
int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,
			    const struct devlink_trap_group *group,
1268 1269
			    const struct devlink_trap_policer *policer,
			    struct netlink_ext_ack *extack);
1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282
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);
1283 1284
int mlxsw_sp_trap_group_policer_hw_id_get(struct mlxsw_sp *mlxsw_sp, u16 id,
					  bool *p_enabled, u16 *p_hw_id);
1285

1286 1287 1288 1289 1290
static inline struct net *mlxsw_sp_net(struct mlxsw_sp *mlxsw_sp)
{
	return mlxsw_core_net(mlxsw_sp->core);
}

1291 1292
/* spectrum_ethtool.c */
extern const struct ethtool_ops mlxsw_sp_port_ethtool_ops;
1293 1294
extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp1_port_type_speed_ops;
extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp2_port_type_speed_ops;
1295

1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324
/* spectrum_policer.c */
extern const struct mlxsw_sp_policer_core_ops mlxsw_sp1_policer_core_ops;
extern const struct mlxsw_sp_policer_core_ops mlxsw_sp2_policer_core_ops;

enum mlxsw_sp_policer_type {
	MLXSW_SP_POLICER_TYPE_SINGLE_RATE,

	__MLXSW_SP_POLICER_TYPE_MAX,
	MLXSW_SP_POLICER_TYPE_MAX = __MLXSW_SP_POLICER_TYPE_MAX - 1,
};

struct mlxsw_sp_policer_params {
	u64 rate;
	u64 burst;
	bool bytes;
};

int mlxsw_sp_policer_add(struct mlxsw_sp *mlxsw_sp,
			 enum mlxsw_sp_policer_type type,
			 const struct mlxsw_sp_policer_params *params,
			 struct netlink_ext_ack *extack, u16 *p_policer_index);
void mlxsw_sp_policer_del(struct mlxsw_sp *mlxsw_sp,
			  enum mlxsw_sp_policer_type type,
			  u16 policer_index);
int mlxsw_sp_policer_drops_counter_get(struct mlxsw_sp *mlxsw_sp,
				       enum mlxsw_sp_policer_type type,
				       u16 policer_index, u64 *p_drops);
int mlxsw_sp_policers_init(struct mlxsw_sp *mlxsw_sp);
void mlxsw_sp_policers_fini(struct mlxsw_sp *mlxsw_sp);
1325
int mlxsw_sp_policer_resources_register(struct mlxsw_core *mlxsw_core);
1326

1327
#endif