2c2
< * Copyright (c) 2012 ARM Limited
---
> * Copyright (c) 2012-2014 ARM Limited
40a41,43
> #include <algorithm>
>
> #include "base/statistics.hh"
47c50
< : SimObject(p), _voltage(0)
---
> : SimObject(p), voltageOpPoints(p->voltage), _perfLevel(0)
49c52,59
< voltage(p->voltage);
---
> fatal_if(voltageOpPoints.empty(), "DVFS: Empty set of voltages for "\
> "voltage domain %s\n", name());
>
> // Voltages must be sorted in descending order.
> fatal_if(!std::is_sorted(voltageOpPoints.begin(), voltageOpPoints.end(),
> std::greater_equal<Voltages::value_type>()), "DVFS: Voltage "\
> "operation points not in descending order for voltage domain "\
> "%s\n", name());
53c63
< VoltageDomain::voltage(double voltage)
---
> VoltageDomain::perfLevel(PerfLevel perf_level)
55,56c65,100
< if (voltage <= 0) {
< fatal("Voltage should be greater than zero.\n");
---
> chatty_assert(perf_level < voltageOpPoints.size(),
> "DVFS: Requested voltage ID %d is outside the known "\
> "range for domain %s.\n", perf_level, name());
>
> _perfLevel = perf_level;
>
> DPRINTF(VoltageDomain, "Setting voltage to %.3fV idx: %d for domain %s\n",
> voltage(), perf_level, name());
> }
>
> bool
> VoltageDomain::sanitiseVoltages()
> {
> if (numVoltages() == 1)
> return false;
>
> // Find the highest requested performance level and update the voltage
> // domain with it
> PerfLevel perf_max = (PerfLevel)-1;
> for (auto dit = srcClockChildren.begin(); dit != srcClockChildren.end(); ++dit) {
> SrcClockDomain* d = *dit;
> chatty_assert(d->voltageDomain() == this, "DVFS: Clock domain %s "\
> "(id: %d) should not be registered with voltage domain "\
> "%s\n", d->name(), d->domainID(), name());
>
> PerfLevel perf = d->perfLevel();
>
> DPRINTF(VoltageDomain, "DVFS: Clock domain %s (id: %d) requests perf "\
> "level %d\n", d->name(), d->domainID(), perf);
>
> // NOTE: Descending sort of performance levels: 0 - fast, 5 - slow
> if (perf < perf_max) {
> DPRINTF(VoltageDomain, "DVFS: Updating max perf level %d -> %d\n",
> perf_max, perf);
> perf_max = perf;
> }
57a102,103
> DPRINTF(VoltageDomain, "DVFS: Setting perf level of voltage domain %s "\
> "from %d to %d.\n", name(), perfLevel(), perf_max);
59,61c105,111
< _voltage = voltage;
< DPRINTF(VoltageDomain,
< "Setting voltage to %f for domain %s\n", _voltage, name());
---
> // Set the performance level
> if (perf_max != perfLevel()) {
> perfLevel(perf_max);
> return true;
> } else {
> return false;
> }
64a115,123
> VoltageDomain::startup() {
> bool changed = sanitiseVoltages();
> if (changed) {
> warn("DVFS: Perf level for voltage domain %s adapted to "\
> "requested perf levels from source clock domains.\n", name());
> }
> }
>
> void
67,68d125
< using namespace Stats;
<
70c127
< .scalar(_voltage)
---
> .method(this, &VoltageDomain::voltage)
80a138,148
>
> void
> VoltageDomain::serialize(std::ostream &os) {
> SERIALIZE_SCALAR(_perfLevel);
> }
>
> void
> VoltageDomain::unserialize(Checkpoint *cp, const std::string &section) {
> UNSERIALIZE_SCALAR(_perfLevel);
> perfLevel(_perfLevel);
> }