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