geopm 3.1.1.dev453+g1f4a5a13
GEOPM - Global Extensible Open Power Manager
Loading...
Searching...
No Matches
SSTIOGroup.hpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 - 2024 Intel Corporation
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#ifndef SSTIOGROUP_HPP_INCLUDE
7#define SSTIOGROUP_HPP_INCLUDE
8
9#include <set>
10#include <functional>
11#include <cstdint>
12
13#include "geopm/IOGroup.hpp"
14#include "geopm/Agg.hpp"
15
16namespace geopm
17{
18 class PlatformTopo;
19 class SSTIO;
20 class Signal;
21 class Control;
22 class SaveControl;
23
25 class SSTIOGroup : public IOGroup
26 {
27 public:
28 SSTIOGroup();
29 SSTIOGroup(const PlatformTopo &topo,
30 std::shared_ptr<SSTIO> sstio,
31 std::shared_ptr<SaveControl> save_control);
32 virtual ~SSTIOGroup() = default;
33 std::set<std::string> signal_names(void) const override;
34 std::set<std::string> control_names(void) const override;
35 bool is_valid_signal(const std::string &signal_name) const override;
36 bool is_valid_control(const std::string &control_name) const override;
37 int signal_domain_type(const std::string &signal_name) const override;
38 int control_domain_type(const std::string &control_name) const override;
39 int push_signal(const std::string &signal_name, int domain_type, int domain_idx) override;
40 int push_control(const std::string &control_name, int domain_type, int domain_idx) override;
41 void read_batch(void) override;
42 void write_batch(void) override;
43 double sample(int batch_idx) override;
44 void adjust(int batch_idx, double setting) override;
45 double read_signal(const std::string &signal_name, int domain_type, int domain_idx) override;
46 void write_control(const std::string &control_name, int domain_type, int domain_idx, double setting) override;
47 void save_control(void) override;
48 void restore_control(void) override;
49 std::function<double(const std::vector<double> &)> agg_function(const std::string &signal_name) const override;
50 std::function<std::string(double)> format_function(const std::string &signal_name) const override;
51 std::string signal_description(const std::string &signal_name) const override;
52 std::string control_description(const std::string &control_name) const override;
53 int signal_behavior(const std::string &signal_name) const override;
54 void save_control(const std::string &save_path) override;
55 void restore_control(const std::string &save_path) override;
56 std::string name(void) const override;
57 static std::string plugin_name(void);
58 static std::unique_ptr<IOGroup> make_plugin(void);
59
60 enum class SSTMailboxCommand : uint16_t {
61 M_TURBO_FREQUENCY = 0x7f,
62 M_CORE_PRIORITY = 0xd0,
64 };
65 private:
66 struct sst_signal_mailbox_field_s {
74 sst_signal_mailbox_field_s(uint32_t request_data, uint32_t begin_bit,
75 uint32_t end_bit, double multiplier,
76 int units, const std::string &description,
77 m_signal_behavior_e behavior)
78 : sst_signal_mailbox_field_s(
79 request_data,
80 begin_bit,
81 end_bit,
82 multiplier,
83 units,
84 description,
85 behavior,
86 Agg::expect_same)
87 {
88 }
89
90 sst_signal_mailbox_field_s(uint32_t request_data, uint32_t begin_bit,
91 uint32_t end_bit, double multiplier,
92 int units, const std::string &description,
93 m_signal_behavior_e behavior,
94 std::function<double(const std::vector<double> &)> agg_function)
95 : request_data(request_data)
96 , begin_bit(begin_bit)
97 , end_bit(end_bit)
98 , multiplier(multiplier)
99 , units(units)
100 , description(description)
101 , behavior(behavior)
102 , agg_function(std::move(agg_function))
103 {
104 }
105 uint32_t request_data;
106 uint32_t begin_bit;
107 uint32_t end_bit;
108 double multiplier;
109 int units;
110 std::string description;
111 m_signal_behavior_e behavior;
112 std::function<double(const std::vector<double> &)> agg_function;
113 };
114 struct sst_signal_mailbox_raw_s {
118 sst_signal_mailbox_raw_s(SSTIOGroup::SSTMailboxCommand command, uint16_t subcommand,
119 const std::map<std::string, sst_signal_mailbox_field_s>& fields)
120 : command(command)
121 , subcommand(subcommand)
122 , fields(fields)
123 {
124 }
125 SSTMailboxCommand command;
126 uint16_t subcommand;
127 std::map<std::string, sst_signal_mailbox_field_s> fields;
128 };
129
130 struct sst_control_mailbox_field_s {
131 sst_control_mailbox_field_s(uint32_t write_data, uint32_t begin_bit,
132 uint32_t end_bit, int units,
133 const std::string &description)
134 : sst_control_mailbox_field_s(
135 write_data,
136 begin_bit,
137 end_bit,
138 units,
139 description,
140 Agg::expect_same)
141 {
142 }
143
144 sst_control_mailbox_field_s(uint32_t write_data, uint32_t begin_bit,
145 uint32_t end_bit, int units,
146 const std::string &description,
147 std::function<double(const std::vector<double> &)> agg_function)
148 : write_data(write_data)
149 , begin_bit(begin_bit)
150 , end_bit(end_bit)
151 , units(units)
152 , description(description)
153 , agg_function(std::move(agg_function))
154 {
155 }
156 uint32_t write_data;
157 uint32_t begin_bit;
158 uint32_t end_bit;
159 int units;
160 std::string description;
161 std::function<double(const std::vector<double> &)> agg_function;
162 };
163 struct sst_control_mailbox_raw_s {
167 sst_control_mailbox_raw_s(
168 SSTMailboxCommand command, uint16_t subcommand, uint32_t write_param,
169 const std::map<std::string, sst_control_mailbox_field_s>& fields,
170 uint16_t read_subcommand, uint32_t read_request_data)
171 : command(command)
172 , subcommand(subcommand)
173 , write_param(write_param)
174 , fields(fields)
175 , read_subcommand(read_subcommand)
176 , read_request_data(read_request_data)
177 {
178 }
179 SSTMailboxCommand command;
180 uint16_t subcommand;
181 uint32_t write_param;
182 std::map<std::string, sst_control_mailbox_field_s> fields;
183 uint16_t read_subcommand;
184 uint32_t read_request_data;
185 };
186
187 struct sst_control_mmio_field_s {
188 sst_control_mmio_field_s(uint32_t begin_bit, uint32_t end_bit,
189 double multiplier, int units,
190 const std::string &description)
191 : sst_control_mmio_field_s(
192 begin_bit,
193 end_bit,
194 multiplier,
195 units,
196 description,
197 Agg::expect_same)
198 {
199 }
200
201 sst_control_mmio_field_s(uint32_t begin_bit, uint32_t end_bit,
202 double multiplier, int units,
203 const std::string &description,
204 std::function<double(const std::vector<double> &)> agg_function)
205 : begin_bit(begin_bit)
206 , end_bit(end_bit)
207 , multiplier(multiplier)
208 , units(units)
209 , description(description)
210 , agg_function(std::move(agg_function))
211 {
212 }
213 uint32_t begin_bit;
214 uint32_t end_bit;
215 double multiplier;
216 int units;
217 std::string description;
218 std::function<double(const std::vector<double> &)> agg_function;
219 };
220 struct sst_control_mmio_raw_s {
224 sst_control_mmio_raw_s(int domain_type, uint32_t register_offset,
225 const std::map<std::string, sst_control_mmio_field_s>& fields)
226 : domain_type(domain_type)
227 , register_offset(register_offset)
228 , fields(fields)
229 {
230 }
231 int domain_type;
232 uint32_t register_offset;
233 std::map<std::string, sst_control_mmio_field_s> fields;
234 };
235
236 struct sst_signal_mmio_field_s {
237 sst_signal_mmio_field_s(uint32_t write_value, uint32_t begin_bit,
238 uint32_t end_bit, double multiplier,
239 int units, const std::string &description,
240 m_signal_behavior_e behavior)
241 : sst_signal_mmio_field_s(
242 write_value,
243 begin_bit,
244 end_bit,
245 multiplier,
246 units,
247 description,
248 behavior,
249 Agg::expect_same)
250 {
251 }
252
253 sst_signal_mmio_field_s(uint32_t write_value, uint32_t begin_bit,
254 uint32_t end_bit, double multiplier,
255 int units, const std::string &description,
256 m_signal_behavior_e behavior,
257 std::function<double(const std::vector<double> &)> agg_function)
258 : write_value(write_value)
259 , begin_bit(begin_bit)
260 , end_bit(end_bit)
261 , multiplier(multiplier)
262 , units(units)
263 , description(description)
264 , behavior(behavior)
265 , agg_function(std::move(agg_function))
266 {
267 }
268 uint32_t write_value;
269 uint32_t begin_bit;
270 uint32_t end_bit;
271 double multiplier;
272 int units;
273 std::string description;
274 m_signal_behavior_e behavior;
275 std::function<double(const std::vector<double> &)> agg_function;
276 };
277
278 void add_mbox_signals(const std::string &raw_name,
279 SSTMailboxCommand command, uint16_t subcommand,
280 const std::map<std::string, sst_signal_mailbox_field_s> &fields);
281 void add_mbox_controls(
282 const std::string &raw_name, SSTMailboxCommand command,
283 uint16_t subcommand, uint32_t write_param,
284 const std::map<std::string, sst_control_mailbox_field_s> &fields,
285 uint16_t read_subcommand, uint32_t read_request_data,
286 uint32_t read_mask);
287
288 void add_mmio_signals(const std::string &raw_name, int domain_type,
289 uint32_t register_offset,
290 const std::map<std::string, sst_signal_mmio_field_s> &fields);
291 void add_mmio_controls(const std::string &raw_name, int domain_type,
292 uint32_t register_offset,
293 const std::map<std::string, sst_control_mmio_field_s> &fields,
294 uint32_t read_mask);
295
296 static const std::map<std::string, sst_signal_mailbox_raw_s> sst_signal_mbox_info;
297 static const std::map<std::string, sst_control_mailbox_raw_s> sst_control_mbox_info;
298 static const std::map<std::string, sst_control_mmio_raw_s> sst_control_mmio_info;
299 const PlatformTopo &m_topo;
300 std::shared_ptr<SSTIO> m_sstio;
301 bool m_is_read;
302
303 // All available signals: map from name to signal_info.
304 // The signals vector is over the indices for the domain.
305 // The signals pointers should be copied when signal is
306 // pushed and used directly for read_signal.
307 struct signal_info
308 {
309 std::vector<std::shared_ptr<Signal> > signals;
310 int domain;
311 int units;
312 std::function<double(const std::vector<double> &)> agg_function;
313 std::string description;
314 m_signal_behavior_e behavior;
315 };
316 std::map<std::string, signal_info> m_signal_available;
317
318 struct control_info
319 {
320 std::vector<std::shared_ptr<Control> > controls;
321 int domain;
322 int units;
323 std::function<double(const std::vector<double> &)> agg_function;
324 std::string description;
325 };
326 std::map<std::string, control_info> m_control_available;
327
328 // Mapping of signal index to pushed signals.
329 std::vector<std::shared_ptr<Signal> > m_signal_pushed;
330
331 // Mapping of control index to pushed controls
332 std::vector<std::shared_ptr<Control> > m_control_pushed;
333
334 std::shared_ptr<SaveControl> m_mock_save_ctl;
335 };
336}
337
338#endif
Definition Agg.hpp:20
Definition IOGroup.hpp:21
m_signal_behavior_e
Description of the runtime behavior of a signal.
Definition IOGroup.hpp:36
Definition PlatformTopo.hpp:28
IOGroup that provides a signal for the time since GEOPM startup.
Definition SSTIOGroup.hpp:26
void write_batch(void) override
Write all of the pushed controls so that values previously given to adjust() are written to the platf...
Definition SSTIOGroup.cpp:478
void restore_control(void) override
Restore all controls to values recorded in previous call to the save() method.
Definition SSTIOGroup.cpp:559
int signal_behavior(const std::string &signal_name) const override
Returns a hint about how a signal will change as a function of time.
Definition SSTIOGroup.cpp:646
static std::string plugin_name(void)
Definition SSTIOGroup.cpp:573
int signal_domain_type(const std::string &signal_name) const override
Query the domain for a named signal.
Definition SSTIOGroup.cpp:389
std::function< double(const std::vector< double > &)> agg_function(const std::string &signal_name) const override
Return a function that should be used when aggregating the given signal.
Definition SSTIOGroup.cpp:583
void save_control(void) override
Save the state of all controls so that any subsequent changes made through the IOGroup can be undone ...
Definition SSTIOGroup.cpp:536
std::set< std::string > control_names(void) const override
Returns the names of all controls provided by the IOGroup.
Definition SSTIOGroup.cpp:370
std::string signal_description(const std::string &signal_name) const override
Returns a description of the signal. This string can be used by tools to generate help text for users...
Definition SSTIOGroup.cpp:608
std::string control_description(const std::string &control_name) const override
Returns a description of the control. This string can be used by tools to generate help text for user...
Definition SSTIOGroup.cpp:627
void read_batch(void) override
Read all pushed signals from the platform so that the next call to sample() will reflect the updated ...
Definition SSTIOGroup.cpp:472
SSTIOGroup()
Definition SSTIOGroup.cpp:237
int push_control(const std::string &control_name, int domain_type, int domain_idx) override
Add a control to the list of controls that is written by write_batch() and configured with adjust().
Definition SSTIOGroup.cpp:437
int control_domain_type(const std::string &control_name) const override
Query the domain for a named control.
Definition SSTIOGroup.cpp:399
void write_control(const std::string &control_name, int domain_type, int domain_idx, double setting) override
Interpret the setting and write setting to the platform. Does not modify the values stored by calling...
Definition SSTIOGroup.cpp:519
SSTMailboxCommand
Definition SSTIOGroup.hpp:60
static std::unique_ptr< IOGroup > make_plugin(void)
Definition SSTIOGroup.cpp:578
int push_signal(const std::string &signal_name, int domain_type, int domain_idx) override
Add a signal to the list of signals that is read by read_batch() and sampled by sample().
Definition SSTIOGroup.cpp:409
std::function< std::string(double)> format_function(const std::string &signal_name) const override
Returns a function that can be used to convert a signal of the given name into a printable string....
Definition SSTIOGroup.cpp:594
virtual ~SSTIOGroup()=default
std::string name(void) const override
Get the IOGroup name.
Definition SSTIOGroup.cpp:568
void adjust(int batch_idx, double setting) override
Adjust a setting for a particular control that was previously pushed with push_control()....
Definition SSTIOGroup.cpp:497
double read_signal(const std::string &signal_name, int domain_type, int domain_idx) override
Read from platform and interpret into SI units a signal given its name and domain....
Definition SSTIOGroup.cpp:502
double sample(int batch_idx) override
Retrieve signal value from data read by last call to read_batch() for a particular signal previously ...
Definition SSTIOGroup.cpp:483
std::set< std::string > signal_names(void) const override
Returns the names of all signals provided by the IOGroup.
Definition SSTIOGroup.cpp:361
bool is_valid_control(const std::string &control_name) const override
Test if control_name refers to a control supported by the group.
Definition SSTIOGroup.cpp:384
bool is_valid_signal(const std::string &signal_name) const override
Test if signal_name refers to a signal supported by the group.
Definition SSTIOGroup.cpp:379
Definition Agg.cpp:20