use super::ExtendedCapability;
use accessor::{array, single, Mapper};
use bit_field::BitField;
use core::convert::TryInto;
#[derive(Debug)]
pub struct XhciLocalMemory<M>
where
M: Mapper + Clone,
{
pub header: single::ReadWrite<Header, M>,
pub memory: array::ReadWrite<u8, M>,
}
impl<M> XhciLocalMemory<M>
where
M: Mapper + Clone,
{
pub unsafe fn new(base: usize, mapper: M) -> Option<Self> {
let header: single::ReadWrite<Header, M> = single::ReadWrite::new(base, mapper.clone());
let size = header.read_volatile().size();
if size > 0 {
let memory = array::ReadWrite::new(base + 8, (size * 1024).try_into().unwrap(), mapper);
Some(Self { header, memory })
} else {
None
}
}
}
impl<M> From<XhciLocalMemory<M>> for ExtendedCapability<M>
where
M: Mapper + Clone,
{
fn from(x: XhciLocalMemory<M>) -> Self {
ExtendedCapability::XhciLocalMemory(x)
}
}
#[repr(transparent)]
#[derive(Copy, Clone)]
pub struct Header([u32; 2]);
impl Header {
#[must_use]
pub fn local_memory_enable(self) -> bool {
self.0[0].get_bit(16)
}
pub fn set_local_memory_enable(&mut self) {
self.0[0].set_bit(16, true);
}
pub fn clear_local_memory_enable(&mut self) {
self.0[0].set_bit(16, false);
}
fn size(self) -> u32 {
self.0[1]
}
}
impl_debug_from_methods! {
Header {
local_memory_enable,
}
}