From: Hongbo Zhang <hongbo.zh...@linaro.org> Previous CPU frequency API is adapted to return max frequency, now new APIs are added for getting the current CPU frequency. odp_cpu_id_hz(int id) returns frequency of the CPU specified by parameter id, while odp_cpu_hz() returns frequency of the CPU on which the thread is running.
Signed-off-by: Hongbo Zhang <hongbo.zh...@linaro.org> --- include/odp/api/cpu.h | 20 ++++++++++ platform/linux-generic/odp_system_info.c | 63 ++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/include/odp/api/cpu.h b/include/odp/api/cpu.h index 3ecef1f..8809a46 100644 --- a/include/odp/api/cpu.h +++ b/include/odp/api/cpu.h @@ -64,6 +64,26 @@ uint64_t odp_cpu_hz_max(void); uint64_t odp_cpu_id_hz_max(int id); /** + * Current CPU frequency in Hz + * + * Returns current frequency of this CPU + * + * @return CPU frequency in Hz + */ +uint64_t odp_cpu_hz(void); + +/** + * Current CPU frequency of a CPU (in Hz) + * + * Returns current frequency of the specified CPU + * + * @param id CPU ID + * + * @return CPU frequency in Hz + */ +uint64_t odp_cpu_id_hz(int id); + +/** * CPU model name * * @return Pointer to CPU model name string diff --git a/platform/linux-generic/odp_system_info.c b/platform/linux-generic/odp_system_info.c index 00d009c..b780b13 100644 --- a/platform/linux-generic/odp_system_info.c +++ b/platform/linux-generic/odp_system_info.c @@ -145,6 +145,42 @@ static int cpuinfo_x86(FILE *file, odp_system_info_t *sysinfo) return 0; } +static uint64_t arch_cpu_hz_current(int id) +{ + char str[1024]; + FILE *file; + int cpu; + char *pos; + double mhz = 0.0; + + file = fopen("/proc/cpuinfo", "rt"); + + /* find the correct processor instance */ + while (fgets(str, sizeof(str), file) != NULL) { + pos = strstr(str, "processor"); + if (pos) { + sscanf(pos, "processor : %d", &cpu); + if (cpu == id) + break; + } + } + + /* extract the cpu current speed */ + while (fgets(str, sizeof(str), file) != NULL) { + pos = strstr(str, "cpu MHz"); + if (pos) { + sscanf(pos, "cpu MHz : %lf", &mhz); + break; + } + } + + fclose(file); + if (mhz) + return (uint64_t)(mhz * 1000000.0); + + return -1; +} + #elif defined __arm__ || defined __aarch64__ static int cpuinfo_arm(FILE *file ODP_UNUSED, @@ -153,6 +189,11 @@ odp_system_info_t *sysinfo ODP_UNUSED) return 0; } +static uint64_t arch_cpu_hz_current(int id) +{ + return -1; +} + #elif defined __OCTEON__ static int cpuinfo_octeon(FILE *file, odp_system_info_t *sysinfo) @@ -195,6 +236,11 @@ static int cpuinfo_octeon(FILE *file, odp_system_info_t *sysinfo) return 0; } +static uint64_t arch_cpu_hz_current(int id) +{ + return -1; +} + #elif defined __powerpc__ static int cpuinfo_powerpc(FILE *file, odp_system_info_t *sysinfo) { @@ -236,6 +282,11 @@ static int cpuinfo_powerpc(FILE *file, odp_system_info_t *sysinfo) return 0; } +static uint64_t arch_cpu_hz_current(int id) +{ + return -1; +} + #else #error GCC target not found #endif @@ -379,6 +430,18 @@ uint64_t odp_cpu_id_hz_max(int id) return -1; } +uint64_t odp_cpu_hz(void) +{ + int id = sched_getcpu(); + + return arch_cpu_hz_current(id); +} + +uint64_t odp_cpu_id_hz(int id) +{ + return arch_cpu_hz_current(id); +} + uint64_t odp_sys_huge_page_size(void) { return odp_global_data.system_info.huge_page_size; -- 1.9.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp