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 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}