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