]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/mellanox/mlxsw/core.c
mlxsw: core: Add devlink shared buffer callbacks
[karo-tx-linux.git] / drivers / net / ethernet / mellanox / mlxsw / core.c
index 3958195526d1557689fc1a945ee8abef9c509659..1278260118a41072ca1a464129ca8c86c1bf5351 100644 (file)
@@ -816,9 +816,110 @@ static int mlxsw_devlink_port_unsplit(struct devlink *devlink,
        return mlxsw_core->driver->port_unsplit(mlxsw_core, port_index);
 }
 
+static int
+mlxsw_devlink_sb_pool_get(struct devlink *devlink,
+                         unsigned int sb_index, u16 pool_index,
+                         struct devlink_sb_pool_info *pool_info)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+
+       if (!mlxsw_driver->sb_pool_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_pool_get(mlxsw_core, sb_index,
+                                        pool_index, pool_info);
+}
+
+static int
+mlxsw_devlink_sb_pool_set(struct devlink *devlink,
+                         unsigned int sb_index, u16 pool_index, u32 size,
+                         enum devlink_sb_threshold_type threshold_type)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+
+       if (!mlxsw_driver->sb_pool_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_pool_set(mlxsw_core, sb_index,
+                                        pool_index, size, threshold_type);
+}
+
+static void *__dl_port(struct devlink_port *devlink_port)
+{
+       return container_of(devlink_port, struct mlxsw_core_port, devlink_port);
+}
+
+static int mlxsw_devlink_sb_port_pool_get(struct devlink_port *devlink_port,
+                                         unsigned int sb_index, u16 pool_index,
+                                         u32 *p_threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_port_pool_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_port_pool_get(mlxsw_core_port, sb_index,
+                                             pool_index, p_threshold);
+}
+
+static int mlxsw_devlink_sb_port_pool_set(struct devlink_port *devlink_port,
+                                         unsigned int sb_index, u16 pool_index,
+                                         u32 threshold)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_port_pool_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_port_pool_set(mlxsw_core_port, sb_index,
+                                             pool_index, threshold);
+}
+
+static int
+mlxsw_devlink_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)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_tc_pool_bind_get)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_tc_pool_bind_get(mlxsw_core_port, sb_index,
+                                                tc_index, pool_type,
+                                                p_pool_index, p_threshold);
+}
+
+static int
+mlxsw_devlink_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)
+{
+       struct mlxsw_core *mlxsw_core = devlink_priv(devlink_port->devlink);
+       struct mlxsw_driver *mlxsw_driver = mlxsw_core->driver;
+       struct mlxsw_core_port *mlxsw_core_port = __dl_port(devlink_port);
+
+       if (!mlxsw_driver->sb_tc_pool_bind_set)
+               return -EOPNOTSUPP;
+       return mlxsw_driver->sb_tc_pool_bind_set(mlxsw_core_port, sb_index,
+                                                tc_index, pool_type,
+                                                pool_index, threshold);
+}
+
 static const struct devlink_ops mlxsw_devlink_ops = {
-       .port_split     = mlxsw_devlink_port_split,
-       .port_unsplit   = mlxsw_devlink_port_unsplit,
+       .port_split             = mlxsw_devlink_port_split,
+       .port_unsplit           = mlxsw_devlink_port_unsplit,
+       .sb_pool_get            = mlxsw_devlink_sb_pool_get,
+       .sb_pool_set            = mlxsw_devlink_sb_pool_set,
+       .sb_port_pool_get       = mlxsw_devlink_sb_port_pool_get,
+       .sb_port_pool_set       = mlxsw_devlink_sb_port_pool_set,
+       .sb_tc_pool_bind_get    = mlxsw_devlink_sb_tc_pool_bind_get,
+       .sb_tc_pool_bind_set    = mlxsw_devlink_sb_tc_pool_bind_set,
 };
 
 int mlxsw_core_bus_device_register(const struct mlxsw_bus_info *mlxsw_bus_info,