linux/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
<<
>>
Prefs
   1/*
   2 * drivers/net/ethernet/mellanox/mlxsw/spectrum.h
   3 * Copyright (c) 2015-2017 Mellanox Technologies. All rights reserved.
   4 * Copyright (c) 2015-2017 Jiri Pirko <jiri@mellanox.com>
   5 * Copyright (c) 2015 Ido Schimmel <idosch@mellanox.com>
   6 * Copyright (c) 2015 Elad Raz <eladr@mellanox.com>
   7 *
   8 * Redistribution and use in source and binary forms, with or without
   9 * modification, are permitted provided that the following conditions are met:
  10 *
  11 * 1. Redistributions of source code must retain the above copyright
  12 *    notice, this list of conditions and the following disclaimer.
  13 * 2. Redistributions in binary form must reproduce the above copyright
  14 *    notice, this list of conditions and the following disclaimer in the
  15 *    documentation and/or other materials provided with the distribution.
  16 * 3. Neither the names of the copyright holders nor the names of its
  17 *    contributors may be used to endorse or promote products derived from
  18 *    this software without specific prior written permission.
  19 *
  20 * Alternatively, this software may be distributed under the terms of the
  21 * GNU General Public License ("GPL") version 2 as published by the Free
  22 * Software Foundation.
  23 *
  24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  34 * POSSIBILITY OF SUCH DAMAGE.
  35 */
  36
  37#ifndef _MLXSW_SPECTRUM_H
  38#define _MLXSW_SPECTRUM_H
  39
  40#include <linux/types.h>
  41#include <linux/netdevice.h>
  42#include <linux/rhashtable.h>
  43#include <linux/bitops.h>
  44#include <linux/if_vlan.h>
  45#include <linux/list.h>
  46#include <linux/dcbnl.h>
  47#include <linux/in6.h>
  48#include <linux/notifier.h>
  49#include <net/psample.h>
  50#include <net/pkt_cls.h>
  51#include <net/red.h>
  52
  53#include "port.h"
  54#include "core.h"
  55#include "core_acl_flex_keys.h"
  56#include "core_acl_flex_actions.h"
  57
  58#define MLXSW_SP_FID_8021D_MAX 1024
  59
  60#define MLXSW_SP_MID_MAX 7000
  61
  62#define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
  63
  64#define MLXSW_SP_PORT_BASE_SPEED 25000  /* Mb/s */
  65
  66#define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
  67#define MLXSW_SP_KVD_GRANULARITY 128
  68
  69struct mlxsw_sp_port;
  70struct mlxsw_sp_rif;
  71
  72struct mlxsw_sp_upper {
  73        struct net_device *dev;
  74        unsigned int ref_count;
  75};
  76
  77enum mlxsw_sp_rif_type {
  78        MLXSW_SP_RIF_TYPE_SUBPORT,
  79        MLXSW_SP_RIF_TYPE_VLAN,
  80        MLXSW_SP_RIF_TYPE_FID,
  81        MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */
  82        MLXSW_SP_RIF_TYPE_MAX,
  83};
  84
  85enum mlxsw_sp_fid_type {
  86        MLXSW_SP_FID_TYPE_8021Q,
  87        MLXSW_SP_FID_TYPE_8021D,
  88        MLXSW_SP_FID_TYPE_RFID,
  89        MLXSW_SP_FID_TYPE_DUMMY,
  90        MLXSW_SP_FID_TYPE_MAX,
  91};
  92
  93struct mlxsw_sp_mid {
  94        struct list_head list;
  95        unsigned char addr[ETH_ALEN];
  96        u16 fid;
  97        u16 mid;
  98        bool in_hw;
  99        unsigned long *ports_in_mid; /* bits array */
 100};
 101
 102enum mlxsw_sp_span_type {
 103        MLXSW_SP_SPAN_EGRESS,
 104        MLXSW_SP_SPAN_INGRESS
 105};
 106
 107struct mlxsw_sp_span_inspected_port {
 108        struct list_head list;
 109        enum mlxsw_sp_span_type type;
 110        u8 local_port;
 111};
 112
 113struct mlxsw_sp_span_entry {
 114        u8 local_port;
 115        bool used;
 116        struct list_head bound_ports_list;
 117        int ref_count;
 118        int id;
 119};
 120
 121enum mlxsw_sp_port_mall_action_type {
 122        MLXSW_SP_PORT_MALL_MIRROR,
 123        MLXSW_SP_PORT_MALL_SAMPLE,
 124};
 125
 126struct mlxsw_sp_port_mall_mirror_tc_entry {
 127        u8 to_local_port;
 128        bool ingress;
 129};
 130
 131struct mlxsw_sp_port_mall_tc_entry {
 132        struct list_head list;
 133        unsigned long cookie;
 134        enum mlxsw_sp_port_mall_action_type type;
 135        union {
 136                struct mlxsw_sp_port_mall_mirror_tc_entry mirror;
 137        };
 138};
 139
 140struct mlxsw_sp_sb;
 141struct mlxsw_sp_bridge;
 142struct mlxsw_sp_router;
 143struct mlxsw_sp_mr;
 144struct mlxsw_sp_acl;
 145struct mlxsw_sp_counter_pool;
 146struct mlxsw_sp_fid_core;
 147struct mlxsw_sp_kvdl;
 148
 149struct mlxsw_sp {
 150        struct mlxsw_sp_port **ports;
 151        struct mlxsw_core *core;
 152        const struct mlxsw_bus_info *bus_info;
 153        unsigned char base_mac[ETH_ALEN];
 154        struct mlxsw_sp_upper *lags;
 155        int *port_to_module;
 156        struct mlxsw_sp_sb *sb;
 157        struct mlxsw_sp_bridge *bridge;
 158        struct mlxsw_sp_router *router;
 159        struct mlxsw_sp_mr *mr;
 160        struct mlxsw_afa *afa;
 161        struct mlxsw_sp_acl *acl;
 162        struct mlxsw_sp_fid_core *fid_core;
 163        struct mlxsw_sp_kvdl *kvdl;
 164        struct notifier_block netdevice_nb;
 165
 166        struct mlxsw_sp_counter_pool *counter_pool;
 167        struct {
 168                struct mlxsw_sp_span_entry *entries;
 169                int entries_count;
 170        } span;
 171};
 172
 173static inline struct mlxsw_sp_upper *
 174mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
 175{
 176        return &mlxsw_sp->lags[lag_id];
 177}
 178
 179struct mlxsw_sp_port_pcpu_stats {
 180        u64                     rx_packets;
 181        u64                     rx_bytes;
 182        u64                     tx_packets;
 183        u64                     tx_bytes;
 184        struct u64_stats_sync   syncp;
 185        u32                     tx_dropped;
 186};
 187
 188struct mlxsw_sp_port_sample {
 189        struct psample_group __rcu *psample_group;
 190        u32 trunc_size;
 191        u32 rate;
 192        bool truncate;
 193};
 194
 195struct mlxsw_sp_bridge_port;
 196struct mlxsw_sp_fid;
 197
 198struct mlxsw_sp_port_vlan {
 199        struct list_head list;
 200        struct mlxsw_sp_port *mlxsw_sp_port;
 201        struct mlxsw_sp_fid *fid;
 202        u16 vid;
 203        struct mlxsw_sp_bridge_port *bridge_port;
 204        struct list_head bridge_vlan_node;
 205};
 206
 207enum mlxsw_sp_qdisc_type {
 208        MLXSW_SP_QDISC_NO_QDISC,
 209        MLXSW_SP_QDISC_RED,
 210};
 211
 212struct mlxsw_sp_qdisc {
 213        u32 handle;
 214        enum mlxsw_sp_qdisc_type type;
 215        struct red_stats xstats_base;
 216        union {
 217                struct {
 218                        u64 tail_drop_base;
 219                        u64 ecn_base;
 220                        u64 wred_drop_base;
 221                } red;
 222        } xstats;
 223
 224        u64 tx_bytes;
 225        u64 tx_packets;
 226        u64 drops;
 227        u64 overlimits;
 228};
 229
 230/* No need an internal lock; At worse - miss a single periodic iteration */
 231struct mlxsw_sp_port_xstats {
 232        u64 ecn;
 233        u64 wred_drop[TC_MAX_QUEUE];
 234        u64 tail_drop[TC_MAX_QUEUE];
 235        u64 backlog[TC_MAX_QUEUE];
 236};
 237
 238struct mlxsw_sp_port {
 239        struct net_device *dev;
 240        struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
 241        struct mlxsw_sp *mlxsw_sp;
 242        u8 local_port;
 243        u8 lagged:1,
 244           split:1;
 245        u16 pvid;
 246        u16 lag_id;
 247        struct {
 248                u8 tx_pause:1,
 249                   rx_pause:1,
 250                   autoneg:1;
 251        } link;
 252        struct {
 253                struct ieee_ets *ets;
 254                struct ieee_maxrate *maxrate;
 255                struct ieee_pfc *pfc;
 256        } dcb;
 257        struct {
 258                u8 module;
 259                u8 width;
 260                u8 lane;
 261        } mapping;
 262        /* TC handles */
 263        struct list_head mall_tc_list;
 264        struct {
 265                #define MLXSW_HW_STATS_UPDATE_TIME HZ
 266                struct rtnl_link_stats64 stats;
 267                struct mlxsw_sp_port_xstats xstats;
 268                struct delayed_work update_dw;
 269        } periodic_hw_stats;
 270        struct mlxsw_sp_port_sample *sample;
 271        struct list_head vlans_list;
 272        struct mlxsw_sp_qdisc root_qdisc;
 273};
 274
 275static inline bool
 276mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
 277{
 278        return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
 279}
 280
 281static inline struct mlxsw_sp_port *
 282mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
 283{
 284        struct mlxsw_sp_port *mlxsw_sp_port;
 285        u8 local_port;
 286
 287        local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
 288                                                lag_id, port_index);
 289        mlxsw_sp_port = mlxsw_sp->ports[local_port];
 290        return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
 291}
 292
 293static inline struct mlxsw_sp_port_vlan *
 294mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
 295                               u16 vid)
 296{
 297        struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
 298
 299        list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
 300                            list) {
 301                if (mlxsw_sp_port_vlan->vid == vid)
 302                        return mlxsw_sp_port_vlan;
 303        }
 304
 305        return NULL;
 306}
 307
 308enum mlxsw_sp_flood_type {
 309        MLXSW_SP_FLOOD_TYPE_UC,
 310        MLXSW_SP_FLOOD_TYPE_BC,
 311        MLXSW_SP_FLOOD_TYPE_MC,
 312};
 313
 314/* spectrum_buffers.c */
 315int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
 316void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
 317int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
 318int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
 319                         unsigned int sb_index, u16 pool_index,
 320                         struct devlink_sb_pool_info *pool_info);
 321int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
 322                         unsigned int sb_index, u16 pool_index, u32 size,
 323                         enum devlink_sb_threshold_type threshold_type);
 324int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
 325                              unsigned int sb_index, u16 pool_index,
 326                              u32 *p_threshold);
 327int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
 328                              unsigned int sb_index, u16 pool_index,
 329                              u32 threshold);
 330int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
 331                                 unsigned int sb_index, u16 tc_index,
 332                                 enum devlink_sb_pool_type pool_type,
 333                                 u16 *p_pool_index, u32 *p_threshold);
 334int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
 335                                 unsigned int sb_index, u16 tc_index,
 336                                 enum devlink_sb_pool_type pool_type,
 337                                 u16 pool_index, u32 threshold);
 338int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
 339                             unsigned int sb_index);
 340int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
 341                              unsigned int sb_index);
 342int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
 343                                  unsigned int sb_index, u16 pool_index,
 344                                  u32 *p_cur, u32 *p_max);
 345int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
 346                                     unsigned int sb_index, u16 tc_index,
 347                                     enum devlink_sb_pool_type pool_type,
 348                                     u32 *p_cur, u32 *p_max);
 349u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);
 350u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);
 351
 352/* spectrum_switchdev.c */
 353int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
 354void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
 355void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port);
 356void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 357int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
 358                        bool adding);
 359void
 360mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 361int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
 362                              struct net_device *brport_dev,
 363                              struct net_device *br_dev,
 364                              struct netlink_ext_ack *extack);
 365void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
 366                                struct net_device *brport_dev,
 367                                struct net_device *br_dev);
 368bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
 369                                         const struct net_device *br_dev);
 370
 371/* spectrum.c */
 372int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
 373                          enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
 374                          bool dwrr, u8 dwrr_weight);
 375int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
 376                              u8 switch_prio, u8 tclass);
 377int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
 378                                 u8 *prio_tc, bool pause_en,
 379                                 struct ieee_pfc *my_pfc);
 380int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
 381                                  enum mlxsw_reg_qeec_hr hr, u8 index,
 382                                  u8 next_index, u32 maxrate);
 383int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
 384                              u8 state);
 385int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
 386int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
 387                                   bool learn_enable);
 388int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 389struct mlxsw_sp_port_vlan *
 390mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 391void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 392int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
 393                           u16 vid_end, bool is_member, bool untagged);
 394int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
 395                              unsigned int counter_index, u64 *packets,
 396                              u64 *bytes);
 397int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,
 398                                unsigned int *p_counter_index);
 399void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,
 400                                unsigned int counter_index);
 401bool mlxsw_sp_port_dev_check(const struct net_device *dev);
 402struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);
 403struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);
 404struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
 405void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port);
 406struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
 407
 408/* spectrum_dcb.c */
 409#ifdef CONFIG_MLXSW_SPECTRUM_DCB
 410int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
 411void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 412#else
 413static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
 414{
 415        return 0;
 416}
 417static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
 418{}
 419#endif
 420
 421/* spectrum_router.c */
 422int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
 423void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
 424int mlxsw_sp_netdevice_router_port_event(struct net_device *dev);
 425int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
 426                            unsigned long event, void *ptr);
 427int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
 428                                  unsigned long event, void *ptr);
 429int mlxsw_sp_inet6addr_event(struct notifier_block *unused,
 430                             unsigned long event, void *ptr);
 431int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
 432                                   unsigned long event, void *ptr);
 433int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
 434                                 struct netdev_notifier_changeupper_info *info);
 435bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp,
 436                                const struct net_device *dev);
 437bool mlxsw_sp_netdev_is_ipip_ul(const struct mlxsw_sp *mlxsw_sp,
 438                                const struct net_device *dev);
 439int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp,
 440                                     struct net_device *l3_dev,
 441                                     unsigned long event,
 442                                     struct netdev_notifier_info *info);
 443int
 444mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp,
 445                                 struct net_device *l3_dev,
 446                                 unsigned long event,
 447                                 struct netdev_notifier_info *info);
 448void
 449mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
 450void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif);
 451
 452/* spectrum_kvdl.c */
 453int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);
 454void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
 455int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, unsigned int entry_count,
 456                        u32 *p_entry_index);
 457void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
 458int mlxsw_sp_kvdl_alloc_size_query(struct mlxsw_sp *mlxsw_sp,
 459                                   unsigned int entry_count,
 460                                   unsigned int *p_alloc_size);
 461
 462struct mlxsw_sp_acl_rule_info {
 463        unsigned int priority;
 464        struct mlxsw_afk_element_values values;
 465        struct mlxsw_afa_block *act_block;
 466        unsigned int counter_index;
 467        bool counter_valid;
 468};
 469
 470enum mlxsw_sp_acl_profile {
 471        MLXSW_SP_ACL_PROFILE_FLOWER,
 472};
 473
 474struct mlxsw_sp_acl_profile_ops {
 475        size_t ruleset_priv_size;
 476        int (*ruleset_add)(struct mlxsw_sp *mlxsw_sp,
 477                           void *priv, void *ruleset_priv);
 478        void (*ruleset_del)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv);
 479        int (*ruleset_bind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv,
 480                            struct net_device *dev, bool ingress);
 481        void (*ruleset_unbind)(struct mlxsw_sp *mlxsw_sp, void *ruleset_priv);
 482        u16 (*ruleset_group_id)(void *ruleset_priv);
 483        size_t rule_priv_size;
 484        int (*rule_add)(struct mlxsw_sp *mlxsw_sp,
 485                        void *ruleset_priv, void *rule_priv,
 486                        struct mlxsw_sp_acl_rule_info *rulei);
 487        void (*rule_del)(struct mlxsw_sp *mlxsw_sp, void *rule_priv);
 488        int (*rule_activity_get)(struct mlxsw_sp *mlxsw_sp, void *rule_priv,
 489                                 bool *activity);
 490};
 491
 492struct mlxsw_sp_acl_ops {
 493        size_t priv_size;
 494        int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
 495        void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
 496        const struct mlxsw_sp_acl_profile_ops *
 497                        (*profile_ops)(struct mlxsw_sp *mlxsw_sp,
 498                                       enum mlxsw_sp_acl_profile profile);
 499};
 500
 501struct mlxsw_sp_acl_ruleset;
 502
 503/* spectrum_acl.c */
 504struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
 505struct mlxsw_sp_acl_ruleset *
 506mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
 507                            bool ingress, u32 chain_index,
 508                            enum mlxsw_sp_acl_profile profile);
 509struct mlxsw_sp_acl_ruleset *
 510mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp, struct net_device *dev,
 511                         bool ingress, u32 chain_index,
 512                         enum mlxsw_sp_acl_profile profile);
 513void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
 514                              struct mlxsw_sp_acl_ruleset *ruleset);
 515u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);
 516
 517struct mlxsw_sp_acl_rule_info *
 518mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl);
 519void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei);
 520int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);
 521void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,
 522                                 unsigned int priority);
 523void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,
 524                                    enum mlxsw_afk_element element,
 525                                    u32 key_value, u32 mask_value);
 526void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,
 527                                    enum mlxsw_afk_element element,
 528                                    const char *key_value,
 529                                    const char *mask_value, unsigned int len);
 530int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);
 531int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,
 532                                u16 group_id);
 533int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei);
 534int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
 535int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
 536                               struct mlxsw_sp_acl_rule_info *rulei,
 537                               struct net_device *out_dev);
 538int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
 539                                struct mlxsw_sp_acl_rule_info *rulei,
 540                                u32 action, u16 vid, u16 proto, u8 prio);
 541int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
 542                                 struct mlxsw_sp_acl_rule_info *rulei);
 543int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
 544                                   struct mlxsw_sp_acl_rule_info *rulei,
 545                                   u16 fid);
 546
 547struct mlxsw_sp_acl_rule;
 548
 549struct mlxsw_sp_acl_rule *
 550mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
 551                         struct mlxsw_sp_acl_ruleset *ruleset,
 552                         unsigned long cookie);
 553void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
 554                               struct mlxsw_sp_acl_rule *rule);
 555int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
 556                          struct mlxsw_sp_acl_rule *rule);
 557void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
 558                           struct mlxsw_sp_acl_rule *rule);
 559struct mlxsw_sp_acl_rule *
 560mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,
 561                         struct mlxsw_sp_acl_ruleset *ruleset,
 562                         unsigned long cookie);
 563struct mlxsw_sp_acl_rule_info *
 564mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);
 565int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
 566                                struct mlxsw_sp_acl_rule *rule,
 567                                u64 *packets, u64 *bytes, u64 *last_use);
 568
 569struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
 570
 571int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
 572void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
 573
 574/* spectrum_acl_tcam.c */
 575extern const struct mlxsw_sp_acl_ops mlxsw_sp_acl_tcam_ops;
 576
 577/* spectrum_flower.c */
 578int mlxsw_sp_flower_replace(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 579                            struct tc_cls_flower_offload *f);
 580void mlxsw_sp_flower_destroy(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 581                             struct tc_cls_flower_offload *f);
 582int mlxsw_sp_flower_stats(struct mlxsw_sp_port *mlxsw_sp_port, bool ingress,
 583                          struct tc_cls_flower_offload *f);
 584
 585/* spectrum_qdisc.c */
 586int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,
 587                          struct tc_red_qopt_offload *p);
 588
 589/* spectrum_fid.c */
 590int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
 591                           enum mlxsw_sp_flood_type packet_type, u8 local_port,
 592                           bool member);
 593int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
 594                              struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 595void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
 596                                 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
 597enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid);
 598u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);
 599enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);
 600void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);
 601enum mlxsw_sp_rif_type
 602mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,
 603                           enum mlxsw_sp_fid_type type);
 604u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);
 605struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);
 606struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,
 607                                            int br_ifindex);
 608struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,
 609                                           u16 rif_index);
 610struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);
 611void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);
 612int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);
 613void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
 614int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
 615void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);
 616
 617#endif
 618