diff options
-rw-r--r-- | apps/debug_menu.c | 16 | ||||
-rw-r--r-- | firmware/target/hosted/cpuinfo-linux.c | 32 | ||||
-rw-r--r-- | firmware/target/hosted/cpuinfo-linux.h | 8 |
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); |