Skip to main content

starnix_modules_magma/
init.rs

1// Copyright 2023 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use 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}