19948a064SJiri Pirko /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
29948a064SJiri Pirko /* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
356ade8feSJiri Pirko 
456ade8feSJiri Pirko #ifndef _MLXSW_SPECTRUM_H
556ade8feSJiri Pirko #define _MLXSW_SPECTRUM_H
656ade8feSJiri Pirko 
7cc69837fSJakub Kicinski #include <linux/ethtool.h>
856ade8feSJiri Pirko #include <linux/types.h>
956ade8feSJiri Pirko #include <linux/netdevice.h>
106cf3c971SJiri Pirko #include <linux/rhashtable.h>
1156ade8feSJiri Pirko #include <linux/bitops.h>
12d70e42b2SIdo Schimmel #include <linux/if_bridge.h>
1356ade8feSJiri Pirko #include <linux/if_vlan.h>
147f71eb46SIdo Schimmel #include <linux/list.h>
158e8dfe9fSIdo Schimmel #include <linux/dcbnl.h>
165e9c16ccSJiri Pirko #include <linux/in6.h>
17b45f64d1SJiri Pirko #include <linux/notifier.h>
18053e92aaSJiri Pirko #include <linux/net_namespace.h>
191b9fc42eSIdo Schimmel #include <linux/spinlock.h>
2098d0f7b9SYotam Gigi #include <net/psample.h>
217aa0f5aaSJiri Pirko #include <net/pkt_cls.h>
22861fb829SNogah Frankel #include <net/red.h>
231c30d183SIdo Schimmel #include <net/vxlan.h>
246d19d2bdSJiri Pirko #include <net/flow_offload.h>
2566167c31SIdo Schimmel #include <net/inet_ecn.h>
2656ade8feSJiri Pirko 
273a49b4fdSElad Raz #include "port.h"
2856ade8feSJiri Pirko #include "core.h"
2922a67766SJiri Pirko #include "core_acl_flex_keys.h"
3022a67766SJiri Pirko #include "core_acl_flex_actions.h"
31b2b1dab6SPetr Machata #include "reg.h"
3256ade8feSJiri Pirko 
330417d25eSIdo Schimmel #define MLXSW_SP_DEFAULT_VID (VLAN_N_VID - 1)
34a2d2a205SIdo Schimmel 
35a1107487SIdo Schimmel #define MLXSW_SP_FID_8021D_MAX 1024
367f71eb46SIdo Schimmel 
3753ae6283SElad Raz #define MLXSW_SP_MID_MAX 7000
3853ae6283SElad Raz 
39f11fbaf8SIdo Schimmel #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
40403547d3SNogah Frankel #define MLXSW_SP_KVD_GRANULARITY 128
41c6022427SJiri Pirko 
42ef3116e5SArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD "kvd"
43ef3116e5SArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR "linear"
44ef3116e5SArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE "hash_single"
45ef3116e5SArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE "hash_double"
4651d3c08eSArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES "singles"
4751d3c08eSArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks"
4851d3c08eSArkadi Sharshevsky #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks"
49ef3116e5SArkadi Sharshevsky 
50868678c5SDanielle Ratson #define MLXSW_SP_RESOURCE_NAME_SPAN "span_agents"
51868678c5SDanielle Ratson 
52d53cdbb8SJiri Pirko #define MLXSW_SP_RESOURCE_NAME_COUNTERS "counters"
53d53cdbb8SJiri Pirko #define MLXSW_SP_RESOURCE_NAME_COUNTERS_FLOW "flow"
54d53cdbb8SJiri Pirko #define MLXSW_SP_RESOURCE_NAME_COUNTERS_RIF "rif"
55d53cdbb8SJiri Pirko 
56ef3116e5SArkadi Sharshevsky enum mlxsw_sp_resource_id {
57321f7ab0SDanielle Ratson 	MLXSW_SP_RESOURCE_KVD = MLXSW_CORE_RESOURCE_MAX,
58ef3116e5SArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_LINEAR,
59ef3116e5SArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
60ef3116e5SArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
6151d3c08eSArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
6251d3c08eSArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
6351d3c08eSArkadi Sharshevsky 	MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
64868678c5SDanielle Ratson 	MLXSW_SP_RESOURCE_SPAN,
65d53cdbb8SJiri Pirko 	MLXSW_SP_RESOURCE_COUNTERS,
66d53cdbb8SJiri Pirko 	MLXSW_SP_RESOURCE_COUNTERS_FLOW,
67d53cdbb8SJiri Pirko 	MLXSW_SP_RESOURCE_COUNTERS_RIF,
68bf038f03SIdo Schimmel 	MLXSW_SP_RESOURCE_GLOBAL_POLICERS,
69bf038f03SIdo Schimmel 	MLXSW_SP_RESOURCE_SINGLE_RATE_POLICERS,
701c375ffbSDanielle Ratson 	MLXSW_SP_RESOURCE_RIF_MAC_PROFILES,
714ec2feb2SPetr Machata 	MLXSW_SP_RESOURCE_RIFS,
7274d6786cSIdo Schimmel 	MLXSW_SP_RESOURCE_PORT_RANGE_REGISTERS,
73ef3116e5SArkadi Sharshevsky };
74ef3116e5SArkadi Sharshevsky 
7556ade8feSJiri Pirko struct mlxsw_sp_port;
764724ba56SIdo Schimmel struct mlxsw_sp_rif;
77a629ef21SPetr Machata struct mlxsw_sp_span_entry;
786e6030bdSIdo Schimmel enum mlxsw_sp_l3proto;
796e6030bdSIdo Schimmel union mlxsw_sp_l3addr;
8056ade8feSJiri Pirko 
810d65fc13SJiri Pirko struct mlxsw_sp_upper {
820d65fc13SJiri Pirko 	struct net_device *dev;
830d65fc13SJiri Pirko 	unsigned int ref_count;
840d65fc13SJiri Pirko };
850d65fc13SJiri Pirko 
86a1107487SIdo Schimmel enum mlxsw_sp_rif_type {
87a1107487SIdo Schimmel 	MLXSW_SP_RIF_TYPE_SUBPORT,
88662761d8SAmit Cohen 	MLXSW_SP_RIF_TYPE_VLAN,
89a1107487SIdo Schimmel 	MLXSW_SP_RIF_TYPE_FID,
906ddb7426SPetr Machata 	MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */
91a1107487SIdo Schimmel 	MLXSW_SP_RIF_TYPE_MAX,
92a1107487SIdo Schimmel };
93a1107487SIdo Schimmel 
94d354fdd9SIdo Schimmel struct mlxsw_sp_router_ops;
951f5b2303SNir Dotan 
96d354fdd9SIdo Schimmel extern const struct mlxsw_sp_router_ops mlxsw_sp1_router_ops;
97d354fdd9SIdo Schimmel extern const struct mlxsw_sp_router_ops mlxsw_sp2_router_ops;
981f5b2303SNir Dotan 
990f74fa56SAmit Cohen struct mlxsw_sp_switchdev_ops;
1000f74fa56SAmit Cohen 
1010f74fa56SAmit Cohen extern const struct mlxsw_sp_switchdev_ops mlxsw_sp1_switchdev_ops;
1020f74fa56SAmit Cohen extern const struct mlxsw_sp_switchdev_ops mlxsw_sp2_switchdev_ops;
1030f74fa56SAmit Cohen 
104a1107487SIdo Schimmel enum mlxsw_sp_fid_type {
105a1107487SIdo Schimmel 	MLXSW_SP_FID_TYPE_8021Q,
106a1107487SIdo Schimmel 	MLXSW_SP_FID_TYPE_8021D,
107a1107487SIdo Schimmel 	MLXSW_SP_FID_TYPE_RFID,
108a1107487SIdo Schimmel 	MLXSW_SP_FID_TYPE_DUMMY,
109a1107487SIdo Schimmel 	MLXSW_SP_FID_TYPE_MAX,
1107f71eb46SIdo Schimmel };
1117f71eb46SIdo Schimmel 
1122a36c125SPetr Machata enum mlxsw_sp_nve_type {
1132a36c125SPetr Machata 	MLXSW_SP_NVE_TYPE_VXLAN,
1142a36c125SPetr Machata };
1152a36c125SPetr Machata 
11633cbd87cSIdo Schimmel struct mlxsw_sp_sb;
1175f6935c6SIdo Schimmel struct mlxsw_sp_bridge;
1189011b677SIdo Schimmel struct mlxsw_sp_router;
1190e14c777SYotam Gigi struct mlxsw_sp_mr;
12022a67766SJiri Pirko struct mlxsw_sp_acl;
121ff7b0d27SArkadi Sharshevsky struct mlxsw_sp_counter_pool;
122a1107487SIdo Schimmel struct mlxsw_sp_fid_core;
123a875a2eeSIdo Schimmel struct mlxsw_sp_kvdl;
1246e6030bdSIdo Schimmel struct mlxsw_sp_nve;
125ebcff743SJiri Pirko struct mlxsw_sp_kvdl_ops;
1268fae4392SJiri Pirko struct mlxsw_sp_mr_tcam_ops;
1273cc9a15aSPetr Machata struct mlxsw_sp_acl_rulei_ops;
12864eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_ops;
1296e6030bdSIdo Schimmel struct mlxsw_sp_nve_ops;
130a41b9626SPetr Machata struct mlxsw_sp_sb_ops;
131c39f3e0eSPetr Machata struct mlxsw_sp_sb_vals;
132c5b870dfSShalom Toledo struct mlxsw_sp_port_type_speed_ops;
133810256ceSPetr Machata struct mlxsw_sp_ptp_state;
134412cd2adSShalom Toledo struct mlxsw_sp_ptp_ops;
135ff9fdfecSJiri Pirko struct mlxsw_sp_span_ops;
136ee88450dSPetr Machata struct mlxsw_sp_qdisc_state;
137e09a5955SIdo Schimmel struct mlxsw_sp_mall_entry;
138d8782ec5SAmit Cohen struct mlxsw_sp_pgt;
13922a67766SJiri Pirko 
1404a7f970fSJiri Pirko struct mlxsw_sp_port_mapping {
1414a7f970fSJiri Pirko 	u8 module;
1426445eef0SJiri Pirko 	u8 slot_index;
14332ada69bSJiri Pirko 	u8 width; /* Number of lanes used by the port */
14432ada69bSJiri Pirko 	u8 module_width; /* Number of lanes in the module (static) */
1454a7f970fSJiri Pirko 	u8 lane;
1464a7f970fSJiri Pirko };
1474a7f970fSJiri Pirko 
148b0ec003eSJiri Pirko struct mlxsw_sp_port_mapping_events {
149b0ec003eSJiri Pirko 	struct list_head queue;
150b0ec003eSJiri Pirko 	spinlock_t queue_lock; /* protects queue */
151b0ec003eSJiri Pirko 	struct work_struct work;
152b0ec003eSJiri Pirko };
153b0ec003eSJiri Pirko 
1542d91f080SAmit Cohen struct mlxsw_sp_parsing {
1552d91f080SAmit Cohen 	refcount_t parsing_depth_ref;
1562d91f080SAmit Cohen 	u16 parsing_depth;
1572d91f080SAmit Cohen 	u16 vxlan_udp_dport;
1582d91f080SAmit Cohen 	struct mutex lock; /* Protects parsing configuration */
1592d91f080SAmit Cohen };
1602d91f080SAmit Cohen 
16156ade8feSJiri Pirko struct mlxsw_sp {
16256ade8feSJiri Pirko 	struct mlxsw_sp_port **ports;
16356ade8feSJiri Pirko 	struct mlxsw_core *core;
16456ade8feSJiri Pirko 	const struct mlxsw_bus_info *bus_info;
16556ade8feSJiri Pirko 	unsigned char base_mac[ETH_ALEN];
1669329b816SPetr Machata 	const unsigned char *mac_mask;
167ce0bd2b0SNogah Frankel 	struct mlxsw_sp_upper *lags;
168d3ad2d88SJiri Pirko 	struct mlxsw_sp_port_mapping *port_mapping;
169b0ec003eSJiri Pirko 	struct mlxsw_sp_port_mapping_events port_mapping_events;
1701b9fc42eSIdo Schimmel 	struct rhashtable sample_trigger_ht;
17133cbd87cSIdo Schimmel 	struct mlxsw_sp_sb *sb;
1725f6935c6SIdo Schimmel 	struct mlxsw_sp_bridge *bridge;
1739011b677SIdo Schimmel 	struct mlxsw_sp_router *router;
174c011ec1bSYotam Gigi 	struct mlxsw_sp_mr *mr;
175d3b939b8SYotam Gigi 	struct mlxsw_afa *afa;
17622a67766SJiri Pirko 	struct mlxsw_sp_acl *acl;
177a1107487SIdo Schimmel 	struct mlxsw_sp_fid_core *fid_core;
1788d3fbae7SIdo Schimmel 	struct mlxsw_sp_policer_core *policer_core;
179b3eb04beSIdo Schimmel 	struct mlxsw_sp_port_range_core *pr_core;
180a875a2eeSIdo Schimmel 	struct mlxsw_sp_kvdl *kvdl;
1816e6030bdSIdo Schimmel 	struct mlxsw_sp_nve *nve;
182c30f5d01SPetr Machata 	struct notifier_block netdevice_nb;
183412cd2adSShalom Toledo 	struct mlxsw_sp_ptp_clock *clock;
184810256ceSPetr Machata 	struct mlxsw_sp_ptp_state *ptp_state;
185ff7b0d27SArkadi Sharshevsky 	struct mlxsw_sp_counter_pool *counter_pool;
1869a9f8d1eSIdo Schimmel 	struct mlxsw_sp_span *span;
18703484e49SIdo Schimmel 	struct mlxsw_sp_trap *trap;
1882d91f080SAmit Cohen 	struct mlxsw_sp_parsing parsing;
1890f74fa56SAmit Cohen 	const struct mlxsw_sp_switchdev_ops *switchdev_ops;
190ebcff743SJiri Pirko 	const struct mlxsw_sp_kvdl_ops *kvdl_ops;
1919dbab6f5SJiri Pirko 	const struct mlxsw_afa_ops *afa_ops;
192c17d2083SJiri Pirko 	const struct mlxsw_afk_ops *afk_ops;
1938fae4392SJiri Pirko 	const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
1943cc9a15aSPetr Machata 	const struct mlxsw_sp_acl_rulei_ops *acl_rulei_ops;
19564eccd00SJiri Pirko 	const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
19658723d2fSAmit Cohen 	const struct mlxsw_sp_acl_bf_ops *acl_bf_ops;
1976e6030bdSIdo Schimmel 	const struct mlxsw_sp_nve_ops **nve_ops_arr;
198c39f3e0eSPetr Machata 	const struct mlxsw_sp_sb_vals *sb_vals;
199a41b9626SPetr Machata 	const struct mlxsw_sp_sb_ops *sb_ops;
200c5b870dfSShalom Toledo 	const struct mlxsw_sp_port_type_speed_ops *port_type_speed_ops;
201412cd2adSShalom Toledo 	const struct mlxsw_sp_ptp_ops *ptp_ops;
202ff9fdfecSJiri Pirko 	const struct mlxsw_sp_span_ops *span_ops;
2038d3fbae7SIdo Schimmel 	const struct mlxsw_sp_policer_core_ops *policer_core_ops;
20436d1fd68SIdo Schimmel 	const struct mlxsw_sp_trap_ops *trap_ops;
20520afb9bcSIdo Schimmel 	const struct mlxsw_sp_mall_ops *mall_ops;
206d354fdd9SIdo Schimmel 	const struct mlxsw_sp_router_ops *router_ops;
207dadbc6bcSPetr Machata 	const struct mlxsw_listener *listeners;
20804e85970SAmit Cohen 	const struct mlxsw_sp_fid_family **fid_family_arr;
209dadbc6bcSPetr Machata 	size_t listeners_count;
21047259544SPetr Machata 	u32 lowest_shaper_bs;
211e846efe2SAmit Cohen 	struct rhashtable ipv6_addr_ht;
212e846efe2SAmit Cohen 	struct mutex ipv6_addr_ht_lock; /* Protects ipv6_addr_ht */
213d8782ec5SAmit Cohen 	struct mlxsw_sp_pgt *pgt;
214a1697d11SAmit Cohen 	bool pgt_smpe_index_valid;
21556ade8feSJiri Pirko };
21656ade8feSJiri Pirko 
217614d509aSAmit Cohen struct mlxsw_sp_ptp_ops {
218614d509aSAmit Cohen 	struct mlxsw_sp_ptp_clock *
219614d509aSAmit Cohen 		(*clock_init)(struct mlxsw_sp *mlxsw_sp, struct device *dev);
220614d509aSAmit Cohen 	void (*clock_fini)(struct mlxsw_sp_ptp_clock *clock);
221614d509aSAmit Cohen 
222614d509aSAmit Cohen 	struct mlxsw_sp_ptp_state *(*init)(struct mlxsw_sp *mlxsw_sp);
223614d509aSAmit Cohen 	void (*fini)(struct mlxsw_sp_ptp_state *ptp_state);
224614d509aSAmit Cohen 
225614d509aSAmit Cohen 	/* Notify a driver that a packet that might be PTP was received. Driver
226614d509aSAmit Cohen 	 * is responsible for freeing the passed-in SKB.
227614d509aSAmit Cohen 	 */
228614d509aSAmit Cohen 	void (*receive)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
229c934757dSAmit Cohen 			u16 local_port);
230614d509aSAmit Cohen 
231614d509aSAmit Cohen 	/* Notify a driver that a timestamped packet was transmitted. Driver
232614d509aSAmit Cohen 	 * is responsible for freeing the passed-in SKB.
233614d509aSAmit Cohen 	 */
234614d509aSAmit Cohen 	void (*transmitted)(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
235c934757dSAmit Cohen 			    u16 local_port);
236614d509aSAmit Cohen 
237614d509aSAmit Cohen 	int (*hwtstamp_get)(struct mlxsw_sp_port *mlxsw_sp_port,
238614d509aSAmit Cohen 			    struct hwtstamp_config *config);
239614d509aSAmit Cohen 	int (*hwtstamp_set)(struct mlxsw_sp_port *mlxsw_sp_port,
240614d509aSAmit Cohen 			    struct hwtstamp_config *config);
241614d509aSAmit Cohen 	void (*shaper_work)(struct work_struct *work);
242614d509aSAmit Cohen 	int (*get_ts_info)(struct mlxsw_sp *mlxsw_sp,
243614d509aSAmit Cohen 			   struct ethtool_ts_info *info);
244614d509aSAmit Cohen 	int (*get_stats_count)(void);
245614d509aSAmit Cohen 	void (*get_stats_strings)(u8 **p);
246614d509aSAmit Cohen 	void (*get_stats)(struct mlxsw_sp_port *mlxsw_sp_port,
247614d509aSAmit Cohen 			  u64 *data, int data_index);
24824157bc6SDanielle Ratson 	int (*txhdr_construct)(struct mlxsw_core *mlxsw_core,
24924157bc6SDanielle Ratson 			       struct mlxsw_sp_port *mlxsw_sp_port,
25024157bc6SDanielle Ratson 			       struct sk_buff *skb,
25124157bc6SDanielle Ratson 			       const struct mlxsw_tx_info *tx_info);
252614d509aSAmit Cohen };
253614d509aSAmit Cohen 
2540d65fc13SJiri Pirko static inline struct mlxsw_sp_upper *
mlxsw_sp_lag_get(struct mlxsw_sp * mlxsw_sp,u16 lag_id)2550d65fc13SJiri Pirko mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
2560d65fc13SJiri Pirko {
2570d65fc13SJiri Pirko 	return &mlxsw_sp->lags[lag_id];
2580d65fc13SJiri Pirko }
2590d65fc13SJiri Pirko 
26056ade8feSJiri Pirko struct mlxsw_sp_port_pcpu_stats {
26156ade8feSJiri Pirko 	u64			rx_packets;
26256ade8feSJiri Pirko 	u64			rx_bytes;
26356ade8feSJiri Pirko 	u64			tx_packets;
26456ade8feSJiri Pirko 	u64			tx_bytes;
26556ade8feSJiri Pirko 	struct u64_stats_sync	syncp;
26656ade8feSJiri Pirko 	u32			tx_dropped;
26756ade8feSJiri Pirko };
26856ade8feSJiri Pirko 
2691b9fc42eSIdo Schimmel enum mlxsw_sp_sample_trigger_type {
2701b9fc42eSIdo Schimmel 	MLXSW_SP_SAMPLE_TRIGGER_TYPE_INGRESS,
2711b9fc42eSIdo Schimmel 	MLXSW_SP_SAMPLE_TRIGGER_TYPE_EGRESS,
27245aad0b7SIdo Schimmel 	MLXSW_SP_SAMPLE_TRIGGER_TYPE_POLICY_ENGINE,
2731b9fc42eSIdo Schimmel };
2741b9fc42eSIdo Schimmel 
2751b9fc42eSIdo Schimmel struct mlxsw_sp_sample_trigger {
2761b9fc42eSIdo Schimmel 	enum mlxsw_sp_sample_trigger_type type;
277c934757dSAmit Cohen 	u16 local_port; /* Reserved when trigger type is not ingress / egress. */
2781b9fc42eSIdo Schimmel };
2791b9fc42eSIdo Schimmel 
2801b9fc42eSIdo Schimmel struct mlxsw_sp_sample_params {
2811b9fc42eSIdo Schimmel 	struct psample_group *psample_group;
2821b9fc42eSIdo Schimmel 	u32 trunc_size;
2831b9fc42eSIdo Schimmel 	u32 rate;
2841b9fc42eSIdo Schimmel 	bool truncate;
2851b9fc42eSIdo Schimmel };
2861b9fc42eSIdo Schimmel 
287c57529e1SIdo Schimmel struct mlxsw_sp_bridge_port;
288a1107487SIdo Schimmel struct mlxsw_sp_fid;
289c57529e1SIdo Schimmel 
29031a08a52SIdo Schimmel struct mlxsw_sp_port_vlan {
29131a08a52SIdo Schimmel 	struct list_head list;
29231a08a52SIdo Schimmel 	struct mlxsw_sp_port *mlxsw_sp_port;
29331a08a52SIdo Schimmel 	struct mlxsw_sp_fid *fid;
29431a08a52SIdo Schimmel 	u16 vid;
295c57529e1SIdo Schimmel 	struct mlxsw_sp_bridge_port *bridge_port;
296c57529e1SIdo Schimmel 	struct list_head bridge_vlan_node;
29731a08a52SIdo Schimmel };
29831a08a52SIdo Schimmel 
299075ab8adSNogah Frankel /* No need an internal lock; At worse - miss a single periodic iteration */
300075ab8adSNogah Frankel struct mlxsw_sp_port_xstats {
301075ab8adSNogah Frankel 	u64 ecn;
30215be36b8SPetr Machata 	u64 tc_ecn[TC_MAX_QUEUE];
303075ab8adSNogah Frankel 	u64 wred_drop[TC_MAX_QUEUE];
304075ab8adSNogah Frankel 	u64 tail_drop[TC_MAX_QUEUE];
305075ab8adSNogah Frankel 	u64 backlog[TC_MAX_QUEUE];
3062f88047eSNogah Frankel 	u64 tx_bytes[IEEE_8021QAZ_MAX_TCS];
3072f88047eSNogah Frankel 	u64 tx_packets[IEEE_8021QAZ_MAX_TCS];
308075ab8adSNogah Frankel };
309075ab8adSNogah Frankel 
310dc4f3eb0SPetr Machata struct mlxsw_sp_ptp_port_dir_stats {
311dc4f3eb0SPetr Machata 	u64 packets;
312dc4f3eb0SPetr Machata 	u64 timestamps;
313dc4f3eb0SPetr Machata };
314dc4f3eb0SPetr Machata 
315dc4f3eb0SPetr Machata struct mlxsw_sp_ptp_port_stats {
316dc4f3eb0SPetr Machata 	struct mlxsw_sp_ptp_port_dir_stats rx_gcd;
317dc4f3eb0SPetr Machata 	struct mlxsw_sp_ptp_port_dir_stats tx_gcd;
318dc4f3eb0SPetr Machata };
319dc4f3eb0SPetr Machata 
32056ade8feSJiri Pirko struct mlxsw_sp_port {
32156ade8feSJiri Pirko 	struct net_device *dev;
32256ade8feSJiri Pirko 	struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
32356ade8feSJiri Pirko 	struct mlxsw_sp *mlxsw_sp;
324c934757dSAmit Cohen 	u16 local_port;
325c57529e1SIdo Schimmel 	u8 lagged:1,
326dc0d1a8bSIdo Schimmel 	   split:1,
327dc0d1a8bSIdo Schimmel 	   security:1;
32856ade8feSJiri Pirko 	u16 pvid;
3290d65fc13SJiri Pirko 	u16 lag_id;
3307f71eb46SIdo Schimmel 	struct {
3319f7ec052SIdo Schimmel 		u8 tx_pause:1,
3320c83f88cSIdo Schimmel 		   rx_pause:1,
3330c83f88cSIdo Schimmel 		   autoneg:1;
3349f7ec052SIdo Schimmel 	} link;
3359f7ec052SIdo Schimmel 	struct {
3368e8dfe9fSIdo Schimmel 		struct ieee_ets *ets;
337cc7cf517SIdo Schimmel 		struct ieee_maxrate *maxrate;
338d81a6bdbSIdo Schimmel 		struct ieee_pfc *pfc;
339b2b1dab6SPetr Machata 		enum mlxsw_reg_qpts_trust_state trust_state;
3408e8dfe9fSIdo Schimmel 	} dcb;
3414a7f970fSJiri Pirko 	struct mlxsw_sp_port_mapping mapping; /* mapping is constant during the
3424a7f970fSJiri Pirko 					       * mlxsw_sp_port lifetime, however
3434a7f970fSJiri Pirko 					       * the same localport can have
3444a7f970fSJiri Pirko 					       * different mapping.
3454a7f970fSJiri Pirko 					       */
346fc1bbb0fSNogah Frankel 	struct {
347fc1bbb0fSNogah Frankel 		#define MLXSW_HW_STATS_UPDATE_TIME HZ
3489deef43dSNogah Frankel 		struct rtnl_link_stats64 stats;
349075ab8adSNogah Frankel 		struct mlxsw_sp_port_xstats xstats;
350fc1bbb0fSNogah Frankel 		struct delayed_work update_dw;
3519deef43dSNogah Frankel 	} periodic_hw_stats;
35231a08a52SIdo Schimmel 	struct list_head vlans_list;
353346fca3bSIdo Schimmel 	struct mlxsw_sp_port_vlan *default_vlan;
354ee88450dSPetr Machata 	struct mlxsw_sp_qdisc_state *qdisc;
3559454d930SJiri Pirko 	unsigned acl_rule_count;
3563bc3ffb6SJiri Pirko 	struct mlxsw_sp_flow_block *ing_flow_block;
3573bc3ffb6SJiri Pirko 	struct mlxsw_sp_flow_block *eg_flow_block;
358d92e4e6eSPetr Machata 	struct {
3595fc17338SShalom Toledo 		struct delayed_work shaper_dw;
360d92e4e6eSPetr Machata 		struct hwtstamp_config hwtstamp_config;
361d92e4e6eSPetr Machata 		u16 ing_types;
362d92e4e6eSPetr Machata 		u16 egr_types;
363dc4f3eb0SPetr Machata 		struct mlxsw_sp_ptp_port_stats stats;
364d92e4e6eSPetr Machata 	} ptp;
3652ecf87aeSPetr Machata 	int max_mtu;
3663232e8c6SPetr Machata 	u32 max_speed;
3673a77f5a2SPetr Machata 	struct mlxsw_sp_hdroom *hdroom;
3683bdbab3fSAmit Cohen 	u64 module_overheat_initial_val;
36956ade8feSJiri Pirko };
37056ade8feSJiri Pirko 
371c5b870dfSShalom Toledo struct mlxsw_sp_port_type_speed_ops {
372c5b870dfSShalom Toledo 	void (*from_ptys_supported_port)(struct mlxsw_sp *mlxsw_sp,
373c5b870dfSShalom Toledo 					 u32 ptys_eth_proto,
374c5b870dfSShalom Toledo 					 struct ethtool_link_ksettings *cmd);
375c5b870dfSShalom Toledo 	void (*from_ptys_link)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto,
3765fc4053dSDanielle Ratson 			       unsigned long *mode);
3774ae5cc42SShalom Toledo 	u32 (*from_ptys_speed)(struct mlxsw_sp *mlxsw_sp, u32 ptys_eth_proto);
37825a96f05SDanielle Ratson 	void (*from_ptys_link_mode)(struct mlxsw_sp *mlxsw_sp,
379c5b870dfSShalom Toledo 				    bool carrier_ok, u32 ptys_eth_proto,
380c5b870dfSShalom Toledo 				    struct ethtool_link_ksettings *cmd);
38160fbc521SPetr Machata 	int (*ptys_max_speed)(struct mlxsw_sp_port *mlxsw_sp_port, u32 *p_max_speed);
3825fc4053dSDanielle Ratson 	u32 (*to_ptys_advert_link)(struct mlxsw_sp *mlxsw_sp,
383c5b870dfSShalom Toledo 				   const struct ethtool_link_ksettings *cmd);
384763ece86SDanielle Ratson 	u32 (*to_ptys_speed_lanes)(struct mlxsw_sp *mlxsw_sp, u8 width,
385763ece86SDanielle Ratson 				   const struct ethtool_link_ksettings *cmd);
386c5b870dfSShalom Toledo 	void (*reg_ptys_eth_pack)(struct mlxsw_sp *mlxsw_sp, char *payload,
387c934757dSAmit Cohen 				  u16 local_port, u32 proto_admin, bool autoneg);
388c5b870dfSShalom Toledo 	void (*reg_ptys_eth_unpack)(struct mlxsw_sp *mlxsw_sp, char *payload,
389c5b870dfSShalom Toledo 				    u32 *p_eth_proto_cap,
390c5b870dfSShalom Toledo 				    u32 *p_eth_proto_admin,
391c5b870dfSShalom Toledo 				    u32 *p_eth_proto_oper);
3921601559bSAmit Cohen 	u32 (*ptys_proto_cap_masked_get)(u32 eth_proto_cap);
393c5b870dfSShalom Toledo };
394c5b870dfSShalom Toledo 
395d7a7b697SAmit Cohen struct mlxsw_sp_ports_bitmap {
396d7a7b697SAmit Cohen 	unsigned long *bitmap;
397d7a7b697SAmit Cohen 	unsigned int nbits;
398d7a7b697SAmit Cohen };
399d7a7b697SAmit Cohen 
400d7a7b697SAmit Cohen static inline int
mlxsw_sp_port_bitmap_init(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_ports_bitmap * ports_bm)401d7a7b697SAmit Cohen mlxsw_sp_port_bitmap_init(struct mlxsw_sp *mlxsw_sp,
402d7a7b697SAmit Cohen 			  struct mlxsw_sp_ports_bitmap *ports_bm)
403d7a7b697SAmit Cohen {
404d7a7b697SAmit Cohen 	unsigned int nbits = mlxsw_core_max_ports(mlxsw_sp->core);
405d7a7b697SAmit Cohen 
406d7a7b697SAmit Cohen 	ports_bm->nbits = nbits;
407d7a7b697SAmit Cohen 	ports_bm->bitmap = bitmap_zalloc(nbits, GFP_KERNEL);
408d7a7b697SAmit Cohen 	if (!ports_bm->bitmap)
409d7a7b697SAmit Cohen 		return -ENOMEM;
410d7a7b697SAmit Cohen 
411d7a7b697SAmit Cohen 	return 0;
412d7a7b697SAmit Cohen }
413d7a7b697SAmit Cohen 
414d7a7b697SAmit Cohen static inline void
mlxsw_sp_port_bitmap_fini(struct mlxsw_sp_ports_bitmap * ports_bm)415d7a7b697SAmit Cohen mlxsw_sp_port_bitmap_fini(struct mlxsw_sp_ports_bitmap *ports_bm)
416d7a7b697SAmit Cohen {
417d7a7b697SAmit Cohen 	bitmap_free(ports_bm->bitmap);
418d7a7b697SAmit Cohen }
419d7a7b697SAmit Cohen 
mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn,u8 inner_ecn,bool * trap_en)42066167c31SIdo Schimmel static inline u8 mlxsw_sp_tunnel_ecn_decap(u8 outer_ecn, u8 inner_ecn,
42166167c31SIdo Schimmel 					   bool *trap_en)
42266167c31SIdo Schimmel {
42366167c31SIdo Schimmel 	bool set_ce = false;
42466167c31SIdo Schimmel 
42566167c31SIdo Schimmel 	*trap_en = !!__INET_ECN_decapsulate(outer_ecn, inner_ecn, &set_ce);
42666167c31SIdo Schimmel 	if (set_ce)
42766167c31SIdo Schimmel 		return INET_ECN_CE;
42866167c31SIdo Schimmel 	else if (outer_ecn == INET_ECN_ECT_1 && inner_ecn == INET_ECN_ECT_0)
42966167c31SIdo Schimmel 		return INET_ECN_ECT_1;
43066167c31SIdo Schimmel 	else
43166167c31SIdo Schimmel 		return inner_ecn;
43266167c31SIdo Schimmel }
43366167c31SIdo Schimmel 
4341c30d183SIdo Schimmel static inline struct net_device *
mlxsw_sp_bridge_vxlan_dev_find(struct net_device * br_dev)4351c30d183SIdo Schimmel mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev)
4361c30d183SIdo Schimmel {
4371c30d183SIdo Schimmel 	struct net_device *dev;
4381c30d183SIdo Schimmel 	struct list_head *iter;
4391c30d183SIdo Schimmel 
4401c30d183SIdo Schimmel 	netdev_for_each_lower_dev(br_dev, dev, iter) {
4411c30d183SIdo Schimmel 		if (netif_is_vxlan(dev))
4421c30d183SIdo Schimmel 			return dev;
4431c30d183SIdo Schimmel 	}
4441c30d183SIdo Schimmel 
4451c30d183SIdo Schimmel 	return NULL;
4461c30d183SIdo Schimmel }
4471c30d183SIdo Schimmel 
mlxsw_sp_bridge_has_vxlan(struct net_device * br_dev)4481c30d183SIdo Schimmel static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev)
4491c30d183SIdo Schimmel {
4501c30d183SIdo Schimmel 	return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev);
4511c30d183SIdo Schimmel }
4521c30d183SIdo Schimmel 
453d70e42b2SIdo Schimmel static inline int
mlxsw_sp_vxlan_mapped_vid(const struct net_device * vxlan_dev,u16 * p_vid)454d70e42b2SIdo Schimmel mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid)
455d70e42b2SIdo Schimmel {
456d70e42b2SIdo Schimmel 	struct bridge_vlan_info vinfo;
457d70e42b2SIdo Schimmel 	u16 vid = 0;
458d70e42b2SIdo Schimmel 	int err;
459d70e42b2SIdo Schimmel 
460d70e42b2SIdo Schimmel 	err = br_vlan_get_pvid(vxlan_dev, &vid);
461d70e42b2SIdo Schimmel 	if (err || !vid)
462d70e42b2SIdo Schimmel 		goto out;
463d70e42b2SIdo Schimmel 
464d70e42b2SIdo Schimmel 	err = br_vlan_get_info(vxlan_dev, vid, &vinfo);
465d70e42b2SIdo Schimmel 	if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED))
466d70e42b2SIdo Schimmel 		vid = 0;
467d70e42b2SIdo Schimmel 
468d70e42b2SIdo Schimmel out:
469d70e42b2SIdo Schimmel 	*p_vid = vid;
470d70e42b2SIdo Schimmel 	return err;
471d70e42b2SIdo Schimmel }
472d70e42b2SIdo Schimmel 
4739f7ec052SIdo Schimmel static inline bool
mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port * mlxsw_sp_port)4749f7ec052SIdo Schimmel mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
4759f7ec052SIdo Schimmel {
4769f7ec052SIdo Schimmel 	return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
4779f7ec052SIdo Schimmel }
4789f7ec052SIdo Schimmel 
4790d65fc13SJiri Pirko static inline struct mlxsw_sp_port *
mlxsw_sp_port_lagged_get(struct mlxsw_sp * mlxsw_sp,u16 lag_id,u8 port_index)4800d65fc13SJiri Pirko mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
4810d65fc13SJiri Pirko {
4820d65fc13SJiri Pirko 	struct mlxsw_sp_port *mlxsw_sp_port;
483c934757dSAmit Cohen 	u16 local_port;
4840d65fc13SJiri Pirko 
4850d65fc13SJiri Pirko 	local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
4860d65fc13SJiri Pirko 						lag_id, port_index);
4870d65fc13SJiri Pirko 	mlxsw_sp_port = mlxsw_sp->ports[local_port];
4880d65fc13SJiri Pirko 	return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
4890d65fc13SJiri Pirko }
4900d65fc13SJiri Pirko 
49131a08a52SIdo Schimmel static inline struct mlxsw_sp_port_vlan *
mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port * mlxsw_sp_port,u16 vid)49231a08a52SIdo Schimmel mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
49331a08a52SIdo Schimmel 			       u16 vid)
49431a08a52SIdo Schimmel {
49531a08a52SIdo Schimmel 	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
49631a08a52SIdo Schimmel 
49731a08a52SIdo Schimmel 	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
49831a08a52SIdo Schimmel 			    list) {
49931a08a52SIdo Schimmel 		if (mlxsw_sp_port_vlan->vid == vid)
50031a08a52SIdo Schimmel 			return mlxsw_sp_port_vlan;
50131a08a52SIdo Schimmel 	}
50231a08a52SIdo Schimmel 
50331a08a52SIdo Schimmel 	return NULL;
50431a08a52SIdo Schimmel }
50531a08a52SIdo Schimmel 
506a1107487SIdo Schimmel enum mlxsw_sp_flood_type {
507a1107487SIdo Schimmel 	MLXSW_SP_FLOOD_TYPE_UC,
508a1107487SIdo Schimmel 	MLXSW_SP_FLOOD_TYPE_BC,
509a1107487SIdo Schimmel 	MLXSW_SP_FLOOD_TYPE_MC,
51056ade8feSJiri Pirko };
51156ade8feSJiri Pirko 
512614d509aSAmit Cohen int mlxsw_sp_port_get_stats_raw(struct net_device *dev, int grp,
513614d509aSAmit Cohen 				int prio, char *ppcnt_pl);
514614d509aSAmit Cohen int mlxsw_sp_port_admin_status_set(struct mlxsw_sp_port *mlxsw_sp_port,
515614d509aSAmit Cohen 				   bool is_up);
51680dfeafdSAmit Cohen int
51780dfeafdSAmit Cohen mlxsw_sp_port_vlan_classification_set(struct mlxsw_sp_port *mlxsw_sp_port,
51880dfeafdSAmit Cohen 				      bool is_8021ad_tagged,
51980dfeafdSAmit Cohen 				      bool is_8021q_tagged);
520bcdfd615SAmit Cohen static inline bool
mlxsw_sp_local_port_is_valid(struct mlxsw_sp * mlxsw_sp,u16 local_port)521bcdfd615SAmit Cohen mlxsw_sp_local_port_is_valid(struct mlxsw_sp *mlxsw_sp, u16 local_port)
522bcdfd615SAmit Cohen {
523bcdfd615SAmit Cohen 	unsigned int max_ports = mlxsw_core_max_ports(mlxsw_sp->core);
524bcdfd615SAmit Cohen 
525bcdfd615SAmit Cohen 	return local_port < max_ports && local_port;
526bcdfd615SAmit Cohen }
527614d509aSAmit Cohen 
528cb4cc0e0SIdo Schimmel /* spectrum_buffers.c */
5295df825edSPetr Machata struct mlxsw_sp_hdroom_prio {
5305df825edSPetr Machata 	/* Number of port buffer associated with this priority. This is the
5315df825edSPetr Machata 	 * actually configured value.
5325df825edSPetr Machata 	 */
5335df825edSPetr Machata 	u8 buf_idx;
5345df825edSPetr Machata 	/* Value of buf_idx deduced from the DCB ETS configuration. */
5355df825edSPetr Machata 	u8 ets_buf_idx;
53669e408a2SPetr Machata 	/* Value of buf_idx taken from the dcbnl_setbuffer configuration. */
53769e408a2SPetr Machata 	u8 set_buf_idx;
538ca21e84eSPetr Machata 	bool lossy;
5395df825edSPetr Machata };
5405df825edSPetr Machata 
541ca21e84eSPetr Machata struct mlxsw_sp_hdroom_buf {
542aa7c0621SPetr Machata 	u32 thres_cells;
543aa7c0621SPetr Machata 	u32 size_cells;
54469e408a2SPetr Machata 	/* Size requirement form dcbnl_setbuffer. */
54569e408a2SPetr Machata 	u32 set_size_cells;
546ca21e84eSPetr Machata 	bool lossy;
547ca21e84eSPetr Machata };
548ca21e84eSPetr Machata 
54969e408a2SPetr Machata enum mlxsw_sp_hdroom_mode {
55069e408a2SPetr Machata 	MLXSW_SP_HDROOM_MODE_DCB,
55169e408a2SPetr Machata 	MLXSW_SP_HDROOM_MODE_TC,
55269e408a2SPetr Machata };
55369e408a2SPetr Machata 
554ca21e84eSPetr Machata #define MLXSW_SP_PB_COUNT 10
555ca21e84eSPetr Machata 
5563a77f5a2SPetr Machata struct mlxsw_sp_hdroom {
55769e408a2SPetr Machata 	enum mlxsw_sp_hdroom_mode mode;
55869e408a2SPetr Machata 
5595df825edSPetr Machata 	struct {
5605df825edSPetr Machata 		struct mlxsw_sp_hdroom_prio prio[IEEE_8021Q_MAX_PRIORITIES];
5615df825edSPetr Machata 	} prios;
562ca21e84eSPetr Machata 	struct {
563ca21e84eSPetr Machata 		struct mlxsw_sp_hdroom_buf buf[MLXSW_SP_PB_COUNT];
564ca21e84eSPetr Machata 	} bufs;
56522881adfSPetr Machata 	struct {
56622881adfSPetr Machata 		/* Size actually configured for the internal buffer. Equal to
56722881adfSPetr Machata 		 * reserve when internal buffer is enabled.
56822881adfSPetr Machata 		 */
56922881adfSPetr Machata 		u32 size_cells;
57022881adfSPetr Machata 		/* Space reserved in the headroom for the internal buffer. Port
57122881adfSPetr Machata 		 * buffers are not allowed to grow into this space.
57222881adfSPetr Machata 		 */
57322881adfSPetr Machata 		u32 reserve_cells;
57422881adfSPetr Machata 		bool enable;
57522881adfSPetr Machata 	} int_buf;
576b7e07bbdSPetr Machata 	int delay_bytes;
5770103a3e4SPetr Machata 	int mtu;
5783a77f5a2SPetr Machata };
5793a77f5a2SPetr Machata 
58056ade8feSJiri Pirko int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
5810f433fa0SJiri Pirko void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
58256ade8feSJiri Pirko int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
5833a77f5a2SPetr Machata void mlxsw_sp_port_buffers_fini(struct mlxsw_sp_port *mlxsw_sp_port);
5840f433fa0SJiri Pirko int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
5850f433fa0SJiri Pirko 			 unsigned int sb_index, u16 pool_index,
5860f433fa0SJiri Pirko 			 struct devlink_sb_pool_info *pool_info);
5870f433fa0SJiri Pirko int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
5880f433fa0SJiri Pirko 			 unsigned int sb_index, u16 pool_index, u32 size,
5898f686206SIdo Schimmel 			 enum devlink_sb_threshold_type threshold_type,
5908f686206SIdo Schimmel 			 struct netlink_ext_ack *extack);
5910f433fa0SJiri Pirko int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
5920f433fa0SJiri Pirko 			      unsigned int sb_index, u16 pool_index,
5930f433fa0SJiri Pirko 			      u32 *p_threshold);
5940f433fa0SJiri Pirko int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
5950f433fa0SJiri Pirko 			      unsigned int sb_index, u16 pool_index,
5968f686206SIdo Schimmel 			      u32 threshold, struct netlink_ext_ack *extack);
5970f433fa0SJiri Pirko int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
5980f433fa0SJiri Pirko 				 unsigned int sb_index, u16 tc_index,
5990f433fa0SJiri Pirko 				 enum devlink_sb_pool_type pool_type,
6000f433fa0SJiri Pirko 				 u16 *p_pool_index, u32 *p_threshold);
6010f433fa0SJiri Pirko int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
6020f433fa0SJiri Pirko 				 unsigned int sb_index, u16 tc_index,
6030f433fa0SJiri Pirko 				 enum devlink_sb_pool_type pool_type,
6048f686206SIdo Schimmel 				 u16 pool_index, u32 threshold,
6058f686206SIdo Schimmel 				 struct netlink_ext_ack *extack);
6062d0ed39fSJiri Pirko int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
6072d0ed39fSJiri Pirko 			     unsigned int sb_index);
6082d0ed39fSJiri Pirko int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
6092d0ed39fSJiri Pirko 			      unsigned int sb_index);
6102d0ed39fSJiri Pirko int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
6112d0ed39fSJiri Pirko 				  unsigned int sb_index, u16 pool_index,
6122d0ed39fSJiri Pirko 				  u32 *p_cur, u32 *p_max);
6132d0ed39fSJiri Pirko int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
6142d0ed39fSJiri Pirko 				     unsigned int sb_index, u16 tc_index,
6152d0ed39fSJiri Pirko 				     enum devlink_sb_pool_type pool_type,
6162d0ed39fSJiri Pirko 				     u32 *p_cur, u32 *p_max);
61733cbd87cSIdo Schimmel u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);
61833cbd87cSIdo Schimmel u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);
6195df825edSPetr Machata void mlxsw_sp_hdroom_prios_reset_buf_idx(struct mlxsw_sp_hdroom *hdroom);
620ca21e84eSPetr Machata void mlxsw_sp_hdroom_bufs_reset_lossiness(struct mlxsw_sp_hdroom *hdroom);
6212d9f703fSPetr Machata void mlxsw_sp_hdroom_bufs_reset_sizes(struct mlxsw_sp_port *mlxsw_sp_port,
6222d9f703fSPetr Machata 				      struct mlxsw_sp_hdroom *hdroom);
6232d9f703fSPetr Machata int mlxsw_sp_hdroom_configure(struct mlxsw_sp_port *mlxsw_sp_port,
6242d9f703fSPetr Machata 			      const struct mlxsw_sp_hdroom *hdroom);
6251b9fc42eSIdo Schimmel struct mlxsw_sp_sample_params *
6261b9fc42eSIdo Schimmel mlxsw_sp_sample_trigger_params_lookup(struct mlxsw_sp *mlxsw_sp,
6271b9fc42eSIdo Schimmel 				      const struct mlxsw_sp_sample_trigger *trigger);
6281b9fc42eSIdo Schimmel int
6291b9fc42eSIdo Schimmel mlxsw_sp_sample_trigger_params_set(struct mlxsw_sp *mlxsw_sp,
6301b9fc42eSIdo Schimmel 				   const struct mlxsw_sp_sample_trigger *trigger,
6311b9fc42eSIdo Schimmel 				   const struct mlxsw_sp_sample_params *params,
6321b9fc42eSIdo Schimmel 				   struct netlink_ext_ack *extack);
6331b9fc42eSIdo Schimmel void
6341b9fc42eSIdo Schimmel mlxsw_sp_sample_trigger_params_unset(struct mlxsw_sp *mlxsw_sp,
6351b9fc42eSIdo Schimmel 				     const struct mlxsw_sp_sample_trigger *trigger);
636e846efe2SAmit Cohen int mlxsw_sp_ipv6_addr_kvdl_index_get(struct mlxsw_sp *mlxsw_sp,
637e846efe2SAmit Cohen 				      const struct in6_addr *addr6,
638e846efe2SAmit Cohen 				      u32 *p_kvdl_index);
639e846efe2SAmit Cohen void
640e846efe2SAmit Cohen mlxsw_sp_ipv6_addr_put(struct mlxsw_sp *mlxsw_sp, const struct in6_addr *addr6);
64156ade8feSJiri Pirko 
642c39f3e0eSPetr Machata extern const struct mlxsw_sp_sb_vals mlxsw_sp1_sb_vals;
643c39f3e0eSPetr Machata extern const struct mlxsw_sp_sb_vals mlxsw_sp2_sb_vals;
644c39f3e0eSPetr Machata 
645a41b9626SPetr Machata extern const struct mlxsw_sp_sb_ops mlxsw_sp1_sb_ops;
646a41b9626SPetr Machata extern const struct mlxsw_sp_sb_ops mlxsw_sp2_sb_ops;
647a41b9626SPetr Machata extern const struct mlxsw_sp_sb_ops mlxsw_sp3_sb_ops;
648a41b9626SPetr Machata 
649cb4cc0e0SIdo Schimmel /* spectrum_switchdev.c */
65056ade8feSJiri Pirko int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
65156ade8feSJiri Pirko void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
6526e095fd4SIdo Schimmel int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
6536e095fd4SIdo Schimmel 			bool adding);
654c57529e1SIdo Schimmel void
655c57529e1SIdo Schimmel mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
656c57529e1SIdo Schimmel int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
657c57529e1SIdo Schimmel 			      struct net_device *brport_dev,
6589b63ef88SIdo Schimmel 			      struct net_device *br_dev,
6599b63ef88SIdo Schimmel 			      struct netlink_ext_ack *extack);
660c57529e1SIdo Schimmel void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
661c57529e1SIdo Schimmel 				struct net_device *brport_dev,
662c57529e1SIdo Schimmel 				struct net_device *br_dev);
66390045fc9SIdo Schimmel bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
66490045fc9SIdo Schimmel 					 const struct net_device *br_dev);
6651c30d183SIdo Schimmel int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
6661c30d183SIdo Schimmel 			       const struct net_device *br_dev,
66748fde466SIdo Schimmel 			       const struct net_device *vxlan_dev, u16 vid,
6681c30d183SIdo Schimmel 			       struct netlink_ext_ack *extack);
6691c30d183SIdo Schimmel void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
6701c30d183SIdo Schimmel 				 const struct net_device *vxlan_dev);
67134139edeSPetr Machata extern struct notifier_block mlxsw_sp_switchdev_notifier;
672c57529e1SIdo Schimmel 
673cb4cc0e0SIdo Schimmel /* spectrum.c */
674aed4b572SPetr Machata void mlxsw_sp_rx_listener_no_mark_func(struct sk_buff *skb,
675c934757dSAmit Cohen 				       u16 local_port, void *priv);
67639c10350SIdo Schimmel void mlxsw_sp_ptp_receive(struct mlxsw_sp *mlxsw_sp, struct sk_buff *skb,
677c934757dSAmit Cohen 			  u16 local_port);
678ac9cc4e2SJiri Pirko int mlxsw_sp_port_speed_get(struct mlxsw_sp_port *mlxsw_sp_port, u32 *speed);
6798e8dfe9fSIdo Schimmel int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
6808e8dfe9fSIdo Schimmel 			  enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
6818e8dfe9fSIdo Schimmel 			  bool dwrr, u8 dwrr_weight);
6828e8dfe9fSIdo Schimmel int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
6838e8dfe9fSIdo Schimmel 			      u8 switch_prio, u8 tclass);
684cc7cf517SIdo Schimmel int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
685cc7cf517SIdo Schimmel 				  enum mlxsw_reg_qeec_hr hr, u8 index,
686dbacf8baSPetr Machata 				  u8 next_index, u32 maxrate, u8 burst_size);
687541e1159SPetr Machata enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state);
688fe9ccc78SIdo Schimmel int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
689fe9ccc78SIdo Schimmel 			      u8 state);
690a1107487SIdo Schimmel int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
691fe9ccc78SIdo Schimmel int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
692fe9ccc78SIdo Schimmel 				   bool learn_enable);
693dc0d1a8bSIdo Schimmel int mlxsw_sp_port_security_set(struct mlxsw_sp_port *mlxsw_sp_port,
694dc0d1a8bSIdo Schimmel 			       bool enable);
6954418096eSAmit Cohen int mlxsw_sp_ethtype_to_sver_type(u16 ethtype, u8 *p_sver_type);
696114a465dSAmit Cohen int mlxsw_sp_port_egress_ethtype_set(struct mlxsw_sp_port *mlxsw_sp_port,
697114a465dSAmit Cohen 				     u16 ethtype);
6983ae7a65bSAmit Cohen int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
6993ae7a65bSAmit Cohen 			   u16 ethtype);
700c57529e1SIdo Schimmel struct mlxsw_sp_port_vlan *
701635c8c8bSIdo Schimmel mlxsw_sp_port_vlan_create(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
702635c8c8bSIdo Schimmel void mlxsw_sp_port_vlan_destroy(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
703ec4643caSPetr Machata int mlxsw_sp_port_kill_vid(struct net_device *dev,
704ec4643caSPetr Machata 			   __be16 __always_unused proto, u16 vid);
705cb4cc0e0SIdo Schimmel int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
706cb4cc0e0SIdo Schimmel 			   u16 vid_end, bool is_member, bool untagged);
707cb4cc0e0SIdo Schimmel int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
708cb4cc0e0SIdo Schimmel 			      unsigned int counter_index, u64 *packets,
709cb4cc0e0SIdo Schimmel 			      u64 *bytes);
710cb4cc0e0SIdo Schimmel int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,
711cb4cc0e0SIdo Schimmel 				unsigned int *p_counter_index);
712cb4cc0e0SIdo Schimmel void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,
713cb4cc0e0SIdo Schimmel 				unsigned int counter_index);
71424157bc6SDanielle Ratson void mlxsw_sp_txhdr_construct(struct sk_buff *skb,
71524157bc6SDanielle Ratson 			      const struct mlxsw_tx_info *tx_info);
71624157bc6SDanielle Ratson int mlxsw_sp_txhdr_ptp_data_construct(struct mlxsw_core *mlxsw_core,
71724157bc6SDanielle Ratson 				      struct mlxsw_sp_port *mlxsw_sp_port,
71824157bc6SDanielle Ratson 				      struct sk_buff *skb,
71924157bc6SDanielle Ratson 				      const struct mlxsw_tx_info *tx_info);
720cb4cc0e0SIdo Schimmel bool mlxsw_sp_port_dev_check(const struct net_device *dev);
721cb4cc0e0SIdo Schimmel struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);
722cb4cc0e0SIdo Schimmel struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);
723af061378SArkadi Sharshevsky struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
7242d91f080SAmit Cohen int mlxsw_sp_parsing_depth_inc(struct mlxsw_sp *mlxsw_sp);
7252d91f080SAmit Cohen void mlxsw_sp_parsing_depth_dec(struct mlxsw_sp *mlxsw_sp);
7262d91f080SAmit Cohen int mlxsw_sp_parsing_vxlan_udp_dport_set(struct mlxsw_sp *mlxsw_sp,
7272d91f080SAmit Cohen 					 __be16 udp_dport);
72856ade8feSJiri Pirko 
729cb4cc0e0SIdo Schimmel /* spectrum_dcb.c */
730f00817dfSIdo Schimmel #ifdef CONFIG_MLXSW_SPECTRUM_DCB
731f00817dfSIdo Schimmel int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
732f00817dfSIdo Schimmel void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
733f00817dfSIdo Schimmel #else
mlxsw_sp_port_dcb_init(struct mlxsw_sp_port * mlxsw_sp_port)734f00817dfSIdo Schimmel static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
735f00817dfSIdo Schimmel {
736f00817dfSIdo Schimmel 	return 0;
737f00817dfSIdo Schimmel }
mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port * mlxsw_sp_port)738f00817dfSIdo Schimmel static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
739f00817dfSIdo Schimmel {}
740f00817dfSIdo Schimmel #endif
741f00817dfSIdo Schimmel 
742cb4cc0e0SIdo Schimmel /* spectrum_router.c */
74312066d61SIdo Schimmel enum mlxsw_sp_l3proto {
74412066d61SIdo Schimmel 	MLXSW_SP_L3_PROTO_IPV4,
74512066d61SIdo Schimmel 	MLXSW_SP_L3_PROTO_IPV6,
74612066d61SIdo Schimmel #define MLXSW_SP_L3_PROTO_MAX	(MLXSW_SP_L3_PROTO_IPV6 + 1)
74712066d61SIdo Schimmel };
74812066d61SIdo Schimmel 
74912066d61SIdo Schimmel union mlxsw_sp_l3addr {
75012066d61SIdo Schimmel 	__be32 addr4;
75112066d61SIdo Schimmel 	struct in6_addr addr6;
75212066d61SIdo Schimmel };
75312066d61SIdo Schimmel 
754fea20547SAmit Cohen u16 mlxsw_sp_rif_index(const struct mlxsw_sp_rif *rif);
7555bcfb6a4SJiri Pirko int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp,
7565bcfb6a4SJiri Pirko 			 struct netlink_ext_ack *extack);
757464dce18SIdo Schimmel void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
7582db99378SIdo Schimmel void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,
7592db99378SIdo Schimmel 			      const struct net_device *macvlan_dev);
760a1107487SIdo Schimmel void
761a1107487SIdo Schimmel mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
762602b74edSIdo Schimmel void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp,
763602b74edSIdo Schimmel 				 struct net_device *dev);
764b69e1337SIdo Schimmel bool mlxsw_sp_rif_exists(struct mlxsw_sp *mlxsw_sp,
765bf341eb8SIdo Schimmel 			 const struct net_device *dev);
7665e9a664dSIdo Schimmel u16 mlxsw_sp_rif_vid(struct mlxsw_sp *mlxsw_sp, const struct net_device *dev);
767c934757dSAmit Cohen u16 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp);
7680c69e0fcSIdo Schimmel int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
7690c69e0fcSIdo Schimmel 				      enum mlxsw_sp_l3proto ul_proto,
7700c69e0fcSIdo Schimmel 				      const union mlxsw_sp_l3addr *ul_sip,
7710c69e0fcSIdo Schimmel 				      u32 tunnel_index);
7720c69e0fcSIdo Schimmel void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
7730c69e0fcSIdo Schimmel 				      enum mlxsw_sp_l3proto ul_proto,
7740c69e0fcSIdo Schimmel 				      const union mlxsw_sp_l3addr *ul_sip);
77588782f75SIdo Schimmel int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id,
77688782f75SIdo Schimmel 				u16 *vr_id);
777eff42aa9SIdo Schimmel int mlxsw_sp_router_ul_rif_get(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
778eff42aa9SIdo Schimmel 			       u16 *ul_rif_index);
779eff42aa9SIdo Schimmel void mlxsw_sp_router_ul_rif_put(struct mlxsw_sp *mlxsw_sp, u16 ul_rif_index);
780464dce18SIdo Schimmel 
781cb4cc0e0SIdo Schimmel /* spectrum_kvdl.c */
7824b6b1869SJiri Pirko enum mlxsw_sp_kvdl_entry_type {
7834b6b1869SJiri Pirko 	MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,
7844b6b1869SJiri Pirko 	MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET,
7854b6b1869SJiri Pirko 	MLXSW_SP_KVDL_ENTRY_TYPE_PBS,
7864b6b1869SJiri Pirko 	MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,
78753eedd61SAmit Cohen 	MLXSW_SP_KVDL_ENTRY_TYPE_IPV6_ADDRESS,
78890ea0bb5SIdo Schimmel 	MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT,
7894b6b1869SJiri Pirko };
7904b6b1869SJiri Pirko 
7914b6b1869SJiri Pirko static inline unsigned int
mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)7924b6b1869SJiri Pirko mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)
7934b6b1869SJiri Pirko {
7944b6b1869SJiri Pirko 	switch (type) {
795df561f66SGustavo A. R. Silva 	case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ:
796df561f66SGustavo A. R. Silva 	case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET:
797df561f66SGustavo A. R. Silva 	case MLXSW_SP_KVDL_ENTRY_TYPE_PBS:
798df561f66SGustavo A. R. Silva 	case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR:
79953eedd61SAmit Cohen 	case MLXSW_SP_KVDL_ENTRY_TYPE_IPV6_ADDRESS:
800df561f66SGustavo A. R. Silva 	case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT:
8014b6b1869SJiri Pirko 	default:
8024b6b1869SJiri Pirko 		return 1;
8034b6b1869SJiri Pirko 	}
8044b6b1869SJiri Pirko }
8054b6b1869SJiri Pirko 
806ebcff743SJiri Pirko struct mlxsw_sp_kvdl_ops {
807ebcff743SJiri Pirko 	size_t priv_size;
808ebcff743SJiri Pirko 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
809ebcff743SJiri Pirko 	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
810ebcff743SJiri Pirko 	int (*alloc)(struct mlxsw_sp *mlxsw_sp, void *priv,
8114b6b1869SJiri Pirko 		     enum mlxsw_sp_kvdl_entry_type type,
812ebcff743SJiri Pirko 		     unsigned int entry_count, u32 *p_entry_index);
813ebcff743SJiri Pirko 	void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv,
8144b6b1869SJiri Pirko 		     enum mlxsw_sp_kvdl_entry_type type,
8150304c005SJiri Pirko 		     unsigned int entry_count, int entry_index);
816ebcff743SJiri Pirko 	int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv,
8174b6b1869SJiri Pirko 				enum mlxsw_sp_kvdl_entry_type type,
818ebcff743SJiri Pirko 				unsigned int entry_count,
8194b6b1869SJiri Pirko 				unsigned int *p_alloc_count);
820ebcff743SJiri Pirko 	int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv);
821ebcff743SJiri Pirko };
822ebcff743SJiri Pirko 
823a875a2eeSIdo Schimmel int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);
824a875a2eeSIdo Schimmel void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
8254b6b1869SJiri Pirko int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp,
8264b6b1869SJiri Pirko 			enum mlxsw_sp_kvdl_entry_type type,
8274b6b1869SJiri Pirko 			unsigned int entry_count, u32 *p_entry_index);
8284b6b1869SJiri Pirko void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp,
8294b6b1869SJiri Pirko 			enum mlxsw_sp_kvdl_entry_type type,
8300304c005SJiri Pirko 			unsigned int entry_count, int entry_index);
8314b6b1869SJiri Pirko int mlxsw_sp_kvdl_alloc_count_query(struct mlxsw_sp *mlxsw_sp,
8324b6b1869SJiri Pirko 				    enum mlxsw_sp_kvdl_entry_type type,
833d672aec4SIdo Schimmel 				    unsigned int entry_count,
8344b6b1869SJiri Pirko 				    unsigned int *p_alloc_count);
835ebcff743SJiri Pirko 
836ebcff743SJiri Pirko /* spectrum1_kvdl.c */
837ebcff743SJiri Pirko extern const struct mlxsw_sp_kvdl_ops mlxsw_sp1_kvdl_ops;
838ebcff743SJiri Pirko int mlxsw_sp1_kvdl_resources_register(struct mlxsw_core *mlxsw_core);
839b090ef06SJiri Pirko 
840742f75a6SJiri Pirko /* spectrum2_kvdl.c */
841742f75a6SJiri Pirko extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops;
842742f75a6SJiri Pirko 
843463e1ab8SDanielle Ratson enum mlxsw_sp_acl_mangle_field {
844463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP_DSFIELD,
845463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP_DSCP,
846463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP_ECN,
847463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP_SPORT,
848463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP_DPORT,
849463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP4_SIP,
850463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP4_DIP,
851463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_1,
852463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_2,
853463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_3,
854463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_SIP_4,
855463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_1,
856463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_2,
857463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_3,
858463e1ab8SDanielle Ratson 	MLXSW_SP_ACL_MANGLE_FIELD_IP6_DIP_4,
859463e1ab8SDanielle Ratson };
860463e1ab8SDanielle Ratson 
86122a67766SJiri Pirko struct mlxsw_sp_acl_rule_info {
86222a67766SJiri Pirko 	unsigned int priority;
86322a67766SJiri Pirko 	struct mlxsw_afk_element_values values;
86422a67766SJiri Pirko 	struct mlxsw_afa_block *act_block;
865c9588e28SJiri Pirko 	u8 action_created:1,
86686272d33SJiri Pirko 	   ingress_bind_blocker:1,
867f16e7f64SJiri Pirko 	   egress_bind_blocker:1,
868af11e818SIdo Schimmel 	   counter_valid:1,
869463e1ab8SDanielle Ratson 	   policer_index_valid:1,
870fe22f741SIdo Schimmel 	   ipv6_valid:1,
871fe22f741SIdo Schimmel 	   src_port_range_reg_valid:1,
872fe22f741SIdo Schimmel 	   dst_port_range_reg_valid:1;
87348170729SArkadi Sharshevsky 	unsigned int counter_index;
874af11e818SIdo Schimmel 	u16 policer_index;
875fe22f741SIdo Schimmel 	u8 src_port_range_reg_index;
876fe22f741SIdo Schimmel 	u8 dst_port_range_reg_index;
877463e1ab8SDanielle Ratson 	struct {
878463e1ab8SDanielle Ratson 		u32 prev_val;
879463e1ab8SDanielle Ratson 		enum mlxsw_sp_acl_mangle_field prev_field;
880463e1ab8SDanielle Ratson 	} ipv6;
88122a67766SJiri Pirko };
88222a67766SJiri Pirko 
883d52238ebSJiri Pirko /* spectrum_flow.c */
8843bc3ffb6SJiri Pirko struct mlxsw_sp_flow_block {
8850c1f391dSJiri Pirko 	struct list_head binding_list;
8865a2939b9SJiri Pirko 	struct {
8875a2939b9SJiri Pirko 		struct list_head list;
888aed65285SJiri Pirko 		unsigned int min_prio;
889aed65285SJiri Pirko 		unsigned int max_prio;
8905a2939b9SJiri Pirko 	} mall;
8910c1f391dSJiri Pirko 	struct mlxsw_sp_acl_ruleset *ruleset_zero;
8920c1f391dSJiri Pirko 	struct mlxsw_sp *mlxsw_sp;
8930c1f391dSJiri Pirko 	unsigned int rule_count;
8940c1f391dSJiri Pirko 	unsigned int disable_count;
89586272d33SJiri Pirko 	unsigned int ingress_blocker_rule_count;
896c9588e28SJiri Pirko 	unsigned int egress_blocker_rule_count;
89768cc7eccSJiri Pirko 	unsigned int ingress_binding_count;
89868cc7eccSJiri Pirko 	unsigned int egress_binding_count;
8990c1f391dSJiri Pirko 	struct net *net;
9000c1f391dSJiri Pirko };
9010c1f391dSJiri Pirko 
902d52238ebSJiri Pirko struct mlxsw_sp_flow_block_binding {
903d52238ebSJiri Pirko 	struct list_head list;
904d52238ebSJiri Pirko 	struct mlxsw_sp_port *mlxsw_sp_port;
905d52238ebSJiri Pirko 	bool ingress;
906d52238ebSJiri Pirko };
90749c958ccSJiri Pirko 
90849c958ccSJiri Pirko static inline struct mlxsw_sp *
mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block * block)9093bc3ffb6SJiri Pirko mlxsw_sp_flow_block_mlxsw_sp(struct mlxsw_sp_flow_block *block)
91049c958ccSJiri Pirko {
91149c958ccSJiri Pirko 	return block->mlxsw_sp;
91249c958ccSJiri Pirko }
91349c958ccSJiri Pirko 
91449c958ccSJiri Pirko static inline unsigned int
mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block * block)9153bc3ffb6SJiri Pirko mlxsw_sp_flow_block_rule_count(const struct mlxsw_sp_flow_block *block)
91649c958ccSJiri Pirko {
91749c958ccSJiri Pirko 	return block ? block->rule_count : 0;
91849c958ccSJiri Pirko }
91949c958ccSJiri Pirko 
92049c958ccSJiri Pirko static inline void
mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block * block)9213bc3ffb6SJiri Pirko mlxsw_sp_flow_block_disable_inc(struct mlxsw_sp_flow_block *block)
92249c958ccSJiri Pirko {
92349c958ccSJiri Pirko 	if (block)
92449c958ccSJiri Pirko 		block->disable_count++;
92549c958ccSJiri Pirko }
92649c958ccSJiri Pirko 
92749c958ccSJiri Pirko static inline void
mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block * block)9283bc3ffb6SJiri Pirko mlxsw_sp_flow_block_disable_dec(struct mlxsw_sp_flow_block *block)
92949c958ccSJiri Pirko {
93049c958ccSJiri Pirko 	if (block)
93149c958ccSJiri Pirko 		block->disable_count--;
93249c958ccSJiri Pirko }
93349c958ccSJiri Pirko 
93449c958ccSJiri Pirko static inline bool
mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block * block)9353bc3ffb6SJiri Pirko mlxsw_sp_flow_block_disabled(const struct mlxsw_sp_flow_block *block)
93649c958ccSJiri Pirko {
93749c958ccSJiri Pirko 	return block->disable_count;
93849c958ccSJiri Pirko }
93949c958ccSJiri Pirko 
94049c958ccSJiri Pirko static inline bool
mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block * block)9413bc3ffb6SJiri Pirko mlxsw_sp_flow_block_is_egress_bound(const struct mlxsw_sp_flow_block *block)
94249c958ccSJiri Pirko {
94349c958ccSJiri Pirko 	return block->egress_binding_count;
94449c958ccSJiri Pirko }
94549c958ccSJiri Pirko 
94649c958ccSJiri Pirko static inline bool
mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block * block)9473bc3ffb6SJiri Pirko mlxsw_sp_flow_block_is_ingress_bound(const struct mlxsw_sp_flow_block *block)
94849c958ccSJiri Pirko {
94949c958ccSJiri Pirko 	return block->ingress_binding_count;
95049c958ccSJiri Pirko }
95149c958ccSJiri Pirko 
95249c958ccSJiri Pirko static inline bool
mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block * block)9533bc3ffb6SJiri Pirko mlxsw_sp_flow_block_is_mixed_bound(const struct mlxsw_sp_flow_block *block)
95449c958ccSJiri Pirko {
95549c958ccSJiri Pirko 	return block->ingress_binding_count && block->egress_binding_count;
95649c958ccSJiri Pirko }
95749c958ccSJiri Pirko 
9583bc3ffb6SJiri Pirko struct mlxsw_sp_flow_block *mlxsw_sp_flow_block_create(struct mlxsw_sp *mlxsw_sp,
9593aaff323SJiri Pirko 						       struct net *net);
9603bc3ffb6SJiri Pirko void mlxsw_sp_flow_block_destroy(struct mlxsw_sp_flow_block *block);
961f7a439cbSPetr Machata int mlxsw_sp_setup_tc_block_clsact(struct mlxsw_sp_port *mlxsw_sp_port,
962f7a439cbSPetr Machata 				   struct flow_block_offload *f,
963f7a439cbSPetr Machata 				   bool ingress);
964d52238ebSJiri Pirko 
965d52238ebSJiri Pirko /* spectrum_acl.c */
966d52238ebSJiri Pirko struct mlxsw_sp_acl_ruleset;
967d52238ebSJiri Pirko 
968d52238ebSJiri Pirko enum mlxsw_sp_acl_profile {
969d52238ebSJiri Pirko 	MLXSW_SP_ACL_PROFILE_FLOWER,
970d52238ebSJiri Pirko 	MLXSW_SP_ACL_PROFILE_MR,
971d52238ebSJiri Pirko };
972d52238ebSJiri Pirko 
973d52238ebSJiri Pirko struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
97474cbc3c0SIdo Schimmel struct mlxsw_sp_acl_tcam *mlxsw_sp_acl_to_tcam(struct mlxsw_sp_acl *acl);
975d52238ebSJiri Pirko 
976d52238ebSJiri Pirko int mlxsw_sp_acl_ruleset_bind(struct mlxsw_sp *mlxsw_sp,
977d52238ebSJiri Pirko 			      struct mlxsw_sp_flow_block *block,
978d52238ebSJiri Pirko 			      struct mlxsw_sp_flow_block_binding *binding);
979d52238ebSJiri Pirko void mlxsw_sp_acl_ruleset_unbind(struct mlxsw_sp *mlxsw_sp,
980d52238ebSJiri Pirko 				 struct mlxsw_sp_flow_block *block,
981d52238ebSJiri Pirko 				 struct mlxsw_sp_flow_block_binding *binding);
98222a67766SJiri Pirko struct mlxsw_sp_acl_ruleset *
9833aaff323SJiri Pirko mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp,
9843bc3ffb6SJiri Pirko 			    struct mlxsw_sp_flow_block *block, u32 chain_index,
985dbec8ee9SJiri Pirko 			    enum mlxsw_sp_acl_profile profile);
986dbec8ee9SJiri Pirko struct mlxsw_sp_acl_ruleset *
9873aaff323SJiri Pirko mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
9883bc3ffb6SJiri Pirko 			 struct mlxsw_sp_flow_block *block, u32 chain_index,
989e2f2a1fdSJiri Pirko 			 enum mlxsw_sp_acl_profile profile,
990e2f2a1fdSJiri Pirko 			 struct mlxsw_afk_element_usage *tmplt_elusage);
99122a67766SJiri Pirko void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
99222a67766SJiri Pirko 			      struct mlxsw_sp_acl_ruleset *ruleset);
9930ade3b64SJiri Pirko u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);
994593bb843SJiri Pirko void mlxsw_sp_acl_ruleset_prio_get(struct mlxsw_sp_acl_ruleset *ruleset,
995593bb843SJiri Pirko 				   unsigned int *p_min_prio,
996593bb843SJiri Pirko 				   unsigned int *p_max_prio);
99722a67766SJiri Pirko 
99822a67766SJiri Pirko struct mlxsw_sp_acl_rule_info *
999c20580c2SNir Dotan mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl,
1000c20580c2SNir Dotan 			  struct mlxsw_afa_block *afa_block);
1001898979c7SIdo Schimmel void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp *mlxsw_sp,
1002898979c7SIdo Schimmel 				struct mlxsw_sp_acl_rule_info *rulei);
100322a67766SJiri Pirko int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);
100422a67766SJiri Pirko void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,
100522a67766SJiri Pirko 				 unsigned int priority);
100622a67766SJiri Pirko void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,
100722a67766SJiri Pirko 				    enum mlxsw_afk_element element,
100822a67766SJiri Pirko 				    u32 key_value, u32 mask_value);
100922a67766SJiri Pirko void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,
101022a67766SJiri Pirko 				    enum mlxsw_afk_element element,
101122a67766SJiri Pirko 				    const char *key_value,
101222a67766SJiri Pirko 				    const char *mask_value, unsigned int len);
10132a52a8c6SJiri Pirko int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);
10142a52a8c6SJiri Pirko int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,
101522a67766SJiri Pirko 				u16 group_id);
101649bae2f3SJiri Pirko int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei);
10173128f3a1SJiri Pirko int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei,
10186d19d2bdSJiri Pirko 				bool ingress,
10196d19d2bdSJiri Pirko 				const struct flow_action_cookie *fa_cookie,
10206d19d2bdSJiri Pirko 				struct netlink_ext_ack *extack);
1021df7eea96SJiri Pirko int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
1022d0d13c18SArkadi Sharshevsky int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp,
1023d0d13c18SArkadi Sharshevsky 				  struct mlxsw_sp_acl_rule_info *rulei,
10243bc3ffb6SJiri Pirko 				  struct mlxsw_sp_flow_block *block,
1025ad7769caSNir Dotan 				  struct net_device *out_dev,
1026ad7769caSNir Dotan 				  struct netlink_ext_ack *extack);
102722a67766SJiri Pirko int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
102822a67766SJiri Pirko 			       struct mlxsw_sp_acl_rule_info *rulei,
1029ad7769caSNir Dotan 			       struct net_device *out_dev,
1030ad7769caSNir Dotan 			       struct netlink_ext_ack *extack);
1031a150201aSPetr Machata int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
1032a150201aSPetr Machata 				struct mlxsw_sp_acl_rule_info *rulei,
1033ad7769caSNir Dotan 				u32 action, u16 vid, u16 proto, u8 prio,
1034ad7769caSNir Dotan 				struct netlink_ext_ack *extack);
1035463957e3SPetr Machata int mlxsw_sp_acl_rulei_act_priority(struct mlxsw_sp *mlxsw_sp,
1036463957e3SPetr Machata 				    struct mlxsw_sp_acl_rule_info *rulei,
1037463957e3SPetr Machata 				    u32 prio, struct netlink_ext_ack *extack);
10389b4b16bbSPetr Machata int mlxsw_sp_acl_rulei_act_mangle(struct mlxsw_sp *mlxsw_sp,
10399b4b16bbSPetr Machata 				  struct mlxsw_sp_acl_rule_info *rulei,
10409b4b16bbSPetr Machata 				  enum flow_action_mangle_base htype,
10419b4b16bbSPetr Machata 				  u32 offset, u32 mask, u32 val,
10429b4b16bbSPetr Machata 				  struct netlink_ext_ack *extack);
1043af11e818SIdo Schimmel int mlxsw_sp_acl_rulei_act_police(struct mlxsw_sp *mlxsw_sp,
1044af11e818SIdo Schimmel 				  struct mlxsw_sp_acl_rule_info *rulei,
1045af11e818SIdo Schimmel 				  u32 index, u64 rate_bytes_ps,
1046af11e818SIdo Schimmel 				  u32 burst, struct netlink_ext_ack *extack);
104748170729SArkadi Sharshevsky int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
1048ad7769caSNir Dotan 				 struct mlxsw_sp_acl_rule_info *rulei,
1049ad7769caSNir Dotan 				 struct netlink_ext_ack *extack);
1050ac44dd43SJiri Pirko int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
1051ac44dd43SJiri Pirko 				   struct mlxsw_sp_acl_rule_info *rulei,
1052ad7769caSNir Dotan 				   u16 fid, struct netlink_ext_ack *extack);
1053*0433670eSIdo Schimmel int mlxsw_sp_acl_rulei_act_ignore(struct mlxsw_sp *mlxsw_sp,
1054*0433670eSIdo Schimmel 				  struct mlxsw_sp_acl_rule_info *rulei,
1055*0433670eSIdo Schimmel 				  bool disable_learning, bool disable_security);
105645aad0b7SIdo Schimmel int mlxsw_sp_acl_rulei_act_sample(struct mlxsw_sp *mlxsw_sp,
105745aad0b7SIdo Schimmel 				  struct mlxsw_sp_acl_rule_info *rulei,
105845aad0b7SIdo Schimmel 				  struct mlxsw_sp_flow_block *block,
105945aad0b7SIdo Schimmel 				  struct psample_group *psample_group, u32 rate,
106045aad0b7SIdo Schimmel 				  u32 trunc_size, bool truncate,
106145aad0b7SIdo Schimmel 				  struct netlink_ext_ack *extack);
106222a67766SJiri Pirko 
106322a67766SJiri Pirko struct mlxsw_sp_acl_rule;
106422a67766SJiri Pirko 
106522a67766SJiri Pirko struct mlxsw_sp_acl_rule *
106622a67766SJiri Pirko mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
106722a67766SJiri Pirko 			 struct mlxsw_sp_acl_ruleset *ruleset,
1068ad7769caSNir Dotan 			 unsigned long cookie,
1069c20580c2SNir Dotan 			 struct mlxsw_afa_block *afa_block,
1070ad7769caSNir Dotan 			 struct netlink_ext_ack *extack);
107122a67766SJiri Pirko void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
107222a67766SJiri Pirko 			       struct mlxsw_sp_acl_rule *rule);
107322a67766SJiri Pirko int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
107422a67766SJiri Pirko 			  struct mlxsw_sp_acl_rule *rule);
107522a67766SJiri Pirko void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
107622a67766SJiri Pirko 			   struct mlxsw_sp_acl_rule *rule);
10772507a64cSNir Dotan int mlxsw_sp_acl_rule_action_replace(struct mlxsw_sp *mlxsw_sp,
10782507a64cSNir Dotan 				     struct mlxsw_sp_acl_rule *rule,
10792507a64cSNir Dotan 				     struct mlxsw_afa_block *afa_block);
108022a67766SJiri Pirko struct mlxsw_sp_acl_rule *
108122a67766SJiri Pirko mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,
108222a67766SJiri Pirko 			 struct mlxsw_sp_acl_ruleset *ruleset,
108322a67766SJiri Pirko 			 unsigned long cookie);
108422a67766SJiri Pirko struct mlxsw_sp_acl_rule_info *
108522a67766SJiri Pirko mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);
108648170729SArkadi Sharshevsky int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
108748170729SArkadi Sharshevsky 				struct mlxsw_sp_acl_rule *rule,
1088af11e818SIdo Schimmel 				u64 *packets, u64 *bytes, u64 *drops,
1089af11e818SIdo Schimmel 				u64 *last_use,
109093a129ebSJiri Pirko 				enum flow_action_hw_stats *used_hw_stats);
109122a67766SJiri Pirko 
1092a1107487SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
1093a1107487SIdo Schimmel 
10946de9fceeSJiri Pirko static inline const struct flow_action_cookie *
mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp * mlxsw_sp,u32 cookie_index)10956de9fceeSJiri Pirko mlxsw_sp_acl_act_cookie_lookup(struct mlxsw_sp *mlxsw_sp, u32 cookie_index)
10966de9fceeSJiri Pirko {
10976de9fceeSJiri Pirko 	return mlxsw_afa_cookie_lookup(mlxsw_sp->afa, cookie_index);
10986de9fceeSJiri Pirko }
10996de9fceeSJiri Pirko 
110022a67766SJiri Pirko int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
110122a67766SJiri Pirko void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
110222a67766SJiri Pirko 
11033cc9a15aSPetr Machata struct mlxsw_sp_acl_mangle_action;
11043cc9a15aSPetr Machata 
11053cc9a15aSPetr Machata struct mlxsw_sp_acl_rulei_ops {
11063cc9a15aSPetr Machata 	int (*act_mangle_field)(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_acl_rule_info *rulei,
11073cc9a15aSPetr Machata 				struct mlxsw_sp_acl_mangle_action *mact, u32 val,
11083cc9a15aSPetr Machata 				struct netlink_ext_ack *extack);
11093cc9a15aSPetr Machata };
11103cc9a15aSPetr Machata 
11113cc9a15aSPetr Machata extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp1_acl_rulei_ops;
11123cc9a15aSPetr Machata extern struct mlxsw_sp_acl_rulei_ops mlxsw_sp2_acl_rulei_ops;
11133cc9a15aSPetr Machata 
1114cb4cc0e0SIdo Schimmel /* spectrum_acl_tcam.c */
1115bab5c1cfSJiri Pirko struct mlxsw_sp_acl_tcam;
111664eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_region;
111764eccd00SJiri Pirko 
111864eccd00SJiri Pirko struct mlxsw_sp_acl_tcam_ops {
111964eccd00SJiri Pirko 	enum mlxsw_reg_ptar_key_type key_type;
1120bab5c1cfSJiri Pirko 	size_t priv_size;
1121bab5c1cfSJiri Pirko 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv,
1122bab5c1cfSJiri Pirko 		    struct mlxsw_sp_acl_tcam *tcam);
1123bab5c1cfSJiri Pirko 	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
112464eccd00SJiri Pirko 	size_t region_priv_size;
112564eccd00SJiri Pirko 	int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,
1126f58df510SIdo Schimmel 			   void *tcam_priv,
1127a339bf8aSJiri Pirko 			   struct mlxsw_sp_acl_tcam_region *region,
1128a339bf8aSJiri Pirko 			   void *hints_priv);
112964eccd00SJiri Pirko 	void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);
1130a6b9c87dSIdo Schimmel 	int (*region_associate)(struct mlxsw_sp *mlxsw_sp,
1131a6b9c87dSIdo Schimmel 				struct mlxsw_sp_acl_tcam_region *region);
113229a2102aSJiri Pirko 	void * (*region_rehash_hints_get)(void *region_priv);
113329a2102aSJiri Pirko 	void (*region_rehash_hints_put)(void *hints_priv);
113464eccd00SJiri Pirko 	size_t chunk_priv_size;
113564eccd00SJiri Pirko 	void (*chunk_init)(void *region_priv, void *chunk_priv,
113664eccd00SJiri Pirko 			   unsigned int priority);
113764eccd00SJiri Pirko 	void (*chunk_fini)(void *chunk_priv);
113864eccd00SJiri Pirko 	size_t entry_priv_size;
113964eccd00SJiri Pirko 	int (*entry_add)(struct mlxsw_sp *mlxsw_sp,
114064eccd00SJiri Pirko 			 void *region_priv, void *chunk_priv,
114164eccd00SJiri Pirko 			 void *entry_priv,
114264eccd00SJiri Pirko 			 struct mlxsw_sp_acl_rule_info *rulei);
114364eccd00SJiri Pirko 	void (*entry_del)(struct mlxsw_sp *mlxsw_sp,
114464eccd00SJiri Pirko 			  void *region_priv, void *chunk_priv,
114564eccd00SJiri Pirko 			  void *entry_priv);
11462507a64cSNir Dotan 	int (*entry_action_replace)(struct mlxsw_sp *mlxsw_sp,
114742d704e0SJiri Pirko 				    void *region_priv, void *entry_priv,
11482507a64cSNir Dotan 				    struct mlxsw_sp_acl_rule_info *rulei);
114964eccd00SJiri Pirko 	int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp,
115064eccd00SJiri Pirko 				  void *region_priv, void *entry_priv,
115164eccd00SJiri Pirko 				  bool *activity);
115264eccd00SJiri Pirko };
115364eccd00SJiri Pirko 
115464eccd00SJiri Pirko /* spectrum1_acl_tcam.c */
115564eccd00SJiri Pirko extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops;
115622a67766SJiri Pirko 
11579912e6b8SJiri Pirko /* spectrum2_acl_tcam.c */
11589912e6b8SJiri Pirko extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops;
11599912e6b8SJiri Pirko 
11609dbab6f5SJiri Pirko /* spectrum_acl_flex_actions.c */
11619dbab6f5SJiri Pirko extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops;
1162d55ece4bSJiri Pirko extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;
11639dbab6f5SJiri Pirko 
1164c17d2083SJiri Pirko /* spectrum_acl_flex_keys.c */
1165c17d2083SJiri Pirko extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;
1166dcdf0102SJiri Pirko extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;
116707ff1359SAmit Cohen extern const struct mlxsw_afk_ops mlxsw_sp4_afk_ops;
1168c17d2083SJiri Pirko 
116958723d2fSAmit Cohen /* spectrum_acl_bloom_filter.c */
117058723d2fSAmit Cohen extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp2_acl_bf_ops;
1171852ee419SAmit Cohen extern const struct mlxsw_sp_acl_bf_ops mlxsw_sp4_acl_bf_ops;
117258723d2fSAmit Cohen 
1173d7fcc986SJiri Pirko /* spectrum_matchall.c */
117420afb9bcSIdo Schimmel struct mlxsw_sp_mall_ops {
117520afb9bcSIdo Schimmel 	int (*sample_add)(struct mlxsw_sp *mlxsw_sp,
1176e09a5955SIdo Schimmel 			  struct mlxsw_sp_port *mlxsw_sp_port,
1177e09a5955SIdo Schimmel 			  struct mlxsw_sp_mall_entry *mall_entry,
1178e09a5955SIdo Schimmel 			  struct netlink_ext_ack *extack);
117920afb9bcSIdo Schimmel 	void (*sample_del)(struct mlxsw_sp *mlxsw_sp,
1180e09a5955SIdo Schimmel 			   struct mlxsw_sp_port *mlxsw_sp_port,
1181e09a5955SIdo Schimmel 			   struct mlxsw_sp_mall_entry *mall_entry);
118220afb9bcSIdo Schimmel };
118320afb9bcSIdo Schimmel 
118420afb9bcSIdo Schimmel extern const struct mlxsw_sp_mall_ops mlxsw_sp1_mall_ops;
118520afb9bcSIdo Schimmel extern const struct mlxsw_sp_mall_ops mlxsw_sp2_mall_ops;
118620afb9bcSIdo Schimmel 
1187b50f60a0SPetr Machata enum mlxsw_sp_mall_action_type {
1188b50f60a0SPetr Machata 	MLXSW_SP_MALL_ACTION_TYPE_MIRROR,
1189b50f60a0SPetr Machata 	MLXSW_SP_MALL_ACTION_TYPE_SAMPLE,
1190b50f60a0SPetr Machata 	MLXSW_SP_MALL_ACTION_TYPE_TRAP,
1191b50f60a0SPetr Machata };
1192b50f60a0SPetr Machata 
1193b50f60a0SPetr Machata struct mlxsw_sp_mall_mirror_entry {
1194b50f60a0SPetr Machata 	const struct net_device *to_dev;
1195b50f60a0SPetr Machata 	int span_id;
1196b50f60a0SPetr Machata };
1197b50f60a0SPetr Machata 
119854a92385SPetr Machata struct mlxsw_sp_mall_trap_entry {
119954a92385SPetr Machata 	int span_id;
120054a92385SPetr Machata };
120154a92385SPetr Machata 
120290f53c53SIdo Schimmel struct mlxsw_sp_mall_sample_entry {
120390f53c53SIdo Schimmel 	struct mlxsw_sp_sample_params params;
120490f53c53SIdo Schimmel 	int span_id;	/* Relevant for Spectrum-2 onwards. */
120590f53c53SIdo Schimmel };
120690f53c53SIdo Schimmel 
1207b50f60a0SPetr Machata struct mlxsw_sp_mall_entry {
1208b50f60a0SPetr Machata 	struct list_head list;
1209b50f60a0SPetr Machata 	unsigned long cookie;
1210b50f60a0SPetr Machata 	unsigned int priority;
1211b50f60a0SPetr Machata 	enum mlxsw_sp_mall_action_type type;
1212b50f60a0SPetr Machata 	bool ingress;
1213b50f60a0SPetr Machata 	union {
1214b50f60a0SPetr Machata 		struct mlxsw_sp_mall_mirror_entry mirror;
121554a92385SPetr Machata 		struct mlxsw_sp_mall_trap_entry trap;
121690f53c53SIdo Schimmel 		struct mlxsw_sp_mall_sample_entry sample;
1217b50f60a0SPetr Machata 	};
1218b50f60a0SPetr Machata 	struct rcu_head rcu;
1219b50f60a0SPetr Machata };
1220b50f60a0SPetr Machata 
122118346b70SJiri Pirko int mlxsw_sp_mall_replace(struct mlxsw_sp *mlxsw_sp,
122218346b70SJiri Pirko 			  struct mlxsw_sp_flow_block *block,
1223d7fcc986SJiri Pirko 			  struct tc_cls_matchall_offload *f);
12243c650136SJiri Pirko void mlxsw_sp_mall_destroy(struct mlxsw_sp_flow_block *block,
12253c650136SJiri Pirko 			   struct tc_cls_matchall_offload *f);
12263c650136SJiri Pirko int mlxsw_sp_mall_port_bind(struct mlxsw_sp_flow_block *block,
12276561df56SIdo Schimmel 			    struct mlxsw_sp_port *mlxsw_sp_port,
12286561df56SIdo Schimmel 			    struct netlink_ext_ack *extack);
12293c650136SJiri Pirko void mlxsw_sp_mall_port_unbind(struct mlxsw_sp_flow_block *block,
12303c650136SJiri Pirko 			       struct mlxsw_sp_port *mlxsw_sp_port);
1231aed65285SJiri Pirko int mlxsw_sp_mall_prio_get(struct mlxsw_sp_flow_block *block, u32 chain_index,
1232aed65285SJiri Pirko 			   unsigned int *p_min_prio, unsigned int *p_max_prio);
1233d7fcc986SJiri Pirko 
1234cb4cc0e0SIdo Schimmel /* spectrum_flower.c */
12353aaff323SJiri Pirko int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp,
12363bc3ffb6SJiri Pirko 			    struct mlxsw_sp_flow_block *block,
1237f9e30088SPablo Neira Ayuso 			    struct flow_cls_offload *f);
12383aaff323SJiri Pirko void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp,
12393bc3ffb6SJiri Pirko 			     struct mlxsw_sp_flow_block *block,
1240f9e30088SPablo Neira Ayuso 			     struct flow_cls_offload *f);
12413aaff323SJiri Pirko int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
12423bc3ffb6SJiri Pirko 			  struct mlxsw_sp_flow_block *block,
1243f9e30088SPablo Neira Ayuso 			  struct flow_cls_offload *f);
1244e2f2a1fdSJiri Pirko int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp,
12453bc3ffb6SJiri Pirko 				 struct mlxsw_sp_flow_block *block,
1246f9e30088SPablo Neira Ayuso 				 struct flow_cls_offload *f);
1247e2f2a1fdSJiri Pirko void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp,
12483bc3ffb6SJiri Pirko 				   struct mlxsw_sp_flow_block *block,
1249f9e30088SPablo Neira Ayuso 				   struct flow_cls_offload *f);
1250593bb843SJiri Pirko int mlxsw_sp_flower_prio_get(struct mlxsw_sp *mlxsw_sp,
1251593bb843SJiri Pirko 			     struct mlxsw_sp_flow_block *block,
1252593bb843SJiri Pirko 			     u32 chain_index, unsigned int *p_min_prio,
1253593bb843SJiri Pirko 			     unsigned int *p_max_prio);
12547aa0f5aaSJiri Pirko 
125596f17e07SNogah Frankel /* spectrum_qdisc.c */
1256371b437aSNogah Frankel int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port);
1257371b437aSNogah Frankel void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port);
125896f17e07SNogah Frankel int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,
125996f17e07SNogah Frankel 			  struct tc_red_qopt_offload *p);
126046a3615bSNogah Frankel int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
126146a3615bSNogah Frankel 			   struct tc_prio_qopt_offload *p);
126219f405b9SPetr Machata int mlxsw_sp_setup_tc_ets(struct mlxsw_sp_port *mlxsw_sp_port,
126319f405b9SPetr Machata 			  struct tc_ets_qopt_offload *p);
1264a44f58c4SPetr Machata int mlxsw_sp_setup_tc_tbf(struct mlxsw_sp_port *mlxsw_sp_port,
1265a44f58c4SPetr Machata 			  struct tc_tbf_qopt_offload *p);
12667bec1a45SPetr Machata int mlxsw_sp_setup_tc_fifo(struct mlxsw_sp_port *mlxsw_sp_port,
12677bec1a45SPetr Machata 			   struct tc_fifo_qopt_offload *p);
1268f6668eacSPetr Machata int mlxsw_sp_setup_tc_block_qevent_early_drop(struct mlxsw_sp_port *mlxsw_sp_port,
1269f6668eacSPetr Machata 					      struct flow_block_offload *f);
12709c18eaf2SPetr Machata int mlxsw_sp_setup_tc_block_qevent_mark(struct mlxsw_sp_port *mlxsw_sp_port,
12719c18eaf2SPetr Machata 					struct flow_block_offload *f);
127296f17e07SNogah Frankel 
1273cb4cc0e0SIdo Schimmel /* spectrum_fid.c */
12745d44a712SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
12755d44a712SIdo Schimmel 						  u16 fid_index);
12765bae63d9SIdo Schimmel int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
12772a36c125SPetr Machata int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,
12782a36c125SPetr Machata 			  enum mlxsw_sp_nve_type *p_type);
1279564c6d72SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp,
1280564c6d72SIdo Schimmel 						__be32 vni);
1281d3d19d4bSIdo Schimmel int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni);
1282d3d19d4bSIdo Schimmel int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,
1283d3d19d4bSIdo Schimmel 				     u32 nve_flood_index);
1284d3d19d4bSIdo Schimmel void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid);
1285d3d19d4bSIdo Schimmel bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid);
12862a36c125SPetr Machata int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
12872a36c125SPetr Machata 			 __be32 vni, int nve_ifindex);
1288d3d19d4bSIdo Schimmel void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid);
1289d3d19d4bSIdo Schimmel bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid);
129083de7883SPetr Machata void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
129183de7883SPetr Machata 				    const struct net_device *nve_dev);
1292a1107487SIdo Schimmel int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
1293c934757dSAmit Cohen 			   enum mlxsw_sp_flood_type packet_type, u16 local_port,
1294a1107487SIdo Schimmel 			   bool member);
1295a1107487SIdo Schimmel int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
1296a1107487SIdo Schimmel 			      struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
1297a1107487SIdo Schimmel void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
1298a1107487SIdo Schimmel 				 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
1299a1107487SIdo Schimmel u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);
1300a1107487SIdo Schimmel enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);
1301fea20547SAmit Cohen int mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);
1302fea20547SAmit Cohen void mlxsw_sp_fid_rif_unset(struct mlxsw_sp_fid *fid);
130332fd4b49SIdo Schimmel struct mlxsw_sp_rif *mlxsw_sp_fid_rif(const struct mlxsw_sp_fid *fid);
1304e4f3c1c1SIdo Schimmel enum mlxsw_sp_rif_type
1305e4f3c1c1SIdo Schimmel mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,
1306e4f3c1c1SIdo Schimmel 			   enum mlxsw_sp_fid_type type);
1307e4f3c1c1SIdo Schimmel u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);
1308a1107487SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);
1309a1107487SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,
1310a1107487SIdo Schimmel 					    int br_ifindex);
13115a8fb370SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp,
13125a8fb370SIdo Schimmel 					       u16 vid);
1313564c6d72SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp,
1314564c6d72SIdo Schimmel 					       int br_ifindex);
1315a1107487SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,
1316a1107487SIdo Schimmel 					   u16 rif_index);
1317a1107487SIdo Schimmel struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);
1318a1107487SIdo Schimmel void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);
1319a1107487SIdo Schimmel int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);
1320a1107487SIdo Schimmel void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
1321a1107487SIdo Schimmel int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
1322a1107487SIdo Schimmel void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);
1323a1107487SIdo Schimmel 
132404e85970SAmit Cohen extern const struct mlxsw_sp_fid_family *mlxsw_sp1_fid_family_arr[];
132504e85970SAmit Cohen extern const struct mlxsw_sp_fid_family *mlxsw_sp2_fid_family_arr[];
132604e85970SAmit Cohen 
13278fae4392SJiri Pirko /* spectrum_mr.c */
13288fae4392SJiri Pirko enum mlxsw_sp_mr_route_prio {
13298fae4392SJiri Pirko 	MLXSW_SP_MR_ROUTE_PRIO_SG,
13308fae4392SJiri Pirko 	MLXSW_SP_MR_ROUTE_PRIO_STARG,
13318fae4392SJiri Pirko 	MLXSW_SP_MR_ROUTE_PRIO_CATCHALL,
13328fae4392SJiri Pirko 	__MLXSW_SP_MR_ROUTE_PRIO_MAX
13338fae4392SJiri Pirko };
13348fae4392SJiri Pirko 
13358fae4392SJiri Pirko #define MLXSW_SP_MR_ROUTE_PRIO_MAX (__MLXSW_SP_MR_ROUTE_PRIO_MAX - 1)
13368fae4392SJiri Pirko 
13378fae4392SJiri Pirko struct mlxsw_sp_mr_route_key;
13388fae4392SJiri Pirko 
13398fae4392SJiri Pirko struct mlxsw_sp_mr_tcam_ops {
13408fae4392SJiri Pirko 	size_t priv_size;
13418fae4392SJiri Pirko 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
13428fae4392SJiri Pirko 	void (*fini)(void *priv);
13438fae4392SJiri Pirko 	size_t route_priv_size;
13448fae4392SJiri Pirko 	int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv,
13458fae4392SJiri Pirko 			    void *route_priv,
13468fae4392SJiri Pirko 			    struct mlxsw_sp_mr_route_key *key,
13478fae4392SJiri Pirko 			    struct mlxsw_afa_block *afa_block,
13488fae4392SJiri Pirko 			    enum mlxsw_sp_mr_route_prio prio);
13498fae4392SJiri Pirko 	void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv,
13508fae4392SJiri Pirko 			      void *route_priv,
13518fae4392SJiri Pirko 			      struct mlxsw_sp_mr_route_key *key);
13528fae4392SJiri Pirko 	int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv,
13538fae4392SJiri Pirko 			    struct mlxsw_sp_mr_route_key *key,
13548fae4392SJiri Pirko 			    struct mlxsw_afa_block *afa_block);
13558fae4392SJiri Pirko };
13568fae4392SJiri Pirko 
13578fae4392SJiri Pirko /* spectrum1_mr_tcam.c */
13588fae4392SJiri Pirko extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp1_mr_tcam_ops;
13598fae4392SJiri Pirko 
136018ce0e4eSJiri Pirko /* spectrum2_mr_tcam.c */
136118ce0e4eSJiri Pirko extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops;
136218ce0e4eSJiri Pirko 
13636e6030bdSIdo Schimmel /* spectrum_nve.c */
13646e6030bdSIdo Schimmel struct mlxsw_sp_nve_params {
13656e6030bdSIdo Schimmel 	enum mlxsw_sp_nve_type type;
13666e6030bdSIdo Schimmel 	__be32 vni;
13676e6030bdSIdo Schimmel 	const struct net_device *dev;
13680913a24bSAmit Cohen 	u16 ethertype;
13696e6030bdSIdo Schimmel };
13706e6030bdSIdo Schimmel 
13716e6030bdSIdo Schimmel extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[];
13726e6030bdSIdo Schimmel extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[];
13736e6030bdSIdo Schimmel 
13743c55bdacSIdo Schimmel int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip,
13753c55bdacSIdo Schimmel 				    enum mlxsw_sp_l3proto proto,
13763c55bdacSIdo Schimmel 				    union mlxsw_sp_l3addr *addr);
13776e6030bdSIdo Schimmel int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp,
13786e6030bdSIdo Schimmel 			      struct mlxsw_sp_fid *fid,
13796e6030bdSIdo Schimmel 			      enum mlxsw_sp_l3proto proto,
13806e6030bdSIdo Schimmel 			      union mlxsw_sp_l3addr *addr);
13816e6030bdSIdo Schimmel void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp,
13826e6030bdSIdo Schimmel 			       struct mlxsw_sp_fid *fid,
13836e6030bdSIdo Schimmel 			       enum mlxsw_sp_l3proto proto,
13846e6030bdSIdo Schimmel 			       union mlxsw_sp_l3addr *addr);
13850860c764SAmit Cohen int mlxsw_sp_nve_ipv6_addr_kvdl_set(struct mlxsw_sp *mlxsw_sp,
13860860c764SAmit Cohen 				    const struct in6_addr *addr6,
13870860c764SAmit Cohen 				    u32 *p_kvdl_index);
13880860c764SAmit Cohen void mlxsw_sp_nve_ipv6_addr_kvdl_unset(struct mlxsw_sp *mlxsw_sp,
13890860c764SAmit Cohen 				       const struct in6_addr *addr6);
13900860c764SAmit Cohen int
13910860c764SAmit Cohen mlxsw_sp_nve_ipv6_addr_map_replace(struct mlxsw_sp *mlxsw_sp, const char *mac,
13920860c764SAmit Cohen 				   u16 fid_index,
13930860c764SAmit Cohen 				   const struct in6_addr *new_addr6);
13940860c764SAmit Cohen void mlxsw_sp_nve_ipv6_addr_map_del(struct mlxsw_sp *mlxsw_sp, const char *mac,
13950860c764SAmit Cohen 				    u16 fid_index);
13966e6030bdSIdo Schimmel int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
13976e6030bdSIdo Schimmel 			    struct mlxsw_sp_nve_params *params,
13986e6030bdSIdo Schimmel 			    struct netlink_ext_ack *extack);
13996e6030bdSIdo Schimmel void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp,
14006e6030bdSIdo Schimmel 			      struct mlxsw_sp_fid *fid);
14016e6030bdSIdo Schimmel int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port);
14026e6030bdSIdo Schimmel void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port);
14036e6030bdSIdo Schimmel int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp);
14046e6030bdSIdo Schimmel void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp);
14056e6030bdSIdo Schimmel 
1406b5ce611fSIdo Schimmel /* spectrum_trap.c */
1407b5ce611fSIdo Schimmel int mlxsw_sp_devlink_traps_init(struct mlxsw_sp *mlxsw_sp);
1408b5ce611fSIdo Schimmel void mlxsw_sp_devlink_traps_fini(struct mlxsw_sp *mlxsw_sp);
1409b5ce611fSIdo Schimmel int mlxsw_sp_trap_init(struct mlxsw_core *mlxsw_core,
1410b5ce611fSIdo Schimmel 		       const struct devlink_trap *trap, void *trap_ctx);
1411b5ce611fSIdo Schimmel void mlxsw_sp_trap_fini(struct mlxsw_core *mlxsw_core,
1412b5ce611fSIdo Schimmel 			const struct devlink_trap *trap, void *trap_ctx);
1413b5ce611fSIdo Schimmel int mlxsw_sp_trap_action_set(struct mlxsw_core *mlxsw_core,
1414b5ce611fSIdo Schimmel 			     const struct devlink_trap *trap,
1415c88e11e0SIdo Schimmel 			     enum devlink_trap_action action,
1416c88e11e0SIdo Schimmel 			     struct netlink_ext_ack *extack);
1417b5ce611fSIdo Schimmel int mlxsw_sp_trap_group_init(struct mlxsw_core *mlxsw_core,
1418b5ce611fSIdo Schimmel 			     const struct devlink_trap_group *group);
141939defcbbSIdo Schimmel int mlxsw_sp_trap_group_set(struct mlxsw_core *mlxsw_core,
142039defcbbSIdo Schimmel 			    const struct devlink_trap_group *group,
1421c88e11e0SIdo Schimmel 			    const struct devlink_trap_policer *policer,
1422c88e11e0SIdo Schimmel 			    struct netlink_ext_ack *extack);
142313f2e64bSIdo Schimmel int
142413f2e64bSIdo Schimmel mlxsw_sp_trap_policer_init(struct mlxsw_core *mlxsw_core,
142513f2e64bSIdo Schimmel 			   const struct devlink_trap_policer *policer);
142613f2e64bSIdo Schimmel void mlxsw_sp_trap_policer_fini(struct mlxsw_core *mlxsw_core,
142713f2e64bSIdo Schimmel 				const struct devlink_trap_policer *policer);
142813f2e64bSIdo Schimmel int
142913f2e64bSIdo Schimmel mlxsw_sp_trap_policer_set(struct mlxsw_core *mlxsw_core,
143013f2e64bSIdo Schimmel 			  const struct devlink_trap_policer *policer,
143113f2e64bSIdo Schimmel 			  u64 rate, u64 burst, struct netlink_ext_ack *extack);
143213f2e64bSIdo Schimmel int
143313f2e64bSIdo Schimmel mlxsw_sp_trap_policer_counter_get(struct mlxsw_core *mlxsw_core,
143413f2e64bSIdo Schimmel 				  const struct devlink_trap_policer *policer,
143513f2e64bSIdo Schimmel 				  u64 *p_drops);
143654a92385SPetr Machata int mlxsw_sp_trap_group_policer_hw_id_get(struct mlxsw_sp *mlxsw_sp, u16 id,
143754a92385SPetr Machata 					  bool *p_enabled, u16 *p_hw_id);
1438b5ce611fSIdo Schimmel 
mlxsw_sp_net(struct mlxsw_sp * mlxsw_sp)1439053e92aaSJiri Pirko static inline struct net *mlxsw_sp_net(struct mlxsw_sp *mlxsw_sp)
1440053e92aaSJiri Pirko {
1441053e92aaSJiri Pirko 	return mlxsw_core_net(mlxsw_sp->core);
1442053e92aaSJiri Pirko }
1443053e92aaSJiri Pirko 
1444614d509aSAmit Cohen /* spectrum_ethtool.c */
1445614d509aSAmit Cohen extern const struct ethtool_ops mlxsw_sp_port_ethtool_ops;
14462be5c8a9SAmit Cohen extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp1_port_type_speed_ops;
14472be5c8a9SAmit Cohen extern const struct mlxsw_sp_port_type_speed_ops mlxsw_sp2_port_type_speed_ops;
1448614d509aSAmit Cohen 
14498d3fbae7SIdo Schimmel /* spectrum_policer.c */
14508d3fbae7SIdo Schimmel extern const struct mlxsw_sp_policer_core_ops mlxsw_sp1_policer_core_ops;
14518d3fbae7SIdo Schimmel extern const struct mlxsw_sp_policer_core_ops mlxsw_sp2_policer_core_ops;
14528d3fbae7SIdo Schimmel 
14538d3fbae7SIdo Schimmel enum mlxsw_sp_policer_type {
14548d3fbae7SIdo Schimmel 	MLXSW_SP_POLICER_TYPE_SINGLE_RATE,
14558d3fbae7SIdo Schimmel 
14568d3fbae7SIdo Schimmel 	__MLXSW_SP_POLICER_TYPE_MAX,
14578d3fbae7SIdo Schimmel 	MLXSW_SP_POLICER_TYPE_MAX = __MLXSW_SP_POLICER_TYPE_MAX - 1,
14588d3fbae7SIdo Schimmel };
14598d3fbae7SIdo Schimmel 
14608d3fbae7SIdo Schimmel struct mlxsw_sp_policer_params {
14618d3fbae7SIdo Schimmel 	u64 rate;
14628d3fbae7SIdo Schimmel 	u64 burst;
14638d3fbae7SIdo Schimmel 	bool bytes;
14648d3fbae7SIdo Schimmel };
14658d3fbae7SIdo Schimmel 
14668d3fbae7SIdo Schimmel int mlxsw_sp_policer_add(struct mlxsw_sp *mlxsw_sp,
14678d3fbae7SIdo Schimmel 			 enum mlxsw_sp_policer_type type,
14688d3fbae7SIdo Schimmel 			 const struct mlxsw_sp_policer_params *params,
14698d3fbae7SIdo Schimmel 			 struct netlink_ext_ack *extack, u16 *p_policer_index);
14708d3fbae7SIdo Schimmel void mlxsw_sp_policer_del(struct mlxsw_sp *mlxsw_sp,
14718d3fbae7SIdo Schimmel 			  enum mlxsw_sp_policer_type type,
14728d3fbae7SIdo Schimmel 			  u16 policer_index);
14738d3fbae7SIdo Schimmel int mlxsw_sp_policer_drops_counter_get(struct mlxsw_sp *mlxsw_sp,
14748d3fbae7SIdo Schimmel 				       enum mlxsw_sp_policer_type type,
14758d3fbae7SIdo Schimmel 				       u16 policer_index, u64 *p_drops);
14768d3fbae7SIdo Schimmel int mlxsw_sp_policers_init(struct mlxsw_sp *mlxsw_sp);
14778d3fbae7SIdo Schimmel void mlxsw_sp_policers_fini(struct mlxsw_sp *mlxsw_sp);
1478bf038f03SIdo Schimmel int mlxsw_sp_policer_resources_register(struct mlxsw_core *mlxsw_core);
14798d3fbae7SIdo Schimmel 
1480d8782ec5SAmit Cohen /* spectrum_pgt.c */
1481d8782ec5SAmit Cohen int mlxsw_sp_pgt_mid_alloc(struct mlxsw_sp *mlxsw_sp, u16 *p_mid);
1482d8782ec5SAmit Cohen void mlxsw_sp_pgt_mid_free(struct mlxsw_sp *mlxsw_sp, u16 mid_base);
1483d8782ec5SAmit Cohen int mlxsw_sp_pgt_mid_alloc_range(struct mlxsw_sp *mlxsw_sp, u16 mid_base,
1484d8782ec5SAmit Cohen 				 u16 count);
1485d8782ec5SAmit Cohen void mlxsw_sp_pgt_mid_free_range(struct mlxsw_sp *mlxsw_sp, u16 mid_base,
1486d8782ec5SAmit Cohen 				 u16 count);
1487a3a7992bSAmit Cohen int mlxsw_sp_pgt_entry_port_set(struct mlxsw_sp *mlxsw_sp, u16 mid,
1488a3a7992bSAmit Cohen 				u16 smpe, u16 local_port, bool member);
1489d8782ec5SAmit Cohen int mlxsw_sp_pgt_init(struct mlxsw_sp *mlxsw_sp);
1490d8782ec5SAmit Cohen void mlxsw_sp_pgt_fini(struct mlxsw_sp *mlxsw_sp);
1491d8782ec5SAmit Cohen 
1492b3eb04beSIdo Schimmel /* spectrum_port_range.c */
1493b3eb04beSIdo Schimmel struct mlxsw_sp_port_range {
1494b3eb04beSIdo Schimmel 	u16 min;
1495b3eb04beSIdo Schimmel 	u16 max;
1496b3eb04beSIdo Schimmel 	u8 source:1;	/* Source or destination */
1497b3eb04beSIdo Schimmel };
1498b3eb04beSIdo Schimmel 
1499b3eb04beSIdo Schimmel int mlxsw_sp_port_range_reg_get(struct mlxsw_sp *mlxsw_sp,
1500b3eb04beSIdo Schimmel 				const struct mlxsw_sp_port_range *range,
1501b3eb04beSIdo Schimmel 				struct netlink_ext_ack *extack,
1502b3eb04beSIdo Schimmel 				u8 *p_prr_index);
1503b3eb04beSIdo Schimmel void mlxsw_sp_port_range_reg_put(struct mlxsw_sp *mlxsw_sp, u8 prr_index);
1504b3eb04beSIdo Schimmel int mlxsw_sp_port_range_init(struct mlxsw_sp *mlxsw_sp);
1505b3eb04beSIdo Schimmel void mlxsw_sp_port_range_fini(struct mlxsw_sp *mlxsw_sp);
150656ade8feSJiri Pirko #endif
1507