2016-02-26 19:32:23 +03:00
/*
* include / net / devlink . h - Network physical device Netlink interface
* Copyright ( c ) 2016 Mellanox Technologies . All rights reserved .
* Copyright ( c ) 2016 Jiri Pirko < jiri @ mellanox . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*/
# ifndef _NET_DEVLINK_H_
# define _NET_DEVLINK_H_
# include <linux/device.h>
# include <linux/slab.h>
# include <linux/gfp.h>
# include <linux/list.h>
# include <linux/netdevice.h>
# include <net/net_namespace.h>
# include <uapi/linux/devlink.h>
struct devlink_ops ;
struct devlink {
struct list_head list ;
struct list_head port_list ;
2016-04-14 19:19:13 +03:00
struct list_head sb_list ;
2016-02-26 19:32:23 +03:00
const struct devlink_ops * ops ;
struct device * dev ;
possible_net_t _net ;
char priv [ 0 ] __aligned ( NETDEV_ALIGN ) ;
} ;
struct devlink_port {
struct list_head list ;
struct devlink * devlink ;
unsigned index ;
bool registered ;
enum devlink_port_type type ;
enum devlink_port_type desired_type ;
void * type_dev ;
bool split ;
u32 split_group ;
} ;
2016-04-14 19:19:13 +03:00
struct devlink_sb_pool_info {
enum devlink_sb_pool_type pool_type ;
u32 size ;
enum devlink_sb_threshold_type threshold_type ;
} ;
2016-02-26 19:32:23 +03:00
struct devlink_ops {
int ( * port_type_set ) ( struct devlink_port * devlink_port ,
enum devlink_port_type port_type ) ;
int ( * port_split ) ( struct devlink * devlink , unsigned int port_index ,
unsigned int count ) ;
int ( * port_unsplit ) ( struct devlink * devlink , unsigned int port_index ) ;
2016-04-14 19:19:13 +03:00
int ( * sb_pool_get ) ( struct devlink * devlink , unsigned int sb_index ,
u16 pool_index ,
struct devlink_sb_pool_info * pool_info ) ;
int ( * sb_pool_set ) ( struct devlink * devlink , unsigned int sb_index ,
u16 pool_index , u32 size ,
enum devlink_sb_threshold_type threshold_type ) ;
int ( * sb_port_pool_get ) ( struct devlink_port * devlink_port ,
unsigned int sb_index , u16 pool_index ,
u32 * p_threshold ) ;
int ( * sb_port_pool_set ) ( struct devlink_port * devlink_port ,
unsigned int sb_index , u16 pool_index ,
u32 threshold ) ;
int ( * sb_tc_pool_bind_get ) ( struct devlink_port * devlink_port ,
unsigned int sb_index ,
u16 tc_index ,
enum devlink_sb_pool_type pool_type ,
u16 * p_pool_index , u32 * p_threshold ) ;
int ( * sb_tc_pool_bind_set ) ( struct devlink_port * devlink_port ,
unsigned int sb_index ,
u16 tc_index ,
enum devlink_sb_pool_type pool_type ,
u16 pool_index , u32 threshold ) ;
2016-04-14 19:19:14 +03:00
int ( * sb_occ_snapshot ) ( struct devlink * devlink ,
unsigned int sb_index ) ;
int ( * sb_occ_max_clear ) ( struct devlink * devlink ,
unsigned int sb_index ) ;
int ( * sb_occ_port_pool_get ) ( struct devlink_port * devlink_port ,
unsigned int sb_index , u16 pool_index ,
u32 * p_cur , u32 * p_max ) ;
int ( * sb_occ_tc_port_bind_get ) ( struct devlink_port * devlink_port ,
unsigned int sb_index ,
u16 tc_index ,
enum devlink_sb_pool_type pool_type ,
u32 * p_cur , u32 * p_max ) ;
2016-07-01 14:51:01 +03:00
int ( * eswitch_mode_get ) ( struct devlink * devlink , u16 * p_mode ) ;
int ( * eswitch_mode_set ) ( struct devlink * devlink , u16 mode ) ;
2016-02-26 19:32:23 +03:00
} ;
static inline void * devlink_priv ( struct devlink * devlink )
{
BUG_ON ( ! devlink ) ;
return & devlink - > priv ;
}
static inline struct devlink * priv_to_devlink ( void * priv )
{
BUG_ON ( ! priv ) ;
return container_of ( priv , struct devlink , priv ) ;
}
struct ib_device ;
# if IS_ENABLED(CONFIG_NET_DEVLINK)
struct devlink * devlink_alloc ( const struct devlink_ops * ops , size_t priv_size ) ;
int devlink_register ( struct devlink * devlink , struct device * dev ) ;
void devlink_unregister ( struct devlink * devlink ) ;
void devlink_free ( struct devlink * devlink ) ;
int devlink_port_register ( struct devlink * devlink ,
struct devlink_port * devlink_port ,
unsigned int port_index ) ;
void devlink_port_unregister ( struct devlink_port * devlink_port ) ;
void devlink_port_type_eth_set ( struct devlink_port * devlink_port ,
struct net_device * netdev ) ;
void devlink_port_type_ib_set ( struct devlink_port * devlink_port ,
struct ib_device * ibdev ) ;
void devlink_port_type_clear ( struct devlink_port * devlink_port ) ;
void devlink_port_split_set ( struct devlink_port * devlink_port ,
u32 split_group ) ;
2016-04-14 19:19:13 +03:00
int devlink_sb_register ( struct devlink * devlink , unsigned int sb_index ,
u32 size , u16 ingress_pools_count ,
u16 egress_pools_count , u16 ingress_tc_count ,
u16 egress_tc_count ) ;
void devlink_sb_unregister ( struct devlink * devlink , unsigned int sb_index ) ;
2016-02-26 19:32:23 +03:00
# else
static inline struct devlink * devlink_alloc ( const struct devlink_ops * ops ,
size_t priv_size )
{
return kzalloc ( sizeof ( struct devlink ) + priv_size , GFP_KERNEL ) ;
}
static inline int devlink_register ( struct devlink * devlink , struct device * dev )
{
return 0 ;
}
static inline void devlink_unregister ( struct devlink * devlink )
{
}
static inline void devlink_free ( struct devlink * devlink )
{
kfree ( devlink ) ;
}
static inline int devlink_port_register ( struct devlink * devlink ,
struct devlink_port * devlink_port ,
unsigned int port_index )
{
return 0 ;
}
static inline void devlink_port_unregister ( struct devlink_port * devlink_port )
{
}
static inline void devlink_port_type_eth_set ( struct devlink_port * devlink_port ,
struct net_device * netdev )
{
}
static inline void devlink_port_type_ib_set ( struct devlink_port * devlink_port ,
struct ib_device * ibdev )
{
}
static inline void devlink_port_type_clear ( struct devlink_port * devlink_port )
{
}
static inline void devlink_port_split_set ( struct devlink_port * devlink_port ,
u32 split_group )
{
}
2016-04-14 19:19:13 +03:00
static inline int devlink_sb_register ( struct devlink * devlink ,
unsigned int sb_index , u32 size ,
u16 ingress_pools_count ,
2016-04-15 10:17:08 +03:00
u16 egress_pools_count ,
u16 ingress_tc_count ,
u16 egress_tc_count )
2016-04-14 19:19:13 +03:00
{
return 0 ;
}
static inline void devlink_sb_unregister ( struct devlink * devlink ,
unsigned int sb_index )
{
}
2016-02-26 19:32:23 +03:00
# endif
# endif /* _NET_DEVLINK_H_ */