pub const RING_SIZE: usize = 64;
pub const RING_VADDR: u64 = 0x7FFF_0000_0000;
#[repr(C, align(64))]
#[derive(Clone, Copy)]
pub struct SubmitEntry {
pub opcode: u16,
pub flags: u16,
pub _reserved: u32,
pub args: [u64; 5],
pub user_data: u64,
}
impl Default for SubmitEntry {
fn default() -> Self {
Self {
opcode: 0,
flags: 0,
_reserved: 0,
args: [0; 5],
user_data: 0,
}
}
}
impl SubmitEntry {
#[inline]
pub const fn new(opcode: u16, args: [u64; 5], user_data: u64) -> Self {
Self {
opcode,
flags: 0,
_reserved: 0,
args,
user_data,
}
}
}
pub mod submit_flags {
pub const NEED_COMPLETION: u16 = 1 << 0;
pub const BARRIER: u16 = 1 << 1;
pub const MORE_COMING: u16 = 1 << 2;
}
#[repr(C, align(16))]
#[derive(Clone, Copy, Default)]
pub struct CompleteEntry {
pub result: i64,
pub user_data: u64,
pub flags: u16,
pub _reserved: [u8; 6],
}
impl CompleteEntry {
#[inline]
pub const fn new(result: i64, user_data: u64) -> Self {
Self {
result,
user_data,
flags: 0,
_reserved: [0; 6],
}
}
#[inline]
pub fn is_ok(&self) -> bool {
self.result >= 0
}
#[inline]
pub fn error(&self) -> Option<i32> {
if self.result < 0 {
Some((-self.result) as i32)
} else {
None
}
}
}
pub mod complete_flags {
pub const SIGNAL_PENDING: u16 = 1 << 0;
pub const TIMER_EXPIRED: u16 = 1 << 1;
}
#[repr(C)]
pub struct SubmitRing {
pub submit_head: u32,
pub submit_tail: u32,
pub complete_head: u32,
pub complete_tail: u32,
pub _pad: [u8; 48],
}