From: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
To: <david.hunt@intel.com>, <anatoly.burakov@intel.com>,
<ferruh.yigit@amd.com>
Cc: <dev@dpdk.org>
Subject: [PATCH v2 2/2] power: refactor uncore power management implementation
Date: Wed, 16 Aug 2023 03:09:58 -0700 [thread overview]
Message-ID: <20230816100958.1022206-2-sivaprasad.tummala@amd.com> (raw)
In-Reply-To: <20230816100958.1022206-1-sivaprasad.tummala@amd.com>
currently the uncore power management implementation is vendor specific.
Added new vendor agnostic uncore power management implementation similar
to rte_power and rename specific implementations ("rte_power_intel_uncore")
to "power_intel_uncore" along with functions.
Signed-off-by: Sivaprasad Tummala <sivaprasad.tummala@amd.com>
---
app/test/test_power_intel_uncore.c | 10 +-
config/rte_config.h | 1 +
examples/l3fwd-power/main.c | 2 +-
lib/power/meson.build | 5 +-
...er_intel_uncore.c => power_intel_uncore.c} | 51 +++--
...er_intel_uncore.h => power_intel_uncore.h} | 66 +++---
lib/power/rte_power_uncore.c | 189 ++++++++++++++++++
lib/power/rte_power_uncore.h | 32 +++
lib/power/version.map | 6 +
9 files changed, 313 insertions(+), 49 deletions(-)
rename lib/power/{rte_power_intel_uncore.c => power_intel_uncore.c} (90%)
rename lib/power/{rte_power_intel_uncore.h => power_intel_uncore.h} (77%)
create mode 100644 lib/power/rte_power_uncore.c
diff --git a/app/test/test_power_intel_uncore.c b/app/test/test_power_intel_uncore.c
index 31163af84e..27f4684f76 100644
--- a/app/test/test_power_intel_uncore.c
+++ b/app/test/test_power_intel_uncore.c
@@ -14,7 +14,7 @@ test_power_intel_uncore(void)
}
#else
-#include <rte_power_intel_uncore.h>
+#include <rte_power_uncore.h>
#include <power_common.h>
#define MAX_UNCORE_FREQS 32
@@ -246,11 +246,15 @@ test_power_intel_uncore(void)
{
int ret;
+ ret = rte_power_set_uncore_env(UNCORE_PM_ENV_INTEL_UNCORE);
+ if (ret < 0)
+ goto fail_all;
+
ret = rte_power_uncore_get_num_pkgs();
if (ret == 0) {
printf("Uncore frequency management not supported/enabled on this kernel. "
- "Please enable CONFIG_INTEL_UNCORE_FREQ_CONTROL if on x86 with linux kernel"
- " >= 5.6\n");
+ "Please enable CONFIG_INTEL_UNCORE_FREQ_CONTROL if on intel x86 with "
+ "linux kernel >= 5.6\n");
return TEST_SKIPPED;
}
diff --git a/config/rte_config.h b/config/rte_config.h
index 400e44e3cf..ccca68b4f3 100644
--- a/config/rte_config.h
+++ b/config/rte_config.h
@@ -87,6 +87,7 @@
/* rte_power defines */
#define RTE_MAX_LCORE_FREQS 64
+#define RTE_MAX_UNCORE_FREQS 64
/* rte_graph defines */
#define RTE_GRAPH_BURST_SIZE 256
diff --git a/examples/l3fwd-power/main.c b/examples/l3fwd-power/main.c
index 3f01cbd9e2..a34a7958f0 100644
--- a/examples/l3fwd-power/main.c
+++ b/examples/l3fwd-power/main.c
@@ -46,7 +46,7 @@
#include <rte_metrics.h>
#include <rte_telemetry.h>
#include <rte_power_pmd_mgmt.h>
-#include <rte_power_intel_uncore.h>
+#include <rte_power_uncore.h>
#include "perf_core.h"
#include "main.h"
diff --git a/lib/power/meson.build b/lib/power/meson.build
index 1ce8b7c07d..9693c3ba7d 100644
--- a/lib/power/meson.build
+++ b/lib/power/meson.build
@@ -18,13 +18,14 @@ sources = files(
'power_cppc_cpufreq.c',
'power_kvm_vm.c',
'power_pstate_cpufreq.c',
+ 'power_intel_uncore.c',
'rte_power.c',
- 'rte_power_intel_uncore.c',
+ 'rte_power_uncore.c',
'rte_power_pmd_mgmt.c',
)
headers = files(
'rte_power.h',
- 'rte_power_intel_uncore.h',
+ 'rte_power_uncore.h',
'rte_power_pmd_mgmt.h',
'rte_power_guest_channel.h',
)
diff --git a/lib/power/rte_power_intel_uncore.c b/lib/power/power_intel_uncore.c
similarity index 90%
rename from lib/power/rte_power_intel_uncore.c
rename to lib/power/power_intel_uncore.c
index 3b8724385f..258cf78dff 100644
--- a/lib/power/rte_power_intel_uncore.c
+++ b/lib/power/power_intel_uncore.c
@@ -8,7 +8,7 @@
#include <rte_memcpy.h>
-#include "rte_power_intel_uncore.h"
+#include "power_intel_uncore.h"
#include "power_common.h"
#define MAX_UNCORE_FREQS 32
@@ -246,7 +246,7 @@ static int
check_pkg_die_values(unsigned int pkg, unsigned int die)
{
unsigned int max_pkgs, max_dies;
- max_pkgs = rte_power_uncore_get_num_pkgs();
+ max_pkgs = power_intel_uncore_get_num_pkgs();
if (max_pkgs == 0)
return -1;
if (pkg >= max_pkgs) {
@@ -255,7 +255,7 @@ check_pkg_die_values(unsigned int pkg, unsigned int die)
return -1;
}
- max_dies = rte_power_uncore_get_num_dies(pkg);
+ max_dies = power_intel_uncore_get_num_dies(pkg);
if (max_dies == 0)
return -1;
if (die >= max_dies) {
@@ -268,7 +268,7 @@ check_pkg_die_values(unsigned int pkg, unsigned int die)
}
int
-rte_power_uncore_init(unsigned int pkg, unsigned int die)
+power_intel_uncore_init(unsigned int pkg, unsigned int die)
{
struct uncore_power_info *ui;
@@ -298,7 +298,7 @@ rte_power_uncore_init(unsigned int pkg, unsigned int die)
}
int
-rte_power_uncore_exit(unsigned int pkg, unsigned int die)
+power_intel_uncore_exit(unsigned int pkg, unsigned int die)
{
struct uncore_power_info *ui;
@@ -333,7 +333,7 @@ rte_power_uncore_exit(unsigned int pkg, unsigned int die)
}
uint32_t
-rte_power_get_uncore_freq(unsigned int pkg, unsigned int die)
+power_get_intel_uncore_freq(unsigned int pkg, unsigned int die)
{
int ret = check_pkg_die_values(pkg, die);
if (ret < 0)
@@ -343,7 +343,7 @@ rte_power_get_uncore_freq(unsigned int pkg, unsigned int die)
}
int
-rte_power_set_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index)
+power_set_intel_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index)
{
int ret = check_pkg_die_values(pkg, die);
if (ret < 0)
@@ -353,7 +353,7 @@ rte_power_set_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index)
}
int
-rte_power_uncore_freq_max(unsigned int pkg, unsigned int die)
+power_intel_uncore_freq_max(unsigned int pkg, unsigned int die)
{
int ret = check_pkg_die_values(pkg, die);
if (ret < 0)
@@ -364,7 +364,7 @@ rte_power_uncore_freq_max(unsigned int pkg, unsigned int die)
int
-rte_power_uncore_freq_min(unsigned int pkg, unsigned int die)
+power_intel_uncore_freq_min(unsigned int pkg, unsigned int die)
{
int ret = check_pkg_die_values(pkg, die);
if (ret < 0)
@@ -376,7 +376,32 @@ rte_power_uncore_freq_min(unsigned int pkg, unsigned int die)
}
int
-rte_power_uncore_get_num_freqs(unsigned int pkg, unsigned int die)
+power_intel_uncore_freqs(unsigned int pkg, unsigned int die,
+ uint32_t *freqs, uint32_t num)
+{
+ struct uncore_power_info *ui;
+
+ int ret = check_pkg_die_values(pkg, die);
+ if (ret < 0)
+ return -1;
+
+ if (freqs == NULL) {
+ RTE_LOG(ERR, POWER, "NULL buffer supplied\n");
+ return 0;
+ }
+
+ ui = &uncore_info[pkg][die];
+ if (num < ui->nb_freqs) {
+ RTE_LOG(ERR, POWER, "Buffer size is not enough\n");
+ return 0;
+ }
+ rte_memcpy(freqs, ui->freqs, ui->nb_freqs * sizeof(uint32_t));
+
+ return ui->nb_freqs;
+}
+
+int
+power_intel_uncore_get_num_freqs(unsigned int pkg, unsigned int die)
{
int ret = check_pkg_die_values(pkg, die);
if (ret < 0)
@@ -386,7 +411,7 @@ rte_power_uncore_get_num_freqs(unsigned int pkg, unsigned int die)
}
unsigned int
-rte_power_uncore_get_num_pkgs(void)
+power_intel_uncore_get_num_pkgs(void)
{
DIR *d;
struct dirent *dir;
@@ -416,14 +441,14 @@ rte_power_uncore_get_num_pkgs(void)
}
unsigned int
-rte_power_uncore_get_num_dies(unsigned int pkg)
+power_intel_uncore_get_num_dies(unsigned int pkg)
{
DIR *d;
struct dirent *dir;
unsigned int count = 0, max_pkgs;
char filter[FILTER_LENGTH];
- max_pkgs = rte_power_uncore_get_num_pkgs();
+ max_pkgs = power_intel_uncore_get_num_pkgs();
if (max_pkgs == 0)
return 0;
if (pkg >= max_pkgs) {
diff --git a/lib/power/rte_power_intel_uncore.h b/lib/power/power_intel_uncore.h
similarity index 77%
rename from lib/power/rte_power_intel_uncore.h
rename to lib/power/power_intel_uncore.h
index 0bd9f193a1..32d6b1f7a4 100644
--- a/lib/power/rte_power_intel_uncore.h
+++ b/lib/power/power_intel_uncore.h
@@ -2,8 +2,8 @@
* Copyright(c) 2022 Intel Corporation
*/
-#ifndef RTE_POWER_INTEL_UNCORE_H
-#define RTE_POWER_INTEL_UNCORE_H
+#ifndef POWER_INTEL_UNCORE_H
+#define POWER_INTEL_UNCORE_H
/**
* @file
@@ -12,6 +12,7 @@
#include <rte_compat.h>
#include "rte_power.h"
+#include "rte_power_uncore.h"
#ifdef __cplusplus
extern "C" {
@@ -34,9 +35,7 @@ extern "C" {
* - 0 on success.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_uncore_init(unsigned int pkg, unsigned int die);
+int power_intel_uncore_init(unsigned int pkg, unsigned int die);
/**
* Exit uncore frequency management on a specific die on a package.
@@ -56,9 +55,7 @@ rte_power_uncore_init(unsigned int pkg, unsigned int die);
* - 0 on success.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_uncore_exit(unsigned int pkg, unsigned int die);
+int power_intel_uncore_exit(unsigned int pkg, unsigned int die);
/**
* Return the current index of available frequencies of a specific die on a package.
@@ -77,9 +74,7 @@ rte_power_uncore_exit(unsigned int pkg, unsigned int die);
* The current index of available frequencies.
* If error, it will return 'RTE_POWER_INVALID_FREQ_INDEX = (~0)'.
*/
-__rte_experimental
-uint32_t
-rte_power_get_uncore_freq(unsigned int pkg, unsigned int die);
+uint32_t power_get_intel_uncore_freq(unsigned int pkg, unsigned int die);
/**
* Set minimum and maximum uncore frequency for specified die on a package
@@ -102,9 +97,7 @@ rte_power_get_uncore_freq(unsigned int pkg, unsigned int die);
* - 0 on success without frequency changed.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_set_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index);
+int power_set_intel_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index);
/**
* Set minimum and maximum uncore frequency for specified die on a package
@@ -125,9 +118,7 @@ rte_power_set_uncore_freq(unsigned int pkg, unsigned int die, uint32_t index);
* - 0 on success without frequency changed.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_uncore_freq_max(unsigned int pkg, unsigned int die);
+int power_intel_uncore_freq_max(unsigned int pkg, unsigned int die);
/**
* Set minimum and maximum uncore frequency for specified die on a package
@@ -148,9 +139,30 @@ rte_power_uncore_freq_max(unsigned int pkg, unsigned int die);
* - 0 on success without frequency changed.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_uncore_freq_min(unsigned int pkg, unsigned int die);
+int power_intel_uncore_freq_min(unsigned int pkg, unsigned int die);
+
+/**
+ * Return the list of available frequencies in the index array.
+ *
+ * This function should NOT be called in the fast path.
+ *
+ * @param pkg
+ * Package number.
+ * Each physical CPU in a system is referred to as a package.
+ * @param die
+ * Die number.
+ * Each package can have several dies connected together via the uncore mesh.
+ * @param freqs
+ * The buffer array to save the frequencies.
+ * @param num
+ * The number of frequencies to get.
+ *
+ * @return
+ * - The number of available index's in frequency array.
+ * - Negative on error.
+ */
+int power_intel_uncore_freqs(unsigned int pkg, unsigned int die,
+ unsigned int *freqs, unsigned int num);
/**
* Return the list length of available frequencies in the index array.
@@ -168,9 +180,7 @@ rte_power_uncore_freq_min(unsigned int pkg, unsigned int die);
* - The number of available index's in frequency array.
* - Negative on error.
*/
-__rte_experimental
-int
-rte_power_uncore_get_num_freqs(unsigned int pkg, unsigned int die);
+int power_intel_uncore_get_num_freqs(unsigned int pkg, unsigned int die);
/**
* Return the number of packages (CPUs) on a system
@@ -182,9 +192,7 @@ rte_power_uncore_get_num_freqs(unsigned int pkg, unsigned int die);
* - Zero on error.
* - Number of package on system on success.
*/
-__rte_experimental
-unsigned int
-rte_power_uncore_get_num_pkgs(void);
+unsigned int power_intel_uncore_get_num_pkgs(void);
/**
* Return the number of dies for pakckages (CPUs) specified
@@ -200,12 +208,10 @@ rte_power_uncore_get_num_pkgs(void);
* - Zero on error.
* - Number of dies for package on sucecss.
*/
-__rte_experimental
-unsigned int
-rte_power_uncore_get_num_dies(unsigned int pkg);
+unsigned int power_intel_uncore_get_num_dies(unsigned int pkg);
#ifdef __cplusplus
}
#endif
-#endif /* RTE_POWER_INTEL_UNCORE_H */
+#endif /* POWER_INTEL_UNCORE_H */
diff --git a/lib/power/rte_power_uncore.c b/lib/power/rte_power_uncore.c
new file mode 100644
index 0000000000..79303ebb3a
--- /dev/null
+++ b/lib/power/rte_power_uncore.c
@@ -0,0 +1,189 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2010-2014 Intel Corporation
+ * Copyright(c) 2023 AMD Corporation
+ */
+
+#include <errno.h>
+
+#include <rte_errno.h>
+#include <rte_spinlock.h>
+
+#include "rte_power_uncore.h"
+#include "power_intel_uncore.h"
+
+enum uncore_power_mgmt_env default_uncore_env = UNCORE_PM_ENV_NOT_SET;
+
+static rte_spinlock_t global_env_cfg_lock = RTE_SPINLOCK_INITIALIZER;
+
+static uint32_t
+power_get_dummy_uncore_freq(unsigned int pkg __rte_unused,
+ unsigned int die __rte_unused)
+{
+ return 0;
+}
+
+static int
+power_set_dummy_uncore_freq(unsigned int pkg __rte_unused,
+ unsigned int die __rte_unused, uint32_t index __rte_unused)
+{
+ return 0;
+}
+
+static int
+power_dummy_uncore_freq_max(unsigned int pkg __rte_unused,
+ unsigned int die __rte_unused)
+{
+ return 0;
+}
+
+static int
+power_dummy_uncore_freq_min(unsigned int pkg __rte_unused,
+ unsigned int die __rte_unused)
+{
+ return 0;
+}
+
+static int
+power_dummy_uncore_freqs(unsigned int pkg __rte_unused, unsigned int die __rte_unused,
+ uint32_t *freqs __rte_unused, uint32_t num __rte_unused)
+{
+ return 0;
+}
+
+static int
+power_dummy_uncore_get_num_freqs(unsigned int pkg __rte_unused,
+ unsigned int die __rte_unused)
+{
+ return 0;
+}
+
+static unsigned int
+power_dummy_uncore_get_num_pkgs(void)
+{
+ return 0;
+}
+
+static unsigned int
+power_dummy_uncore_get_num_dies(unsigned int pkg __rte_unused)
+{
+ return 0;
+}
+
+/* function pointers */
+rte_power_get_uncore_freq_t rte_power_get_uncore_freq = power_get_dummy_uncore_freq;
+rte_power_set_uncore_freq_t rte_power_set_uncore_freq = power_set_dummy_uncore_freq;
+rte_power_uncore_freq_change_t rte_power_uncore_freq_max = power_dummy_uncore_freq_max;
+rte_power_uncore_freq_change_t rte_power_uncore_freq_min = power_dummy_uncore_freq_min;
+rte_power_uncore_freqs_t rte_power_uncore_freqs = power_dummy_uncore_freqs;
+rte_power_uncore_get_num_freqs_t rte_power_uncore_get_num_freqs =
+ power_dummy_uncore_get_num_freqs;
+rte_power_uncore_get_num_pkgs_t rte_power_uncore_get_num_pkgs =
+ power_dummy_uncore_get_num_pkgs;
+rte_power_uncore_get_num_dies_t rte_power_uncore_get_num_dies =
+ power_dummy_uncore_get_num_dies;
+
+static void
+reset_power_uncore_function_ptrs(void)
+{
+ rte_power_get_uncore_freq = power_get_dummy_uncore_freq;
+ rte_power_set_uncore_freq = power_set_dummy_uncore_freq;
+ rte_power_uncore_freq_max = power_dummy_uncore_freq_max;
+ rte_power_uncore_freq_min = power_dummy_uncore_freq_min;
+ rte_power_uncore_freqs = power_dummy_uncore_freqs;
+ rte_power_uncore_get_num_freqs = power_dummy_uncore_get_num_freqs;
+ rte_power_uncore_get_num_pkgs = power_dummy_uncore_get_num_pkgs;
+ rte_power_uncore_get_num_dies = power_dummy_uncore_get_num_dies;
+}
+
+int
+rte_power_set_uncore_env(enum uncore_power_mgmt_env env)
+{
+ rte_spinlock_lock(&global_env_cfg_lock);
+
+ if (default_uncore_env != UNCORE_PM_ENV_NOT_SET) {
+ RTE_LOG(ERR, POWER, "Uncore Power Management Env already set.\n");
+ rte_spinlock_unlock(&global_env_cfg_lock);
+ return -1;
+ }
+
+ int ret = 0;
+
+ if (env == UNCORE_PM_ENV_INTEL_UNCORE) {
+ rte_power_get_uncore_freq = power_get_intel_uncore_freq;
+ rte_power_set_uncore_freq = power_set_intel_uncore_freq;
+ rte_power_uncore_freq_min = power_intel_uncore_freq_min;
+ rte_power_uncore_freq_max = power_intel_uncore_freq_max;
+ rte_power_uncore_freqs = power_intel_uncore_freqs;
+ rte_power_uncore_get_num_freqs = power_intel_uncore_get_num_freqs;
+ rte_power_uncore_get_num_pkgs = power_intel_uncore_get_num_pkgs;
+ rte_power_uncore_get_num_dies = power_intel_uncore_get_num_dies;
+ } else {
+ RTE_LOG(ERR, POWER, "Invalid Power Management Environment(%d) set\n",
+ env);
+ ret = -1;
+ goto out;
+ }
+
+ default_uncore_env = env;
+out:
+ rte_spinlock_unlock(&global_env_cfg_lock);
+ return ret;
+}
+
+void
+rte_power_unset_uncore_env(void)
+{
+ rte_spinlock_lock(&global_env_cfg_lock);
+ default_uncore_env = UNCORE_PM_ENV_NOT_SET;
+ reset_power_uncore_function_ptrs();
+ rte_spinlock_unlock(&global_env_cfg_lock);
+}
+
+enum uncore_power_mgmt_env
+rte_power_get_uncore_env(void)
+{
+ return default_uncore_env;
+}
+
+int
+rte_power_uncore_init(unsigned int pkg, unsigned int die)
+{
+ int ret = -1;
+
+ switch (default_uncore_env) {
+ case UNCORE_PM_ENV_INTEL_UNCORE:
+ return power_intel_uncore_init(pkg, die);
+ default:
+ RTE_LOG(INFO, POWER, "Uncore Env isn't set yet!\n");
+ }
+
+ /* Auto detect Environment */
+ RTE_LOG(INFO, POWER, "Attempting to initialise Intel Uncore power mgmt...\n");
+ ret = power_intel_uncore_init(pkg, die);
+ if (ret == 0) {
+ rte_power_set_uncore_env(UNCORE_PM_ENV_INTEL_UNCORE);
+ goto out;
+ }
+
+ if (default_uncore_env == UNCORE_PM_ENV_NOT_SET) {
+ RTE_LOG(ERR, POWER, "Unable to set Power Management Environment "
+ "for package %u Die %u\n", pkg, die);
+ ret = 0;
+ }
+out:
+ return ret;
+}
+
+int
+rte_power_uncore_exit(unsigned int pkg, unsigned int die)
+{
+ switch (default_uncore_env) {
+ case UNCORE_PM_ENV_INTEL_UNCORE:
+ return power_intel_uncore_exit(pkg, die);
+ default:
+ RTE_LOG(ERR, POWER, "Uncore Env has not been set,"
+ "unable to exit gracefully\n");
+ }
+ return -1;
+
+}
diff --git a/lib/power/rte_power_uncore.h b/lib/power/rte_power_uncore.h
index e27f483eae..a43346b186 100644
--- a/lib/power/rte_power_uncore.h
+++ b/lib/power/rte_power_uncore.h
@@ -22,6 +22,38 @@ extern "C" {
enum uncore_power_mgmt_env { UNCORE_PM_ENV_NOT_SET,
UNCORE_PM_ENV_INTEL_UNCORE, UNCORE_PM_ENV_AMD_HSMP};
+/**
+ * Set the default uncore power management implementation. If this is not called prior
+ * to rte_power_uncore_init(), then auto-detect of the environment will take place.
+ * It is thread safe. New env can be set only in uninitialized state
+ * (thus rte_power_unset_uncore_env must be called if different env was already set).
+ *
+ * @param env
+ * env. The environment in which to initialise Uncore Power Management for.
+ *
+ * @return
+ * - 0 on success.
+ * - Negative on error.
+ */
+__rte_experimental
+int rte_power_set_uncore_env(enum uncore_power_mgmt_env env);
+
+/**
+ * Unset the global uncore environment configuration.
+ * This can only be called after all threads have completed.
+ */
+__rte_experimental
+void rte_power_unset_uncore_env(void);
+
+/**
+ * Get the default uncore power management implementation.
+ *
+ * @return
+ * power_management_env The configured environment.
+ */
+__rte_experimental
+enum uncore_power_mgmt_env rte_power_get_uncore_env(void);
+
/**
* Initialize uncore frequency management for specific die on a package.
* It will get the available frequencies and prepare to set new die frequencies.
diff --git a/lib/power/version.map b/lib/power/version.map
index b8b54f768e..c22813e89a 100644
--- a/lib/power/version.map
+++ b/lib/power/version.map
@@ -52,4 +52,10 @@ EXPERIMENTAL {
rte_power_uncore_get_num_freqs;
rte_power_uncore_get_num_pkgs;
rte_power_uncore_init;
+
+ # added in 23.11
+ rte_power_uncore_freqs;
+ rte_power_set_uncore_env;
+ rte_power_unset_uncore_env;
+ rte_power_get_uncore_env;
};
--
2.34.1
next prev parent reply other threads:[~2023-08-16 10:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-03 17:03 [RFC PATCH] power: refactor uncore power management interfaces Sivaprasad Tummala
2023-05-17 11:42 ` Tummala, Sivaprasad
2023-05-19 9:42 ` Burakov, Anatoly
2023-08-11 10:25 ` [PATCH v1 1/2] " Sivaprasad Tummala
2023-08-11 10:25 ` [PATCH v1 2/2] power: refactor uncore power management implementation Sivaprasad Tummala
2023-08-16 10:09 ` [PATCH v2 1/2] power: refactor uncore power management interfaces Sivaprasad Tummala
2023-08-16 10:09 ` Sivaprasad Tummala [this message]
2023-10-06 9:03 ` David Marchand
2023-10-09 13:56 ` Tummala, Sivaprasad
2023-10-17 8:19 ` David Marchand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230816100958.1022206-2-sivaprasad.tummala@amd.com \
--to=sivaprasad.tummala@amd.com \
--cc=anatoly.burakov@intel.com \
--cc=david.hunt@intel.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@amd.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).