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

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

Accordingly, odp_sys_cpu_hz_amp(cpu) and odp_sys_cpu_model_str_amp(cpu)
are added for AMP system, while the original version interfaces without
any parameter are kept for SMP systems.

Currently, all the platforms implemented are all SMP, so only cpu_hz[0]
and model[0] are 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                 |  4 ++
 platform/linux-generic/include/odp_internal.h |  6 ++-
 platform/linux-generic/odp_system_info.c      | 55 +++++++++++++++++----------
 3 files changed, 43 insertions(+), 22 deletions(-)

diff --git a/include/odp/api/system_info.h b/include/odp/api/system_info.h
index 1f3294b..55a4180 100644
--- a/include/odp/api/system_info.h
+++ b/include/odp/api/system_info.h
@@ -30,6 +30,8 @@ extern "C" {
  */
 uint64_t odp_sys_cpu_hz(void);
 
+uint64_t odp_sys_cpu_hz_amp(int cpu);
+
 /**
  * Huge page size in bytes
  *
@@ -51,6 +53,8 @@ uint64_t odp_sys_page_size(void);
  */
 const char *odp_sys_cpu_model_str(void);
 
+const char *odp_sys_cpu_model_str_amp(int cpu);
+
 /**
  * Cache line size in bytes
  *
diff --git a/platform/linux-generic/include/odp_internal.h 
b/platform/linux-generic/include/odp_internal.h
index 8c5d339..7388128 100644
--- a/platform/linux-generic/include/odp_internal.h
+++ b/platform/linux-generic/include/odp_internal.h
@@ -22,13 +22,15 @@ extern "C" {
 
 extern __thread int __odp_errno;
 
+#define MAX_CPU_NUMBER 1024
+
 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;
        int      cpu_count;
-       char     model_str[128];
+       char     model_str[MAX_CPU_NUMBER][128];
 } odp_system_info_t;
 
 struct odp_global_data_s {
diff --git a/platform/linux-generic/odp_system_info.c 
b/platform/linux-generic/odp_system_info.c
index 31df29e..c9f6be1 100644
--- a/platform/linux-generic/odp_system_info.c
+++ b/platform/linux-generic/odp_system_info.c
@@ -36,7 +36,6 @@ typedef struct {
 
 #define HUGE_PAGE_DIR "/sys/kernel/mm/hugepages"
 
-
 /*
  * Report the number of CPUs in the affinity mask of the main thread
  */
@@ -139,17 +138,17 @@ static int cpuinfo_x86(FILE *file, odp_system_info_t 
*sysinfo)
                        if (pos) {
                                int len;
                                pos = strchr(str, ':');
-                               strncpy(sysinfo->model_str, pos+2,
-                                       sizeof(sysinfo->model_str));
-                               len = strlen(sysinfo->model_str);
-                               sysinfo->model_str[len - 1] = 0;
+                               strncpy(sysinfo->model_str[0], pos + 2,
+                                       sizeof(sysinfo->model_str[0]));
+                               len = strlen(sysinfo->model_str[0]);
+                               sysinfo->model_str[0][len - 1] = 0;
                                model = 1;
                                count--;
                        }
                }
        }
 
-       sysinfo->cpu_hz = (uint64_t) (mhz * 1000000.0);
+       sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0);
 
        return 0;
 }
@@ -188,10 +187,10 @@ static int cpuinfo_octeon(FILE *file, odp_system_info_t 
*sysinfo)
                        if (pos) {
                                int len;
                                pos = strchr(str, ':');
-                               strncpy(sysinfo->model_str, pos+2,
-                                       sizeof(sysinfo->model_str));
-                               len = strlen(sysinfo->model_str);
-                               sysinfo->model_str[len - 1] = 0;
+                               strncpy(sysinfo->model_str[0], pos + 2,
+                                       sizeof(sysinfo->model_str[0]));
+                               len = strlen(sysinfo->model_str[0]);
+                               sysinfo->model_str[0][len - 1] = 0;
                                model = 1;
                                count--;
                        }
@@ -199,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;
 }
@@ -228,16 +227,16 @@ static int cpuinfo_powerpc(FILE *file, odp_system_info_t 
*sysinfo)
                        if (pos) {
                                int len;
                                pos = strchr(str, ':');
-                               strncpy(sysinfo->model_str, pos+2,
-                                       sizeof(sysinfo->model_str));
-                               len = strlen(sysinfo->model_str);
-                               sysinfo->model_str[len - 1] = 0;
+                               strncpy(sysinfo->model_str[0], pos + 2,
+                                       sizeof(sysinfo->model_str[0]));
+                               len = strlen(sysinfo->model_str[0]);
+                               sysinfo->model_str[0][len - 1] = 0;
                                model = 1;
                                count--;
                        }
                }
 
-               sysinfo->cpu_hz = (uint64_t) (mhz * 1000000.0);
+               sysinfo->cpu_hz[0] = (uint64_t)(mhz * 1000000.0);
        }
 
 
@@ -330,10 +329,10 @@ 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, "UNKNOWN", sizeof(sysinfo->model_str));
+       strncpy(sysinfo->model_str[0], "UNKNOWN", sizeof(sysinfo->model_str));
 
        return 0;
 }
@@ -376,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_global_data.system_info.cpu_hz[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)
@@ -391,7 +398,15 @@ uint64_t odp_sys_page_size(void)
 
 const char *odp_sys_cpu_model_str(void)
 {
-       return odp_global_data.system_info.model_str;
+       return odp_global_data.system_info.model_str[0];
+}
+
+const char *odp_sys_cpu_model_str_amp(int cpu)
+{
+       if (cpu >= 0 && cpu < MAX_CPU_NUMBER)
+               return odp_global_data.system_info.model_str[cpu];
+       else
+               return NULL;
 }
 
 int odp_sys_cache_line_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