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