1/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2/* Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. */
3
4#ifndef __MLX5_LIB_SD_H__
5#define __MLX5_LIB_SD_H__
6
7#define MLX5_SD_MAX_GROUP_SZ 2
8
9struct mlx5_sd;
10
11struct mlx5_core_dev *mlx5_sd_primary_get_peer(struct mlx5_core_dev *primary, int idx);
12int mlx5_sd_ch_ix_get_dev_ix(struct mlx5_core_dev *dev, int ch_ix);
13int mlx5_sd_ch_ix_get_vec_ix(struct mlx5_core_dev *dev, int ch_ix);
14struct mlx5_core_dev *mlx5_sd_ch_ix_get_dev(struct mlx5_core_dev *primary, int ch_ix);
15struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,
16					  struct auxiliary_device *adev,
17					  int idx);
18
19int mlx5_sd_init(struct mlx5_core_dev *dev);
20void mlx5_sd_cleanup(struct mlx5_core_dev *dev);
21
22#define mlx5_sd_for_each_dev_from_to(i, primary, ix_from, to, pos)	\
23	for (i = ix_from;							\
24	     (pos = mlx5_sd_primary_get_peer(primary, i)) && pos != (to); i++)
25
26#define mlx5_sd_for_each_dev(i, primary, pos)				\
27	mlx5_sd_for_each_dev_from_to(i, primary, 0, NULL, pos)
28
29#define mlx5_sd_for_each_dev_to(i, primary, to, pos)			\
30	mlx5_sd_for_each_dev_from_to(i, primary, 0, to, pos)
31
32#define mlx5_sd_for_each_secondary(i, primary, pos)			\
33	mlx5_sd_for_each_dev_from_to(i, primary, 1, NULL, pos)
34
35#define mlx5_sd_for_each_secondary_to(i, primary, to, pos)		\
36	mlx5_sd_for_each_dev_from_to(i, primary, 1, to, pos)
37
38#endif /* __MLX5_LIB_SD_H__ */
39