at v4.8 6.0 kB view raw
1/* 2 * include/net/devlink.h - Network physical device Netlink interface 3 * Copyright (c) 2016 Mellanox Technologies. All rights reserved. 4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 */ 11#ifndef _NET_DEVLINK_H_ 12#define _NET_DEVLINK_H_ 13 14#include <linux/device.h> 15#include <linux/slab.h> 16#include <linux/gfp.h> 17#include <linux/list.h> 18#include <linux/netdevice.h> 19#include <net/net_namespace.h> 20#include <uapi/linux/devlink.h> 21 22struct devlink_ops; 23 24struct devlink { 25 struct list_head list; 26 struct list_head port_list; 27 struct list_head sb_list; 28 const struct devlink_ops *ops; 29 struct device *dev; 30 possible_net_t _net; 31 char priv[0] __aligned(NETDEV_ALIGN); 32}; 33 34struct devlink_port { 35 struct list_head list; 36 struct devlink *devlink; 37 unsigned index; 38 bool registered; 39 enum devlink_port_type type; 40 enum devlink_port_type desired_type; 41 void *type_dev; 42 bool split; 43 u32 split_group; 44}; 45 46struct devlink_sb_pool_info { 47 enum devlink_sb_pool_type pool_type; 48 u32 size; 49 enum devlink_sb_threshold_type threshold_type; 50}; 51 52struct devlink_ops { 53 size_t priv_size; 54 int (*port_type_set)(struct devlink_port *devlink_port, 55 enum devlink_port_type port_type); 56 int (*port_split)(struct devlink *devlink, unsigned int port_index, 57 unsigned int count); 58 int (*port_unsplit)(struct devlink *devlink, unsigned int port_index); 59 int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index, 60 u16 pool_index, 61 struct devlink_sb_pool_info *pool_info); 62 int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index, 63 u16 pool_index, u32 size, 64 enum devlink_sb_threshold_type threshold_type); 65 int (*sb_port_pool_get)(struct devlink_port *devlink_port, 66 unsigned int sb_index, u16 pool_index, 67 u32 *p_threshold); 68 int (*sb_port_pool_set)(struct devlink_port *devlink_port, 69 unsigned int sb_index, u16 pool_index, 70 u32 threshold); 71 int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port, 72 unsigned int sb_index, 73 u16 tc_index, 74 enum devlink_sb_pool_type pool_type, 75 u16 *p_pool_index, u32 *p_threshold); 76 int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port, 77 unsigned int sb_index, 78 u16 tc_index, 79 enum devlink_sb_pool_type pool_type, 80 u16 pool_index, u32 threshold); 81 int (*sb_occ_snapshot)(struct devlink *devlink, 82 unsigned int sb_index); 83 int (*sb_occ_max_clear)(struct devlink *devlink, 84 unsigned int sb_index); 85 int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port, 86 unsigned int sb_index, u16 pool_index, 87 u32 *p_cur, u32 *p_max); 88 int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port, 89 unsigned int sb_index, 90 u16 tc_index, 91 enum devlink_sb_pool_type pool_type, 92 u32 *p_cur, u32 *p_max); 93 94 int (*eswitch_mode_get)(struct devlink *devlink, u16 *p_mode); 95 int (*eswitch_mode_set)(struct devlink *devlink, u16 mode); 96}; 97 98static inline void *devlink_priv(struct devlink *devlink) 99{ 100 BUG_ON(!devlink); 101 return &devlink->priv; 102} 103 104static inline struct devlink *priv_to_devlink(void *priv) 105{ 106 BUG_ON(!priv); 107 return container_of(priv, struct devlink, priv); 108} 109 110struct ib_device; 111 112#if IS_ENABLED(CONFIG_NET_DEVLINK) 113 114struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size); 115int devlink_register(struct devlink *devlink, struct device *dev); 116void devlink_unregister(struct devlink *devlink); 117void devlink_free(struct devlink *devlink); 118int devlink_port_register(struct devlink *devlink, 119 struct devlink_port *devlink_port, 120 unsigned int port_index); 121void devlink_port_unregister(struct devlink_port *devlink_port); 122void devlink_port_type_eth_set(struct devlink_port *devlink_port, 123 struct net_device *netdev); 124void devlink_port_type_ib_set(struct devlink_port *devlink_port, 125 struct ib_device *ibdev); 126void devlink_port_type_clear(struct devlink_port *devlink_port); 127void devlink_port_split_set(struct devlink_port *devlink_port, 128 u32 split_group); 129int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, 130 u32 size, u16 ingress_pools_count, 131 u16 egress_pools_count, u16 ingress_tc_count, 132 u16 egress_tc_count); 133void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index); 134 135#else 136 137static inline struct devlink *devlink_alloc(const struct devlink_ops *ops, 138 size_t priv_size) 139{ 140 return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL); 141} 142 143static inline int devlink_register(struct devlink *devlink, struct device *dev) 144{ 145 return 0; 146} 147 148static inline void devlink_unregister(struct devlink *devlink) 149{ 150} 151 152static inline void devlink_free(struct devlink *devlink) 153{ 154 kfree(devlink); 155} 156 157static inline int devlink_port_register(struct devlink *devlink, 158 struct devlink_port *devlink_port, 159 unsigned int port_index) 160{ 161 return 0; 162} 163 164static inline void devlink_port_unregister(struct devlink_port *devlink_port) 165{ 166} 167 168static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port, 169 struct net_device *netdev) 170{ 171} 172 173static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port, 174 struct ib_device *ibdev) 175{ 176} 177 178static inline void devlink_port_type_clear(struct devlink_port *devlink_port) 179{ 180} 181 182static inline void devlink_port_split_set(struct devlink_port *devlink_port, 183 u32 split_group) 184{ 185} 186 187static inline int devlink_sb_register(struct devlink *devlink, 188 unsigned int sb_index, u32 size, 189 u16 ingress_pools_count, 190 u16 egress_pools_count, 191 u16 ingress_tc_count, 192 u16 egress_tc_count) 193{ 194 return 0; 195} 196 197static inline void devlink_sb_unregister(struct devlink *devlink, 198 unsigned int sb_index) 199{ 200} 201 202#endif 203 204#endif /* _NET_DEVLINK_H_ */