Skip to main content

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_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    /// Returns the adapter link speed in bits per second.
112    /// Falls back to a default of 200 Gbps when the hardware does not report
113    /// a link speed (OVL2 or lower responses return 0).
114    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/* Query vPort Configuration */
124#[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/* Move Filter invoked from VTL2 to move filter from VTL2 to VTL0 and back*/
143#[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/* Set vport serial number. */
153#[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/* Get vport Filter State. */
162#[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    // In discards/errors
473    pub in_discards_no_wqe: u64,
474    pub in_errors_rx_vport_disabled: u64,
475    // In bytes/packets
476    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    // Out errors
484    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    // Out bytes/packets
495    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}