starnix_core/fs/sysfs/
power_directory.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::power::{
6    PowerStateFile, PowerSyncOnSuspendFile, PowerWakeLockFile, PowerWakeUnlockFile,
7    PowerWakeupCountFile,
8};
9use crate::task::Kernel;
10use crate::vfs::pseudo::simple_directory::SimpleDirectoryMutator;
11use crate::vfs::pseudo::simple_file::create_bytes_file_with_handler;
12use starnix_uapi::file_mode::mode;
13
14pub fn build_power_directory(kernel: &Kernel, dir: &SimpleDirectoryMutator) {
15    dir.entry("wakeup_count", PowerWakeupCountFile::new_node(), mode!(IFREG, 0o644));
16    dir.entry("wake_lock", PowerWakeLockFile::new_node(), mode!(IFREG, 0o660));
17    dir.entry("wake_unlock", PowerWakeUnlockFile::new_node(), mode!(IFREG, 0o660));
18    dir.entry("state", PowerStateFile::new_node(), mode!(IFREG, 0o644));
19    dir.entry("sync_on_suspend", PowerSyncOnSuspendFile::new_node(), mode!(IFREG, 0o644));
20    dir.subdir("suspend_stats", 0o755, |dir| {
21        let read_only_file_mode = mode!(IFREG, 0o444);
22        dir.entry(
23            "success",
24            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
25                kernel.suspend_resume_manager.suspend_stats().success_count.to_string()
26            }),
27            read_only_file_mode,
28        );
29        dir.entry(
30            "fail",
31            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
32                kernel.suspend_resume_manager.suspend_stats().fail_count.to_string()
33            }),
34            read_only_file_mode,
35        );
36        dir.entry(
37            "last_failed_dev",
38            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
39                kernel.suspend_resume_manager.suspend_stats().last_failed_device.unwrap_or_default()
40            }),
41            read_only_file_mode,
42        );
43        dir.entry(
44            "last_failed_errno",
45            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
46                kernel
47                    .suspend_resume_manager
48                    .suspend_stats()
49                    .last_failed_errno
50                    .map(|e| format!("-{}", e.code.error_code()))
51                    // This matches local linux behavior when no suspends have failed.
52                    .unwrap_or_else(|| "0".to_string())
53            }),
54            read_only_file_mode,
55        );
56    });
57}