xref: /dpdk/app/test/test_power_intel_uncore.c (revision 93db1cfcc36ac1808c4a09ec50a470c6127b859e)
160b8a661STadhg Kearney /* SPDX-License-Identifier: BSD-3-Clause
260b8a661STadhg Kearney  * Copyright(c) 2010-2022 Intel Corporation
360b8a661STadhg Kearney  */
460b8a661STadhg Kearney 
560b8a661STadhg Kearney #include "test.h"
660b8a661STadhg Kearney 
760b8a661STadhg Kearney #ifndef RTE_LIB_POWER
860b8a661STadhg Kearney 
960b8a661STadhg Kearney static int
1060b8a661STadhg Kearney test_power_intel_uncore(void)
1160b8a661STadhg Kearney {
1260b8a661STadhg Kearney 	printf("Power management library not supported, skipping test\n");
1360b8a661STadhg Kearney 	return TEST_SKIPPED;
1460b8a661STadhg Kearney }
1560b8a661STadhg Kearney 
1660b8a661STadhg Kearney #else
17ac1edcb6SSivaprasad Tummala #include <rte_power_uncore.h>
1860b8a661STadhg Kearney #include <power_common.h>
1960b8a661STadhg Kearney 
2060b8a661STadhg Kearney #define VALID_PKG 0
2160b8a661STadhg Kearney #define VALID_DIE 0
2260b8a661STadhg Kearney #define INVALID_PKG (rte_power_uncore_get_num_pkgs() + 1)
2360b8a661STadhg Kearney #define INVALID_DIE (rte_power_uncore_get_num_dies(VALID_PKG) + 1)
2460b8a661STadhg Kearney #define VALID_INDEX 1
25*93db1cfcSStephen Hemminger #define INVALID_INDEX (RTE_MAX_UNCORE_FREQS + 1)
2660b8a661STadhg Kearney 
2760b8a661STadhg Kearney static int check_power_uncore_init(void)
2860b8a661STadhg Kearney {
2960b8a661STadhg Kearney 	int ret;
3060b8a661STadhg Kearney 
3160b8a661STadhg Kearney 	/* Test initialisation of uncore configuration*/
3260b8a661STadhg Kearney 	ret = rte_power_uncore_init(VALID_PKG, VALID_DIE);
3360b8a661STadhg Kearney 	if (ret < 0) {
3460b8a661STadhg Kearney 		printf("Cannot initialise uncore power management for pkg %u die %u, this "
3560b8a661STadhg Kearney 			"may occur if environment is not configured "
3660b8a661STadhg Kearney 			"correctly(APCI cpufreq) or operating in another valid "
3760b8a661STadhg Kearney 			"Power management environment\n", VALID_PKG, VALID_DIE);
3860b8a661STadhg Kearney 		return -1;
3960b8a661STadhg Kearney 	}
4060b8a661STadhg Kearney 
4160b8a661STadhg Kearney 	/* Unsuccessful Test */
4260b8a661STadhg Kearney 	ret = rte_power_uncore_init(INVALID_PKG, INVALID_DIE);
4360b8a661STadhg Kearney 	if (ret == 0) {
4460b8a661STadhg Kearney 		printf("Unexpectedly was able to initialise uncore power management "
4560b8a661STadhg Kearney 			"for pkg %u die %u\n", INVALID_PKG, INVALID_DIE);
4660b8a661STadhg Kearney 		return -1;
4760b8a661STadhg Kearney 	}
4860b8a661STadhg Kearney 
4960b8a661STadhg Kearney 	return 0;
5060b8a661STadhg Kearney }
5160b8a661STadhg Kearney 
5260b8a661STadhg Kearney static int
5360b8a661STadhg Kearney check_power_get_uncore_freq(void)
5460b8a661STadhg Kearney {
5560b8a661STadhg Kearney 	int ret;
5660b8a661STadhg Kearney 
5760b8a661STadhg Kearney 	/* Successfully get uncore freq */
5860b8a661STadhg Kearney 	ret = rte_power_get_uncore_freq(VALID_PKG, VALID_DIE);
5960b8a661STadhg Kearney 	if (ret < 0) {
6060b8a661STadhg Kearney 		printf("Failed to get uncore frequency for pkg %u die %u\n",
6160b8a661STadhg Kearney 							VALID_PKG, VALID_DIE);
6260b8a661STadhg Kearney 		return -1;
6360b8a661STadhg Kearney 	}
6460b8a661STadhg Kearney 
6560b8a661STadhg Kearney 	/* Unsuccessful Test */
6660b8a661STadhg Kearney 	ret = rte_power_get_uncore_freq(INVALID_PKG, INVALID_DIE);
6760b8a661STadhg Kearney 	if (ret >= 0) {
6860b8a661STadhg Kearney 		printf("Unexpectedly got invalid uncore frequency for pkg %u die %u\n",
6960b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE);
7060b8a661STadhg Kearney 		return -1;
7160b8a661STadhg Kearney 	}
7260b8a661STadhg Kearney 
7360b8a661STadhg Kearney 	return 0;
7460b8a661STadhg Kearney }
7560b8a661STadhg Kearney 
7660b8a661STadhg Kearney static int
7760b8a661STadhg Kearney check_power_set_uncore_freq(void)
7860b8a661STadhg Kearney {
7960b8a661STadhg Kearney 	int ret;
8060b8a661STadhg Kearney 
8160b8a661STadhg Kearney 	/* Successfully set uncore freq */
8260b8a661STadhg Kearney 	ret = rte_power_set_uncore_freq(VALID_PKG, VALID_DIE, VALID_INDEX);
8360b8a661STadhg Kearney 	if (ret < 0) {
8460b8a661STadhg Kearney 		printf("Failed to set uncore frequency for pkg %u die %u index %u\n",
8560b8a661STadhg Kearney 							VALID_PKG, VALID_DIE, VALID_INDEX);
8660b8a661STadhg Kearney 		return -1;
8760b8a661STadhg Kearney 	}
8860b8a661STadhg Kearney 
8960b8a661STadhg Kearney 	/* Try to unsuccessfully set invalid uncore freq index */
9060b8a661STadhg Kearney 	ret = rte_power_set_uncore_freq(VALID_PKG, VALID_DIE, INVALID_INDEX);
9160b8a661STadhg Kearney 	if (ret == 0) {
9260b8a661STadhg Kearney 		printf("Unexpectedly set invalid uncore index for pkg %u die %u index %u\n",
9360b8a661STadhg Kearney 							VALID_PKG, VALID_DIE, INVALID_INDEX);
9460b8a661STadhg Kearney 		return -1;
9560b8a661STadhg Kearney 	}
9660b8a661STadhg Kearney 
9760b8a661STadhg Kearney 	/* Unsuccessful Test */
9860b8a661STadhg Kearney 	ret = rte_power_set_uncore_freq(INVALID_PKG, INVALID_DIE, VALID_INDEX);
9960b8a661STadhg Kearney 	if (ret == 0) {
10060b8a661STadhg Kearney 		printf("Unexpectedly set invalid uncore frequency for pkg %u die %u index %u\n",
10160b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE, VALID_INDEX);
10260b8a661STadhg Kearney 		return -1;
10360b8a661STadhg Kearney 	}
10460b8a661STadhg Kearney 
10560b8a661STadhg Kearney 	return 0;
10660b8a661STadhg Kearney }
10760b8a661STadhg Kearney 
10860b8a661STadhg Kearney static int
10960b8a661STadhg Kearney check_power_uncore_freq_max(void)
11060b8a661STadhg Kearney {
11160b8a661STadhg Kearney 	int ret;
11260b8a661STadhg Kearney 
11360b8a661STadhg Kearney 	/* Successfully get max uncore freq */
11460b8a661STadhg Kearney 	ret = rte_power_uncore_freq_max(VALID_PKG, VALID_DIE);
11560b8a661STadhg Kearney 	if (ret < 0) {
11660b8a661STadhg Kearney 		printf("Failed to set max uncore frequency for pkg %u die %u\n",
11760b8a661STadhg Kearney 							VALID_PKG, VALID_DIE);
11860b8a661STadhg Kearney 		return -1;
11960b8a661STadhg Kearney 	}
12060b8a661STadhg Kearney 
12160b8a661STadhg Kearney 	/* Unsuccessful Test */
12260b8a661STadhg Kearney 	ret = rte_power_uncore_freq_max(INVALID_PKG, INVALID_DIE);
12360b8a661STadhg Kearney 	if (ret == 0) {
12460b8a661STadhg Kearney 		printf("Unexpectedly set invalid max uncore frequency for pkg %u die %u\n",
12560b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE);
12660b8a661STadhg Kearney 		return -1;
12760b8a661STadhg Kearney 	}
12860b8a661STadhg Kearney 
12960b8a661STadhg Kearney 	return 0;
13060b8a661STadhg Kearney }
13160b8a661STadhg Kearney 
13260b8a661STadhg Kearney static int
13360b8a661STadhg Kearney check_power_uncore_freq_min(void)
13460b8a661STadhg Kearney {
13560b8a661STadhg Kearney 	int ret;
13660b8a661STadhg Kearney 
13760b8a661STadhg Kearney 	/* Successfully get min uncore freq */
13860b8a661STadhg Kearney 	ret = rte_power_uncore_freq_min(VALID_PKG, VALID_DIE);
13960b8a661STadhg Kearney 	if (ret < 0) {
14060b8a661STadhg Kearney 		printf("Failed to set min uncore frequency for pkg %u die %u\n",
14160b8a661STadhg Kearney 							VALID_PKG, VALID_DIE);
14260b8a661STadhg Kearney 		return -1;
14360b8a661STadhg Kearney 	}
14460b8a661STadhg Kearney 
14560b8a661STadhg Kearney 	/* Unsuccessful Test */
14660b8a661STadhg Kearney 	ret = rte_power_uncore_freq_min(INVALID_PKG, INVALID_DIE);
14760b8a661STadhg Kearney 	if (ret == 0) {
14860b8a661STadhg Kearney 		printf("Unexpectedly set invalid min uncore frequency for pkg %u die %u\n",
14960b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE);
15060b8a661STadhg Kearney 		return -1;
15160b8a661STadhg Kearney 	}
15260b8a661STadhg Kearney 
15360b8a661STadhg Kearney 	return 0;
15460b8a661STadhg Kearney }
15560b8a661STadhg Kearney 
15660b8a661STadhg Kearney static int
15760b8a661STadhg Kearney check_power_uncore_get_num_freqs(void)
15860b8a661STadhg Kearney {
15960b8a661STadhg Kearney 	int ret;
16060b8a661STadhg Kearney 
16160b8a661STadhg Kearney 	/* Successfully get number of uncore freq */
16260b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_freqs(VALID_PKG, VALID_DIE);
16360b8a661STadhg Kearney 	if (ret < 0) {
16460b8a661STadhg Kearney 		printf("Failed to get number of uncore frequencies for pkg %u die %u\n",
16560b8a661STadhg Kearney 							VALID_PKG, VALID_DIE);
16660b8a661STadhg Kearney 		return -1;
16760b8a661STadhg Kearney 	}
16860b8a661STadhg Kearney 
16960b8a661STadhg Kearney 	/* Unsuccessful Test */
17060b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_freqs(INVALID_PKG, INVALID_DIE);
17160b8a661STadhg Kearney 	if (ret >= 0) {
17260b8a661STadhg Kearney 		printf("Unexpectedly got number of invalid frequencies for pkg %u die %u\n",
17360b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE);
17460b8a661STadhg Kearney 		return -1;
17560b8a661STadhg Kearney 	}
17660b8a661STadhg Kearney 
17760b8a661STadhg Kearney 	return 0;
17860b8a661STadhg Kearney }
17960b8a661STadhg Kearney 
18060b8a661STadhg Kearney static int
18160b8a661STadhg Kearney check_power_uncore_get_num_pkgs(void)
18260b8a661STadhg Kearney {
18360b8a661STadhg Kearney 	int ret;
18460b8a661STadhg Kearney 
18560b8a661STadhg Kearney 	/* Successfully get number of uncore pkgs */
18660b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_pkgs();
18760b8a661STadhg Kearney 	if (ret == 0) {
18860b8a661STadhg Kearney 		printf("Failed to get number of uncore pkgs\n");
18960b8a661STadhg Kearney 		return -1;
19060b8a661STadhg Kearney 	}
19160b8a661STadhg Kearney 
19260b8a661STadhg Kearney 	return 0;
19360b8a661STadhg Kearney }
19460b8a661STadhg Kearney 
19560b8a661STadhg Kearney static int
19660b8a661STadhg Kearney check_power_uncore_get_num_dies(void)
19760b8a661STadhg Kearney {
19860b8a661STadhg Kearney 	int ret;
19960b8a661STadhg Kearney 
20060b8a661STadhg Kearney 	/* Successfully get number of uncore dies */
20160b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_dies(VALID_PKG);
20260b8a661STadhg Kearney 	if (ret == 0) {
20360b8a661STadhg Kearney 		printf("Failed to get number of uncore dies for pkg %u\n",
20460b8a661STadhg Kearney 							VALID_PKG);
20560b8a661STadhg Kearney 		return -1;
20660b8a661STadhg Kearney 	}
20760b8a661STadhg Kearney 
20860b8a661STadhg Kearney 	/* Unsuccessful test */
20960b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_dies(INVALID_PKG);
21060b8a661STadhg Kearney 	if (ret > 0) {
21160b8a661STadhg Kearney 		printf("Unexpectedly got number of invalid dies for pkg %u\n",
21260b8a661STadhg Kearney 							INVALID_PKG);
21360b8a661STadhg Kearney 		return -1;
21460b8a661STadhg Kearney 	}
21560b8a661STadhg Kearney 
21660b8a661STadhg Kearney 	return 0;
21760b8a661STadhg Kearney }
21860b8a661STadhg Kearney 
21960b8a661STadhg Kearney static int
22060b8a661STadhg Kearney check_power_uncore_exit(void)
22160b8a661STadhg Kearney {
22260b8a661STadhg Kearney 	int ret;
22360b8a661STadhg Kearney 
22460b8a661STadhg Kearney 	/* Successfully exit uncore power management */
22560b8a661STadhg Kearney 	ret = rte_power_uncore_exit(VALID_PKG, VALID_DIE);
22660b8a661STadhg Kearney 	if (ret < 0) {
22760b8a661STadhg Kearney 		printf("Failed to exit uncore power management for pkg %u die %u\n",
22860b8a661STadhg Kearney 							VALID_PKG, VALID_DIE);
22960b8a661STadhg Kearney 	}
23060b8a661STadhg Kearney 
23160b8a661STadhg Kearney 	/* Unsuccessful Test */
23260b8a661STadhg Kearney 	ret = rte_power_uncore_exit(INVALID_PKG, INVALID_DIE);
23360b8a661STadhg Kearney 	if (ret == 0) {
23460b8a661STadhg Kearney 		printf("Unexpectedly was able to exit uncore power management for pkg %u die %u\n",
23560b8a661STadhg Kearney 							INVALID_PKG, INVALID_DIE);
23660b8a661STadhg Kearney 		return -1;
23760b8a661STadhg Kearney 	}
23860b8a661STadhg Kearney 
23960b8a661STadhg Kearney 	return 0;
24060b8a661STadhg Kearney }
24160b8a661STadhg Kearney 
24260b8a661STadhg Kearney static int
24360b8a661STadhg Kearney test_power_intel_uncore(void)
24460b8a661STadhg Kearney {
24560b8a661STadhg Kearney 	int ret;
24660b8a661STadhg Kearney 
247ac1edcb6SSivaprasad Tummala 	ret = rte_power_set_uncore_env(RTE_UNCORE_PM_ENV_INTEL_UNCORE);
248ac1edcb6SSivaprasad Tummala 	if (ret < 0)
249ac1edcb6SSivaprasad Tummala 		goto fail_all;
250ac1edcb6SSivaprasad Tummala 
25160b8a661STadhg Kearney 	ret = rte_power_uncore_get_num_pkgs();
25260b8a661STadhg Kearney 	if (ret == 0) {
25360b8a661STadhg Kearney 		printf("Uncore frequency management not supported/enabled on this kernel. "
254ac1edcb6SSivaprasad Tummala 		"Please enable CONFIG_INTEL_UNCORE_FREQ_CONTROL if on Intel x86 with linux kernel"
25560b8a661STadhg Kearney 		" >= 5.6\n");
25660b8a661STadhg Kearney 		return TEST_SKIPPED;
25760b8a661STadhg Kearney 	}
25860b8a661STadhg Kearney 
25960b8a661STadhg Kearney 	ret = check_power_uncore_init();
26060b8a661STadhg Kearney 	if (ret < 0)
26160b8a661STadhg Kearney 		goto fail_all;
26260b8a661STadhg Kearney 
26360b8a661STadhg Kearney 	ret = check_power_get_uncore_freq();
26460b8a661STadhg Kearney 	if (ret < 0)
26560b8a661STadhg Kearney 		goto fail_all;
26660b8a661STadhg Kearney 
26760b8a661STadhg Kearney 	ret = check_power_set_uncore_freq();
26860b8a661STadhg Kearney 	if (ret < 0)
26960b8a661STadhg Kearney 		goto fail_all;
27060b8a661STadhg Kearney 
27160b8a661STadhg Kearney 	ret = check_power_uncore_freq_max();
27260b8a661STadhg Kearney 	if (ret < 0)
27360b8a661STadhg Kearney 		goto fail_all;
27460b8a661STadhg Kearney 
27560b8a661STadhg Kearney 	ret = check_power_uncore_freq_min();
27660b8a661STadhg Kearney 	if (ret < 0)
27760b8a661STadhg Kearney 		goto fail_all;
27860b8a661STadhg Kearney 
27960b8a661STadhg Kearney 	ret = check_power_uncore_get_num_freqs();
28060b8a661STadhg Kearney 	if (ret < 0)
28160b8a661STadhg Kearney 		goto fail_all;
28260b8a661STadhg Kearney 
28360b8a661STadhg Kearney 	ret = check_power_uncore_get_num_pkgs();
28460b8a661STadhg Kearney 	if (ret < 0)
28560b8a661STadhg Kearney 		goto fail_all;
28660b8a661STadhg Kearney 
28760b8a661STadhg Kearney 	ret = check_power_uncore_get_num_dies();
28860b8a661STadhg Kearney 	if (ret < 0)
28960b8a661STadhg Kearney 		goto fail_all;
29060b8a661STadhg Kearney 
29160b8a661STadhg Kearney 	ret = check_power_uncore_exit();
29260b8a661STadhg Kearney 	if (ret < 0)
29360b8a661STadhg Kearney 		return -1;
29460b8a661STadhg Kearney 
29560b8a661STadhg Kearney 	return 0;
29660b8a661STadhg Kearney 
29760b8a661STadhg Kearney fail_all:
29860b8a661STadhg Kearney 	rte_power_uncore_exit(VALID_PKG, VALID_DIE);
29960b8a661STadhg Kearney 	return -1;
30060b8a661STadhg Kearney }
30160b8a661STadhg Kearney #endif
30260b8a661STadhg Kearney 
303e0a8442cSBruce Richardson REGISTER_FAST_TEST(power_intel_uncore_autotest, true, true, test_power_intel_uncore);
304