use super::*;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum QueueCommand {
Pm4,
Sdma,
Aql,
AqlMetadata,
Xdna,
Unknown(u32),
}
#[derive(Clone, Debug)]
pub struct QueueCapabilities {
pub ordinal: u32,
pub command: QueueCommand,
pub format_version: u32,
pub format_features: u64,
pub user_publication: bool,
pub kernel_publication: bool,
pub minimum_ring_bytes: u64,
pub maximum_ring_bytes: u64,
pub ring_alignment: u64,
pub system_release: bool,
pub system_acquire: bool,
}
impl Endpoint {
pub fn queue_capabilities(&self) -> Result<Vec<QueueCapabilities>> {
let api = self.0.instance.api.core;
let mut info = amdf_endpoint_info_t {
type_: AMDF_STRUCTURE_TYPE_ENDPOINT_INFO,
structure_size: size_of::<amdf_endpoint_info_t>() as u32,
..Default::default()
};
check("endpoint_query_info", unsafe {
entry!(api, endpoint_query_info)(self.0.raw, &mut info)
})?;
(0..info.queue_family_count)
.map(|ordinal| {
let mut family = amdf_queue_family_info_t {
type_: AMDF_STRUCTURE_TYPE_QUEUE_FAMILY_INFO,
structure_size: size_of::<amdf_queue_family_info_t>() as u32,
..Default::default()
};
check("endpoint_query_queue_family_info", unsafe {
entry!(api, endpoint_query_queue_family_info)(self.0.raw, ordinal, &mut family)
})?;
Ok(QueueCapabilities {
ordinal,
command: match family.command_type {
AMDF_QUEUE_COMMAND_TYPE_GPU_PM4 => QueueCommand::Pm4,
AMDF_QUEUE_COMMAND_TYPE_GPU_SDMA => QueueCommand::Sdma,
AMDF_QUEUE_COMMAND_TYPE_GPU_AQL => QueueCommand::Aql,
AMDF_QUEUE_COMMAND_TYPE_GPU_AQL_METADATA => QueueCommand::AqlMetadata,
AMDF_QUEUE_COMMAND_TYPE_XDNA => QueueCommand::Xdna,
unknown => QueueCommand::Unknown(unknown),
},
format_version: family.format_version,
format_features: family.format_features,
user_publication: family.publication_modes & AMDF_QUEUE_PUBLICATION_MODE_USER
!= 0,
kernel_publication: family.publication_modes
& AMDF_QUEUE_PUBLICATION_MODE_KERNEL
!= 0,
minimum_ring_bytes: family.minimum_ring_byte_length,
maximum_ring_bytes: family.maximum_ring_byte_length,
ring_alignment: family.ring_byte_length_alignment,
system_release: family.cache_operations
& (1 << AMDF_CACHE_OPERATION_RELEASE_TO_SYSTEM)
!= 0,
system_acquire: family.cache_operations
& (1 << AMDF_CACHE_OPERATION_ACQUIRE_FROM_SYSTEM)
!= 0,
})
})
.collect()
}
}