12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2bfcd3a46SJiri Pirko /* 3bfcd3a46SJiri Pirko * include/net/devlink.h - Network physical device Netlink interface 4bfcd3a46SJiri Pirko * Copyright (c) 2016 Mellanox Technologies. All rights reserved. 5bfcd3a46SJiri Pirko * Copyright (c) 2016 Jiri Pirko <[email protected]> 6bfcd3a46SJiri Pirko */ 7bfcd3a46SJiri Pirko #ifndef _NET_DEVLINK_H_ 8bfcd3a46SJiri Pirko #define _NET_DEVLINK_H_ 9bfcd3a46SJiri Pirko 10bfcd3a46SJiri Pirko #include <linux/device.h> 11bfcd3a46SJiri Pirko #include <linux/slab.h> 12bfcd3a46SJiri Pirko #include <linux/gfp.h> 13bfcd3a46SJiri Pirko #include <linux/list.h> 14bfcd3a46SJiri Pirko #include <linux/netdevice.h> 15b8f97554SJiri Pirko #include <linux/spinlock.h> 16136bf27fSJiri Pirko #include <linux/workqueue.h> 170f420b6cSIdo Schimmel #include <linux/refcount.h> 18bfcd3a46SJiri Pirko #include <net/net_namespace.h> 195a2e106cSJiri Pirko #include <net/flow_offload.h> 20bfcd3a46SJiri Pirko #include <uapi/linux/devlink.h> 2112102436SJacob Keller #include <linux/xarray.h> 22b44cfd4fSJacob Keller #include <linux/firmware.h> 23bfcd3a46SJiri Pirko 2421314638SLeon Romanovsky struct devlink; 25c246f9b5SJiri Pirko struct devlink_linecard; 26bfcd3a46SJiri Pirko 27378ef01bSParav Pandit struct devlink_port_phys_attrs { 28378ef01bSParav Pandit u32 port_number; /* Same value as "split group". 29378ef01bSParav Pandit * A physical port which is visible to the user 30378ef01bSParav Pandit * for a given port flavour. 31378ef01bSParav Pandit */ 3271ad8d55SDanielle Ratson u32 split_subport_number; /* If the port is split, this is the number of subport. */ 33378ef01bSParav Pandit }; 34378ef01bSParav Pandit 35ff03e63aSParav Pandit /** 36ff03e63aSParav Pandit * struct devlink_port_pci_pf_attrs - devlink port's PCI PF attributes 373a2d9588SParav Pandit * @controller: Associated controller number 38ff03e63aSParav Pandit * @pf: Associated PCI PF number for this port. 3905b595e9SParav Pandit * @external: when set, indicates if a port is for an external controller 40ff03e63aSParav Pandit */ 4198fd2d65SParav Pandit struct devlink_port_pci_pf_attrs { 423a2d9588SParav Pandit u32 controller; 43ff03e63aSParav Pandit u16 pf; 4405b595e9SParav Pandit u8 external:1; 4598fd2d65SParav Pandit }; 4698fd2d65SParav Pandit 47ff03e63aSParav Pandit /** 48ff03e63aSParav Pandit * struct devlink_port_pci_vf_attrs - devlink port's PCI VF attributes 493a2d9588SParav Pandit * @controller: Associated controller number 50ff03e63aSParav Pandit * @pf: Associated PCI PF number for this port. 51ff03e63aSParav Pandit * @vf: Associated PCI VF for of the PCI PF for this port. 5205b595e9SParav Pandit * @external: when set, indicates if a port is for an external controller 53ff03e63aSParav Pandit */ 54e41b6bf3SParav Pandit struct devlink_port_pci_vf_attrs { 553a2d9588SParav Pandit u32 controller; 56ff03e63aSParav Pandit u16 pf; 57ff03e63aSParav Pandit u16 vf; 5805b595e9SParav Pandit u8 external:1; 59e41b6bf3SParav Pandit }; 60e41b6bf3SParav Pandit 6171ad8d55SDanielle Ratson /** 62b8288837SParav Pandit * struct devlink_port_pci_sf_attrs - devlink port's PCI SF attributes 63b8288837SParav Pandit * @controller: Associated controller number 64b8288837SParav Pandit * @sf: Associated PCI SF for of the PCI PF for this port. 65b8288837SParav Pandit * @pf: Associated PCI PF number for this port. 66a1ab3e45SParav Pandit * @external: when set, indicates if a port is for an external controller 67b8288837SParav Pandit */ 68b8288837SParav Pandit struct devlink_port_pci_sf_attrs { 69b8288837SParav Pandit u32 controller; 70b8288837SParav Pandit u32 sf; 71b8288837SParav Pandit u16 pf; 72a1ab3e45SParav Pandit u8 external:1; 73b8288837SParav Pandit }; 74b8288837SParav Pandit 75b8288837SParav Pandit /** 7671ad8d55SDanielle Ratson * struct devlink_port_attrs - devlink port object 7771ad8d55SDanielle Ratson * @flavour: flavour of the port 7871ad8d55SDanielle Ratson * @split: indicates if this is split port 79a0f49b54SDanielle Ratson * @splittable: indicates if the port can be split. 80a21cf0a8SDanielle Ratson * @lanes: maximum number of lanes the port supports. 0 value is not passed to netlink. 8171ad8d55SDanielle Ratson * @switch_id: if the port is part of switch, this is buffer with ID, otherwise this is NULL 822efbe6aeSParav Pandit * @phys: physical port attributes 832efbe6aeSParav Pandit * @pci_pf: PCI PF port attributes 842efbe6aeSParav Pandit * @pci_vf: PCI VF port attributes 85b8288837SParav Pandit * @pci_sf: PCI SF port attributes 8671ad8d55SDanielle Ratson */ 87b9ffcbafSJiri Pirko struct devlink_port_attrs { 88a0f49b54SDanielle Ratson u8 split:1, 89a0f49b54SDanielle Ratson splittable:1; 90a21cf0a8SDanielle Ratson u32 lanes; 915ec1380aSJiri Pirko enum devlink_port_flavour flavour; 92bec5267cSJiri Pirko struct netdev_phys_item_id switch_id; 93378ef01bSParav Pandit union { 94378ef01bSParav Pandit struct devlink_port_phys_attrs phys; 9598fd2d65SParav Pandit struct devlink_port_pci_pf_attrs pci_pf; 96e41b6bf3SParav Pandit struct devlink_port_pci_vf_attrs pci_vf; 97b8288837SParav Pandit struct devlink_port_pci_sf_attrs pci_sf; 98378ef01bSParav Pandit }; 99b9ffcbafSJiri Pirko }; 100b9ffcbafSJiri Pirko 1014677efc4SDmytro Linkin struct devlink_rate { 1024677efc4SDmytro Linkin struct list_head list; 1034677efc4SDmytro Linkin enum devlink_rate_type type; 1044677efc4SDmytro Linkin struct devlink *devlink; 1054677efc4SDmytro Linkin void *priv; 1061897db2eSDmytro Linkin u64 tx_share; 1071897db2eSDmytro Linkin u64 tx_max; 1084677efc4SDmytro Linkin 109d7555984SDmytro Linkin struct devlink_rate *parent; 110a8ecb93eSDmytro Linkin union { 1114677efc4SDmytro Linkin struct devlink_port *devlink_port; 112d7555984SDmytro Linkin struct { 113a8ecb93eSDmytro Linkin char *name; 114d7555984SDmytro Linkin refcount_t refcnt; 115d7555984SDmytro Linkin }; 116a8ecb93eSDmytro Linkin }; 117cd502236SMichal Wilczynski 118cd502236SMichal Wilczynski u32 tx_priority; 1196e2d7e84SMichal Wilczynski u32 tx_weight; 1204677efc4SDmytro Linkin }; 1214677efc4SDmytro Linkin 122bfcd3a46SJiri Pirko struct devlink_port { 123bfcd3a46SJiri Pirko struct list_head list; 124544e7c33SAndrew Lunn struct list_head region_list; 125bfcd3a46SJiri Pirko struct devlink *devlink; 126c7282b50SParav Pandit unsigned int index; 1273830c571SJiri Pirko spinlock_t type_lock; /* Protects type and type_eth/ib 1283830c571SJiri Pirko * structures consistency. 129b8f97554SJiri Pirko */ 130bfcd3a46SJiri Pirko enum devlink_port_type type; 131bfcd3a46SJiri Pirko enum devlink_port_type desired_type; 1323830c571SJiri Pirko union { 1333830c571SJiri Pirko struct { 1343830c571SJiri Pirko struct net_device *netdev; 13531265c1eSJiri Pirko int ifindex; 13631265c1eSJiri Pirko char ifname[IFNAMSIZ]; 1373830c571SJiri Pirko } type_eth; 1383830c571SJiri Pirko struct { 1393830c571SJiri Pirko struct ib_device *ibdev; 1403830c571SJiri Pirko } type_ib; 1413830c571SJiri Pirko }; 142b9ffcbafSJiri Pirko struct devlink_port_attrs attrs; 14346737a19SDanielle Ratson u8 attrs_set:1, 144081adcfeSJiri Pirko switch_port:1, 145ae3bbc04SJiri Pirko registered:1, 146ae3bbc04SJiri Pirko initialized:1; 147136bf27fSJiri Pirko struct delayed_work type_warn_dw; 148f4f54166SVladyslav Tarasiuk struct list_head reporter_list; 149f4f54166SVladyslav Tarasiuk struct mutex reporters_lock; /* Protects reporter_list */ 1504677efc4SDmytro Linkin 1514677efc4SDmytro Linkin struct devlink_rate *devlink_rate; 152b8375859SJiri Pirko struct devlink_linecard *linecard; 153bfcd3a46SJiri Pirko }; 154bfcd3a46SJiri Pirko 155cd76dcd6SParav Pandit struct devlink_port_new_attrs { 156cd76dcd6SParav Pandit enum devlink_port_flavour flavour; 157cd76dcd6SParav Pandit unsigned int port_index; 158cd76dcd6SParav Pandit u32 controller; 159cd76dcd6SParav Pandit u32 sfnum; 160cd76dcd6SParav Pandit u16 pfnum; 161cd76dcd6SParav Pandit u8 port_index_valid:1, 162cd76dcd6SParav Pandit controller_valid:1, 163cd76dcd6SParav Pandit sfnum_valid:1; 164cd76dcd6SParav Pandit }; 165cd76dcd6SParav Pandit 166fcdc8ce2SJiri Pirko /** 167fcdc8ce2SJiri Pirko * struct devlink_linecard_ops - Linecard operations 168fcdc8ce2SJiri Pirko * @provision: callback to provision the linecard slot with certain 169fcdc8ce2SJiri Pirko * type of linecard. As a result of this operation, 170fcdc8ce2SJiri Pirko * driver is expected to eventually (could be after 171fcdc8ce2SJiri Pirko * the function call returns) call one of: 172fcdc8ce2SJiri Pirko * devlink_linecard_provision_set() 173fcdc8ce2SJiri Pirko * devlink_linecard_provision_fail() 174fcdc8ce2SJiri Pirko * @unprovision: callback to unprovision the linecard slot. As a result 175fcdc8ce2SJiri Pirko * of this operation, driver is expected to eventually 176fcdc8ce2SJiri Pirko * (could be after the function call returns) call 177fcdc8ce2SJiri Pirko * devlink_linecard_provision_clear() 178fcdc8ce2SJiri Pirko * devlink_linecard_provision_fail() 179fcdc8ce2SJiri Pirko * @same_provision: callback to ask the driver if linecard is already 180fcdc8ce2SJiri Pirko * provisioned in the same way user asks this linecard to be 181fcdc8ce2SJiri Pirko * provisioned. 182fcdc8ce2SJiri Pirko * @types_count: callback to get number of supported types 183fcdc8ce2SJiri Pirko * @types_get: callback to get next type in list 184fcdc8ce2SJiri Pirko */ 185fcdc8ce2SJiri Pirko struct devlink_linecard_ops { 186fcdc8ce2SJiri Pirko int (*provision)(struct devlink_linecard *linecard, void *priv, 187fcdc8ce2SJiri Pirko const char *type, const void *type_priv, 188fcdc8ce2SJiri Pirko struct netlink_ext_ack *extack); 189fcdc8ce2SJiri Pirko int (*unprovision)(struct devlink_linecard *linecard, void *priv, 190fcdc8ce2SJiri Pirko struct netlink_ext_ack *extack); 191fcdc8ce2SJiri Pirko bool (*same_provision)(struct devlink_linecard *linecard, void *priv, 192fcdc8ce2SJiri Pirko const char *type, const void *type_priv); 193fcdc8ce2SJiri Pirko unsigned int (*types_count)(struct devlink_linecard *linecard, 194fcdc8ce2SJiri Pirko void *priv); 195fcdc8ce2SJiri Pirko void (*types_get)(struct devlink_linecard *linecard, 196fcdc8ce2SJiri Pirko void *priv, unsigned int index, const char **type, 197fcdc8ce2SJiri Pirko const void **type_priv); 198fcdc8ce2SJiri Pirko }; 199fcdc8ce2SJiri Pirko 200bf797471SJiri Pirko struct devlink_sb_pool_info { 201bf797471SJiri Pirko enum devlink_sb_pool_type pool_type; 202bf797471SJiri Pirko u32 size; 203bf797471SJiri Pirko enum devlink_sb_threshold_type threshold_type; 204bff5731dSJakub Kicinski u32 cell_size; 205bf797471SJiri Pirko }; 206bf797471SJiri Pirko 2071555d204SArkadi Sharshevsky /** 2081555d204SArkadi Sharshevsky * struct devlink_dpipe_field - dpipe field object 2091555d204SArkadi Sharshevsky * @name: field name 2101555d204SArkadi Sharshevsky * @id: index inside the headers field array 2111555d204SArkadi Sharshevsky * @bitwidth: bitwidth 2121555d204SArkadi Sharshevsky * @mapping_type: mapping type 2131555d204SArkadi Sharshevsky */ 2141555d204SArkadi Sharshevsky struct devlink_dpipe_field { 2151555d204SArkadi Sharshevsky const char *name; 2161555d204SArkadi Sharshevsky unsigned int id; 2171555d204SArkadi Sharshevsky unsigned int bitwidth; 2181555d204SArkadi Sharshevsky enum devlink_dpipe_field_mapping_type mapping_type; 2191555d204SArkadi Sharshevsky }; 2201555d204SArkadi Sharshevsky 2211555d204SArkadi Sharshevsky /** 2221555d204SArkadi Sharshevsky * struct devlink_dpipe_header - dpipe header object 2231555d204SArkadi Sharshevsky * @name: header name 2241555d204SArkadi Sharshevsky * @id: index, global/local detrmined by global bit 2251555d204SArkadi Sharshevsky * @fields: fields 2261555d204SArkadi Sharshevsky * @fields_count: number of fields 2271555d204SArkadi Sharshevsky * @global: indicates if header is shared like most protocol header 2281555d204SArkadi Sharshevsky * or driver specific 2291555d204SArkadi Sharshevsky */ 2301555d204SArkadi Sharshevsky struct devlink_dpipe_header { 2311555d204SArkadi Sharshevsky const char *name; 2321555d204SArkadi Sharshevsky unsigned int id; 2331555d204SArkadi Sharshevsky struct devlink_dpipe_field *fields; 2341555d204SArkadi Sharshevsky unsigned int fields_count; 2351555d204SArkadi Sharshevsky bool global; 2361555d204SArkadi Sharshevsky }; 2371555d204SArkadi Sharshevsky 2381555d204SArkadi Sharshevsky /** 2391555d204SArkadi Sharshevsky * struct devlink_dpipe_match - represents match operation 2401555d204SArkadi Sharshevsky * @type: type of match 2411555d204SArkadi Sharshevsky * @header_index: header index (packets can have several headers of same 2421555d204SArkadi Sharshevsky * type like in case of tunnels) 2431555d204SArkadi Sharshevsky * @header: header 2441555d204SArkadi Sharshevsky * @fieled_id: field index 2451555d204SArkadi Sharshevsky */ 2461555d204SArkadi Sharshevsky struct devlink_dpipe_match { 2471555d204SArkadi Sharshevsky enum devlink_dpipe_match_type type; 2481555d204SArkadi Sharshevsky unsigned int header_index; 2491555d204SArkadi Sharshevsky struct devlink_dpipe_header *header; 2501555d204SArkadi Sharshevsky unsigned int field_id; 2511555d204SArkadi Sharshevsky }; 2521555d204SArkadi Sharshevsky 2531555d204SArkadi Sharshevsky /** 2541555d204SArkadi Sharshevsky * struct devlink_dpipe_action - represents action operation 2551555d204SArkadi Sharshevsky * @type: type of action 2561555d204SArkadi Sharshevsky * @header_index: header index (packets can have several headers of same 2571555d204SArkadi Sharshevsky * type like in case of tunnels) 2581555d204SArkadi Sharshevsky * @header: header 2591555d204SArkadi Sharshevsky * @fieled_id: field index 2601555d204SArkadi Sharshevsky */ 2611555d204SArkadi Sharshevsky struct devlink_dpipe_action { 2621555d204SArkadi Sharshevsky enum devlink_dpipe_action_type type; 2631555d204SArkadi Sharshevsky unsigned int header_index; 2641555d204SArkadi Sharshevsky struct devlink_dpipe_header *header; 2651555d204SArkadi Sharshevsky unsigned int field_id; 2661555d204SArkadi Sharshevsky }; 2671555d204SArkadi Sharshevsky 2681555d204SArkadi Sharshevsky /** 2691555d204SArkadi Sharshevsky * struct devlink_dpipe_value - represents value of match/action 2701555d204SArkadi Sharshevsky * @action: action 2711555d204SArkadi Sharshevsky * @match: match 2721555d204SArkadi Sharshevsky * @mapping_value: in case the field has some mapping this value 2731555d204SArkadi Sharshevsky * specified the mapping value 2741555d204SArkadi Sharshevsky * @mapping_valid: specify if mapping value is valid 2751555d204SArkadi Sharshevsky * @value_size: value size 2761555d204SArkadi Sharshevsky * @value: value 2771555d204SArkadi Sharshevsky * @mask: bit mask 2781555d204SArkadi Sharshevsky */ 2791555d204SArkadi Sharshevsky struct devlink_dpipe_value { 2801555d204SArkadi Sharshevsky union { 2811555d204SArkadi Sharshevsky struct devlink_dpipe_action *action; 2821555d204SArkadi Sharshevsky struct devlink_dpipe_match *match; 2831555d204SArkadi Sharshevsky }; 2841555d204SArkadi Sharshevsky unsigned int mapping_value; 2851555d204SArkadi Sharshevsky bool mapping_valid; 2861555d204SArkadi Sharshevsky unsigned int value_size; 2871555d204SArkadi Sharshevsky void *value; 2881555d204SArkadi Sharshevsky void *mask; 2891555d204SArkadi Sharshevsky }; 2901555d204SArkadi Sharshevsky 2911555d204SArkadi Sharshevsky /** 2921555d204SArkadi Sharshevsky * struct devlink_dpipe_entry - table entry object 2931555d204SArkadi Sharshevsky * @index: index of the entry in the table 2941555d204SArkadi Sharshevsky * @match_values: match values 2951555d204SArkadi Sharshevsky * @matche_values_count: count of matches tuples 2961555d204SArkadi Sharshevsky * @action_values: actions values 2971555d204SArkadi Sharshevsky * @action_values_count: count of actions values 2981555d204SArkadi Sharshevsky * @counter: value of counter 2991555d204SArkadi Sharshevsky * @counter_valid: Specify if value is valid from hardware 3001555d204SArkadi Sharshevsky */ 3011555d204SArkadi Sharshevsky struct devlink_dpipe_entry { 3021555d204SArkadi Sharshevsky u64 index; 3031555d204SArkadi Sharshevsky struct devlink_dpipe_value *match_values; 3041555d204SArkadi Sharshevsky unsigned int match_values_count; 3051555d204SArkadi Sharshevsky struct devlink_dpipe_value *action_values; 3061555d204SArkadi Sharshevsky unsigned int action_values_count; 3071555d204SArkadi Sharshevsky u64 counter; 3081555d204SArkadi Sharshevsky bool counter_valid; 3091555d204SArkadi Sharshevsky }; 3101555d204SArkadi Sharshevsky 3111555d204SArkadi Sharshevsky /** 3121555d204SArkadi Sharshevsky * struct devlink_dpipe_dump_ctx - context provided to driver in order 3131555d204SArkadi Sharshevsky * to dump 3141555d204SArkadi Sharshevsky * @info: info 3151555d204SArkadi Sharshevsky * @cmd: devlink command 3161555d204SArkadi Sharshevsky * @skb: skb 3171555d204SArkadi Sharshevsky * @nest: top attribute 3181555d204SArkadi Sharshevsky * @hdr: hdr 3191555d204SArkadi Sharshevsky */ 3201555d204SArkadi Sharshevsky struct devlink_dpipe_dump_ctx { 3211555d204SArkadi Sharshevsky struct genl_info *info; 3221555d204SArkadi Sharshevsky enum devlink_command cmd; 3231555d204SArkadi Sharshevsky struct sk_buff *skb; 3241555d204SArkadi Sharshevsky struct nlattr *nest; 3251555d204SArkadi Sharshevsky void *hdr; 3261555d204SArkadi Sharshevsky }; 3271555d204SArkadi Sharshevsky 3281555d204SArkadi Sharshevsky struct devlink_dpipe_table_ops; 3291555d204SArkadi Sharshevsky 3301555d204SArkadi Sharshevsky /** 3311555d204SArkadi Sharshevsky * struct devlink_dpipe_table - table object 3321555d204SArkadi Sharshevsky * @priv: private 3331555d204SArkadi Sharshevsky * @name: table name 3341555d204SArkadi Sharshevsky * @counters_enabled: indicates if counters are active 3351555d204SArkadi Sharshevsky * @counter_control_extern: indicates if counter control is in dpipe or 3361555d204SArkadi Sharshevsky * external tool 33756dc7cd0SArkadi Sharshevsky * @resource_valid: Indicate that the resource id is valid 33856dc7cd0SArkadi Sharshevsky * @resource_id: relative resource this table is related to 33956dc7cd0SArkadi Sharshevsky * @resource_units: number of resource's unit consumed per table's entry 3401555d204SArkadi Sharshevsky * @table_ops: table operations 3411555d204SArkadi Sharshevsky * @rcu: rcu 3421555d204SArkadi Sharshevsky */ 3431555d204SArkadi Sharshevsky struct devlink_dpipe_table { 3441555d204SArkadi Sharshevsky void *priv; 3451555d204SArkadi Sharshevsky struct list_head list; 3461555d204SArkadi Sharshevsky const char *name; 3471555d204SArkadi Sharshevsky bool counters_enabled; 3481555d204SArkadi Sharshevsky bool counter_control_extern; 34956dc7cd0SArkadi Sharshevsky bool resource_valid; 35056dc7cd0SArkadi Sharshevsky u64 resource_id; 35156dc7cd0SArkadi Sharshevsky u64 resource_units; 3521555d204SArkadi Sharshevsky struct devlink_dpipe_table_ops *table_ops; 3531555d204SArkadi Sharshevsky struct rcu_head rcu; 3541555d204SArkadi Sharshevsky }; 3551555d204SArkadi Sharshevsky 3561555d204SArkadi Sharshevsky /** 3571555d204SArkadi Sharshevsky * struct devlink_dpipe_table_ops - dpipe_table ops 3581555d204SArkadi Sharshevsky * @actions_dump - dumps all tables actions 3591555d204SArkadi Sharshevsky * @matches_dump - dumps all tables matches 3601555d204SArkadi Sharshevsky * @entries_dump - dumps all active entries in the table 3611555d204SArkadi Sharshevsky * @counters_set_update - when changing the counter status hardware sync 3621555d204SArkadi Sharshevsky * maybe needed to allocate/free counter related 3631555d204SArkadi Sharshevsky * resources 364ffd3cdccSArkadi Sharshevsky * @size_get - get size 3651555d204SArkadi Sharshevsky */ 3661555d204SArkadi Sharshevsky struct devlink_dpipe_table_ops { 3671555d204SArkadi Sharshevsky int (*actions_dump)(void *priv, struct sk_buff *skb); 3681555d204SArkadi Sharshevsky int (*matches_dump)(void *priv, struct sk_buff *skb); 3691555d204SArkadi Sharshevsky int (*entries_dump)(void *priv, bool counters_enabled, 3701555d204SArkadi Sharshevsky struct devlink_dpipe_dump_ctx *dump_ctx); 3711555d204SArkadi Sharshevsky int (*counters_set_update)(void *priv, bool enable); 372ffd3cdccSArkadi Sharshevsky u64 (*size_get)(void *priv); 3731555d204SArkadi Sharshevsky }; 3741555d204SArkadi Sharshevsky 3751555d204SArkadi Sharshevsky /** 3761555d204SArkadi Sharshevsky * struct devlink_dpipe_headers - dpipe headers 3771555d204SArkadi Sharshevsky * @headers - header array can be shared (global bit) or driver specific 3781555d204SArkadi Sharshevsky * @headers_count - count of headers 3791555d204SArkadi Sharshevsky */ 3801555d204SArkadi Sharshevsky struct devlink_dpipe_headers { 3811555d204SArkadi Sharshevsky struct devlink_dpipe_header **headers; 3821555d204SArkadi Sharshevsky unsigned int headers_count; 3831555d204SArkadi Sharshevsky }; 3841555d204SArkadi Sharshevsky 385d9f9b9a4SArkadi Sharshevsky /** 386d9f9b9a4SArkadi Sharshevsky * struct devlink_resource_size_params - resource's size parameters 387d9f9b9a4SArkadi Sharshevsky * @size_min: minimum size which can be set 388d9f9b9a4SArkadi Sharshevsky * @size_max: maximum size which can be set 389d9f9b9a4SArkadi Sharshevsky * @size_granularity: size granularity 390d9f9b9a4SArkadi Sharshevsky * @size_unit: resource's basic unit 391d9f9b9a4SArkadi Sharshevsky */ 392d9f9b9a4SArkadi Sharshevsky struct devlink_resource_size_params { 393d9f9b9a4SArkadi Sharshevsky u64 size_min; 394d9f9b9a4SArkadi Sharshevsky u64 size_max; 395d9f9b9a4SArkadi Sharshevsky u64 size_granularity; 396d9f9b9a4SArkadi Sharshevsky enum devlink_resource_unit unit; 397d9f9b9a4SArkadi Sharshevsky }; 398d9f9b9a4SArkadi Sharshevsky 39977d27096SJiri Pirko static inline void 40077d27096SJiri Pirko devlink_resource_size_params_init(struct devlink_resource_size_params *size_params, 40177d27096SJiri Pirko u64 size_min, u64 size_max, 40277d27096SJiri Pirko u64 size_granularity, 40377d27096SJiri Pirko enum devlink_resource_unit unit) 40477d27096SJiri Pirko { 40577d27096SJiri Pirko size_params->size_min = size_min; 40677d27096SJiri Pirko size_params->size_max = size_max; 40777d27096SJiri Pirko size_params->size_granularity = size_granularity; 40877d27096SJiri Pirko size_params->unit = unit; 40977d27096SJiri Pirko } 41077d27096SJiri Pirko 411fc56be47SJiri Pirko typedef u64 devlink_resource_occ_get_t(void *priv); 412fc56be47SJiri Pirko 413d9f9b9a4SArkadi Sharshevsky #define DEVLINK_RESOURCE_ID_PARENT_TOP 0 414d9f9b9a4SArkadi Sharshevsky 415321f7ab0SDanielle Ratson #define DEVLINK_RESOURCE_GENERIC_NAME_PORTS "physical_ports" 416321f7ab0SDanielle Ratson 417bde74ad1SMoshe Shemesh #define __DEVLINK_PARAM_MAX_STRING_VALUE 32 418eabaef18SMoshe Shemesh enum devlink_param_type { 419eabaef18SMoshe Shemesh DEVLINK_PARAM_TYPE_U8, 420eabaef18SMoshe Shemesh DEVLINK_PARAM_TYPE_U16, 421eabaef18SMoshe Shemesh DEVLINK_PARAM_TYPE_U32, 422eabaef18SMoshe Shemesh DEVLINK_PARAM_TYPE_STRING, 423eabaef18SMoshe Shemesh DEVLINK_PARAM_TYPE_BOOL, 424eabaef18SMoshe Shemesh }; 425eabaef18SMoshe Shemesh 426eabaef18SMoshe Shemesh union devlink_param_value { 427eabaef18SMoshe Shemesh u8 vu8; 428eabaef18SMoshe Shemesh u16 vu16; 429eabaef18SMoshe Shemesh u32 vu32; 430bde74ad1SMoshe Shemesh char vstr[__DEVLINK_PARAM_MAX_STRING_VALUE]; 431eabaef18SMoshe Shemesh bool vbool; 432eabaef18SMoshe Shemesh }; 433eabaef18SMoshe Shemesh 434eabaef18SMoshe Shemesh struct devlink_param_gset_ctx { 435eabaef18SMoshe Shemesh union devlink_param_value val; 436eabaef18SMoshe Shemesh enum devlink_param_cmode cmode; 437eabaef18SMoshe Shemesh }; 438eabaef18SMoshe Shemesh 439eabaef18SMoshe Shemesh /** 4406700acc5SShannon Nelson * struct devlink_flash_notify - devlink dev flash notify data 4416700acc5SShannon Nelson * @status_msg: current status string 4426700acc5SShannon Nelson * @component: firmware component being updated 4436700acc5SShannon Nelson * @done: amount of work completed of total amount 4446700acc5SShannon Nelson * @total: amount of work expected to be done 4456700acc5SShannon Nelson * @timeout: expected max timeout in seconds 4466700acc5SShannon Nelson * 4476700acc5SShannon Nelson * These are values to be given to userland to be displayed in order 4486700acc5SShannon Nelson * to show current activity in a firmware update process. 4496700acc5SShannon Nelson */ 4506700acc5SShannon Nelson struct devlink_flash_notify { 4516700acc5SShannon Nelson const char *status_msg; 4526700acc5SShannon Nelson const char *component; 4536700acc5SShannon Nelson unsigned long done; 4546700acc5SShannon Nelson unsigned long total; 4556700acc5SShannon Nelson unsigned long timeout; 4566700acc5SShannon Nelson }; 4576700acc5SShannon Nelson 4586700acc5SShannon Nelson /** 459eabaef18SMoshe Shemesh * struct devlink_param - devlink configuration parameter data 460eabaef18SMoshe Shemesh * @name: name of the parameter 461eabaef18SMoshe Shemesh * @generic: indicates if the parameter is generic or driver specific 462eabaef18SMoshe Shemesh * @type: parameter type 463eabaef18SMoshe Shemesh * @supported_cmodes: bitmap of supported configuration modes 464eabaef18SMoshe Shemesh * @get: get parameter value, used for runtime and permanent 465eabaef18SMoshe Shemesh * configuration modes 466eabaef18SMoshe Shemesh * @set: set parameter value, used for runtime and permanent 467eabaef18SMoshe Shemesh * configuration modes 468e3b7ca18SMoshe Shemesh * @validate: validate input value is applicable (within value range, etc.) 469eabaef18SMoshe Shemesh * 470eabaef18SMoshe Shemesh * This struct should be used by the driver to fill the data for 471eabaef18SMoshe Shemesh * a parameter it registers. 472eabaef18SMoshe Shemesh */ 473eabaef18SMoshe Shemesh struct devlink_param { 474eabaef18SMoshe Shemesh u32 id; 475eabaef18SMoshe Shemesh const char *name; 476eabaef18SMoshe Shemesh bool generic; 477eabaef18SMoshe Shemesh enum devlink_param_type type; 478eabaef18SMoshe Shemesh unsigned long supported_cmodes; 479eabaef18SMoshe Shemesh int (*get)(struct devlink *devlink, u32 id, 480eabaef18SMoshe Shemesh struct devlink_param_gset_ctx *ctx); 481eabaef18SMoshe Shemesh int (*set)(struct devlink *devlink, u32 id, 482eabaef18SMoshe Shemesh struct devlink_param_gset_ctx *ctx); 483e3b7ca18SMoshe Shemesh int (*validate)(struct devlink *devlink, u32 id, 484e3b7ca18SMoshe Shemesh union devlink_param_value val, 485e3b7ca18SMoshe Shemesh struct netlink_ext_ack *extack); 486eabaef18SMoshe Shemesh }; 487eabaef18SMoshe Shemesh 488eabaef18SMoshe Shemesh struct devlink_param_item { 489eabaef18SMoshe Shemesh struct list_head list; 490eabaef18SMoshe Shemesh const struct devlink_param *param; 491eabaef18SMoshe Shemesh union devlink_param_value driverinit_value; 492eabaef18SMoshe Shemesh bool driverinit_value_valid; 493eabaef18SMoshe Shemesh }; 494eabaef18SMoshe Shemesh 495eabaef18SMoshe Shemesh enum devlink_param_generic_id { 496036467c3SMoshe Shemesh DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET, 497036467c3SMoshe Shemesh DEVLINK_PARAM_GENERIC_ID_MAX_MACS, 498f567bcdaSVasundhara Volam DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV, 499f6a69885SAlex Vesker DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT, 500e3b51061SVasundhara Volam DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI, 501f61cba42SVasundhara Volam DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX, 50216511789SVasundhara Volam DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN, 503846e980aSShalom Toledo DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY, 5045bbd21dfSDirk van der Merwe DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE, 5056c7295e1SMichael Guralnik DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE, 506195d9decSMoshe Shemesh DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET, 507f13a5ad8SParav Pandit DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH, 5088ddaabeeSParav Pandit DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA, 509076b2a9dSParav Pandit DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET, 510325e0d0aSShiraz Saleem DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP, 51147402385SShay Drory DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE, 5120b5705ebSShay Drory DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE, 513eabaef18SMoshe Shemesh 514eabaef18SMoshe Shemesh /* add new param generic ids above here*/ 515eabaef18SMoshe Shemesh __DEVLINK_PARAM_GENERIC_ID_MAX, 516eabaef18SMoshe Shemesh DEVLINK_PARAM_GENERIC_ID_MAX = __DEVLINK_PARAM_GENERIC_ID_MAX - 1, 517eabaef18SMoshe Shemesh }; 518eabaef18SMoshe Shemesh 519036467c3SMoshe Shemesh #define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_NAME "internal_error_reset" 520036467c3SMoshe Shemesh #define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL 521036467c3SMoshe Shemesh 522036467c3SMoshe Shemesh #define DEVLINK_PARAM_GENERIC_MAX_MACS_NAME "max_macs" 523036467c3SMoshe Shemesh #define DEVLINK_PARAM_GENERIC_MAX_MACS_TYPE DEVLINK_PARAM_TYPE_U32 524036467c3SMoshe Shemesh 525f567bcdaSVasundhara Volam #define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_NAME "enable_sriov" 526f567bcdaSVasundhara Volam #define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_TYPE DEVLINK_PARAM_TYPE_BOOL 527f567bcdaSVasundhara Volam 528f6a69885SAlex Vesker #define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_NAME "region_snapshot_enable" 529f6a69885SAlex Vesker #define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_TYPE DEVLINK_PARAM_TYPE_BOOL 530f6a69885SAlex Vesker 531e3b51061SVasundhara Volam #define DEVLINK_PARAM_GENERIC_IGNORE_ARI_NAME "ignore_ari" 532e3b51061SVasundhara Volam #define DEVLINK_PARAM_GENERIC_IGNORE_ARI_TYPE DEVLINK_PARAM_TYPE_BOOL 533e3b51061SVasundhara Volam 534f61cba42SVasundhara Volam #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_NAME "msix_vec_per_pf_max" 535f61cba42SVasundhara Volam #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_TYPE DEVLINK_PARAM_TYPE_U32 536f61cba42SVasundhara Volam 53716511789SVasundhara Volam #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_NAME "msix_vec_per_pf_min" 53816511789SVasundhara Volam #define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_TYPE DEVLINK_PARAM_TYPE_U32 53916511789SVasundhara Volam 540846e980aSShalom Toledo #define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_NAME "fw_load_policy" 541846e980aSShalom Toledo #define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_TYPE DEVLINK_PARAM_TYPE_U8 542846e980aSShalom Toledo 5435bbd21dfSDirk van der Merwe #define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_NAME \ 5445bbd21dfSDirk van der Merwe "reset_dev_on_drv_probe" 5455bbd21dfSDirk van der Merwe #define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_TYPE DEVLINK_PARAM_TYPE_U8 5465bbd21dfSDirk van der Merwe 5476c7295e1SMichael Guralnik #define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_NAME "enable_roce" 5486c7295e1SMichael Guralnik #define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_TYPE DEVLINK_PARAM_TYPE_BOOL 5496c7295e1SMichael Guralnik 550195d9decSMoshe Shemesh #define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_NAME "enable_remote_dev_reset" 551195d9decSMoshe Shemesh #define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL 552195d9decSMoshe Shemesh 553f13a5ad8SParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_ETH_NAME "enable_eth" 554f13a5ad8SParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_ETH_TYPE DEVLINK_PARAM_TYPE_BOOL 555f13a5ad8SParav Pandit 5568ddaabeeSParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_RDMA_NAME "enable_rdma" 5578ddaabeeSParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_RDMA_TYPE DEVLINK_PARAM_TYPE_BOOL 5588ddaabeeSParav Pandit 559076b2a9dSParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_VNET_NAME "enable_vnet" 560076b2a9dSParav Pandit #define DEVLINK_PARAM_GENERIC_ENABLE_VNET_TYPE DEVLINK_PARAM_TYPE_BOOL 561076b2a9dSParav Pandit 562325e0d0aSShiraz Saleem #define DEVLINK_PARAM_GENERIC_ENABLE_IWARP_NAME "enable_iwarp" 563325e0d0aSShiraz Saleem #define DEVLINK_PARAM_GENERIC_ENABLE_IWARP_TYPE DEVLINK_PARAM_TYPE_BOOL 564325e0d0aSShiraz Saleem 56547402385SShay Drory #define DEVLINK_PARAM_GENERIC_IO_EQ_SIZE_NAME "io_eq_size" 56647402385SShay Drory #define DEVLINK_PARAM_GENERIC_IO_EQ_SIZE_TYPE DEVLINK_PARAM_TYPE_U32 56747402385SShay Drory 5680b5705ebSShay Drory #define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_NAME "event_eq_size" 5690b5705ebSShay Drory #define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_TYPE DEVLINK_PARAM_TYPE_U32 5700b5705ebSShay Drory 571036467c3SMoshe Shemesh #define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate) \ 572036467c3SMoshe Shemesh { \ 573036467c3SMoshe Shemesh .id = DEVLINK_PARAM_GENERIC_ID_##_id, \ 574036467c3SMoshe Shemesh .name = DEVLINK_PARAM_GENERIC_##_id##_NAME, \ 575036467c3SMoshe Shemesh .type = DEVLINK_PARAM_GENERIC_##_id##_TYPE, \ 576036467c3SMoshe Shemesh .generic = true, \ 577036467c3SMoshe Shemesh .supported_cmodes = _cmodes, \ 578036467c3SMoshe Shemesh .get = _get, \ 579036467c3SMoshe Shemesh .set = _set, \ 580036467c3SMoshe Shemesh .validate = _validate, \ 581036467c3SMoshe Shemesh } 582036467c3SMoshe Shemesh 583036467c3SMoshe Shemesh #define DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes, _get, _set, _validate) \ 584036467c3SMoshe Shemesh { \ 585036467c3SMoshe Shemesh .id = _id, \ 586036467c3SMoshe Shemesh .name = _name, \ 587036467c3SMoshe Shemesh .type = _type, \ 588036467c3SMoshe Shemesh .supported_cmodes = _cmodes, \ 589036467c3SMoshe Shemesh .get = _get, \ 590036467c3SMoshe Shemesh .set = _set, \ 591036467c3SMoshe Shemesh .validate = _validate, \ 592036467c3SMoshe Shemesh } 593036467c3SMoshe Shemesh 594785bd550SJakub Kicinski /* Part number, identifier of board design */ 595785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_BOARD_ID "board.id" 596785bd550SJakub Kicinski /* Revision of board design */ 597785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_BOARD_REV "board.rev" 59814fd1901SJakub Kicinski /* Maker of the board */ 59914fd1901SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE "board.manufacture" 600785bd550SJakub Kicinski 6017d5aa9a5SShannon Nelson /* Part number, identifier of asic design */ 6027d5aa9a5SShannon Nelson #define DEVLINK_INFO_VERSION_GENERIC_ASIC_ID "asic.id" 6037d5aa9a5SShannon Nelson /* Revision of asic design */ 6047d5aa9a5SShannon Nelson #define DEVLINK_INFO_VERSION_GENERIC_ASIC_REV "asic.rev" 6057d5aa9a5SShannon Nelson 6067d5aa9a5SShannon Nelson /* Overall FW version */ 6077d5aa9a5SShannon Nelson #define DEVLINK_INFO_VERSION_GENERIC_FW "fw" 608785bd550SJakub Kicinski /* Control processor FW version */ 609785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt" 6102d9eade8SVasundhara Volam /* FW interface specification version */ 6112d9eade8SVasundhara Volam #define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API "fw.mgmt.api" 612785bd550SJakub Kicinski /* Data path microcode controlling high-speed packet processing */ 613785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_FW_APP "fw.app" 614785bd550SJakub Kicinski /* UNDI software version */ 615785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_FW_UNDI "fw.undi" 616785bd550SJakub Kicinski /* NCSI support/handler version */ 617785bd550SJakub Kicinski #define DEVLINK_INFO_VERSION_GENERIC_FW_NCSI "fw.ncsi" 618468672b2SJacob Keller /* FW parameter set id */ 619468672b2SJacob Keller #define DEVLINK_INFO_VERSION_GENERIC_FW_PSID "fw.psid" 62041c0d917SVasundhara Volam /* RoCE FW version */ 62141c0d917SVasundhara Volam #define DEVLINK_INFO_VERSION_GENERIC_FW_ROCE "fw.roce" 622c90977a3SJacob Keller /* Firmware bundle identifier */ 623c90977a3SJacob Keller #define DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID "fw.bundle_id" 62401d80532SVincent Mailhol /* Bootloader */ 62501d80532SVincent Mailhol #define DEVLINK_INFO_VERSION_GENERIC_FW_BOOTLOADER "fw.bootloader" 626785bd550SJakub Kicinski 627bc75c054SJacob Keller /** 628bc75c054SJacob Keller * struct devlink_flash_update_params - Flash Update parameters 629b44cfd4fSJacob Keller * @fw: pointer to the firmware data to update from 630bc75c054SJacob Keller * @component: the flash component to update 631bc75c054SJacob Keller * 632b44cfd4fSJacob Keller * With the exception of fw, drivers must opt-in to parameters by 633bc75c054SJacob Keller * setting the appropriate bit in the supported_flash_update_params field in 634bc75c054SJacob Keller * their devlink_ops structure. 635bc75c054SJacob Keller */ 636bc75c054SJacob Keller struct devlink_flash_update_params { 637b44cfd4fSJacob Keller const struct firmware *fw; 638bc75c054SJacob Keller const char *component; 6395d5b4128SJacob Keller u32 overwrite_mask; 640bc75c054SJacob Keller }; 641bc75c054SJacob Keller 642f94b6063SJiri Pirko #define DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK BIT(0) 64322ec3d23SJacob Keller 644b16ebe92SAlex Vesker struct devlink_region; 645c4a67a21SJakub Kicinski struct devlink_info_req; 646b16ebe92SAlex Vesker 647e8937681SJacob Keller /** 648e8937681SJacob Keller * struct devlink_region_ops - Region operations 649e8937681SJacob Keller * @name: region name 650a0a09f6bSJacob Keller * @destructor: callback used to free snapshot memory when deleting 651b9a17abfSJacob Keller * @snapshot: callback to request an immediate snapshot. On success, 652b9a17abfSJacob Keller * the data variable must be updated to point to the snapshot data. 653b9a17abfSJacob Keller * The function will be called while the devlink instance lock is 654b9a17abfSJacob Keller * held. 655af6397c9SJacob Keller * @read: callback to directly read a portion of the region. On success, 656af6397c9SJacob Keller * the data pointer will be updated with the contents of the 657af6397c9SJacob Keller * requested portion of the region. The function will be called 658af6397c9SJacob Keller * while the devlink instance lock is held. 659e14e05e7SAndrew Lunn * @priv: Pointer to driver private data for the region operation 660e8937681SJacob Keller */ 661e8937681SJacob Keller struct devlink_region_ops { 662e8937681SJacob Keller const char *name; 663a0a09f6bSJacob Keller void (*destructor)(const void *data); 664d4602a9fSAndrew Lunn int (*snapshot)(struct devlink *devlink, 665d4602a9fSAndrew Lunn const struct devlink_region_ops *ops, 666d4602a9fSAndrew Lunn struct netlink_ext_ack *extack, 667b9a17abfSJacob Keller u8 **data); 668af6397c9SJacob Keller int (*read)(struct devlink *devlink, 669af6397c9SJacob Keller const struct devlink_region_ops *ops, 670af6397c9SJacob Keller struct netlink_ext_ack *extack, 671af6397c9SJacob Keller u64 offset, u32 size, u8 *data); 672e14e05e7SAndrew Lunn void *priv; 673e8937681SJacob Keller }; 674e8937681SJacob Keller 675544e7c33SAndrew Lunn /** 676544e7c33SAndrew Lunn * struct devlink_port_region_ops - Region operations for a port 677544e7c33SAndrew Lunn * @name: region name 678544e7c33SAndrew Lunn * @destructor: callback used to free snapshot memory when deleting 679544e7c33SAndrew Lunn * @snapshot: callback to request an immediate snapshot. On success, 680544e7c33SAndrew Lunn * the data variable must be updated to point to the snapshot data. 681544e7c33SAndrew Lunn * The function will be called while the devlink instance lock is 682544e7c33SAndrew Lunn * held. 683af6397c9SJacob Keller * @read: callback to directly read a portion of the region. On success, 684af6397c9SJacob Keller * the data pointer will be updated with the contents of the 685af6397c9SJacob Keller * requested portion of the region. The function will be called 686af6397c9SJacob Keller * while the devlink instance lock is held. 687544e7c33SAndrew Lunn * @priv: Pointer to driver private data for the region operation 688544e7c33SAndrew Lunn */ 689544e7c33SAndrew Lunn struct devlink_port_region_ops { 690544e7c33SAndrew Lunn const char *name; 691544e7c33SAndrew Lunn void (*destructor)(const void *data); 692544e7c33SAndrew Lunn int (*snapshot)(struct devlink_port *port, 693544e7c33SAndrew Lunn const struct devlink_port_region_ops *ops, 694544e7c33SAndrew Lunn struct netlink_ext_ack *extack, 695544e7c33SAndrew Lunn u8 **data); 696af6397c9SJacob Keller int (*read)(struct devlink_port *port, 697af6397c9SJacob Keller const struct devlink_port_region_ops *ops, 698af6397c9SJacob Keller struct netlink_ext_ack *extack, 699af6397c9SJacob Keller u64 offset, u32 size, u8 *data); 700544e7c33SAndrew Lunn void *priv; 701544e7c33SAndrew Lunn }; 702544e7c33SAndrew Lunn 7031db64e87SEran Ben Elisha struct devlink_fmsg; 704a0bdcc59SEran Ben Elisha struct devlink_health_reporter; 705a0bdcc59SEran Ben Elisha 7063167b27aSEran Ben Elisha enum devlink_health_reporter_state { 7073167b27aSEran Ben Elisha DEVLINK_HEALTH_REPORTER_STATE_HEALTHY, 7083167b27aSEran Ben Elisha DEVLINK_HEALTH_REPORTER_STATE_ERROR, 7093167b27aSEran Ben Elisha }; 7103167b27aSEran Ben Elisha 711a0bdcc59SEran Ben Elisha /** 712a0bdcc59SEran Ben Elisha * struct devlink_health_reporter_ops - Reporter operations 713a0bdcc59SEran Ben Elisha * @name: reporter name 714a0bdcc59SEran Ben Elisha * @recover: callback to recover from reported error 715a0bdcc59SEran Ben Elisha * if priv_ctx is NULL, run a full recover 716a0bdcc59SEran Ben Elisha * @dump: callback to dump an object 717a0bdcc59SEran Ben Elisha * if priv_ctx is NULL, run a full dump 718a0bdcc59SEran Ben Elisha * @diagnose: callback to diagnose the current status 719e2ce94dcSJiri Pirko * @test: callback to trigger a test event 720a0bdcc59SEran Ben Elisha */ 721a0bdcc59SEran Ben Elisha 722a0bdcc59SEran Ben Elisha struct devlink_health_reporter_ops { 723a0bdcc59SEran Ben Elisha char *name; 724a0bdcc59SEran Ben Elisha int (*recover)(struct devlink_health_reporter *reporter, 725e7a98105SJiri Pirko void *priv_ctx, struct netlink_ext_ack *extack); 726a0bdcc59SEran Ben Elisha int (*dump)(struct devlink_health_reporter *reporter, 727e7a98105SJiri Pirko struct devlink_fmsg *fmsg, void *priv_ctx, 728e7a98105SJiri Pirko struct netlink_ext_ack *extack); 729a0bdcc59SEran Ben Elisha int (*diagnose)(struct devlink_health_reporter *reporter, 730e7a98105SJiri Pirko struct devlink_fmsg *fmsg, 731e7a98105SJiri Pirko struct netlink_ext_ack *extack); 732e2ce94dcSJiri Pirko int (*test)(struct devlink_health_reporter *reporter, 733e2ce94dcSJiri Pirko struct netlink_ext_ack *extack); 734a0bdcc59SEran Ben Elisha }; 7351db64e87SEran Ben Elisha 7360f420b6cSIdo Schimmel /** 7375b88823bSIdo Schimmel * struct devlink_trap_metadata - Packet trap metadata. 7385b88823bSIdo Schimmel * @trap_name: Trap name. 7395b88823bSIdo Schimmel * @trap_group_name: Trap group name. 7405b88823bSIdo Schimmel * @input_dev: Input netdevice. 7414dbd24f6SEric Dumazet * @dev_tracker: refcount tracker for @input_dev. 7425b88823bSIdo Schimmel * @fa_cookie: Flow action user cookie. 74393e15596SIdo Schimmel * @trap_type: Trap type. 7445b88823bSIdo Schimmel */ 7455b88823bSIdo Schimmel struct devlink_trap_metadata { 7465b88823bSIdo Schimmel const char *trap_name; 7475b88823bSIdo Schimmel const char *trap_group_name; 7484dbd24f6SEric Dumazet 7495b88823bSIdo Schimmel struct net_device *input_dev; 7504dbd24f6SEric Dumazet netdevice_tracker dev_tracker; 7514dbd24f6SEric Dumazet 7525b88823bSIdo Schimmel const struct flow_action_cookie *fa_cookie; 75393e15596SIdo Schimmel enum devlink_trap_type trap_type; 7545b88823bSIdo Schimmel }; 7555b88823bSIdo Schimmel 7565b88823bSIdo Schimmel /** 7571e8c6619SIdo Schimmel * struct devlink_trap_policer - Immutable packet trap policer attributes. 7581e8c6619SIdo Schimmel * @id: Policer identifier. 7591e8c6619SIdo Schimmel * @init_rate: Initial rate in packets / sec. 7601e8c6619SIdo Schimmel * @init_burst: Initial burst size in packets. 7611e8c6619SIdo Schimmel * @max_rate: Maximum rate. 7621e8c6619SIdo Schimmel * @min_rate: Minimum rate. 7631e8c6619SIdo Schimmel * @max_burst: Maximum burst size. 7641e8c6619SIdo Schimmel * @min_burst: Minimum burst size. 7651e8c6619SIdo Schimmel * 7661e8c6619SIdo Schimmel * Describes immutable attributes of packet trap policers that drivers register 7671e8c6619SIdo Schimmel * with devlink. 7681e8c6619SIdo Schimmel */ 7691e8c6619SIdo Schimmel struct devlink_trap_policer { 7701e8c6619SIdo Schimmel u32 id; 7711e8c6619SIdo Schimmel u64 init_rate; 7721e8c6619SIdo Schimmel u64 init_burst; 7731e8c6619SIdo Schimmel u64 max_rate; 7741e8c6619SIdo Schimmel u64 min_rate; 7751e8c6619SIdo Schimmel u64 max_burst; 7761e8c6619SIdo Schimmel u64 min_burst; 7771e8c6619SIdo Schimmel }; 7781e8c6619SIdo Schimmel 7791e8c6619SIdo Schimmel /** 7800f420b6cSIdo Schimmel * struct devlink_trap_group - Immutable packet trap group attributes. 7810f420b6cSIdo Schimmel * @name: Trap group name. 7820f420b6cSIdo Schimmel * @id: Trap group identifier. 7830f420b6cSIdo Schimmel * @generic: Whether the trap group is generic or not. 784f9f54392SIdo Schimmel * @init_policer_id: Initial policer identifier. 7850f420b6cSIdo Schimmel * 7860f420b6cSIdo Schimmel * Describes immutable attributes of packet trap groups that drivers register 7870f420b6cSIdo Schimmel * with devlink. 7880f420b6cSIdo Schimmel */ 7890f420b6cSIdo Schimmel struct devlink_trap_group { 7900f420b6cSIdo Schimmel const char *name; 7910f420b6cSIdo Schimmel u16 id; 7920f420b6cSIdo Schimmel bool generic; 793f9f54392SIdo Schimmel u32 init_policer_id; 7940f420b6cSIdo Schimmel }; 7950f420b6cSIdo Schimmel 7960f420b6cSIdo Schimmel #define DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT BIT(0) 79785b0589eSJiri Pirko #define DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE BIT(1) 7980f420b6cSIdo Schimmel 7990f420b6cSIdo Schimmel /** 8000f420b6cSIdo Schimmel * struct devlink_trap - Immutable packet trap attributes. 8010f420b6cSIdo Schimmel * @type: Trap type. 8020f420b6cSIdo Schimmel * @init_action: Initial trap action. 8030f420b6cSIdo Schimmel * @generic: Whether the trap is generic or not. 8040f420b6cSIdo Schimmel * @id: Trap identifier. 8050f420b6cSIdo Schimmel * @name: Trap name. 806107f1678SIdo Schimmel * @init_group_id: Initial group identifier. 8070f420b6cSIdo Schimmel * @metadata_cap: Metadata types that can be provided by the trap. 8080f420b6cSIdo Schimmel * 8090f420b6cSIdo Schimmel * Describes immutable attributes of packet traps that drivers register with 8100f420b6cSIdo Schimmel * devlink. 8110f420b6cSIdo Schimmel */ 8120f420b6cSIdo Schimmel struct devlink_trap { 8130f420b6cSIdo Schimmel enum devlink_trap_type type; 8140f420b6cSIdo Schimmel enum devlink_trap_action init_action; 8150f420b6cSIdo Schimmel bool generic; 8160f420b6cSIdo Schimmel u16 id; 8170f420b6cSIdo Schimmel const char *name; 818107f1678SIdo Schimmel u16 init_group_id; 8190f420b6cSIdo Schimmel u32 metadata_cap; 8200f420b6cSIdo Schimmel }; 8210f420b6cSIdo Schimmel 822f3047ca0SIdo Schimmel /* All traps must be documented in 823f4bdd710SJacob Keller * Documentation/networking/devlink/devlink-trap.rst 824f3047ca0SIdo Schimmel */ 8250f420b6cSIdo Schimmel enum devlink_trap_generic_id { 826391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_SMAC_MC, 827391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH, 828391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER, 829391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER, 830391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST, 831391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER, 832391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE, 833391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_TTL_ERROR, 834391203abSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_TAIL_DROP, 8356896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET, 8366896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC, 8376896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_DIP_LB, 8386896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_SIP_MC, 8396896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_SIP_LB, 8406896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR, 8416896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC, 8426896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE, 8436896cc4dSAmit Cohen DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE, 8443b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_MTU_ERROR, 8453b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH, 8463b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_RPF, 8473b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE, 8483b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS, 8493b063ae5SAmit Cohen DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS, 85095f0ead8SAmit Cohen DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE, 85113c056ecSAmit Cohen DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR, 852c3cae491SAmit Cohen DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC, 853ecd942a0SJiri Pirko DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP, 854ecd942a0SJiri Pirko DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP, 855515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_STP, 856515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_LACP, 857515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_LLDP, 858515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY, 859515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT, 860515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT, 861515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT, 862515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE, 863515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_MLD_QUERY, 864515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT, 865515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT, 866515eac67SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE, 867d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP, 868d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP, 869d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST, 870d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE, 871d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY, 872d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT, 873d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT, 874d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_BFD, 875d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_BFD, 876d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF, 877d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF, 878d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_BGP, 879d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_BGP, 880d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP, 881d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP, 882d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_PIM, 883d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_PIM, 884d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_UC_LB, 885d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE, 886d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE, 887d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE, 888d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES, 889d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS, 890d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT, 891d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT, 892d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT, 893d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT, 894d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT, 895d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_PTP_EVENT, 896d77cfd16SIdo Schimmel DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL, 8975eb18a2bSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE, 8985eb18a2bSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP, 89908e335f6SAmit Cohen DEVLINK_TRAP_GENERIC_ID_EARLY_DROP, 90010c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING, 90110c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING, 90210c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING, 90310c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING, 90410c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING, 90510c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_ARP_PARSING, 90610c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING, 90710c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING, 90810c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_GRE_PARSING, 90910c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_UDP_PARSING, 91010c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_TCP_PARSING, 91110c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING, 91210c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING, 91310c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING, 91410c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_GTP_PARSING, 91510c24eb2SIoana Ciornei DEVLINK_TRAP_GENERIC_ID_ESP_PARSING, 916f0a5013eSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP, 917e78ab164SAya Levin DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER, 9182640a82bSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_EAPOL, 9192640a82bSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_LOCKED_PORT, 920391203abSIdo Schimmel 9210f420b6cSIdo Schimmel /* Add new generic trap IDs above */ 9220f420b6cSIdo Schimmel __DEVLINK_TRAP_GENERIC_ID_MAX, 9230f420b6cSIdo Schimmel DEVLINK_TRAP_GENERIC_ID_MAX = __DEVLINK_TRAP_GENERIC_ID_MAX - 1, 9240f420b6cSIdo Schimmel }; 9250f420b6cSIdo Schimmel 926f3047ca0SIdo Schimmel /* All trap groups must be documented in 927f4bdd710SJacob Keller * Documentation/networking/devlink/devlink-trap.rst 928f3047ca0SIdo Schimmel */ 9290f420b6cSIdo Schimmel enum devlink_trap_group_generic_id { 930391203abSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS, 931391203abSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS, 932678eb199SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS, 933391203abSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS, 93413c056ecSAmit Cohen DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS, 935ecd942a0SJiri Pirko DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS, 936515eac67SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_STP, 937515eac67SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_LACP, 938515eac67SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP, 939515eac67SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING, 940d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP, 941d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY, 942d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_BFD, 943d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF, 944d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_BGP, 945d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP, 946d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_PIM, 947d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB, 948d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY, 949ec4f5b36SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY, 950d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6, 951d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT, 952d77cfd16SIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL, 9535eb18a2bSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE, 9545eb18a2bSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP, 95510c24eb2SIoana Ciornei DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS, 9562640a82bSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_EAPOL, 957391203abSIdo Schimmel 9580f420b6cSIdo Schimmel /* Add new generic trap group IDs above */ 9590f420b6cSIdo Schimmel __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX, 9600f420b6cSIdo Schimmel DEVLINK_TRAP_GROUP_GENERIC_ID_MAX = 9610f420b6cSIdo Schimmel __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX - 1, 9620f420b6cSIdo Schimmel }; 9630f420b6cSIdo Schimmel 964391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_SMAC_MC \ 965391203abSIdo Schimmel "source_mac_is_multicast" 966391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_VLAN_TAG_MISMATCH \ 967391203abSIdo Schimmel "vlan_tag_mismatch" 968391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_VLAN_FILTER \ 969391203abSIdo Schimmel "ingress_vlan_filter" 970391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_STP_FILTER \ 971391203abSIdo Schimmel "ingress_spanning_tree_filter" 972391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_EMPTY_TX_LIST \ 973391203abSIdo Schimmel "port_list_is_empty" 974391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_PORT_LOOPBACK_FILTER \ 975391203abSIdo Schimmel "port_loopback_filter" 976391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_ROUTE \ 977391203abSIdo Schimmel "blackhole_route" 978391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_TTL_ERROR \ 979391203abSIdo Schimmel "ttl_value_is_too_small" 980391203abSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_TAIL_DROP \ 981391203abSIdo Schimmel "tail_drop" 9826896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_NON_IP_PACKET \ 9836896cc4dSAmit Cohen "non_ip" 9846896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_UC_DIP_MC_DMAC \ 9856896cc4dSAmit Cohen "uc_dip_over_mc_dmac" 9866896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_DIP_LB \ 9876896cc4dSAmit Cohen "dip_is_loopback_address" 9886896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_SIP_MC \ 9896896cc4dSAmit Cohen "sip_is_mc" 9906896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_SIP_LB \ 9916896cc4dSAmit Cohen "sip_is_loopback_address" 9926896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_CORRUPTED_IP_HDR \ 9936896cc4dSAmit Cohen "ip_header_corrupted" 9946896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_IPV4_SIP_BC \ 9956896cc4dSAmit Cohen "ipv4_sip_is_limited_bc" 9966896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_RESERVED_SCOPE \ 9976896cc4dSAmit Cohen "ipv6_mc_dip_reserved_scope" 9986896cc4dSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE \ 9996896cc4dSAmit Cohen "ipv6_mc_dip_interface_local_scope" 10003b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_MTU_ERROR \ 10013b063ae5SAmit Cohen "mtu_value_is_too_small" 10023b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_UNRESOLVED_NEIGH \ 10033b063ae5SAmit Cohen "unresolved_neigh" 10043b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_RPF \ 10053b063ae5SAmit Cohen "mc_reverse_path_forwarding" 10063b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_REJECT_ROUTE \ 10073b063ae5SAmit Cohen "reject_route" 10083b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_IPV4_LPM_UNICAST_MISS \ 10093b063ae5SAmit Cohen "ipv4_lpm_miss" 10103b063ae5SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_IPV6_LPM_UNICAST_MISS \ 10113b063ae5SAmit Cohen "ipv6_lpm_miss" 101295f0ead8SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_NON_ROUTABLE \ 101395f0ead8SAmit Cohen "non_routable_packet" 101413c056ecSAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_DECAP_ERROR \ 101513c056ecSAmit Cohen "decap_error" 1016c3cae491SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_OVERLAY_SMAC_MC \ 1017c3cae491SAmit Cohen "overlay_smac_is_mc" 1018ecd942a0SJiri Pirko #define DEVLINK_TRAP_GENERIC_NAME_INGRESS_FLOW_ACTION_DROP \ 1019ecd942a0SJiri Pirko "ingress_flow_action_drop" 1020ecd942a0SJiri Pirko #define DEVLINK_TRAP_GENERIC_NAME_EGRESS_FLOW_ACTION_DROP \ 1021ecd942a0SJiri Pirko "egress_flow_action_drop" 1022515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_STP \ 1023515eac67SIdo Schimmel "stp" 1024515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_LACP \ 1025515eac67SIdo Schimmel "lacp" 1026515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_LLDP \ 1027515eac67SIdo Schimmel "lldp" 1028515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IGMP_QUERY \ 1029515eac67SIdo Schimmel "igmp_query" 1030515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V1_REPORT \ 1031515eac67SIdo Schimmel "igmp_v1_report" 1032515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_REPORT \ 1033515eac67SIdo Schimmel "igmp_v2_report" 1034515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V3_REPORT \ 1035515eac67SIdo Schimmel "igmp_v3_report" 1036515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_LEAVE \ 1037515eac67SIdo Schimmel "igmp_v2_leave" 1038515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_MLD_QUERY \ 1039515eac67SIdo Schimmel "mld_query" 1040515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_REPORT \ 1041515eac67SIdo Schimmel "mld_v1_report" 1042515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_MLD_V2_REPORT \ 1043515eac67SIdo Schimmel "mld_v2_report" 1044515eac67SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_DONE \ 1045515eac67SIdo Schimmel "mld_v1_done" 1046d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_DHCP \ 1047d77cfd16SIdo Schimmel "ipv4_dhcp" 1048d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DHCP \ 1049d77cfd16SIdo Schimmel "ipv6_dhcp" 1050d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_ARP_REQUEST \ 1051d77cfd16SIdo Schimmel "arp_request" 1052d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_ARP_RESPONSE \ 1053d77cfd16SIdo Schimmel "arp_response" 1054d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_ARP_OVERLAY \ 1055d77cfd16SIdo Schimmel "arp_overlay" 1056d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_SOLICIT \ 1057d77cfd16SIdo Schimmel "ipv6_neigh_solicit" 1058d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_ADVERT \ 1059d77cfd16SIdo Schimmel "ipv6_neigh_advert" 1060d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_BFD \ 1061d77cfd16SIdo Schimmel "ipv4_bfd" 1062d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_BFD \ 1063d77cfd16SIdo Schimmel "ipv6_bfd" 1064d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_OSPF \ 1065d77cfd16SIdo Schimmel "ipv4_ospf" 1066d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_OSPF \ 1067d77cfd16SIdo Schimmel "ipv6_ospf" 1068d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_BGP \ 1069d77cfd16SIdo Schimmel "ipv4_bgp" 1070d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_BGP \ 1071d77cfd16SIdo Schimmel "ipv6_bgp" 1072d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_VRRP \ 1073d77cfd16SIdo Schimmel "ipv4_vrrp" 1074d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_VRRP \ 1075d77cfd16SIdo Schimmel "ipv6_vrrp" 1076d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_PIM \ 1077d77cfd16SIdo Schimmel "ipv4_pim" 1078d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_PIM \ 1079d77cfd16SIdo Schimmel "ipv6_pim" 1080d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_UC_LB \ 1081d77cfd16SIdo Schimmel "uc_loopback" 1082d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_LOCAL_ROUTE \ 1083d77cfd16SIdo Schimmel "local_route" 1084d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_EXTERNAL_ROUTE \ 1085d77cfd16SIdo Schimmel "external_route" 1086d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_UC_DIP_LINK_LOCAL_SCOPE \ 1087d77cfd16SIdo Schimmel "ipv6_uc_dip_link_local_scope" 1088d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_NODES \ 1089d77cfd16SIdo Schimmel "ipv6_dip_all_nodes" 1090d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_ROUTERS \ 1091d77cfd16SIdo Schimmel "ipv6_dip_all_routers" 1092d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_SOLICIT \ 1093d77cfd16SIdo Schimmel "ipv6_router_solicit" 1094d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ADVERT \ 1095d77cfd16SIdo Schimmel "ipv6_router_advert" 1096d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_REDIRECT \ 1097d77cfd16SIdo Schimmel "ipv6_redirect" 1098d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV4_ROUTER_ALERT \ 1099d77cfd16SIdo Schimmel "ipv4_router_alert" 1100d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ALERT \ 1101d77cfd16SIdo Schimmel "ipv6_router_alert" 1102d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_PTP_EVENT \ 1103d77cfd16SIdo Schimmel "ptp_event" 1104d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_PTP_GENERAL \ 1105d77cfd16SIdo Schimmel "ptp_general" 11065eb18a2bSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_SAMPLE \ 11075eb18a2bSIdo Schimmel "flow_action_sample" 11085eb18a2bSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_TRAP \ 11095eb18a2bSIdo Schimmel "flow_action_trap" 111008e335f6SAmit Cohen #define DEVLINK_TRAP_GENERIC_NAME_EARLY_DROP \ 111108e335f6SAmit Cohen "early_drop" 111210c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_VXLAN_PARSING \ 111310c24eb2SIoana Ciornei "vxlan_parsing" 111410c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_LLC_SNAP_PARSING \ 111510c24eb2SIoana Ciornei "llc_snap_parsing" 111610c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_VLAN_PARSING \ 111710c24eb2SIoana Ciornei "vlan_parsing" 111810c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_PPPOE_PPP_PARSING \ 111910c24eb2SIoana Ciornei "pppoe_ppp_parsing" 112010c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_MPLS_PARSING \ 112110c24eb2SIoana Ciornei "mpls_parsing" 112210c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_ARP_PARSING \ 112310c24eb2SIoana Ciornei "arp_parsing" 112410c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_IP_1_PARSING \ 112510c24eb2SIoana Ciornei "ip_1_parsing" 112610c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_IP_N_PARSING \ 112710c24eb2SIoana Ciornei "ip_n_parsing" 112810c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_GRE_PARSING \ 112910c24eb2SIoana Ciornei "gre_parsing" 113010c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_UDP_PARSING \ 113110c24eb2SIoana Ciornei "udp_parsing" 113210c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_TCP_PARSING \ 113310c24eb2SIoana Ciornei "tcp_parsing" 113410c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_IPSEC_PARSING \ 113510c24eb2SIoana Ciornei "ipsec_parsing" 113610c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_SCTP_PARSING \ 113710c24eb2SIoana Ciornei "sctp_parsing" 113810c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_DCCP_PARSING \ 113910c24eb2SIoana Ciornei "dccp_parsing" 114010c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_GTP_PARSING \ 114110c24eb2SIoana Ciornei "gtp_parsing" 114210c24eb2SIoana Ciornei #define DEVLINK_TRAP_GENERIC_NAME_ESP_PARSING \ 114310c24eb2SIoana Ciornei "esp_parsing" 1144f0a5013eSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_NEXTHOP \ 1145f0a5013eSIdo Schimmel "blackhole_nexthop" 1146e78ab164SAya Levin #define DEVLINK_TRAP_GENERIC_NAME_DMAC_FILTER \ 1147e13e4536SAya Levin "dmac_filter" 11482640a82bSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_EAPOL \ 11492640a82bSIdo Schimmel "eapol" 11502640a82bSIdo Schimmel #define DEVLINK_TRAP_GENERIC_NAME_LOCKED_PORT \ 11512640a82bSIdo Schimmel "locked_port" 1152391203abSIdo Schimmel 1153391203abSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L2_DROPS \ 1154391203abSIdo Schimmel "l2_drops" 1155391203abSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_DROPS \ 1156391203abSIdo Schimmel "l3_drops" 1157678eb199SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_EXCEPTIONS \ 1158678eb199SIdo Schimmel "l3_exceptions" 1159391203abSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BUFFER_DROPS \ 1160391203abSIdo Schimmel "buffer_drops" 116113c056ecSAmit Cohen #define DEVLINK_TRAP_GROUP_GENERIC_NAME_TUNNEL_DROPS \ 116213c056ecSAmit Cohen "tunnel_drops" 1163ecd942a0SJiri Pirko #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_DROPS \ 1164ecd942a0SJiri Pirko "acl_drops" 1165515eac67SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_STP \ 1166515eac67SIdo Schimmel "stp" 1167515eac67SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LACP \ 1168515eac67SIdo Schimmel "lacp" 1169515eac67SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LLDP \ 1170515eac67SIdo Schimmel "lldp" 1171515eac67SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_MC_SNOOPING \ 1172515eac67SIdo Schimmel "mc_snooping" 1173d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_DHCP \ 1174d77cfd16SIdo Schimmel "dhcp" 1175d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_NEIGH_DISCOVERY \ 1176d77cfd16SIdo Schimmel "neigh_discovery" 1177d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BFD \ 1178d77cfd16SIdo Schimmel "bfd" 1179d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_OSPF \ 1180d77cfd16SIdo Schimmel "ospf" 1181d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_BGP \ 1182d77cfd16SIdo Schimmel "bgp" 1183d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_VRRP \ 1184d77cfd16SIdo Schimmel "vrrp" 1185d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PIM \ 1186d77cfd16SIdo Schimmel "pim" 1187d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_UC_LB \ 1188d77cfd16SIdo Schimmel "uc_loopback" 1189d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \ 1190d77cfd16SIdo Schimmel "local_delivery" 1191ec4f5b36SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \ 1192ec4f5b36SIdo Schimmel "external_delivery" 1193d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \ 1194d77cfd16SIdo Schimmel "ipv6" 1195d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \ 1196d77cfd16SIdo Schimmel "ptp_event" 1197d77cfd16SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_GENERAL \ 1198d77cfd16SIdo Schimmel "ptp_general" 11995eb18a2bSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_SAMPLE \ 12005eb18a2bSIdo Schimmel "acl_sample" 12015eb18a2bSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_TRAP \ 12025eb18a2bSIdo Schimmel "acl_trap" 120310c24eb2SIoana Ciornei #define DEVLINK_TRAP_GROUP_GENERIC_NAME_PARSER_ERROR_DROPS \ 120410c24eb2SIoana Ciornei "parser_error_drops" 12052640a82bSIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC_NAME_EAPOL \ 12062640a82bSIdo Schimmel "eapol" 1207391203abSIdo Schimmel 1208107f1678SIdo Schimmel #define DEVLINK_TRAP_GENERIC(_type, _init_action, _id, _group_id, \ 1209107f1678SIdo Schimmel _metadata_cap) \ 12100f420b6cSIdo Schimmel { \ 12110f420b6cSIdo Schimmel .type = DEVLINK_TRAP_TYPE_##_type, \ 12120f420b6cSIdo Schimmel .init_action = DEVLINK_TRAP_ACTION_##_init_action, \ 12130f420b6cSIdo Schimmel .generic = true, \ 12140f420b6cSIdo Schimmel .id = DEVLINK_TRAP_GENERIC_ID_##_id, \ 12150f420b6cSIdo Schimmel .name = DEVLINK_TRAP_GENERIC_NAME_##_id, \ 1216107f1678SIdo Schimmel .init_group_id = _group_id, \ 12170f420b6cSIdo Schimmel .metadata_cap = _metadata_cap, \ 12180f420b6cSIdo Schimmel } 12190f420b6cSIdo Schimmel 1220107f1678SIdo Schimmel #define DEVLINK_TRAP_DRIVER(_type, _init_action, _id, _name, _group_id, \ 12210f420b6cSIdo Schimmel _metadata_cap) \ 12220f420b6cSIdo Schimmel { \ 12230f420b6cSIdo Schimmel .type = DEVLINK_TRAP_TYPE_##_type, \ 12240f420b6cSIdo Schimmel .init_action = DEVLINK_TRAP_ACTION_##_init_action, \ 12250f420b6cSIdo Schimmel .generic = false, \ 12260f420b6cSIdo Schimmel .id = _id, \ 12270f420b6cSIdo Schimmel .name = _name, \ 1228107f1678SIdo Schimmel .init_group_id = _group_id, \ 12290f420b6cSIdo Schimmel .metadata_cap = _metadata_cap, \ 12300f420b6cSIdo Schimmel } 12310f420b6cSIdo Schimmel 1232f9f54392SIdo Schimmel #define DEVLINK_TRAP_GROUP_GENERIC(_id, _policer_id) \ 12330f420b6cSIdo Schimmel { \ 12340f420b6cSIdo Schimmel .name = DEVLINK_TRAP_GROUP_GENERIC_NAME_##_id, \ 12350f420b6cSIdo Schimmel .id = DEVLINK_TRAP_GROUP_GENERIC_ID_##_id, \ 12360f420b6cSIdo Schimmel .generic = true, \ 1237f9f54392SIdo Schimmel .init_policer_id = _policer_id, \ 12380f420b6cSIdo Schimmel } 12390f420b6cSIdo Schimmel 12401e8c6619SIdo Schimmel #define DEVLINK_TRAP_POLICER(_id, _rate, _burst, _max_rate, _min_rate, \ 12411e8c6619SIdo Schimmel _max_burst, _min_burst) \ 12421e8c6619SIdo Schimmel { \ 12431e8c6619SIdo Schimmel .id = _id, \ 12441e8c6619SIdo Schimmel .init_rate = _rate, \ 12451e8c6619SIdo Schimmel .init_burst = _burst, \ 12461e8c6619SIdo Schimmel .max_rate = _max_rate, \ 12471e8c6619SIdo Schimmel .min_rate = _min_rate, \ 12481e8c6619SIdo Schimmel .max_burst = _max_burst, \ 12491e8c6619SIdo Schimmel .min_burst = _min_burst, \ 12501e8c6619SIdo Schimmel } 12511e8c6619SIdo Schimmel 1252bd032e35SLeon Romanovsky enum { 1253bd032e35SLeon Romanovsky /* device supports reload operations */ 1254bd032e35SLeon Romanovsky DEVLINK_F_RELOAD = 1UL << 0, 1255bd032e35SLeon Romanovsky }; 1256bd032e35SLeon Romanovsky 1257bfcd3a46SJiri Pirko struct devlink_ops { 125822ec3d23SJacob Keller /** 125922ec3d23SJacob Keller * @supported_flash_update_params: 126022ec3d23SJacob Keller * mask of parameters supported by the driver's .flash_update 126122ec3d23SJacob Keller * implemementation. 126222ec3d23SJacob Keller */ 126322ec3d23SJacob Keller u32 supported_flash_update_params; 1264ccdf0721SMoshe Shemesh unsigned long reload_actions; 1265dc64cc7cSMoshe Shemesh unsigned long reload_limits; 1266070c63f2SJiri Pirko int (*reload_down)(struct devlink *devlink, bool netns_change, 1267dc64cc7cSMoshe Shemesh enum devlink_reload_action action, 1268dc64cc7cSMoshe Shemesh enum devlink_reload_limit limit, 1269dc64cc7cSMoshe Shemesh struct netlink_ext_ack *extack); 1270ccdf0721SMoshe Shemesh int (*reload_up)(struct devlink *devlink, enum devlink_reload_action action, 1271dc64cc7cSMoshe Shemesh enum devlink_reload_limit limit, u32 *actions_performed, 1272dc64cc7cSMoshe Shemesh struct netlink_ext_ack *extack); 1273bfcd3a46SJiri Pirko int (*port_type_set)(struct devlink_port *devlink_port, 1274bfcd3a46SJiri Pirko enum devlink_port_type port_type); 1275706217c1SJakub Kicinski int (*port_split)(struct devlink *devlink, struct devlink_port *port, 1276ac0fc8a1SDavid Ahern unsigned int count, struct netlink_ext_ack *extack); 1277706217c1SJakub Kicinski int (*port_unsplit)(struct devlink *devlink, struct devlink_port *port, 1278ac0fc8a1SDavid Ahern struct netlink_ext_ack *extack); 1279bf797471SJiri Pirko int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index, 1280bf797471SJiri Pirko u16 pool_index, 1281bf797471SJiri Pirko struct devlink_sb_pool_info *pool_info); 1282bf797471SJiri Pirko int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index, 1283bf797471SJiri Pirko u16 pool_index, u32 size, 1284f2ad1a52SIdo Schimmel enum devlink_sb_threshold_type threshold_type, 1285f2ad1a52SIdo Schimmel struct netlink_ext_ack *extack); 1286bf797471SJiri Pirko int (*sb_port_pool_get)(struct devlink_port *devlink_port, 1287bf797471SJiri Pirko unsigned int sb_index, u16 pool_index, 1288bf797471SJiri Pirko u32 *p_threshold); 1289bf797471SJiri Pirko int (*sb_port_pool_set)(struct devlink_port *devlink_port, 1290bf797471SJiri Pirko unsigned int sb_index, u16 pool_index, 1291f2ad1a52SIdo Schimmel u32 threshold, struct netlink_ext_ack *extack); 1292bf797471SJiri Pirko int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port, 1293bf797471SJiri Pirko unsigned int sb_index, 1294bf797471SJiri Pirko u16 tc_index, 1295bf797471SJiri Pirko enum devlink_sb_pool_type pool_type, 1296bf797471SJiri Pirko u16 *p_pool_index, u32 *p_threshold); 1297bf797471SJiri Pirko int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port, 1298bf797471SJiri Pirko unsigned int sb_index, 1299bf797471SJiri Pirko u16 tc_index, 1300bf797471SJiri Pirko enum devlink_sb_pool_type pool_type, 1301f2ad1a52SIdo Schimmel u16 pool_index, u32 threshold, 1302f2ad1a52SIdo Schimmel struct netlink_ext_ack *extack); 1303df38dafdSJiri Pirko int (*sb_occ_snapshot)(struct devlink *devlink, 1304df38dafdSJiri Pirko unsigned int sb_index); 1305df38dafdSJiri Pirko int (*sb_occ_max_clear)(struct devlink *devlink, 1306df38dafdSJiri Pirko unsigned int sb_index); 1307df38dafdSJiri Pirko int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port, 1308df38dafdSJiri Pirko unsigned int sb_index, u16 pool_index, 1309df38dafdSJiri Pirko u32 *p_cur, u32 *p_max); 1310df38dafdSJiri Pirko int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port, 1311df38dafdSJiri Pirko unsigned int sb_index, 1312df38dafdSJiri Pirko u16 tc_index, 1313df38dafdSJiri Pirko enum devlink_sb_pool_type pool_type, 1314df38dafdSJiri Pirko u32 *p_cur, u32 *p_max); 131508f4b591SOr Gerlitz 131608f4b591SOr Gerlitz int (*eswitch_mode_get)(struct devlink *devlink, u16 *p_mode); 1317db7ff19eSEli Britstein int (*eswitch_mode_set)(struct devlink *devlink, u16 mode, 1318db7ff19eSEli Britstein struct netlink_ext_ack *extack); 131959bfde01SRoi Dayan int (*eswitch_inline_mode_get)(struct devlink *devlink, u8 *p_inline_mode); 1320db7ff19eSEli Britstein int (*eswitch_inline_mode_set)(struct devlink *devlink, u8 inline_mode, 1321db7ff19eSEli Britstein struct netlink_ext_ack *extack); 132298fdbea5SLeon Romanovsky int (*eswitch_encap_mode_get)(struct devlink *devlink, 132398fdbea5SLeon Romanovsky enum devlink_eswitch_encap_mode *p_encap_mode); 132498fdbea5SLeon Romanovsky int (*eswitch_encap_mode_set)(struct devlink *devlink, 132598fdbea5SLeon Romanovsky enum devlink_eswitch_encap_mode encap_mode, 1326db7ff19eSEli Britstein struct netlink_ext_ack *extack); 1327f9cf2288SJakub Kicinski int (*info_get)(struct devlink *devlink, struct devlink_info_req *req, 1328f9cf2288SJakub Kicinski struct netlink_ext_ack *extack); 132922ec3d23SJacob Keller /** 133022ec3d23SJacob Keller * @flash_update: Device flash update function 133122ec3d23SJacob Keller * 133222ec3d23SJacob Keller * Used to perform a flash update for the device. The set of 133322ec3d23SJacob Keller * parameters supported by the driver should be set in 133422ec3d23SJacob Keller * supported_flash_update_params. 133522ec3d23SJacob Keller */ 1336bc75c054SJacob Keller int (*flash_update)(struct devlink *devlink, 1337bc75c054SJacob Keller struct devlink_flash_update_params *params, 133876726ccbSJakub Kicinski struct netlink_ext_ack *extack); 13390f420b6cSIdo Schimmel /** 13400f420b6cSIdo Schimmel * @trap_init: Trap initialization function. 13410f420b6cSIdo Schimmel * 13420f420b6cSIdo Schimmel * Should be used by device drivers to initialize the trap in the 13430f420b6cSIdo Schimmel * underlying device. Drivers should also store the provided trap 13440f420b6cSIdo Schimmel * context, so that they could efficiently pass it to 13450f420b6cSIdo Schimmel * devlink_trap_report() when the trap is triggered. 13460f420b6cSIdo Schimmel */ 13470f420b6cSIdo Schimmel int (*trap_init)(struct devlink *devlink, 13480f420b6cSIdo Schimmel const struct devlink_trap *trap, void *trap_ctx); 13490f420b6cSIdo Schimmel /** 13500f420b6cSIdo Schimmel * @trap_fini: Trap de-initialization function. 13510f420b6cSIdo Schimmel * 13520f420b6cSIdo Schimmel * Should be used by device drivers to de-initialize the trap in the 13530f420b6cSIdo Schimmel * underlying device. 13540f420b6cSIdo Schimmel */ 13550f420b6cSIdo Schimmel void (*trap_fini)(struct devlink *devlink, 13560f420b6cSIdo Schimmel const struct devlink_trap *trap, void *trap_ctx); 13570f420b6cSIdo Schimmel /** 13580f420b6cSIdo Schimmel * @trap_action_set: Trap action set function. 13590f420b6cSIdo Schimmel */ 13600f420b6cSIdo Schimmel int (*trap_action_set)(struct devlink *devlink, 13610f420b6cSIdo Schimmel const struct devlink_trap *trap, 1362c88e11e0SIdo Schimmel enum devlink_trap_action action, 1363c88e11e0SIdo Schimmel struct netlink_ext_ack *extack); 13640f420b6cSIdo Schimmel /** 13650f420b6cSIdo Schimmel * @trap_group_init: Trap group initialization function. 13660f420b6cSIdo Schimmel * 13670f420b6cSIdo Schimmel * Should be used by device drivers to initialize the trap group in the 13680f420b6cSIdo Schimmel * underlying device. 13690f420b6cSIdo Schimmel */ 13700f420b6cSIdo Schimmel int (*trap_group_init)(struct devlink *devlink, 13710f420b6cSIdo Schimmel const struct devlink_trap_group *group); 13721e8c6619SIdo Schimmel /** 1373c064875aSIdo Schimmel * @trap_group_set: Trap group parameters set function. 1374c064875aSIdo Schimmel * 1375c064875aSIdo Schimmel * Note: @policer can be NULL when a policer is being unbound from 1376c064875aSIdo Schimmel * @group. 1377c064875aSIdo Schimmel */ 1378c064875aSIdo Schimmel int (*trap_group_set)(struct devlink *devlink, 1379c064875aSIdo Schimmel const struct devlink_trap_group *group, 1380c88e11e0SIdo Schimmel const struct devlink_trap_policer *policer, 1381c88e11e0SIdo Schimmel struct netlink_ext_ack *extack); 1382c064875aSIdo Schimmel /** 1383c50bf2beSIoana Ciornei * @trap_group_action_set: Trap group action set function. 1384c50bf2beSIoana Ciornei * 1385c50bf2beSIoana Ciornei * If this callback is populated, it will take precedence over looping 1386c50bf2beSIoana Ciornei * over all traps in a group and calling .trap_action_set(). 1387c50bf2beSIoana Ciornei */ 1388c50bf2beSIoana Ciornei int (*trap_group_action_set)(struct devlink *devlink, 1389c50bf2beSIoana Ciornei const struct devlink_trap_group *group, 1390c50bf2beSIoana Ciornei enum devlink_trap_action action, 1391c50bf2beSIoana Ciornei struct netlink_ext_ack *extack); 1392c50bf2beSIoana Ciornei /** 1393ddee9dbcSOleksandr Mazur * @trap_drop_counter_get: Trap drop counter get function. 1394ddee9dbcSOleksandr Mazur * 1395ddee9dbcSOleksandr Mazur * Should be used by device drivers to report number of packets 1396ddee9dbcSOleksandr Mazur * that have been dropped, and cannot be passed to the devlink 1397ddee9dbcSOleksandr Mazur * subsystem by the underlying device. 1398ddee9dbcSOleksandr Mazur */ 1399ddee9dbcSOleksandr Mazur int (*trap_drop_counter_get)(struct devlink *devlink, 1400ddee9dbcSOleksandr Mazur const struct devlink_trap *trap, 1401ddee9dbcSOleksandr Mazur u64 *p_drops); 1402ddee9dbcSOleksandr Mazur /** 14031e8c6619SIdo Schimmel * @trap_policer_init: Trap policer initialization function. 14041e8c6619SIdo Schimmel * 14051e8c6619SIdo Schimmel * Should be used by device drivers to initialize the trap policer in 14061e8c6619SIdo Schimmel * the underlying device. 14071e8c6619SIdo Schimmel */ 14081e8c6619SIdo Schimmel int (*trap_policer_init)(struct devlink *devlink, 14091e8c6619SIdo Schimmel const struct devlink_trap_policer *policer); 14101e8c6619SIdo Schimmel /** 14111e8c6619SIdo Schimmel * @trap_policer_fini: Trap policer de-initialization function. 14121e8c6619SIdo Schimmel * 14131e8c6619SIdo Schimmel * Should be used by device drivers to de-initialize the trap policer 14141e8c6619SIdo Schimmel * in the underlying device. 14151e8c6619SIdo Schimmel */ 14161e8c6619SIdo Schimmel void (*trap_policer_fini)(struct devlink *devlink, 14171e8c6619SIdo Schimmel const struct devlink_trap_policer *policer); 14181e8c6619SIdo Schimmel /** 14191e8c6619SIdo Schimmel * @trap_policer_set: Trap policer parameters set function. 14201e8c6619SIdo Schimmel */ 14211e8c6619SIdo Schimmel int (*trap_policer_set)(struct devlink *devlink, 14221e8c6619SIdo Schimmel const struct devlink_trap_policer *policer, 14231e8c6619SIdo Schimmel u64 rate, u64 burst, 14241e8c6619SIdo Schimmel struct netlink_ext_ack *extack); 14251e8c6619SIdo Schimmel /** 14261e8c6619SIdo Schimmel * @trap_policer_counter_get: Trap policer counter get function. 14271e8c6619SIdo Schimmel * 14281e8c6619SIdo Schimmel * Should be used by device drivers to report number of packets dropped 14291e8c6619SIdo Schimmel * by the policer. 14301e8c6619SIdo Schimmel */ 14311e8c6619SIdo Schimmel int (*trap_policer_counter_get)(struct devlink *devlink, 14321e8c6619SIdo Schimmel const struct devlink_trap_policer *policer, 14331e8c6619SIdo Schimmel u64 *p_drops); 14342a916eccSParav Pandit /** 14352a916eccSParav Pandit * @port_function_hw_addr_get: Port function's hardware address get function. 14362a916eccSParav Pandit * 14372a916eccSParav Pandit * Should be used by device drivers to report the hardware address of a function managed 14382a916eccSParav Pandit * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port 14392a916eccSParav Pandit * function handling for a particular port. 14402a916eccSParav Pandit * 14412a916eccSParav Pandit * Note: @extack can be NULL when port notifier queries the port function. 14422a916eccSParav Pandit */ 144382564f6cSLeon Romanovsky int (*port_function_hw_addr_get)(struct devlink_port *port, u8 *hw_addr, 144482564f6cSLeon Romanovsky int *hw_addr_len, 14452a916eccSParav Pandit struct netlink_ext_ack *extack); 1446a1e8ae90SParav Pandit /** 1447a1e8ae90SParav Pandit * @port_function_hw_addr_set: Port function's hardware address set function. 1448a1e8ae90SParav Pandit * 1449a1e8ae90SParav Pandit * Should be used by device drivers to set the hardware address of a function managed 1450a1e8ae90SParav Pandit * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port 1451a1e8ae90SParav Pandit * function handling for a particular port. 1452a1e8ae90SParav Pandit */ 145382564f6cSLeon Romanovsky int (*port_function_hw_addr_set)(struct devlink_port *port, 1454a1e8ae90SParav Pandit const u8 *hw_addr, int hw_addr_len, 1455a1e8ae90SParav Pandit struct netlink_ext_ack *extack); 1456cd76dcd6SParav Pandit /** 1457da65e9ffSShay Drory * @port_fn_roce_get: Port function's roce get function. 1458da65e9ffSShay Drory * 1459da65e9ffSShay Drory * Query RoCE state of a function managed by the devlink port. 1460da65e9ffSShay Drory * Return -EOPNOTSUPP if port function RoCE handling is not supported. 1461da65e9ffSShay Drory */ 1462da65e9ffSShay Drory int (*port_fn_roce_get)(struct devlink_port *devlink_port, 1463da65e9ffSShay Drory bool *is_enable, 1464da65e9ffSShay Drory struct netlink_ext_ack *extack); 1465da65e9ffSShay Drory /** 1466da65e9ffSShay Drory * @port_fn_roce_set: Port function's roce set function. 1467da65e9ffSShay Drory * 1468da65e9ffSShay Drory * Enable/Disable the RoCE state of a function managed by the devlink 1469da65e9ffSShay Drory * port. 1470da65e9ffSShay Drory * Return -EOPNOTSUPP if port function RoCE handling is not supported. 1471da65e9ffSShay Drory */ 1472da65e9ffSShay Drory int (*port_fn_roce_set)(struct devlink_port *devlink_port, 1473da65e9ffSShay Drory bool enable, struct netlink_ext_ack *extack); 1474da65e9ffSShay Drory /** 1475a8ce7b26SShay Drory * @port_fn_migratable_get: Port function's migratable get function. 1476a8ce7b26SShay Drory * 1477a8ce7b26SShay Drory * Query migratable state of a function managed by the devlink port. 1478a8ce7b26SShay Drory * Return -EOPNOTSUPP if port function migratable handling is not 1479a8ce7b26SShay Drory * supported. 1480a8ce7b26SShay Drory */ 1481a8ce7b26SShay Drory int (*port_fn_migratable_get)(struct devlink_port *devlink_port, 1482a8ce7b26SShay Drory bool *is_enable, 1483a8ce7b26SShay Drory struct netlink_ext_ack *extack); 1484a8ce7b26SShay Drory /** 1485a8ce7b26SShay Drory * @port_fn_migratable_set: Port function's migratable set function. 1486a8ce7b26SShay Drory * 1487a8ce7b26SShay Drory * Enable/Disable migratable state of a function managed by the devlink 1488a8ce7b26SShay Drory * port. 1489a8ce7b26SShay Drory * Return -EOPNOTSUPP if port function migratable handling is not 1490a8ce7b26SShay Drory * supported. 1491a8ce7b26SShay Drory */ 1492a8ce7b26SShay Drory int (*port_fn_migratable_set)(struct devlink_port *devlink_port, 1493a8ce7b26SShay Drory bool enable, 1494a8ce7b26SShay Drory struct netlink_ext_ack *extack); 1495a8ce7b26SShay Drory /** 1496cd76dcd6SParav Pandit * port_new() - Add a new port function of a specified flavor 1497cd76dcd6SParav Pandit * @devlink: Devlink instance 1498cd76dcd6SParav Pandit * @attrs: attributes of the new port 1499cd76dcd6SParav Pandit * @extack: extack for reporting error messages 1500cd76dcd6SParav Pandit * @new_port_index: index of the new port 1501cd76dcd6SParav Pandit * 1502cd76dcd6SParav Pandit * Devlink core will call this device driver function upon user request 1503cd76dcd6SParav Pandit * to create a new port function of a specified flavor and optional 1504cd76dcd6SParav Pandit * attributes 1505cd76dcd6SParav Pandit * 1506cd76dcd6SParav Pandit * Notes: 1507cd76dcd6SParav Pandit * - Called without devlink instance lock being held. Drivers must 1508cd76dcd6SParav Pandit * implement own means of synchronization 1509cd76dcd6SParav Pandit * - On success, drivers must register a port with devlink core 1510cd76dcd6SParav Pandit * 1511cd76dcd6SParav Pandit * Return: 0 on success, negative value otherwise. 1512cd76dcd6SParav Pandit */ 1513cd76dcd6SParav Pandit int (*port_new)(struct devlink *devlink, 1514cd76dcd6SParav Pandit const struct devlink_port_new_attrs *attrs, 1515cd76dcd6SParav Pandit struct netlink_ext_ack *extack, 1516cd76dcd6SParav Pandit unsigned int *new_port_index); 1517cd76dcd6SParav Pandit /** 1518cd76dcd6SParav Pandit * port_del() - Delete a port function 1519cd76dcd6SParav Pandit * @devlink: Devlink instance 1520cd76dcd6SParav Pandit * @port_index: port function index to delete 1521cd76dcd6SParav Pandit * @extack: extack for reporting error messages 1522cd76dcd6SParav Pandit * 1523cd76dcd6SParav Pandit * Devlink core will call this device driver function upon user request 1524cd76dcd6SParav Pandit * to delete a previously created port function 1525cd76dcd6SParav Pandit * 1526cd76dcd6SParav Pandit * Notes: 1527cd76dcd6SParav Pandit * - Called without devlink instance lock being held. Drivers must 1528cd76dcd6SParav Pandit * implement own means of synchronization 1529cd76dcd6SParav Pandit * - On success, drivers must unregister the corresponding devlink 1530cd76dcd6SParav Pandit * port 1531cd76dcd6SParav Pandit * 1532cd76dcd6SParav Pandit * Return: 0 on success, negative value otherwise. 1533cd76dcd6SParav Pandit */ 1534cd76dcd6SParav Pandit int (*port_del)(struct devlink *devlink, unsigned int port_index, 1535cd76dcd6SParav Pandit struct netlink_ext_ack *extack); 1536a556ddedSParav Pandit /** 1537a556ddedSParav Pandit * port_fn_state_get() - Get the state of a port function 1538a556ddedSParav Pandit * @devlink: Devlink instance 1539a556ddedSParav Pandit * @port: The devlink port 1540a556ddedSParav Pandit * @state: Admin configured state 1541a556ddedSParav Pandit * @opstate: Current operational state 1542a556ddedSParav Pandit * @extack: extack for reporting error messages 1543a556ddedSParav Pandit * 1544a556ddedSParav Pandit * Reports the admin and operational state of a devlink port function 1545a556ddedSParav Pandit * 1546a556ddedSParav Pandit * Return: 0 on success, negative value otherwise. 1547a556ddedSParav Pandit */ 154882564f6cSLeon Romanovsky int (*port_fn_state_get)(struct devlink_port *port, 1549a556ddedSParav Pandit enum devlink_port_fn_state *state, 1550a556ddedSParav Pandit enum devlink_port_fn_opstate *opstate, 1551a556ddedSParav Pandit struct netlink_ext_ack *extack); 1552a556ddedSParav Pandit /** 1553a556ddedSParav Pandit * port_fn_state_set() - Set the admin state of a port function 1554a556ddedSParav Pandit * @devlink: Devlink instance 1555a556ddedSParav Pandit * @port: The devlink port 1556a556ddedSParav Pandit * @state: Admin state 1557a556ddedSParav Pandit * @extack: extack for reporting error messages 1558a556ddedSParav Pandit * 1559a556ddedSParav Pandit * Set the admin state of a devlink port function 1560a556ddedSParav Pandit * 1561a556ddedSParav Pandit * Return: 0 on success, negative value otherwise. 1562a556ddedSParav Pandit */ 156382564f6cSLeon Romanovsky int (*port_fn_state_set)(struct devlink_port *port, 1564a556ddedSParav Pandit enum devlink_port_fn_state state, 1565a556ddedSParav Pandit struct netlink_ext_ack *extack); 15661897db2eSDmytro Linkin 15671897db2eSDmytro Linkin /** 15681897db2eSDmytro Linkin * Rate control callbacks. 15691897db2eSDmytro Linkin */ 15701897db2eSDmytro Linkin int (*rate_leaf_tx_share_set)(struct devlink_rate *devlink_rate, void *priv, 15711897db2eSDmytro Linkin u64 tx_share, struct netlink_ext_ack *extack); 15721897db2eSDmytro Linkin int (*rate_leaf_tx_max_set)(struct devlink_rate *devlink_rate, void *priv, 15731897db2eSDmytro Linkin u64 tx_max, struct netlink_ext_ack *extack); 1574cd502236SMichal Wilczynski int (*rate_leaf_tx_priority_set)(struct devlink_rate *devlink_rate, void *priv, 1575cd502236SMichal Wilczynski u32 tx_priority, struct netlink_ext_ack *extack); 15766e2d7e84SMichal Wilczynski int (*rate_leaf_tx_weight_set)(struct devlink_rate *devlink_rate, void *priv, 15776e2d7e84SMichal Wilczynski u32 tx_weight, struct netlink_ext_ack *extack); 1578a8ecb93eSDmytro Linkin int (*rate_node_tx_share_set)(struct devlink_rate *devlink_rate, void *priv, 1579a8ecb93eSDmytro Linkin u64 tx_share, struct netlink_ext_ack *extack); 1580a8ecb93eSDmytro Linkin int (*rate_node_tx_max_set)(struct devlink_rate *devlink_rate, void *priv, 1581a8ecb93eSDmytro Linkin u64 tx_max, struct netlink_ext_ack *extack); 1582cd502236SMichal Wilczynski int (*rate_node_tx_priority_set)(struct devlink_rate *devlink_rate, void *priv, 1583cd502236SMichal Wilczynski u32 tx_priority, struct netlink_ext_ack *extack); 15846e2d7e84SMichal Wilczynski int (*rate_node_tx_weight_set)(struct devlink_rate *devlink_rate, void *priv, 15856e2d7e84SMichal Wilczynski u32 tx_weight, struct netlink_ext_ack *extack); 1586a8ecb93eSDmytro Linkin int (*rate_node_new)(struct devlink_rate *rate_node, void **priv, 1587a8ecb93eSDmytro Linkin struct netlink_ext_ack *extack); 1588a8ecb93eSDmytro Linkin int (*rate_node_del)(struct devlink_rate *rate_node, void *priv, 1589a8ecb93eSDmytro Linkin struct netlink_ext_ack *extack); 1590d7555984SDmytro Linkin int (*rate_leaf_parent_set)(struct devlink_rate *child, 1591d7555984SDmytro Linkin struct devlink_rate *parent, 1592d7555984SDmytro Linkin void *priv_child, void *priv_parent, 1593d7555984SDmytro Linkin struct netlink_ext_ack *extack); 1594d7555984SDmytro Linkin int (*rate_node_parent_set)(struct devlink_rate *child, 1595d7555984SDmytro Linkin struct devlink_rate *parent, 1596d7555984SDmytro Linkin void *priv_child, void *priv_parent, 1597d7555984SDmytro Linkin struct netlink_ext_ack *extack); 159808f588faSVikas Gupta /** 159908f588faSVikas Gupta * selftests_check() - queries if selftest is supported 160008f588faSVikas Gupta * @devlink: devlink instance 160108f588faSVikas Gupta * @id: test index 160208f588faSVikas Gupta * @extack: extack for reporting error messages 160308f588faSVikas Gupta * 160408f588faSVikas Gupta * Return: true if test is supported by the driver 160508f588faSVikas Gupta */ 160608f588faSVikas Gupta bool (*selftest_check)(struct devlink *devlink, unsigned int id, 160708f588faSVikas Gupta struct netlink_ext_ack *extack); 160808f588faSVikas Gupta /** 160908f588faSVikas Gupta * selftest_run() - Runs a selftest 161008f588faSVikas Gupta * @devlink: devlink instance 161108f588faSVikas Gupta * @id: test index 161208f588faSVikas Gupta * @extack: extack for reporting error messages 161308f588faSVikas Gupta * 161408f588faSVikas Gupta * Return: status of the test 161508f588faSVikas Gupta */ 161608f588faSVikas Gupta enum devlink_selftest_status 161708f588faSVikas Gupta (*selftest_run)(struct devlink *devlink, unsigned int id, 161808f588faSVikas Gupta struct netlink_ext_ack *extack); 1619bfcd3a46SJiri Pirko }; 1620bfcd3a46SJiri Pirko 162121314638SLeon Romanovsky void *devlink_priv(struct devlink *devlink); 162221314638SLeon Romanovsky struct devlink *priv_to_devlink(void *priv); 162321314638SLeon Romanovsky struct device *devlink_to_dev(const struct devlink *devlink); 1624bfcd3a46SJiri Pirko 16252cb7b489SJakub Kicinski /* Devlink instance explicit locking */ 16262cb7b489SJakub Kicinski void devl_lock(struct devlink *devlink); 1627012ec02aSJiri Pirko int devl_trylock(struct devlink *devlink); 16282cb7b489SJakub Kicinski void devl_unlock(struct devlink *devlink); 16292cb7b489SJakub Kicinski void devl_assert_locked(struct devlink *devlink); 16302cb7b489SJakub Kicinski bool devl_lock_is_held(struct devlink *devlink); 16312cb7b489SJakub Kicinski 1632bfcd3a46SJiri Pirko struct ib_device; 1633bfcd3a46SJiri Pirko 1634471f894fSJiri Pirko struct net *devlink_net(const struct devlink *devlink); 163526713455SLeon Romanovsky /* This call is intended for software devices that can create 163626713455SLeon Romanovsky * devlink instances in other namespaces than init_net. 163726713455SLeon Romanovsky * 163826713455SLeon Romanovsky * Drivers that operate on real HW must use devlink_alloc() instead. 163926713455SLeon Romanovsky */ 164026713455SLeon Romanovsky struct devlink *devlink_alloc_ns(const struct devlink_ops *ops, 1641919d13a7SLeon Romanovsky size_t priv_size, struct net *net, 1642919d13a7SLeon Romanovsky struct device *dev); 164326713455SLeon Romanovsky static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, 1644919d13a7SLeon Romanovsky size_t priv_size, 1645919d13a7SLeon Romanovsky struct device *dev) 164626713455SLeon Romanovsky { 1647919d13a7SLeon Romanovsky return devlink_alloc_ns(ops, priv_size, &init_net, dev); 164826713455SLeon Romanovsky } 1649bd032e35SLeon Romanovsky void devlink_set_features(struct devlink *devlink, u64 features); 16509053637eSJakub Kicinski int devl_register(struct devlink *devlink); 16519053637eSJakub Kicinski void devl_unregister(struct devlink *devlink); 1652db4278c5SLeon Romanovsky void devlink_register(struct devlink *devlink); 1653bfcd3a46SJiri Pirko void devlink_unregister(struct devlink *devlink); 1654bfcd3a46SJiri Pirko void devlink_free(struct devlink *devlink); 1655ae3bbc04SJiri Pirko void devlink_port_init(struct devlink *devlink, 1656ae3bbc04SJiri Pirko struct devlink_port *devlink_port); 1657ae3bbc04SJiri Pirko void devlink_port_fini(struct devlink_port *devlink_port); 1658277cbb6bSJiri Pirko int devl_port_register(struct devlink *devlink, 1659277cbb6bSJiri Pirko struct devlink_port *devlink_port, 1660277cbb6bSJiri Pirko unsigned int port_index); 1661bfcd3a46SJiri Pirko int devlink_port_register(struct devlink *devlink, 1662bfcd3a46SJiri Pirko struct devlink_port *devlink_port, 1663bfcd3a46SJiri Pirko unsigned int port_index); 1664277cbb6bSJiri Pirko void devl_port_unregister(struct devlink_port *devlink_port); 1665bfcd3a46SJiri Pirko void devlink_port_unregister(struct devlink_port *devlink_port); 1666c8096578SJiri Pirko void devlink_port_type_eth_set(struct devlink_port *devlink_port); 1667bfcd3a46SJiri Pirko void devlink_port_type_ib_set(struct devlink_port *devlink_port, 1668bfcd3a46SJiri Pirko struct ib_device *ibdev); 1669bfcd3a46SJiri Pirko void devlink_port_type_clear(struct devlink_port *devlink_port); 1670b9ffcbafSJiri Pirko void devlink_port_attrs_set(struct devlink_port *devlink_port, 167171ad8d55SDanielle Ratson struct devlink_port_attrs *devlink_port_attrs); 16723a2d9588SParav Pandit void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller, 16733a2d9588SParav Pandit u16 pf, bool external); 16743a2d9588SParav Pandit void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller, 167505b595e9SParav Pandit u16 pf, u16 vf, bool external); 1676b8288837SParav Pandit void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port, 1677a1ab3e45SParav Pandit u32 controller, u16 pf, u32 sf, 1678a1ab3e45SParav Pandit bool external); 1679caba177dSMichal Wilczynski struct devlink_rate * 1680caba177dSMichal Wilczynski devl_rate_node_create(struct devlink *devlink, void *priv, char *node_name, 1681caba177dSMichal Wilczynski struct devlink_rate *parent); 1682f2fc15e2SMichal Wilczynski int 1683f2fc15e2SMichal Wilczynski devl_rate_leaf_create(struct devlink_port *devlink_port, void *priv, 1684f2fc15e2SMichal Wilczynski struct devlink_rate *parent); 1685277cbb6bSJiri Pirko void devl_rate_leaf_destroy(struct devlink_port *devlink_port); 1686277cbb6bSJiri Pirko void devl_rate_nodes_destroy(struct devlink *devlink); 1687b8375859SJiri Pirko void devlink_port_linecard_set(struct devlink_port *devlink_port, 1688b8375859SJiri Pirko struct devlink_linecard *linecard); 1689fcdc8ce2SJiri Pirko struct devlink_linecard * 16905cc9049cSJiri Pirko devl_linecard_create(struct devlink *devlink, unsigned int linecard_index, 1691fcdc8ce2SJiri Pirko const struct devlink_linecard_ops *ops, void *priv); 16925cc9049cSJiri Pirko void devl_linecard_destroy(struct devlink_linecard *linecard); 1693fcdc8ce2SJiri Pirko void devlink_linecard_provision_set(struct devlink_linecard *linecard, 1694fcdc8ce2SJiri Pirko const char *type); 1695fcdc8ce2SJiri Pirko void devlink_linecard_provision_clear(struct devlink_linecard *linecard); 1696fcdc8ce2SJiri Pirko void devlink_linecard_provision_fail(struct devlink_linecard *linecard); 1697fc9f50d5SJiri Pirko void devlink_linecard_activate(struct devlink_linecard *linecard); 1698fc9f50d5SJiri Pirko void devlink_linecard_deactivate(struct devlink_linecard *linecard); 16997b2d9a1aSJiri Pirko void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard, 17007b2d9a1aSJiri Pirko struct devlink *nested_devlink); 1701755cfa69SJiri Pirko int devl_sb_register(struct devlink *devlink, unsigned int sb_index, 1702755cfa69SJiri Pirko u32 size, u16 ingress_pools_count, 1703755cfa69SJiri Pirko u16 egress_pools_count, u16 ingress_tc_count, 1704755cfa69SJiri Pirko u16 egress_tc_count); 1705bf797471SJiri Pirko int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, 1706bf797471SJiri Pirko u32 size, u16 ingress_pools_count, 1707bf797471SJiri Pirko u16 egress_pools_count, u16 ingress_tc_count, 1708bf797471SJiri Pirko u16 egress_tc_count); 1709755cfa69SJiri Pirko void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index); 1710bf797471SJiri Pirko void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index); 171170a2ff89SJiri Pirko int devl_dpipe_table_register(struct devlink *devlink, 171270a2ff89SJiri Pirko const char *table_name, 171370a2ff89SJiri Pirko struct devlink_dpipe_table_ops *table_ops, 171470a2ff89SJiri Pirko void *priv, bool counter_control_extern); 171570a2ff89SJiri Pirko void devl_dpipe_table_unregister(struct devlink *devlink, 171670a2ff89SJiri Pirko const char *table_name); 171770a2ff89SJiri Pirko void devl_dpipe_headers_register(struct devlink *devlink, 171870a2ff89SJiri Pirko struct devlink_dpipe_headers *dpipe_headers); 171970a2ff89SJiri Pirko void devl_dpipe_headers_unregister(struct devlink *devlink); 17201555d204SArkadi Sharshevsky bool devlink_dpipe_table_counter_enabled(struct devlink *devlink, 17211555d204SArkadi Sharshevsky const char *table_name); 17221555d204SArkadi Sharshevsky int devlink_dpipe_entry_ctx_prepare(struct devlink_dpipe_dump_ctx *dump_ctx); 17231555d204SArkadi Sharshevsky int devlink_dpipe_entry_ctx_append(struct devlink_dpipe_dump_ctx *dump_ctx, 17241555d204SArkadi Sharshevsky struct devlink_dpipe_entry *entry); 17251555d204SArkadi Sharshevsky int devlink_dpipe_entry_ctx_close(struct devlink_dpipe_dump_ctx *dump_ctx); 172635807324SArkadi Sharshevsky void devlink_dpipe_entry_clear(struct devlink_dpipe_entry *entry); 17271555d204SArkadi Sharshevsky int devlink_dpipe_action_put(struct sk_buff *skb, 17281555d204SArkadi Sharshevsky struct devlink_dpipe_action *action); 17291555d204SArkadi Sharshevsky int devlink_dpipe_match_put(struct sk_buff *skb, 17301555d204SArkadi Sharshevsky struct devlink_dpipe_match *match); 173111770091SArkadi Sharshevsky extern struct devlink_dpipe_header devlink_dpipe_header_ethernet; 17323fb886ecSArkadi Sharshevsky extern struct devlink_dpipe_header devlink_dpipe_header_ipv4; 17331797f5b3SArkadi Sharshevsky extern struct devlink_dpipe_header devlink_dpipe_header_ipv6; 1734bfcd3a46SJiri Pirko 1735c223d6a4SJiri Pirko int devl_resource_register(struct devlink *devlink, 1736c223d6a4SJiri Pirko const char *resource_name, 1737c223d6a4SJiri Pirko u64 resource_size, 1738c223d6a4SJiri Pirko u64 resource_id, 1739c223d6a4SJiri Pirko u64 parent_resource_id, 1740c223d6a4SJiri Pirko const struct devlink_resource_size_params *size_params); 1741d9f9b9a4SArkadi Sharshevsky int devlink_resource_register(struct devlink *devlink, 1742d9f9b9a4SArkadi Sharshevsky const char *resource_name, 1743d9f9b9a4SArkadi Sharshevsky u64 resource_size, 1744d9f9b9a4SArkadi Sharshevsky u64 resource_id, 1745d9f9b9a4SArkadi Sharshevsky u64 parent_resource_id, 1746fc56be47SJiri Pirko const struct devlink_resource_size_params *size_params); 1747c223d6a4SJiri Pirko void devl_resources_unregister(struct devlink *devlink); 17484c897cfcSLeon Romanovsky void devlink_resources_unregister(struct devlink *devlink); 1749c223d6a4SJiri Pirko int devl_resource_size_get(struct devlink *devlink, 1750c223d6a4SJiri Pirko u64 resource_id, 1751c223d6a4SJiri Pirko u64 *p_resource_size); 175270a2ff89SJiri Pirko int devl_dpipe_table_resource_set(struct devlink *devlink, 175370a2ff89SJiri Pirko const char *table_name, u64 resource_id, 175470a2ff89SJiri Pirko u64 resource_units); 175556dc7cd0SArkadi Sharshevsky int devlink_dpipe_table_resource_set(struct devlink *devlink, 175656dc7cd0SArkadi Sharshevsky const char *table_name, u64 resource_id, 175756dc7cd0SArkadi Sharshevsky u64 resource_units); 1758c223d6a4SJiri Pirko void devl_resource_occ_get_register(struct devlink *devlink, 1759c223d6a4SJiri Pirko u64 resource_id, 1760c223d6a4SJiri Pirko devlink_resource_occ_get_t *occ_get, 1761c223d6a4SJiri Pirko void *occ_get_priv); 1762fc56be47SJiri Pirko void devlink_resource_occ_get_register(struct devlink *devlink, 1763fc56be47SJiri Pirko u64 resource_id, 1764fc56be47SJiri Pirko devlink_resource_occ_get_t *occ_get, 1765fc56be47SJiri Pirko void *occ_get_priv); 1766c223d6a4SJiri Pirko void devl_resource_occ_get_unregister(struct devlink *devlink, 1767c223d6a4SJiri Pirko u64 resource_id); 1768c223d6a4SJiri Pirko 1769fc56be47SJiri Pirko void devlink_resource_occ_get_unregister(struct devlink *devlink, 1770fc56be47SJiri Pirko u64 resource_id); 1771eabaef18SMoshe Shemesh int devlink_params_register(struct devlink *devlink, 1772eabaef18SMoshe Shemesh const struct devlink_param *params, 1773eabaef18SMoshe Shemesh size_t params_count); 1774eabaef18SMoshe Shemesh void devlink_params_unregister(struct devlink *devlink, 1775eabaef18SMoshe Shemesh const struct devlink_param *params, 1776eabaef18SMoshe Shemesh size_t params_count); 1777b40c51efSParav Pandit int devlink_param_register(struct devlink *devlink, 1778b40c51efSParav Pandit const struct devlink_param *param); 1779b40c51efSParav Pandit void devlink_param_unregister(struct devlink *devlink, 1780b40c51efSParav Pandit const struct devlink_param *param); 1781ec01aeb1SMoshe Shemesh int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id, 1782ec01aeb1SMoshe Shemesh union devlink_param_value *init_val); 1783ec01aeb1SMoshe Shemesh int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id, 1784ec01aeb1SMoshe Shemesh union devlink_param_value init_val); 1785ea601e17SMoshe Shemesh void devlink_param_value_changed(struct devlink *devlink, u32 param_id); 1786eb0e9fa2SJiri Pirko struct devlink_region *devl_region_create(struct devlink *devlink, 1787eb0e9fa2SJiri Pirko const struct devlink_region_ops *ops, 1788eb0e9fa2SJiri Pirko u32 region_max_snapshots, 1789eb0e9fa2SJiri Pirko u64 region_size); 1790e8937681SJacob Keller struct devlink_region * 1791e8937681SJacob Keller devlink_region_create(struct devlink *devlink, 1792e8937681SJacob Keller const struct devlink_region_ops *ops, 1793e8937681SJacob Keller u32 region_max_snapshots, u64 region_size); 1794544e7c33SAndrew Lunn struct devlink_region * 1795544e7c33SAndrew Lunn devlink_port_region_create(struct devlink_port *port, 1796544e7c33SAndrew Lunn const struct devlink_port_region_ops *ops, 1797544e7c33SAndrew Lunn u32 region_max_snapshots, u64 region_size); 1798eb0e9fa2SJiri Pirko void devl_region_destroy(struct devlink_region *region); 1799b16ebe92SAlex Vesker void devlink_region_destroy(struct devlink_region *region); 1800544e7c33SAndrew Lunn void devlink_port_region_destroy(struct devlink_region *region); 1801544e7c33SAndrew Lunn 18027ef19d3bSJacob Keller int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id); 180312102436SJacob Keller void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id); 18043a5e5234SJiri Pirko int devlink_region_snapshot_create(struct devlink_region *region, 1805a0a09f6bSJacob Keller u8 *data, u32 snapshot_id); 1806f9cf2288SJakub Kicinski int devlink_info_serial_number_put(struct devlink_info_req *req, 1807f9cf2288SJakub Kicinski const char *sn); 1808b5872cd0SVasundhara Volam int devlink_info_board_serial_number_put(struct devlink_info_req *req, 1809b5872cd0SVasundhara Volam const char *bsn); 1810bb670123SJiri Pirko 1811bb670123SJiri Pirko enum devlink_info_version_type { 1812bb670123SJiri Pirko DEVLINK_INFO_VERSION_TYPE_NONE, 1813bb670123SJiri Pirko DEVLINK_INFO_VERSION_TYPE_COMPONENT, /* May be used as flash update 1814bb670123SJiri Pirko * component by name. 1815bb670123SJiri Pirko */ 1816bb670123SJiri Pirko }; 1817bb670123SJiri Pirko 1818fc6fae7dSJakub Kicinski int devlink_info_version_fixed_put(struct devlink_info_req *req, 1819fc6fae7dSJakub Kicinski const char *version_name, 1820fc6fae7dSJakub Kicinski const char *version_value); 1821fc6fae7dSJakub Kicinski int devlink_info_version_stored_put(struct devlink_info_req *req, 1822fc6fae7dSJakub Kicinski const char *version_name, 1823fc6fae7dSJakub Kicinski const char *version_value); 1824bb670123SJiri Pirko int devlink_info_version_stored_put_ext(struct devlink_info_req *req, 1825bb670123SJiri Pirko const char *version_name, 1826bb670123SJiri Pirko const char *version_value, 1827bb670123SJiri Pirko enum devlink_info_version_type version_type); 1828fc6fae7dSJakub Kicinski int devlink_info_version_running_put(struct devlink_info_req *req, 1829fc6fae7dSJakub Kicinski const char *version_name, 1830fc6fae7dSJakub Kicinski const char *version_value); 1831bb670123SJiri Pirko int devlink_info_version_running_put_ext(struct devlink_info_req *req, 1832bb670123SJiri Pirko const char *version_name, 1833bb670123SJiri Pirko const char *version_value, 1834bb670123SJiri Pirko enum devlink_info_version_type version_type); 1835d9f9b9a4SArkadi Sharshevsky 18361db64e87SEran Ben Elisha int devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg); 18371db64e87SEran Ben Elisha int devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg); 18381db64e87SEran Ben Elisha 18391db64e87SEran Ben Elisha int devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name); 18401db64e87SEran Ben Elisha int devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg); 18411db64e87SEran Ben Elisha 18421db64e87SEran Ben Elisha int devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg, 18431db64e87SEran Ben Elisha const char *name); 18441db64e87SEran Ben Elisha int devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg); 1845573ed90aSAya Levin int devlink_fmsg_binary_pair_nest_start(struct devlink_fmsg *fmsg, 1846573ed90aSAya Levin const char *name); 1847573ed90aSAya Levin int devlink_fmsg_binary_pair_nest_end(struct devlink_fmsg *fmsg); 18481db64e87SEran Ben Elisha 18491db64e87SEran Ben Elisha int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value); 18501db64e87SEran Ben Elisha int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value); 1851573ed90aSAya Levin int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value, 1852573ed90aSAya Levin u16 value_len); 18531db64e87SEran Ben Elisha 18541db64e87SEran Ben Elisha int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name, 18551db64e87SEran Ben Elisha bool value); 18561db64e87SEran Ben Elisha int devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name, 18571db64e87SEran Ben Elisha u8 value); 18581db64e87SEran Ben Elisha int devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name, 18591db64e87SEran Ben Elisha u32 value); 18601db64e87SEran Ben Elisha int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name, 18611db64e87SEran Ben Elisha u64 value); 18621db64e87SEran Ben Elisha int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name, 18631db64e87SEran Ben Elisha const char *value); 18641db64e87SEran Ben Elisha int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name, 1865e2cde864SAya Levin const void *value, u32 value_len); 18661db64e87SEran Ben Elisha 1867a0bdcc59SEran Ben Elisha struct devlink_health_reporter * 1868*dfdfd130SJiri Pirko devl_port_health_reporter_create(struct devlink_port *port, 1869a0bdcc59SEran Ben Elisha const struct devlink_health_reporter_ops *ops, 1870ba7d16c7SEran Ben Elisha u64 graceful_period, void *priv); 187115c724b9SVladyslav Tarasiuk 187215c724b9SVladyslav Tarasiuk struct devlink_health_reporter * 187315c724b9SVladyslav Tarasiuk devlink_port_health_reporter_create(struct devlink_port *port, 187415c724b9SVladyslav Tarasiuk const struct devlink_health_reporter_ops *ops, 187515c724b9SVladyslav Tarasiuk u64 graceful_period, void *priv); 187615c724b9SVladyslav Tarasiuk 1877*dfdfd130SJiri Pirko struct devlink_health_reporter * 1878*dfdfd130SJiri Pirko devl_health_reporter_create(struct devlink *devlink, 1879*dfdfd130SJiri Pirko const struct devlink_health_reporter_ops *ops, 1880*dfdfd130SJiri Pirko u64 graceful_period, void *priv); 1881*dfdfd130SJiri Pirko 1882*dfdfd130SJiri Pirko struct devlink_health_reporter * 1883*dfdfd130SJiri Pirko devlink_health_reporter_create(struct devlink *devlink, 1884*dfdfd130SJiri Pirko const struct devlink_health_reporter_ops *ops, 1885*dfdfd130SJiri Pirko u64 graceful_period, void *priv); 1886*dfdfd130SJiri Pirko 1887*dfdfd130SJiri Pirko void 1888*dfdfd130SJiri Pirko devl_health_reporter_destroy(struct devlink_health_reporter *reporter); 1889*dfdfd130SJiri Pirko 1890a0bdcc59SEran Ben Elisha void 1891a0bdcc59SEran Ben Elisha devlink_health_reporter_destroy(struct devlink_health_reporter *reporter); 1892a0bdcc59SEran Ben Elisha 189315c724b9SVladyslav Tarasiuk void 1894*dfdfd130SJiri Pirko devl_port_health_reporter_destroy(struct devlink_health_reporter *reporter); 1895*dfdfd130SJiri Pirko 1896*dfdfd130SJiri Pirko void 189715c724b9SVladyslav Tarasiuk devlink_port_health_reporter_destroy(struct devlink_health_reporter *reporter); 189815c724b9SVladyslav Tarasiuk 1899a0bdcc59SEran Ben Elisha void * 1900a0bdcc59SEran Ben Elisha devlink_health_reporter_priv(struct devlink_health_reporter *reporter); 1901c8e1da0bSEran Ben Elisha int devlink_health_report(struct devlink_health_reporter *reporter, 1902c8e1da0bSEran Ben Elisha const char *msg, void *priv_ctx); 19033167b27aSEran Ben Elisha void 19043167b27aSEran Ben Elisha devlink_health_reporter_state_update(struct devlink_health_reporter *reporter, 19053167b27aSEran Ben Elisha enum devlink_health_reporter_state state); 19066181e5cbSVikas Gupta void 19076181e5cbSVikas Gupta devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter); 1908a0bdcc59SEran Ben Elisha 19092670ac26SJiri Pirko bool devlink_is_reload_failed(const struct devlink *devlink); 191077069ba2SMoshe Shemesh void devlink_remote_reload_actions_performed(struct devlink *devlink, 191177069ba2SMoshe Shemesh enum devlink_reload_limit limit, 191277069ba2SMoshe Shemesh u32 actions_performed); 19132670ac26SJiri Pirko 1914191ed202SJiri Pirko void devlink_flash_update_status_notify(struct devlink *devlink, 1915191ed202SJiri Pirko const char *status_msg, 1916191ed202SJiri Pirko const char *component, 1917191ed202SJiri Pirko unsigned long done, 1918191ed202SJiri Pirko unsigned long total); 1919f92970c6SShannon Nelson void devlink_flash_update_timeout_notify(struct devlink *devlink, 1920f92970c6SShannon Nelson const char *status_msg, 1921f92970c6SShannon Nelson const char *component, 1922f92970c6SShannon Nelson unsigned long timeout); 1923191ed202SJiri Pirko 1924852e85a7SJiri Pirko int devl_traps_register(struct devlink *devlink, 1925852e85a7SJiri Pirko const struct devlink_trap *traps, 1926852e85a7SJiri Pirko size_t traps_count, void *priv); 19270f420b6cSIdo Schimmel int devlink_traps_register(struct devlink *devlink, 19280f420b6cSIdo Schimmel const struct devlink_trap *traps, 19290f420b6cSIdo Schimmel size_t traps_count, void *priv); 1930852e85a7SJiri Pirko void devl_traps_unregister(struct devlink *devlink, 1931852e85a7SJiri Pirko const struct devlink_trap *traps, 1932852e85a7SJiri Pirko size_t traps_count); 19330f420b6cSIdo Schimmel void devlink_traps_unregister(struct devlink *devlink, 19340f420b6cSIdo Schimmel const struct devlink_trap *traps, 19350f420b6cSIdo Schimmel size_t traps_count); 19365a2e106cSJiri Pirko void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb, 19375a2e106cSJiri Pirko void *trap_ctx, struct devlink_port *in_devlink_port, 19385a2e106cSJiri Pirko const struct flow_action_cookie *fa_cookie); 19390f420b6cSIdo Schimmel void *devlink_trap_ctx_priv(void *trap_ctx); 1940852e85a7SJiri Pirko int devl_trap_groups_register(struct devlink *devlink, 1941852e85a7SJiri Pirko const struct devlink_trap_group *groups, 1942852e85a7SJiri Pirko size_t groups_count); 194395ad9555SIdo Schimmel int devlink_trap_groups_register(struct devlink *devlink, 194495ad9555SIdo Schimmel const struct devlink_trap_group *groups, 194595ad9555SIdo Schimmel size_t groups_count); 1946852e85a7SJiri Pirko void devl_trap_groups_unregister(struct devlink *devlink, 1947852e85a7SJiri Pirko const struct devlink_trap_group *groups, 1948852e85a7SJiri Pirko size_t groups_count); 194995ad9555SIdo Schimmel void devlink_trap_groups_unregister(struct devlink *devlink, 195095ad9555SIdo Schimmel const struct devlink_trap_group *groups, 195195ad9555SIdo Schimmel size_t groups_count); 19521e8c6619SIdo Schimmel int 1953852e85a7SJiri Pirko devl_trap_policers_register(struct devlink *devlink, 1954852e85a7SJiri Pirko const struct devlink_trap_policer *policers, 1955852e85a7SJiri Pirko size_t policers_count); 19561e8c6619SIdo Schimmel void 1957852e85a7SJiri Pirko devl_trap_policers_unregister(struct devlink *devlink, 1958852e85a7SJiri Pirko const struct devlink_trap_policer *policers, 1959852e85a7SJiri Pirko size_t policers_count); 19600f420b6cSIdo Schimmel 1961f6b19b35SJiri Pirko #if IS_ENABLED(CONFIG_NET_DEVLINK) 1962f6b19b35SJiri Pirko 196346db1b77SJakub Kicinski struct devlink *__must_check devlink_try_get(struct devlink *devlink); 196446db1b77SJakub Kicinski void devlink_put(struct devlink *devlink); 196546db1b77SJakub Kicinski 19661af0a094SJakub Kicinski void devlink_compat_running_version(struct devlink *devlink, 1967f4b6bcc7SJakub Kicinski char *buf, size_t len); 19681af0a094SJakub Kicinski int devlink_compat_flash_update(struct devlink *devlink, const char *file_name); 1969af3836dfSJiri Pirko int devlink_compat_phys_port_name_get(struct net_device *dev, 1970af3836dfSJiri Pirko char *name, size_t len); 19717e1146e8SJiri Pirko int devlink_compat_switch_id_get(struct net_device *dev, 19727e1146e8SJiri Pirko struct netdev_phys_item_id *ppid); 1973f4b6bcc7SJakub Kicinski 1974dca56c30SJiri Pirko int devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port); 1975dca56c30SJiri Pirko size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port); 1976dca56c30SJiri Pirko 1977bfcd3a46SJiri Pirko #else 1978bfcd3a46SJiri Pirko 197946db1b77SJakub Kicinski static inline struct devlink *devlink_try_get(struct devlink *devlink) 198046db1b77SJakub Kicinski { 198146db1b77SJakub Kicinski return NULL; 198246db1b77SJakub Kicinski } 198346db1b77SJakub Kicinski 198446db1b77SJakub Kicinski static inline void devlink_put(struct devlink *devlink) 198546db1b77SJakub Kicinski { 198646db1b77SJakub Kicinski } 198746db1b77SJakub Kicinski 19883167b27aSEran Ben Elisha static inline void 19891af0a094SJakub Kicinski devlink_compat_running_version(struct devlink *devlink, char *buf, size_t len) 1990ddb6e99eSJakub Kicinski { 1991ddb6e99eSJakub Kicinski } 19924eceba17SJakub Kicinski 19934eceba17SJakub Kicinski static inline int 19941af0a094SJakub Kicinski devlink_compat_flash_update(struct devlink *devlink, const char *file_name) 19954eceba17SJakub Kicinski { 19964eceba17SJakub Kicinski return -EOPNOTSUPP; 19974eceba17SJakub Kicinski } 1998f6b19b35SJiri Pirko 1999af3836dfSJiri Pirko static inline int 2000af3836dfSJiri Pirko devlink_compat_phys_port_name_get(struct net_device *dev, 2001af3836dfSJiri Pirko char *name, size_t len) 2002af3836dfSJiri Pirko { 2003af3836dfSJiri Pirko return -EOPNOTSUPP; 2004af3836dfSJiri Pirko } 2005af3836dfSJiri Pirko 20067e1146e8SJiri Pirko static inline int 20077e1146e8SJiri Pirko devlink_compat_switch_id_get(struct net_device *dev, 20087e1146e8SJiri Pirko struct netdev_phys_item_id *ppid) 20097e1146e8SJiri Pirko { 20107e1146e8SJiri Pirko return -EOPNOTSUPP; 20117e1146e8SJiri Pirko } 20127e1146e8SJiri Pirko 2013dca56c30SJiri Pirko static inline int 2014dca56c30SJiri Pirko devlink_nl_port_handle_fill(struct sk_buff *msg, struct devlink_port *devlink_port) 2015dca56c30SJiri Pirko { 2016dca56c30SJiri Pirko return 0; 2017dca56c30SJiri Pirko } 2018dca56c30SJiri Pirko 2019dca56c30SJiri Pirko static inline size_t devlink_nl_port_handle_size(struct devlink_port *devlink_port) 2020dca56c30SJiri Pirko { 2021dca56c30SJiri Pirko return 0; 2022dca56c30SJiri Pirko } 2023dca56c30SJiri Pirko 2024ddb6e99eSJakub Kicinski #endif 2025ddb6e99eSJakub Kicinski 2026bfcd3a46SJiri Pirko #endif /* _NET_DEVLINK_H_ */ 2027