gem5  v22.1.0.0
voltage_domain.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012-2014, 2019 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Redistribution and use in source and binary forms, with or without
15  * modification, are permitted provided that the following conditions are
16  * met: redistributions of source code must retain the above copyright
17  * notice, this list of conditions and the following disclaimer;
18  * redistributions in binary form must reproduce the above copyright
19  * notice, this list of conditions and the following disclaimer in the
20  * documentation and/or other materials provided with the distribution;
21  * neither the name of the copyright holders nor the names of its
22  * contributors may be used to endorse or promote products derived from
23  * this software without specific prior written permission.
24  *
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
28  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
29  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
30  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
31  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
35  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36  */
37 
38 #include "sim/voltage_domain.hh"
39 
40 #include <algorithm>
41 
42 #include "base/logging.hh"
43 #include "base/trace.hh"
44 #include "debug/VoltageDomain.hh"
45 #include "params/VoltageDomain.hh"
46 #include "sim/serialize.hh"
47 
48 namespace gem5
49 {
50 
52  : SimObject(p), voltageOpPoints(p.voltage), _perfLevel(0), stats(*this)
53 {
54  fatal_if(voltageOpPoints.empty(), "DVFS: Empty set of voltages for "\
55  "voltage domain %s\n", name());
56 
57  // Voltages must be sorted in descending order.
58  fatal_if(!std::is_sorted(voltageOpPoints.begin(), voltageOpPoints.end(),
59  std::greater<Voltages::value_type>()), "DVFS: Voltage operation "\
60  "points not in descending order for voltage domain %s\n",
61  name());
62 }
63 
64 void
66 {
67  gem5_assert(perf_level < voltageOpPoints.size(),
68  "DVFS: Requested voltage ID %d is outside the known "\
69  "range for domain %s.\n", perf_level, name());
70 
71  if (perf_level == _perfLevel) {
72  // Silently ignore identical overwrites
73  return;
74  }
75 
76  _perfLevel = perf_level;
77 
78  DPRINTF(VoltageDomain, "Setting voltage to %.3fV idx: %d for domain %s\n",
79  voltage(), perf_level, name());
80 }
81 
82 bool
84 {
85  if (numVoltages() == 1)
86  return false;
87 
88  // Find the highest requested performance level and update the voltage
89  // domain with it
90  PerfLevel perf_max = (PerfLevel)-1;
91  for (auto dit = srcClockChildren.begin(); dit != srcClockChildren.end();
92  ++dit) {
93  SrcClockDomain* d = *dit;
94  gem5_assert(d->voltageDomain() == this, "DVFS: Clock domain %s "\
95  "(id: %d) should not be registered with voltage domain "\
96  "%s\n", d->name(), d->domainID(), name());
97 
98  PerfLevel perf = d->perfLevel();
99 
100  DPRINTF(VoltageDomain, "DVFS: Clock domain %s (id: %d) requests perf "\
101  "level %d\n", d->name(), d->domainID(), perf);
102 
103  // NOTE: Descending sort of performance levels: 0 - fast, 5 - slow
104  if (perf < perf_max) {
105  DPRINTF(VoltageDomain, "DVFS: Updating max perf level %d -> %d\n",
106  perf_max, perf);
107  perf_max = perf;
108  }
109  }
110  DPRINTF(VoltageDomain, "DVFS: Setting perf level of voltage domain %s "\
111  "from %d to %d.\n", name(), perfLevel(), perf_max);
112 
113  // Set the performance level
114  if (perf_max != perfLevel()) {
115  perfLevel(perf_max);
116  return true;
117  } else {
118  return false;
119  }
120 }
121 
122 void
124  bool changed = sanitiseVoltages();
125  if (changed) {
126  warn("DVFS: Perf level for voltage domain %s adapted to "\
127  "requested perf levels from source clock domains.\n", name());
128  }
129 }
130 
131 void
133 {
135 }
136 
137 void
139 {
142 }
143 
145  : statistics::Group(&vd),
146  ADD_STAT(voltage, statistics::units::Volt::get(), "Voltage in Volts")
147 {
149 }
150 
151 } // namespace gem5
#define DPRINTF(x,...)
Definition: trace.hh:186
virtual std::string name() const
Definition: named.hh:47
Abstract superclass for simulation objects.
Definition: sim_object.hh:148
SimObjectParams Params
Definition: sim_object.hh:170
The source clock domains provides the notion of a clock domain that is connected to a tunable clock s...
A VoltageDomain is used to group clock domains that operate under the same voltage.
PerfLevel perfLevel() const
Get the voltage point of the domain.
double voltage() const
Get the current voltage.
const Voltages voltageOpPoints
List of possible minimum voltage at each of the frequency operational points, should be in descending...
void unserialize(CheckpointIn &cp) override
Unserialize an object.
void startup() override
Startup has all SrcClockDomains registered with this voltage domain, so try to make sure that all per...
void serialize(CheckpointOut &cp) const override
Serialize an object.
uint32_t numVoltages() const
SrcClockChildren srcClockChildren
bool sanitiseVoltages()
Recomputes the highest (fastest, i.e., numerically lowest) requested performance level of all associa...
SrcClockDomain::PerfLevel PerfLevel
VoltageDomain(const Params &p)
Statistics container.
Definition: group.hh:94
Derived & method(T *obj, V(T::*method)() const)
Extended functor that calls the specified method of the provided object.
Definition: statistics.hh:766
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
Definition: group.hh:75
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition: logging.hh:226
#define gem5_assert(cond,...)
The assert macro will function like a normal assert, but will use panic instead of straight abort().
Definition: logging.hh:318
#define warn(...)
Definition: logging.hh:246
Bitfield< 51, 48 > dit
Definition: misc_types.hh:169
Bitfield< 9 > d
Definition: misc_types.hh:64
Bitfield< 54 > p
Definition: pagetable.hh:70
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
std::ostream CheckpointOut
Definition: serialize.hh:66
#define UNSERIALIZE_SCALAR(scalar)
Definition: serialize.hh:575
#define SERIALIZE_SCALAR(scalar)
Definition: serialize.hh:568
statistics::Value voltage
Stat for reporting voltage of the domain.

Generated on Wed Dec 21 2022 10:22:40 for gem5 by doxygen 1.9.1