diff options
Diffstat (limited to 'tools/gator/daemon/CPUFreqDriver.cpp')
-rw-r--r-- | tools/gator/daemon/CPUFreqDriver.cpp | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/tools/gator/daemon/CPUFreqDriver.cpp b/tools/gator/daemon/CPUFreqDriver.cpp new file mode 100644 index 000000000000..41f9d6f2b3f4 --- /dev/null +++ b/tools/gator/daemon/CPUFreqDriver.cpp @@ -0,0 +1,58 @@ +/** + * Copyright (C) ARM Limited 2013-2014. All rights reserved. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include "CPUFreqDriver.h" + +#include "Buffer.h" +#include "DriverSource.h" +#include "Logging.h" +#include "SessionData.h" + +CPUFreqDriver::CPUFreqDriver() : mPrev() { +} + +CPUFreqDriver::~CPUFreqDriver() { +} + +void CPUFreqDriver::readEvents(mxml_node_t *const) { + // Only for use with perf + if (!gSessionData->perf.isSetup()) { + return; + } + + setCounters(new DriverCounter(getCounters(), strdup("Linux_power_cpu_freq"))); +} + +void CPUFreqDriver::read(Buffer *const buffer) { + char buf[64]; + const DriverCounter *const counter = getCounters(); + if ((counter == NULL) || !counter->isEnabled()) { + return; + } + + const int key = getCounters()->getKey(); + bool resetCores = false; + for (int i = 0; i < gSessionData->mCores; ++i) { + snprintf(buf, sizeof(buf), "/sys/devices/system/cpu/cpu%i/cpufreq/cpuinfo_cur_freq", i); + int64_t freq; + if (DriverSource::readInt64Driver(buf, &freq) != 0) { + freq = 0; + } + if (mPrev[i] != freq) { + mPrev[i] = freq; + // Change cores + buffer->event64(2, i); + resetCores = true; + buffer->event64(key, 1000*freq); + } + } + if (resetCores) { + // Revert cores, UserSpaceSource is all on core 0 + buffer->event64(2, 0); + } +} |