xref: /aosp_15_r20/external/crosvm/vhost/src/scmi.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2023 The ChromiumOS Authors
2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file.
4*bb4ee6a4SAndroid Build Coastguard Worker 
5*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::File;
6*bb4ee6a4SAndroid Build Coastguard Worker use std::fs::OpenOptions;
7*bb4ee6a4SAndroid Build Coastguard Worker use std::os::unix::fs::OpenOptionsExt;
8*bb4ee6a4SAndroid Build Coastguard Worker use std::path::Path;
9*bb4ee6a4SAndroid Build Coastguard Worker 
10*bb4ee6a4SAndroid Build Coastguard Worker use base::AsRawDescriptor;
11*bb4ee6a4SAndroid Build Coastguard Worker use base::RawDescriptor;
12*bb4ee6a4SAndroid Build Coastguard Worker 
13*bb4ee6a4SAndroid Build Coastguard Worker use super::Error;
14*bb4ee6a4SAndroid Build Coastguard Worker use super::Result;
15*bb4ee6a4SAndroid Build Coastguard Worker use super::Vhost;
16*bb4ee6a4SAndroid Build Coastguard Worker 
17*bb4ee6a4SAndroid Build Coastguard Worker /// Handle for running VHOST_SCMI ioctls.
18*bb4ee6a4SAndroid Build Coastguard Worker pub struct Scmi {
19*bb4ee6a4SAndroid Build Coastguard Worker     descriptor: File,
20*bb4ee6a4SAndroid Build Coastguard Worker }
21*bb4ee6a4SAndroid Build Coastguard Worker 
22*bb4ee6a4SAndroid Build Coastguard Worker impl Scmi {
23*bb4ee6a4SAndroid Build Coastguard Worker     /// Open a handle to a new VHOST_SCMI instance.
new(vhost_scmi_device_path: &Path) -> Result<Scmi>24*bb4ee6a4SAndroid Build Coastguard Worker     pub fn new(vhost_scmi_device_path: &Path) -> Result<Scmi> {
25*bb4ee6a4SAndroid Build Coastguard Worker         Ok(Scmi {
26*bb4ee6a4SAndroid Build Coastguard Worker             descriptor: OpenOptions::new()
27*bb4ee6a4SAndroid Build Coastguard Worker                 .read(true)
28*bb4ee6a4SAndroid Build Coastguard Worker                 .write(true)
29*bb4ee6a4SAndroid Build Coastguard Worker                 .custom_flags(libc::O_CLOEXEC | libc::O_NONBLOCK)
30*bb4ee6a4SAndroid Build Coastguard Worker                 .open(vhost_scmi_device_path)
31*bb4ee6a4SAndroid Build Coastguard Worker                 .map_err(Error::VhostOpen)?,
32*bb4ee6a4SAndroid Build Coastguard Worker         })
33*bb4ee6a4SAndroid Build Coastguard Worker     }
34*bb4ee6a4SAndroid Build Coastguard Worker }
35*bb4ee6a4SAndroid Build Coastguard Worker 
36*bb4ee6a4SAndroid Build Coastguard Worker impl Vhost for Scmi {}
37*bb4ee6a4SAndroid Build Coastguard Worker 
38*bb4ee6a4SAndroid Build Coastguard Worker impl AsRawDescriptor for Scmi {
as_raw_descriptor(&self) -> RawDescriptor39*bb4ee6a4SAndroid Build Coastguard Worker     fn as_raw_descriptor(&self) -> RawDescriptor {
40*bb4ee6a4SAndroid Build Coastguard Worker         self.descriptor.as_raw_descriptor()
41*bb4ee6a4SAndroid Build Coastguard Worker     }
42*bb4ee6a4SAndroid Build Coastguard Worker }
43