gator: Version 5.20
[firefly-linux-kernel-4.4.55.git] / tools / gator / daemon / CPUFreqDriver.cpp
1 /**
2  * Copyright (C) ARM Limited 2013-2014. All rights reserved.
3  *
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.
7  */
8
9 #include "CPUFreqDriver.h"
10
11 #include "Buffer.h"
12 #include "DriverSource.h"
13 #include "Logging.h"
14 #include "SessionData.h"
15
16 CPUFreqDriver::CPUFreqDriver() : mPrev() {
17 }
18
19 CPUFreqDriver::~CPUFreqDriver() {
20 }
21
22 void CPUFreqDriver::readEvents(mxml_node_t *const) {
23         // Only for use with perf
24         if (!gSessionData->perf.isSetup()) {
25                 return;
26         }
27
28         setCounters(new DriverCounter(getCounters(), strdup("Linux_power_cpu_freq")));
29 }
30
31 void CPUFreqDriver::read(Buffer *const buffer) {
32         char buf[64];
33         const DriverCounter *const counter = getCounters();
34         if ((counter == NULL) || !counter->isEnabled()) {
35                 return;
36         }
37
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);
42                 int64_t freq;
43                 if (DriverSource::readInt64Driver(buf, &freq) != 0) {
44                         freq = 0;
45                 }
46                 if (mPrev[i] != freq) {
47                         mPrev[i] = freq;
48                         // Change cores
49                         buffer->event64(2, i);
50                         resetCores = true;
51                         buffer->event64(key, 1000*freq);
52                 }
53         }
54         if (resetCores) {
55                 // Revert cores, UserSpaceSource is all on core 0
56                 buffer->event64(2, 0);
57         }
58 }