devlink.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  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. #include <linux/device.h>
  14. #include <linux/slab.h>
  15. #include <linux/gfp.h>
  16. #include <linux/list.h>
  17. #include <linux/netdevice.h>
  18. #include <net/net_namespace.h>
  19. #include <uapi/linux/devlink.h>
  20. struct devlink_ops;
  21. struct devlink {
  22. struct list_head list;
  23. struct list_head port_list;
  24. struct list_head sb_list;
  25. const struct devlink_ops *ops;
  26. struct device *dev;
  27. possible_net_t _net;
  28. char priv[0] __aligned(NETDEV_ALIGN);
  29. };
  30. struct devlink_port {
  31. struct list_head list;
  32. struct devlink *devlink;
  33. unsigned index;
  34. bool registered;
  35. enum devlink_port_type type;
  36. enum devlink_port_type desired_type;
  37. void *type_dev;
  38. bool split;
  39. u32 split_group;
  40. };
  41. struct devlink_sb_pool_info {
  42. enum devlink_sb_pool_type pool_type;
  43. u32 size;
  44. enum devlink_sb_threshold_type threshold_type;
  45. };
  46. struct devlink_ops {
  47. size_t priv_size;
  48. int (*port_type_set)(struct devlink_port *devlink_port,
  49. enum devlink_port_type port_type);
  50. int (*port_split)(struct devlink *devlink, unsigned int port_index,
  51. unsigned int count);
  52. int (*port_unsplit)(struct devlink *devlink, unsigned int port_index);
  53. int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index,
  54. u16 pool_index,
  55. struct devlink_sb_pool_info *pool_info);
  56. int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index,
  57. u16 pool_index, u32 size,
  58. enum devlink_sb_threshold_type threshold_type);
  59. int (*sb_port_pool_get)(struct devlink_port *devlink_port,
  60. unsigned int sb_index, u16 pool_index,
  61. u32 *p_threshold);
  62. int (*sb_port_pool_set)(struct devlink_port *devlink_port,
  63. unsigned int sb_index, u16 pool_index,
  64. u32 threshold);
  65. int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port,
  66. unsigned int sb_index,
  67. u16 tc_index,
  68. enum devlink_sb_pool_type pool_type,
  69. u16 *p_pool_index, u32 *p_threshold);
  70. int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port,
  71. unsigned int sb_index,
  72. u16 tc_index,
  73. enum devlink_sb_pool_type pool_type,
  74. u16 pool_index, u32 threshold);
  75. int (*sb_occ_snapshot)(struct devlink *devlink,
  76. unsigned int sb_index);
  77. int (*sb_occ_max_clear)(struct devlink *devlink,
  78. unsigned int sb_index);
  79. int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port,
  80. unsigned int sb_index, u16 pool_index,
  81. u32 *p_cur, u32 *p_max);
  82. int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port,
  83. unsigned int sb_index,
  84. u16 tc_index,
  85. enum devlink_sb_pool_type pool_type,
  86. u32 *p_cur, u32 *p_max);
  87. };
  88. static inline void *devlink_priv(struct devlink *devlink)
  89. {
  90. BUG_ON(!devlink);
  91. return &devlink->priv;
  92. }
  93. static inline struct devlink *priv_to_devlink(void *priv)
  94. {
  95. BUG_ON(!priv);
  96. return container_of(priv, struct devlink, priv);
  97. }
  98. struct ib_device;
  99. #if IS_ENABLED(CONFIG_NET_DEVLINK)
  100. struct devlink *devlink_alloc(const struct devlink_ops *ops, size_t priv_size);
  101. int devlink_register(struct devlink *devlink, struct device *dev);
  102. void devlink_unregister(struct devlink *devlink);
  103. void devlink_free(struct devlink *devlink);
  104. int devlink_port_register(struct devlink *devlink,
  105. struct devlink_port *devlink_port,
  106. unsigned int port_index);
  107. void devlink_port_unregister(struct devlink_port *devlink_port);
  108. void devlink_port_type_eth_set(struct devlink_port *devlink_port,
  109. struct net_device *netdev);
  110. void devlink_port_type_ib_set(struct devlink_port *devlink_port,
  111. struct ib_device *ibdev);
  112. void devlink_port_type_clear(struct devlink_port *devlink_port);
  113. void devlink_port_split_set(struct devlink_port *devlink_port,
  114. u32 split_group);
  115. int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
  116. u32 size, u16 ingress_pools_count,
  117. u16 egress_pools_count, u16 ingress_tc_count,
  118. u16 egress_tc_count);
  119. void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index);
  120. #else
  121. static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
  122. size_t priv_size)
  123. {
  124. return kzalloc(sizeof(struct devlink) + priv_size, GFP_KERNEL);
  125. }
  126. static inline int devlink_register(struct devlink *devlink, struct device *dev)
  127. {
  128. return 0;
  129. }
  130. static inline void devlink_unregister(struct devlink *devlink)
  131. {
  132. }
  133. static inline void devlink_free(struct devlink *devlink)
  134. {
  135. kfree(devlink);
  136. }
  137. static inline int devlink_port_register(struct devlink *devlink,
  138. struct devlink_port *devlink_port,
  139. unsigned int port_index)
  140. {
  141. return 0;
  142. }
  143. static inline void devlink_port_unregister(struct devlink_port *devlink_port)
  144. {
  145. }
  146. static inline void devlink_port_type_eth_set(struct devlink_port *devlink_port,
  147. struct net_device *netdev)
  148. {
  149. }
  150. static inline void devlink_port_type_ib_set(struct devlink_port *devlink_port,
  151. struct ib_device *ibdev)
  152. {
  153. }
  154. static inline void devlink_port_type_clear(struct devlink_port *devlink_port)
  155. {
  156. }
  157. static inline void devlink_port_split_set(struct devlink_port *devlink_port,
  158. u32 split_group)
  159. {
  160. }
  161. static inline int devlink_sb_register(struct devlink *devlink,
  162. unsigned int sb_index, u32 size,
  163. u16 ingress_pools_count,
  164. u16 egress_pools_count,
  165. u16 ingress_tc_count,
  166. u16 egress_tc_count)
  167. {
  168. return 0;
  169. }
  170. static inline void devlink_sb_unregister(struct devlink *devlink,
  171. unsigned int sb_index)
  172. {
  173. }
  174. #endif
  175. #endif /* _NET_DEVLINK_H_ */