1use serde_derive::Deserialize;
6use std::collections::HashMap;
7
8#[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}