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> 12c7ec1f26SLukasz Krakowiak 13c7ec1f26SLukasz Krakowiak #include "test.h" 14c7ec1f26SLukasz Krakowiak 15a8d0d473SBruce Richardson #ifndef RTE_LIB_POWER 16c7ec1f26SLukasz Krakowiak 17c7ec1f26SLukasz Krakowiak static int 18c7ec1f26SLukasz Krakowiak test_power_cpufreq(void) 19c7ec1f26SLukasz Krakowiak { 20c7ec1f26SLukasz Krakowiak printf("Power management library not supported, skipping test\n"); 21c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 22c7ec1f26SLukasz Krakowiak } 23c7ec1f26SLukasz Krakowiak 24c7ec1f26SLukasz Krakowiak static int 25c7ec1f26SLukasz Krakowiak test_power_caps(void) 26c7ec1f26SLukasz Krakowiak { 27c7ec1f26SLukasz Krakowiak printf("Power management library not supported, skipping test\n"); 28c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 29c7ec1f26SLukasz Krakowiak } 30c7ec1f26SLukasz Krakowiak 31c7ec1f26SLukasz Krakowiak #else 32c7ec1f26SLukasz Krakowiak #include <rte_power.h> 33c7ec1f26SLukasz Krakowiak 34c7ec1f26SLukasz Krakowiak #define TEST_POWER_LCORE_ID 2U 35c7ec1f26SLukasz Krakowiak #define TEST_POWER_LCORE_INVALID ((unsigned)RTE_MAX_LCORE) 36c7ec1f26SLukasz Krakowiak #define TEST_POWER_FREQS_NUM_MAX ((unsigned)RTE_MAX_LCORE_FREQS) 37c7ec1f26SLukasz Krakowiak 38606a234cSRichael Zhuang /* macros used for rounding frequency to nearest 100000 */ 39606a234cSRichael Zhuang #define TEST_FREQ_ROUNDING_DELTA 50000 40606a234cSRichael Zhuang #define TEST_ROUND_FREQ_TO_N_100000 100000 41606a234cSRichael Zhuang 42ff6dfb8eSDavid Hunt #define TEST_POWER_SYSFILE_CPUINFO_FREQ \ 43c7ec1f26SLukasz Krakowiak "/sys/devices/system/cpu/cpu%u/cpufreq/cpuinfo_cur_freq" 44ff6dfb8eSDavid Hunt #define TEST_POWER_SYSFILE_SCALING_FREQ \ 45ff6dfb8eSDavid Hunt "/sys/devices/system/cpu/cpu%u/cpufreq/scaling_cur_freq" 46c7ec1f26SLukasz Krakowiak 47c7ec1f26SLukasz Krakowiak static uint32_t total_freq_num; 48c7ec1f26SLukasz Krakowiak static uint32_t freqs[TEST_POWER_FREQS_NUM_MAX]; 49c7ec1f26SLukasz Krakowiak 50c7ec1f26SLukasz Krakowiak static int 516db92b3bSDavid Hunt check_cur_freq(unsigned int lcore_id, uint32_t idx, bool turbo) 52c7ec1f26SLukasz Krakowiak { 53c7ec1f26SLukasz Krakowiak #define TEST_POWER_CONVERT_TO_DECIMAL 10 5400456850SRichael Zhuang #define MAX_LOOP 100 55c7ec1f26SLukasz Krakowiak FILE *f; 56c7ec1f26SLukasz Krakowiak char fullpath[PATH_MAX]; 57c7ec1f26SLukasz Krakowiak char buf[BUFSIZ]; 58c7ec1f26SLukasz Krakowiak uint32_t cur_freq; 59c7ec1f26SLukasz Krakowiak int ret = -1; 6000456850SRichael Zhuang int i; 61c7ec1f26SLukasz Krakowiak 62c7ec1f26SLukasz Krakowiak if (snprintf(fullpath, sizeof(fullpath), 63ff6dfb8eSDavid Hunt TEST_POWER_SYSFILE_SCALING_FREQ, lcore_id) < 0) { 64ff6dfb8eSDavid Hunt return 0; 65ff6dfb8eSDavid Hunt } 66ff6dfb8eSDavid Hunt f = fopen(fullpath, "r"); 67ff6dfb8eSDavid Hunt if (f == NULL) { 68ff6dfb8eSDavid Hunt if (snprintf(fullpath, sizeof(fullpath), 69ff6dfb8eSDavid Hunt TEST_POWER_SYSFILE_CPUINFO_FREQ, lcore_id) < 0) { 70c7ec1f26SLukasz Krakowiak return 0; 71c7ec1f26SLukasz Krakowiak } 72c7ec1f26SLukasz Krakowiak f = fopen(fullpath, "r"); 73c7ec1f26SLukasz Krakowiak if (f == NULL) { 74c7ec1f26SLukasz Krakowiak return 0; 75c7ec1f26SLukasz Krakowiak } 76ff6dfb8eSDavid Hunt } 7700456850SRichael Zhuang for (i = 0; i < MAX_LOOP; i++) { 7800456850SRichael Zhuang fflush(f); 7900456850SRichael Zhuang if (fgets(buf, sizeof(buf), f) == NULL) 8000456850SRichael Zhuang goto fail_all; 8100456850SRichael Zhuang 82c7ec1f26SLukasz Krakowiak cur_freq = strtoul(buf, NULL, TEST_POWER_CONVERT_TO_DECIMAL); 83606a234cSRichael Zhuang 84606a234cSRichael Zhuang /* convert the frequency to nearest 100000 value 85606a234cSRichael Zhuang * Ex: if cur_freq=1396789 then freq_conv=1400000 86606a234cSRichael Zhuang * Ex: if cur_freq=800030 then freq_conv=800000 87606a234cSRichael Zhuang */ 88606a234cSRichael Zhuang unsigned int freq_conv = 0; 89606a234cSRichael Zhuang freq_conv = (cur_freq + TEST_FREQ_ROUNDING_DELTA) 90606a234cSRichael Zhuang / TEST_ROUND_FREQ_TO_N_100000; 91606a234cSRichael Zhuang freq_conv = freq_conv * TEST_ROUND_FREQ_TO_N_100000; 92606a234cSRichael Zhuang 936db92b3bSDavid Hunt if (turbo) 946db92b3bSDavid Hunt ret = (freqs[idx] <= freq_conv ? 0 : -1); 956db92b3bSDavid Hunt else 96606a234cSRichael Zhuang ret = (freqs[idx] == freq_conv ? 0 : -1); 97c7ec1f26SLukasz Krakowiak 9800456850SRichael Zhuang if (ret == 0) 9900456850SRichael Zhuang break; 10000456850SRichael Zhuang 10100456850SRichael Zhuang if (fseek(f, 0, SEEK_SET) < 0) { 10200456850SRichael Zhuang printf("Fail to set file position indicator to 0\n"); 10300456850SRichael Zhuang goto fail_all; 10400456850SRichael Zhuang } 10500456850SRichael Zhuang 10600456850SRichael Zhuang /* wait for the value to be updated */ 10700456850SRichael Zhuang rte_delay_ms(10); 10800456850SRichael Zhuang } 10900456850SRichael Zhuang 11000456850SRichael Zhuang fail_all: 111c7ec1f26SLukasz Krakowiak fclose(f); 112c7ec1f26SLukasz Krakowiak 113c7ec1f26SLukasz Krakowiak return ret; 114c7ec1f26SLukasz Krakowiak } 115c7ec1f26SLukasz Krakowiak 116c7ec1f26SLukasz Krakowiak /* Check rte_power_freqs() */ 117c7ec1f26SLukasz Krakowiak static int 118c7ec1f26SLukasz Krakowiak check_power_freqs(void) 119c7ec1f26SLukasz Krakowiak { 120c7ec1f26SLukasz Krakowiak uint32_t ret; 121c7ec1f26SLukasz Krakowiak 122c7ec1f26SLukasz Krakowiak total_freq_num = 0; 123c7ec1f26SLukasz Krakowiak memset(freqs, 0, sizeof(freqs)); 124c7ec1f26SLukasz Krakowiak 125c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 126c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_INVALID, freqs, 127c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 128c7ec1f26SLukasz Krakowiak if (ret > 0) { 129c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully on " 130c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 131c7ec1f26SLukasz Krakowiak return -1; 132c7ec1f26SLukasz Krakowiak } 133c7ec1f26SLukasz Krakowiak 134c7ec1f26SLukasz Krakowiak /* test with NULL buffer to save available freqs */ 135c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, NULL, 136c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 137c7ec1f26SLukasz Krakowiak if (ret > 0) { 138c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully with " 139c7ec1f26SLukasz Krakowiak "NULL buffer on lcore %u\n", TEST_POWER_LCORE_ID); 140c7ec1f26SLukasz Krakowiak return -1; 141c7ec1f26SLukasz Krakowiak } 142c7ec1f26SLukasz Krakowiak 143c7ec1f26SLukasz Krakowiak /* test of getting zero number of freqs */ 144c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, freqs, 0); 145c7ec1f26SLukasz Krakowiak if (ret > 0) { 146c7ec1f26SLukasz Krakowiak printf("Unexpectedly get available freqs successfully with " 147c7ec1f26SLukasz Krakowiak "zero buffer size on lcore %u\n", TEST_POWER_LCORE_ID); 148c7ec1f26SLukasz Krakowiak return -1; 149c7ec1f26SLukasz Krakowiak } 150c7ec1f26SLukasz Krakowiak 151c7ec1f26SLukasz Krakowiak /* test with all valid input parameters */ 152c7ec1f26SLukasz Krakowiak ret = rte_power_freqs(TEST_POWER_LCORE_ID, freqs, 153c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 154c7ec1f26SLukasz Krakowiak if (ret == 0 || ret > TEST_POWER_FREQS_NUM_MAX) { 155c7ec1f26SLukasz Krakowiak printf("Fail to get available freqs on lcore %u\n", 156c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 157c7ec1f26SLukasz Krakowiak return -1; 158c7ec1f26SLukasz Krakowiak } 159c7ec1f26SLukasz Krakowiak 160c7ec1f26SLukasz Krakowiak /* Save the total number of available freqs */ 161c7ec1f26SLukasz Krakowiak total_freq_num = ret; 162c7ec1f26SLukasz Krakowiak 163c7ec1f26SLukasz Krakowiak return 0; 164c7ec1f26SLukasz Krakowiak } 165c7ec1f26SLukasz Krakowiak 166c7ec1f26SLukasz Krakowiak /* Check rte_power_get_freq() */ 167c7ec1f26SLukasz Krakowiak static int 168c7ec1f26SLukasz Krakowiak check_power_get_freq(void) 169c7ec1f26SLukasz Krakowiak { 170c7ec1f26SLukasz Krakowiak int ret; 171c7ec1f26SLukasz Krakowiak uint32_t count; 172c7ec1f26SLukasz Krakowiak 173c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 174c7ec1f26SLukasz Krakowiak count = rte_power_get_freq(TEST_POWER_LCORE_INVALID); 175c7ec1f26SLukasz Krakowiak if (count < TEST_POWER_FREQS_NUM_MAX) { 176c7ec1f26SLukasz Krakowiak printf("Unexpectedly get freq index successfully on " 177c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 178c7ec1f26SLukasz Krakowiak return -1; 179c7ec1f26SLukasz Krakowiak } 180c7ec1f26SLukasz Krakowiak 181c7ec1f26SLukasz Krakowiak count = rte_power_get_freq(TEST_POWER_LCORE_ID); 182c7ec1f26SLukasz Krakowiak if (count >= TEST_POWER_FREQS_NUM_MAX) { 183c7ec1f26SLukasz Krakowiak printf("Fail to get the freq index on lcore %u\n", 184c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 185c7ec1f26SLukasz Krakowiak return -1; 186c7ec1f26SLukasz Krakowiak } 187c7ec1f26SLukasz Krakowiak 188c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 1896db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, count, false); 190c7ec1f26SLukasz Krakowiak if (ret < 0) 191c7ec1f26SLukasz Krakowiak return -1; 192c7ec1f26SLukasz Krakowiak 193c7ec1f26SLukasz Krakowiak return 0; 194c7ec1f26SLukasz Krakowiak } 195c7ec1f26SLukasz Krakowiak 196c7ec1f26SLukasz Krakowiak /* Check rte_power_set_freq() */ 197c7ec1f26SLukasz Krakowiak static int 198c7ec1f26SLukasz Krakowiak check_power_set_freq(void) 199c7ec1f26SLukasz Krakowiak { 200c7ec1f26SLukasz Krakowiak int ret; 201c7ec1f26SLukasz Krakowiak 202c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 203c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_INVALID, 0); 204c7ec1f26SLukasz Krakowiak if (ret >= 0) { 205c7ec1f26SLukasz Krakowiak printf("Unexpectedly set freq index successfully on " 206c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 207c7ec1f26SLukasz Krakowiak return -1; 208c7ec1f26SLukasz Krakowiak } 209c7ec1f26SLukasz Krakowiak 210c7ec1f26SLukasz Krakowiak /* test with an invalid freq index */ 211c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, 212c7ec1f26SLukasz Krakowiak TEST_POWER_FREQS_NUM_MAX); 213c7ec1f26SLukasz Krakowiak if (ret >= 0) { 214c7ec1f26SLukasz Krakowiak printf("Unexpectedly set an invalid freq index (%u)" 215c7ec1f26SLukasz Krakowiak "successfully on lcore %u\n", TEST_POWER_FREQS_NUM_MAX, 216c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 217c7ec1f26SLukasz Krakowiak return -1; 218c7ec1f26SLukasz Krakowiak } 219c7ec1f26SLukasz Krakowiak 220c7ec1f26SLukasz Krakowiak /** 221c7ec1f26SLukasz Krakowiak * test with an invalid freq index which is right one bigger than 222c7ec1f26SLukasz Krakowiak * total number of freqs 223c7ec1f26SLukasz Krakowiak */ 224c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, total_freq_num); 225c7ec1f26SLukasz Krakowiak if (ret >= 0) { 226c7ec1f26SLukasz Krakowiak printf("Unexpectedly set an invalid freq index (%u)" 227c7ec1f26SLukasz Krakowiak "successfully on lcore %u\n", total_freq_num, 228c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 229c7ec1f26SLukasz Krakowiak return -1; 230c7ec1f26SLukasz Krakowiak } 231c7ec1f26SLukasz Krakowiak ret = rte_power_set_freq(TEST_POWER_LCORE_ID, total_freq_num - 1); 232c7ec1f26SLukasz Krakowiak if (ret < 0) { 233c7ec1f26SLukasz Krakowiak printf("Fail to set freq index on lcore %u\n", 234c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 235c7ec1f26SLukasz Krakowiak return -1; 236c7ec1f26SLukasz Krakowiak } 237c7ec1f26SLukasz Krakowiak 238c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2396db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 240c7ec1f26SLukasz Krakowiak if (ret < 0) 241c7ec1f26SLukasz Krakowiak return -1; 242c7ec1f26SLukasz Krakowiak 243c7ec1f26SLukasz Krakowiak return 0; 244c7ec1f26SLukasz Krakowiak } 245c7ec1f26SLukasz Krakowiak 246c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_down() */ 247c7ec1f26SLukasz Krakowiak static int 248c7ec1f26SLukasz Krakowiak check_power_freq_down(void) 249c7ec1f26SLukasz Krakowiak { 250c7ec1f26SLukasz Krakowiak int ret; 251c7ec1f26SLukasz Krakowiak 252*0745214eSDavid Hunt rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); 253*0745214eSDavid Hunt 254c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 255c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_INVALID); 256c7ec1f26SLukasz Krakowiak if (ret >= 0) { 257c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale down successfully the freq on " 258c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 259c7ec1f26SLukasz Krakowiak return -1; 260c7ec1f26SLukasz Krakowiak } 261c7ec1f26SLukasz Krakowiak 262c7ec1f26SLukasz Krakowiak /* Scale down to min and then scale down one step */ 263c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 264c7ec1f26SLukasz Krakowiak if (ret < 0) { 265c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 266c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 267c7ec1f26SLukasz Krakowiak return -1; 268c7ec1f26SLukasz Krakowiak } 269c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_ID); 270c7ec1f26SLukasz Krakowiak if (ret < 0) { 271c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq on lcore %u\n", 272c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 273c7ec1f26SLukasz Krakowiak return -1; 274c7ec1f26SLukasz Krakowiak } 275c7ec1f26SLukasz Krakowiak 276c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2776db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 278c7ec1f26SLukasz Krakowiak if (ret < 0) 279c7ec1f26SLukasz Krakowiak return -1; 280c7ec1f26SLukasz Krakowiak 281c7ec1f26SLukasz Krakowiak /* Scale up to max and then scale down one step */ 282c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 283c7ec1f26SLukasz Krakowiak if (ret < 0) { 284c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 285c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 286c7ec1f26SLukasz Krakowiak return -1; 287c7ec1f26SLukasz Krakowiak } 288c7ec1f26SLukasz Krakowiak ret = rte_power_freq_down(TEST_POWER_LCORE_ID); 289c7ec1f26SLukasz Krakowiak if (ret < 0) { 290c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq on lcore %u\n", 291c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 292c7ec1f26SLukasz Krakowiak return -1; 293c7ec1f26SLukasz Krakowiak } 294c7ec1f26SLukasz Krakowiak 295c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 2966db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); 297c7ec1f26SLukasz Krakowiak if (ret < 0) 298c7ec1f26SLukasz Krakowiak return -1; 299c7ec1f26SLukasz Krakowiak 300c7ec1f26SLukasz Krakowiak return 0; 301c7ec1f26SLukasz Krakowiak } 302c7ec1f26SLukasz Krakowiak 303c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_up() */ 304c7ec1f26SLukasz Krakowiak static int 305c7ec1f26SLukasz Krakowiak check_power_freq_up(void) 306c7ec1f26SLukasz Krakowiak { 307c7ec1f26SLukasz Krakowiak int ret; 308c7ec1f26SLukasz Krakowiak 309c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 310c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_INVALID); 311c7ec1f26SLukasz Krakowiak if (ret >= 0) { 312c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale up successfully the freq on %u\n", 313c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_INVALID); 314c7ec1f26SLukasz Krakowiak return -1; 315c7ec1f26SLukasz Krakowiak } 316c7ec1f26SLukasz Krakowiak 317c7ec1f26SLukasz Krakowiak /* Scale down to min and then scale up one step */ 318c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 319c7ec1f26SLukasz Krakowiak if (ret < 0) { 320c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 321c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 322c7ec1f26SLukasz Krakowiak return -1; 323c7ec1f26SLukasz Krakowiak } 324c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_ID); 325c7ec1f26SLukasz Krakowiak if (ret < 0) { 326c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq on lcore %u\n", 327c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 328c7ec1f26SLukasz Krakowiak return -1; 329c7ec1f26SLukasz Krakowiak } 330c7ec1f26SLukasz Krakowiak 331c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3326db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 2, false); 333c7ec1f26SLukasz Krakowiak if (ret < 0) 334c7ec1f26SLukasz Krakowiak return -1; 335c7ec1f26SLukasz Krakowiak 336c7ec1f26SLukasz Krakowiak /* Scale up to max and then scale up one step */ 337c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 338c7ec1f26SLukasz Krakowiak if (ret < 0) { 339c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 340c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 341c7ec1f26SLukasz Krakowiak return -1; 342c7ec1f26SLukasz Krakowiak } 343c7ec1f26SLukasz Krakowiak ret = rte_power_freq_up(TEST_POWER_LCORE_ID); 344c7ec1f26SLukasz Krakowiak if (ret < 0) { 345c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq on lcore %u\n", 346c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 347c7ec1f26SLukasz Krakowiak return -1; 348c7ec1f26SLukasz Krakowiak } 349c7ec1f26SLukasz Krakowiak 350c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3516db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 352c7ec1f26SLukasz Krakowiak if (ret < 0) 353c7ec1f26SLukasz Krakowiak return -1; 354c7ec1f26SLukasz Krakowiak 355c7ec1f26SLukasz Krakowiak return 0; 356c7ec1f26SLukasz Krakowiak } 357c7ec1f26SLukasz Krakowiak 358c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_max() */ 359c7ec1f26SLukasz Krakowiak static int 360c7ec1f26SLukasz Krakowiak check_power_freq_max(void) 361c7ec1f26SLukasz Krakowiak { 362c7ec1f26SLukasz Krakowiak int ret; 363c7ec1f26SLukasz Krakowiak 364c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 365c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_INVALID); 366c7ec1f26SLukasz Krakowiak if (ret >= 0) { 367c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale up successfully the freq to max on " 368c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 369c7ec1f26SLukasz Krakowiak return -1; 370c7ec1f26SLukasz Krakowiak } 371c7ec1f26SLukasz Krakowiak ret = rte_power_freq_max(TEST_POWER_LCORE_ID); 372c7ec1f26SLukasz Krakowiak if (ret < 0) { 373c7ec1f26SLukasz Krakowiak printf("Fail to scale up the freq to max on lcore %u\n", 374c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 375c7ec1f26SLukasz Krakowiak return -1; 376c7ec1f26SLukasz Krakowiak } 377c7ec1f26SLukasz Krakowiak 378c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 3796db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 380c7ec1f26SLukasz Krakowiak if (ret < 0) 381c7ec1f26SLukasz Krakowiak return -1; 382c7ec1f26SLukasz Krakowiak 383c7ec1f26SLukasz Krakowiak return 0; 384c7ec1f26SLukasz Krakowiak } 385c7ec1f26SLukasz Krakowiak 386c7ec1f26SLukasz Krakowiak /* Check rte_power_freq_min() */ 387c7ec1f26SLukasz Krakowiak static int 388c7ec1f26SLukasz Krakowiak check_power_freq_min(void) 389c7ec1f26SLukasz Krakowiak { 390c7ec1f26SLukasz Krakowiak int ret; 391c7ec1f26SLukasz Krakowiak 392c7ec1f26SLukasz Krakowiak /* test with an invalid lcore id */ 393c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_INVALID); 394c7ec1f26SLukasz Krakowiak if (ret >= 0) { 395c7ec1f26SLukasz Krakowiak printf("Unexpectedly scale down successfully the freq to min " 396c7ec1f26SLukasz Krakowiak "on lcore %u\n", TEST_POWER_LCORE_INVALID); 397c7ec1f26SLukasz Krakowiak return -1; 398c7ec1f26SLukasz Krakowiak } 399c7ec1f26SLukasz Krakowiak ret = rte_power_freq_min(TEST_POWER_LCORE_ID); 400c7ec1f26SLukasz Krakowiak if (ret < 0) { 401c7ec1f26SLukasz Krakowiak printf("Fail to scale down the freq to min on lcore %u\n", 402c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 403c7ec1f26SLukasz Krakowiak return -1; 404c7ec1f26SLukasz Krakowiak } 405c7ec1f26SLukasz Krakowiak 406c7ec1f26SLukasz Krakowiak /* Check the current frequency */ 4076db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, total_freq_num - 1, false); 408c7ec1f26SLukasz Krakowiak if (ret < 0) 409c7ec1f26SLukasz Krakowiak return -1; 410c7ec1f26SLukasz Krakowiak 411c7ec1f26SLukasz Krakowiak return 0; 412c7ec1f26SLukasz Krakowiak } 413c7ec1f26SLukasz Krakowiak 414aeaeaf5fSLukasz Krakowiak /* Check rte_power_turbo() */ 415aeaeaf5fSLukasz Krakowiak static int 416aeaeaf5fSLukasz Krakowiak check_power_turbo(void) 417aeaeaf5fSLukasz Krakowiak { 418aeaeaf5fSLukasz Krakowiak int ret; 419aeaeaf5fSLukasz Krakowiak 420aeaeaf5fSLukasz Krakowiak if (rte_power_turbo_status(TEST_POWER_LCORE_ID) == 0) { 421aeaeaf5fSLukasz Krakowiak printf("Turbo not available on lcore %u, skipping test\n", 422aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 423aeaeaf5fSLukasz Krakowiak return 0; 424aeaeaf5fSLukasz Krakowiak } 425aeaeaf5fSLukasz Krakowiak 426aeaeaf5fSLukasz Krakowiak /* test with an invalid lcore id */ 427aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_INVALID); 428aeaeaf5fSLukasz Krakowiak if (ret >= 0) { 429aeaeaf5fSLukasz Krakowiak printf("Unexpectedly enable turbo successfully on lcore %u\n", 430aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_INVALID); 431aeaeaf5fSLukasz Krakowiak return -1; 432aeaeaf5fSLukasz Krakowiak } 433aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_enable_turbo(TEST_POWER_LCORE_ID); 434aeaeaf5fSLukasz Krakowiak if (ret < 0) { 435aeaeaf5fSLukasz Krakowiak printf("Fail to enable turbo on lcore %u\n", 436aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 437aeaeaf5fSLukasz Krakowiak return -1; 438aeaeaf5fSLukasz Krakowiak } 439aeaeaf5fSLukasz Krakowiak 440aeaeaf5fSLukasz Krakowiak /* Check the current frequency */ 4416db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 0, true); 442aeaeaf5fSLukasz Krakowiak if (ret < 0) 443aeaeaf5fSLukasz Krakowiak return -1; 444aeaeaf5fSLukasz Krakowiak 445aeaeaf5fSLukasz Krakowiak /* test with an invalid lcore id */ 446aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_INVALID); 447aeaeaf5fSLukasz Krakowiak if (ret >= 0) { 448aeaeaf5fSLukasz Krakowiak printf("Unexpectedly disable turbo successfully on lcore %u\n", 449aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_INVALID); 450aeaeaf5fSLukasz Krakowiak return -1; 451aeaeaf5fSLukasz Krakowiak } 452aeaeaf5fSLukasz Krakowiak ret = rte_power_freq_disable_turbo(TEST_POWER_LCORE_ID); 453aeaeaf5fSLukasz Krakowiak if (ret < 0) { 454aeaeaf5fSLukasz Krakowiak printf("Fail to disable turbo on lcore %u\n", 455aeaeaf5fSLukasz Krakowiak TEST_POWER_LCORE_ID); 456aeaeaf5fSLukasz Krakowiak return -1; 457aeaeaf5fSLukasz Krakowiak } 458aeaeaf5fSLukasz Krakowiak 459aeaeaf5fSLukasz Krakowiak /* Check the current frequency */ 4606db92b3bSDavid Hunt ret = check_cur_freq(TEST_POWER_LCORE_ID, 1, false); 461aeaeaf5fSLukasz Krakowiak if (ret < 0) 462aeaeaf5fSLukasz Krakowiak return -1; 463aeaeaf5fSLukasz Krakowiak 464aeaeaf5fSLukasz Krakowiak return 0; 465aeaeaf5fSLukasz Krakowiak } 466aeaeaf5fSLukasz Krakowiak 467c7ec1f26SLukasz Krakowiak static int 468c7ec1f26SLukasz Krakowiak test_power_cpufreq(void) 469c7ec1f26SLukasz Krakowiak { 470c7ec1f26SLukasz Krakowiak int ret = -1; 471c7ec1f26SLukasz Krakowiak enum power_management_env env; 472c7ec1f26SLukasz Krakowiak 473c7ec1f26SLukasz Krakowiak /* Test initialisation of a valid lcore */ 474c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 475c7ec1f26SLukasz Krakowiak if (ret < 0) { 476c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 477c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 478c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 479c7ec1f26SLukasz Krakowiak "Power management environment\n", 480c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 481c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 482c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 483c7ec1f26SLukasz Krakowiak } 484c7ec1f26SLukasz Krakowiak 485c7ec1f26SLukasz Krakowiak /* Test environment configuration */ 486c7ec1f26SLukasz Krakowiak env = rte_power_get_env(); 487c7ec1f26SLukasz Krakowiak if ((env != PM_ENV_ACPI_CPUFREQ) && (env != PM_ENV_PSTATE_CPUFREQ)) { 488c7ec1f26SLukasz Krakowiak printf("Unexpectedly got an environment other than ACPI/PSTATE\n"); 489c7ec1f26SLukasz Krakowiak goto fail_all; 490c7ec1f26SLukasz Krakowiak } 491c7ec1f26SLukasz Krakowiak 492c7ec1f26SLukasz Krakowiak /* verify that function pointers are not NULL */ 493c7ec1f26SLukasz Krakowiak if (rte_power_freqs == NULL) { 494c7ec1f26SLukasz Krakowiak printf("rte_power_freqs should not be NULL, environment has not been " 495c7ec1f26SLukasz Krakowiak "initialised\n"); 496c7ec1f26SLukasz Krakowiak goto fail_all; 497c7ec1f26SLukasz Krakowiak } 498c7ec1f26SLukasz Krakowiak if (rte_power_get_freq == NULL) { 499c7ec1f26SLukasz Krakowiak printf("rte_power_get_freq should not be NULL, environment has not " 500c7ec1f26SLukasz Krakowiak "been initialised\n"); 501c7ec1f26SLukasz Krakowiak goto fail_all; 502c7ec1f26SLukasz Krakowiak } 503c7ec1f26SLukasz Krakowiak if (rte_power_set_freq == NULL) { 504c7ec1f26SLukasz Krakowiak printf("rte_power_set_freq should not be NULL, environment has not " 505c7ec1f26SLukasz Krakowiak "been initialised\n"); 506c7ec1f26SLukasz Krakowiak goto fail_all; 507c7ec1f26SLukasz Krakowiak } 508c7ec1f26SLukasz Krakowiak if (rte_power_freq_up == NULL) { 509c7ec1f26SLukasz Krakowiak printf("rte_power_freq_up should not be NULL, environment has not " 510c7ec1f26SLukasz Krakowiak "been initialised\n"); 511c7ec1f26SLukasz Krakowiak goto fail_all; 512c7ec1f26SLukasz Krakowiak } 513c7ec1f26SLukasz Krakowiak if (rte_power_freq_down == NULL) { 514c7ec1f26SLukasz Krakowiak printf("rte_power_freq_down should not be NULL, environment has not " 515c7ec1f26SLukasz Krakowiak "been initialised\n"); 516c7ec1f26SLukasz Krakowiak goto fail_all; 517c7ec1f26SLukasz Krakowiak } 518c7ec1f26SLukasz Krakowiak if (rte_power_freq_max == NULL) { 519c7ec1f26SLukasz Krakowiak printf("rte_power_freq_max should not be NULL, environment has not " 520c7ec1f26SLukasz Krakowiak "been initialised\n"); 521c7ec1f26SLukasz Krakowiak goto fail_all; 522c7ec1f26SLukasz Krakowiak } 523c7ec1f26SLukasz Krakowiak if (rte_power_freq_min == NULL) { 524c7ec1f26SLukasz Krakowiak printf("rte_power_freq_min should not be NULL, environment has not " 525c7ec1f26SLukasz Krakowiak "been initialised\n"); 526c7ec1f26SLukasz Krakowiak goto fail_all; 527c7ec1f26SLukasz Krakowiak } 528aeaeaf5fSLukasz Krakowiak if (rte_power_turbo_status == NULL) { 529aeaeaf5fSLukasz Krakowiak printf("rte_power_turbo_status should not be NULL, environment has not " 530aeaeaf5fSLukasz Krakowiak "been initialised\n"); 531aeaeaf5fSLukasz Krakowiak goto fail_all; 532aeaeaf5fSLukasz Krakowiak } 533aeaeaf5fSLukasz Krakowiak if (rte_power_freq_enable_turbo == NULL) { 534aeaeaf5fSLukasz Krakowiak printf("rte_power_freq_enable_turbo should not be NULL, environment has not " 535aeaeaf5fSLukasz Krakowiak "been initialised\n"); 536aeaeaf5fSLukasz Krakowiak goto fail_all; 537aeaeaf5fSLukasz Krakowiak } 538aeaeaf5fSLukasz Krakowiak if (rte_power_freq_disable_turbo == NULL) { 539aeaeaf5fSLukasz Krakowiak printf("rte_power_freq_disable_turbo should not be NULL, environment has not " 540aeaeaf5fSLukasz Krakowiak "been initialised\n"); 541aeaeaf5fSLukasz Krakowiak goto fail_all; 542aeaeaf5fSLukasz Krakowiak } 543c7ec1f26SLukasz Krakowiak 544c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 545c7ec1f26SLukasz Krakowiak if (ret < 0) { 546c7ec1f26SLukasz Krakowiak printf("Cannot exit power management for lcore %u\n", 547c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 548c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 549c7ec1f26SLukasz Krakowiak return -1; 550c7ec1f26SLukasz Krakowiak } 551c7ec1f26SLukasz Krakowiak 552c7ec1f26SLukasz Krakowiak /* test of init power management for an invalid lcore */ 553c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_INVALID); 554c7ec1f26SLukasz Krakowiak if (ret == 0) { 555c7ec1f26SLukasz Krakowiak printf("Unexpectedly initialise power management successfully " 556c7ec1f26SLukasz Krakowiak "for lcore %u\n", TEST_POWER_LCORE_INVALID); 557c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 558c7ec1f26SLukasz Krakowiak return -1; 559c7ec1f26SLukasz Krakowiak } 560c7ec1f26SLukasz Krakowiak 561c7ec1f26SLukasz Krakowiak /* Test initialisation of a valid lcore */ 562c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 563c7ec1f26SLukasz Krakowiak if (ret < 0) { 564c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 565c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 566c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 567c7ec1f26SLukasz Krakowiak "Power management environment\n", TEST_POWER_LCORE_ID); 568c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 569c7ec1f26SLukasz Krakowiak return TEST_SKIPPED; 570c7ec1f26SLukasz Krakowiak } 571c7ec1f26SLukasz Krakowiak 572c7ec1f26SLukasz Krakowiak /** 573c7ec1f26SLukasz Krakowiak * test of initialising power management for the lcore which has 574c7ec1f26SLukasz Krakowiak * been initialised 575c7ec1f26SLukasz Krakowiak */ 576c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 577c7ec1f26SLukasz Krakowiak if (ret == 0) { 578c7ec1f26SLukasz Krakowiak printf("Unexpectedly init successfully power twice on " 579c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_ID); 580c7ec1f26SLukasz Krakowiak goto fail_all; 581c7ec1f26SLukasz Krakowiak } 582c7ec1f26SLukasz Krakowiak 583c7ec1f26SLukasz Krakowiak ret = check_power_freqs(); 584c7ec1f26SLukasz Krakowiak if (ret < 0) 585c7ec1f26SLukasz Krakowiak goto fail_all; 586c7ec1f26SLukasz Krakowiak 587c7ec1f26SLukasz Krakowiak if (total_freq_num < 2) { 588c7ec1f26SLukasz Krakowiak rte_power_exit(TEST_POWER_LCORE_ID); 589c7ec1f26SLukasz Krakowiak printf("Frequency can not be changed due to CPU itself\n"); 590c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 591c7ec1f26SLukasz Krakowiak return 0; 592c7ec1f26SLukasz Krakowiak } 593c7ec1f26SLukasz Krakowiak 594c7ec1f26SLukasz Krakowiak ret = check_power_get_freq(); 595c7ec1f26SLukasz Krakowiak if (ret < 0) 596c7ec1f26SLukasz Krakowiak goto fail_all; 597c7ec1f26SLukasz Krakowiak 598c7ec1f26SLukasz Krakowiak ret = check_power_set_freq(); 599c7ec1f26SLukasz Krakowiak if (ret < 0) 600c7ec1f26SLukasz Krakowiak goto fail_all; 601c7ec1f26SLukasz Krakowiak 602c7ec1f26SLukasz Krakowiak ret = check_power_freq_down(); 603c7ec1f26SLukasz Krakowiak if (ret < 0) 604c7ec1f26SLukasz Krakowiak goto fail_all; 605c7ec1f26SLukasz Krakowiak 606c7ec1f26SLukasz Krakowiak ret = check_power_freq_up(); 607c7ec1f26SLukasz Krakowiak if (ret < 0) 608c7ec1f26SLukasz Krakowiak goto fail_all; 609c7ec1f26SLukasz Krakowiak 610c7ec1f26SLukasz Krakowiak ret = check_power_freq_max(); 611c7ec1f26SLukasz Krakowiak if (ret < 0) 612c7ec1f26SLukasz Krakowiak goto fail_all; 613c7ec1f26SLukasz Krakowiak 614c7ec1f26SLukasz Krakowiak ret = check_power_freq_min(); 615c7ec1f26SLukasz Krakowiak if (ret < 0) 616c7ec1f26SLukasz Krakowiak goto fail_all; 617c7ec1f26SLukasz Krakowiak 618aeaeaf5fSLukasz Krakowiak ret = check_power_turbo(); 619aeaeaf5fSLukasz Krakowiak if (ret < 0) 620aeaeaf5fSLukasz Krakowiak goto fail_all; 621aeaeaf5fSLukasz Krakowiak 622c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 623c7ec1f26SLukasz Krakowiak if (ret < 0) { 624c7ec1f26SLukasz Krakowiak printf("Cannot exit power management for lcore %u\n", 625c7ec1f26SLukasz Krakowiak TEST_POWER_LCORE_ID); 626c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 627c7ec1f26SLukasz Krakowiak return -1; 628c7ec1f26SLukasz Krakowiak } 629c7ec1f26SLukasz Krakowiak 630c7ec1f26SLukasz Krakowiak /** 631c7ec1f26SLukasz Krakowiak * test of exiting power management for the lcore which has been exited 632c7ec1f26SLukasz Krakowiak */ 633c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_ID); 634c7ec1f26SLukasz Krakowiak if (ret == 0) { 635c7ec1f26SLukasz Krakowiak printf("Unexpectedly exit successfully power management twice " 636c7ec1f26SLukasz Krakowiak "on lcore %u\n", TEST_POWER_LCORE_ID); 637c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 638c7ec1f26SLukasz Krakowiak return -1; 639c7ec1f26SLukasz Krakowiak } 640c7ec1f26SLukasz Krakowiak 641c7ec1f26SLukasz Krakowiak /* test of exit power management for an invalid lcore */ 642c7ec1f26SLukasz Krakowiak ret = rte_power_exit(TEST_POWER_LCORE_INVALID); 643c7ec1f26SLukasz Krakowiak if (ret == 0) { 644c7ec1f26SLukasz Krakowiak printf("Unpectedly exit power management successfully for " 645c7ec1f26SLukasz Krakowiak "lcore %u\n", TEST_POWER_LCORE_INVALID); 646c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 647c7ec1f26SLukasz Krakowiak return -1; 648c7ec1f26SLukasz Krakowiak } 649c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 650c7ec1f26SLukasz Krakowiak return 0; 651c7ec1f26SLukasz Krakowiak 652c7ec1f26SLukasz Krakowiak fail_all: 653c7ec1f26SLukasz Krakowiak rte_power_exit(TEST_POWER_LCORE_ID); 654c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 655c7ec1f26SLukasz Krakowiak return -1; 656c7ec1f26SLukasz Krakowiak } 657c7ec1f26SLukasz Krakowiak 658c7ec1f26SLukasz Krakowiak static int 659c7ec1f26SLukasz Krakowiak test_power_caps(void) 660c7ec1f26SLukasz Krakowiak { 661c7ec1f26SLukasz Krakowiak struct rte_power_core_capabilities caps; 662c7ec1f26SLukasz Krakowiak int ret; 663c7ec1f26SLukasz Krakowiak 664c7ec1f26SLukasz Krakowiak ret = rte_power_init(TEST_POWER_LCORE_ID); 665c7ec1f26SLukasz Krakowiak if (ret < 0) { 666c7ec1f26SLukasz Krakowiak printf("Cannot initialise power management for lcore %u, this " 667c7ec1f26SLukasz Krakowiak "may occur if environment is not configured " 668c7ec1f26SLukasz Krakowiak "correctly(APCI cpufreq) or operating in another valid " 669c7ec1f26SLukasz Krakowiak "Power management environment\n", TEST_POWER_LCORE_ID); 670c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 671c7ec1f26SLukasz Krakowiak return -1; 672c7ec1f26SLukasz Krakowiak } 673c7ec1f26SLukasz Krakowiak 674c7ec1f26SLukasz Krakowiak ret = rte_power_get_capabilities(TEST_POWER_LCORE_ID, &caps); 675c7ec1f26SLukasz Krakowiak if (ret) { 676c7ec1f26SLukasz Krakowiak printf("POWER: Error getting capabilities\n"); 677c7ec1f26SLukasz Krakowiak return -1; 678c7ec1f26SLukasz Krakowiak } 679c7ec1f26SLukasz Krakowiak 680c7ec1f26SLukasz Krakowiak printf("POWER: Capabilities %"PRIx64"\n", caps.capabilities); 681c7ec1f26SLukasz Krakowiak 682c7ec1f26SLukasz Krakowiak rte_power_unset_env(); 683c7ec1f26SLukasz Krakowiak return 0; 684c7ec1f26SLukasz Krakowiak } 685c7ec1f26SLukasz Krakowiak 686c7ec1f26SLukasz Krakowiak #endif 687c7ec1f26SLukasz Krakowiak 688c7ec1f26SLukasz Krakowiak REGISTER_TEST_COMMAND(power_cpufreq_autotest, test_power_cpufreq); 689c7ec1f26SLukasz Krakowiak REGISTER_TEST_COMMAND(power_caps_autotest, test_power_caps); 690