mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 21:22:39 -05:00
cleanup linux cpuinfo code
sonynwz: quirk for cpufreq broken driver There was some redundancy between frequency_linux(cpu, true) and current_scaling_frequency(), also I see no reason to compile the cpuinfo stuff unconditionally and the scaling info only on DX since it was already printed some partial scaling info anyway. Thus compile all the code unconditionally and simplify the logic in the debug menu. Also avoid putting buffers of size PATH_MAX on stack since it can be quite big and we only requires 64 bytes for those paths. On Sony NWZ, the cpu driver reports frequency in MHz instead of kHz thus we need to make the cpuinfo code aware of that bug. Change-Id: I61af45ab5f179ecc909b4841b9137a915a60193a
This commit is contained in:
parent
2f3801be34
commit
4382f8773e
3 changed files with 27 additions and 29 deletions
|
|
@ -240,9 +240,13 @@ static const char* get_cpuinfo(int selected_item, void *data,
|
||||||
{
|
{
|
||||||
int cpu = (selected_item - 5) / (state_count + 1);
|
int cpu = (selected_item - 5) / (state_count + 1);
|
||||||
int cpu_line = (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 min_freq = min_scaling_frequency(cpu);
|
||||||
int cur_freq = current_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);
|
int max_freq = max_scaling_frequency(cpu);
|
||||||
char governor[20];
|
char governor[20];
|
||||||
bool have_governor = current_scaling_governor(cpu, governor, sizeof(governor));
|
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,
|
cur_freq > 0 ? cur_freq/1000 : -1,
|
||||||
max_freq > 0 ? max_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
|
else
|
||||||
{
|
{
|
||||||
cpustatetimes_linux(cpu, states, ARRAYLEN(states));
|
cpustatetimes_linux(cpu, states, ARRAYLEN(states));
|
||||||
|
|
|
||||||
|
|
@ -35,11 +35,9 @@
|
||||||
#include "cpuinfo-linux.h"
|
#include "cpuinfo-linux.h"
|
||||||
#include "gcc_extensions.h"
|
#include "gcc_extensions.h"
|
||||||
|
|
||||||
#if defined(DX50) || defined(DX90)
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef open /* want the *real* open here, not sim_open or the like */
|
#undef open /* want the *real* open here, not sim_open or the like */
|
||||||
#if (CONFIG_PLATFORM & PLATFORM_ANDROID) || defined(DX50) || defined(DX90)
|
#if (CONFIG_PLATFORM & PLATFORM_ANDROID) || defined(DX50) || defined(DX90)
|
||||||
|
|
@ -51,6 +49,14 @@
|
||||||
#define NUM_SAMPLES_MASK (NUM_SAMPLES-1)
|
#define NUM_SAMPLES_MASK (NUM_SAMPLES-1)
|
||||||
#define SAMPLE_RATE 4
|
#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 cputime_sample {
|
||||||
struct tms sample;
|
struct tms sample;
|
||||||
time_t time;
|
time_t time;
|
||||||
|
|
@ -143,24 +149,21 @@ int cpucount_linux(void)
|
||||||
return get_nprocs();
|
return get_nprocs();
|
||||||
}
|
}
|
||||||
|
|
||||||
int frequency_linux(int cpu, bool scaling)
|
int frequency_linux(int cpu)
|
||||||
{
|
{
|
||||||
char path[64];
|
char path[64];
|
||||||
char temp[10];
|
char temp[10];
|
||||||
int cpu_dev, ret = -1;
|
int cpu_dev, ret = -1;
|
||||||
snprintf(path, sizeof(path),
|
snprintf(path, sizeof(path), "/sys/devices/system/cpu/cpu%d/cpufreq/cpuinfo_cur_freq", cpu);
|
||||||
"/sys/devices/system/cpu/cpu%d/cpufreq/%s_cur_freq",
|
|
||||||
cpu, scaling ? "scaling" : "cpuinfo");
|
|
||||||
cpu_dev = open(path, O_RDONLY);
|
cpu_dev = open(path, O_RDONLY);
|
||||||
if (cpu_dev < 0)
|
if (cpu_dev < 0)
|
||||||
return -1;
|
return -1;
|
||||||
if (read(cpu_dev, temp, sizeof(temp)) >= 0)
|
if (read(cpu_dev, temp, sizeof(temp)) >= 0)
|
||||||
ret = atoi(temp);
|
ret = atoi(temp) * FREQ_MULTIPLIER;
|
||||||
close(cpu_dev);
|
close(cpu_dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(DX50) || defined(DX90)
|
|
||||||
bool current_scaling_governor(int cpu, char* governor, int governor_size)
|
bool current_scaling_governor(int cpu, char* governor, int governor_size)
|
||||||
{
|
{
|
||||||
if((cpu < 0) || (governor == NULL) || (governor_size <= 0))
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char path[PATH_MAX];
|
char path[64];
|
||||||
snprintf(path,
|
snprintf(path,
|
||||||
sizeof(path),
|
sizeof(path),
|
||||||
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_governor",
|
"/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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
char path[PATH_MAX];
|
char path[64];
|
||||||
switch(freqOpt)
|
switch(freqOpt)
|
||||||
{
|
{
|
||||||
case SCALING_MIN_FREQ:
|
case SCALING_MIN_FREQ:
|
||||||
{
|
{
|
||||||
snprintf(path,
|
snprintf(path,
|
||||||
PATH_MAX,
|
sizeof(path),
|
||||||
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq",
|
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_min_freq",
|
||||||
cpu);
|
cpu);
|
||||||
break;
|
break;
|
||||||
|
|
@ -227,7 +230,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
|
||||||
case SCALING_CUR_FREQ:
|
case SCALING_CUR_FREQ:
|
||||||
{
|
{
|
||||||
snprintf(path,
|
snprintf(path,
|
||||||
PATH_MAX,
|
sizeof(path),
|
||||||
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq",
|
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_cur_freq",
|
||||||
cpu);
|
cpu);
|
||||||
break;
|
break;
|
||||||
|
|
@ -236,7 +239,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
|
||||||
case SCALING_MAX_FREQ:
|
case SCALING_MAX_FREQ:
|
||||||
{
|
{
|
||||||
snprintf(path,
|
snprintf(path,
|
||||||
PATH_MAX,
|
sizeof(path),
|
||||||
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq",
|
"/sys/devices/system/cpu/cpu%d/cpufreq/scaling_max_freq",
|
||||||
cpu);
|
cpu);
|
||||||
break;
|
break;
|
||||||
|
|
@ -264,7 +267,7 @@ static int read_cpu_frequency(int cpu, enum cpu_frequency_options freqOpt)
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
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));
|
return(read_cpu_frequency(cpu, SCALING_MAX_FREQ));
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements)
|
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -39,9 +39,12 @@ struct time_state {
|
||||||
};
|
};
|
||||||
|
|
||||||
int cpuusage_linux(struct cpuusage* u);
|
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.
|
Get the current cpufreq scaling governor.
|
||||||
cpu [in]: The number of the cpu to query.
|
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 min_scaling_frequency(int cpu);
|
||||||
int current_scaling_frequency(int cpu);
|
int current_scaling_frequency(int cpu);
|
||||||
int max_scaling_frequency(int cpu);
|
int max_scaling_frequency(int cpu);
|
||||||
#endif
|
|
||||||
|
|
||||||
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements);
|
int cpustatetimes_linux(int cpu, struct time_state* data, int max_elements);
|
||||||
int cpucount_linux(void);
|
int cpucount_linux(void);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue