starnix_modules_magma/
init.rs1use crate::MagmaFile;
6use starnix_core::device::DeviceOps;
7use starnix_core::task::CurrentTask;
8use starnix_core::vfs::{FileOps, NamespaceNode};
9use starnix_sync::{FileOpsCore, LockEqualOrBefore, Locked};
10use starnix_uapi::device_type::DeviceType;
11use starnix_uapi::errors::Errno;
12use starnix_uapi::open_flags::OpenFlags;
13
14#[derive(Clone)]
15struct MagmaDeviceBuilder {
16 supported_vendors: Vec<u16>,
17}
18
19impl DeviceOps for MagmaDeviceBuilder {
20 fn open(
21 &self,
22 _locked: &mut Locked<FileOpsCore>,
23 current_task: &CurrentTask,
24 id: DeviceType,
25 node: &NamespaceNode,
26 flags: OpenFlags,
27 ) -> Result<Box<dyn FileOps>, Errno> {
28 MagmaFile::new_file(
29 current_task,
30 id,
31 &node.entry.node,
32 flags,
33 self.supported_vendors.clone(),
34 )
35 }
36}
37
38pub fn magma_device_init<L>(
39 locked: &mut Locked<L>,
40 current_task: &CurrentTask,
41 supported_vendors: Vec<u16>,
42) where
43 L: LockEqualOrBefore<FileOpsCore>,
44{
45 let kernel = current_task.kernel();
46 let registry = &kernel.device_registry;
47 let builder = MagmaDeviceBuilder { supported_vendors };
48
49 registry
50 .register_dyn_device(
51 locked,
52 current_task,
53 "magma0".into(),
54 registry.objects.starnix_class(),
55 builder,
56 )
57 .expect("can register magma0");
58}