1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
|
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright 2019 Mellanox Technologies, Ltd
*/
#ifndef RTE_PMD_MLX5_DEVX_CMDS_H_
#define RTE_PMD_MLX5_DEVX_CMDS_H_
#include "mlx5_glue.h"
#include "mlx5_prm.h"
/* devX creation object */
struct mlx5_devx_obj {
void *obj; /* The DV object. */
int id; /* The object ID. */
};
/* UMR memory buffer used to define 1 entry in indirect mkey. */
struct mlx5_klm {
uint32_t byte_count;
uint32_t mkey;
uint64_t address;
};
/* This is limitation of libibverbs: in length variable type is u16. */
#define MLX5_DEVX_MAX_KLM_ENTRIES ((UINT16_MAX - \
MLX5_ST_SZ_DW(create_mkey_in) * 4) / (MLX5_ST_SZ_DW(klm) * 4))
struct mlx5_devx_mkey_attr {
uint64_t addr;
uint64_t size;
uint32_t umem_id;
uint32_t pd;
uint32_t log_entity_size;
uint32_t pg_access:1;
uint32_t relaxed_ordering:1;
struct mlx5_klm *klm_array;
int klm_num;
};
/* HCA qos attributes. */
struct mlx5_hca_qos_attr {
uint32_t sup:1; /* Whether QOS is supported. */
uint32_t srtcm_sup:1; /* Whether srTCM mode is supported. */
uint32_t flow_meter_reg_share:1;
/* Whether reg_c share is supported. */
uint8_t log_max_flow_meter;
/* Power of the maximum supported meters. */
uint8_t flow_meter_reg_c_ids;
/* Bitmap of the reg_Cs available for flow meter to use. */
};
struct mlx5_hca_vdpa_attr {
uint8_t virtio_queue_type;
uint32_t valid:1;
uint32_t desc_tunnel_offload_type:1;
uint32_t eth_frame_offload_type:1;
uint32_t virtio_version_1_0:1;
uint32_t tso_ipv4:1;
uint32_t tso_ipv6:1;
uint32_t tx_csum:1;
uint32_t rx_csum:1;
uint32_t event_mode:3;
uint32_t log_doorbell_stride:5;
uint32_t log_doorbell_bar_size:5;
uint32_t max_num_virtio_queues;
struct {
uint32_t a;
uint32_t b;
} umems[3];
uint64_t doorbell_bar_offset;
};
/* HCA supports this number of time periods for LRO. */
#define MLX5_LRO_NUM_SUPP_PERIODS 4
/* HCA attributes. */
struct mlx5_hca_attr {
uint32_t eswitch_manager:1;
uint32_t flow_counters_dump:1;
uint32_t log_max_rqt_size:5;
uint8_t flow_counter_bulk_alloc_bitmap;
uint32_t eth_net_offloads:1;
uint32_t eth_virt:1;
uint32_t wqe_vlan_insert:1;
uint32_t wqe_inline_mode:2;
uint32_t vport_inline_mode:3;
uint32_t tunnel_stateless_geneve_rx:1;
uint32_t geneve_max_opt_len:1; /* 0x0: 14DW, 0x1: 63DW */
uint32_t tunnel_stateless_gtp:1;
uint32_t lro_cap:1;
uint32_t tunnel_lro_gre:1;
uint32_t tunnel_lro_vxlan:1;
uint32_t lro_max_msg_sz_mode:2;
uint32_t lro_timer_supported_periods[MLX5_LRO_NUM_SUPP_PERIODS];
uint32_t flex_parser_protocols;
uint32_t hairpin:1;
uint32_t log_max_hairpin_queues:5;
uint32_t log_max_hairpin_wq_data_sz:5;
uint32_t log_max_hairpin_num_packets:5;
uint32_t vhca_id:16;
uint32_t relaxed_ordering_write:1;
uint32_t relaxed_ordering_read:1;
struct mlx5_hca_qos_attr qos;
struct mlx5_hca_vdpa_attr vdpa;
};
struct mlx5_devx_wq_attr {
uint32_t wq_type:4;
uint32_t wq_signature:1;
uint32_t end_padding_mode:2;
uint32_t cd_slave:1;
uint32_t hds_skip_first_sge:1;
uint32_t log2_hds_buf_size:3;
uint32_t page_offset:5;
uint32_t lwm:16;
uint32_t pd:24;
uint32_t uar_page:24;
uint64_t dbr_addr;
uint32_t hw_counter;
uint32_t sw_counter;
uint32_t log_wq_stride:4;
uint32_t log_wq_pg_sz:5;
uint32_t log_wq_sz:5;
uint32_t dbr_umem_valid:1;
uint32_t wq_umem_valid:1;
uint32_t log_hairpin_num_packets:5;
uint32_t log_hairpin_data_sz:5;
uint32_t single_wqe_log_num_of_strides:4;
uint32_t two_byte_shift_en:1;
uint32_t single_stride_log_num_of_bytes:3;
uint32_t dbr_umem_id;
uint32_t wq_umem_id;
uint64_t wq_umem_offset;
};
/* Create RQ attributes structure, used by create RQ operation. */
struct mlx5_devx_create_rq_attr {
uint32_t rlky:1;
uint32_t delay_drop_en:1;
uint32_t scatter_fcs:1;
uint32_t vsd:1;
uint32_t mem_rq_type:4;
uint32_t state:4;
uint32_t flush_in_error_en:1;
uint32_t hairpin:1;
uint32_t user_index:24;
uint32_t cqn:24;
uint32_t counter_set_id:8;
uint32_t rmpn:24;
struct mlx5_devx_wq_attr wq_attr;
};
/* Modify RQ attributes structure, used by modify RQ operation. */
struct mlx5_devx_modify_rq_attr {
uint32_t rqn:24;
uint32_t rq_state:4; /* Current RQ state. */
uint32_t state:4; /* Required RQ state. */
uint32_t scatter_fcs:1;
uint32_t vsd:1;
uint32_t counter_set_id:8;
uint32_t hairpin_peer_sq:24;
uint32_t hairpin_peer_vhca:16;
uint64_t modify_bitmask;
uint32_t lwm:16; /* Contained WQ lwm. */
};
struct mlx5_rx_hash_field_select {
uint32_t l3_prot_type:1;
uint32_t l4_prot_type:1;
uint32_t selected_fields:30;
};
/* TIR attributes structure, used by TIR operations. */
struct mlx5_devx_tir_attr {
uint32_t disp_type:4;
uint32_t lro_timeout_period_usecs:16;
uint32_t lro_enable_mask:4;
uint32_t lro_max_msg_sz:8;
uint32_t inline_rqn:24;
uint32_t rx_hash_symmetric:1;
uint32_t tunneled_offload_en:1;
uint32_t indirect_table:24;
uint32_t rx_hash_fn:4;
uint32_t self_lb_block:2;
uint32_t transport_domain:24;
uint8_t rx_hash_toeplitz_key[MLX5_RSS_HASH_KEY_LEN];
struct mlx5_rx_hash_field_select rx_hash_field_selector_outer;
struct mlx5_rx_hash_field_select rx_hash_field_selector_inner;
};
/* RQT attributes structure, used by RQT operations. */
struct mlx5_devx_rqt_attr {
uint8_t rq_type;
uint32_t rqt_max_size:16;
uint32_t rqt_actual_size:16;
uint32_t rq_list[];
};
/* TIS attributes structure. */
struct mlx5_devx_tis_attr {
uint32_t strict_lag_tx_port_affinity:1;
uint32_t tls_en:1;
uint32_t lag_tx_port_affinity:4;
uint32_t prio:4;
uint32_t transport_domain:24;
};
/* SQ attributes structure, used by SQ create operation. */
struct mlx5_devx_create_sq_attr {
uint32_t rlky:1;
uint32_t cd_master:1;
uint32_t fre:1;
uint32_t flush_in_error_en:1;
uint32_t allow_multi_pkt_send_wqe:1;
uint32_t min_wqe_inline_mode:3;
uint32_t state:4;
uint32_t reg_umr:1;
uint32_t allow_swp:1;
uint32_t hairpin:1;
uint32_t user_index:24;
uint32_t cqn:24;
uint32_t packet_pacing_rate_limit_index:16;
uint32_t tis_lst_sz:16;
uint32_t tis_num:24;
struct mlx5_devx_wq_attr wq_attr;
};
/* SQ attributes structure, used by SQ modify operation. */
struct mlx5_devx_modify_sq_attr {
uint32_t sq_state:4;
uint32_t state:4;
uint32_t hairpin_peer_rq:24;
uint32_t hairpin_peer_vhca:16;
};
/* CQ attributes structure, used by CQ operations. */
struct mlx5_devx_cq_attr {
uint32_t q_umem_valid:1;
uint32_t db_umem_valid:1;
uint32_t use_first_only:1;
uint32_t overrun_ignore:1;
uint32_t log_cq_size:5;
uint32_t log_page_size:5;
uint32_t uar_page_id;
uint32_t q_umem_id;
uint64_t q_umem_offset;
uint32_t db_umem_id;
uint64_t db_umem_offset;
uint32_t eqn;
uint64_t db_addr;
};
/* Virtq attributes structure, used by VIRTQ operations. */
struct mlx5_devx_virtq_attr {
uint16_t hw_available_index;
uint16_t hw_used_index;
uint16_t q_size;
uint32_t virtio_version_1_0:1;
uint32_t tso_ipv4:1;
uint32_t tso_ipv6:1;
uint32_t tx_csum:1;
uint32_t rx_csum:1;
uint32_t event_mode:3;
uint32_t state:4;
uint32_t dirty_bitmap_dump_enable:1;
uint32_t dirty_bitmap_mkey;
uint32_t dirty_bitmap_size;
uint32_t mkey;
uint32_t qp_id;
uint32_t queue_index;
uint32_t tis_id;
uint64_t dirty_bitmap_addr;
uint64_t type;
uint64_t desc_addr;
uint64_t used_addr;
uint64_t available_addr;
struct {
uint32_t id;
uint32_t size;
uint64_t offset;
} umems[3];
};
struct mlx5_devx_qp_attr {
uint32_t pd:24;
uint32_t uar_index:24;
uint32_t cqn:24;
uint32_t log_page_size:5;
uint32_t rq_size:17; /* Must be power of 2. */
uint32_t log_rq_stride:3;
uint32_t sq_size:17; /* Must be power of 2. */
uint32_t dbr_umem_valid:1;
uint32_t dbr_umem_id;
uint64_t dbr_address;
uint32_t wq_umem_id;
uint64_t wq_umem_offset;
};
/* mlx5_devx_cmds.c */
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_flow_counter_alloc(void *ctx,
uint32_t bulk_sz);
__rte_internal
int mlx5_devx_cmd_destroy(struct mlx5_devx_obj *obj);
__rte_internal
int mlx5_devx_cmd_flow_counter_query(struct mlx5_devx_obj *dcs,
int clear, uint32_t n_counters,
uint64_t *pkts, uint64_t *bytes,
uint32_t mkey, void *addr,
void *cmd_comp,
uint64_t async_id);
__rte_internal
int mlx5_devx_cmd_query_hca_attr(void *ctx,
struct mlx5_hca_attr *attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_mkey_create(void *ctx,
struct mlx5_devx_mkey_attr *attr);
__rte_internal
int mlx5_devx_get_out_command_status(void *out);
__rte_internal
int mlx5_devx_cmd_qp_query_tis_td(void *qp, uint32_t tis_num,
uint32_t *tis_td);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_rq(void *ctx,
struct mlx5_devx_create_rq_attr *rq_attr,
int socket);
__rte_internal
int mlx5_devx_cmd_modify_rq(struct mlx5_devx_obj *rq,
struct mlx5_devx_modify_rq_attr *rq_attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_tir(void *ctx,
struct mlx5_devx_tir_attr *tir_attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_rqt(void *ctx,
struct mlx5_devx_rqt_attr *rqt_attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_sq(void *ctx,
struct mlx5_devx_create_sq_attr *sq_attr);
__rte_internal
int mlx5_devx_cmd_modify_sq(struct mlx5_devx_obj *sq,
struct mlx5_devx_modify_sq_attr *sq_attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_tis(void *ctx,
struct mlx5_devx_tis_attr *tis_attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_td(void *ctx);
__rte_internal
int mlx5_devx_cmd_flow_dump(void *fdb_domain, void *rx_domain, void *tx_domain,
FILE *file);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_cq(void *ctx,
struct mlx5_devx_cq_attr *attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_virtq(void *ctx,
struct mlx5_devx_virtq_attr *attr);
__rte_internal
int mlx5_devx_cmd_modify_virtq(struct mlx5_devx_obj *virtq_obj,
struct mlx5_devx_virtq_attr *attr);
__rte_internal
int mlx5_devx_cmd_query_virtq(struct mlx5_devx_obj *virtq_obj,
struct mlx5_devx_virtq_attr *attr);
__rte_internal
struct mlx5_devx_obj *mlx5_devx_cmd_create_qp(void *ctx,
struct mlx5_devx_qp_attr *attr);
__rte_internal
int mlx5_devx_cmd_modify_qp_state(struct mlx5_devx_obj *qp,
uint32_t qp_st_mod_op, uint32_t remote_qp_id);
__rte_internal
int mlx5_devx_cmd_modify_rqt(struct mlx5_devx_obj *rqt,
struct mlx5_devx_rqt_attr *rqt_attr);
#endif /* RTE_PMD_MLX5_DEVX_CMDS_H_ */
|