linux_video_core/impls/
capability.rs

1use crate::{calls, types::*, utils, Internal, Result};
2use core::mem::MaybeUninit;
3use std::os::unix::io::RawFd;
4
5trivial_impls! {
6    Capability {
7        /// Driver name
8        getstr driver: &str,
9        /// Card name
10        getstr card: &str,
11        /// Bus name
12        getstr bus(bus_info): &str,
13    }
14}
15
16impl core::fmt::Display for VersionTriple {
17    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
18        self.major.fmt(f)?;
19        f.write_str(".")?;
20        self.minor.fmt(f)?;
21        f.write_str(".")?;
22        self.patch.fmt(f)
23    }
24}
25
26impl Internal<Capability> {
27    /// Query capabilities from file descriptor
28    pub fn query(fd: RawFd) -> Result<Self> {
29        let cap = MaybeUninit::zeroed();
30
31        let cap = unsafe_call!({
32            let mut cap = cap.assume_init();
33            calls::query_cap(fd, &mut cap).map(|_| cap)
34        })?;
35
36        utils::check_str(&cap.driver)?;
37        utils::check_str(&cap.card)?;
38        utils::check_str(&cap.bus_info)?;
39
40        Ok(cap.into())
41    }
42}
43
44impl core::fmt::Display for Capability {
45    fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
46        f.write_str("driver: '")?;
47        f.write_str(self.driver())?;
48        f.write_str("', card: '")?;
49        f.write_str(self.card())?;
50        f.write_str("', bus: '")?;
51        f.write_str(self.bus())?;
52        f.write_str("', version: ")?;
53        self.version().fmt(f)?;
54        f.write_str(", capabilities: ")?;
55        self.capabilities().fmt(f)?;
56        f.write_str(", device capabilities: ")?;
57        self.device_capabilities().fmt(f)
58    }
59}