gdma_defs/
bnic.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! GDMA Basic NIC (BNIC/MANA) definitions
5
6use 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/* Query vPort Configuration */
105#[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/* Move Filter invoked from VTL2 to move filter from VTL2 to VTL0 and back*/
124#[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/* Set vport serial number. */
134#[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/* Get vport Filter State. */
143#[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    // In discards/errors
454    pub in_discards_no_wqe: u64,
455    pub in_errors_rx_vport_disabled: u64,
456    // In bytes/packets
457    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    // Out errors
465    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    // Out bytes/packets
476    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}