@@ -169,6 +169,48 @@ static void mlx5_fw_tracer_destroy_log_buf(struct mlx5_fw_tracer *tracer)
169
169
free_pages ((unsigned long )tracer -> buff .log_buf , get_order (tracer -> buff .size ));
170
170
}
171
171
172
+ static int mlx5_fw_tracer_create_mkey (struct mlx5_fw_tracer * tracer )
173
+ {
174
+ struct mlx5_core_dev * dev = tracer -> dev ;
175
+ int err , inlen , i ;
176
+ __be64 * mtt ;
177
+ void * mkc ;
178
+ u32 * in ;
179
+
180
+ inlen = MLX5_ST_SZ_BYTES (create_mkey_in ) +
181
+ sizeof (* mtt ) * round_up (TRACER_BUFFER_PAGE_NUM , 2 );
182
+
183
+ in = kvzalloc (inlen , GFP_KERNEL );
184
+ if (!in )
185
+ return - ENOMEM ;
186
+
187
+ MLX5_SET (create_mkey_in , in , translations_octword_actual_size ,
188
+ DIV_ROUND_UP (TRACER_BUFFER_PAGE_NUM , 2 ));
189
+ mtt = (u64 * )MLX5_ADDR_OF (create_mkey_in , in , klm_pas_mtt );
190
+ for (i = 0 ; i < TRACER_BUFFER_PAGE_NUM ; i ++ )
191
+ mtt [i ] = cpu_to_be64 (tracer -> buff .dma + i * PAGE_SIZE );
192
+
193
+ mkc = MLX5_ADDR_OF (create_mkey_in , in , memory_key_mkey_entry );
194
+ MLX5_SET (mkc , mkc , access_mode_1_0 , MLX5_MKC_ACCESS_MODE_MTT );
195
+ MLX5_SET (mkc , mkc , lr , 1 );
196
+ MLX5_SET (mkc , mkc , lw , 1 );
197
+ MLX5_SET (mkc , mkc , pd , tracer -> buff .pdn );
198
+ MLX5_SET (mkc , mkc , bsf_octword_size , 0 );
199
+ MLX5_SET (mkc , mkc , qpn , 0xffffff );
200
+ MLX5_SET (mkc , mkc , log_page_size , PAGE_SHIFT );
201
+ MLX5_SET (mkc , mkc , translations_octword_size ,
202
+ DIV_ROUND_UP (TRACER_BUFFER_PAGE_NUM , 2 ));
203
+ MLX5_SET64 (mkc , mkc , start_addr , tracer -> buff .dma );
204
+ MLX5_SET64 (mkc , mkc , len , tracer -> buff .size );
205
+ err = mlx5_core_create_mkey (dev , & tracer -> buff .mkey , in , inlen );
206
+ if (err )
207
+ mlx5_core_warn (dev , "FWTracer: Failed to create mkey, %d\n" , err );
208
+
209
+ kvfree (in );
210
+
211
+ return err ;
212
+ }
213
+
172
214
static void mlx5_fw_tracer_free_strings_db (struct mlx5_fw_tracer * tracer )
173
215
{
174
216
u32 num_string_db = tracer -> str_db .num_string_db ;
@@ -363,13 +405,26 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer)
363
405
if (!tracer -> str_db .loaded )
364
406
queue_work (tracer -> work_queue , & tracer -> read_fw_strings_work );
365
407
366
- err = mlx5_fw_tracer_ownership_acquire ( tracer );
408
+ err = mlx5_core_alloc_pd ( dev , & tracer -> buff . pdn );
367
409
if (err ) {
368
- mlx5_core_dbg (dev , "FWTracer: Ownership was not granted %d\n" , err );
369
- return 0 ; /* return 0 since ownership can be acquired on a later FW event */
410
+ mlx5_core_warn (dev , "FWTracer: Failed to allocate PD %d\n" , err );
411
+ return err ;
370
412
}
371
413
414
+ err = mlx5_fw_tracer_create_mkey (tracer );
415
+ if (err ) {
416
+ mlx5_core_warn (dev , "FWTracer: Failed to create mkey %d\n" , err );
417
+ goto err_dealloc_pd ;
418
+ }
419
+
420
+ err = mlx5_fw_tracer_ownership_acquire (tracer );
421
+ if (err ) /* Don't fail since ownership can be acquired on a later FW event */
422
+ mlx5_core_dbg (dev , "FWTracer: Ownership was not granted %d\n" , err );
423
+
372
424
return 0 ;
425
+ err_dealloc_pd :
426
+ mlx5_core_dealloc_pd (dev , tracer -> buff .pdn );
427
+ return err ;
373
428
}
374
429
375
430
void mlx5_fw_tracer_cleanup (struct mlx5_fw_tracer * tracer )
@@ -381,6 +436,9 @@ void mlx5_fw_tracer_cleanup(struct mlx5_fw_tracer *tracer)
381
436
382
437
if (tracer -> owner )
383
438
mlx5_fw_tracer_ownership_release (tracer );
439
+
440
+ mlx5_core_destroy_mkey (tracer -> dev , & tracer -> buff .mkey );
441
+ mlx5_core_dealloc_pd (tracer -> dev , tracer -> buff .pdn );
384
442
}
385
443
386
444
void mlx5_fw_tracer_destroy (struct mlx5_fw_tracer * tracer )
0 commit comments