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