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(
16        "wakeup_count",
17        PowerWakeupCountFile::new_node(kernel.suspend_resume_manager.clone()),
18        mode!(IFREG, 0o644),
19    );
20    dir.entry("wake_lock", PowerWakeLockFile::new_node(), mode!(IFREG, 0o660));
21    dir.entry("wake_unlock", PowerWakeUnlockFile::new_node(), mode!(IFREG, 0o660));
22    dir.entry("state", PowerStateFile::new_node(), mode!(IFREG, 0o644));
23    dir.entry("sync_on_suspend", PowerSyncOnSuspendFile::new_node(), mode!(IFREG, 0o644));
24    dir.subdir("suspend_stats", 0o755, |dir| {
25        let read_only_file_mode = mode!(IFREG, 0o444);
26        dir.entry(
27            "success",
28            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
29                kernel.suspend_resume_manager.suspend_stats().success_count.to_string()
30            }),
31            read_only_file_mode,
32        );
33        dir.entry(
34            "fail",
35            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
36                kernel.suspend_resume_manager.suspend_stats().fail_count.to_string()
37            }),
38            read_only_file_mode,
39        );
40        dir.entry(
41            "last_failed_dev",
42            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
43                kernel.suspend_resume_manager.suspend_stats().last_failed_device.unwrap_or_default()
44            }),
45            read_only_file_mode,
46        );
47        dir.entry(
48            "last_failed_errno",
49            create_bytes_file_with_handler(kernel.weak_self.clone(), |kernel| {
50                kernel
51                    .suspend_resume_manager
52                    .suspend_stats()
53                    .last_failed_errno
54                    .map(|e| format!("-{}", e.code.error_code()))
55                    // This matches local linux behavior when no suspends have failed.
56                    .unwrap_or_else(|| "0".to_string())
57            }),
58            read_only_file_mode,
59        );
60    });
61}