59 lines
1.4 KiB
C++
59 lines
1.4 KiB
C++
/**
|
|
* 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);
|
|
}
|
|
}
|