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

Reply via email to