1c7ec1f26SLukasz Krakowiak /* SPDX-License-Identifier: BSD-3-Clause 2c7ec1f26SLukasz Krakowiak * Copyright(c) 2010-2014 Intel Corporation 3c7ec1f26SLukasz Krakowiak */ 4c7ec1f26SLukasz Krakowiak 5c7ec1f26SLukasz Krakowiak #include <stdio.h> 6c7ec1f26SLukasz Krakowiak #include <stdint.h> 7c7ec1f26SLukasz Krakowiak #include <unistd.h> 8c7ec1f26SLukasz Krakowiak #include <limits.h> 9c7ec1f26SLukasz Krakowiak #include <string.h> 10c7ec1f26SLukasz Krakowiak #include <inttypes.h> 1100456850SRichael Zhuang #include <rte_cycles.h> 125c9b07eeSSivaprasad Tummala #include <rte_lcore.h> 13c7ec1f26SLukasz Krakowiak 14c7ec1f26SLukasz Krakowiak #include "test.h" 15c7ec1f26SLukasz Krakowiak 16a8d0d473SBruce Richardson #ifndef RTE_LIB_POWER 17c7ec1f26SLukasz Krakowiak 18c7ec1f26SLukasz Krakowiak static int 19c7ec1f26SLukasz Krakowiak test_power_cpufreq(void) 20c7ec1f26SLukasz Krakowiak { 21c7ec1f26SLukasz Krakowiak printf("Power management library not supported, skipping test\n"); 22c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 23c7ec1f26SLukasz Krakowiak } 24c7ec1f26SLukasz Krakowiak 25c7ec1f26SLukasz Krakowiak static int 26c7ec1f26SLukasz Krakowiak test_power_caps(void) 27c7ec1f26SLukasz Krakowiak { 28c7ec1f26SLukasz Krakowiak printf("Power management library not supported, skipping test\n"); 29c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 30c7ec1f26SLukasz Krakowiak } 31c7ec1f26SLukasz Krakowiak 32c7ec1f26SLukasz Krakowiak #else 33*f30a1bbdSSivaprasad Tummala #include <rte_power_cpufreq.h> 34c7ec1f26SLukasz Krakowiak 35c7ec1f26SLukasz Krakowiak #define TEST_POWER_LCORE_ID 2U 36c7ec1f26SLukasz Krakowiak #define TEST_POWER_LCORE_INVALID ((unsigned)RTE_MAX_LCORE) 37c7ec1f26SLukasz Krakowiak #define TEST_POWER_FREQS_NUM_MAX ((unsigned)RTE_MAX_LCORE_FREQS) 38c7ec1f26SLukasz Krakowiak 39606a234cSRichael Zhuang /* macros used for rounding frequency to nearest 100000 */ 40606a234cSRichael Zhuang #define TEST_FREQ_ROUNDING_DELTA 50000 41606a234cSRichael Zhuang #define TEST_ROUND_FREQ_TO_N_100000 100000 42606a234cSRichael Zhuang 43ff6dfb8eSDavid Hunt #define TEST_POWER_SYSFILE_CPUINFO_FREQ \ 44c7ec1f26SLukasz Krakowiak "/sys/devices/system/cpu/cpu%u/cpufreq/cpuinfo_cur_freq" 45ff6dfb8eSDavid Hunt #define TEST_POWER_SYSFILE_SCALING_FREQ \ 46ff6dfb8eSDavid Hunt "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq" 47c7ec1f26SLukasz Krakowiak 48c7ec1f26SLukasz Krakowiak static uint32_t total_freq_num; 49c7ec1f26SLukasz Krakowiak static uint32_t freqs[TEST_POWER_FREQS_NUM_MAX]; 505c9b07eeSSivaprasad Tummala static uint32_t cpu_id; 51c7ec1f26SLukasz Krakowiak 52c7ec1f26SLukasz Krakowiak static int 535c9b07eeSSivaprasad Tummala check_cur_freq(__rte_unused unsigned int lcore_id, uint32_t idx, bool turbo) 54c7ec1f26SLukasz Krakowiak { 55c7ec1f26SLukasz Krakowiak #define TEST_POWER_CONVERT_TO_DECIMAL 10 5600456850SRichael Zhuang #define MAX_LOOP 100 57c7ec1f26SLukasz Krakowiak FILE *f; 58c7ec1f26SLukasz Krakowiak char fullpath[PATH_MAX]; 59c7ec1f26SLukasz Krakowiak char buf[BUFSIZ]; 6029343b90SRichael Zhuang enum power_management_env env; 61c7ec1f26SLukasz Krakowiak uint32_t cur_freq; 6229343b90SRichael Zhuang uint32_t freq_conv; 63c7ec1f26SLukasz Krakowiak int ret = -1; 6400456850SRichael Zhuang int i; 65c7ec1f26SLukasz Krakowiak 66c7ec1f26SLukasz Krakowiak if (snprintf(fullpath, sizeof(fullpath), 675c9b07eeSSivaprasad Tummala TEST_POWER_SYSFILE_CPUINFO_FREQ, cpu_id) < 0) { 68ff6dfb8eSDavid Hunt return 0; 69ff6dfb8eSDavid Hunt } 70ff6dfb8eSDavid Hunt f = fopen(fullpath, "r"); 71ff6dfb8eSDavid Hunt if (f == NULL) { 72ff6dfb8eSDavid Hunt if (snprintf(fullpath, sizeof(fullpath), 735c9b07eeSSivaprasad Tummala TEST_POWER_SYSFILE_SCALING_FREQ, cpu_id) < 0) { 74c7ec1f26SLukasz Krakowiak return 0; 75c7ec1f26SLukasz Krakowiak } 76c7ec1f26SLukasz Krakowiak f = fopen(fullpath, "r"); 77c7ec1f26SLukasz Krakowiak if (f == NULL) { 78c7ec1f26SLukasz Krakowiak return 0; 79c7ec1f26SLukasz Krakowiak } 80ff6dfb8eSDavid Hunt } 8100456850SRichael Zhuang for (i = 0; i < MAX_LOOP; i++) { 8200456850SRichael Zhuang fflush(f); 8300456850SRichael Zhuang if (fgets(buf, sizeof(buf), f) == NULL) 8400456850SRichael Zhuang goto fail_all; 8500456850SRichael Zhuang 86c7ec1f26SLukasz Krakowiak cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL); 8729343b90SRichael Zhuang freq_conv = cur_freq; 88606a234cSRichael Zhuang 8929343b90SRichael Zhuang env = rte_power_get_env(); 90cf1e8035SRichael Zhuang if (env == PM_ENV_CPPC_CPUFREQ || env == PM_ENV_PSTATE_CPUFREQ) { 91606a234cSRichael Zhuang /* convert the frequency to nearest 100000 value 92606a234cSRichael Zhuang * Ex: if cur_freq=1396789 then freq_conv=1400000 93606a234cSRichael Zhuang * Ex: if cur_freq=800030 then freq_conv=800000 94606a234cSRichael Zhuang */ 95606a234cSRichael Zhuang freq_conv = (cur_freq + TEST_FREQ_ROUNDING_DELTA) 96606a234cSRichael Zhuang / TEST_ROUND_FREQ_TO_N_100000; 97606a234cSRichael Zhuang freq_conv = freq_conv * TEST_ROUND_FREQ_TO_N_100000; 981ed04d33SSivaprasad Tummala } else if (env == PM_ENV_AMD_PSTATE_CPUFREQ) { 991ed04d33SSivaprasad Tummala freq_conv = cur_freq > freqs[idx] ? (cur_freq - freqs[idx]) : 1001ed04d33SSivaprasad Tummala (freqs[idx] - cur_freq); 1011ed04d33SSivaprasad Tummala if (freq_conv <= TEST_FREQ_ROUNDING_DELTA) { 1021ed04d33SSivaprasad Tummala /* workaround: current frequency may deviate from 1031ed04d33SSivaprasad Tummala * nominal freq. Allow deviation of up to 50Mhz. 1041ed04d33SSivaprasad Tummala */ 1051ed04d33SSivaprasad Tummala printf("Current frequency deviated from nominal " 1061ed04d33SSivaprasad Tummala "frequency by %d Khz!\n", freq_conv); 1071ed04d33SSivaprasad Tummala freq_conv = freqs[idx]; 1081ed04d33SSivaprasad Tummala } 10929343b90SRichael Zhuang } 110606a234cSRichael Zhuang 1116db92b3bSDavid Hunt if (turbo) 1126db92b3bSDavid Hunt ret = (freqs[idx] <= freq_conv ? 0 : -1); 1136db92b3bSDavid Hunt else 114606a234cSRichael Zhuang ret = (freqs[idx] == freq_conv ? 0 : -1); 115c7ec1f26SLukasz Krakowiak 11600456850SRichael Zhuang if (ret == 0) 11700456850SRichael Zhuang break; 11800456850SRichael Zhuang 11900456850SRichael Zhuang if (fseek(f, 0, SEEK_SET) < 0) { 12000456850SRichael Zhuang printf("Fail to set file position indicator to 0\n"); 12100456850SRichael Zhuang goto fail_all; 12200456850SRichael Zhuang } 12300456850SRichael Zhuang 12400456850SRichael Zhuang /* wait for the value to be updated */ 12500456850SRichael Zhuang rte_delay_ms(10); 12600456850SRichael Zhuang } 12700456850SRichael Zhuang 12800456850SRichael Zhuang fail_all: 129c7ec1f26SLukasz Krakowiak fclose(f); 130c7ec1f26SLukasz Krakowiak 131c7ec1f26SLukasz Krakowiak return ret; 132c7ec1f26SLukasz Krakowiak } 133c7ec1f26SLukasz Krakowiak 134c7ec1f26SLukasz Krakowiak /* Check rte_power_freqs() */ 135c7ec1f26SLukasz Krakowiak static int 136c7ec1f26SLukasz Krakowiak check_power_freqs(void) 137c7ec1f26SLukasz Krakowiak { 138c7ec1f26SLukasz Krakowiak uint32_t ret; 139c7ec1f26SLukasz Krakowiak 140c7ec1f26SLukasz Krakowiak total_freq_num = 0; 141c7ec1f26SLukasz Krakowiak memset(freqs, 0, sizeof(freqs)); 142c7ec1f26SLukasz Krakowiak 143c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 144c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_INVALID, freqs, 145c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 146c7ec1f26SLukasz Krakowiak if (ret > 0) { 147c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully on " 148c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 149c7ec1f26SLukasz Krakowiak return -1; 150c7ec1f26SLukasz Krakowiak } 151c7ec1f26SLukasz Krakowiak 152c7ec1f26SLukasz Krakowiak /* test with NULL buffer to save available freqs */ 153c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, NULL, 154c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 155c7ec1f26SLukasz Krakowiak if (ret > 0) { 156c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully with " 157c7ec1f26SLukasz Krakowiak "NULL buffer on lcore %u\n", TEST_POWER_LCORE_ID); 158c7ec1f26SLukasz Krakowiak return -1; 159c7ec1f26SLukasz Krakowiak } 160c7ec1f26SLukasz Krakowiak 161c7ec1f26SLukasz Krakowiak /* test of getting zero number of freqs */ 162c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, freqs, 0); 163c7ec1f26SLukasz Krakowiak if (ret > 0) { 164c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully with " 165c7ec1f26SLukasz Krakowiak "zero buffer size on lcore %u\n", TEST_POWER_LCORE_ID); 166c7ec1f26SLukasz Krakowiak return -1; 167c7ec1f26SLukasz Krakowiak } 168c7ec1f26SLukasz Krakowiak 169c7ec1f26SLukasz Krakowiak /* test with all valid input parameters */ 170c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, freqs, 171c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 172c7ec1f26SLukasz Krakowiak if (ret == 0 || ret > TEST_POWER_FREQS_NUM_MAX) { 173c7ec1f26SLukasz Krakowiak printf("Fail to get available freqs on lcore %u\n", 174c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 175c7ec1f26SLukasz Krakowiak return -1; 176c7ec1f26SLukasz Krakowiak } 177c7ec1f26SLukasz Krakowiak 178c7ec1f26SLukasz Krakowiak /* Save the total number of available freqs */ 179c7ec1f26SLukasz Krakowiak total_freq_num = ret; 180c7ec1f26SLukasz Krakowiak 181c7ec1f26SLukasz Krakowiak return 0; 182c7ec1f26SLukasz Krakowiak } 183c7ec1f26SLukasz Krakowiak 184c7ec1f26SLukasz Krakowiak /* Check rte_power_get_freq() */ 185c7ec1f26SLukasz Krakowiak static int 186c7ec1f26SLukasz Krakowiak check_power_get_freq(void) 187c7ec1f26SLukasz Krakowiak { 188c7ec1f26SLukasz Krakowiak int ret; 189c7ec1f26SLukasz Krakowiak uint32_t count; 190c7ec1f26SLukasz Krakowiak 191c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 192c7ec1f26SLukasz Krakowiak count = rte_power_get_freq(TEST_POWER_LCORE_INVALID); 193c7ec1f26SLukasz Krakowiak if (count < TEST_POWER_FREQS_NUM_MAX) { 194c7ec1f26SLukasz Krakowiak printf("Unexpectedly get freq index successfully on " 195c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 196c7ec1f26SLukasz Krakowiak return -1; 197c7ec1f26SLukasz Krakowiak } 198c7ec1f26SLukasz Krakowiak 199c7ec1f26SLukasz Krakowiak count = rte_power_get_freq(TEST_POWER_LCORE_ID); 200c7ec1f26SLukasz Krakowiak if (count >= TEST_POWER_FREQS_NUM_MAX) { 201c7ec1f26SLukasz Krakowiak printf("Fail to get the freq index on lcore %u\n", 202c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 203c7ec1f26SLukasz Krakowiak return -1; 204c7ec1f26SLukasz Krakowiak } 205c7ec1f26SLukasz Krakowiak 206c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2076db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, count, false); 208c7ec1f26SLukasz Krakowiak if (ret < 0) 209c7ec1f26SLukasz Krakowiak return -1; 210c7ec1f26SLukasz Krakowiak 211c7ec1f26SLukasz Krakowiak return 0; 212c7ec1f26SLukasz Krakowiak } 213c7ec1f26SLukasz Krakowiak 214c7ec1f26SLukasz Krakowiak /* Check rte_power_set_freq() */ 215c7ec1f26SLukasz Krakowiak static int 216c7ec1f26SLukasz Krakowiak check_power_set_freq(void) 217c7ec1f26SLukasz Krakowiak { 218c7ec1f26SLukasz Krakowiak int ret; 219c7ec1f26SLukasz Krakowiak 220c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 221c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_INVALID, 0); 222c7ec1f26SLukasz Krakowiak if (ret >= 0) { 223c7ec1f26SLukasz Krakowiak printf("Unexpectedly set freq index successfully on " 224c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 225c7ec1f26SLukasz Krakowiak return -1; 226c7ec1f26SLukasz Krakowiak } 227c7ec1f26SLukasz Krakowiak 228c7ec1f26SLukasz Krakowiak /* test with an invalid freq index */ 229c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, 230c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 231c7ec1f26SLukasz Krakowiak if (ret >= 0) { 232c7ec1f26SLukasz Krakowiak printf("Unexpectedly set an invalid freq index (%u)" 233c7ec1f26SLukasz Krakowiak "successfully on lcore %u\n", TEST_POWER_FREQS_NUM_MAX, 234c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 235c7ec1f26SLukasz Krakowiak return -1; 236c7ec1f26SLukasz Krakowiak } 237c7ec1f26SLukasz Krakowiak 238c7ec1f26SLukasz Krakowiak /** 239c7ec1f26SLukasz Krakowiak * test with an invalid freq index which is right one bigger than 240c7ec1f26SLukasz Krakowiak * total number of freqs 241c7ec1f26SLukasz Krakowiak */ 242c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, total_freq_num); 243c7ec1f26SLukasz Krakowiak if (ret >= 0) { 244c7ec1f26SLukasz Krakowiak printf("Unexpectedly set an invalid freq index (%u)" 245c7ec1f26SLukasz Krakowiak "successfully on lcore %u\n", total_freq_num, 246c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 247c7ec1f26SLukasz Krakowiak return -1; 248c7ec1f26SLukasz Krakowiak } 249c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, total_freq_num - 1); 250c7ec1f26SLukasz Krakowiak if (ret < 0) { 251c7ec1f26SLukasz Krakowiak printf("Fail to set freq index on lcore %u\n", 252c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 253c7ec1f26SLukasz Krakowiak return -1; 254c7ec1f26SLukasz Krakowiak } 255c7ec1f26SLukasz Krakowiak 256c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2576db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 258c7ec1f26SLukasz Krakowiak if (ret < 0) 259c7ec1f26SLukasz Krakowiak return -1; 260c7ec1f26SLukasz Krakowiak 261c7ec1f26SLukasz Krakowiak return 0; 262c7ec1f26SLukasz Krakowiak } 263c7ec1f26SLukasz Krakowiak 264c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_down() */ 265c7ec1f26SLukasz Krakowiak static int 266c7ec1f26SLukasz Krakowiak check_power_freq_down(void) 267c7ec1f26SLukasz Krakowiak { 268c7ec1f26SLukasz Krakowiak int ret; 269c7ec1f26SLukasz Krakowiak 2700745214eSDavid Hunt rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); 2710745214eSDavid Hunt 272c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 273c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_INVALID); 274c7ec1f26SLukasz Krakowiak if (ret >= 0) { 275c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale down successfully the freq on " 276c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 277c7ec1f26SLukasz Krakowiak return -1; 278c7ec1f26SLukasz Krakowiak } 279c7ec1f26SLukasz Krakowiak 280c7ec1f26SLukasz Krakowiak /* Scale down to min and then scale down one step */ 281c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 282c7ec1f26SLukasz Krakowiak if (ret < 0) { 283c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 284c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 285c7ec1f26SLukasz Krakowiak return -1; 286c7ec1f26SLukasz Krakowiak } 287c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_ID); 288c7ec1f26SLukasz Krakowiak if (ret < 0) { 289c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq on lcore %u\n", 290c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 291c7ec1f26SLukasz Krakowiak return -1; 292c7ec1f26SLukasz Krakowiak } 293c7ec1f26SLukasz Krakowiak 294c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2956db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 296c7ec1f26SLukasz Krakowiak if (ret < 0) 297c7ec1f26SLukasz Krakowiak return -1; 298c7ec1f26SLukasz Krakowiak 299c7ec1f26SLukasz Krakowiak /* Scale up to max and then scale down one step */ 300c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 301c7ec1f26SLukasz Krakowiak if (ret < 0) { 302c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 303c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 304c7ec1f26SLukasz Krakowiak return -1; 305c7ec1f26SLukasz Krakowiak } 306c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_ID); 307c7ec1f26SLukasz Krakowiak if (ret < 0) { 308c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq on lcore %u\n", 309c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 310c7ec1f26SLukasz Krakowiak return -1; 311c7ec1f26SLukasz Krakowiak } 312c7ec1f26SLukasz Krakowiak 313c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3146db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); 315c7ec1f26SLukasz Krakowiak if (ret < 0) 316c7ec1f26SLukasz Krakowiak return -1; 317c7ec1f26SLukasz Krakowiak 318c7ec1f26SLukasz Krakowiak return 0; 319c7ec1f26SLukasz Krakowiak } 320c7ec1f26SLukasz Krakowiak 321c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_up() */ 322c7ec1f26SLukasz Krakowiak static int 323c7ec1f26SLukasz Krakowiak check_power_freq_up(void) 324c7ec1f26SLukasz Krakowiak { 325c7ec1f26SLukasz Krakowiak int ret; 326c7ec1f26SLukasz Krakowiak 327c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 328c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_INVALID); 329c7ec1f26SLukasz Krakowiak if (ret >= 0) { 330c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale up successfully the freq on %u\n", 331c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_INVALID); 332c7ec1f26SLukasz Krakowiak return -1; 333c7ec1f26SLukasz Krakowiak } 334c7ec1f26SLukasz Krakowiak 335c7ec1f26SLukasz Krakowiak /* Scale down to min and then scale up one step */ 336c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 337c7ec1f26SLukasz Krakowiak if (ret < 0) { 338c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 339c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 340c7ec1f26SLukasz Krakowiak return -1; 341c7ec1f26SLukasz Krakowiak } 342c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_ID); 343c7ec1f26SLukasz Krakowiak if (ret < 0) { 344c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq on lcore %u\n", 345c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 346c7ec1f26SLukasz Krakowiak return -1; 347c7ec1f26SLukasz Krakowiak } 348c7ec1f26SLukasz Krakowiak 349c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3506db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 2, false); 351c7ec1f26SLukasz Krakowiak if (ret < 0) 352c7ec1f26SLukasz Krakowiak return -1; 353c7ec1f26SLukasz Krakowiak 354c7ec1f26SLukasz Krakowiak /* Scale up to max and then scale up one step */ 355c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 356c7ec1f26SLukasz Krakowiak if (ret < 0) { 357c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 358c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 359c7ec1f26SLukasz Krakowiak return -1; 360c7ec1f26SLukasz Krakowiak } 361c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_ID); 362c7ec1f26SLukasz Krakowiak if (ret < 0) { 363c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq on lcore %u\n", 364c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 365c7ec1f26SLukasz Krakowiak return -1; 366c7ec1f26SLukasz Krakowiak } 367c7ec1f26SLukasz Krakowiak 368c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3696db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 370c7ec1f26SLukasz Krakowiak if (ret < 0) 371c7ec1f26SLukasz Krakowiak return -1; 372c7ec1f26SLukasz Krakowiak 373c7ec1f26SLukasz Krakowiak return 0; 374c7ec1f26SLukasz Krakowiak } 375c7ec1f26SLukasz Krakowiak 376c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_max() */ 377c7ec1f26SLukasz Krakowiak static int 378c7ec1f26SLukasz Krakowiak check_power_freq_max(void) 379c7ec1f26SLukasz Krakowiak { 380c7ec1f26SLukasz Krakowiak int ret; 381c7ec1f26SLukasz Krakowiak 382c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 383c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_INVALID); 384c7ec1f26SLukasz Krakowiak if (ret >= 0) { 385c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale up successfully the freq to max on " 386c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 387c7ec1f26SLukasz Krakowiak return -1; 388c7ec1f26SLukasz Krakowiak } 389c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 390c7ec1f26SLukasz Krakowiak if (ret < 0) { 391c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 392c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 393c7ec1f26SLukasz Krakowiak return -1; 394c7ec1f26SLukasz Krakowiak } 395c7ec1f26SLukasz Krakowiak 396c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3976db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 398c7ec1f26SLukasz Krakowiak if (ret < 0) 399c7ec1f26SLukasz Krakowiak return -1; 400c7ec1f26SLukasz Krakowiak 401c7ec1f26SLukasz Krakowiak return 0; 402c7ec1f26SLukasz Krakowiak } 403c7ec1f26SLukasz Krakowiak 404c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_min() */ 405c7ec1f26SLukasz Krakowiak static int 406c7ec1f26SLukasz Krakowiak check_power_freq_min(void) 407c7ec1f26SLukasz Krakowiak { 408c7ec1f26SLukasz Krakowiak int ret; 409c7ec1f26SLukasz Krakowiak 410c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 411c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_INVALID); 412c7ec1f26SLukasz Krakowiak if (ret >= 0) { 413c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale down successfully the freq to min " 414c7ec1f26SLukasz Krakowiak "on lcore %u\n", TEST_POWER_LCORE_INVALID); 415c7ec1f26SLukasz Krakowiak return -1; 416c7ec1f26SLukasz Krakowiak } 417c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 418c7ec1f26SLukasz Krakowiak if (ret < 0) { 419c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 420c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 421c7ec1f26SLukasz Krakowiak return -1; 422c7ec1f26SLukasz Krakowiak } 423c7ec1f26SLukasz Krakowiak 424c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 4256db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 426c7ec1f26SLukasz Krakowiak if (ret < 0) 427c7ec1f26SLukasz Krakowiak return -1; 428c7ec1f26SLukasz Krakowiak 429c7ec1f26SLukasz Krakowiak return 0; 430c7ec1f26SLukasz Krakowiak } 431c7ec1f26SLukasz Krakowiak 432aeaeaf5fSLukasz Krakowiak /* Check rte_power_turbo() */ 433aeaeaf5fSLukasz Krakowiak static int 434aeaeaf5fSLukasz Krakowiak check_power_turbo(void) 435aeaeaf5fSLukasz Krakowiak { 436aeaeaf5fSLukasz Krakowiak int ret; 437aeaeaf5fSLukasz Krakowiak 438aeaeaf5fSLukasz Krakowiak if (rte_power_turbo_status(TEST_POWER_LCORE_ID) == 0) { 439aeaeaf5fSLukasz Krakowiak printf("Turbo not available on lcore %u, skipping test\n", 440aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 441aeaeaf5fSLukasz Krakowiak return 0; 442aeaeaf5fSLukasz Krakowiak } 443aeaeaf5fSLukasz Krakowiak 444aeaeaf5fSLukasz Krakowiak /* test with an invalid lcore id */ 445aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_INVALID); 446aeaeaf5fSLukasz Krakowiak if (ret >= 0) { 447aeaeaf5fSLukasz Krakowiak printf("Unexpectedly enable turbo successfully on lcore %u\n", 448aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_INVALID); 449aeaeaf5fSLukasz Krakowiak return -1; 450aeaeaf5fSLukasz Krakowiak } 451aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); 452aeaeaf5fSLukasz Krakowiak if (ret < 0) { 453aeaeaf5fSLukasz Krakowiak printf("Fail to enable turbo on lcore %u\n", 454aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 455aeaeaf5fSLukasz Krakowiak return -1; 456aeaeaf5fSLukasz Krakowiak } 4575bb0409bSDavid Hunt ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 4585bb0409bSDavid Hunt if (ret < 0) { 4595bb0409bSDavid Hunt printf("Fail to scale up the freq to max on lcore %u\n", 4605bb0409bSDavid Hunt TEST_POWER_LCORE_ID); 4615bb0409bSDavid Hunt return -1; 4625bb0409bSDavid Hunt } 463aeaeaf5fSLukasz Krakowiak 464aeaeaf5fSLukasz Krakowiak /* Check the current frequency */ 4656db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 466aeaeaf5fSLukasz Krakowiak if (ret < 0) 467aeaeaf5fSLukasz Krakowiak return -1; 468aeaeaf5fSLukasz Krakowiak 469aeaeaf5fSLukasz Krakowiak /* test with an invalid lcore id */ 470aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_INVALID); 471aeaeaf5fSLukasz Krakowiak if (ret >= 0) { 472aeaeaf5fSLukasz Krakowiak printf("Unexpectedly disable turbo successfully on lcore %u\n", 473aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_INVALID); 474aeaeaf5fSLukasz Krakowiak return -1; 475aeaeaf5fSLukasz Krakowiak } 476aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_ID); 477aeaeaf5fSLukasz Krakowiak if (ret < 0) { 478aeaeaf5fSLukasz Krakowiak printf("Fail to disable turbo on lcore %u\n", 479aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 480aeaeaf5fSLukasz Krakowiak return -1; 481aeaeaf5fSLukasz Krakowiak } 4825bb0409bSDavid Hunt ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 4835bb0409bSDavid Hunt if (ret < 0) { 4845bb0409bSDavid Hunt printf("Fail to scale up the freq to max on lcore %u\n", 4855bb0409bSDavid Hunt TEST_POWER_LCORE_ID); 4865bb0409bSDavid Hunt return -1; 4875bb0409bSDavid Hunt } 488aeaeaf5fSLukasz Krakowiak 489aeaeaf5fSLukasz Krakowiak /* Check the current frequency */ 4906db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); 491aeaeaf5fSLukasz Krakowiak if (ret < 0) 492aeaeaf5fSLukasz Krakowiak return -1; 493aeaeaf5fSLukasz Krakowiak 494aeaeaf5fSLukasz Krakowiak return 0; 495aeaeaf5fSLukasz Krakowiak } 496aeaeaf5fSLukasz Krakowiak 497c7ec1f26SLukasz Krakowiak static int 498c7ec1f26SLukasz Krakowiak test_power_cpufreq(void) 499c7ec1f26SLukasz Krakowiak { 500c7ec1f26SLukasz Krakowiak int ret = -1; 501c7ec1f26SLukasz Krakowiak enum power_management_env env; 5025c9b07eeSSivaprasad Tummala rte_cpuset_t lcore_cpus; 5035c9b07eeSSivaprasad Tummala 5045c9b07eeSSivaprasad Tummala lcore_cpus = rte_lcore_cpuset(TEST_POWER_LCORE_ID); 5055c9b07eeSSivaprasad Tummala if (CPU_COUNT(&lcore_cpus) != 1) { 5065c9b07eeSSivaprasad Tummala printf("Power management doesn't support lcore %u mapping to %u CPUs\n", 5075c9b07eeSSivaprasad Tummala TEST_POWER_LCORE_ID, 5085c9b07eeSSivaprasad Tummala CPU_COUNT(&lcore_cpus)); 5095c9b07eeSSivaprasad Tummala return TEST_SKIPPED; 5105c9b07eeSSivaprasad Tummala } 5115c9b07eeSSivaprasad Tummala for (cpu_id = 0; cpu_id < CPU_SETSIZE; cpu_id++) { 5125c9b07eeSSivaprasad Tummala if (CPU_ISSET(cpu_id, &lcore_cpus)) 5135c9b07eeSSivaprasad Tummala break; 5145c9b07eeSSivaprasad Tummala } 515c7ec1f26SLukasz Krakowiak 516c7ec1f26SLukasz Krakowiak /* Test initialisation of a valid lcore */ 517c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 518c7ec1f26SLukasz Krakowiak if (ret < 0) { 519c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 520c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 521c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 522c7ec1f26SLukasz Krakowiak "Power management environment\n", 523c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 524c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 525c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 526c7ec1f26SLukasz Krakowiak } 527c7ec1f26SLukasz Krakowiak 528c7ec1f26SLukasz Krakowiak /* Test environment configuration */ 529c7ec1f26SLukasz Krakowiak env = rte_power_get_env(); 530ef1cc88fSRichael Zhuang if ((env != PM_ENV_ACPI_CPUFREQ) && (env != PM_ENV_PSTATE_CPUFREQ) && 5311ed04d33SSivaprasad Tummala (env != PM_ENV_CPPC_CPUFREQ) && 5321ed04d33SSivaprasad Tummala (env != PM_ENV_AMD_PSTATE_CPUFREQ)) { 533c7ec1f26SLukasz Krakowiak printf("Unexpectedly got an environment other than ACPI/PSTATE\n"); 534c7ec1f26SLukasz Krakowiak goto fail_all; 535c7ec1f26SLukasz Krakowiak } 536c7ec1f26SLukasz Krakowiak 537c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 538c7ec1f26SLukasz Krakowiak if (ret < 0) { 539c7ec1f26SLukasz Krakowiak printf("Cannot exit power management for lcore %u\n", 540c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 541c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 542c7ec1f26SLukasz Krakowiak return -1; 543c7ec1f26SLukasz Krakowiak } 544c7ec1f26SLukasz Krakowiak 545c7ec1f26SLukasz Krakowiak /* test of init power management for an invalid lcore */ 546c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_INVALID); 547c7ec1f26SLukasz Krakowiak if (ret == 0) { 548c7ec1f26SLukasz Krakowiak printf("Unexpectedly initialise power management successfully " 549c7ec1f26SLukasz Krakowiak "for lcore %u\n", TEST_POWER_LCORE_INVALID); 550c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 551c7ec1f26SLukasz Krakowiak return -1; 552c7ec1f26SLukasz Krakowiak } 553c7ec1f26SLukasz Krakowiak 554c7ec1f26SLukasz Krakowiak /* Test initialisation of a valid lcore */ 555c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 556c7ec1f26SLukasz Krakowiak if (ret < 0) { 557c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 558c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 559c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 560c7ec1f26SLukasz Krakowiak "Power management environment\n", TEST_POWER_LCORE_ID); 561c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 562c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 563c7ec1f26SLukasz Krakowiak } 564c7ec1f26SLukasz Krakowiak 565c7ec1f26SLukasz Krakowiak /** 566c7ec1f26SLukasz Krakowiak * test of initialising power management for the lcore which has 567c7ec1f26SLukasz Krakowiak * been initialised 568c7ec1f26SLukasz Krakowiak */ 569c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 570c7ec1f26SLukasz Krakowiak if (ret == 0) { 571c7ec1f26SLukasz Krakowiak printf("Unexpectedly init successfully power twice on " 572c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_ID); 573c7ec1f26SLukasz Krakowiak goto fail_all; 574c7ec1f26SLukasz Krakowiak } 575c7ec1f26SLukasz Krakowiak 576c7ec1f26SLukasz Krakowiak ret = check_power_freqs(); 577c7ec1f26SLukasz Krakowiak if (ret < 0) 578c7ec1f26SLukasz Krakowiak goto fail_all; 579c7ec1f26SLukasz Krakowiak 580c7ec1f26SLukasz Krakowiak if (total_freq_num < 2) { 581c7ec1f26SLukasz Krakowiak rte_power_exit(TEST_POWER_LCORE_ID); 582c7ec1f26SLukasz Krakowiak printf("Frequency can not be changed due to CPU itself\n"); 583c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 584c7ec1f26SLukasz Krakowiak return 0; 585c7ec1f26SLukasz Krakowiak } 586c7ec1f26SLukasz Krakowiak 587c7ec1f26SLukasz Krakowiak ret = check_power_get_freq(); 588c7ec1f26SLukasz Krakowiak if (ret < 0) 589c7ec1f26SLukasz Krakowiak goto fail_all; 590c7ec1f26SLukasz Krakowiak 591c7ec1f26SLukasz Krakowiak ret = check_power_set_freq(); 592c7ec1f26SLukasz Krakowiak if (ret < 0) 593c7ec1f26SLukasz Krakowiak goto fail_all; 594c7ec1f26SLukasz Krakowiak 595c7ec1f26SLukasz Krakowiak ret = check_power_freq_down(); 596c7ec1f26SLukasz Krakowiak if (ret < 0) 597c7ec1f26SLukasz Krakowiak goto fail_all; 598c7ec1f26SLukasz Krakowiak 599c7ec1f26SLukasz Krakowiak ret = check_power_freq_up(); 600c7ec1f26SLukasz Krakowiak if (ret < 0) 601c7ec1f26SLukasz Krakowiak goto fail_all; 602c7ec1f26SLukasz Krakowiak 603c7ec1f26SLukasz Krakowiak ret = check_power_freq_max(); 604c7ec1f26SLukasz Krakowiak if (ret < 0) 605c7ec1f26SLukasz Krakowiak goto fail_all; 606c7ec1f26SLukasz Krakowiak 607c7ec1f26SLukasz Krakowiak ret = check_power_freq_min(); 608c7ec1f26SLukasz Krakowiak if (ret < 0) 609c7ec1f26SLukasz Krakowiak goto fail_all; 610c7ec1f26SLukasz Krakowiak 611aeaeaf5fSLukasz Krakowiak ret = check_power_turbo(); 612aeaeaf5fSLukasz Krakowiak if (ret < 0) 613aeaeaf5fSLukasz Krakowiak goto fail_all; 614aeaeaf5fSLukasz Krakowiak 615c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 616c7ec1f26SLukasz Krakowiak if (ret < 0) { 617c7ec1f26SLukasz Krakowiak printf("Cannot exit power management for lcore %u\n", 618c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 619c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 620c7ec1f26SLukasz Krakowiak return -1; 621c7ec1f26SLukasz Krakowiak } 622c7ec1f26SLukasz Krakowiak 623c7ec1f26SLukasz Krakowiak /** 624c7ec1f26SLukasz Krakowiak * test of exiting power management for the lcore which has been exited 625c7ec1f26SLukasz Krakowiak */ 626c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 627c7ec1f26SLukasz Krakowiak if (ret == 0) { 628c7ec1f26SLukasz Krakowiak printf("Unexpectedly exit successfully power management twice " 629c7ec1f26SLukasz Krakowiak "on lcore %u\n", TEST_POWER_LCORE_ID); 630c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 631c7ec1f26SLukasz Krakowiak return -1; 632c7ec1f26SLukasz Krakowiak } 633c7ec1f26SLukasz Krakowiak 634c7ec1f26SLukasz Krakowiak /* test of exit power management for an invalid lcore */ 635c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_INVALID); 636c7ec1f26SLukasz Krakowiak if (ret == 0) { 6377be78d02SJosh Soref printf("Unexpectedly exit power management successfully for " 638c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 639c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 640c7ec1f26SLukasz Krakowiak return -1; 641c7ec1f26SLukasz Krakowiak } 642c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 643c7ec1f26SLukasz Krakowiak return 0; 644c7ec1f26SLukasz Krakowiak 645c7ec1f26SLukasz Krakowiak fail_all: 646c7ec1f26SLukasz Krakowiak rte_power_exit(TEST_POWER_LCORE_ID); 647c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 648c7ec1f26SLukasz Krakowiak return -1; 649c7ec1f26SLukasz Krakowiak } 650c7ec1f26SLukasz Krakowiak 651c7ec1f26SLukasz Krakowiak static int 652c7ec1f26SLukasz Krakowiak test_power_caps(void) 653c7ec1f26SLukasz Krakowiak { 654c7ec1f26SLukasz Krakowiak struct rte_power_core_capabilities caps; 655c7ec1f26SLukasz Krakowiak int ret; 656c7ec1f26SLukasz Krakowiak 657c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 658c7ec1f26SLukasz Krakowiak if (ret < 0) { 659c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 660c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 661c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 662c7ec1f26SLukasz Krakowiak "Power management environment\n", TEST_POWER_LCORE_ID); 663c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 664c7ec1f26SLukasz Krakowiak return -1; 665c7ec1f26SLukasz Krakowiak } 666c7ec1f26SLukasz Krakowiak 667c7ec1f26SLukasz Krakowiak ret = rte_power_get_capabilities(TEST_POWER_LCORE_ID, &caps); 668c7ec1f26SLukasz Krakowiak if (ret) { 669c7ec1f26SLukasz Krakowiak printf("POWER: Error getting capabilities\n"); 670c7ec1f26SLukasz Krakowiak return -1; 671c7ec1f26SLukasz Krakowiak } 672c7ec1f26SLukasz Krakowiak 673c7ec1f26SLukasz Krakowiak printf("POWER: Capabilities %"PRIx64"\n", caps.capabilities); 674c7ec1f26SLukasz Krakowiak 675c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 676c7ec1f26SLukasz Krakowiak return 0; 677c7ec1f26SLukasz Krakowiak } 678c7ec1f26SLukasz Krakowiak 679c7ec1f26SLukasz Krakowiak #endif 680c7ec1f26SLukasz Krakowiak 681e0a8442cSBruce Richardson REGISTER_FAST_TEST(power_cpufreq_autotest, false, true, test_power_cpufreq); 682c7ec1f26SLukasz Krakowiak REGISTER_TEST_COMMAND(power_caps_autotest, test_power_caps); 683