@@ -98,6 +98,11 @@ static u64 sq_allowed_event_types(void)
98
98
return BIT (MLX5_EVENT_TYPE_WQ_CATAS_ERROR );
99
99
}
100
100
101
+ static u64 dct_allowed_event_types (void )
102
+ {
103
+ return BIT (MLX5_EVENT_TYPE_DCT_DRAINED );
104
+ }
105
+
101
106
static bool is_event_type_allowed (int rsc_type , int event_type )
102
107
{
103
108
switch (rsc_type ) {
@@ -107,6 +112,8 @@ static bool is_event_type_allowed(int rsc_type, int event_type)
107
112
return BIT (event_type ) & rq_allowed_event_types ();
108
113
case MLX5_EVENT_QUEUE_TYPE_SQ :
109
114
return BIT (event_type ) & sq_allowed_event_types ();
115
+ case MLX5_EVENT_QUEUE_TYPE_DCT :
116
+ return BIT (event_type ) & dct_allowed_event_types ();
110
117
default :
111
118
WARN (1 , "Event arrived for unknown resource type" );
112
119
return false;
@@ -116,6 +123,7 @@ static bool is_event_type_allowed(int rsc_type, int event_type)
116
123
void mlx5_rsc_event (struct mlx5_core_dev * dev , u32 rsn , int event_type )
117
124
{
118
125
struct mlx5_core_rsc_common * common = mlx5_get_rsc (dev , rsn );
126
+ struct mlx5_core_dct * dct ;
119
127
struct mlx5_core_qp * qp ;
120
128
121
129
if (!common )
@@ -134,17 +142,21 @@ void mlx5_rsc_event(struct mlx5_core_dev *dev, u32 rsn, int event_type)
134
142
qp = (struct mlx5_core_qp * )common ;
135
143
qp -> event (qp , event_type );
136
144
break ;
137
-
145
+ case MLX5_RES_DCT :
146
+ dct = (struct mlx5_core_dct * )common ;
147
+ if (event_type == MLX5_EVENT_TYPE_DCT_DRAINED )
148
+ complete (& dct -> drained );
149
+ break ;
138
150
default :
139
151
mlx5_core_warn (dev , "invalid resource type for 0x%x\n" , rsn );
140
152
}
141
153
142
154
mlx5_core_put_rsc (common );
143
155
}
144
156
145
- static int create_qprqsq_common (struct mlx5_core_dev * dev ,
146
- struct mlx5_core_qp * qp ,
147
- int rsc_type )
157
+ static int create_resource_common (struct mlx5_core_dev * dev ,
158
+ struct mlx5_core_qp * qp ,
159
+ int rsc_type )
148
160
{
149
161
struct mlx5_qp_table * table = & dev -> priv .qp_table ;
150
162
int err ;
@@ -165,8 +177,8 @@ static int create_qprqsq_common(struct mlx5_core_dev *dev,
165
177
return 0 ;
166
178
}
167
179
168
- static void destroy_qprqsq_common (struct mlx5_core_dev * dev ,
169
- struct mlx5_core_qp * qp )
180
+ static void destroy_resource_common (struct mlx5_core_dev * dev ,
181
+ struct mlx5_core_qp * qp )
170
182
{
171
183
struct mlx5_qp_table * table = & dev -> priv .qp_table ;
172
184
unsigned long flags ;
@@ -179,6 +191,40 @@ static void destroy_qprqsq_common(struct mlx5_core_dev *dev,
179
191
wait_for_completion (& qp -> common .free );
180
192
}
181
193
194
+ int mlx5_core_create_dct (struct mlx5_core_dev * dev ,
195
+ struct mlx5_core_dct * dct ,
196
+ u32 * in , int inlen )
197
+ {
198
+ u32 out [MLX5_ST_SZ_DW (create_dct_out )] = {0 };
199
+ u32 din [MLX5_ST_SZ_DW (destroy_dct_in )] = {0 };
200
+ u32 dout [MLX5_ST_SZ_DW (destroy_dct_out )] = {0 };
201
+ struct mlx5_core_qp * qp = & dct -> mqp ;
202
+ int err ;
203
+
204
+ init_completion (& dct -> drained );
205
+ MLX5_SET (create_dct_in , in , opcode , MLX5_CMD_OP_CREATE_DCT );
206
+
207
+ err = mlx5_cmd_exec (dev , in , inlen , & out , sizeof (out ));
208
+ if (err ) {
209
+ mlx5_core_warn (dev , "create DCT failed, ret %d\n" , err );
210
+ return err ;
211
+ }
212
+
213
+ qp -> qpn = MLX5_GET (create_dct_out , out , dctn );
214
+ err = create_resource_common (dev , qp , MLX5_RES_DCT );
215
+ if (err )
216
+ goto err_cmd ;
217
+
218
+ return 0 ;
219
+ err_cmd :
220
+ MLX5_SET (destroy_dct_in , din , opcode , MLX5_CMD_OP_DESTROY_DCT );
221
+ MLX5_SET (destroy_dct_in , din , dctn , qp -> qpn );
222
+ mlx5_cmd_exec (dev , (void * )& in , sizeof (din ),
223
+ (void * )& out , sizeof (dout ));
224
+ return err ;
225
+ }
226
+ EXPORT_SYMBOL_GPL (mlx5_core_create_dct );
227
+
182
228
int mlx5_core_create_qp (struct mlx5_core_dev * dev ,
183
229
struct mlx5_core_qp * qp ,
184
230
u32 * in , int inlen )
@@ -197,7 +243,7 @@ int mlx5_core_create_qp(struct mlx5_core_dev *dev,
197
243
qp -> qpn = MLX5_GET (create_qp_out , out , qpn );
198
244
mlx5_core_dbg (dev , "qpn = 0x%x\n" , qp -> qpn );
199
245
200
- err = create_qprqsq_common (dev , qp , MLX5_RES_QP );
246
+ err = create_resource_common (dev , qp , MLX5_RES_QP );
201
247
if (err )
202
248
goto err_cmd ;
203
249
@@ -220,6 +266,47 @@ int mlx5_core_create_qp(struct mlx5_core_dev *dev,
220
266
}
221
267
EXPORT_SYMBOL_GPL (mlx5_core_create_qp );
222
268
269
+ static int mlx5_core_drain_dct (struct mlx5_core_dev * dev ,
270
+ struct mlx5_core_dct * dct )
271
+ {
272
+ u32 out [MLX5_ST_SZ_DW (drain_dct_out )] = {0 };
273
+ u32 in [MLX5_ST_SZ_DW (drain_dct_in )] = {0 };
274
+ struct mlx5_core_qp * qp = & dct -> mqp ;
275
+
276
+ MLX5_SET (drain_dct_in , in , opcode , MLX5_CMD_OP_DRAIN_DCT );
277
+ MLX5_SET (drain_dct_in , in , dctn , qp -> qpn );
278
+ return mlx5_cmd_exec (dev , (void * )& in , sizeof (in ),
279
+ (void * )& out , sizeof (out ));
280
+ }
281
+
282
+ int mlx5_core_destroy_dct (struct mlx5_core_dev * dev ,
283
+ struct mlx5_core_dct * dct )
284
+ {
285
+ u32 out [MLX5_ST_SZ_DW (destroy_dct_out )] = {0 };
286
+ u32 in [MLX5_ST_SZ_DW (destroy_dct_in )] = {0 };
287
+ struct mlx5_core_qp * qp = & dct -> mqp ;
288
+ int err ;
289
+
290
+ err = mlx5_core_drain_dct (dev , dct );
291
+ if (err ) {
292
+ if (dev -> state == MLX5_DEVICE_STATE_INTERNAL_ERROR ) {
293
+ goto destroy ;
294
+ } else {
295
+ mlx5_core_warn (dev , "failed drain DCT 0x%x with error 0x%x\n" , qp -> qpn , err );
296
+ return err ;
297
+ }
298
+ }
299
+ wait_for_completion (& dct -> drained );
300
+ destroy :
301
+ destroy_resource_common (dev , & dct -> mqp );
302
+ MLX5_SET (destroy_dct_in , in , opcode , MLX5_CMD_OP_DESTROY_DCT );
303
+ MLX5_SET (destroy_dct_in , in , dctn , qp -> qpn );
304
+ err = mlx5_cmd_exec (dev , (void * )& in , sizeof (in ),
305
+ (void * )& out , sizeof (out ));
306
+ return err ;
307
+ }
308
+ EXPORT_SYMBOL_GPL (mlx5_core_destroy_dct );
309
+
223
310
int mlx5_core_destroy_qp (struct mlx5_core_dev * dev ,
224
311
struct mlx5_core_qp * qp )
225
312
{
@@ -229,7 +316,7 @@ int mlx5_core_destroy_qp(struct mlx5_core_dev *dev,
229
316
230
317
mlx5_debug_qp_remove (dev , qp );
231
318
232
- destroy_qprqsq_common (dev , qp );
319
+ destroy_resource_common (dev , qp );
233
320
234
321
MLX5_SET (destroy_qp_in , in , opcode , MLX5_CMD_OP_DESTROY_QP );
235
322
MLX5_SET (destroy_qp_in , in , qpn , qp -> qpn );
@@ -405,6 +492,20 @@ int mlx5_core_qp_query(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp,
405
492
}
406
493
EXPORT_SYMBOL_GPL (mlx5_core_qp_query );
407
494
495
+ int mlx5_core_dct_query (struct mlx5_core_dev * dev , struct mlx5_core_dct * dct ,
496
+ u32 * out , int outlen )
497
+ {
498
+ u32 in [MLX5_ST_SZ_DW (query_dct_in )] = {0 };
499
+ struct mlx5_core_qp * qp = & dct -> mqp ;
500
+
501
+ MLX5_SET (query_dct_in , in , opcode , MLX5_CMD_OP_QUERY_DCT );
502
+ MLX5_SET (query_dct_in , in , dctn , qp -> qpn );
503
+
504
+ return mlx5_cmd_exec (dev , (void * )& in , sizeof (in ),
505
+ (void * )out , outlen );
506
+ }
507
+ EXPORT_SYMBOL_GPL (mlx5_core_dct_query );
508
+
408
509
int mlx5_core_xrcd_alloc (struct mlx5_core_dev * dev , u32 * xrcdn )
409
510
{
410
511
u32 out [MLX5_ST_SZ_DW (alloc_xrcd_out )] = {0 };
@@ -441,7 +542,7 @@ int mlx5_core_create_rq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
441
542
return err ;
442
543
443
544
rq -> qpn = rqn ;
444
- err = create_qprqsq_common (dev , rq , MLX5_RES_RQ );
545
+ err = create_resource_common (dev , rq , MLX5_RES_RQ );
445
546
if (err )
446
547
goto err_destroy_rq ;
447
548
@@ -457,7 +558,7 @@ EXPORT_SYMBOL(mlx5_core_create_rq_tracked);
457
558
void mlx5_core_destroy_rq_tracked (struct mlx5_core_dev * dev ,
458
559
struct mlx5_core_qp * rq )
459
560
{
460
- destroy_qprqsq_common (dev , rq );
561
+ destroy_resource_common (dev , rq );
461
562
mlx5_core_destroy_rq (dev , rq -> qpn );
462
563
}
463
564
EXPORT_SYMBOL (mlx5_core_destroy_rq_tracked );
@@ -473,7 +574,7 @@ int mlx5_core_create_sq_tracked(struct mlx5_core_dev *dev, u32 *in, int inlen,
473
574
return err ;
474
575
475
576
sq -> qpn = sqn ;
476
- err = create_qprqsq_common (dev , sq , MLX5_RES_SQ );
577
+ err = create_resource_common (dev , sq , MLX5_RES_SQ );
477
578
if (err )
478
579
goto err_destroy_sq ;
479
580
@@ -489,7 +590,7 @@ EXPORT_SYMBOL(mlx5_core_create_sq_tracked);
489
590
void mlx5_core_destroy_sq_tracked (struct mlx5_core_dev * dev ,
490
591
struct mlx5_core_qp * sq )
491
592
{
492
- destroy_qprqsq_common (dev , sq );
593
+ destroy_resource_common (dev , sq );
493
594
mlx5_core_destroy_sq (dev , sq -> qpn );
494
595
}
495
596
EXPORT_SYMBOL (mlx5_core_destroy_sq_tracked );
0 commit comments