diff --git a/src/variorum/ARM/ARM.h b/src/variorum/ARM/ARM.h deleted file mode 100644 index 88dbef9d2..000000000 --- a/src/variorum/ARM/ARM.h +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other -// Variorum Project Developers. See the top-level LICENSE file for details. -// -// SPDX-License-Identifier: MIT - -#ifndef ARM_H_INCLUDE -#define ARM_H_INCLUDE - -#include - -int arm_get_power(int long_ver); - -int arm_get_thermals(int long_ver); - -int arm_get_clocks(int long_ver); - -int arm_get_frequencies(void); - -int arm_cap_socket_frequency(int cpuid, int freq); - -int arm_get_power_json(char **get_power_obj_str); - -int arm_get_power_domain_info_json(char **get_domain_obj_str); - -#endif diff --git a/src/variorum/ARM/ARM.c b/src/variorum/ARM/ARM_Juno_r2.c similarity index 88% rename from src/variorum/ARM/ARM.c rename to src/variorum/ARM/ARM_Juno_r2.c index e9db74a9d..76bcaba9f 100644 --- a/src/variorum/ARM/ARM.c +++ b/src/variorum/ARM/ARM_Juno_r2.c @@ -10,12 +10,12 @@ #include #include -#include +#include #include #include #include -int arm_get_power(int long_ver) +int arm_juno_r2_get_power(int long_ver) { int ret = 0; @@ -30,7 +30,7 @@ int arm_get_power(int long_ver) return ret; } -int arm_get_thermals(int long_ver) +int arm_juno_r2_get_thermals(int long_ver) { int ret = 0; @@ -45,7 +45,7 @@ int arm_get_thermals(int long_ver) return ret; } -int arm_get_clocks(int long_ver) +int arm_juno_r2_get_clocks(int long_ver) { int ret = 0; unsigned iter = 0; @@ -66,7 +66,7 @@ int arm_get_clocks(int long_ver) return ret; } -int arm_get_frequencies(void) +int arm_juno_r2_get_frequencies(void) { int ret = 0; unsigned iter = 0; @@ -87,7 +87,7 @@ int arm_get_frequencies(void) return ret; } -int arm_cap_socket_frequency(int cpuid, int freq) +int arm_juno_r2_cap_socket_frequency(int cpuid, int freq) { int ret = 0; unsigned nsockets; @@ -109,7 +109,7 @@ int arm_cap_socket_frequency(int cpuid, int freq) return ret; } -int arm_get_power_json(char **get_power_obj_str) +int arm_juno_r2_get_power_json(char **get_power_obj_str) { int ret = 0; @@ -129,7 +129,7 @@ int arm_get_power_json(char **get_power_obj_str) return ret; } -int arm_get_power_domain_info_json(char **get_domain_obj_str) +int arm_juno_r2_get_power_domain_info_json(char **get_domain_obj_str) { int ret = 0; diff --git a/src/variorum/ARM/ARM_Juno_r2.h b/src/variorum/ARM/ARM_Juno_r2.h new file mode 100644 index 000000000..ada6e3d79 --- /dev/null +++ b/src/variorum/ARM/ARM_Juno_r2.h @@ -0,0 +1,25 @@ +// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other +// Variorum Project Developers. See the top-level LICENSE file for details. +// +// SPDX-License-Identifier: MIT + +#ifndef ARM_JUNO_R2_H_INCLUDE +#define ARM_JUNO_R2_H_INCLUDE + +#include + +int arm_juno_r2_get_power(int long_ver); + +int arm_juno_r2_get_thermals(int long_ver); + +int arm_juno_r2_get_clocks(int long_ver); + +int arm_juno_r2_get_frequencies(void); + +int arm_juno_r2_cap_socket_frequency(int cpuid, int freq); + +int arm_juno_r2_get_power_json(char **get_power_obj_str); + +int arm_juno_r2_get_power_domain_info_json(char **get_domain_obj_str); + +#endif diff --git a/src/variorum/ARM/ARM_Neoverse_N1.c b/src/variorum/ARM/ARM_Neoverse_N1.c new file mode 100644 index 000000000..384d3e001 --- /dev/null +++ b/src/variorum/ARM/ARM_Neoverse_N1.c @@ -0,0 +1,150 @@ +// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other +// Variorum Project Developers. See the top-level LICENSE file for details. +// +// SPDX-License-Identifier: MIT + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +int arm_neoverse_n1_get_power(int long_ver) +{ + int ret = 0; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + ret = get_power_data(long_ver, stdout); + + return ret; +} + +int arm_neoverse_n1_get_thermals(int long_ver) +{ + int ret = 0; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + ret = get_thermal_data(long_ver, stdout); + + return ret; +} + +int arm_neoverse_n1_get_clocks(int long_ver) +{ + int ret = 0; + unsigned iter = 0; + unsigned nsockets; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX); + for (iter = 0; iter < nsockets; iter++) + { + ret = get_clocks_data(iter, long_ver, stdout); + } + + return ret; +} + +int arm_neoverse_n1_get_frequencies(void) +{ + int ret = 0; + unsigned iter = 0; + unsigned nsockets; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX); + for (iter = 0; iter < nsockets; iter++) + { + ret = get_frequencies(iter, stdout); + } + + return ret; +} + +int arm_neoverse_n1_cap_socket_frequency(int cpuid, int freq) +{ + int ret = 0; + unsigned nsockets; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + variorum_get_topology(&nsockets, NULL, NULL, P_ARM_CPU_IDX); + if (cpuid < 0 || cpuid >= (int)nsockets) + { + fprintf(stdout, "The specified CPU ID does not exist\n"); + return -1; + } + ret = cap_socket_frequency(cpuid, freq); + + return ret; +} + +int arm_neoverse_n1_get_power_json(char **get_power_obj_str) +{ + int ret = 0; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + json_t *get_power_obj = json_object(); + + ret = json_get_power_data(get_power_obj); + + *get_power_obj_str = json_dumps(get_power_obj, 0); + json_decref(get_power_obj); + + return ret; +} + +int arm_neoverse_n1_get_power_domain_info_json(char **get_domain_obj_str) +{ + int ret = 0; + + char *val = getenv("VARIORUM_LOG"); + if (val != NULL && atoi(val) == 1) + { + printf("Running %s\n", __FUNCTION__); + } + + json_t *get_domain_obj = json_object(); + + ret = json_get_power_domain_info(get_domain_obj); + + *get_domain_obj_str = json_dumps(get_domain_obj, 0); + json_decref(get_domain_obj); + + return ret; +} diff --git a/src/variorum/ARM/ARM_Neoverse_N1.h b/src/variorum/ARM/ARM_Neoverse_N1.h new file mode 100644 index 000000000..abe41aa21 --- /dev/null +++ b/src/variorum/ARM/ARM_Neoverse_N1.h @@ -0,0 +1,25 @@ +// Copyright 2019-2022 Lawrence Livermore National Security, LLC and other +// Variorum Project Developers. See the top-level LICENSE file for details. +// +// SPDX-License-Identifier: MIT + +#ifndef ARM_NEOVERSE_N1_H_INCLUDE +#define ARM_NEOVERSE_N1_H_INCLUDE + +#include + +int arm_neoverse_n1_get_power(int long_ver); + +int arm_neoverse_n1_get_thermals(int long_ver); + +int arm_neoverse_n1_get_clocks(int long_ver); + +int arm_neoverse_n1_get_frequencies(void); + +int arm_neoverse_n1_cap_socket_frequency(int cpuid, int freq); + +int arm_neoverse_n1_get_power_json(char **get_power_obj_str); + +int arm_neoverse_n1_get_power_domain_info_json(char **get_domain_obj_str); + +#endif diff --git a/src/variorum/ARM/CMakeLists.txt b/src/variorum/ARM/CMakeLists.txt index 79b29ece0..d5d90eb5d 100644 --- a/src/variorum/ARM/CMakeLists.txt +++ b/src/variorum/ARM/CMakeLists.txt @@ -4,12 +4,14 @@ # SPDX-License-Identifier: MIT set(variorum_arm_headers - ${CMAKE_CURRENT_SOURCE_DIR}/ARM.h + ${CMAKE_CURRENT_SOURCE_DIR}/ARM_Juno_r2.h + ${CMAKE_CURRENT_SOURCE_DIR}/ARM_Neoverse_N1.h ${CMAKE_CURRENT_SOURCE_DIR}/power_features.h CACHE INTERNAL "") set(variorum_arm_sources - ${CMAKE_CURRENT_SOURCE_DIR}/ARM.c + ${CMAKE_CURRENT_SOURCE_DIR}/ARM_Juno_r2.c + ${CMAKE_CURRENT_SOURCE_DIR}/ARM_Neoverse_N1.c ${CMAKE_CURRENT_SOURCE_DIR}/power_features.c CACHE INTERNAL "") diff --git a/src/variorum/ARM/config_arm.c b/src/variorum/ARM/config_arm.c index b4f464f91..97bdb2e71 100644 --- a/src/variorum/ARM/config_arm.c +++ b/src/variorum/ARM/config_arm.c @@ -9,14 +9,17 @@ #include #include #include -#include +#include +#include #include uint64_t *detect_arm_arch(void) { // ARM systems come in various flavors. For now, we will use a default model number. uint64_t *model = (uint64_t *) malloc(sizeof(uint64_t)); - *model = ARMV8; + asm volatile( + "mrs %0, MIDR_EL1" + : "=r" (*model)); return model; } @@ -24,18 +27,32 @@ int set_arm_func_ptrs(int idx) { int err = 0; - if (*g_platform[idx].arch_id == ARMV8) + if (*g_platform[idx].arch_id == ARM_JUNO_R2) { /* Initialize interfaces */ - g_platform[idx].variorum_print_power = arm_get_power; - g_platform[idx].variorum_print_thermals = arm_get_thermals; - g_platform[idx].variorum_print_frequency = arm_get_clocks; - g_platform[idx].variorum_print_available_frequencies = arm_get_frequencies; + g_platform[idx].variorum_print_power = arm_juno_r2_get_power; + g_platform[idx].variorum_print_thermals = arm_juno_r2_get_thermals; + g_platform[idx].variorum_print_frequency = arm_juno_r2_get_clocks; + g_platform[idx].variorum_print_available_frequencies = arm_juno_r2_get_frequencies; g_platform[idx].variorum_cap_socket_frequency_limit = - arm_cap_socket_frequency; - g_platform[idx].variorum_get_node_power_json = arm_get_power_json; + arm_juno_r2_cap_socket_frequency; + g_platform[idx].variorum_get_node_power_json = arm_juno_r2_get_power_json; g_platform[idx].variorum_get_node_power_domain_info_json = - arm_get_power_domain_info_json; + arm_juno_r2_get_power_domain_info_json; + } + else if (*g_platform[idx].arch_id == ARM_NEOVERSE_N1) + { + /* Initialize interfaces */ + g_platform[idx].variorum_print_power = arm_neoverse_n1_get_power; + g_platform[idx].variorum_print_thermals = arm_neoverse_n1_get_thermals; + g_platform[idx].variorum_print_frequency = arm_neoverse_n1_get_clocks; + g_platform[idx].variorum_print_available_frequencies = arm_neoverse_n1_get_frequencies; + g_platform[idx].variorum_cap_socket_frequency_limit = + arm_neoverse_n1_cap_socket_frequency; + g_platform[idx].variorum_get_node_power_json = arm_neoverse_n1_get_power_json; + g_platform[idx].variorum_get_node_power_domain_info_json = + arm_neoverse_n1_get_power_domain_info_json; + } else { diff --git a/src/variorum/config_architecture.h b/src/variorum/config_architecture.h index 294ffdcd2..a9f218c81 100644 --- a/src/variorum/config_architecture.h +++ b/src/variorum/config_architecture.h @@ -77,7 +77,8 @@ enum nvidia_gpu_arch_e enum arm_arch_e { - ARMV8 = 1, //ARM Juno + ARM_JUNO_R2 = 0x410fd080, //ARM Juno r2 + ARM_NEOVERSE_N1 = 0x413fd0c1, //ARM Neoverse N1 }; /// @brief List of AMD GPU family and models.