use zerocopy::{U32, FromBytes};
use volatile::Volatile;
use byteorder::BigEndian;
use crate::send_queue::CurrentUARDoorbell;
#[derive(FromBytes)]
#[repr(C)]
pub(crate) struct UserAccessRegion {
_padding0: [u8; 32],
cq_ci: Volatile<U32<BigEndian>>,
cqn: Volatile<U32<BigEndian>>,
_padding1: [u8; 24],
eqn_with_arm: Volatile<U32<BigEndian>>,
_padding2: [u8; 4],
eqn: Volatile<U32<BigEndian>>,
_padding3: [u8; 1972],
db_blueflame_buffer0_even: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer0_odd: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer1_even: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer1_odd: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer2_even_fast_path: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer2_odd_fast_path: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer3_even_fast_path: Volatile<[U32<BigEndian>; 64]>,
db_blueflame_buffer3_odd_fast_path: Volatile<[U32<BigEndian>; 64]>,
}
const _: () = assert!(core::mem::size_of::<UserAccessRegion>() == 4096);
impl UserAccessRegion {
pub(crate) fn write_wqe_to_doorbell(&mut self, current_doorbell: &CurrentUARDoorbell, wqe_value: [U32<BigEndian>; 64]) {
match current_doorbell {
CurrentUARDoorbell::Even => self.db_blueflame_buffer0_even.write(wqe_value),
CurrentUARDoorbell::Odd => self.db_blueflame_buffer0_odd.write(wqe_value),
}
}
}
impl Default for UserAccessRegion {
fn default() -> UserAccessRegion {
UserAccessRegion {
_padding0: [0; 32],
cq_ci: Volatile::new(U32::new(0)),
cqn: Volatile::new(U32::new(0)),
_padding1: [0; 24],
eqn_with_arm: Volatile::new(U32::new(0)),
_padding2: [0; 4],
eqn: Volatile::new(U32::new(0)),
_padding3: [0; 1972],
db_blueflame_buffer0_even: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer0_odd: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer1_even: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer1_odd: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer2_even_fast_path: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer2_odd_fast_path: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer3_even_fast_path: Volatile::new([U32::new(0); 64]),
db_blueflame_buffer3_odd_fast_path: Volatile::new([U32::new(0); 64]),
}
}
}