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