Skip to content

Commit

Permalink
node: Put NodeType <-> dev_t conversions closer together
Browse files Browse the repository at this point in the history
Group all this logic together in functions inside `impl NodeType`.
  • Loading branch information
MarijnS95 committed Nov 1, 2024
1 parent 3a61424 commit 4b08084
Showing 1 changed file with 31 additions and 17 deletions.
48 changes: 31 additions & 17 deletions src/node/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,16 +44,7 @@ impl DrmNode {
return Err(CreateDrmNodeError::NotDrmNode);
}

// The type of the DRM node is determined by the minor number ranges:
// 0 - 63 -> Primary
// 64 - 127 -> Control
// 128 - 255 -> Render
let ty = match minor(dev) >> 6 {
0 => NodeType::Primary,
1 => NodeType::Control,
2 => NodeType::Render,
_ => return Err(CreateDrmNodeError::NotDrmNode),
};
let ty = NodeType::from_dev_id(dev)?;

Ok(DrmNode { dev, ty })
}
Expand Down Expand Up @@ -140,6 +131,12 @@ pub enum NodeType {
}

impl NodeType {
/// Bit-offset of [`NodeType`] inside [`minor()`]
const MINOR_OFFSET: u32 = 6;
/// Mask of [`NodeType`] inside [`minor()`]
#[cfg(not(target_os = "linux"))]
const MINOR_MASK: u32 = 0b11 << Self::MINOR_OFFSET;

/// Returns a string representing the prefix of a minor device's name.
///
/// For example, on Linux with a primary node, the returned string would be `card`.
Expand All @@ -151,14 +148,33 @@ impl NodeType {
}
}

fn from_dev_id(dev: dev_t) -> Result<Self, CreateDrmNodeError> {
// The type of the DRM node is determined by the minor number ranges:
// 0 - 63 -> Primary
// 64 - 127 -> Control
// 128 - 255 -> Render
Ok(match minor(dev) >> Self::MINOR_OFFSET {
0 => Self::Primary,
1 => Self::Control,
2 => Self::Render,
_ => return Err(CreateDrmNodeError::NotDrmNode),
})
}

#[cfg(not(target_os = "linux"))]
fn minor_base(&self) -> u32 {
fn minor_index(&self) -> u32 {
match self {
NodeType::Primary => 0,
NodeType::Control => 64,
NodeType::Render => 128,
NodeType::Control => 1,
NodeType::Render => 2,
}
}

/// Returns the value to place at [`Self::MINOR_MASK`]
#[cfg(not(target_os = "linux"))]
fn minor_base(&self) -> u32 {
self.minor_index() << Self::MINOR_OFFSET
}
}

impl Display for NodeType {
Expand Down Expand Up @@ -330,8 +346,7 @@ pub fn dev_path(dev: dev_t, ty: NodeType) -> io::Result<PathBuf> {
if let Some(dev_name) = devname(dev) {
let suffix = dev_name.trim_start_matches(|c: char| !c.is_numeric());
if let Ok(old_id) = suffix.parse::<u32>() {
const ID_MASK: u32 = 0b11_1111;
let id = old_id & ID_MASK | ty.minor_base();
let id = old_id & !NodeType::MINOR_MASK | ty.minor_base();
let path = PathBuf::from(format!("/dev/dri/{}{}", ty.minor_name_prefix(), id));
if path.exists() {
return Ok(path);
Expand Down Expand Up @@ -363,8 +378,7 @@ pub fn dev_path(dev: dev_t, ty: NodeType) -> io::Result<PathBuf> {
}

let old_id = minor(dev);
const ID_MASK: u32 = 0b11_1111;
let id = old_id & ID_MASK | ty.minor_base();
let id = old_id & !NodeType::MINOR_MASK | ty.minor_base();
let path = PathBuf::from(format!("/dev/dri/{}{}", ty.minor_name_prefix(), id));
if path.exists() {
return Ok(path);
Expand Down

0 comments on commit 4b08084

Please sign in to comment.