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