LCOV - code coverage report
Current view: top level - include/net - devlink.h (source / functions) Hit Total Coverage
Test: landlock.info Lines: 2 2 100.0 %
Date: 2021-04-22 12:43:58 Functions: 0 0 -

          Line data    Source code
       1             : /* SPDX-License-Identifier: GPL-2.0-or-later */
       2             : /*
       3             :  * include/net/devlink.h - Network physical device Netlink interface
       4             :  * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
       5             :  * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
       6             :  */
       7             : #ifndef _NET_DEVLINK_H_
       8             : #define _NET_DEVLINK_H_
       9             : 
      10             : #include <linux/device.h>
      11             : #include <linux/slab.h>
      12             : #include <linux/gfp.h>
      13             : #include <linux/list.h>
      14             : #include <linux/netdevice.h>
      15             : #include <linux/spinlock.h>
      16             : #include <linux/workqueue.h>
      17             : #include <linux/refcount.h>
      18             : #include <net/net_namespace.h>
      19             : #include <net/flow_offload.h>
      20             : #include <uapi/linux/devlink.h>
      21             : #include <linux/xarray.h>
      22             : #include <linux/firmware.h>
      23             : 
      24             : #define DEVLINK_RELOAD_STATS_ARRAY_SIZE \
      25             :         (__DEVLINK_RELOAD_LIMIT_MAX * __DEVLINK_RELOAD_ACTION_MAX)
      26             : 
      27             : struct devlink_dev_stats {
      28             :         u32 reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE];
      29             :         u32 remote_reload_stats[DEVLINK_RELOAD_STATS_ARRAY_SIZE];
      30             : };
      31             : 
      32             : struct devlink_ops;
      33             : 
      34             : struct devlink {
      35             :         struct list_head list;
      36             :         struct list_head port_list;
      37             :         struct list_head sb_list;
      38             :         struct list_head dpipe_table_list;
      39             :         struct list_head resource_list;
      40             :         struct list_head param_list;
      41             :         struct list_head region_list;
      42             :         struct list_head reporter_list;
      43             :         struct mutex reporters_lock; /* protects reporter_list */
      44             :         struct devlink_dpipe_headers *dpipe_headers;
      45             :         struct list_head trap_list;
      46             :         struct list_head trap_group_list;
      47             :         struct list_head trap_policer_list;
      48             :         const struct devlink_ops *ops;
      49             :         struct xarray snapshot_ids;
      50             :         struct devlink_dev_stats stats;
      51             :         struct device *dev;
      52             :         possible_net_t _net;
      53             :         struct mutex lock; /* Serializes access to devlink instance specific objects such as
      54             :                             * port, sb, dpipe, resource, params, region, traps and more.
      55             :                             */
      56             :         u8 reload_failed:1,
      57             :            reload_enabled:1,
      58             :            registered:1;
      59             :         char priv[0] __aligned(NETDEV_ALIGN);
      60             : };
      61             : 
      62             : struct devlink_port_phys_attrs {
      63             :         u32 port_number; /* Same value as "split group".
      64             :                           * A physical port which is visible to the user
      65             :                           * for a given port flavour.
      66             :                           */
      67             :         u32 split_subport_number; /* If the port is split, this is the number of subport. */
      68             : };
      69             : 
      70             : /**
      71             :  * struct devlink_port_pci_pf_attrs - devlink port's PCI PF attributes
      72             :  * @controller: Associated controller number
      73             :  * @pf: Associated PCI PF number for this port.
      74             :  * @external: when set, indicates if a port is for an external controller
      75             :  */
      76             : struct devlink_port_pci_pf_attrs {
      77             :         u32 controller;
      78             :         u16 pf;
      79             :         u8 external:1;
      80             : };
      81             : 
      82             : /**
      83             :  * struct devlink_port_pci_vf_attrs - devlink port's PCI VF attributes
      84             :  * @controller: Associated controller number
      85             :  * @pf: Associated PCI PF number for this port.
      86             :  * @vf: Associated PCI VF for of the PCI PF for this port.
      87             :  * @external: when set, indicates if a port is for an external controller
      88             :  */
      89             : struct devlink_port_pci_vf_attrs {
      90             :         u32 controller;
      91             :         u16 pf;
      92             :         u16 vf;
      93             :         u8 external:1;
      94             : };
      95             : 
      96             : /**
      97             :  * struct devlink_port_pci_sf_attrs - devlink port's PCI SF attributes
      98             :  * @controller: Associated controller number
      99             :  * @sf: Associated PCI SF for of the PCI PF for this port.
     100             :  * @pf: Associated PCI PF number for this port.
     101             :  */
     102             : struct devlink_port_pci_sf_attrs {
     103             :         u32 controller;
     104             :         u32 sf;
     105             :         u16 pf;
     106             : };
     107             : 
     108             : /**
     109             :  * struct devlink_port_attrs - devlink port object
     110             :  * @flavour: flavour of the port
     111             :  * @split: indicates if this is split port
     112             :  * @splittable: indicates if the port can be split.
     113             :  * @lanes: maximum number of lanes the port supports. 0 value is not passed to netlink.
     114             :  * @switch_id: if the port is part of switch, this is buffer with ID, otherwise this is NULL
     115             :  * @phys: physical port attributes
     116             :  * @pci_pf: PCI PF port attributes
     117             :  * @pci_vf: PCI VF port attributes
     118             :  * @pci_sf: PCI SF port attributes
     119             :  */
     120             : struct devlink_port_attrs {
     121             :         u8 split:1,
     122             :            splittable:1;
     123             :         u32 lanes;
     124             :         enum devlink_port_flavour flavour;
     125             :         struct netdev_phys_item_id switch_id;
     126             :         union {
     127             :                 struct devlink_port_phys_attrs phys;
     128             :                 struct devlink_port_pci_pf_attrs pci_pf;
     129             :                 struct devlink_port_pci_vf_attrs pci_vf;
     130             :                 struct devlink_port_pci_sf_attrs pci_sf;
     131             :         };
     132             : };
     133             : 
     134             : struct devlink_port {
     135             :         struct list_head list;
     136             :         struct list_head param_list;
     137             :         struct list_head region_list;
     138             :         struct devlink *devlink;
     139             :         unsigned int index;
     140             :         bool registered;
     141             :         spinlock_t type_lock; /* Protects type and type_dev
     142             :                                * pointer consistency.
     143             :                                */
     144             :         enum devlink_port_type type;
     145             :         enum devlink_port_type desired_type;
     146             :         void *type_dev;
     147             :         struct devlink_port_attrs attrs;
     148             :         u8 attrs_set:1,
     149             :            switch_port:1;
     150             :         struct delayed_work type_warn_dw;
     151             :         struct list_head reporter_list;
     152             :         struct mutex reporters_lock; /* Protects reporter_list */
     153             : };
     154             : 
     155             : struct devlink_port_new_attrs {
     156             :         enum devlink_port_flavour flavour;
     157             :         unsigned int port_index;
     158             :         u32 controller;
     159             :         u32 sfnum;
     160             :         u16 pfnum;
     161             :         u8 port_index_valid:1,
     162             :            controller_valid:1,
     163             :            sfnum_valid:1;
     164             : };
     165             : 
     166             : struct devlink_sb_pool_info {
     167             :         enum devlink_sb_pool_type pool_type;
     168             :         u32 size;
     169             :         enum devlink_sb_threshold_type threshold_type;
     170             :         u32 cell_size;
     171             : };
     172             : 
     173             : /**
     174             :  * struct devlink_dpipe_field - dpipe field object
     175             :  * @name: field name
     176             :  * @id: index inside the headers field array
     177             :  * @bitwidth: bitwidth
     178             :  * @mapping_type: mapping type
     179             :  */
     180             : struct devlink_dpipe_field {
     181             :         const char *name;
     182             :         unsigned int id;
     183             :         unsigned int bitwidth;
     184             :         enum devlink_dpipe_field_mapping_type mapping_type;
     185             : };
     186             : 
     187             : /**
     188             :  * struct devlink_dpipe_header - dpipe header object
     189             :  * @name: header name
     190             :  * @id: index, global/local detrmined by global bit
     191             :  * @fields: fields
     192             :  * @fields_count: number of fields
     193             :  * @global: indicates if header is shared like most protocol header
     194             :  *          or driver specific
     195             :  */
     196             : struct devlink_dpipe_header {
     197             :         const char *name;
     198             :         unsigned int id;
     199             :         struct devlink_dpipe_field *fields;
     200             :         unsigned int fields_count;
     201             :         bool global;
     202             : };
     203             : 
     204             : /**
     205             :  * struct devlink_dpipe_match - represents match operation
     206             :  * @type: type of match
     207             :  * @header_index: header index (packets can have several headers of same
     208             :  *                type like in case of tunnels)
     209             :  * @header: header
     210             :  * @fieled_id: field index
     211             :  */
     212             : struct devlink_dpipe_match {
     213             :         enum devlink_dpipe_match_type type;
     214             :         unsigned int header_index;
     215             :         struct devlink_dpipe_header *header;
     216             :         unsigned int field_id;
     217             : };
     218             : 
     219             : /**
     220             :  * struct devlink_dpipe_action - represents action operation
     221             :  * @type: type of action
     222             :  * @header_index: header index (packets can have several headers of same
     223             :  *                type like in case of tunnels)
     224             :  * @header: header
     225             :  * @fieled_id: field index
     226             :  */
     227             : struct devlink_dpipe_action {
     228             :         enum devlink_dpipe_action_type type;
     229             :         unsigned int header_index;
     230             :         struct devlink_dpipe_header *header;
     231             :         unsigned int field_id;
     232             : };
     233             : 
     234             : /**
     235             :  * struct devlink_dpipe_value - represents value of match/action
     236             :  * @action: action
     237             :  * @match: match
     238             :  * @mapping_value: in case the field has some mapping this value
     239             :  *                 specified the mapping value
     240             :  * @mapping_valid: specify if mapping value is valid
     241             :  * @value_size: value size
     242             :  * @value: value
     243             :  * @mask: bit mask
     244             :  */
     245             : struct devlink_dpipe_value {
     246             :         union {
     247             :                 struct devlink_dpipe_action *action;
     248             :                 struct devlink_dpipe_match *match;
     249             :         };
     250             :         unsigned int mapping_value;
     251             :         bool mapping_valid;
     252             :         unsigned int value_size;
     253             :         void *value;
     254             :         void *mask;
     255             : };
     256             : 
     257             : /**
     258             :  * struct devlink_dpipe_entry - table entry object
     259             :  * @index: index of the entry in the table
     260             :  * @match_values: match values
     261             :  * @matche_values_count: count of matches tuples
     262             :  * @action_values: actions values
     263             :  * @action_values_count: count of actions values
     264             :  * @counter: value of counter
     265             :  * @counter_valid: Specify if value is valid from hardware
     266             :  */
     267             : struct devlink_dpipe_entry {
     268             :         u64 index;
     269             :         struct devlink_dpipe_value *match_values;
     270             :         unsigned int match_values_count;
     271             :         struct devlink_dpipe_value *action_values;
     272             :         unsigned int action_values_count;
     273             :         u64 counter;
     274             :         bool counter_valid;
     275             : };
     276             : 
     277             : /**
     278             :  * struct devlink_dpipe_dump_ctx - context provided to driver in order
     279             :  *                                 to dump
     280             :  * @info: info
     281             :  * @cmd: devlink command
     282             :  * @skb: skb
     283             :  * @nest: top attribute
     284             :  * @hdr: hdr
     285             :  */
     286             : struct devlink_dpipe_dump_ctx {
     287             :         struct genl_info *info;
     288             :         enum devlink_command cmd;
     289             :         struct sk_buff *skb;
     290             :         struct nlattr *nest;
     291             :         void *hdr;
     292             : };
     293             : 
     294             : struct devlink_dpipe_table_ops;
     295             : 
     296             : /**
     297             :  * struct devlink_dpipe_table - table object
     298             :  * @priv: private
     299             :  * @name: table name
     300             :  * @counters_enabled: indicates if counters are active
     301             :  * @counter_control_extern: indicates if counter control is in dpipe or
     302             :  *                          external tool
     303             :  * @resource_valid: Indicate that the resource id is valid
     304             :  * @resource_id: relative resource this table is related to
     305             :  * @resource_units: number of resource's unit consumed per table's entry
     306             :  * @table_ops: table operations
     307             :  * @rcu: rcu
     308             :  */
     309             : struct devlink_dpipe_table {
     310             :         void *priv;
     311             :         struct list_head list;
     312             :         const char *name;
     313             :         bool counters_enabled;
     314             :         bool counter_control_extern;
     315             :         bool resource_valid;
     316             :         u64 resource_id;
     317             :         u64 resource_units;
     318             :         struct devlink_dpipe_table_ops *table_ops;
     319             :         struct rcu_head rcu;
     320             : };
     321             : 
     322             : /**
     323             :  * struct devlink_dpipe_table_ops - dpipe_table ops
     324             :  * @actions_dump - dumps all tables actions
     325             :  * @matches_dump - dumps all tables matches
     326             :  * @entries_dump - dumps all active entries in the table
     327             :  * @counters_set_update - when changing the counter status hardware sync
     328             :  *                        maybe needed to allocate/free counter related
     329             :  *                        resources
     330             :  * @size_get - get size
     331             :  */
     332             : struct devlink_dpipe_table_ops {
     333             :         int (*actions_dump)(void *priv, struct sk_buff *skb);
     334             :         int (*matches_dump)(void *priv, struct sk_buff *skb);
     335             :         int (*entries_dump)(void *priv, bool counters_enabled,
     336             :                             struct devlink_dpipe_dump_ctx *dump_ctx);
     337             :         int (*counters_set_update)(void *priv, bool enable);
     338             :         u64 (*size_get)(void *priv);
     339             : };
     340             : 
     341             : /**
     342             :  * struct devlink_dpipe_headers - dpipe headers
     343             :  * @headers - header array can be shared (global bit) or driver specific
     344             :  * @headers_count - count of headers
     345             :  */
     346             : struct devlink_dpipe_headers {
     347             :         struct devlink_dpipe_header **headers;
     348             :         unsigned int headers_count;
     349             : };
     350             : 
     351             : /**
     352             :  * struct devlink_resource_size_params - resource's size parameters
     353             :  * @size_min: minimum size which can be set
     354             :  * @size_max: maximum size which can be set
     355             :  * @size_granularity: size granularity
     356             :  * @size_unit: resource's basic unit
     357             :  */
     358             : struct devlink_resource_size_params {
     359             :         u64 size_min;
     360             :         u64 size_max;
     361             :         u64 size_granularity;
     362             :         enum devlink_resource_unit unit;
     363             : };
     364             : 
     365             : static inline void
     366             : devlink_resource_size_params_init(struct devlink_resource_size_params *size_params,
     367             :                                   u64 size_min, u64 size_max,
     368             :                                   u64 size_granularity,
     369             :                                   enum devlink_resource_unit unit)
     370             : {
     371             :         size_params->size_min = size_min;
     372             :         size_params->size_max = size_max;
     373             :         size_params->size_granularity = size_granularity;
     374             :         size_params->unit = unit;
     375             : }
     376             : 
     377             : typedef u64 devlink_resource_occ_get_t(void *priv);
     378             : 
     379             : /**
     380             :  * struct devlink_resource - devlink resource
     381             :  * @name: name of the resource
     382             :  * @id: id, per devlink instance
     383             :  * @size: size of the resource
     384             :  * @size_new: updated size of the resource, reload is needed
     385             :  * @size_valid: valid in case the total size of the resource is valid
     386             :  *              including its children
     387             :  * @parent: parent resource
     388             :  * @size_params: size parameters
     389             :  * @list: parent list
     390             :  * @resource_list: list of child resources
     391             :  */
     392             : struct devlink_resource {
     393             :         const char *name;
     394             :         u64 id;
     395             :         u64 size;
     396             :         u64 size_new;
     397             :         bool size_valid;
     398             :         struct devlink_resource *parent;
     399             :         struct devlink_resource_size_params size_params;
     400             :         struct list_head list;
     401             :         struct list_head resource_list;
     402             :         devlink_resource_occ_get_t *occ_get;
     403             :         void *occ_get_priv;
     404             : };
     405             : 
     406             : #define DEVLINK_RESOURCE_ID_PARENT_TOP 0
     407             : 
     408             : #define DEVLINK_RESOURCE_GENERIC_NAME_PORTS "physical_ports"
     409             : 
     410             : #define __DEVLINK_PARAM_MAX_STRING_VALUE 32
     411             : enum devlink_param_type {
     412             :         DEVLINK_PARAM_TYPE_U8,
     413             :         DEVLINK_PARAM_TYPE_U16,
     414             :         DEVLINK_PARAM_TYPE_U32,
     415             :         DEVLINK_PARAM_TYPE_STRING,
     416             :         DEVLINK_PARAM_TYPE_BOOL,
     417             : };
     418             : 
     419             : union devlink_param_value {
     420             :         u8 vu8;
     421             :         u16 vu16;
     422             :         u32 vu32;
     423             :         char vstr[__DEVLINK_PARAM_MAX_STRING_VALUE];
     424             :         bool vbool;
     425             : };
     426             : 
     427             : struct devlink_param_gset_ctx {
     428             :         union devlink_param_value val;
     429             :         enum devlink_param_cmode cmode;
     430             : };
     431             : 
     432             : /**
     433             :  * struct devlink_flash_notify - devlink dev flash notify data
     434             :  * @status_msg: current status string
     435             :  * @component: firmware component being updated
     436             :  * @done: amount of work completed of total amount
     437             :  * @total: amount of work expected to be done
     438             :  * @timeout: expected max timeout in seconds
     439             :  *
     440             :  * These are values to be given to userland to be displayed in order
     441             :  * to show current activity in a firmware update process.
     442             :  */
     443             : struct devlink_flash_notify {
     444             :         const char *status_msg;
     445             :         const char *component;
     446             :         unsigned long done;
     447             :         unsigned long total;
     448             :         unsigned long timeout;
     449             : };
     450             : 
     451             : /**
     452             :  * struct devlink_param - devlink configuration parameter data
     453             :  * @name: name of the parameter
     454             :  * @generic: indicates if the parameter is generic or driver specific
     455             :  * @type: parameter type
     456             :  * @supported_cmodes: bitmap of supported configuration modes
     457             :  * @get: get parameter value, used for runtime and permanent
     458             :  *       configuration modes
     459             :  * @set: set parameter value, used for runtime and permanent
     460             :  *       configuration modes
     461             :  * @validate: validate input value is applicable (within value range, etc.)
     462             :  *
     463             :  * This struct should be used by the driver to fill the data for
     464             :  * a parameter it registers.
     465             :  */
     466             : struct devlink_param {
     467             :         u32 id;
     468             :         const char *name;
     469             :         bool generic;
     470             :         enum devlink_param_type type;
     471             :         unsigned long supported_cmodes;
     472             :         int (*get)(struct devlink *devlink, u32 id,
     473             :                    struct devlink_param_gset_ctx *ctx);
     474             :         int (*set)(struct devlink *devlink, u32 id,
     475             :                    struct devlink_param_gset_ctx *ctx);
     476             :         int (*validate)(struct devlink *devlink, u32 id,
     477             :                         union devlink_param_value val,
     478             :                         struct netlink_ext_ack *extack);
     479             : };
     480             : 
     481             : struct devlink_param_item {
     482             :         struct list_head list;
     483             :         const struct devlink_param *param;
     484             :         union devlink_param_value driverinit_value;
     485             :         bool driverinit_value_valid;
     486             :         bool published;
     487             : };
     488             : 
     489             : enum devlink_param_generic_id {
     490             :         DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
     491             :         DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
     492             :         DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV,
     493             :         DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
     494             :         DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI,
     495             :         DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
     496             :         DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
     497             :         DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
     498             :         DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE,
     499             :         DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
     500             :         DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET,
     501             : 
     502             :         /* add new param generic ids above here*/
     503             :         __DEVLINK_PARAM_GENERIC_ID_MAX,
     504             :         DEVLINK_PARAM_GENERIC_ID_MAX = __DEVLINK_PARAM_GENERIC_ID_MAX - 1,
     505             : };
     506             : 
     507             : #define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_NAME "internal_error_reset"
     508             : #define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
     509             : 
     510             : #define DEVLINK_PARAM_GENERIC_MAX_MACS_NAME "max_macs"
     511             : #define DEVLINK_PARAM_GENERIC_MAX_MACS_TYPE DEVLINK_PARAM_TYPE_U32
     512             : 
     513             : #define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_NAME "enable_sriov"
     514             : #define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_TYPE DEVLINK_PARAM_TYPE_BOOL
     515             : 
     516             : #define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_NAME "region_snapshot_enable"
     517             : #define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_TYPE DEVLINK_PARAM_TYPE_BOOL
     518             : 
     519             : #define DEVLINK_PARAM_GENERIC_IGNORE_ARI_NAME "ignore_ari"
     520             : #define DEVLINK_PARAM_GENERIC_IGNORE_ARI_TYPE DEVLINK_PARAM_TYPE_BOOL
     521             : 
     522             : #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_NAME "msix_vec_per_pf_max"
     523             : #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_TYPE DEVLINK_PARAM_TYPE_U32
     524             : 
     525             : #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_NAME "msix_vec_per_pf_min"
     526             : #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_TYPE DEVLINK_PARAM_TYPE_U32
     527             : 
     528             : #define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_NAME "fw_load_policy"
     529             : #define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_TYPE DEVLINK_PARAM_TYPE_U8
     530             : 
     531             : #define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_NAME \
     532             :         "reset_dev_on_drv_probe"
     533             : #define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_TYPE DEVLINK_PARAM_TYPE_U8
     534             : 
     535             : #define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_NAME "enable_roce"
     536             : #define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_TYPE DEVLINK_PARAM_TYPE_BOOL
     537             : 
     538             : #define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_NAME "enable_remote_dev_reset"
     539             : #define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
     540             : 
     541             : #define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate)      \
     542             : {                                                                       \
     543             :         .id = DEVLINK_PARAM_GENERIC_ID_##_id,                           \
     544             :         .name = DEVLINK_PARAM_GENERIC_##_id##_NAME,                     \
     545             :         .type = DEVLINK_PARAM_GENERIC_##_id##_TYPE,                     \
     546             :         .generic = true,                                                \
     547             :         .supported_cmodes = _cmodes,                                    \
     548             :         .get = _get,                                                    \
     549             :         .set = _set,                                                    \
     550             :         .validate = _validate,                                          \
     551             : }
     552             : 
     553             : #define DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes, _get, _set, _validate) \
     554             : {                                                                       \
     555             :         .id = _id,                                                      \
     556             :         .name = _name,                                                  \
     557             :         .type = _type,                                                  \
     558             :         .supported_cmodes = _cmodes,                                    \
     559             :         .get = _get,                                                    \
     560             :         .set = _set,                                                    \
     561             :         .validate = _validate,                                          \
     562             : }
     563             : 
     564             : /* Part number, identifier of board design */
     565             : #define DEVLINK_INFO_VERSION_GENERIC_BOARD_ID   "board.id"
     566             : /* Revision of board design */
     567             : #define DEVLINK_INFO_VERSION_GENERIC_BOARD_REV  "board.rev"
     568             : /* Maker of the board */
     569             : #define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE  "board.manufacture"
     570             : 
     571             : /* Part number, identifier of asic design */
     572             : #define DEVLINK_INFO_VERSION_GENERIC_ASIC_ID    "asic.id"
     573             : /* Revision of asic design */
     574             : #define DEVLINK_INFO_VERSION_GENERIC_ASIC_REV   "asic.rev"
     575             : 
     576             : /* Overall FW version */
     577             : #define DEVLINK_INFO_VERSION_GENERIC_FW         "fw"
     578             : /* Control processor FW version */
     579             : #define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT    "fw.mgmt"
     580             : /* FW interface specification version */
     581             : #define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API        "fw.mgmt.api"
     582             : /* Data path microcode controlling high-speed packet processing */
     583             : #define DEVLINK_INFO_VERSION_GENERIC_FW_APP     "fw.app"
     584             : /* UNDI software version */
     585             : #define DEVLINK_INFO_VERSION_GENERIC_FW_UNDI    "fw.undi"
     586             : /* NCSI support/handler version */
     587             : #define DEVLINK_INFO_VERSION_GENERIC_FW_NCSI    "fw.ncsi"
     588             : /* FW parameter set id */
     589             : #define DEVLINK_INFO_VERSION_GENERIC_FW_PSID    "fw.psid"
     590             : /* RoCE FW version */
     591             : #define DEVLINK_INFO_VERSION_GENERIC_FW_ROCE    "fw.roce"
     592             : /* Firmware bundle identifier */
     593             : #define DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID       "fw.bundle_id"
     594             : 
     595             : /**
     596             :  * struct devlink_flash_update_params - Flash Update parameters
     597             :  * @fw: pointer to the firmware data to update from
     598             :  * @component: the flash component to update
     599             :  *
     600             :  * With the exception of fw, drivers must opt-in to parameters by
     601             :  * setting the appropriate bit in the supported_flash_update_params field in
     602             :  * their devlink_ops structure.
     603             :  */
     604             : struct devlink_flash_update_params {
     605             :         const struct firmware *fw;
     606             :         const char *component;
     607             :         u32 overwrite_mask;
     608             : };
     609             : 
     610             : #define DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT          BIT(0)
     611             : #define DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK     BIT(1)
     612             : 
     613             : struct devlink_region;
     614             : struct devlink_info_req;
     615             : 
     616             : /**
     617             :  * struct devlink_region_ops - Region operations
     618             :  * @name: region name
     619             :  * @destructor: callback used to free snapshot memory when deleting
     620             :  * @snapshot: callback to request an immediate snapshot. On success,
     621             :  *            the data variable must be updated to point to the snapshot data.
     622             :  *            The function will be called while the devlink instance lock is
     623             :  *            held.
     624             :  * @priv: Pointer to driver private data for the region operation
     625             :  */
     626             : struct devlink_region_ops {
     627             :         const char *name;
     628             :         void (*destructor)(const void *data);
     629             :         int (*snapshot)(struct devlink *devlink,
     630             :                         const struct devlink_region_ops *ops,
     631             :                         struct netlink_ext_ack *extack,
     632             :                         u8 **data);
     633             :         void *priv;
     634             : };
     635             : 
     636             : /**
     637             :  * struct devlink_port_region_ops - Region operations for a port
     638             :  * @name: region name
     639             :  * @destructor: callback used to free snapshot memory when deleting
     640             :  * @snapshot: callback to request an immediate snapshot. On success,
     641             :  *            the data variable must be updated to point to the snapshot data.
     642             :  *            The function will be called while the devlink instance lock is
     643             :  *            held.
     644             :  * @priv: Pointer to driver private data for the region operation
     645             :  */
     646             : struct devlink_port_region_ops {
     647             :         const char *name;
     648             :         void (*destructor)(const void *data);
     649             :         int (*snapshot)(struct devlink_port *port,
     650             :                         const struct devlink_port_region_ops *ops,
     651             :                         struct netlink_ext_ack *extack,
     652             :                         u8 **data);
     653             :         void *priv;
     654             : };
     655             : 
     656             : struct devlink_fmsg;
     657             : struct devlink_health_reporter;
     658             : 
     659             : enum devlink_health_reporter_state {
     660             :         DEVLINK_HEALTH_REPORTER_STATE_HEALTHY,
     661             :         DEVLINK_HEALTH_REPORTER_STATE_ERROR,
     662             : };
     663             : 
     664             : /**
     665             :  * struct devlink_health_reporter_ops - Reporter operations
     666             :  * @name: reporter name
     667             :  * @recover: callback to recover from reported error
     668             :  *           if priv_ctx is NULL, run a full recover
     669             :  * @dump: callback to dump an object
     670             :  *        if priv_ctx is NULL, run a full dump
     671             :  * @diagnose: callback to diagnose the current status
     672             :  * @test: callback to trigger a test event
     673             :  */
     674             : 
     675             : struct devlink_health_reporter_ops {
     676             :         char *name;
     677             :         int (*recover)(struct devlink_health_reporter *reporter,
     678             :                        void *priv_ctx, struct netlink_ext_ack *extack);
     679             :         int (*dump)(struct devlink_health_reporter *reporter,
     680             :                     struct devlink_fmsg *fmsg, void *priv_ctx,
     681             :                     struct netlink_ext_ack *extack);
     682             :         int (*diagnose)(struct devlink_health_reporter *reporter,
     683             :                         struct devlink_fmsg *fmsg,
     684             :                         struct netlink_ext_ack *extack);
     685             :         int (*test)(struct devlink_health_reporter *reporter,
     686             :                     struct netlink_ext_ack *extack);
     687             : };
     688             : 
     689             : /**
     690             :  * struct devlink_trap_metadata - Packet trap metadata.
     691             :  * @trap_name: Trap name.
     692             :  * @trap_group_name: Trap group name.
     693             :  * @input_dev: Input netdevice.
     694             :  * @fa_cookie: Flow action user cookie.
     695             :  * @trap_type: Trap type.
     696             :  */
     697             : struct devlink_trap_metadata {
     698             :         const char *trap_name;
     699             :         const char *trap_group_name;
     700             :         struct net_device *input_dev;
     701             :         const struct flow_action_cookie *fa_cookie;
     702             :         enum devlink_trap_type trap_type;
     703             : };
     704             : 
     705             : /**
     706             :  * struct devlink_trap_policer - Immutable packet trap policer attributes.
     707             :  * @id: Policer identifier.
     708             :  * @init_rate: Initial rate in packets / sec.
     709             :  * @init_burst: Initial burst size in packets.
     710             :  * @max_rate: Maximum rate.
     711             :  * @min_rate: Minimum rate.
     712             :  * @max_burst: Maximum burst size.
     713             :  * @min_burst: Minimum burst size.
     714             :  *
     715             :  * Describes immutable attributes of packet trap policers that drivers register
     716             :  * with devlink.
     717             :  */
     718             : struct devlink_trap_policer {
     719             :         u32 id;
     720             :         u64 init_rate;
     721             :         u64 init_burst;
     722             :         u64 max_rate;
     723             :         u64 min_rate;
     724             :         u64 max_burst;
     725             :         u64 min_burst;
     726             : };
     727             : 
     728             : /**
     729             :  * struct devlink_trap_group - Immutable packet trap group attributes.
     730             :  * @name: Trap group name.
     731             :  * @id: Trap group identifier.
     732             :  * @generic: Whether the trap group is generic or not.
     733             :  * @init_policer_id: Initial policer identifier.
     734             :  *
     735             :  * Describes immutable attributes of packet trap groups that drivers register
     736             :  * with devlink.
     737             :  */
     738             : struct devlink_trap_group {
     739             :         const char *name;
     740             :         u16 id;
     741             :         bool generic;
     742             :         u32 init_policer_id;
     743             : };
     744             : 
     745             : #define DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT    BIT(0)
     746             : #define DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE  BIT(1)
     747             : 
     748             : /**
     749             :  * struct devlink_trap - Immutable packet trap attributes.
     750             :  * @type: Trap type.
     751             :  * @init_action: Initial trap action.
     752             :  * @generic: Whether the trap is generic or not.
     753             :  * @id: Trap identifier.
     754             :  * @name: Trap name.
     755             :  * @init_group_id: Initial group identifier.
     756             :  * @metadata_cap: Metadata types that can be provided by the trap.
     757             :  *
     758             :  * Describes immutable attributes of packet traps that drivers register with
     759             :  * devlink.
     760             :  */
     761             : struct devlink_trap {
     762             :         enum devlink_trap_type type;
     763             :         enum devlink_trap_action init_action;
     764             :         bool generic;
     765             :         u16 id;
     766             :         const char *name;
     767             :         u16 init_group_id;
     768             :         u32 metadata_cap;
     769             : };
     770             : 
     771             : /* All traps must be documented in
     772             :  * Documentation/networking/devlink/devlink-trap.rst
     773             :  */
     774             : enum devlink_trap_generic_id {
     775             :         DEVLINK_TRAP_GENERIC_ID_SMAC_MC,
     776             :         DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH,
     777             :         DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER,
     778             :         DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER,
     779             :         DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST,
     780             :         DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER,
     781             :         DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE,
     782             :         DEVLINK_TRAP_GENERIC_ID_TTL_ERROR,
     783             :         DEVLINK_TRAP_GENERIC_ID_TAIL_DROP,
     784             :         DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET,
     785             :         DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC,
     786             :         DEVLINK_TRAP_GENERIC_ID_DIP_LB,
     787             :         DEVLINK_TRAP_GENERIC_ID_SIP_MC,
     788             :         DEVLINK_TRAP_GENERIC_ID_SIP_LB,
     789             :         DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR,
     790             :         DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC,
     791             :         DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE,
     792             :         DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE,
     793             :         DEVLINK_TRAP_GENERIC_ID_MTU_ERROR,
     794             :         DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH,
     795             :         DEVLINK_TRAP_GENERIC_ID_RPF,
     796             :         DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE,
     797             :         DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS,
     798             :         DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS,
     799             :         DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE,
     800             :         DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR,
     801             :         DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC,
     802             :         DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP,
     803             :         DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP,
     804             :         DEVLINK_TRAP_GENERIC_ID_STP,
     805             :         DEVLINK_TRAP_GENERIC_ID_LACP,
     806             :         DEVLINK_TRAP_GENERIC_ID_LLDP,
     807             :         DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY,
     808             :         DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT,
     809             :         DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT,
     810             :         DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT,
     811             :         DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE,
     812             :         DEVLINK_TRAP_GENERIC_ID_MLD_QUERY,
     813             :         DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT,
     814             :         DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT,
     815             :         DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE,
     816             :         DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP,
     817             :         DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP,
     818             :         DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST,
     819             :         DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE,
     820             :         DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY,
     821             :         DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT,
     822             :         DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT,
     823             :         DEVLINK_TRAP_GENERIC_ID_IPV4_BFD,
     824             :         DEVLINK_TRAP_GENERIC_ID_IPV6_BFD,
     825             :         DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF,
     826             :         DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF,
     827             :         DEVLINK_TRAP_GENERIC_ID_IPV4_BGP,
     828             :         DEVLINK_TRAP_GENERIC_ID_IPV6_BGP,
     829             :         DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP,
     830             :         DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP,
     831             :         DEVLINK_TRAP_GENERIC_ID_IPV4_PIM,
     832             :         DEVLINK_TRAP_GENERIC_ID_IPV6_PIM,
     833             :         DEVLINK_TRAP_GENERIC_ID_UC_LB,
     834             :         DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE,
     835             :         DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE,
     836             :         DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE,
     837             :         DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES,
     838             :         DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS,
     839             :         DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT,
     840             :         DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT,
     841             :         DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT,
     842             :         DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT,
     843             :         DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT,
     844             :         DEVLINK_TRAP_GENERIC_ID_PTP_EVENT,
     845             :         DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL,
     846             :         DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE,
     847             :         DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP,
     848             :         DEVLINK_TRAP_GENERIC_ID_EARLY_DROP,
     849             :         DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING,
     850             :         DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING,
     851             :         DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING,
     852             :         DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING,
     853             :         DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING,
     854             :         DEVLINK_TRAP_GENERIC_ID_ARP_PARSING,
     855             :         DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING,
     856             :         DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING,
     857             :         DEVLINK_TRAP_GENERIC_ID_GRE_PARSING,
     858             :         DEVLINK_TRAP_GENERIC_ID_UDP_PARSING,
     859             :         DEVLINK_TRAP_GENERIC_ID_TCP_PARSING,
     860             :         DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING,
     861             :         DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING,
     862             :         DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING,
     863             :         DEVLINK_TRAP_GENERIC_ID_GTP_PARSING,
     864             :         DEVLINK_TRAP_GENERIC_ID_ESP_PARSING,
     865             :         DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP,
     866             :         DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER,
     867             : 
     868             :         /* Add new generic trap IDs above */
     869             :         __DEVLINK_TRAP_GENERIC_ID_MAX,
     870             :         DEVLINK_TRAP_GENERIC_ID_MAX = __DEVLINK_TRAP_GENERIC_ID_MAX - 1,
     871             : };
     872             : 
     873             : /* All trap groups must be documented in
     874             :  * Documentation/networking/devlink/devlink-trap.rst
     875             :  */
     876             : enum devlink_trap_group_generic_id {
     877             :         DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS,
     878             :         DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS,
     879             :         DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS,
     880             :         DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS,
     881             :         DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS,
     882             :         DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS,
     883             :         DEVLINK_TRAP_GROUP_GENERIC_ID_STP,
     884             :         DEVLINK_TRAP_GROUP_GENERIC_ID_LACP,
     885             :         DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP,
     886             :         DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING,
     887             :         DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP,
     888             :         DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY,
     889             :         DEVLINK_TRAP_GROUP_GENERIC_ID_BFD,
     890             :         DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF,
     891             :         DEVLINK_TRAP_GROUP_GENERIC_ID_BGP,
     892             :         DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP,
     893             :         DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
     894             :         DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
     895             :         DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
     896             :         DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
     897             :         DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
     898             :         DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
     899             :         DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
     900             :         DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE,
     901             :         DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP,
     902             :         DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS,
     903             : 
     904             :         /* Add new generic trap group IDs above */
     905             :         __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX,
     906             :         DEVLINK_TRAP_GROUP_GENERIC_ID_MAX =
     907             :                 __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX - 1,
     908             : };
     909             : 
     910             : #define DEVLINK_TRAP_GENERIC_NAME_SMAC_MC \
     911             :         "source_mac_is_multicast"
     912             : #define DEVLINK_TRAP_GENERIC_NAME_VLAN_TAG_MISMATCH \
     913             :         "vlan_tag_mismatch"
     914             : #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_VLAN_FILTER \
     915             :         "ingress_vlan_filter"
     916             : #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_STP_FILTER \
     917             :         "ingress_spanning_tree_filter"
     918             : #define DEVLINK_TRAP_GENERIC_NAME_EMPTY_TX_LIST \
     919             :         "port_list_is_empty"
     920             : #define DEVLINK_TRAP_GENERIC_NAME_PORT_LOOPBACK_FILTER \
     921             :         "port_loopback_filter"
     922             : #define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_ROUTE \
     923             :         "blackhole_route"
     924             : #define DEVLINK_TRAP_GENERIC_NAME_TTL_ERROR \
     925             :         "ttl_value_is_too_small"
     926             : #define DEVLINK_TRAP_GENERIC_NAME_TAIL_DROP \
     927             :         "tail_drop"
     928             : #define DEVLINK_TRAP_GENERIC_NAME_NON_IP_PACKET \
     929             :         "non_ip"
     930             : #define DEVLINK_TRAP_GENERIC_NAME_UC_DIP_MC_DMAC \
     931             :         "uc_dip_over_mc_dmac"
     932             : #define DEVLINK_TRAP_GENERIC_NAME_DIP_LB \
     933             :         "dip_is_loopback_address"
     934             : #define DEVLINK_TRAP_GENERIC_NAME_SIP_MC \
     935             :         "sip_is_mc"
     936             : #define DEVLINK_TRAP_GENERIC_NAME_SIP_LB \
     937             :         "sip_is_loopback_address"
     938             : #define DEVLINK_TRAP_GENERIC_NAME_CORRUPTED_IP_HDR \
     939             :         "ip_header_corrupted"
     940             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_SIP_BC \
     941             :         "ipv4_sip_is_limited_bc"
     942             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_RESERVED_SCOPE \
     943             :         "ipv6_mc_dip_reserved_scope"
     944             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE \
     945             :         "ipv6_mc_dip_interface_local_scope"
     946             : #define DEVLINK_TRAP_GENERIC_NAME_MTU_ERROR \
     947             :         "mtu_value_is_too_small"
     948             : #define DEVLINK_TRAP_GENERIC_NAME_UNRESOLVED_NEIGH \
     949             :         "unresolved_neigh"
     950             : #define DEVLINK_TRAP_GENERIC_NAME_RPF \
     951             :         "mc_reverse_path_forwarding"
     952             : #define DEVLINK_TRAP_GENERIC_NAME_REJECT_ROUTE \
     953             :         "reject_route"
     954             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_LPM_UNICAST_MISS \
     955             :         "ipv4_lpm_miss"
     956             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_LPM_UNICAST_MISS \
     957             :         "ipv6_lpm_miss"
     958             : #define DEVLINK_TRAP_GENERIC_NAME_NON_ROUTABLE \
     959             :         "non_routable_packet"
     960             : #define DEVLINK_TRAP_GENERIC_NAME_DECAP_ERROR \
     961             :         "decap_error"
     962             : #define DEVLINK_TRAP_GENERIC_NAME_OVERLAY_SMAC_MC \
     963             :         "overlay_smac_is_mc"
     964             : #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_FLOW_ACTION_DROP \
     965             :         "ingress_flow_action_drop"
     966             : #define DEVLINK_TRAP_GENERIC_NAME_EGRESS_FLOW_ACTION_DROP \
     967             :         "egress_flow_action_drop"
     968             : #define DEVLINK_TRAP_GENERIC_NAME_STP \
     969             :         "stp"
     970             : #define DEVLINK_TRAP_GENERIC_NAME_LACP \
     971             :         "lacp"
     972             : #define DEVLINK_TRAP_GENERIC_NAME_LLDP \
     973             :         "lldp"
     974             : #define DEVLINK_TRAP_GENERIC_NAME_IGMP_QUERY \
     975             :         "igmp_query"
     976             : #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V1_REPORT \
     977             :         "igmp_v1_report"
     978             : #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_REPORT \
     979             :         "igmp_v2_report"
     980             : #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V3_REPORT \
     981             :         "igmp_v3_report"
     982             : #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_LEAVE \
     983             :         "igmp_v2_leave"
     984             : #define DEVLINK_TRAP_GENERIC_NAME_MLD_QUERY \
     985             :         "mld_query"
     986             : #define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_REPORT \
     987             :         "mld_v1_report"
     988             : #define DEVLINK_TRAP_GENERIC_NAME_MLD_V2_REPORT \
     989             :         "mld_v2_report"
     990             : #define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_DONE \
     991             :         "mld_v1_done"
     992             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_DHCP \
     993             :         "ipv4_dhcp"
     994             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DHCP \
     995             :         "ipv6_dhcp"
     996             : #define DEVLINK_TRAP_GENERIC_NAME_ARP_REQUEST \
     997             :         "arp_request"
     998             : #define DEVLINK_TRAP_GENERIC_NAME_ARP_RESPONSE \
     999             :         "arp_response"
    1000             : #define DEVLINK_TRAP_GENERIC_NAME_ARP_OVERLAY \
    1001             :         "arp_overlay"
    1002             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_SOLICIT \
    1003             :         "ipv6_neigh_solicit"
    1004             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_ADVERT \
    1005             :         "ipv6_neigh_advert"
    1006             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_BFD \
    1007             :         "ipv4_bfd"
    1008             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_BFD \
    1009             :         "ipv6_bfd"
    1010             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_OSPF \
    1011             :         "ipv4_ospf"
    1012             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_OSPF \
    1013             :         "ipv6_ospf"
    1014             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_BGP \
    1015             :         "ipv4_bgp"
    1016             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_BGP \
    1017             :         "ipv6_bgp"
    1018             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_VRRP \
    1019             :         "ipv4_vrrp"
    1020             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_VRRP \
    1021             :         "ipv6_vrrp"
    1022             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_PIM \
    1023             :         "ipv4_pim"
    1024             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_PIM \
    1025             :         "ipv6_pim"
    1026             : #define DEVLINK_TRAP_GENERIC_NAME_UC_LB \
    1027             :         "uc_loopback"
    1028             : #define DEVLINK_TRAP_GENERIC_NAME_LOCAL_ROUTE \
    1029             :         "local_route"
    1030             : #define DEVLINK_TRAP_GENERIC_NAME_EXTERNAL_ROUTE \
    1031             :         "external_route"
    1032             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_UC_DIP_LINK_LOCAL_SCOPE \
    1033             :         "ipv6_uc_dip_link_local_scope"
    1034             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_NODES \
    1035             :         "ipv6_dip_all_nodes"
    1036             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_ROUTERS \
    1037             :         "ipv6_dip_all_routers"
    1038             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_SOLICIT \
    1039             :         "ipv6_router_solicit"
    1040             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ADVERT \
    1041             :         "ipv6_router_advert"
    1042             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_REDIRECT \
    1043             :         "ipv6_redirect"
    1044             : #define DEVLINK_TRAP_GENERIC_NAME_IPV4_ROUTER_ALERT \
    1045             :         "ipv4_router_alert"
    1046             : #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ALERT \
    1047             :         "ipv6_router_alert"
    1048             : #define DEVLINK_TRAP_GENERIC_NAME_PTP_EVENT \
    1049             :         "ptp_event"
    1050             : #define DEVLINK_TRAP_GENERIC_NAME_PTP_GENERAL \
    1051             :         "ptp_general"
    1052             : #define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_SAMPLE \
    1053             :         "flow_action_sample"
    1054             : #define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_TRAP \
    1055             :         "flow_action_trap"
    1056             : #define DEVLINK_TRAP_GENERIC_NAME_EARLY_DROP \
    1057             :         "early_drop"
    1058             : #define DEVLINK_TRAP_GENERIC_NAME_VXLAN_PARSING \
    1059             :         "vxlan_parsing"
    1060             : #define DEVLINK_TRAP_GENERIC_NAME_LLC_SNAP_PARSING \
    1061             :         "llc_snap_parsing"
    1062             : #define DEVLINK_TRAP_GENERIC_NAME_VLAN_PARSING \
    1063             :         "vlan_parsing"
    1064             : #define DEVLINK_TRAP_GENERIC_NAME_PPPOE_PPP_PARSING \
    1065             :         "pppoe_ppp_parsing"
    1066             : #define DEVLINK_TRAP_GENERIC_NAME_MPLS_PARSING \
    1067             :         "mpls_parsing"
    1068             : #define DEVLINK_TRAP_GENERIC_NAME_ARP_PARSING \
    1069             :         "arp_parsing"
    1070             : #define DEVLINK_TRAP_GENERIC_NAME_IP_1_PARSING \
    1071             :         "ip_1_parsing"
    1072             : #define DEVLINK_TRAP_GENERIC_NAME_IP_N_PARSING \
    1073             :         "ip_n_parsing"
    1074             : #define DEVLINK_TRAP_GENERIC_NAME_GRE_PARSING \
    1075             :         "gre_parsing"
    1076             : #define DEVLINK_TRAP_GENERIC_NAME_UDP_PARSING \
    1077             :         "udp_parsing"
    1078             : #define DEVLINK_TRAP_GENERIC_NAME_TCP_PARSING \
    1079             :         "tcp_parsing"
    1080             : #define DEVLINK_TRAP_GENERIC_NAME_IPSEC_PARSING \
    1081             :         "ipsec_parsing"
    1082             : #define DEVLINK_TRAP_GENERIC_NAME_SCTP_PARSING \
    1083             :         "sctp_parsing"
    1084             : #define DEVLINK_TRAP_GENERIC_NAME_DCCP_PARSING \
    1085             :         "dccp_parsing"
    1086             : #define DEVLINK_TRAP_GENERIC_NAME_GTP_PARSING \
    1087             :         "gtp_parsing"
    1088             : #define DEVLINK_TRAP_GENERIC_NAME_ESP_PARSING \
    1089             :         "esp_parsing"
    1090             : #define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_NEXTHOP \
    1091             :         "blackhole_nexthop"
    1092             : #define DEVLINK_TRAP_GENERIC_NAME_DMAC_FILTER \
    1093             :         "dmac_filter"
    1094             : 
    1095             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L2_DROPS \
    1096             :         "l2_drops"
    1097             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_DROPS \
    1098             :         "l3_drops"
    1099             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_EXCEPTIONS \
    1100             :         "l3_exceptions"
    1101             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BUFFER_DROPS \
    1102             :         "buffer_drops"
    1103             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_TUNNEL_DROPS \
    1104             :         "tunnel_drops"
    1105             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_DROPS \
    1106             :         "acl_drops"
    1107             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_STP \
    1108             :         "stp"
    1109             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LACP \
    1110             :         "lacp"
    1111             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LLDP \
    1112             :         "lldp"
    1113             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_MC_SNOOPING  \
    1114             :         "mc_snooping"
    1115             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_DHCP \
    1116             :         "dhcp"
    1117             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_NEIGH_DISCOVERY \
    1118             :         "neigh_discovery"
    1119             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BFD \
    1120             :         "bfd"
    1121             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_OSPF \
    1122             :         "ospf"
    1123             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BGP \
    1124             :         "bgp"
    1125             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_VRRP \
    1126             :         "vrrp"
    1127             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PIM \
    1128             :         "pim"
    1129             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_UC_LB \
    1130             :         "uc_loopback"
    1131             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
    1132             :         "local_delivery"
    1133             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
    1134             :         "external_delivery"
    1135             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
    1136             :         "ipv6"
    1137             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \
    1138             :         "ptp_event"
    1139             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_GENERAL \
    1140             :         "ptp_general"
    1141             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_SAMPLE \
    1142             :         "acl_sample"
    1143             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_TRAP \
    1144             :         "acl_trap"
    1145             : #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PARSER_ERROR_DROPS \
    1146             :         "parser_error_drops"
    1147             : 
    1148             : #define DEVLINK_TRAP_GENERIC(_type, _init_action, _id, _group_id,             \
    1149             :                              _metadata_cap)                                   \
    1150             :         {                                                                     \
    1151             :                 .type = DEVLINK_TRAP_TYPE_##_type,                            \
    1152             :                 .init_action = DEVLINK_TRAP_ACTION_##_init_action,            \
    1153             :                 .generic = true,                                              \
    1154             :                 .id = DEVLINK_TRAP_GENERIC_ID_##_id,                          \
    1155             :                 .name = DEVLINK_TRAP_GENERIC_NAME_##_id,                      \
    1156             :                 .init_group_id = _group_id,                                   \
    1157             :                 .metadata_cap = _metadata_cap,                                \
    1158             :         }
    1159             : 
    1160             : #define DEVLINK_TRAP_DRIVER(_type, _init_action, _id, _name, _group_id,       \
    1161             :                             _metadata_cap)                                    \
    1162             :         {                                                                     \
    1163             :                 .type = DEVLINK_TRAP_TYPE_##_type,                            \
    1164             :                 .init_action = DEVLINK_TRAP_ACTION_##_init_action,            \
    1165             :                 .generic = false,                                             \
    1166             :                 .id = _id,                                                    \
    1167             :                 .name = _name,                                                \
    1168             :                 .init_group_id = _group_id,                                   \
    1169             :                 .metadata_cap = _metadata_cap,                                \
    1170             :         }
    1171             : 
    1172             : #define DEVLINK_TRAP_GROUP_GENERIC(_id, _policer_id)                          \
    1173             :         {                                                                     \
    1174             :                 .name = DEVLINK_TRAP_GROUP_GENERIC_NAME_##_id,                \
    1175             :                 .id = DEVLINK_TRAP_GROUP_GENERIC_ID_##_id,                    \
    1176             :                 .generic = true,                                              \
    1177             :                 .init_policer_id = _policer_id,                               \
    1178             :         }
    1179             : 
    1180             : #define DEVLINK_TRAP_POLICER(_id, _rate, _burst, _max_rate, _min_rate,        \
    1181             :                              _max_burst, _min_burst)                          \
    1182             :         {                                                                     \
    1183             :                 .id = _id,                                                    \
    1184             :                 .init_rate = _rate,                                           \
    1185             :                 .init_burst = _burst,                                         \
    1186             :                 .max_rate = _max_rate,                                        \
    1187             :                 .min_rate = _min_rate,                                        \
    1188             :                 .max_burst = _max_burst,                                      \
    1189             :                 .min_burst = _min_burst,                                      \
    1190             :         }
    1191             : 
    1192             : struct devlink_ops {
    1193             :         /**
    1194             :          * @supported_flash_update_params:
    1195             :          * mask of parameters supported by the driver's .flash_update
    1196             :          * implemementation.
    1197             :          */
    1198             :         u32 supported_flash_update_params;
    1199             :         unsigned long reload_actions;
    1200             :         unsigned long reload_limits;
    1201             :         int (*reload_down)(struct devlink *devlink, bool netns_change,
    1202             :                            enum devlink_reload_action action,
    1203             :                            enum devlink_reload_limit limit,
    1204             :                            struct netlink_ext_ack *extack);
    1205             :         int (*reload_up)(struct devlink *devlink, enum devlink_reload_action action,
    1206             :                          enum devlink_reload_limit limit, u32 *actions_performed,
    1207             :                          struct netlink_ext_ack *extack);
    1208             :         int (*port_type_set)(struct devlink_port *devlink_port,
    1209             :                              enum devlink_port_type port_type);
    1210             :         int (*port_split)(struct devlink *devlink, unsigned int port_index,
    1211             :                           unsigned int count, struct netlink_ext_ack *extack);
    1212             :         int (*port_unsplit)(struct devlink *devlink, unsigned int port_index,
    1213             :                             struct netlink_ext_ack *extack);
    1214             :         int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index,
    1215             :                            u16 pool_index,
    1216             :                            struct devlink_sb_pool_info *pool_info);
    1217             :         int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index,
    1218             :                            u16 pool_index, u32 size,
    1219             :                            enum devlink_sb_threshold_type threshold_type,
    1220             :                            struct netlink_ext_ack *extack);
    1221             :         int (*sb_port_pool_get)(struct devlink_port *devlink_port,
    1222             :                                 unsigned int sb_index, u16 pool_index,
    1223             :                                 u32 *p_threshold);
    1224             :         int (*sb_port_pool_set)(struct devlink_port *devlink_port,
    1225             :                                 unsigned int sb_index, u16 pool_index,
    1226             :                                 u32 threshold, struct netlink_ext_ack *extack);
    1227             :         int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port,
    1228             :                                    unsigned int sb_index,
    1229             :                                    u16 tc_index,
    1230             :                                    enum devlink_sb_pool_type pool_type,
    1231             :                                    u16 *p_pool_index, u32 *p_threshold);
    1232             :         int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port,
    1233             :                                    unsigned int sb_index,
    1234             :                                    u16 tc_index,
    1235             :                                    enum devlink_sb_pool_type pool_type,
    1236             :                                    u16 pool_index, u32 threshold,
    1237             :                                    struct netlink_ext_ack *extack);
    1238             :         int (*sb_occ_snapshot)(struct devlink *devlink,
    1239             :                                unsigned int sb_index);
    1240             :         int (*sb_occ_max_clear)(struct devlink *devlink,
    1241             :                                 unsigned int sb_index);
    1242             :         int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port,
    1243             :                                     unsigned int sb_index, u16 pool_index,
    1244             :                                     u32 *p_cur, u32 *p_max);
    1245             :         int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port,
    1246             :                                        unsigned int sb_index,
    1247             :                                        u16 tc_index,
    1248             :                                        enum devlink_sb_pool_type pool_type,
    1249             :                                        u32 *p_cur, u32 *p_max);
    1250             : 
    1251             :         int (*eswitch_mode_get)(struct devlink *devlink, u16 *p_mode);
    1252             :         int (*eswitch_mode_set)(struct devlink *devlink, u16 mode,
    1253             :                                 struct netlink_ext_ack *extack);
    1254             :         int (*eswitch_inline_mode_get)(struct devlink *devlink, u8 *p_inline_mode);
    1255             :         int (*eswitch_inline_mode_set)(struct devlink *devlink, u8 inline_mode,
    1256             :                                        struct netlink_ext_ack *extack);
    1257             :         int (*eswitch_encap_mode_get)(struct devlink *devlink,
    1258             :                                       enum devlink_eswitch_encap_mode *p_encap_mode);
    1259             :         int (*eswitch_encap_mode_set)(struct devlink *devlink,
    1260             :                                       enum devlink_eswitch_encap_mode encap_mode,
    1261             :                                       struct netlink_ext_ack *extack);
    1262             :         int (*info_get)(struct devlink *devlink, struct devlink_info_req *req,
    1263             :                         struct netlink_ext_ack *extack);
    1264             :         /**
    1265             :          * @flash_update: Device flash update function
    1266             :          *
    1267             :          * Used to perform a flash update for the device. The set of
    1268             :          * parameters supported by the driver should be set in
    1269             :          * supported_flash_update_params.
    1270             :          */
    1271             :         int (*flash_update)(struct devlink *devlink,
    1272             :                             struct devlink_flash_update_params *params,
    1273             :                             struct netlink_ext_ack *extack);
    1274             :         /**
    1275             :          * @trap_init: Trap initialization function.
    1276             :          *
    1277             :          * Should be used by device drivers to initialize the trap in the
    1278             :          * underlying device. Drivers should also store the provided trap
    1279             :          * context, so that they could efficiently pass it to
    1280             :          * devlink_trap_report() when the trap is triggered.
    1281             :          */
    1282             :         int (*trap_init)(struct devlink *devlink,
    1283             :                          const struct devlink_trap *trap, void *trap_ctx);
    1284             :         /**
    1285             :          * @trap_fini: Trap de-initialization function.
    1286             :          *
    1287             :          * Should be used by device drivers to de-initialize the trap in the
    1288             :          * underlying device.
    1289             :          */
    1290             :         void (*trap_fini)(struct devlink *devlink,
    1291             :                           const struct devlink_trap *trap, void *trap_ctx);
    1292             :         /**
    1293             :          * @trap_action_set: Trap action set function.
    1294             :          */
    1295             :         int (*trap_action_set)(struct devlink *devlink,
    1296             :                                const struct devlink_trap *trap,
    1297             :                                enum devlink_trap_action action,
    1298             :                                struct netlink_ext_ack *extack);
    1299             :         /**
    1300             :          * @trap_group_init: Trap group initialization function.
    1301             :          *
    1302             :          * Should be used by device drivers to initialize the trap group in the
    1303             :          * underlying device.
    1304             :          */
    1305             :         int (*trap_group_init)(struct devlink *devlink,
    1306             :                                const struct devlink_trap_group *group);
    1307             :         /**
    1308             :          * @trap_group_set: Trap group parameters set function.
    1309             :          *
    1310             :          * Note: @policer can be NULL when a policer is being unbound from
    1311             :          * @group.
    1312             :          */
    1313             :         int (*trap_group_set)(struct devlink *devlink,
    1314             :                               const struct devlink_trap_group *group,
    1315             :                               const struct devlink_trap_policer *policer,
    1316             :                               struct netlink_ext_ack *extack);
    1317             :         /**
    1318             :          * @trap_group_action_set: Trap group action set function.
    1319             :          *
    1320             :          * If this callback is populated, it will take precedence over looping
    1321             :          * over all traps in a group and calling .trap_action_set().
    1322             :          */
    1323             :         int (*trap_group_action_set)(struct devlink *devlink,
    1324             :                                      const struct devlink_trap_group *group,
    1325             :                                      enum devlink_trap_action action,
    1326             :                                      struct netlink_ext_ack *extack);
    1327             :         /**
    1328             :          * @trap_policer_init: Trap policer initialization function.
    1329             :          *
    1330             :          * Should be used by device drivers to initialize the trap policer in
    1331             :          * the underlying device.
    1332             :          */
    1333             :         int (*trap_policer_init)(struct devlink *devlink,
    1334             :                                  const struct devlink_trap_policer *policer);
    1335             :         /**
    1336             :          * @trap_policer_fini: Trap policer de-initialization function.
    1337             :          *
    1338             :          * Should be used by device drivers to de-initialize the trap policer
    1339             :          * in the underlying device.
    1340             :          */
    1341             :         void (*trap_policer_fini)(struct devlink *devlink,
    1342             :                                   const struct devlink_trap_policer *policer);
    1343             :         /**
    1344             :          * @trap_policer_set: Trap policer parameters set function.
    1345             :          */
    1346             :         int (*trap_policer_set)(struct devlink *devlink,
    1347             :                                 const struct devlink_trap_policer *policer,
    1348             :                                 u64 rate, u64 burst,
    1349             :                                 struct netlink_ext_ack *extack);
    1350             :         /**
    1351             :          * @trap_policer_counter_get: Trap policer counter get function.
    1352             :          *
    1353             :          * Should be used by device drivers to report number of packets dropped
    1354             :          * by the policer.
    1355             :          */
    1356             :         int (*trap_policer_counter_get)(struct devlink *devlink,
    1357             :                                         const struct devlink_trap_policer *policer,
    1358             :                                         u64 *p_drops);
    1359             :         /**
    1360             :          * @port_function_hw_addr_get: Port function's hardware address get function.
    1361             :          *
    1362             :          * Should be used by device drivers to report the hardware address of a function managed
    1363             :          * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port
    1364             :          * function handling for a particular port.
    1365             :          *
    1366             :          * Note: @extack can be NULL when port notifier queries the port function.
    1367             :          */
    1368             :         int (*port_function_hw_addr_get)(struct devlink *devlink, struct devlink_port *port,
    1369             :                                          u8 *hw_addr, int *hw_addr_len,
    1370             :                                          struct netlink_ext_ack *extack);
    1371             :         /**
    1372             :          * @port_function_hw_addr_set: Port function's hardware address set function.
    1373             :          *
    1374             :          * Should be used by device drivers to set the hardware address of a function managed
    1375             :          * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port
    1376             :          * function handling for a particular port.
    1377             :          */
    1378             :         int (*port_function_hw_addr_set)(struct devlink *devlink, struct devlink_port *port,
    1379             :                                          const u8 *hw_addr, int hw_addr_len,
    1380             :                                          struct netlink_ext_ack *extack);
    1381             :         /**
    1382             :          * port_new() - Add a new port function of a specified flavor
    1383             :          * @devlink: Devlink instance
    1384             :          * @attrs: attributes of the new port
    1385             :          * @extack: extack for reporting error messages
    1386             :          * @new_port_index: index of the new port
    1387             :          *
    1388             :          * Devlink core will call this device driver function upon user request
    1389             :          * to create a new port function of a specified flavor and optional
    1390             :          * attributes
    1391             :          *
    1392             :          * Notes:
    1393             :          *      - Called without devlink instance lock being held. Drivers must
    1394             :          *        implement own means of synchronization
    1395             :          *      - On success, drivers must register a port with devlink core
    1396             :          *
    1397             :          * Return: 0 on success, negative value otherwise.
    1398             :          */
    1399             :         int (*port_new)(struct devlink *devlink,
    1400             :                         const struct devlink_port_new_attrs *attrs,
    1401             :                         struct netlink_ext_ack *extack,
    1402             :                         unsigned int *new_port_index);
    1403             :         /**
    1404             :          * port_del() - Delete a port function
    1405             :          * @devlink: Devlink instance
    1406             :          * @port_index: port function index to delete
    1407             :          * @extack: extack for reporting error messages
    1408             :          *
    1409             :          * Devlink core will call this device driver function upon user request
    1410             :          * to delete a previously created port function
    1411             :          *
    1412             :          * Notes:
    1413             :          *      - Called without devlink instance lock being held. Drivers must
    1414             :          *        implement own means of synchronization
    1415             :          *      - On success, drivers must unregister the corresponding devlink
    1416             :          *        port
    1417             :          *
    1418             :          * Return: 0 on success, negative value otherwise.
    1419             :          */
    1420             :         int (*port_del)(struct devlink *devlink, unsigned int port_index,
    1421             :                         struct netlink_ext_ack *extack);
    1422             :         /**
    1423             :          * port_fn_state_get() - Get the state of a port function
    1424             :          * @devlink: Devlink instance
    1425             :          * @port: The devlink port
    1426             :          * @state: Admin configured state
    1427             :          * @opstate: Current operational state
    1428             :          * @extack: extack for reporting error messages
    1429             :          *
    1430             :          * Reports the admin and operational state of a devlink port function
    1431             :          *
    1432             :          * Return: 0 on success, negative value otherwise.
    1433             :          */
    1434             :         int (*port_fn_state_get)(struct devlink *devlink,
    1435             :                                  struct devlink_port *port,
    1436             :                                  enum devlink_port_fn_state *state,
    1437             :                                  enum devlink_port_fn_opstate *opstate,
    1438             :                                  struct netlink_ext_ack *extack);
    1439             :         /**
    1440             :          * port_fn_state_set() - Set the admin state of a port function
    1441             :          * @devlink: Devlink instance
    1442             :          * @port: The devlink port
    1443             :          * @state: Admin state
    1444             :          * @extack: extack for reporting error messages
    1445             :          *
    1446             :          * Set the admin state of a devlink port function
    1447             :          *
    1448             :          * Return: 0 on success, negative value otherwise.
    1449             :          */
    1450             :         int (*port_fn_state_set)(struct devlink *devlink,
    1451             :                                  struct devlink_port *port,
    1452             :                                  enum devlink_port_fn_state state,
    1453             :                                  struct netlink_ext_ack *extack);
    1454             : };
    1455             : 
    1456             : static inline void *devlink_priv(struct devlink *devlink)
    1457             : {
    1458             :         BUG_ON(!devlink);
    1459             :         return &devlink->priv;
    1460             : }
    1461             : 
    1462             : static inline struct devlink *priv_to_devlink(void *priv)
    1463             : {
    1464             :         BUG_ON(!priv);
    1465             :         return container_of(priv, struct devlink, priv);
    1466             : }
    1467             : 
    1468             : static inline struct devlink_port *
    1469             : netdev_to_devlink_port(struct net_device *dev)
    1470             : {
    1471             :         if (dev->netdev_ops->ndo_get_devlink_port)
    1472             :                 return dev->netdev_ops->ndo_get_devlink_port(dev);
    1473             :         return NULL;
    1474             : }
    1475             : 
    1476             : static inline struct devlink *netdev_to_devlink(struct net_device *dev)
    1477             : {
    1478             :         struct devlink_port *devlink_port = netdev_to_devlink_port(dev);
    1479             : 
    1480             :         if (devlink_port)
    1481             :                 return devlink_port->devlink;
    1482             :         return NULL;
    1483             : }
    1484             : 
    1485             : struct ib_device;
    1486             : 
    1487             : struct net *devlink_net(const struct devlink *devlink);
    1488             : void devlink_net_set(struct devlink *devlink, struct net *net);
    1489             : struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
    1490             : int devlink_register(struct devlink *devlink, struct device *dev);
    1491             : void devlink_unregister(struct devlink *devlink);
    1492             : void devlink_reload_enable(struct devlink *devlink);
    1493             : void devlink_reload_disable(struct devlink *devlink);
    1494             : void devlink_free(struct devlink *devlink);
    1495             : int devlink_port_register(struct devlink *devlink,
    1496             :                           struct devlink_port *devlink_port,
    1497             :                           unsigned int port_index);
    1498             : void devlink_port_unregister(struct devlink_port *devlink_port);
    1499             : void devlink_port_type_eth_set(struct devlink_port *devlink_port,
    1500             :                                struct net_device *netdev);
    1501             : void devlink_port_type_ib_set(struct devlink_port *devlink_port,
    1502             :                               struct ib_device *ibdev);
    1503             : void devlink_port_type_clear(struct devlink_port *devlink_port);
    1504             : void devlink_port_attrs_set(struct devlink_port *devlink_port,
    1505             :                             struct devlink_port_attrs *devlink_port_attrs);
    1506             : void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
    1507             :                                    u16 pf, bool external);
    1508             : void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
    1509             :                                    u16 pf, u16 vf, bool external);
    1510             : void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
    1511             :                                    u32 controller, u16 pf, u32 sf);
    1512             : int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
    1513             :                         u32 size, u16 ingress_pools_count,
    1514             :                         u16 egress_pools_count, u16 ingress_tc_count,
    1515             :                         u16 egress_tc_count);
    1516             : void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index);
    1517             : int devlink_dpipe_table_register(struct devlink *devlink,
    1518             :                                  const char *table_name,
    1519             :                                  struct devlink_dpipe_table_ops *table_ops,
    1520             :                                  void *priv, bool counter_control_extern);
    1521             : void devlink_dpipe_table_unregister(struct devlink *devlink,
    1522             :                                     const char *table_name);
    1523             : int devlink_dpipe_headers_register(struct devlink *devlink,
    1524             :                                    struct devlink_dpipe_headers *dpipe_headers);
    1525             : void devlink_dpipe_headers_unregister(struct devlink *devlink);
    1526             : bool devlink_dpipe_table_counter_enabled(struct devlink *devlink,
    1527             :                                          const char *table_name);
    1528             : int devlink_dpipe_entry_ctx_prepare(struct devlink_dpipe_dump_ctx *dump_ctx);
    1529             : int devlink_dpipe_entry_ctx_append(struct devlink_dpipe_dump_ctx *dump_ctx,
    1530             :                                    struct devlink_dpipe_entry *entry);
    1531             : int devlink_dpipe_entry_ctx_close(struct devlink_dpipe_dump_ctx *dump_ctx);
    1532             : void devlink_dpipe_entry_clear(struct devlink_dpipe_entry *entry);
    1533             : int devlink_dpipe_action_put(struct sk_buff *skb,
    1534             :                              struct devlink_dpipe_action *action);
    1535             : int devlink_dpipe_match_put(struct sk_buff *skb,
    1536             :                             struct devlink_dpipe_match *match);
    1537             : extern struct devlink_dpipe_header devlink_dpipe_header_ethernet;
    1538             : extern struct devlink_dpipe_header devlink_dpipe_header_ipv4;
    1539             : extern struct devlink_dpipe_header devlink_dpipe_header_ipv6;
    1540             : 
    1541             : int devlink_resource_register(struct devlink *devlink,
    1542             :                               const char *resource_name,
    1543             :                               u64 resource_size,
    1544             :                               u64 resource_id,
    1545             :                               u64 parent_resource_id,
    1546             :                               const struct devlink_resource_size_params *size_params);
    1547             : void devlink_resources_unregister(struct devlink *devlink,
    1548             :                                   struct devlink_resource *resource);
    1549             : int devlink_resource_size_get(struct devlink *devlink,
    1550             :                               u64 resource_id,
    1551             :                               u64 *p_resource_size);
    1552             : int devlink_dpipe_table_resource_set(struct devlink *devlink,
    1553             :                                      const char *table_name, u64 resource_id,
    1554             :                                      u64 resource_units);
    1555             : void devlink_resource_occ_get_register(struct devlink *devlink,
    1556             :                                        u64 resource_id,
    1557             :                                        devlink_resource_occ_get_t *occ_get,
    1558             :                                        void *occ_get_priv);
    1559             : void devlink_resource_occ_get_unregister(struct devlink *devlink,
    1560             :                                          u64 resource_id);
    1561             : int devlink_params_register(struct devlink *devlink,
    1562             :                             const struct devlink_param *params,
    1563             :                             size_t params_count);
    1564             : void devlink_params_unregister(struct devlink *devlink,
    1565             :                                const struct devlink_param *params,
    1566             :                                size_t params_count);
    1567             : void devlink_params_publish(struct devlink *devlink);
    1568             : void devlink_params_unpublish(struct devlink *devlink);
    1569             : int devlink_port_params_register(struct devlink_port *devlink_port,
    1570             :                                  const struct devlink_param *params,
    1571             :                                  size_t params_count);
    1572             : void devlink_port_params_unregister(struct devlink_port *devlink_port,
    1573             :                                     const struct devlink_param *params,
    1574             :                                     size_t params_count);
    1575             : int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
    1576             :                                        union devlink_param_value *init_val);
    1577             : int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
    1578             :                                        union devlink_param_value init_val);
    1579             : int
    1580             : devlink_port_param_driverinit_value_get(struct devlink_port *devlink_port,
    1581             :                                         u32 param_id,
    1582             :                                         union devlink_param_value *init_val);
    1583             : int devlink_port_param_driverinit_value_set(struct devlink_port *devlink_port,
    1584             :                                             u32 param_id,
    1585             :                                             union devlink_param_value init_val);
    1586             : void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
    1587             : void devlink_port_param_value_changed(struct devlink_port *devlink_port,
    1588             :                                       u32 param_id);
    1589             : void devlink_param_value_str_fill(union devlink_param_value *dst_val,
    1590             :                                   const char *src);
    1591             : struct devlink_region *
    1592             : devlink_region_create(struct devlink *devlink,
    1593             :                       const struct devlink_region_ops *ops,
    1594             :                       u32 region_max_snapshots, u64 region_size);
    1595             : struct devlink_region *
    1596             : devlink_port_region_create(struct devlink_port *port,
    1597             :                            const struct devlink_port_region_ops *ops,
    1598             :                            u32 region_max_snapshots, u64 region_size);
    1599             : void devlink_region_destroy(struct devlink_region *region);
    1600             : void devlink_port_region_destroy(struct devlink_region *region);
    1601             : 
    1602             : int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id);
    1603             : void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id);
    1604             : int devlink_region_snapshot_create(struct devlink_region *region,
    1605             :                                    u8 *data, u32 snapshot_id);
    1606             : int devlink_info_serial_number_put(struct devlink_info_req *req,
    1607             :                                    const char *sn);
    1608             : int devlink_info_driver_name_put(struct devlink_info_req *req,
    1609             :                                  const char *name);
    1610             : int devlink_info_board_serial_number_put(struct devlink_info_req *req,
    1611             :                                          const char *bsn);
    1612             : int devlink_info_version_fixed_put(struct devlink_info_req *req,
    1613             :                                    const char *version_name,
    1614             :                                    const char *version_value);
    1615             : int devlink_info_version_stored_put(struct devlink_info_req *req,
    1616             :                                     const char *version_name,
    1617             :                                     const char *version_value);
    1618             : int devlink_info_version_running_put(struct devlink_info_req *req,
    1619             :                                      const char *version_name,
    1620             :                                      const char *version_value);
    1621             : 
    1622             : int devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg);
    1623             : int devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg);
    1624             : 
    1625             : int devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name);
    1626             : int devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg);
    1627             : 
    1628             : int devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
    1629             :                                      const char *name);
    1630             : int devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg);
    1631             : int devlink_fmsg_binary_pair_nest_start(struct devlink_fmsg *fmsg,
    1632             :                                         const char *name);
    1633             : int devlink_fmsg_binary_pair_nest_end(struct devlink_fmsg *fmsg);
    1634             : 
    1635             : int devlink_fmsg_bool_put(struct devlink_fmsg *fmsg, bool value);
    1636             : int devlink_fmsg_u8_put(struct devlink_fmsg *fmsg, u8 value);
    1637             : int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value);
    1638             : int devlink_fmsg_u64_put(struct devlink_fmsg *fmsg, u64 value);
    1639             : int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value);
    1640             : int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
    1641             :                             u16 value_len);
    1642             : 
    1643             : int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1644             :                                bool value);
    1645             : int devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1646             :                              u8 value);
    1647             : int devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1648             :                               u32 value);
    1649             : int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1650             :                               u64 value);
    1651             : int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1652             :                                  const char *value);
    1653             : int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
    1654             :                                  const void *value, u32 value_len);
    1655             : 
    1656             : struct devlink_health_reporter *
    1657             : devlink_health_reporter_create(struct devlink *devlink,
    1658             :                                const struct devlink_health_reporter_ops *ops,
    1659             :                                u64 graceful_period, void *priv);
    1660             : 
    1661             : struct devlink_health_reporter *
    1662             : devlink_port_health_reporter_create(struct devlink_port *port,
    1663             :                                     const struct devlink_health_reporter_ops *ops,
    1664             :                                     u64 graceful_period, void *priv);
    1665             : 
    1666             : void
    1667             : devlink_health_reporter_destroy(struct devlink_health_reporter *reporter);
    1668             : 
    1669             : void
    1670             : devlink_port_health_reporter_destroy(struct devlink_health_reporter *reporter);
    1671             : 
    1672             : void *
    1673             : devlink_health_reporter_priv(struct devlink_health_reporter *reporter);
    1674             : int devlink_health_report(struct devlink_health_reporter *reporter,
    1675             :                           const char *msg, void *priv_ctx);
    1676             : void
    1677             : devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
    1678             :                                      enum devlink_health_reporter_state state);
    1679             : void
    1680             : devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter);
    1681             : 
    1682             : bool devlink_is_reload_failed(const struct devlink *devlink);
    1683             : void devlink_remote_reload_actions_performed(struct devlink *devlink,
    1684             :                                              enum devlink_reload_limit limit,
    1685             :                                              u32 actions_performed);
    1686             : 
    1687             : void devlink_flash_update_status_notify(struct devlink *devlink,
    1688             :                                         const char *status_msg,
    1689             :                                         const char *component,
    1690             :                                         unsigned long done,
    1691             :                                         unsigned long total);
    1692             : void devlink_flash_update_timeout_notify(struct devlink *devlink,
    1693             :                                          const char *status_msg,
    1694             :                                          const char *component,
    1695             :                                          unsigned long timeout);
    1696             : 
    1697             : int devlink_traps_register(struct devlink *devlink,
    1698             :                            const struct devlink_trap *traps,
    1699             :                            size_t traps_count, void *priv);
    1700             : void devlink_traps_unregister(struct devlink *devlink,
    1701             :                               const struct devlink_trap *traps,
    1702             :                               size_t traps_count);
    1703             : void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
    1704             :                          void *trap_ctx, struct devlink_port *in_devlink_port,
    1705             :                          const struct flow_action_cookie *fa_cookie);
    1706             : void *devlink_trap_ctx_priv(void *trap_ctx);
    1707             : int devlink_trap_groups_register(struct devlink *devlink,
    1708             :                                  const struct devlink_trap_group *groups,
    1709             :                                  size_t groups_count);
    1710             : void devlink_trap_groups_unregister(struct devlink *devlink,
    1711             :                                     const struct devlink_trap_group *groups,
    1712             :                                     size_t groups_count);
    1713             : int
    1714             : devlink_trap_policers_register(struct devlink *devlink,
    1715             :                                const struct devlink_trap_policer *policers,
    1716             :                                size_t policers_count);
    1717             : void
    1718             : devlink_trap_policers_unregister(struct devlink *devlink,
    1719             :                                  const struct devlink_trap_policer *policers,
    1720             :                                  size_t policers_count);
    1721             : 
    1722             : #if IS_ENABLED(CONFIG_NET_DEVLINK)
    1723             : 
    1724             : void devlink_compat_running_version(struct net_device *dev,
    1725             :                                     char *buf, size_t len);
    1726             : int devlink_compat_flash_update(struct net_device *dev, const char *file_name);
    1727             : int devlink_compat_phys_port_name_get(struct net_device *dev,
    1728             :                                       char *name, size_t len);
    1729             : int devlink_compat_switch_id_get(struct net_device *dev,
    1730             :                                  struct netdev_phys_item_id *ppid);
    1731             : 
    1732             : #else
    1733             : 
    1734             : static inline void
    1735             : devlink_compat_running_version(struct net_device *dev, char *buf, size_t len)
    1736             : {
    1737             : }
    1738             : 
    1739             : static inline int
    1740             : devlink_compat_flash_update(struct net_device *dev, const char *file_name)
    1741             : {
    1742             :         return -EOPNOTSUPP;
    1743             : }
    1744             : 
    1745             : static inline int
    1746             : devlink_compat_phys_port_name_get(struct net_device *dev,
    1747             :                                   char *name, size_t len)
    1748             : {
    1749             :         return -EOPNOTSUPP;
    1750             : }
    1751             : 
    1752             : static inline int
    1753          16 : devlink_compat_switch_id_get(struct net_device *dev,
    1754             :                              struct netdev_phys_item_id *ppid)
    1755             : {
    1756          16 :         return -EOPNOTSUPP;
    1757             : }
    1758             : 
    1759             : #endif
    1760             : 
    1761             : #endif /* _NET_DEVLINK_H_ */

Generated by: LCOV version 1.14