Skip to content

Commit 63b9ce9

Browse files
Tariq ToukanSaeed Mahameed
authored andcommitted
net/mlx5: SD, Implement basic query and instantiation
Add implementation for querying the MPIR register for Socket-Direct attributes, and instantiating a SD struct accordingly. Signed-off-by: Tariq Toukan <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent 4a04a31 commit 63b9ce9

File tree

1 file changed

+106
-1
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core/lib

1 file changed

+106
-1
lines changed

drivers/net/ethernet/mellanox/mlx5/core/lib/sd.c

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,27 @@
33

44
#include "lib/sd.h"
55
#include "mlx5_core.h"
6+
#include "lib/mlx5.h"
7+
#include <linux/mlx5/vport.h>
68

79
#define sd_info(__dev, format, ...) \
810
dev_info((__dev)->device, "Socket-Direct: " format, ##__VA_ARGS__)
911
#define sd_warn(__dev, format, ...) \
1012
dev_warn((__dev)->device, "Socket-Direct: " format, ##__VA_ARGS__)
1113

1214
struct mlx5_sd {
15+
u32 group_id;
16+
u8 host_buses;
1317
};
1418

1519
static int mlx5_sd_get_host_buses(struct mlx5_core_dev *dev)
1620
{
17-
return 1;
21+
struct mlx5_sd *sd = mlx5_get_sd(dev);
22+
23+
if (!sd)
24+
return 1;
25+
26+
return sd->host_buses;
1827
}
1928

2029
struct mlx5_core_dev *
@@ -43,13 +52,109 @@ struct mlx5_core_dev *mlx5_sd_ch_ix_get_dev(struct mlx5_core_dev *primary, int c
4352
return mlx5_sd_primary_get_peer(primary, mdev_idx);
4453
}
4554

55+
static bool mlx5_sd_is_supported(struct mlx5_core_dev *dev, u8 host_buses)
56+
{
57+
/* Feature is currently implemented for PFs only */
58+
if (!mlx5_core_is_pf(dev))
59+
return false;
60+
61+
/* Honor the SW implementation limit */
62+
if (host_buses > MLX5_SD_MAX_GROUP_SZ)
63+
return false;
64+
65+
return true;
66+
}
67+
68+
static int mlx5_query_sd(struct mlx5_core_dev *dev, bool *sdm,
69+
u8 *host_buses, u8 *sd_group)
70+
{
71+
u32 out[MLX5_ST_SZ_DW(mpir_reg)];
72+
int err;
73+
74+
err = mlx5_query_mpir_reg(dev, out);
75+
if (err)
76+
return err;
77+
78+
err = mlx5_query_nic_vport_sd_group(dev, sd_group);
79+
if (err)
80+
return err;
81+
82+
*sdm = MLX5_GET(mpir_reg, out, sdm);
83+
*host_buses = MLX5_GET(mpir_reg, out, host_buses);
84+
85+
return 0;
86+
}
87+
88+
static u32 mlx5_sd_group_id(struct mlx5_core_dev *dev, u8 sd_group)
89+
{
90+
return (u32)((MLX5_CAP_GEN(dev, native_port_num) << 8) | sd_group);
91+
}
92+
93+
static int sd_init(struct mlx5_core_dev *dev)
94+
{
95+
u8 host_buses, sd_group;
96+
struct mlx5_sd *sd;
97+
u32 group_id;
98+
bool sdm;
99+
int err;
100+
101+
err = mlx5_query_sd(dev, &sdm, &host_buses, &sd_group);
102+
if (err)
103+
return err;
104+
105+
if (!sdm)
106+
return 0;
107+
108+
if (!sd_group)
109+
return 0;
110+
111+
group_id = mlx5_sd_group_id(dev, sd_group);
112+
113+
if (!mlx5_sd_is_supported(dev, host_buses)) {
114+
sd_warn(dev, "can't support requested netdev combining for group id 0x%x), skipping\n",
115+
group_id);
116+
return 0;
117+
}
118+
119+
sd = kzalloc(sizeof(*sd), GFP_KERNEL);
120+
if (!sd)
121+
return -ENOMEM;
122+
123+
sd->host_buses = host_buses;
124+
sd->group_id = group_id;
125+
126+
mlx5_set_sd(dev, sd);
127+
128+
return 0;
129+
}
130+
131+
static void sd_cleanup(struct mlx5_core_dev *dev)
132+
{
133+
struct mlx5_sd *sd = mlx5_get_sd(dev);
134+
135+
mlx5_set_sd(dev, NULL);
136+
kfree(sd);
137+
}
138+
46139
int mlx5_sd_init(struct mlx5_core_dev *dev)
47140
{
141+
int err;
142+
143+
err = sd_init(dev);
144+
if (err)
145+
return err;
146+
48147
return 0;
49148
}
50149

51150
void mlx5_sd_cleanup(struct mlx5_core_dev *dev)
52151
{
152+
struct mlx5_sd *sd = mlx5_get_sd(dev);
153+
154+
if (!sd)
155+
return;
156+
157+
sd_cleanup(dev);
53158
}
54159

55160
struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,

0 commit comments

Comments
 (0)