summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/debug_menu.c16
-rw-r--r--firmware/target/hosted/cpuinfo-linux.c32
-rw-r--r--firmware/target/hosted/cpuinfo-linux.h8
3 files changed, 27 insertions, 29 deletions
diff --git a/apps/debug_menu.c b/apps/debug_menu.c
index 5224dbe267..4947f30695 100644
--- a/apps/debug_menu.c
+++ b/apps/debug_menu.c
@@ -240,9 +240,13 @@ static const char* get_cpuinfo(int selected_item, void *data,
{
int cpu = (selected_item - 5) / (state_count + 1);
int cpu_line = (selected_item - 5) % (state_count + 1);
-#if defined(DX50) || defined(DX90)
+
+ /* scaling info */
int min_freq = min_scaling_frequency(cpu);
int cur_freq = current_scaling_frequency(cpu);
+ /* fallback if scaling frequency is not available */
+ if(cur_freq <= 0)
+ cur_freq = frequency_linux(cpu);
int max_freq = max_scaling_frequency(cpu);
char governor[20];
bool have_governor = current_scaling_governor(cpu, governor, sizeof(governor));
@@ -256,16 +260,6 @@ static const char* get_cpuinfo(int selected_item, void *data,
cur_freq > 0 ? cur_freq/1000 : -1,
max_freq > 0 ? max_freq/1000 : -1);
}
-#else
- int freq1 = frequency_linux(cpu, false);
- int freq2 = frequency_linux(cpu, true);
- if (cpu_line == 0)
- {
- sprintf(buffer, " CPU%d: Cur/Scal freq: %d/%d MHz", cpu,
- freq1 > 0 ? freq1/1000 : -1,
- freq2 > 0 ? freq2/1000 : -1);
- }
-#endif
else
{
cpustatetimes_linux(cpu, states, ARRAYLEN(states));
diff --git a/firmware/target/hosted/cpuinfo-linux.c b/firmware/target/hosted/cpuinfo-linux.c
index 8158673349..c3669a9f5c 100644
--- a/firmware/target/hosted/cpuinfo-linux.c
+++ b/firmware/target/hosted/cpuinfo-linux.c
@@ -35,11 +35,9 @@
#include "cpuinfo-linux.h"
#include "gcc_extensions.h"
-#if defined(DX50) || defined(DX90)
#include <limits.h>
#include <string.h>
#include "debug.h"
-#endif
#undef open /* want the *real* open here, not sim_open or the like */
#if (CONFIG_PLATFORM & PLATFORM_ANDROID) || defined(DX50) || defined(DX90)
@@ -51,6 +49,14 @@
#define NUM_SAMPLES_MASK (NUM_SAMPLES-1)
#define SAMPLE_RATE 4
+/* Some targets like the Sony NWZ have a broken cpu driver that reports frequencies in MHz instead
+ * of kHz */
+#if defined(SONY_NWZ_LINUX)
+#define FREQ_MULTIPLIER 1000
+#else
+#define FREQ_MULTIPLIER 1
+#endif
+
struct cputime_sample {
struct tms sample;
time_t time;
@@ -143,24 +149,21 @@ int cpucount_linux(void)
return get_nprocs();
}
-int frequency_linux(int cpu, bool scaling)
+int frequency_linux(int cpu)
{
char path[64];
char temp[10];
int cpu_dev, ret = -1;
- snprintf(path, sizeof(path),
- "/sys/devices/system/cpu/cpu%d/cpufreq/%s_cur_freq",
- cpu, scaling ? "scaling" : "cpuinfo");
+ snprintf(path, sizeof(path), "/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_cur_freq", cpu);
cpu_dev = open(path, O_RDONLY);
if (cpu_dev < 0)
return -1;
if (read(cpu_dev, temp, sizeof(temp)) >= 0)
- ret = atoi(temp);
+ ret = atoi(temp) * FREQ_MULTIPLIER;
close(cpu_dev);
return ret;
}
-#if defined(DX50) || defined(DX90)
bool current_scaling_governor(int cpu, char* governor, int governor_size)
{
if((cpu < 0) || (governor == NULL) || (governor_size <= 0))
@@ -168,7 +171,7 @@ bool current_scaling_governor(int cpu, char* governor, int governor_size)
return false;
}
- char path[PATH_MAX];
+ char path[64];
snprintf(path,
sizeof(path),
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor",
@@ -212,13 +215,13 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
return -1;
}
- char path[PATH_MAX];
+ char path[64];
switch(freqOpt)
{
case SCALING_MIN_FREQ:
{
snprintf(path,
- PATH_MAX,
+ sizeof(path),
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq",
cpu);
break;
@@ -227,7 +230,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
case SCALING_CUR_FREQ:
{
snprintf(path,
- PATH_MAX,
+ sizeof(path),
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq",
cpu);
break;
@@ -236,7 +239,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
case SCALING_MAX_FREQ:
{
snprintf(path,
- PATH_MAX,
+ sizeof(path),
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq",
cpu);
break;
@@ -264,7 +267,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
}
fclose(f);
- return(freq);
+ return freq * FREQ_MULTIPLIER;
}
@@ -284,7 +287,6 @@ int max_scaling_frequency(int cpu)
{
return(read_cpu_frequency(cpu, SCALING_MAX_FREQ));
}
-#endif
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements)
{
diff --git a/firmware/target/hosted/cpuinfo-linux.h b/firmware/target/hosted/cpuinfo-linux.h
index 0483a3a9aa..defbf2f374 100644
--- a/firmware/target/hosted/cpuinfo-linux.h
+++ b/firmware/target/hosted/cpuinfo-linux.h
@@ -39,9 +39,12 @@ struct time_state {
};
int cpuusage_linux(struct cpuusage* u);
-int frequency_linux(int cpu, bool scaling);
+/* Return the frequency of a CPU. Note that whenever CPU frequency scaling is supported by the
+ * driver, this frequency may not be accurate and may vaguely reflect the cpu mode. Use
+ * current_scaling_frequency() to get the actual frequency if scaling is supported.
+ * Return -1 on error. */
+int frequency_linux(int cpu);
-#if defined(DX50) || defined(DX90)
/*
Get the current cpufreq scaling governor.
cpu [in]: The number of the cpu to query.
@@ -60,7 +63,6 @@ bool current_scaling_governor(int cpu, char* governor, int governor_size);
int min_scaling_frequency(int cpu);
int current_scaling_frequency(int cpu);
int max_scaling_frequency(int cpu);
-#endif
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements);
int cpucount_linux(void);