use crate::{GenericAddressStructure, pcct::subspace::ReducedPCCSubspaceSMR};
#[derive(Copy, Clone)]
#[repr(C, packed)]
pub struct HWReducedCommunicationsType1 {
pub r#type: u8,
pub length: u8,
pub platform_interrupt: u32,
pub platform_interrupt_flags: u8,
reserved: u8,
pub base_address: u64,
pub memory_length: u64,
pub doorbell_register: GenericAddressStructure,
pub doorbell_preserve: u64,
pub doorbell_write: u64,
pub nominal_latency: u32,
pub max_periodic_access_rate: u32,
pub min_request_turnaround_time: u16,
}
impl HWReducedCommunicationsType1 {
pub const fn smr(&self) -> &ReducedPCCSubspaceSMR {
unsafe { &*(self.base_address as *const ReducedPCCSubspaceSMR) }
}
pub const fn communication_subspace(&self) -> &[u8] {
unsafe {
core::slice::from_raw_parts(
(self.base_address + 4) as *const u8,
self.memory_length as usize - 4,
)
}
}
}
#[derive(Copy, Clone)]
#[repr(C, packed)]
pub struct HWReducedCommunicationsType2 {
pub r#type: u8,
pub length: u8,
pub platform_interrupt: u32,
pub platform_interrupt_flags: u8,
reserved: u8,
pub base_address: u64,
pub memory_length: u64,
pub doorbell_register: GenericAddressStructure,
pub doorbell_preserve: u64,
pub doorbell_write: u64,
pub nominal_latency: u32,
pub max_periodic_access_rate: u32,
pub min_request_turnaround_time: u16,
pub platform_interrupt_ack_register: GenericAddressStructure,
pub platform_interrupt_ack_preserve: u64,
pub platform_interrupt_ack_write: u64,
}
impl HWReducedCommunicationsType2 {
pub const fn smr(&self) -> &ReducedPCCSubspaceSMR {
unsafe { &*(self.base_address as *const ReducedPCCSubspaceSMR) }
}
pub const fn communication_subspace(&self) -> &[u8] {
unsafe {
core::slice::from_raw_parts(
(self.base_address + 4) as *const u8,
self.memory_length as usize - 4,
)
}
}
}