Skip to main content

cpu_manager_node_config/
node_config.rs

1// Copyright 2026 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 serde_derive::Deserialize;
6use std::collections::HashMap;
7
8/// Typed representation of a node entry in a CPU Manager node configuration JSON5 file.
9#[derive(Clone, Debug, Deserialize)]
10#[serde(tag = "type", deny_unknown_fields)]
11pub enum NodeConfig {
12    ThermalWatcher {
13        name: String,
14        dependencies: ThermalWatcherDependencies,
15    },
16    PowercapWatcher {
17        name: String,
18        dependencies: PowercapWatcherDependencies,
19    },
20    TrippointWatcher {
21        name: String,
22        config: TrippointWatcherConfig,
23        dependencies: TrippointWatcherDependencies,
24    },
25    CpuControlHandler {
26        name: String,
27        config: CpuControlHandlerConfig,
28        dependencies: CpuControlHandlerDependencies,
29    },
30    CpuDeviceHandler {
31        name: String,
32        config: CpuDeviceHandlerConfig,
33    },
34    CpuManagerMain {
35        name: String,
36        config: CpuManagerMainConfig,
37        dependencies: CpuManagerMainDependencies,
38    },
39    CpuStatsHandler {
40        name: String,
41        #[serde(default)]
42        config: Option<CpuStatsHandlerConfig>,
43    },
44    CpuStatsRecorder {
45        name: String,
46        config: CpuStatsRecorderConfig,
47    },
48    DomainController {
49        name: String,
50        dependencies: DomainControllerDependencies,
51    },
52    SyscallHandler {
53        name: String,
54        #[serde(default)]
55        config: Option<SyscallHandlerConfig>,
56    },
57}
58
59impl NodeConfig {
60    pub fn name(&self) -> &str {
61        match self {
62            NodeConfig::ThermalWatcher { name, .. }
63            | NodeConfig::PowercapWatcher { name, .. }
64            | NodeConfig::TrippointWatcher { name, .. }
65            | NodeConfig::CpuControlHandler { name, .. }
66            | NodeConfig::CpuDeviceHandler { name, .. }
67            | NodeConfig::CpuManagerMain { name, .. }
68            | NodeConfig::CpuStatsHandler { name, .. }
69            | NodeConfig::CpuStatsRecorder { name, .. }
70            | NodeConfig::DomainController { name, .. }
71            | NodeConfig::SyscallHandler { name, .. } => name,
72        }
73    }
74}
75
76#[derive(Clone, Debug, Deserialize)]
77#[serde(deny_unknown_fields)]
78pub struct ThermalWatcherDependencies {
79    pub thermal_handler_node: String,
80}
81
82#[derive(Clone, Debug, Deserialize)]
83#[serde(deny_unknown_fields)]
84pub struct PowercapWatcherDependencies {
85    pub cpu_manager_main_node: String,
86}
87
88#[derive(Clone, Debug, Deserialize)]
89#[serde(deny_unknown_fields)]
90pub struct TrippointWatcherConfig {
91    pub index_to_opp_map: HashMap<String, u32>,
92}
93
94#[derive(Clone, Debug, Deserialize)]
95#[serde(deny_unknown_fields)]
96pub struct TrippointWatcherDependencies {
97    pub cpu_handler_node: String,
98}
99
100#[derive(Clone, Debug, Deserialize)]
101#[serde(deny_unknown_fields)]
102pub struct CpuControlHandlerConfig {
103    pub sustainable_power: f64,
104    pub power_gain: f64,
105    pub total_domain_count: u8,
106    pub perf_rank: u8,
107    pub capacitance: f64,
108    pub min_cpu_clock_speed: f64,
109    pub logical_cpu_numbers: Vec<u32>,
110}
111
112#[derive(Clone, Debug, Deserialize)]
113#[serde(deny_unknown_fields)]
114pub struct CpuControlHandlerDependencies {
115    pub cpu_stats_handler_node: String,
116    pub cpu_dev_handler_node: String,
117}
118
119#[derive(Clone, Copy, Debug, Deserialize)]
120#[serde(deny_unknown_fields)]
121pub struct CpuDeviceHandlerConfig {
122    pub total_domain_count: u8,
123    pub perf_rank: u8,
124}
125
126#[derive(Clone, Debug, Deserialize)]
127#[serde(deny_unknown_fields)]
128pub struct ClusterConfig {
129    pub name: String,
130    pub cluster_index: usize,
131    pub handler: String,
132    pub logical_cpu_numbers: Vec<u32>,
133    pub normperfs_per_ghz: f64,
134    #[serde(default)]
135    pub boost_opp: Option<usize>,
136    #[serde(default)]
137    pub boot_max_opp: Option<u64>,
138    #[serde(default)]
139    pub boot_min_opp: Option<usize>,
140}
141
142#[derive(Clone, Debug, Deserialize)]
143#[serde(deny_unknown_fields)]
144pub struct ThermalStateConfig {
145    pub cluster_opps: Vec<usize>,
146    pub min_performance_normperfs: f64,
147    pub static_power_w: f64,
148    pub dynamic_power_per_normperf_w: f64,
149}
150
151#[derive(Clone, Debug, Deserialize)]
152#[serde(deny_unknown_fields)]
153pub struct CpuManagerMainConfig {
154    pub sustainable_power: f64,
155    pub power_gain: f64,
156    pub clusters: Vec<ClusterConfig>,
157    pub thermal_states: Vec<ThermalStateConfig>,
158}
159
160#[derive(Clone, Debug, Deserialize)]
161#[serde(deny_unknown_fields)]
162pub struct CpuManagerMainDependencies {
163    pub cpu_device_handlers: Vec<String>,
164    pub cpu_stats_handler: String,
165    pub syscall_handler: String,
166}
167
168#[derive(Clone, Copy, Debug, Default, Deserialize)]
169#[serde(deny_unknown_fields)]
170pub struct CpuStatsHandlerConfig {
171    #[serde(default)]
172    pub cpu_load_cache_duration_ms: Option<u32>,
173}
174
175#[derive(Clone, Copy, Debug, Deserialize)]
176#[serde(deny_unknown_fields)]
177pub struct CpuStatsRecorderConfig {
178    pub poll_interval_s: f64,
179    pub num_history_entries: usize,
180}
181
182#[derive(Clone, Debug, Deserialize)]
183#[serde(deny_unknown_fields)]
184pub struct DomainControllerDependencies {
185    pub cpu_manager_main_node: String,
186}
187
188#[derive(Clone, Copy, Debug, Default, Deserialize)]
189#[serde(deny_unknown_fields)]
190pub struct SyscallHandlerConfig {
191    #[serde(default)]
192    pub use_fake_cpu_resource: Option<bool>,
193}