4
4
#include "rqt.h"
5
5
#include <linux/mlx5/transobj.h>
6
6
7
+ static bool verify_num_vhca_ids (struct mlx5_core_dev * mdev , u32 * vhca_ids ,
8
+ unsigned int size )
9
+ {
10
+ unsigned int max_num_vhca_id = MLX5_CAP_GEN_2 (mdev , max_rqt_vhca_id );
11
+ int i ;
12
+
13
+ /* Verify that all vhca_ids are in range [0, max_num_vhca_ids - 1] */
14
+ for (i = 0 ; i < size ; i ++ )
15
+ if (vhca_ids [i ] >= max_num_vhca_id )
16
+ return false;
17
+ return true;
18
+ }
19
+
20
+ static bool rqt_verify_vhca_ids (struct mlx5_core_dev * mdev , u32 * vhca_ids ,
21
+ unsigned int size )
22
+ {
23
+ if (!vhca_ids )
24
+ return true;
25
+
26
+ if (!MLX5_CAP_GEN (mdev , cross_vhca_rqt ))
27
+ return false;
28
+ if (!verify_num_vhca_ids (mdev , vhca_ids , size ))
29
+ return false;
30
+
31
+ return true;
32
+ }
33
+
7
34
void mlx5e_rss_params_indir_init_uniform (struct mlx5e_rss_params_indir * indir ,
8
35
unsigned int num_channels )
9
36
{
@@ -13,30 +40,48 @@ void mlx5e_rss_params_indir_init_uniform(struct mlx5e_rss_params_indir *indir,
13
40
indir -> table [i ] = i % num_channels ;
14
41
}
15
42
43
+ static void fill_rqn_list (void * rqtc , u32 * rqns , u32 * vhca_ids , unsigned int size )
44
+ {
45
+ unsigned int i ;
46
+
47
+ if (vhca_ids ) {
48
+ MLX5_SET (rqtc , rqtc , rq_vhca_id_format , 1 );
49
+ for (i = 0 ; i < size ; i ++ ) {
50
+ MLX5_SET (rqtc , rqtc , rq_vhca [i ].rq_num , rqns [i ]);
51
+ MLX5_SET (rqtc , rqtc , rq_vhca [i ].rq_vhca_id , vhca_ids [i ]);
52
+ }
53
+ } else {
54
+ for (i = 0 ; i < size ; i ++ )
55
+ MLX5_SET (rqtc , rqtc , rq_num [i ], rqns [i ]);
56
+ }
57
+ }
16
58
static int mlx5e_rqt_init (struct mlx5e_rqt * rqt , struct mlx5_core_dev * mdev ,
17
- u16 max_size , u32 * init_rqns , u16 init_size )
59
+ u16 max_size , u32 * init_rqns , u32 * init_vhca_ids , u16 init_size )
18
60
{
61
+ int entry_sz ;
19
62
void * rqtc ;
20
63
int inlen ;
21
64
int err ;
22
65
u32 * in ;
23
- int i ;
66
+
67
+ if (!rqt_verify_vhca_ids (mdev , init_vhca_ids , init_size ))
68
+ return - EOPNOTSUPP ;
24
69
25
70
rqt -> mdev = mdev ;
26
71
rqt -> size = max_size ;
27
72
28
- inlen = MLX5_ST_SZ_BYTES (create_rqt_in ) + sizeof (u32 ) * init_size ;
73
+ entry_sz = init_vhca_ids ? MLX5_ST_SZ_BYTES (rq_vhca ) : MLX5_ST_SZ_BYTES (rq_num );
74
+ inlen = MLX5_ST_SZ_BYTES (create_rqt_in ) + entry_sz * init_size ;
29
75
in = kvzalloc (inlen , GFP_KERNEL );
30
76
if (!in )
31
77
return - ENOMEM ;
32
78
33
79
rqtc = MLX5_ADDR_OF (create_rqt_in , in , rqt_context );
34
80
35
81
MLX5_SET (rqtc , rqtc , rqt_max_size , rqt -> size );
36
-
37
82
MLX5_SET (rqtc , rqtc , rqt_actual_size , init_size );
38
- for ( i = 0 ; i < init_size ; i ++ )
39
- MLX5_SET (rqtc , rqtc , rq_num [ i ], init_rqns [ i ] );
83
+
84
+ fill_rqn_list (rqtc , init_rqns , init_vhca_ids , init_size );
40
85
41
86
err = mlx5_core_create_rqt (rqt -> mdev , in , inlen , & rqt -> rqtn );
42
87
@@ -49,7 +94,7 @@ int mlx5e_rqt_init_direct(struct mlx5e_rqt *rqt, struct mlx5_core_dev *mdev,
49
94
{
50
95
u16 max_size = indir_enabled ? indir_table_size : 1 ;
51
96
52
- return mlx5e_rqt_init (rqt , mdev , max_size , & init_rqn , 1 );
97
+ return mlx5e_rqt_init (rqt , mdev , max_size , & init_rqn , NULL , 1 );
53
98
}
54
99
55
100
static int mlx5e_bits_invert (unsigned long a , int size )
@@ -63,7 +108,8 @@ static int mlx5e_bits_invert(unsigned long a, int size)
63
108
return inv ;
64
109
}
65
110
66
- static int mlx5e_calc_indir_rqns (u32 * rss_rqns , u32 * rqns , unsigned int num_rqns ,
111
+ static int mlx5e_calc_indir_rqns (u32 * rss_rqns , u32 * rqns , u32 * rss_vhca_ids , u32 * vhca_ids ,
112
+ unsigned int num_rqns ,
67
113
u8 hfunc , struct mlx5e_rss_params_indir * indir )
68
114
{
69
115
unsigned int i ;
@@ -82,30 +128,42 @@ static int mlx5e_calc_indir_rqns(u32 *rss_rqns, u32 *rqns, unsigned int num_rqns
82
128
*/
83
129
return - EINVAL ;
84
130
rss_rqns [i ] = rqns [ix ];
131
+ if (vhca_ids )
132
+ rss_vhca_ids [i ] = vhca_ids [ix ];
85
133
}
86
134
87
135
return 0 ;
88
136
}
89
137
90
138
int mlx5e_rqt_init_indir (struct mlx5e_rqt * rqt , struct mlx5_core_dev * mdev ,
91
- u32 * rqns , unsigned int num_rqns ,
139
+ u32 * rqns , u32 * vhca_ids , unsigned int num_rqns ,
92
140
u8 hfunc , struct mlx5e_rss_params_indir * indir )
93
141
{
94
- u32 * rss_rqns ;
142
+ u32 * rss_rqns , * rss_vhca_ids = NULL ;
95
143
int err ;
96
144
97
145
rss_rqns = kvmalloc_array (indir -> actual_table_size , sizeof (* rss_rqns ), GFP_KERNEL );
98
146
if (!rss_rqns )
99
147
return - ENOMEM ;
100
148
101
- err = mlx5e_calc_indir_rqns (rss_rqns , rqns , num_rqns , hfunc , indir );
149
+ if (vhca_ids ) {
150
+ rss_vhca_ids = kvmalloc_array (indir -> actual_table_size , sizeof (* rss_vhca_ids ),
151
+ GFP_KERNEL );
152
+ if (!rss_vhca_ids ) {
153
+ kvfree (rss_rqns );
154
+ return - ENOMEM ;
155
+ }
156
+ }
157
+
158
+ err = mlx5e_calc_indir_rqns (rss_rqns , rqns , rss_vhca_ids , vhca_ids , num_rqns , hfunc , indir );
102
159
if (err )
103
160
goto out ;
104
161
105
- err = mlx5e_rqt_init (rqt , mdev , indir -> max_table_size , rss_rqns ,
162
+ err = mlx5e_rqt_init (rqt , mdev , indir -> max_table_size , rss_rqns , rss_vhca_ids ,
106
163
indir -> actual_table_size );
107
164
108
165
out :
166
+ kvfree (rss_vhca_ids );
109
167
kvfree (rss_rqns );
110
168
return err ;
111
169
}
@@ -126,15 +184,20 @@ void mlx5e_rqt_destroy(struct mlx5e_rqt *rqt)
126
184
mlx5_core_destroy_rqt (rqt -> mdev , rqt -> rqtn );
127
185
}
128
186
129
- static int mlx5e_rqt_redirect (struct mlx5e_rqt * rqt , u32 * rqns , unsigned int size )
187
+ static int mlx5e_rqt_redirect (struct mlx5e_rqt * rqt , u32 * rqns , u32 * vhca_ids ,
188
+ unsigned int size )
130
189
{
131
- unsigned int i ;
190
+ int entry_sz ;
132
191
void * rqtc ;
133
192
int inlen ;
134
193
u32 * in ;
135
194
int err ;
136
195
137
- inlen = MLX5_ST_SZ_BYTES (modify_rqt_in ) + sizeof (u32 ) * size ;
196
+ if (!rqt_verify_vhca_ids (rqt -> mdev , vhca_ids , size ))
197
+ return - EINVAL ;
198
+
199
+ entry_sz = vhca_ids ? MLX5_ST_SZ_BYTES (rq_vhca ) : MLX5_ST_SZ_BYTES (rq_num );
200
+ inlen = MLX5_ST_SZ_BYTES (modify_rqt_in ) + entry_sz * size ;
138
201
in = kvzalloc (inlen , GFP_KERNEL );
139
202
if (!in )
140
203
return - ENOMEM ;
@@ -143,40 +206,54 @@ static int mlx5e_rqt_redirect(struct mlx5e_rqt *rqt, u32 *rqns, unsigned int siz
143
206
144
207
MLX5_SET (modify_rqt_in , in , bitmask .rqn_list , 1 );
145
208
MLX5_SET (rqtc , rqtc , rqt_actual_size , size );
146
- for ( i = 0 ; i < size ; i ++ )
147
- MLX5_SET (rqtc , rqtc , rq_num [ i ], rqns [ i ] );
209
+
210
+ fill_rqn_list (rqtc , rqns , vhca_ids , size );
148
211
149
212
err = mlx5_core_modify_rqt (rqt -> mdev , rqt -> rqtn , in , inlen );
150
213
151
214
kvfree (in );
152
215
return err ;
153
216
}
154
217
155
- int mlx5e_rqt_redirect_direct (struct mlx5e_rqt * rqt , u32 rqn )
218
+ int mlx5e_rqt_redirect_direct (struct mlx5e_rqt * rqt , u32 rqn , u32 * vhca_id )
156
219
{
157
- return mlx5e_rqt_redirect (rqt , & rqn , 1 );
220
+ return mlx5e_rqt_redirect (rqt , & rqn , vhca_id , 1 );
158
221
}
159
222
160
- int mlx5e_rqt_redirect_indir (struct mlx5e_rqt * rqt , u32 * rqns , unsigned int num_rqns ,
223
+ int mlx5e_rqt_redirect_indir (struct mlx5e_rqt * rqt , u32 * rqns , u32 * vhca_ids ,
224
+ unsigned int num_rqns ,
161
225
u8 hfunc , struct mlx5e_rss_params_indir * indir )
162
226
{
163
- u32 * rss_rqns ;
227
+ u32 * rss_rqns , * rss_vhca_ids = NULL ;
164
228
int err ;
165
229
230
+ if (!rqt_verify_vhca_ids (rqt -> mdev , vhca_ids , num_rqns ))
231
+ return - EINVAL ;
232
+
166
233
if (WARN_ON (rqt -> size != indir -> max_table_size ))
167
234
return - EINVAL ;
168
235
169
236
rss_rqns = kvmalloc_array (indir -> actual_table_size , sizeof (* rss_rqns ), GFP_KERNEL );
170
237
if (!rss_rqns )
171
238
return - ENOMEM ;
172
239
173
- err = mlx5e_calc_indir_rqns (rss_rqns , rqns , num_rqns , hfunc , indir );
240
+ if (vhca_ids ) {
241
+ rss_vhca_ids = kvmalloc_array (indir -> actual_table_size , sizeof (* rss_vhca_ids ),
242
+ GFP_KERNEL );
243
+ if (!rss_vhca_ids ) {
244
+ kvfree (rss_rqns );
245
+ return - ENOMEM ;
246
+ }
247
+ }
248
+
249
+ err = mlx5e_calc_indir_rqns (rss_rqns , rqns , rss_vhca_ids , vhca_ids , num_rqns , hfunc , indir );
174
250
if (err )
175
251
goto out ;
176
252
177
- err = mlx5e_rqt_redirect (rqt , rss_rqns , indir -> actual_table_size );
253
+ err = mlx5e_rqt_redirect (rqt , rss_rqns , rss_vhca_ids , indir -> actual_table_size );
178
254
179
255
out :
256
+ kvfree (rss_vhca_ids );
180
257
kvfree (rss_rqns );
181
258
return err ;
182
259
}
0 commit comments