/* * Copyright (c) 2014 Intel, Inc. All rights reserved * $COPYRIGHT$ * * Additional copyrights may follow * * $HEADER$ */ #include "orte_config.h" #include "orte/constants.h" #include "opal/mca/base/base.h" #include "orte/util/show_help.h" #include "rtc_freq.h" /* * Local functions */ static int rtc_freq_query(mca_base_module_t **module, int *priority); static int rtc_freq_register(void); static int my_priority; orte_rtc_freq_component_t mca_rtc_freq_component = { { { ORTE_RTC_BASE_VERSION_1_0_0, "freq", /* MCA component name */ ORTE_MAJOR_VERSION, /* MCA component major version */ ORTE_MINOR_VERSION, /* MCA component minor version */ ORTE_RELEASE_VERSION, /* MCA component release version */ NULL, /* component open */ NULL, /* component close */ rtc_freq_query, /* component query */ rtc_freq_register /* component register */ }, { /* The component is checkpoint ready */ MCA_BASE_METADATA_PARAM_CHECKPOINT } } }; static char *freq; static int rtc_freq_register(void) { mca_base_component_t *c = &mca_rtc_freq_component.super.base_version; /* ordering here doesn't really matter */ my_priority = 50; (void) mca_base_component_var_register (c, "priority", "Priority of the FREQ rtc component", MCA_BASE_VAR_TYPE_INT, NULL, 0, 0, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_READONLY, &my_priority); mca_rtc_freq_component.governor = NULL; (void) mca_base_component_var_register (c, "governor", "Governor to be used by default (default: system setting)", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_READONLY, &mca_rtc_freq_component.governor); mca_rtc_freq_component.max_freq = NULL; (void) mca_base_component_var_register (c, "max", "Max frequency to be used by default (default: system setting)", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_READONLY, &mca_rtc_freq_component.max_freq); mca_rtc_freq_component.min_freq = NULL; (void) mca_base_component_var_register (c, "min", "Min frequency to be used by default (default: system setting)", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_READONLY, &mca_rtc_freq_component.min_freq); freq = NULL; (void) mca_base_component_var_register (c, NULL, "Specific frequency to be used by default", MCA_BASE_VAR_TYPE_STRING, NULL, 0, 0, OPAL_INFO_LVL_9, MCA_BASE_VAR_SCOPE_READONLY, &freq); if (NULL != freq) { /* if a max/min was also given, then that is an error */ if (NULL != mca_rtc_freq_component.max_freq || NULL != mca_rtc_freq_component.min_freq) { orte_show_help("help-rtc-freq.txt", "conflict-freq", true, freq, (NULL == mca_rtc_freq_component.max_freq) ? "NULL" : mca_rtc_freq_component.max_freq, (NULL == mca_rtc_freq_component.min_freq) ? "NULL" : mca_rtc_freq_component.min_freq); return ORTE_ERR_SILENT; } /* set the max/min to the given value */ mca_rtc_freq_component.max_freq = strdup(freq); mca_rtc_freq_component.min_freq = strdup(freq); } return ORTE_SUCCESS; } static int rtc_freq_query(mca_base_module_t **module, int *priority) { /* in general, only root can change the frequency setting * of a node. However, if the sys admin has configured the * remote node with the "userspace" governor, then individual * users will be able to do so. Hence, we allow this component * to always be selected, and will instead error out if the * remote node cannot support the desired setting */ *priority = my_priority; *module = (mca_base_module_t *)&orte_rtc_freq_module; return ORTE_SUCCESS; }