From patchwork Mon Sep 19 08:56:49 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tadhg Kearney X-Patchwork-Id: 116420 Return-Path: X-Original-To: patchwork@inbox.dpdk.org Delivered-To: patchwork@inbox.dpdk.org Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id 62943A00C5; Mon, 19 Sep 2022 10:57:00 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 58A0541148; Mon, 19 Sep 2022 10:57:00 +0200 (CEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by mails.dpdk.org (Postfix) with ESMTP id 6F72F40141 for ; Mon, 19 Sep 2022 10:56:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1663577818; x=1695113818; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=9Rb1iCVfAFtP6IRVDwiA/eOKKrpy4TU5rbj9SIGqk28=; b=e7sdD71RtkE/9f94eOn6EKAJ/qcVFNDmsCPCnWj5zlL0DxQC+fPhV3zL AUGq1RtlPa1PjJoWsdH89huz883QRceW9iDTPWvWo+uCDxTsAGnz2AeKs k6tPaLrj2G8oNOoN9P/nfDVMvZOBRToSqdyMjsOQFpUI/757i+ifTsaim r92ueoPORt+nUwHuN0dfVv43h5376Q8yg3zFFJTGL1aS0F6mHQOVGlryw UPR6p3uJcdrNm0C+T58vzH7VPGt+ZMpdcPK4HZMLOjZOqAofQxNzNSusb IfeB3GNCFeFff3IEhL9FocZmPamTMcc+E+9uepTcC1+GmbR2Hmv7DbNwo A==; X-IronPort-AV: E=McAfee;i="6500,9779,10474"; a="363303672" X-IronPort-AV: E=Sophos;i="5.93,327,1654585200"; d="scan'208";a="363303672" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2022 01:56:58 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.93,327,1654585200"; d="scan'208";a="680762664" Received: from silpixa00401183.ir.intel.com ([10.55.129.143]) by fmsmga008.fm.intel.com with ESMTP; 19 Sep 2022 01:56:56 -0700 From: Tadhg Kearney To: dts@dpdk.org Cc: reshma.pattan@intel.com, david.hunt@intel.com, anatoly.burakov@intel.com, Tadhg Kearney Subject: [PATCH v3 3/3] test/power: add unit tests for uncore API Date: Mon, 19 Sep 2022 08:56:49 +0000 Message-Id: <20220919085649.827636-4-tadhg.kearney@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220919085649.827636-1-tadhg.kearney@intel.com> References: <20220713140706.4143705-1-tadhg.kearney@intel.com> <20220919085649.827636-1-tadhg.kearney@intel.com> MIME-Version: 1.0 X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org Add basic unit tests covering all nine uncore API's. Signed-off-by: Tadhg Kearney --- app/test/meson.build | 2 + app/test/test_power_uncore.c | 293 +++++++++++++++++++++++++++++++++++ 2 files changed, 295 insertions(+) create mode 100644 app/test/test_power_uncore.c diff --git a/app/test/meson.build b/app/test/meson.build index bf1d81f84a..170401ccdc 100644 --- a/app/test/meson.build +++ b/app/test/meson.build @@ -100,6 +100,7 @@ test_sources = files( 'test_power.c', 'test_power_cpufreq.c', 'test_power_kvm_vm.c', + 'test_power_uncore.c', 'test_prefetch.c', 'test_rand_perf.c', 'test_rawdev.c', @@ -240,6 +241,7 @@ fast_tests = [ ['power_cpufreq_autotest', false, true], ['power_autotest', true, true], ['power_kvm_vm_autotest', false, true], + ['power_uncore_autotest', true, true], ['reorder_autotest', true, true], ['service_autotest', true, true], ['thash_autotest', true, true], diff --git a/app/test/test_power_uncore.c b/app/test/test_power_uncore.c new file mode 100644 index 0000000000..77e7dbc7ca --- /dev/null +++ b/app/test/test_power_uncore.c @@ -0,0 +1,293 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright(c) 2010-2022 Intel Corporation + */ + +#include "test.h" + +#ifndef RTE_LIB_POWER + +static int +test_power_uncore(void) +{ + printf("Power management library not supported, skipping test\n"); + return TEST_SKIPPED; +} + +#else +#include +#include + +#define MAX_UNCORE_FREQS 32 + +#define VALID_PKG 0 +#define VALID_DIE 0 +#define INVALID_PKG (rte_power_uncore_get_num_pkgs() + 1) +#define INVALID_DIE (rte_power_uncore_get_num_dies(VALID_PKG) + 1) +#define VALID_INDEX 1 +#define INVALID_INDEX (MAX_UNCORE_FREQS + 1) + +static int check_power_uncore_init(void) +{ + int ret; + + /* Test initialisation of uncore configuration*/ + ret = rte_power_uncore_init(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Cannot initialise uncore power management for pkg %u die %u, this " + "may occur if environment is not configured " + "correctly(APCI cpufreq) or operating in another valid " + "Power management environment\n", VALID_PKG, VALID_DIE); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_uncore_init(INVALID_PKG, INVALID_DIE); + if (ret == 0) { + printf("Unexpectedly was able to initialise uncore power management " + "for pkg %u die %u\n", INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +check_power_get_uncore_freq(void) +{ + int ret; + + /* Successfully get uncore freq */ + ret = rte_power_get_uncore_freq(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Failed to get uncore frequency for pkg %u die %u\n", + VALID_PKG, VALID_DIE); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_get_uncore_freq(INVALID_PKG, INVALID_DIE); + if (ret >= 0) { + printf("Unexpectedly got invalid uncore frequency for pkg %u die %u\n", + INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +check_power_set_uncore_freq(void) +{ + int ret; + + /* Successfully set uncore freq */ + ret = rte_power_set_uncore_freq(VALID_PKG, VALID_DIE, VALID_INDEX); + if (ret < 0) { + printf("Failed to set uncore frequency for pkg %u die %u index %u\n", + VALID_PKG, VALID_DIE, VALID_INDEX); + return -1; + } + + /* Try to unsuccesfully set invlaid uncore freq index */ + ret = rte_power_set_uncore_freq(VALID_PKG, VALID_DIE, INVALID_INDEX); + if (ret == 0) { + printf("Unexpectedly set invalid uncore index for pkg %u die %u index %u\n", + VALID_PKG, VALID_DIE, INVALID_INDEX); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_set_uncore_freq(INVALID_PKG, INVALID_DIE, VALID_INDEX); + if (ret == 0) { + printf("Unexpectedly set invalid uncore frequency for pkg %u die %u index %u\n", + INVALID_PKG, INVALID_DIE, VALID_INDEX); + return -1; + } + + return 0; +} + +static int +check_power_uncore_freq_max(void) +{ + int ret; + + /* Successfully get max uncore freq */ + ret = rte_power_uncore_freq_max(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Failed to set max uncore frequency for pkg %u die %u\n", + VALID_PKG, VALID_DIE); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_uncore_freq_max(INVALID_PKG, INVALID_DIE); + if (ret == 0) { + printf("Unexpectedly set invalid max uncore frequency for pkg %u die %u\n", + INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +check_power_uncore_freq_min(void) +{ + int ret; + + /* Successfully get min uncore freq */ + ret = rte_power_uncore_freq_min(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Failed to set min uncore frequency for pkg %u die %u\n", + VALID_PKG, VALID_DIE); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_uncore_freq_min(INVALID_PKG, INVALID_DIE); + if (ret == 0) { + printf("Unexpectedly set invalid min uncore frequency for pkg %u die %u\n", + INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +check_power_uncore_get_num_freqs(void) +{ + int ret; + + /* Successfully get number of uncore freq */ + ret = rte_power_uncore_get_num_freqs(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Failed to get number of uncore frequencies for pkg %u die %u\n", + VALID_PKG, VALID_DIE); + return -1; + } + + /* Unsuccessful Test */ + ret = rte_power_uncore_get_num_freqs(INVALID_PKG, INVALID_DIE); + if (ret >= 0) { + printf("Unexpectedly got number of invalid frequencies for pkg %u die %u\n", + INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +check_power_uncore_get_num_pkgs(void) +{ + int ret; + + /* Successfully get number of uncore pkgs */ + ret = rte_power_uncore_get_num_pkgs(); + if (ret == 0) { + printf("Failed to get number of uncore pkgs\n"); + return -1; + } + + return 0; +} + +static int +check_power_uncore_get_num_dies(void) +{ + int ret; + + /* Successfully get number of uncore dies */ + ret = rte_power_uncore_get_num_dies(VALID_PKG); + if (ret == 0) { + printf("Failed to get number of uncore dies for pkg %u\n", + VALID_PKG); + return -1; + } + + /* Unsuccessful test */ + ret = rte_power_uncore_get_num_dies(INVALID_PKG); + if (ret > 0) { + printf("Unexpectedly got number of invalid dies for pkg %u\n", + INVALID_PKG); + return -1; + } + + return 0; +} + +static int +check_power_uncore_exit(void) +{ + int ret; + + /* Successfully exit uncore power management */ + ret = rte_power_uncore_exit(VALID_PKG, VALID_DIE); + if (ret < 0) { + printf("Failed to exit uncore power management for pkg %u die %u\n", + VALID_PKG, VALID_DIE); + } + + /* Unsuccessful Test */ + ret = rte_power_uncore_exit(INVALID_PKG, INVALID_DIE); + if (ret == 0) { + printf("Unexpectedly was able to exit uncore power management for pkg %u die %u\n", + INVALID_PKG, INVALID_DIE); + return -1; + } + + return 0; +} + +static int +test_power_uncore(void) +{ + int ret; + + ret = check_power_uncore_init(); + if (ret < 0) + goto fail_all; + + ret = check_power_get_uncore_freq(); + if (ret < 0) + goto fail_all; + + ret = check_power_set_uncore_freq(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_freq_max(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_freq_min(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_get_num_freqs(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_get_num_pkgs(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_get_num_dies(); + if (ret < 0) + goto fail_all; + + ret = check_power_uncore_exit(); + if (ret < 0) + return -1; + + return 0; + +fail_all: + rte_power_uncore_exit(VALID_PKG, VALID_DIE); + return -1; +} +#endif + +REGISTER_TEST_COMMAND(power_uncore_autotest, test_power_uncore);