|
| 1 | +// This Source Code Form is subject to the terms of the Mozilla Public |
| 2 | +// License, v. 2.0. If a copy of the MPL was not distributed with this |
| 3 | +// file, You can obtain one at https://mozilla.org/MPL/2.0/. |
| 4 | + |
| 5 | +#![allow(non_camel_case_types)] |
| 6 | + |
| 7 | +use libc::size_t; |
| 8 | +use std::ffi::c_void; |
| 9 | + |
| 10 | +const fn vna_ioc(ioc: i32) -> i32 { |
| 11 | + const V: i32 = b'V' as i32; |
| 12 | + const C: i32 = b'C' as i32; |
| 13 | + V << 16 | C << 8 | ioc |
| 14 | +} |
| 15 | + |
| 16 | +pub const VNA_IOC_CREATE: i32 = vna_ioc(0x01); |
| 17 | +pub const VNA_IOC_DELETE: i32 = vna_ioc(0x02); |
| 18 | +pub const VNA_IOC_VERSION: i32 = vna_ioc(0x03); |
| 19 | +pub const VNA_IOC_DEFAULT_PARAMS: i32 = vna_ioc(0x04); |
| 20 | + |
| 21 | +pub const VNA_IOC_RING_INIT: i32 = vna_ioc(0x10); |
| 22 | +pub const VNA_IOC_RING_RESET: i32 = vna_ioc(0x11); |
| 23 | +pub const VNA_IOC_RING_KICK: i32 = vna_ioc(0x12); |
| 24 | +pub const VNA_IOC_RING_SET_MSI: i32 = vna_ioc(0x13); |
| 25 | +pub const VNA_IOC_RING_INTR_CLR: i32 = vna_ioc(0x14); |
| 26 | +pub const VNA_IOC_RING_SET_STATE: i32 = vna_ioc(0x15); |
| 27 | +pub const VNA_IOC_RING_GET_STATE: i32 = vna_ioc(0x16); |
| 28 | +pub const VNA_IOC_RING_PAUSE: i32 = vna_ioc(0x17); |
| 29 | +pub const VNA_IOC_RING_INIT_MODERN: i32 = vna_ioc(0x18); |
| 30 | + |
| 31 | +pub const VNA_IOC_INTR_POLL: i32 = vna_ioc(0x20); |
| 32 | +pub const VNA_IOC_SET_FEATURES: i32 = vna_ioc(0x21); |
| 33 | +pub const VNA_IOC_GET_FEATURES: i32 = vna_ioc(0x22); |
| 34 | +pub const VNA_IOC_SET_NOTIFY_IOP: i32 = vna_ioc(0x23); |
| 35 | +pub const VNA_IOC_SET_PROMISC: i32 = vna_ioc(0x24); |
| 36 | +pub const VNA_IOC_GET_PARAMS: i32 = vna_ioc(0x25); |
| 37 | +pub const VNA_IOC_SET_PARAMS: i32 = vna_ioc(0x26); |
| 38 | +pub const VNA_IOC_GET_MTU: i32 = vna_ioc(0x27); |
| 39 | +pub const VNA_IOC_SET_MTU: i32 = vna_ioc(0x28); |
| 40 | +pub const VNA_IOC_SET_NOTIFY_MMIO: i32 = vna_ioc(0x29); |
| 41 | +pub const VNA_IOC_INTR_POLL_MQ: i32 = vna_ioc(0x2a); |
| 42 | + |
| 43 | +/// VirtIO 1.2 queue pair support. |
| 44 | +pub const VNA_IOC_GET_PAIRS: i32 = vna_ioc(0x30); |
| 45 | +pub const VNA_IOC_SET_PAIRS: i32 = vna_ioc(0x31); |
| 46 | +pub const VNA_IOC_GET_USEPAIRS: i32 = vna_ioc(0x32); |
| 47 | +pub const VNA_IOC_SET_USEPAIRS: i32 = vna_ioc(0x33); |
| 48 | + |
| 49 | +#[cfg(test)] |
| 50 | +mod test { |
| 51 | + use super::*; |
| 52 | + |
| 53 | + #[test] |
| 54 | + fn test_vna_ioc() { |
| 55 | + assert_eq!(vna_ioc(0x22), 0x00_56_43_22); |
| 56 | + } |
| 57 | +} |
| 58 | + |
| 59 | +/// The minimum number of queue pairs supported by a device. |
| 60 | +pub const VIONA_MIN_QPAIRS: usize = 1; |
| 61 | + |
| 62 | +/// The maximum number of queue pairs supported by a device. |
| 63 | +/// |
| 64 | +/// Note that the VirtIO limit is much higher (0x8000); Viona artificially |
| 65 | +/// limits the number to 256 pairs, which makes it possible to implmeent |
| 66 | +/// interrupt notification with a reasonably sized bitmap. |
| 67 | +pub const VIONA_MAX_QPAIRS: usize = 0x100; |
| 68 | + |
| 69 | +const fn howmany(x: usize, y: usize) -> usize { |
| 70 | + assert!(y > 0); |
| 71 | + x.div_ceil(y) |
| 72 | +} |
| 73 | + |
| 74 | +#[repr(C)] |
| 75 | +pub struct vioc_create { |
| 76 | + pub c_linkid: u32, |
| 77 | + pub c_vmfd: i32, |
| 78 | +} |
| 79 | + |
| 80 | +#[repr(C)] |
| 81 | +#[derive(Default)] |
| 82 | +pub struct vioc_ring_init_modern { |
| 83 | + pub rim_index: u16, |
| 84 | + pub rim_qsize: u16, |
| 85 | + pub _pad: [u16; 2], |
| 86 | + pub rim_qaddr_desc: u64, |
| 87 | + pub rim_qaddr_avail: u64, |
| 88 | + pub rim_qaddr_used: u64, |
| 89 | +} |
| 90 | + |
| 91 | +#[repr(C)] |
| 92 | +#[derive(Default)] |
| 93 | +pub struct vioc_ring_msi { |
| 94 | + pub rm_index: u16, |
| 95 | + pub _pad: [u16; 3], |
| 96 | + pub rm_addr: u64, |
| 97 | + pub rm_msg: u64, |
| 98 | +} |
| 99 | + |
| 100 | +#[repr(C)] |
| 101 | +#[derive(Default)] |
| 102 | +pub struct vioc_intr_poll_mq { |
| 103 | + pub vipm_nrings: u16, |
| 104 | + pub _pad: u16, |
| 105 | + pub vipm_status: [u32; howmany(VIONA_MAX_QPAIRS, 32)], |
| 106 | +} |
| 107 | + |
| 108 | +#[repr(C)] |
| 109 | +#[derive(Default)] |
| 110 | +pub struct vioc_notify_mmio { |
| 111 | + pub vim_address: u64, |
| 112 | + pub vim_size: u32, |
| 113 | +} |
| 114 | + |
| 115 | +#[repr(C)] |
| 116 | +#[derive(Default)] |
| 117 | +pub struct vioc_ring_state { |
| 118 | + pub vrs_index: u16, |
| 119 | + pub vrs_avail_idx: u16, |
| 120 | + pub vrs_used_idx: u16, |
| 121 | + pub vrs_qsize: u16, |
| 122 | + pub vrs_qaddr_desc: u64, |
| 123 | + pub vrs_qaddr_avail: u64, |
| 124 | + pub vrs_qaddr_used: u64, |
| 125 | +} |
| 126 | + |
| 127 | +pub const VIONA_PROMISC_NONE: i32 = 0; |
| 128 | +pub const VIONA_PROMISC_MULTI: i32 = 1; |
| 129 | +pub const VIONA_PROMISC_ALL: i32 = 2; |
| 130 | +#[cfg(feature = "falcon")] |
| 131 | +pub const VIONA_PROMISC_ALL_VLAN: i32 = 3; |
| 132 | + |
| 133 | +#[repr(C)] |
| 134 | +#[derive(Default)] |
| 135 | +pub struct vioc_get_params { |
| 136 | + pub vgp_param: *mut c_void, |
| 137 | + pub vgp_param_sz: size_t, |
| 138 | +} |
| 139 | + |
| 140 | +#[repr(C)] |
| 141 | +#[derive(Default)] |
| 142 | +pub struct vioc_set_params { |
| 143 | + pub vsp_param: *mut c_void, |
| 144 | + pub vsp_param_sz: size_t, |
| 145 | + pub vsp_error: *mut c_void, |
| 146 | + pub vsp_error_sz: size_t, |
| 147 | +} |
| 148 | + |
| 149 | +/// This is the viona interface version which viona_api expects to operate |
| 150 | +/// against. All constants and structs defined by the crate are done so in |
| 151 | +/// terms of that specific version. |
| 152 | +pub const VIONA_CURRENT_INTERFACE_VERSION: u32 = 6; |
| 153 | + |
| 154 | +/// Maximum size of packed nvlists used in viona parameter ioctls |
| 155 | +pub const VIONA_MAX_PARAM_NVLIST_SZ: usize = 4096; |
0 commit comments