2 * Copyright (C) ARM Limited 2013-2014. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
9 #include "CPUFreqDriver.h"
12 #include "DriverSource.h"
14 #include "SessionData.h"
16 CPUFreqDriver::CPUFreqDriver() : mPrev() {
19 CPUFreqDriver::~CPUFreqDriver() {
22 void CPUFreqDriver::readEvents(mxml_node_t *const) {
23 // Only for use with perf
24 if (!gSessionData->perf.isSetup()) {
28 setCounters(new DriverCounter(getCounters(), strdup("Linux_power_cpu_freq")));
31 void CPUFreqDriver::read(Buffer *const buffer) {
33 const DriverCounter *const counter = getCounters();
34 if ((counter == NULL) || !counter->isEnabled()) {
38 const int key = getCounters()->getKey();
39 bool resetCores = false;
40 for (int i = 0; i < gSessionData->mCores; ++i) {
41 snprintf(buf, sizeof(buf), "/sys/devices/system/cpu/cpu%i/cpufreq/cpuinfo_cur_freq", i);
43 if (DriverSource::readInt64Driver(buf, &freq) != 0) {
46 if (mPrev[i] != freq) {
49 buffer->event64(2, i);
51 buffer->event64(key, 1000*freq);
55 // Revert cores, UserSpaceSource is all on core 0
56 buffer->event64(2, 0);