xref: /f-stack/dpdk/app/test/test_power.c (revision 2d9fd380)
14418919fSjohnjiang /* SPDX-License-Identifier: BSD-3-Clause
24418919fSjohnjiang  * Copyright(c) 2010-2014 Intel Corporation
34418919fSjohnjiang  */
44418919fSjohnjiang 
54418919fSjohnjiang #include <stdio.h>
64418919fSjohnjiang #include <stdint.h>
74418919fSjohnjiang #include <unistd.h>
84418919fSjohnjiang #include <limits.h>
94418919fSjohnjiang #include <string.h>
104418919fSjohnjiang #include <stdbool.h>
114418919fSjohnjiang 
124418919fSjohnjiang #include "test.h"
134418919fSjohnjiang 
14*2d9fd380Sjfb8856606 #ifndef RTE_LIB_POWER
154418919fSjohnjiang 
164418919fSjohnjiang static int
test_power(void)174418919fSjohnjiang test_power(void)
184418919fSjohnjiang {
194418919fSjohnjiang 	printf("Power management library not supported, skipping test\n");
204418919fSjohnjiang 	return TEST_SKIPPED;
214418919fSjohnjiang }
224418919fSjohnjiang 
234418919fSjohnjiang #else
244418919fSjohnjiang 
254418919fSjohnjiang #include <rte_power.h>
264418919fSjohnjiang 
274418919fSjohnjiang static int
check_function_ptrs(void)284418919fSjohnjiang check_function_ptrs(void)
294418919fSjohnjiang {
304418919fSjohnjiang 	enum power_management_env env = rte_power_get_env();
314418919fSjohnjiang 
324418919fSjohnjiang 	const bool not_null_expected = !(env == PM_ENV_NOT_SET);
334418919fSjohnjiang 
344418919fSjohnjiang 	const char *inject_not_string1 = not_null_expected ? " not" : "";
354418919fSjohnjiang 	const char *inject_not_string2 = not_null_expected ? "" : " not";
364418919fSjohnjiang 
374418919fSjohnjiang 	if ((rte_power_freqs == NULL) == not_null_expected) {
384418919fSjohnjiang 		printf("rte_power_freqs should%s be NULL, environment has%s been "
394418919fSjohnjiang 				"initialised\n", inject_not_string1,
404418919fSjohnjiang 					inject_not_string2);
414418919fSjohnjiang 		return -1;
424418919fSjohnjiang 	}
434418919fSjohnjiang 	if ((rte_power_get_freq == NULL) == not_null_expected) {
444418919fSjohnjiang 		printf("rte_power_get_freq should%s be NULL, environment has%s been "
454418919fSjohnjiang 				"initialised\n", inject_not_string1,
464418919fSjohnjiang 					inject_not_string2);
474418919fSjohnjiang 		return -1;
484418919fSjohnjiang 	}
494418919fSjohnjiang 	if ((rte_power_set_freq == NULL) == not_null_expected) {
504418919fSjohnjiang 		printf("rte_power_set_freq should%s be NULL, environment has%s been "
514418919fSjohnjiang 				"initialised\n", inject_not_string1,
524418919fSjohnjiang 				inject_not_string2);
534418919fSjohnjiang 		return -1;
544418919fSjohnjiang 	}
554418919fSjohnjiang 	if ((rte_power_freq_up == NULL) == not_null_expected) {
564418919fSjohnjiang 		printf("rte_power_freq_up should%s be NULL, environment has%s been "
574418919fSjohnjiang 				"initialised\n", inject_not_string1,
584418919fSjohnjiang 				inject_not_string2);
594418919fSjohnjiang 		return -1;
604418919fSjohnjiang 	}
614418919fSjohnjiang 	if ((rte_power_freq_down == NULL) == not_null_expected) {
624418919fSjohnjiang 		printf("rte_power_freq_down should%s be NULL, environment has%s been "
634418919fSjohnjiang 				"initialised\n", inject_not_string1,
644418919fSjohnjiang 				inject_not_string2);
654418919fSjohnjiang 		return -1;
664418919fSjohnjiang 	}
674418919fSjohnjiang 	if ((rte_power_freq_max == NULL) == not_null_expected) {
684418919fSjohnjiang 		printf("rte_power_freq_max should%s be NULL, environment has%s been "
694418919fSjohnjiang 				"initialised\n", inject_not_string1,
704418919fSjohnjiang 				inject_not_string2);
714418919fSjohnjiang 		return -1;
724418919fSjohnjiang 	}
734418919fSjohnjiang 	if ((rte_power_freq_min == NULL) == not_null_expected) {
744418919fSjohnjiang 		printf("rte_power_freq_min should%s be NULL, environment has%s been "
754418919fSjohnjiang 				"initialised\n", inject_not_string1,
764418919fSjohnjiang 				inject_not_string2);
774418919fSjohnjiang 		return -1;
784418919fSjohnjiang 	}
794418919fSjohnjiang 	if ((rte_power_turbo_status == NULL) == not_null_expected) {
804418919fSjohnjiang 		printf("rte_power_turbo_status should%s be NULL, environment has%s been "
814418919fSjohnjiang 				"initialised\n", inject_not_string1,
824418919fSjohnjiang 				inject_not_string2);
834418919fSjohnjiang 		return -1;
844418919fSjohnjiang 	}
854418919fSjohnjiang 	if ((rte_power_freq_enable_turbo == NULL) == not_null_expected) {
864418919fSjohnjiang 		printf("rte_power_freq_enable_turbo should%s be NULL, environment has%s been "
874418919fSjohnjiang 				"initialised\n", inject_not_string1,
884418919fSjohnjiang 				inject_not_string2);
894418919fSjohnjiang 		return -1;
904418919fSjohnjiang 	}
914418919fSjohnjiang 	if ((rte_power_freq_disable_turbo == NULL) == not_null_expected) {
924418919fSjohnjiang 		printf("rte_power_freq_disable_turbo should%s be NULL, environment has%s been "
934418919fSjohnjiang 				"initialised\n", inject_not_string1,
944418919fSjohnjiang 				inject_not_string2);
954418919fSjohnjiang 		return -1;
964418919fSjohnjiang 	}
974418919fSjohnjiang 	if ((rte_power_get_capabilities == NULL) == not_null_expected) {
984418919fSjohnjiang 		printf("rte_power_get_capabilities should%s be NULL, environment has%s been "
994418919fSjohnjiang 				"initialised\n", inject_not_string1,
1004418919fSjohnjiang 				inject_not_string2);
1014418919fSjohnjiang 		return -1;
1024418919fSjohnjiang 	}
1034418919fSjohnjiang 
1044418919fSjohnjiang 	return 0;
1054418919fSjohnjiang }
1064418919fSjohnjiang 
1074418919fSjohnjiang static int
test_power(void)1084418919fSjohnjiang test_power(void)
1094418919fSjohnjiang {
1104418919fSjohnjiang 	int ret = -1;
1114418919fSjohnjiang 	enum power_management_env env;
1124418919fSjohnjiang 
1134418919fSjohnjiang 	/* Test setting an invalid environment */
1144418919fSjohnjiang 	ret = rte_power_set_env(PM_ENV_NOT_SET);
1154418919fSjohnjiang 	if (ret == 0) {
1164418919fSjohnjiang 		printf("Unexpectedly succeeded on setting an invalid environment\n");
1174418919fSjohnjiang 		return -1;
1184418919fSjohnjiang 	}
1194418919fSjohnjiang 
1204418919fSjohnjiang 	/* Test that the environment has not been set */
1214418919fSjohnjiang 	env = rte_power_get_env();
1224418919fSjohnjiang 	if (env != PM_ENV_NOT_SET) {
1234418919fSjohnjiang 		printf("Unexpectedly got a valid environment configuration\n");
1244418919fSjohnjiang 		return -1;
1254418919fSjohnjiang 	}
1264418919fSjohnjiang 
1274418919fSjohnjiang 	/* Verify that function pointers are NULL */
1284418919fSjohnjiang 	if (check_function_ptrs() < 0)
1294418919fSjohnjiang 		goto fail_all;
1304418919fSjohnjiang 
1314418919fSjohnjiang 	rte_power_unset_env();
1324418919fSjohnjiang 
1334418919fSjohnjiang 	/* Perform tests for valid environments.*/
1344418919fSjohnjiang 	const enum power_management_env envs[] = {PM_ENV_ACPI_CPUFREQ,
1354418919fSjohnjiang 			PM_ENV_KVM_VM,
1364418919fSjohnjiang 			PM_ENV_PSTATE_CPUFREQ};
1374418919fSjohnjiang 
138*2d9fd380Sjfb8856606 	unsigned int i;
139*2d9fd380Sjfb8856606 	for (i = 0; i < RTE_DIM(envs); ++i) {
1404418919fSjohnjiang 
1414418919fSjohnjiang 		/* Test setting a valid environment */
1424418919fSjohnjiang 		ret = rte_power_set_env(envs[i]);
1434418919fSjohnjiang 		if (ret != 0) {
1444418919fSjohnjiang 			printf("Unexpectedly unsucceeded on setting a valid environment\n");
1454418919fSjohnjiang 			return -1;
1464418919fSjohnjiang 		}
1474418919fSjohnjiang 
1484418919fSjohnjiang 		/* Test that the environment has been set */
1494418919fSjohnjiang 		env = rte_power_get_env();
1504418919fSjohnjiang 		if (env != envs[i]) {
1514418919fSjohnjiang 			printf("Not expected environment configuration\n");
1524418919fSjohnjiang 			return -1;
1534418919fSjohnjiang 		}
1544418919fSjohnjiang 
1554418919fSjohnjiang 		/* Verify that function pointers are NOT NULL */
1564418919fSjohnjiang 		if (check_function_ptrs() < 0)
1574418919fSjohnjiang 			goto fail_all;
1584418919fSjohnjiang 
1594418919fSjohnjiang 		rte_power_unset_env();
1604418919fSjohnjiang 
1614418919fSjohnjiang 		/* Verify that function pointers are NULL */
1624418919fSjohnjiang 		if (check_function_ptrs() < 0)
1634418919fSjohnjiang 			goto fail_all;
1644418919fSjohnjiang 
1654418919fSjohnjiang 	}
1664418919fSjohnjiang 
1674418919fSjohnjiang 	return 0;
1684418919fSjohnjiang fail_all:
1694418919fSjohnjiang 	rte_power_unset_env();
1704418919fSjohnjiang 	return -1;
1714418919fSjohnjiang }
1724418919fSjohnjiang #endif
1734418919fSjohnjiang 
1744418919fSjohnjiang REGISTER_TEST_COMMAND(power_autotest, test_power);
175