1use super::GdmaQueueType;
7use bitfield_struct::bitfield;
8use open_enum::open_enum;
9use zerocopy::FromBytes;
10use zerocopy::Immutable;
11use zerocopy::IntoBytes;
12use zerocopy::KnownLayout;
13
14open_enum! {
15 pub enum ManaCommandCode: u32 {
16 MANA_QUERY_DEV_CONFIG = 0x20001,
17 MANA_QUERY_STATS = 0x20002,
18 MANA_CONFIG_VPORT_TX = 0x20003,
19 MANA_CREATE_WQ_OBJ = 0x20004,
20 MANA_DESTROY_WQ_OBJ = 0x20005,
21 MANA_FENCE_RQ = 0x20006,
22 MANA_CONFIG_VPORT_RX = 0x20007,
23 MANA_QUERY_VPORT_CONFIG = 0x20008,
24 MANA_VTL2_ASSIGN_SERIAL_NUMBER = 0x27801,
25 MANA_VTL2_MOVE_FILTER = 0x27802,
26 MANA_VTL2_QUERY_FILTER_STATE = 0x27803,
27 }
28}
29
30pub const MANA_QUERY_DEV_CONFIG_REQUEST_V1: u16 = 1;
31pub const MANA_QUERY_DEV_CONFIG_RESPONSE_V4: u16 = 4;
32pub const MANA_VTL2_MOVE_FILTER_REQUEST_V2: u16 = 2;
33pub const MANA_VTL2_MOVE_FILTER_RESPONSE_V1: u16 = 1;
34pub const MANA_VTL2_ASSIGN_SERIAL_NUMBER_REQUEST_V1: u16 = 1;
35pub const MANA_VTL2_ASSIGN_SERIAL_NUMBER_RESPONSE_V1: u16 = 1;
36pub const MANA_VTL2_QUERY_FILTER_STATE_REQUEST_V1: u16 = 1;
37pub const MANA_VTL2_QUERY_FILTER_STATE_RESPONSE_V1: u16 = 1;
38
39#[bitfield(u64)]
40#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
41pub struct BasicNicDriverFlags {
42 #[bits(1)]
43 pub query_link_status: u8,
44 #[bits(1)]
45 pub ethertype_enforcement: u8,
46 #[bits(1)]
47 pub query_filter_state: u8,
48 #[bits(61)]
49 reserved: u64,
50}
51
52#[repr(C)]
53#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
54pub struct ManaQueryDeviceCfgReq {
55 pub mn_drv_cap_flags1: u64,
56 pub mn_drv_cap_flags2: u64,
57 pub mn_drv_cap_flags3: u64,
58 pub mn_drv_cap_flags4: u64,
59
60 pub proto_major_ver: u32,
61 pub proto_minor_ver: u32,
62 pub proto_micro_ver: u32,
63
64 pub reserved: u32,
65}
66
67#[repr(C)]
68#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
69pub struct ManaQueryDeviceCfgResp {
70 pub pf_cap_flags1: BasicNicDriverFlags,
71 pub pf_cap_flags2: u64,
72 pub pf_cap_flags3: u64,
73 pub pf_cap_flags4: u64,
74
75 pub max_num_vports: u16,
76 pub reserved: u16,
77 pub max_num_eqs: u32,
78
79 pub adapter_mtu: u16,
80 pub reserved2: u16,
81 pub adapter_link_speed_mbps: u32,
82}
83
84impl std::fmt::Debug for ManaQueryDeviceCfgResp {
85 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
86 f.debug_struct("ManaQueryDeviceCfgResp")
87 .field("pf_cap_flags1", &self.pf_cap_flags1)
88 .field("pf_cap_flags2", &self.pf_cap_flags2)
89 .field("pf_cap_flags3", &self.pf_cap_flags3)
90 .field("pf_cap_flags4", &self.pf_cap_flags4)
91 .field("max_num_vports", &self.max_num_vports)
92 .field("reserved", &self.reserved)
93 .field("max_num_eqs", &self.max_num_eqs)
94 .field("adapter_mtu", &self.adapter_mtu)
95 .field("reserved2", &self.reserved2)
96 .field("adapter_link_speed_mbps", &self.adapter_link_speed_mbps)
97 .finish()
98 }
99}
100
101impl ManaQueryDeviceCfgResp {
102 pub fn cap_query_link_status(&self) -> bool {
103 self.pf_cap_flags1.query_link_status() != 0
104 }
105 pub fn cap_ethertype_enforcement(&self) -> bool {
106 self.pf_cap_flags1.ethertype_enforcement() != 0
107 }
108 pub fn cap_filter_state_query(&self) -> bool {
109 self.pf_cap_flags1.query_filter_state() != 0
110 }
111 pub fn link_speed_bps(&self) -> u64 {
115 if self.adapter_link_speed_mbps > 0 {
116 self.adapter_link_speed_mbps as u64 * 1000 * 1000
117 } else {
118 200 * 1000 * 1000 * 1000
119 }
120 }
121}
122
123#[repr(C)]
125#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
126pub struct ManaQueryVportCfgReq {
127 pub vport_index: u32,
128}
129
130#[repr(C)]
131#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
132pub struct ManaQueryVportCfgResp {
133 pub max_num_sq: u32,
134 pub max_num_rq: u32,
135 pub num_indirection_ent: u32,
136 pub reserved1: u32,
137 pub mac_addr: [u8; 6],
138 pub reserved2: [u8; 2],
139 pub vport: u64,
140}
141
142#[repr(C)]
144#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
145pub struct ManaMoveFilterVTL2PrivilegedReq {
146 pub vport: u64,
147 pub direction_to_vtl0: u8,
148 pub reserved: [u8; 3],
149 pub reserved2: u32,
150}
151
152#[repr(C)]
154#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
155pub struct ManaSetVportSerialNo {
156 pub vport: u64,
157 pub serial_no: u32,
158 pub reserved: u32,
159}
160
161#[repr(C)]
163#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
164pub struct ManaQueryFilterStateReq {
165 pub vport: u64,
166}
167
168#[repr(C)]
169#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
170pub struct ManaQueryFilterStateResponse {
171 pub direction_to_vtl0: u8,
172 pub reserved: [u8; 7],
173}
174
175#[repr(C)]
176#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
177pub struct ManaConfigVportReq {
178 pub vport: u64,
179 pub pdid: u32,
180 pub doorbell_pageid: u32,
181}
182
183#[repr(C)]
184#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
185pub struct ManaConfigVportResp {
186 pub tx_vport_offset: u16,
187 pub short_form_allowed: u8,
188 pub reserved: u8,
189}
190
191#[repr(C)]
192#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
193pub struct ManaCreateWqobjReq {
194 pub vport: u64,
195 pub wq_type: GdmaQueueType,
196 pub reserved: u32,
197 pub wq_gdma_region: u64,
198 pub cq_gdma_region: u64,
199 pub wq_size: u32,
200 pub cq_size: u32,
201 pub cq_moderation_ctx_id: u32,
202 pub cq_parent_qid: u32,
203}
204
205#[repr(C)]
206#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
207pub struct ManaCreateWqobjResp {
208 pub wq_id: u32,
209 pub cq_id: u32,
210 pub wq_obj: u64,
211}
212
213#[repr(C)]
214#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
215pub struct ManaDestroyWqobjReq {
216 pub wq_type: GdmaQueueType,
217 pub reserved: u32,
218 pub wq_obj_handle: u64,
219}
220
221#[repr(C)]
222#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
223pub struct ManaFenceRqReq {
224 pub wq_obj_handle: u64,
225}
226
227#[repr(C)]
228#[derive(Debug, IntoBytes, Immutable, KnownLayout, FromBytes)]
229pub struct ManaCfgRxSteerReq {
230 pub vport: u64,
231 pub num_indir_entries: u16,
232 pub indir_tab_offset: u16,
233 pub rx_enable: Tristate,
234 pub rss_enable: Tristate,
235 pub update_default_rxobj: u8,
236 pub update_hashkey: u8,
237 pub update_indir_tab: u8,
238 pub reserved: u8,
239 pub default_rxobj: u64,
240 pub hashkey: [u8; 40],
241}
242
243#[repr(transparent)]
244#[derive(Debug, Copy, Clone, IntoBytes, Immutable, KnownLayout, FromBytes, PartialEq, Eq)]
245pub struct Tristate(pub u32);
246
247impl Tristate {
248 pub const TRUE: Self = Self(1);
249 pub const FALSE: Self = Self(0);
250 pub const UNKNOWN: Self = Self(!0);
251}
252
253impl From<Option<bool>> for Tristate {
254 fn from(v: Option<bool>) -> Self {
255 match v {
256 Some(true) => Self::TRUE,
257 Some(false) => Self::FALSE,
258 None => Self::UNKNOWN,
259 }
260 }
261}
262
263#[bitfield(u32)]
264#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
265pub struct ManaCqeHeader {
266 #[bits(6)]
267 pub cqe_type: u8,
268 #[bits(2)]
269 pub client_type: u8,
270 #[bits(24)]
271 pub vendor_err: u32,
272}
273
274pub const CQE_INVALID: u8 = 0;
275pub const CQE_RX_OKAY: u8 = 1;
276pub const CQE_RX_COALESCED_4: u8 = 2;
277pub const CQE_RX_OBJECT_FENCE: u8 = 3;
278pub const CQE_RX_TRUNCATED: u8 = 4;
279
280pub const CQE_TX_OKAY: u8 = 32;
281pub const CQE_TX_SA_DROP: u8 = 33;
282pub const CQE_TX_MTU_DROP: u8 = 34;
283pub const CQE_TX_INVALID_OOB: u8 = 35;
284pub const CQE_TX_INVALID_ETH_TYPE: u8 = 36;
285pub const CQE_TX_HDR_PROCESSING_ERROR: u8 = 37;
286pub const CQE_TX_VF_DISABLED: u8 = 38;
287pub const CQE_TX_VPORT_IDX_OUT_OF_RANGE: u8 = 39;
288pub const CQE_TX_VPORT_DISABLED: u8 = 40;
289pub const CQE_TX_VLAN_TAGGING_VIOLATION: u8 = 41;
290pub const CQE_TX_GDMA_ERR: u8 = 42;
291
292pub const MANA_CQE_COMPLETION: u8 = 1;
293
294#[repr(C)]
295#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
296pub struct ManaTxCompOob {
297 pub cqe_hdr: ManaCqeHeader,
298 pub tx_data_offset: u32,
299 pub offsets: ManaTxCompOobOffsets,
300 pub reserved: [u32; 12],
301}
302
303#[bitfield(u32)]
304#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
305pub struct ManaTxCompOobOffsets {
306 #[bits(5)]
307 pub tx_sgl_offset: u32,
308 #[bits(27)]
309 pub tx_wqe_offset: u32,
310}
311
312#[repr(C)]
313#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
314pub struct ManaRxcompPerpktInfo {
315 pub pkt_len: u16,
316 pub reserved1: u16,
317 pub reserved2: u32,
318 pub pkt_hash: u32,
319}
320
321#[repr(C)]
322#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
323pub struct ManaRxcompOob {
324 pub cqe_hdr: ManaCqeHeader,
325 pub flags: ManaRxcompOobFlags,
326 pub ppi: [ManaRxcompPerpktInfo; 4],
327 pub rx_wqe_offset: u32,
328}
329
330#[bitfield(u32)]
331#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
332pub struct ManaRxcompOobFlags {
333 #[bits(12)]
334 pub rx_vlan_id: u32,
335 pub rx_vlantag_present: bool,
336 pub rx_outer_iphdr_csum_succeed: bool,
337 pub rx_outer_iphdr_csum_fail: bool,
338 pub reserved1: bool,
339 #[bits(9)]
340 pub rx_hashtype: u16,
341 pub rx_iphdr_csum_succeed: bool,
342 pub rx_iphdr_csum_fail: bool,
343 pub rx_tcp_csum_succeed: bool,
344 pub rx_tcp_csum_fail: bool,
345 pub rx_udp_csum_succeed: bool,
346 pub rx_udp_csum_fail: bool,
347 pub reserved2: bool,
348}
349
350#[bitfield(u64)]
351#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
352pub struct ManaTxShortOob {
353 #[bits(2)]
354 pub pkt_fmt: u8,
355 pub is_outer_ipv4: bool,
356 pub is_outer_ipv6: bool,
357 pub comp_iphdr_csum: bool,
358 pub comp_tcp_csum: bool,
359 pub comp_udp_csum: bool,
360 pub suppress_txcqe_gen: bool,
361 #[bits(24)]
362 pub vcq_num: u32,
363
364 #[bits(10)]
365 pub trans_off: u16,
366 #[bits(14)]
367 pub vsq_frame: u16,
368 pub short_vp_offset: u8,
369}
370
371pub const MANA_SHORT_PKT_FMT: u8 = 0;
372pub const MANA_LONG_PKT_FMT: u8 = 1;
373
374#[bitfield(u64)]
375#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
376pub struct ManaTxLongOob {
377 pub is_encap: bool,
378 pub inner_is_ipv6: bool,
379 pub inner_tcp_opt: bool,
380 pub inject_vlan_pri_tag: bool,
381 #[bits(12)]
382 pub reserved1: u32,
383 #[bits(3)]
384 pub pcp: u8,
385 pub dei: bool,
386 #[bits(12)]
387 pub vlan_id: u16,
388
389 #[bits(10)]
390 pub inner_frame_offset: u16,
391 #[bits(6)]
392 pub inner_ip_rel_offset: u16,
393 #[bits(12)]
394 pub long_vp_offset: u16,
395 #[bits(4)]
396 pub reserved2: u16,
397}
398
399#[repr(C)]
400#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
401pub struct ManaTxOob {
402 pub s_oob: ManaTxShortOob,
403 pub l_oob: ManaTxLongOob,
404 pub reserved3: u32,
405 pub reserved4: u32,
406}
407
408pub const STATISTICS_FLAGS_IN_DISCARDS_NO_WQE: u64 = 0x0000000000000001;
409pub const STATISTICS_FLAGS_IN_ERRORS_RX_VPORT_DISABLED: u64 = 0x0000000000000002;
410pub const STATISTICS_FLAGS_HC_IN_OCTETS: u64 = 0x0000000000000004;
411pub const STATISTICS_FLAGS_HC_IN_UCAST_PACKETS: u64 = 0x0000000000000008;
412pub const STATISTICS_FLAGS_HC_IN_UCAST_OCTETS: u64 = 0x0000000000000010;
413pub const STATISTICS_FLAGS_HC_IN_MCAST_PACKETS: u64 = 0x0000000000000020;
414pub const STATISTICS_FLAGS_HC_IN_MCAST_OCTETS: u64 = 0x0000000000000040;
415pub const STATISTICS_FLAGS_HC_IN_BCAST_PACKETS: u64 = 0x0000000000000080;
416pub const STATISTICS_FLAGS_HC_IN_BCAST_OCTETS: u64 = 0x0000000000000100;
417pub const STATISTICS_FLAGS_OUT_ERRORS_GF_DISABLED: u64 = 0x0000000000000200;
418pub const STATISTICS_FLAGS_OUT_ERRORS_VPORT_DISABLED: u64 = 0x0000000000000400;
419pub const STATISTICS_FLAGS_OUT_ERRORS_INVALID_VPORT_OFFSET_PACKETS: u64 = 0x0000000000000800;
420pub const STATISTICS_FLAGS_OUT_ERRORS_VLAN_ENFORCEMENT: u64 = 0x0000000000001000;
421pub const STATISTICS_FLAGS_OUT_ERRORS_ETH_TYPE_ENFORCEMENT: u64 = 0x0000000000002000;
422pub const STATISTICS_FLAGS_OUT_ERRORS_SA_ENFORCEMENT: u64 = 0x0000000000004000;
423pub const STATISTICS_FLAGS_OUT_ERRORS_SQPDID_ENFORCEMENT: u64 = 0x0000000000008000;
424pub const STATISTICS_FLAGS_OUT_ERRORS_CQPDID_ENFORCEMENT: u64 = 0x0000000000010000;
425pub const STATISTICS_FLAGS_OUT_ERRORS_MTU_VIOLATION: u64 = 0x0000000000020000;
426pub const STATISTICS_FLAGS_OUT_ERRORS_INVALID_OOB: u64 = 0x0000000000040000;
427pub const STATISTICS_FLAGS_HC_OUT_OCTETS: u64 = 0x0000000000080000;
428pub const STATISTICS_FLAGS_HC_OUT_UCAST_PACKETS: u64 = 0x0000000000100000;
429pub const STATISTICS_FLAGS_HC_OUT_UCAST_OCTETS: u64 = 0x0000000000200000;
430pub const STATISTICS_FLAGS_HC_OUT_MCAST_PACKETS: u64 = 0x0000000000400000;
431pub const STATISTICS_FLAGS_HC_OUT_MCAST_OCTETS: u64 = 0x0000000000800000;
432pub const STATISTICS_FLAGS_HC_OUT_BCAST_PACKETS: u64 = 0x0000000001000000;
433pub const STATISTICS_FLAGS_HC_OUT_BCAST_OCTETS: u64 = 0x0000000002000000;
434
435pub const STATISTICS_FLAGS_ALL: u64 = STATISTICS_FLAGS_IN_DISCARDS_NO_WQE
436 | STATISTICS_FLAGS_IN_ERRORS_RX_VPORT_DISABLED
437 | STATISTICS_FLAGS_HC_IN_OCTETS
438 | STATISTICS_FLAGS_HC_IN_UCAST_PACKETS
439 | STATISTICS_FLAGS_HC_IN_UCAST_OCTETS
440 | STATISTICS_FLAGS_HC_IN_MCAST_PACKETS
441 | STATISTICS_FLAGS_HC_IN_MCAST_OCTETS
442 | STATISTICS_FLAGS_HC_IN_BCAST_PACKETS
443 | STATISTICS_FLAGS_HC_IN_BCAST_OCTETS
444 | STATISTICS_FLAGS_OUT_ERRORS_GF_DISABLED
445 | STATISTICS_FLAGS_OUT_ERRORS_VPORT_DISABLED
446 | STATISTICS_FLAGS_OUT_ERRORS_INVALID_VPORT_OFFSET_PACKETS
447 | STATISTICS_FLAGS_OUT_ERRORS_VLAN_ENFORCEMENT
448 | STATISTICS_FLAGS_OUT_ERRORS_ETH_TYPE_ENFORCEMENT
449 | STATISTICS_FLAGS_OUT_ERRORS_SA_ENFORCEMENT
450 | STATISTICS_FLAGS_OUT_ERRORS_SQPDID_ENFORCEMENT
451 | STATISTICS_FLAGS_OUT_ERRORS_CQPDID_ENFORCEMENT
452 | STATISTICS_FLAGS_OUT_ERRORS_MTU_VIOLATION
453 | STATISTICS_FLAGS_OUT_ERRORS_INVALID_OOB
454 | STATISTICS_FLAGS_HC_OUT_OCTETS
455 | STATISTICS_FLAGS_HC_OUT_UCAST_PACKETS
456 | STATISTICS_FLAGS_HC_OUT_UCAST_OCTETS
457 | STATISTICS_FLAGS_HC_OUT_MCAST_PACKETS
458 | STATISTICS_FLAGS_HC_OUT_MCAST_OCTETS
459 | STATISTICS_FLAGS_HC_OUT_BCAST_PACKETS
460 | STATISTICS_FLAGS_HC_OUT_BCAST_OCTETS;
461
462#[repr(C)]
463#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
464pub struct ManaQueryStatisticsRequest {
465 pub requested_statistics: u64,
466}
467
468#[repr(C)]
469#[derive(IntoBytes, Immutable, KnownLayout, FromBytes)]
470pub struct ManaQueryStatisticsResponse {
471 pub reported_statistics: u64,
472 pub in_discards_no_wqe: u64,
474 pub in_errors_rx_vport_disabled: u64,
475 pub hc_in_octets: u64,
477 pub hc_in_ucast_pkts: u64,
478 pub hc_in_ucast_octets: u64,
479 pub hc_in_multicast_pkts: u64,
480 pub hc_in_multicast_octets: u64,
481 pub hc_in_broadcast_pkts: u64,
482 pub hc_in_broadcast_octets: u64,
483 pub out_errors_gf_disabled: u64,
485 pub out_errors_vport_disabled: u64,
486 pub out_errors_invalid_vport_offset_packets: u64,
487 pub out_errors_vlan_enforcement: u64,
488 pub out_errors_eth_type_enforcement: u64,
489 pub out_errors_sa_enforcement: u64,
490 pub out_errors_sqpdid_enforcement: u64,
491 pub out_errors_cqpdid_enforcement: u64,
492 pub out_errors_mtu_violation: u64,
493 pub out_errors_invalid_oob: u64,
494 pub hc_out_octets: u64,
496 pub hc_out_ucast_pkts: u64,
497 pub hc_out_ucast_octets: u64,
498 pub hc_out_multicast_pkts: u64,
499 pub hc_out_multicast_octets: u64,
500 pub hc_out_broadcast_pkts: u64,
501 pub hc_out_broadcast_octets: u64,
502}