44#include "debug/DVFS.hh"
45#include "params/DVFSHandler.hh"
60 sysClkDomain(
p.sys_clk_domain),
62 _transLatency(
p.transition_latency)
66 for (
auto dit =
p.domains.begin();
dit !=
p.domains.end(); ++
dit) {
71 "system clk domain entry");
73 "DVFS: Controlled domain %s needs to have a properly "\
74 " assigned ID.\n",
d->name());
76 auto entry = std::make_pair(domain_id,
d);
77 bool new_elem =
domains.insert(entry).second;
78 fatal_if(!new_elem,
"DVFS: Domain %s with ID %d does not have a "\
79 "unique ID.\n",
d->name(), domain_id);
112 warn(
"DVFS: invalid domain ID %d, the DVFS handler does not handle this "\
113 "domain\n", domain_id);
122 DPRINTF(DVFS,
"DVFS: setPerfLevel domain %d -> %d\n", domain_id, perf_level);
125 if (!
d->validPerfLevel(perf_level)) {
126 warn(
"DVFS: invalid performance level %d for domain ID %d, request "\
127 "ignored\n", perf_level, domain_id);
135 DPRINTF(DVFS,
"DVFS: Overwriting the previous DVFS event.\n");
143 if (
d->perfLevel() == perf_level) {
144 DPRINTF(DVFS,
"DVFS: Ignoring ineffective performance level change "\
145 "%d -> %d\n",
d->perfLevel(), perf_level);
151 DPRINTF(DVFS,
"DVFS: Update for perf event scheduled for %ld\n", when);
179 return d->voltage(perf_level);
183 DPRINTF(DVFS,
"DVFS: Request for perf-level %i for single-point "\
184 "voltage domain %s. Returning voltage at level 0: %.2f "\
185 "V\n", perf_level,
d->name(),
d->voltage(0));
188 return d->voltage(0);
191 warn(
"DVFSHandler %s reads illegal voltage level %u from "\
192 "VoltageDomain %s. Returning 0 V\n",
name(), perf_level,
d->name());
213 assert(
id ==
event->domainIDToSet);
214 domain_ids.push_back(
id);
215 perf_levels.push_back(
event->perfLevelToSet);
216 whens.push_back(
event->scheduled() ?
event->when() : 0);
231 warn(
"DVFS: Forcing enable handler status to unserialized value of %d",
243 for (
size_t i = 0;
i < domain_ids.size(); ++
i) {;
247 event->perfLevelToSet = perf_levels[
i];
VoltageDomain * voltageDomain() const
Get the voltage domain.
DVFS Handler class, maintains a list of all the domains it can handle.
SrcClockDomain * sysClkDomain
Clock domain of the system the handler is instantiated.
SrcClockDomain::PerfLevel PerfLevel
DVFSHandler(const Params &p)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
bool perfLevel(DomainID domain_id, PerfLevel perf_level)
Set a new performance level for the specified domain.
bool isEnabled() const
Check enable status of the DVFS handler, when the handler is disabled, no request should be sent to t...
std::vector< DomainID > domainIDList
List of IDs avaiable in the domain list.
DomainID domainID(uint32_t index) const
Get the n-th domain ID, from the domains managed by this handler.
double voltageAtPerfLevel(DomainID domain_id, PerfLevel perf_level) const
Read the voltage of the specified domain at the specified performance level.
SrcClockDomain * findDomain(DomainID domain_id) const
Search for a domain based on the domain ID.
uint32_t numDomains() const
Get the number of domains assigned to this DVFS handler.
SrcClockDomain::DomainID DomainID
void serialize(CheckpointOut &cp) const override
Serialize an object.
bool validDomainID(DomainID domain_id) const
Check whether a domain ID is known to the handler or not.
UpdatePerfLevelEvents updatePerfLevelEvents
Map from domain IDs -> perf level update events, records in-flight change requests per domain ID.
const Tick _transLatency
This corresponds to the maximum transition latency associated with the hardware transitioning from a ...
bool enableHandler
Disabling the DVFS handler ensures that all the DVFS migration requests are ignored.
virtual std::string name() const
Abstract superclass for simulation objects.
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
static const DomainID emptyDomainID
uint32_t domainID() const
A VoltageDomain is used to group clock domains that operate under the same voltage.
DVFSHandler and DomainConfig class declaration used for managing voltage and frequency scaling of the...
void deschedule(Event &event)
bool scheduled() const
Determine if the current event is scheduled.
void schedule(Event &event, Tick when)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
#define UNSERIALIZE_CONTAINER(member)
#define SERIALIZE_CONTAINER(member)
void dump()
Dump all statistics data to the registered outputs.
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Tick curTick()
The universal simulation clock.
std::ostream CheckpointOut
uint64_t Tick
Tick count type.
#define UNSERIALIZE_SCALAR(scalar)
#define SERIALIZE_SCALAR(scalar)
Update performance level event, encapsulates all the required information for a future call to change...
void updatePerfLevel()
Updates the performance level by modifying the clock and the voltage of the associated clocked object...
DomainID domainIDToSet
ID of the domain that will be changed by the in-flight event.
static DVFSHandler * dvfsHandler
Static pointer to the single DVFS hander for all the update events.
PerfLevel perfLevelToSet
Target performance level of the in-flight event.