X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=app%2Ftest%2Ftest_power_cpufreq.c;h=4d013cd7bb449efeba7f74532f903e744258b010;hb=ecdc927b99f2bdf3e5951998c7fda9726071bc38;hp=d099f2f47106e58b89c8789ed69061d9a8267af5;hpb=c7ec1f26fd6e6e644121d221df8d55288776bbc0;p=dpdk.git diff --git a/app/test/test_power_cpufreq.c b/app/test/test_power_cpufreq.c index d099f2f471..4d013cd7bb 100644 --- a/app/test/test_power_cpufreq.c +++ b/app/test/test_power_cpufreq.c @@ -8,10 +8,11 @@ #include #include #include +#include #include "test.h" -#ifndef RTE_LIBRTE_POWER +#ifndef RTE_LIB_POWER static int test_power_cpufreq(void) @@ -34,37 +35,84 @@ test_power_caps(void) #define TEST_POWER_LCORE_INVALID ((unsigned)RTE_MAX_LCORE) #define TEST_POWER_FREQS_NUM_MAX ((unsigned)RTE_MAX_LCORE_FREQS) -#define TEST_POWER_SYSFILE_CUR_FREQ \ +/* macros used for rounding frequency to nearest 100000 */ +#define TEST_FREQ_ROUNDING_DELTA 50000 +#define TEST_ROUND_FREQ_TO_N_100000 100000 + +#define TEST_POWER_SYSFILE_CPUINFO_FREQ \ "/sys/devices/system/cpu/cpu%u/cpufreq/cpuinfo_cur_freq" +#define TEST_POWER_SYSFILE_SCALING_FREQ \ + "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq" static uint32_t total_freq_num; static uint32_t freqs[TEST_POWER_FREQS_NUM_MAX]; static int -check_cur_freq(unsigned lcore_id, uint32_t idx) +check_cur_freq(unsigned int lcore_id, uint32_t idx, bool turbo) { #define TEST_POWER_CONVERT_TO_DECIMAL 10 +#define MAX_LOOP 100 FILE *f; char fullpath[PATH_MAX]; char buf[BUFSIZ]; + enum power_management_env env; uint32_t cur_freq; + uint32_t freq_conv; int ret = -1; + int i; if (snprintf(fullpath, sizeof(fullpath), - TEST_POWER_SYSFILE_CUR_FREQ, lcore_id) < 0) { + TEST_POWER_SYSFILE_CPUINFO_FREQ, lcore_id) < 0) { return 0; } f = fopen(fullpath, "r"); if (f == NULL) { - return 0; + if (snprintf(fullpath, sizeof(fullpath), + TEST_POWER_SYSFILE_SCALING_FREQ, lcore_id) < 0) { + return 0; + } + f = fopen(fullpath, "r"); + if (f == NULL) { + return 0; + } + } + for (i = 0; i < MAX_LOOP; i++) { + fflush(f); + if (fgets(buf, sizeof(buf), f) == NULL) + goto fail_all; + + cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL); + freq_conv = cur_freq; + + env = rte_power_get_env(); + if (env == PM_ENV_CPPC_CPUFREQ || env == PM_ENV_PSTATE_CPUFREQ) { + /* convert the frequency to nearest 100000 value + * Ex: if cur_freq=1396789 then freq_conv=1400000 + * Ex: if cur_freq=800030 then freq_conv=800000 + */ + freq_conv = (cur_freq + TEST_FREQ_ROUNDING_DELTA) + / TEST_ROUND_FREQ_TO_N_100000; + freq_conv = freq_conv * TEST_ROUND_FREQ_TO_N_100000; + } + + if (turbo) + ret = (freqs[idx] <= freq_conv ? 0 : -1); + else + ret = (freqs[idx] == freq_conv ? 0 : -1); + + if (ret == 0) + break; + + if (fseek(f, 0, SEEK_SET) < 0) { + printf("Fail to set file position indicator to 0\n"); + goto fail_all; + } + + /* wait for the value to be updated */ + rte_delay_ms(10); } - if (fgets(buf, sizeof(buf), f) == NULL) { - goto fail_get_cur_freq; - } - cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL); - ret = (freqs[idx] == cur_freq ? 0 : -1); -fail_get_cur_freq: +fail_all: fclose(f); return ret; @@ -143,7 +191,7 @@ check_power_get_freq(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, count); + ret = check_cur_freq(TEST_POWER_LCORE_ID, count, false); if (ret < 0) return -1; @@ -193,7 +241,7 @@ check_power_set_freq(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1); + ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); if (ret < 0) return -1; @@ -206,6 +254,8 @@ check_power_freq_down(void) { int ret; + rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); + /* test with an invalid lcore id */ ret = rte_power_freq_down(TEST_POWER_LCORE_INVALID); if (ret >= 0) { @@ -229,7 +279,7 @@ check_power_freq_down(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1); + ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); if (ret < 0) return -1; @@ -248,7 +298,7 @@ check_power_freq_down(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, 1); + ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); if (ret < 0) return -1; @@ -284,7 +334,7 @@ check_power_freq_up(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 2); + ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 2, false); if (ret < 0) return -1; @@ -303,7 +353,7 @@ check_power_freq_up(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, 0); + ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); if (ret < 0) return -1; @@ -331,7 +381,7 @@ check_power_freq_max(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, 0); + ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); if (ret < 0) return -1; @@ -359,7 +409,72 @@ check_power_freq_min(void) } /* Check the current frequency */ - ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1); + ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); + if (ret < 0) + return -1; + + return 0; +} + +/* Check rte_power_turbo() */ +static int +check_power_turbo(void) +{ + int ret; + + if (rte_power_turbo_status(TEST_POWER_LCORE_ID) == 0) { + printf("Turbo not available on lcore %u, skipping test\n", + TEST_POWER_LCORE_ID); + return 0; + } + + /* test with an invalid lcore id */ + ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_INVALID); + if (ret >= 0) { + printf("Unexpectedly enable turbo successfully on lcore %u\n", + TEST_POWER_LCORE_INVALID); + return -1; + } + ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); + if (ret < 0) { + printf("Fail to enable turbo on lcore %u\n", + TEST_POWER_LCORE_ID); + return -1; + } + ret = rte_power_freq_max(TEST_POWER_LCORE_ID); + if (ret < 0) { + printf("Fail to scale up the freq to max on lcore %u\n", + TEST_POWER_LCORE_ID); + return -1; + } + + /* Check the current frequency */ + ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); + if (ret < 0) + return -1; + + /* test with an invalid lcore id */ + ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_INVALID); + if (ret >= 0) { + printf("Unexpectedly disable turbo successfully on lcore %u\n", + TEST_POWER_LCORE_INVALID); + return -1; + } + ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_ID); + if (ret < 0) { + printf("Fail to disable turbo on lcore %u\n", + TEST_POWER_LCORE_ID); + return -1; + } + ret = rte_power_freq_max(TEST_POWER_LCORE_ID); + if (ret < 0) { + printf("Fail to scale up the freq to max on lcore %u\n", + TEST_POWER_LCORE_ID); + return -1; + } + + /* Check the current frequency */ + ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); if (ret < 0) return -1; @@ -386,7 +501,8 @@ test_power_cpufreq(void) /* Test environment configuration */ env = rte_power_get_env(); - if ((env != PM_ENV_ACPI_CPUFREQ) && (env != PM_ENV_PSTATE_CPUFREQ)) { + if ((env != PM_ENV_ACPI_CPUFREQ) && (env != PM_ENV_PSTATE_CPUFREQ) && + (env != PM_ENV_CPPC_CPUFREQ)) { printf("Unexpectedly got an environment other than ACPI/PSTATE\n"); goto fail_all; } @@ -427,6 +543,21 @@ test_power_cpufreq(void) "been initialised\n"); goto fail_all; } + if (rte_power_turbo_status == NULL) { + printf("rte_power_turbo_status should not be NULL, environment has not " + "been initialised\n"); + goto fail_all; + } + if (rte_power_freq_enable_turbo == NULL) { + printf("rte_power_freq_enable_turbo should not be NULL, environment has not " + "been initialised\n"); + goto fail_all; + } + if (rte_power_freq_disable_turbo == NULL) { + printf("rte_power_freq_disable_turbo should not be NULL, environment has not " + "been initialised\n"); + goto fail_all; + } ret = rte_power_exit(TEST_POWER_LCORE_ID); if (ret < 0) { @@ -502,6 +633,10 @@ test_power_cpufreq(void) if (ret < 0) goto fail_all; + ret = check_power_turbo(); + if (ret < 0) + goto fail_all; + ret = rte_power_exit(TEST_POWER_LCORE_ID); if (ret < 0) { printf("Cannot exit power management for lcore %u\n", @@ -524,7 +659,7 @@ test_power_cpufreq(void) /* test of exit power management for an invalid lcore */ ret = rte_power_exit(TEST_POWER_LCORE_INVALID); if (ret == 0) { - printf("Unpectedly exit power management successfully for " + printf("Unexpectedly exit power management successfully for " "lcore %u\n", TEST_POWER_LCORE_INVALID); rte_power_unset_env(); return -1;