use heterob::{bit_numbering::Lsb, endianness::Le, Seq, P3, P4, P6};
use super::ExtendedCapabilityDataError;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PageRequestInterface {
pub page_request_control: PageRequestControl,
pub page_request_status: PageRequestStatus,
pub outstanding_page_request_capacity: u32,
pub outstanding_page_request_allocation: u32,
}
impl TryFrom<&[u8]> for PageRequestInterface {
type Error = ExtendedCapabilityDataError;
fn try_from(slice: &[u8]) -> Result<Self, Self::Error> {
let Seq {
head:
Le((
control,
status,
outstanding_page_request_capacity,
outstanding_page_request_allocation,
)),
..
} = P4(slice)
.try_into()
.map_err(|_| ExtendedCapabilityDataError {
name: "Page Request Interface",
size: 12,
})?;
let Lsb((enable, reset, ())) = P3::<u16, 1, 1, 14>(control).into();
let Lsb((
response_failure,
unexpected_page_request_group_index,
(),
stopped,
(),
prg_response_pasid_required,
)) = P6::<u16, 1, 1, 6, 1, 6, 1>(status).into();
Ok(Self {
page_request_control: PageRequestControl { enable, reset },
page_request_status: PageRequestStatus {
response_failure,
unexpected_page_request_group_index,
stopped,
prg_response_pasid_required,
},
outstanding_page_request_capacity,
outstanding_page_request_allocation,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PageRequestControl {
pub enable: bool,
pub reset: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PageRequestStatus {
pub response_failure: bool,
pub unexpected_page_request_group_index: bool,
pub stopped: bool,
pub prg_response_pasid_required: bool,
}