From: Hongbo Zhang <hongbo.zh...@linaro.org>

For AMP system such as ARM big.LITTLE, cores are heterogeneous, and cpu_hz
for each core may be different too, so this patch changes the cpu_hz to
data array cpu_hz[] to contain data for each different core, while for the
common SMP system, we can simply use the cpu_hz[0] to contain data for all
cores because they are all same, but if like, we can fill each item in the
data array too.

And the odp_sys_cpu_hz_amp(cpu) is added for AMP system, while the
original version interfaces without any parameter is kept for SMP systems.

Currently, all the platforms implemented are all SMP, so only cpu_hz[0]
is used, but when cpuinfo_arm() is implemented, this per-CPU feature should
not be missed because of its big.LITTLE.

Signed-off-by: Hongbo Zhang <hongbo.zh...@linaro.org>
---
 include/odp/api/system_info.h                 |  7 +++++++
 platform/linux-generic/include/odp_internal.h |  2 +-
 platform/linux-generic/odp_system_info.c      | 18 +++++++++++++-----
 3 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/include/odp/api/system_info.h b/include/odp/api/system_info.h
index 86b4556..8627d97 100644
--- a/include/odp/api/system_info.h
+++ b/include/odp/api/system_info.h
@@ -31,6 +31,13 @@ extern "C" {
 uint64_t odp_sys_cpu_hz(void);
 
 /**
+ * CPU frequency in Hz for AMP system
+ *
+ * @return CPU frequency in Hz
+ */
+uint64_t odp_sys_cpu_hz_amp(int cpu);
+
+/**
  * Huge page size in bytes
  *
  * @return Huge page size in bytes
diff --git a/platform/linux-generic/include/odp_internal.h 
b/platform/linux-generic/include/odp_internal.h
index bcf7e63..8df8c23 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -25,7 +25,7 @@ extern __thread int __odp_errno;
 #define MAX_CPU_NUMBER 128
 
 typedef struct {
-       uint64_t cpu_hz;
+       uint64_t cpu_hz[MAX_CPU_NUMBER];
        uint64_t huge_page_size;
        uint64_t page_size;
        int      cache_line_size;
diff --git a/platform/linux-generic/odp_system_info.c 
b/platform/linux-generic/odp_system_info.c
index 181a0c7..8ade5a6 100644
--- a/platform/linux-generic/odp_system_info.c
+++ b/platform/linux-generic/odp_system_info.c
@@ -148,7 +148,7 @@ static int cpuinfo_x86(FILE *file, odp_system_info_t 
*sysinfo)
                }
        }
 
-       sysinfo->cpu_hz = (uint64_t) (mhz * 1000000.0);
+       sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0);
 
        return 0;
 }
@@ -198,7 +198,7 @@ static int cpuinfo_octeon(FILE *file, odp_system_info_t 
*sysinfo)
        }
 
        /* bogomips seems to be 2x freq */
-       sysinfo->cpu_hz = (uint64_t) (mhz * 1000000.0 / 2.0);
+       sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0 / 2.0);
 
        return 0;
 }
@@ -236,7 +236,7 @@ static int cpuinfo_powerpc(FILE *file, odp_system_info_t 
*sysinfo)
                        }
                }
 
-               sysinfo->cpu_hz = (uint64_t) (mhz * 1000000.0);
+               sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0);
        }
 
 
@@ -329,7 +329,7 @@ static int systemcpu(odp_system_info_t *sysinfo)
        sysinfo->huge_page_size = huge_page_size();
 
        /* Dummy values */
-       sysinfo->cpu_hz          = 1400000000;
+       sysinfo->cpu_hz[0]       = 1400000000;
        sysinfo->cache_line_size = 64;
 
        strncpy(sysinfo->model_str[0], "UNKNOWN", sizeof(sysinfo->model_str));
@@ -375,7 +375,15 @@ int odp_system_info_init(void)
  */
 uint64_t odp_sys_cpu_hz(void)
 {
-       return odp_global_data.system_info.cpu_hz;
+       return odp_sys_cpu_hz_amp(0);
+}
+
+uint64_t odp_sys_cpu_hz_amp(int cpu)
+{
+       if (cpu >= 0 && cpu < MAX_CPU_NUMBER)
+               return odp_global_data.system_info.cpu_hz[cpu];
+       else
+               return -1;
 }
 
 uint64_t odp_sys_huge_page_size(void)
-- 
1.9.1

_______________________________________________
lng-odp mailing list
lng-odp@lists.linaro.org
https://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to