45 #include "debug/DVFS.hh" 46 #include "params/DVFSHandler.hh" 59 sysClkDomain(p->sys_clk_domain),
61 _transLatency(p->transition_latency)
65 for (
auto dit = p->domains.begin();
dit != p->domains.end(); ++
dit) {
70 "system clk domain entry");
72 "DVFS: Controlled domain %s needs to have a properly "\
73 " assigned ID.\n", d->
name());
75 auto entry = std::make_pair(domain_id, d);
76 bool new_elem =
domains.insert(entry).second;
77 fatal_if(!new_elem,
"DVFS: Domain %s with ID %d does not have a "\
78 "unique ID.\n", d->
name(), domain_id);
82 event->domainIDToSet = d->
domainID();
111 warn(
"DVFS: invalid domain ID %d, the DVFS handler does not handle this "\
112 "domain\n", domain_id);
121 DPRINTF(DVFS,
"DVFS: setPerfLevel domain %d -> %d\n", domain_id, perf_level);
124 if (!
d->validPerfLevel(perf_level)) {
125 warn(
"DVFS: invalid performance level %d for domain ID %d, request "\
126 "ignored\n", perf_level, domain_id);
134 DPRINTF(DVFS,
"DVFS: Overwriting the previous DVFS event.\n");
142 if (
d->perfLevel() == perf_level) {
143 DPRINTF(DVFS,
"DVFS: Ignoring ineffective performance level change "\
144 "%d -> %d\n",
d->perfLevel(), perf_level);
150 DPRINTF(DVFS,
"DVFS: Update for perf event scheduled for %ld\n", when);
165 auto d = dvfsHandler->findDomain(domainIDToSet);
166 assert(
d->perfLevel() != perfLevelToSet);
168 d->perfLevel(perfLevelToSet);
182 DPRINTF(DVFS,
"DVFS: Request for perf-level %i for single-point "\
183 "voltage domain %s. Returning voltage at level 0: %.2f "\
190 warn(
"DVFSHandler %s reads illegal voltage level %u from "\
191 "VoltageDomain %s. Returning 0 V\n",
name(), perf_level, d->
name());
212 assert(
id ==
event->domainIDToSet);
213 domain_ids.push_back(
id);
214 perf_levels.push_back(
event->perfLevelToSet);
215 whens.push_back(
event->scheduled() ?
event->when() : 0);
230 warn(
"DVFS: Forcing enable handler status to unserialized value of %d",
242 for (
size_t i = 0;
i < domain_ids.size(); ++
i) {;
245 event->domainIDToSet = domain_ids[
i];
246 event->perfLevelToSet = perf_levels[
i];
256 DVFSHandlerParams::create()
bool perfLevel(DomainID domain_id, PerfLevel perf_level)
Set a new performance level for the specified domain.
VoltageDomain * voltageDomain() const
Get the voltage domain.
double voltageAtPerfLevel(DomainID domain_id, PerfLevel perf_level) const
Read the voltage of the specified domain at the specified performance level.
#define UNSERIALIZE_CONTAINER(member)
SrcClockDomain * findDomain(DomainID domain_id) const
Search for a domain based on the domain ID.
PerfLevel perfLevelToSet
Target performance level of the in-flight event.
bool isEnabled() const
Check enable status of the DVFS handler, when the handler is disabled, no request should be sent to t...
bool enableHandler
Disabling the DVFS handler ensures that all the DVFS migration requests are ignored.
bool validDomainID(DomainID domain_id) const
Check whether a domain ID is known to the handler or not.
SrcClockDomain * sysClkDomain
Clock domain of the system the handler is instantiated.
void unserialize(CheckpointIn &cp) override
Unserialize an object.
DomainID domainID(uint32_t index) const
Get the n-th domain ID, from the domains managed by this handler.
#define UNSERIALIZE_SCALAR(scalar)
void updatePerfLevel()
Updates the performance level by modifying the clock and the voltage of the associated clocked object...
Tick curTick()
The current simulated tick.
UpdatePerfLevelEvents updatePerfLevelEvents
Map from domain IDs -> perf level update events, records in-flight change requests per domain ID...
uint32_t numDomains() const
Get the number of domains assigned to this DVFS handler.
uint64_t Tick
Tick count type.
void serialize(CheckpointOut &cp) const override
Serialize an object.
void deschedule(Event &event)
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
void schedule(Event &event, Tick when)
ClockDomain declarations.
double voltage() const
Get the current voltage.
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...
#define SERIALIZE_SCALAR(scalar)
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
uint32_t domainID() const
bool scheduled() const
Determine if the current event is scheduled.
static const DomainID emptyDomainID
DVFS Handler class, maintains a list of all the domains it can handle.
virtual const std::string name() const
#define SERIALIZE_CONTAINER(member)
std::vector< DomainID > domainIDList
List of IDs avaiable in the domain list.
DVFSHandler(const Params *p)
std::ostream CheckpointOut
SrcClockDomain::DomainID DomainID
SrcClockDomain::PerfLevel PerfLevel
uint32_t numVoltages() const
void dump()
Dump all statistics data to the registered outputs.
static DVFSHandler * dvfsHandler
Static pointer to the single DVFS hander for all the update events.
const Tick _transLatency
This corresponds to the maximum transition latency associated with the hardware transitioning from a ...
Abstract superclass for simulation objects.
Update performance level event, encapsulates all the required information for a future call to change...