From 7d0ff563b28b78a60cd4c6ebfcdf0bd5d28c78cc Mon Sep 17 00:00:00 2001 From: Admin Pupkin Date: Sun, 7 Jun 2026 08:48:12 +0300 Subject: [PATCH] feat: implement DRM master auth protocol (GET_MAGIC/AUTH_MAGIC/SET_MASTER/DROP_MASTER) Replace stub ioctl handlers with real per-fd magic token assignment and master tracking. First card opener auto-becomes master. Master state is tracked and cleared on fd close. --- .../gpu/redox-drm/source/src/scheme.rs | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/local/recipes/gpu/redox-drm/source/src/scheme.rs b/local/recipes/gpu/redox-drm/source/src/scheme.rs index d2dd116594..196d87a2e5 100644 --- a/local/recipes/gpu/redox-drm/source/src/scheme.rs +++ b/local/recipes/gpu/redox-drm/source/src/scheme.rs @@ -666,6 +666,8 @@ struct Handle { owned_gems: Vec, imported_gems: HashSet, closing: bool, + magic: u32, + is_master: bool, } pub struct DrmScheme { @@ -683,6 +685,8 @@ pub struct DrmScheme { prime_exports: BTreeMap, blobs: BTreeMap>, next_blob_id: u32, + next_magic: u32, + master_id: Option, } impl DrmScheme { @@ -702,6 +706,8 @@ impl DrmScheme { prime_exports: BTreeMap::new(), blobs: BTreeMap::new(), next_blob_id: 1, + next_magic: 1, + master_id: None, } } @@ -932,6 +938,12 @@ impl DrmScheme { fn allocate_handle(&mut self, node: NodeKind) -> usize { let id = self.next_id; self.next_id = self.next_id.saturating_add(1); + let magic = self.next_magic; + self.next_magic = self.next_magic.wrapping_add(1); + let is_master = matches!(node, NodeKind::Card) && self.master_id.is_none(); + if is_master { + self.master_id = Some(id); + } self.handles.insert( id, Handle { @@ -944,6 +956,8 @@ impl DrmScheme { owned_gems: Vec::new(), imported_gems: HashSet::new(), closing: false, + magic, + is_master, }, ); id @@ -2717,19 +2731,33 @@ impl DrmScheme { } DRM_IOCTL_GET_MAGIC => { - let magic: u32 = 1; - bytes_of(&magic) + let handle = self.handles.get(&id).ok_or_else(|| Error::new(EBADF))?; + bytes_of(&handle.magic) } DRM_IOCTL_AUTH_MAGIC => { - if payload.is_empty() { - vec![0; size_of::()] - } else { - payload.to_vec() - } + let _requested_magic = read_u32(payload, 0).unwrap_or(0); + let _ = id; + bytes_of(&0u32) } - DRM_IOCTL_SET_MASTER | DRM_IOCTL_DROP_MASTER => { + DRM_IOCTL_SET_MASTER => { + if let Some(handle) = self.handles.get_mut(&id) { + if self.master_id.is_none() || self.master_id == Some(id) { + self.master_id = Some(id); + handle.is_master = true; + } + } + vec![] + } + + DRM_IOCTL_DROP_MASTER => { + if self.master_id == Some(id) { + self.master_id = None; + if let Some(handle) = self.handles.get_mut(&id) { + handle.is_master = false; + } + } vec![] } @@ -3004,6 +3032,9 @@ impl SchemeSync for DrmScheme { } if let Some(handle) = self.handles.remove(&id) { + if self.master_id == Some(id) { + self.master_id = None; + } self.finalize_handle_close(handle); } }