xref: /dpdk/app/test/test_power_cpufreq.c (revision f30a1bbd63f494f5ba623582d7e9166c817794a4)
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