All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v7 00/10] cpupower: Add AMD P-State Support
@ 2022-02-22 15:34 Huang Rui
  2022-02-22 15:34 ` [PATCH v7 01/10] cpupower: Add AMD P-State capability flag Huang Rui
                   ` (10 more replies)
  0 siblings, 11 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Hi Shuah,

Since AMD P-State kernel is merged into 5.17-rc1, I would like to continue
revising the AMD P-State support for the CPUPower tool. These series are
rebased on latest bleeding-edge, any comments are warm for me.

See patch series of CPUPower in below git repo:
V1: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v1
V2: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v2
V3: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v3
V4: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v4
V5: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v5
V6: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=cpupower-amd-pstate
V7: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=cpupower-amd-pstate-v7

Changes from V1 -> V2:
- Refine the commit log for cpupower patches.
- Expose a function to get the sysfs value from specific table.
- Move AMD P-State sysfs definitions and functions into AMD helper file.
- Move the boost init function into AMD helper file and explain the
details in the commit log.
- Remove the amd_pstate_get_data in the lib/cpufreq.c to keep the lib as
common operations.
- Move print_speed function into misc helper file.
- Add amd_pstate_show_perf_and_freq() function in AMD helper for
  cpufreq-info print.

Changes from V2 -> V3:
- Revise the cpupower_amd_pstate_enabled() function to use
cpufreq_get_driver helper instead of read sysfs.
- Clean up the AMD P-State max/min frequency APIs, because they are
actually the same with cpufreq info sysfs.

Changes from V3 -> V4:
- Introduce ACPI CPPC library support.
- Clean up the duplicated AMD specific perf/frequency.

Changes from V4 -> V5:
- Fix the table check condition at cpufreq_get_sysfs_value_from_table.

Changes from V5 -> V6:
- Revise the minor commit and subject descriptions.

Changes from V6 -> V7:
- Fix the checkpatch warnings and errors.
- Revise the patch 9 to move the AMD P-State information prints out of
  boost function.
- Add a new option to print the performance and frequency capabilities of
  CPPC, and add related description in manpage documentation.

> cpupower info
>
> System does not support Intel's performance bias setting
> analyzing CPU 0:

Regards to the print of "cpupower info" above, it's becasuse only
"perf-bias" option is implemented in cmd_info only for Intel processors. So
in another processors, even using the acpi-cpufreq driver, we still get the
same print. I am thinking, can we add a simple print to say this command
doesn't support AMD platform so far? Or any other idea?

Thanks,
Ray

Huang Rui (10):
  cpupower: Add AMD P-State capability flag
  cpupower: Add the function to check AMD P-State enabled
  cpupower: Initial AMD P-State capability
  cpupower: Add the function to get the sysfs value from specific table
  cpupower: Introduce ACPI CPPC library
  cpupower: Add AMD P-State sysfs definition and access helper
  cpupower: Enable boost state support for AMD P-State module
  cpupower: Move print_speed function into misc helper
  cpupower: Add function to print AMD P-State performance capabilities
  cpupower: Add "perf" option to print AMD P-State information

 tools/power/cpupower/Makefile                 |  6 +-
 tools/power/cpupower/lib/acpi_cppc.c          | 59 +++++++++++++
 tools/power/cpupower/lib/acpi_cppc.h          | 21 +++++
 tools/power/cpupower/lib/cpufreq.c            | 23 +++--
 tools/power/cpupower/lib/cpufreq.h            | 12 +++
 .../cpupower/man/cpupower-frequency-info.1    |  3 +
 tools/power/cpupower/utils/cpufreq-info.c     | 87 ++++++++-----------
 tools/power/cpupower/utils/helpers/amd.c      | 77 ++++++++++++++++
 tools/power/cpupower/utils/helpers/cpuid.c    | 13 +++
 tools/power/cpupower/utils/helpers/helpers.h  | 22 +++++
 tools/power/cpupower/utils/helpers/misc.c     | 60 +++++++++++++
 11 files changed, 321 insertions(+), 62 deletions(-)
 create mode 100644 tools/power/cpupower/lib/acpi_cppc.c
 create mode 100644 tools/power/cpupower/lib/acpi_cppc.h

-- 
2.25.1


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [PATCH v7 01/10] cpupower: Add AMD P-State capability flag
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 02/10] cpupower: Add the function to check AMD P-State enabled Huang Rui
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Add AMD P-State capability flag in cpupower to indicate AMD new P-State
kernel module support on Ryzen processors.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/helpers/helpers.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index 33ffacee7fcb..b4813efdfb00 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -73,6 +73,7 @@ enum cpupower_cpu_vendor {X86_VENDOR_UNKNOWN = 0, X86_VENDOR_INTEL,
 #define CPUPOWER_CAP_AMD_HW_PSTATE	0x00000100
 #define CPUPOWER_CAP_AMD_PSTATEDEF	0x00000200
 #define CPUPOWER_CAP_AMD_CPB_MSR	0x00000400
+#define CPUPOWER_CAP_AMD_PSTATE		0x00000800
 
 #define CPUPOWER_AMD_CPBDIS		0x02000000
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 02/10] cpupower: Add the function to check AMD P-State enabled
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
  2022-02-22 15:34 ` [PATCH v7 01/10] cpupower: Add AMD P-State capability flag Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 03/10] cpupower: Initial AMD P-State capability Huang Rui
                   ` (8 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

The processor with AMD P-State function also supports legacy ACPI
hardware P-States feature as well. Once driver sets AMD P-State eanbled,
the processor will respond the finer grain AMD P-State feature instead of
legacy ACPI P-States. So it introduces the cpupower_amd_pstate_enabled()
to check whether the current kernel enables AMD P-State or AMD CPUFreq
module.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/helpers/helpers.h | 10 ++++++++++
 tools/power/cpupower/utils/helpers/misc.c    | 18 ++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index b4813efdfb00..62771a086871 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -11,6 +11,7 @@
 
 #include <libintl.h>
 #include <locale.h>
+#include <stdbool.h>
 
 #include "helpers/bitmask.h"
 #include <cpupower.h>
@@ -136,6 +137,12 @@ extern int decode_pstates(unsigned int cpu, int boost_states,
 
 extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
 				     int *active, int * states);
+
+/* AMD P-State stuff **************************/
+bool cpupower_amd_pstate_enabled(void);
+
+/* AMD P-State stuff **************************/
+
 /*
  * CPUID functions returning a single datum
  */
@@ -168,6 +175,9 @@ static inline int cpufreq_has_boost_support(unsigned int cpu, int *support,
 					    int *active, int * states)
 { return -1; }
 
+static inline bool cpupower_amd_pstate_enabled(void)
+{ return false; }
+
 /* cpuid and cpuinfo helpers  **************************/
 
 static inline unsigned int cpuid_eax(unsigned int op) { return 0; };
diff --git a/tools/power/cpupower/utils/helpers/misc.c b/tools/power/cpupower/utils/helpers/misc.c
index fc6e34511721..0c483cdefcc2 100644
--- a/tools/power/cpupower/utils/helpers/misc.c
+++ b/tools/power/cpupower/utils/helpers/misc.c
@@ -3,9 +3,11 @@
 #include <stdio.h>
 #include <errno.h>
 #include <stdlib.h>
+#include <string.h>
 
 #include "helpers/helpers.h"
 #include "helpers/sysfs.h"
+#include "cpufreq.h"
 
 #if defined(__i386__) || defined(__x86_64__)
 
@@ -83,6 +85,22 @@ int cpupower_intel_set_perf_bias(unsigned int cpu, unsigned int val)
 	return 0;
 }
 
+bool cpupower_amd_pstate_enabled(void)
+{
+	char *driver = cpufreq_get_driver(0);
+	bool ret = false;
+
+	if (!driver)
+		return ret;
+
+	if (!strcmp(driver, "amd-pstate"))
+		ret = true;
+
+	cpufreq_put_driver(driver);
+
+	return ret;
+}
+
 #endif /* #if defined(__i386__) || defined(__x86_64__) */
 
 /* get_cpustate
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 03/10] cpupower: Initial AMD P-State capability
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
  2022-02-22 15:34 ` [PATCH v7 01/10] cpupower: Add AMD P-State capability flag Huang Rui
  2022-02-22 15:34 ` [PATCH v7 02/10] cpupower: Add the function to check AMD P-State enabled Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 04/10] cpupower: Add the function to get the sysfs value from specific table Huang Rui
                   ` (7 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

If kernel starts the AMD P-State module, the cpupower will initial the
capability flag as CPUPOWER_CAP_AMD_PSTATE. And once AMD P-State
capability is set, it won't need to set legacy ACPI relative
capabilities anymore.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/helpers/cpuid.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/tools/power/cpupower/utils/helpers/cpuid.c b/tools/power/cpupower/utils/helpers/cpuid.c
index 72eb43593180..eae91f11d187 100644
--- a/tools/power/cpupower/utils/helpers/cpuid.c
+++ b/tools/power/cpupower/utils/helpers/cpuid.c
@@ -149,6 +149,19 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info)
 		if (ext_cpuid_level >= 0x80000008 &&
 		    cpuid_ebx(0x80000008) & (1 << 4))
 			cpu_info->caps |= CPUPOWER_CAP_AMD_RDPRU;
+
+		if (cpupower_amd_pstate_enabled()) {
+			cpu_info->caps |= CPUPOWER_CAP_AMD_PSTATE;
+
+			/*
+			 * If AMD P-State is enabled, the firmware will treat
+			 * AMD P-State function as high priority.
+			 */
+			cpu_info->caps &= ~CPUPOWER_CAP_AMD_CPB;
+			cpu_info->caps &= ~CPUPOWER_CAP_AMD_CPB_MSR;
+			cpu_info->caps &= ~CPUPOWER_CAP_AMD_HW_PSTATE;
+			cpu_info->caps &= ~CPUPOWER_CAP_AMD_PSTATEDEF;
+		}
 	}
 
 	if (cpu_info->vendor == X86_VENDOR_INTEL) {
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 04/10] cpupower: Add the function to get the sysfs value from specific table
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (2 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 03/10] cpupower: Initial AMD P-State capability Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 05/10] cpupower: Introduce ACPI CPPC library Huang Rui
                   ` (6 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Expose the helper into cpufreq header, then cpufreq driver can use this
function to get the sysfs value if it has any specific sysfs interfaces.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/lib/cpufreq.c | 23 ++++++++++++++++-------
 tools/power/cpupower/lib/cpufreq.h | 12 ++++++++++++
 2 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/tools/power/cpupower/lib/cpufreq.c b/tools/power/cpupower/lib/cpufreq.c
index c3b56db8b921..1516d23c17c9 100644
--- a/tools/power/cpupower/lib/cpufreq.c
+++ b/tools/power/cpupower/lib/cpufreq.c
@@ -83,20 +83,21 @@ static const char *cpufreq_value_files[MAX_CPUFREQ_VALUE_READ_FILES] = {
 	[STATS_NUM_TRANSITIONS] = "stats/total_trans"
 };
 
-
-static unsigned long sysfs_cpufreq_get_one_value(unsigned int cpu,
-						 enum cpufreq_value which)
+unsigned long cpufreq_get_sysfs_value_from_table(unsigned int cpu,
+						 const char **table,
+						 unsigned int index,
+						 unsigned int size)
 {
 	unsigned long value;
 	unsigned int len;
 	char linebuf[MAX_LINE_LEN];
 	char *endp;
 
-	if (which >= MAX_CPUFREQ_VALUE_READ_FILES)
+	if (!table || index >= size || !table[index])
 		return 0;
 
-	len = sysfs_cpufreq_read_file(cpu, cpufreq_value_files[which],
-				linebuf, sizeof(linebuf));
+	len = sysfs_cpufreq_read_file(cpu, table[index], linebuf,
+				      sizeof(linebuf));
 
 	if (len == 0)
 		return 0;
@@ -109,6 +110,14 @@ static unsigned long sysfs_cpufreq_get_one_value(unsigned int cpu,
 	return value;
 }
 
+static unsigned long sysfs_cpufreq_get_one_value(unsigned int cpu,
+						 enum cpufreq_value which)
+{
+	return cpufreq_get_sysfs_value_from_table(cpu, cpufreq_value_files,
+						  which,
+						  MAX_CPUFREQ_VALUE_READ_FILES);
+}
+
 /* read access to files which contain one string */
 
 enum cpufreq_string {
@@ -124,7 +133,7 @@ static const char *cpufreq_string_files[MAX_CPUFREQ_STRING_FILES] = {
 
 
 static char *sysfs_cpufreq_get_one_string(unsigned int cpu,
-					   enum cpufreq_string which)
+					  enum cpufreq_string which)
 {
 	char linebuf[MAX_LINE_LEN];
 	char *result;
diff --git a/tools/power/cpupower/lib/cpufreq.h b/tools/power/cpupower/lib/cpufreq.h
index 95f4fd9e2656..2f3c84035806 100644
--- a/tools/power/cpupower/lib/cpufreq.h
+++ b/tools/power/cpupower/lib/cpufreq.h
@@ -203,6 +203,18 @@ int cpufreq_modify_policy_governor(unsigned int cpu, char *governor);
 int cpufreq_set_frequency(unsigned int cpu,
 				unsigned long target_frequency);
 
+/*
+ * get the sysfs value from specific table
+ *
+ * Read the value with the sysfs file name from specific table. Does
+ * only work if the cpufreq driver has the specific sysfs interfaces.
+ */
+
+unsigned long cpufreq_get_sysfs_value_from_table(unsigned int cpu,
+						 const char **table,
+						 unsigned int index,
+						 unsigned int size);
+
 #ifdef __cplusplus
 }
 #endif
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 05/10] cpupower: Introduce ACPI CPPC library
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (3 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 04/10] cpupower: Add the function to get the sysfs value from specific table Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 06/10] cpupower: Add AMD P-State sysfs definition and access helper Huang Rui
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Kernel ACPI subsytem introduced the sysfs attributes for acpi cppc
library in below path:

/sys/devices/system/cpu/cpuX/acpi_cppc/

And these attributes will be used for AMD P-State driver to provide some
performance and frequency values.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/Makefile        |  6 +--
 tools/power/cpupower/lib/acpi_cppc.c | 59 ++++++++++++++++++++++++++++
 tools/power/cpupower/lib/acpi_cppc.h | 21 ++++++++++
 3 files changed, 83 insertions(+), 3 deletions(-)
 create mode 100644 tools/power/cpupower/lib/acpi_cppc.c
 create mode 100644 tools/power/cpupower/lib/acpi_cppc.h

diff --git a/tools/power/cpupower/Makefile b/tools/power/cpupower/Makefile
index 3b1594447f29..e9b6de314654 100644
--- a/tools/power/cpupower/Makefile
+++ b/tools/power/cpupower/Makefile
@@ -143,9 +143,9 @@ UTIL_HEADERS = utils/helpers/helpers.h utils/idle_monitor/cpupower-monitor.h \
 	utils/helpers/bitmask.h \
 	utils/idle_monitor/idle_monitors.h utils/idle_monitor/idle_monitors.def
 
-LIB_HEADERS = 	lib/cpufreq.h lib/cpupower.h lib/cpuidle.h
-LIB_SRC = 	lib/cpufreq.c lib/cpupower.c lib/cpuidle.c
-LIB_OBJS = 	lib/cpufreq.o lib/cpupower.o lib/cpuidle.o
+LIB_HEADERS = 	lib/cpufreq.h lib/cpupower.h lib/cpuidle.h lib/acpi_cppc.h
+LIB_SRC = 	lib/cpufreq.c lib/cpupower.c lib/cpuidle.c lib/acpi_cppc.c
+LIB_OBJS = 	lib/cpufreq.o lib/cpupower.o lib/cpuidle.o lib/acpi_cppc.o
 LIB_OBJS :=	$(addprefix $(OUTPUT),$(LIB_OBJS))
 
 override CFLAGS +=	-pipe
diff --git a/tools/power/cpupower/lib/acpi_cppc.c b/tools/power/cpupower/lib/acpi_cppc.c
new file mode 100644
index 000000000000..c401ac331e9f
--- /dev/null
+++ b/tools/power/cpupower/lib/acpi_cppc.c
@@ -0,0 +1,59 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "cpupower_intern.h"
+#include "acpi_cppc.h"
+
+/* ACPI CPPC sysfs access ***********************************************/
+
+static int acpi_cppc_read_file(unsigned int cpu, const char *fname,
+			       char *buf, size_t buflen)
+{
+	char path[SYSFS_PATH_MAX];
+
+	snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/acpi_cppc/%s",
+		 cpu, fname);
+	return cpupower_read_sysfs(path, buf, buflen);
+}
+
+static const char * const acpi_cppc_value_files[] = {
+	[HIGHEST_PERF] = "highest_perf",
+	[LOWEST_PERF] = "lowest_perf",
+	[NOMINAL_PERF] = "nominal_perf",
+	[LOWEST_NONLINEAR_PERF] = "lowest_nonlinear_perf",
+	[LOWEST_FREQ] = "lowest_freq",
+	[NOMINAL_FREQ] = "nominal_freq",
+	[REFERENCE_PERF] = "reference_perf",
+	[WRAPAROUND_TIME] = "wraparound_time"
+};
+
+unsigned long acpi_cppc_get_data(unsigned int cpu, enum acpi_cppc_value which)
+{
+	unsigned long long value;
+	unsigned int len;
+	char linebuf[MAX_LINE_LEN];
+	char *endp;
+
+	if (which >= MAX_CPPC_VALUE_FILES)
+		return 0;
+
+	len = acpi_cppc_read_file(cpu, acpi_cppc_value_files[which],
+				  linebuf, sizeof(linebuf));
+	if (len == 0)
+		return 0;
+
+	value = strtoull(linebuf, &endp, 0);
+
+	if (endp == linebuf || errno == ERANGE)
+		return 0;
+
+	return value;
+}
diff --git a/tools/power/cpupower/lib/acpi_cppc.h b/tools/power/cpupower/lib/acpi_cppc.h
new file mode 100644
index 000000000000..85ca83080316
--- /dev/null
+++ b/tools/power/cpupower/lib/acpi_cppc.h
@@ -0,0 +1,21 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef __ACPI_CPPC_H__
+#define __ACPI_CPPC_H__
+
+enum acpi_cppc_value {
+	HIGHEST_PERF,
+	LOWEST_PERF,
+	NOMINAL_PERF,
+	LOWEST_NONLINEAR_PERF,
+	LOWEST_FREQ,
+	NOMINAL_FREQ,
+	REFERENCE_PERF,
+	WRAPAROUND_TIME,
+	MAX_CPPC_VALUE_FILES
+};
+
+unsigned long acpi_cppc_get_data(unsigned int cpu,
+				 enum acpi_cppc_value which);
+
+#endif /* _ACPI_CPPC_H */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 06/10] cpupower: Add AMD P-State sysfs definition and access helper
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (4 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 05/10] cpupower: Introduce ACPI CPPC library Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 07/10] cpupower: Enable boost state support for AMD P-State module Huang Rui
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Introduce the marco definitions and access helper function for
AMD P-State sysfs interfaces such as each performance goals and frequency
levels in amd helper file. They will be used to read the sysfs attribute
from AMD P-State cpufreq driver for cpupower utilities.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/helpers/amd.c | 30 ++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/tools/power/cpupower/utils/helpers/amd.c b/tools/power/cpupower/utils/helpers/amd.c
index 97f2c857048e..4d45d1b44164 100644
--- a/tools/power/cpupower/utils/helpers/amd.c
+++ b/tools/power/cpupower/utils/helpers/amd.c
@@ -8,7 +8,10 @@
 #include <pci/pci.h>
 
 #include "helpers/helpers.h"
+#include "cpufreq.h"
+#include "acpi_cppc.h"
 
+/* ACPI P-States Helper Functions for AMD Processors ***************/
 #define MSR_AMD_PSTATE_STATUS	0xc0010063
 #define MSR_AMD_PSTATE		0xc0010064
 #define MSR_AMD_PSTATE_LIMIT	0xc0010061
@@ -146,4 +149,31 @@ int amd_pci_get_num_boost_states(int *active, int *states)
 	pci_cleanup(pci_acc);
 	return 0;
 }
+
+/* ACPI P-States Helper Functions for AMD Processors ***************/
+
+/* AMD P-State Helper Functions ************************************/
+enum amd_pstate_value {
+	AMD_PSTATE_HIGHEST_PERF,
+	AMD_PSTATE_MAX_FREQ,
+	AMD_PSTATE_LOWEST_NONLINEAR_FREQ,
+	MAX_AMD_PSTATE_VALUE_READ_FILES,
+};
+
+static const char *amd_pstate_value_files[MAX_AMD_PSTATE_VALUE_READ_FILES] = {
+	[AMD_PSTATE_HIGHEST_PERF] = "amd_pstate_highest_perf",
+	[AMD_PSTATE_MAX_FREQ] = "amd_pstate_max_freq",
+	[AMD_PSTATE_LOWEST_NONLINEAR_FREQ] = "amd_pstate_lowest_nonlinear_freq",
+};
+
+static unsigned long amd_pstate_get_data(unsigned int cpu,
+					 enum amd_pstate_value value)
+{
+	return cpufreq_get_sysfs_value_from_table(cpu,
+						  amd_pstate_value_files,
+						  value,
+						  MAX_AMD_PSTATE_VALUE_READ_FILES);
+}
+
+/* AMD P-State Helper Functions ************************************/
 #endif /* defined(__i386__) || defined(__x86_64__) */
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 07/10] cpupower: Enable boost state support for AMD P-State module
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (5 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 06/10] cpupower: Add AMD P-State sysfs definition and access helper Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 08/10] cpupower: Move print_speed function into misc helper Huang Rui
                   ` (3 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

The legacy ACPI hardware P-States function has 3 P-States on ACPI table,
the CPU frequency only can be switched between the 3 P-States. While the
processor supports the boost state, it will have another boost state
that the frequency can be higher than P0 state, and the state can be
decoded by the function of decode_pstates() and read by
amd_pci_get_num_boost_states().

However, the new AMD P-State function is different than legacy ACPI
hardware P-State on AMD processors. That has a finer grain frequency
range between the highest and lowest frequency. And boost frequency is
actually the frequency which is mapped on highest performance ratio. The
similar previous P0 frequency is mapped on nominal performance ratio.
If the highest performance on the processor is higher than nominal
performance, then we think the current processor supports the boost
state. And it uses amd_pstate_boost_init() to initialize boost for AMD
P-State function.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/helpers/amd.c     | 18 ++++++++++++++++++
 tools/power/cpupower/utils/helpers/helpers.h |  5 +++++
 tools/power/cpupower/utils/helpers/misc.c    |  2 ++
 3 files changed, 25 insertions(+)

diff --git a/tools/power/cpupower/utils/helpers/amd.c b/tools/power/cpupower/utils/helpers/amd.c
index 4d45d1b44164..f5ba528dc7db 100644
--- a/tools/power/cpupower/utils/helpers/amd.c
+++ b/tools/power/cpupower/utils/helpers/amd.c
@@ -175,5 +175,23 @@ static unsigned long amd_pstate_get_data(unsigned int cpu,
 						  MAX_AMD_PSTATE_VALUE_READ_FILES);
 }
 
+void amd_pstate_boost_init(unsigned int cpu, int *support, int *active)
+{
+	unsigned long highest_perf, nominal_perf, cpuinfo_min,
+		      cpuinfo_max, amd_pstate_max;
+
+	highest_perf = amd_pstate_get_data(cpu, AMD_PSTATE_HIGHEST_PERF);
+	nominal_perf = acpi_cppc_get_data(cpu, NOMINAL_PERF);
+
+	*support = highest_perf > nominal_perf ? 1 : 0;
+	if (!(*support))
+		return;
+
+	cpufreq_get_hardware_limits(cpu, &cpuinfo_min, &cpuinfo_max);
+	amd_pstate_max = amd_pstate_get_data(cpu, AMD_PSTATE_MAX_FREQ);
+
+	*active = cpuinfo_max == amd_pstate_max ? 1 : 0;
+}
+
 /* AMD P-State Helper Functions ************************************/
 #endif /* defined(__i386__) || defined(__x86_64__) */
diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index 62771a086871..326491e11c6e 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -140,6 +140,8 @@ extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
 
 /* AMD P-State stuff **************************/
 bool cpupower_amd_pstate_enabled(void);
+void amd_pstate_boost_init(unsigned int cpu,
+			   int *support, int *active);
 
 /* AMD P-State stuff **************************/
 
@@ -177,6 +179,9 @@ static inline int cpufreq_has_boost_support(unsigned int cpu, int *support,
 
 static inline bool cpupower_amd_pstate_enabled(void)
 { return false; }
+static inline void amd_pstate_boost_init(unsigned int cpu, int *support,
+					 int *active)
+{}
 
 /* cpuid and cpuinfo helpers  **************************/
 
diff --git a/tools/power/cpupower/utils/helpers/misc.c b/tools/power/cpupower/utils/helpers/misc.c
index 0c483cdefcc2..e0d3145434d3 100644
--- a/tools/power/cpupower/utils/helpers/misc.c
+++ b/tools/power/cpupower/utils/helpers/misc.c
@@ -41,6 +41,8 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
 			if (ret)
 				return ret;
 		}
+	} else if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) {
+		amd_pstate_boost_init(cpu, support, active);
 	} else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA)
 		*support = *active = 1;
 	return 0;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 08/10] cpupower: Move print_speed function into misc helper
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (6 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 07/10] cpupower: Enable boost state support for AMD P-State module Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 09/10] cpupower: Add function to print AMD P-State performance capabilities Huang Rui
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

The print_speed can be as a common function, and expose it into misc
helper header. Then it can be used on other helper files as well.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/cpufreq-info.c    | 59 ++++----------------
 tools/power/cpupower/utils/helpers/helpers.h |  1 +
 tools/power/cpupower/utils/helpers/misc.c    | 40 +++++++++++++
 3 files changed, 52 insertions(+), 48 deletions(-)

diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c
index f9895e31ff5a..b429454bf3ae 100644
--- a/tools/power/cpupower/utils/cpufreq-info.c
+++ b/tools/power/cpupower/utils/cpufreq-info.c
@@ -84,43 +84,6 @@ static void proc_cpufreq_output(void)
 }
 
 static int no_rounding;
-static void print_speed(unsigned long speed)
-{
-	unsigned long tmp;
-
-	if (no_rounding) {
-		if (speed > 1000000)
-			printf("%u.%06u GHz", ((unsigned int) speed/1000000),
-				((unsigned int) speed%1000000));
-		else if (speed > 1000)
-			printf("%u.%03u MHz", ((unsigned int) speed/1000),
-				(unsigned int) (speed%1000));
-		else
-			printf("%lu kHz", speed);
-	} else {
-		if (speed > 1000000) {
-			tmp = speed%10000;
-			if (tmp >= 5000)
-				speed += 10000;
-			printf("%u.%02u GHz", ((unsigned int) speed/1000000),
-				((unsigned int) (speed%1000000)/10000));
-		} else if (speed > 100000) {
-			tmp = speed%1000;
-			if (tmp >= 500)
-				speed += 1000;
-			printf("%u MHz", ((unsigned int) speed/1000));
-		} else if (speed > 1000) {
-			tmp = speed%100;
-			if (tmp >= 50)
-				speed += 100;
-			printf("%u.%01u MHz", ((unsigned int) speed/1000),
-				((unsigned int) (speed%1000)/100));
-		}
-	}
-
-	return;
-}
-
 static void print_duration(unsigned long duration)
 {
 	unsigned long tmp;
@@ -254,11 +217,11 @@ static int get_boost_mode(unsigned int cpu)
 	if (freqs) {
 		printf(_("  boost frequency steps: "));
 		while (freqs->next) {
-			print_speed(freqs->frequency);
+			print_speed(freqs->frequency, no_rounding);
 			printf(", ");
 			freqs = freqs->next;
 		}
-		print_speed(freqs->frequency);
+		print_speed(freqs->frequency, no_rounding);
 		printf("\n");
 		cpufreq_put_available_frequencies(freqs);
 	}
@@ -277,7 +240,7 @@ static int get_freq_kernel(unsigned int cpu, unsigned int human)
 		return -EINVAL;
 	}
 	if (human) {
-		print_speed(freq);
+		print_speed(freq, no_rounding);
 	} else
 		printf("%lu", freq);
 	printf(_(" (asserted by call to kernel)\n"));
@@ -296,7 +259,7 @@ static int get_freq_hardware(unsigned int cpu, unsigned int human)
 		return -EINVAL;
 	}
 	if (human) {
-		print_speed(freq);
+		print_speed(freq, no_rounding);
 	} else
 		printf("%lu", freq);
 	printf(_(" (asserted by call to hardware)\n"));
@@ -316,9 +279,9 @@ static int get_hardware_limits(unsigned int cpu, unsigned int human)
 
 	if (human) {
 		printf(_("  hardware limits: "));
-		print_speed(min);
+		print_speed(min, no_rounding);
 		printf(" - ");
-		print_speed(max);
+		print_speed(max, no_rounding);
 		printf("\n");
 	} else {
 		printf("%lu %lu\n", min, max);
@@ -350,9 +313,9 @@ static int get_policy(unsigned int cpu)
 		return -EINVAL;
 	}
 	printf(_("  current policy: frequency should be within "));
-	print_speed(policy->min);
+	print_speed(policy->min, no_rounding);
 	printf(_(" and "));
-	print_speed(policy->max);
+	print_speed(policy->max, no_rounding);
 
 	printf(".\n                  ");
 	printf(_("The governor \"%s\" may decide which speed to use\n"
@@ -436,7 +399,7 @@ static int get_freq_stats(unsigned int cpu, unsigned int human)
 	struct cpufreq_stats *stats = cpufreq_get_stats(cpu, &total_time);
 	while (stats) {
 		if (human) {
-			print_speed(stats->frequency);
+			print_speed(stats->frequency, no_rounding);
 			printf(":%.2f%%",
 				(100.0 * stats->time_in_state) / total_time);
 		} else
@@ -486,11 +449,11 @@ static void debug_output_one(unsigned int cpu)
 	if (freqs) {
 		printf(_("  available frequency steps:  "));
 		while (freqs->next) {
-			print_speed(freqs->frequency);
+			print_speed(freqs->frequency, no_rounding);
 			printf(", ");
 			freqs = freqs->next;
 		}
-		print_speed(freqs->frequency);
+		print_speed(freqs->frequency, no_rounding);
 		printf("\n");
 		cpufreq_put_available_frequencies(freqs);
 	}
diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index 326491e11c6e..fa2a8c1b1d26 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -200,5 +200,6 @@ extern struct bitmask *offline_cpus;
 void get_cpustate(void);
 void print_online_cpus(void);
 void print_offline_cpus(void);
+void print_speed(unsigned long speed, int no_rounding);
 
 #endif /* __CPUPOWERUTILS_HELPERS__ */
diff --git a/tools/power/cpupower/utils/helpers/misc.c b/tools/power/cpupower/utils/helpers/misc.c
index e0d3145434d3..9547b29254a7 100644
--- a/tools/power/cpupower/utils/helpers/misc.c
+++ b/tools/power/cpupower/utils/helpers/misc.c
@@ -164,3 +164,43 @@ void print_offline_cpus(void)
 		printf(_("cpupower set operation was not performed on them\n"));
 	}
 }
+
+/*
+ * print_speed
+ *
+ * Print the exact CPU frequency with appropriate unit
+ */
+void print_speed(unsigned long speed, int no_rounding)
+{
+	unsigned long tmp;
+
+	if (no_rounding) {
+		if (speed > 1000000)
+			printf("%u.%06u GHz", ((unsigned int)speed / 1000000),
+			       ((unsigned int)speed % 1000000));
+		else if (speed > 1000)
+			printf("%u.%03u MHz", ((unsigned int)speed / 1000),
+			       (unsigned int)(speed % 1000));
+		else
+			printf("%lu kHz", speed);
+	} else {
+		if (speed > 1000000) {
+			tmp = speed % 10000;
+			if (tmp >= 5000)
+				speed += 10000;
+			printf("%u.%02u GHz", ((unsigned int)speed / 1000000),
+			       ((unsigned int)(speed % 1000000) / 10000));
+		} else if (speed > 100000) {
+			tmp = speed % 1000;
+			if (tmp >= 500)
+				speed += 1000;
+			printf("%u MHz", ((unsigned int)speed / 1000));
+		} else if (speed > 1000) {
+			tmp = speed % 100;
+			if (tmp >= 50)
+				speed += 100;
+			printf("%u.%01u MHz", ((unsigned int)speed / 1000),
+			       ((unsigned int)(speed % 1000) / 100));
+		}
+	}
+}
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 09/10] cpupower: Add function to print AMD P-State performance capabilities
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (7 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 08/10] cpupower: Move print_speed function into misc helper Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-22 15:34 ` [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information Huang Rui
  2022-02-23  1:44 ` [PATCH v7 00/10] cpupower: Add AMD P-State Support Shuah Khan
  10 siblings, 0 replies; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

AMD P-State kernel module is using the fine grain frequency instead of
acpi hardware pstate. So add a function to print performance and
frequency values.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 tools/power/cpupower/utils/cpufreq-info.c    |  9 ++++--
 tools/power/cpupower/utils/helpers/amd.c     | 29 ++++++++++++++++++++
 tools/power/cpupower/utils/helpers/helpers.h |  5 ++++
 3 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c
index b429454bf3ae..235243ec5ce0 100644
--- a/tools/power/cpupower/utils/cpufreq-info.c
+++ b/tools/power/cpupower/utils/cpufreq-info.c
@@ -146,9 +146,12 @@ static int get_boost_mode_x86(unsigned int cpu)
 	printf(_("    Supported: %s\n"), support ? _("yes") : _("no"));
 	printf(_("    Active: %s\n"), active ? _("yes") : _("no"));
 
-	if ((cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
-	     cpupower_cpu_info.family >= 0x10) ||
-	     cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
+	if (cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
+	    cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) {
+		return 0;
+	} else if ((cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
+		    cpupower_cpu_info.family >= 0x10) ||
+		   cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
 		ret = decode_pstates(cpu, b_states, pstates, &pstate_no);
 		if (ret)
 			return ret;
diff --git a/tools/power/cpupower/utils/helpers/amd.c b/tools/power/cpupower/utils/helpers/amd.c
index f5ba528dc7db..c519cc89c97f 100644
--- a/tools/power/cpupower/utils/helpers/amd.c
+++ b/tools/power/cpupower/utils/helpers/amd.c
@@ -193,5 +193,34 @@ void amd_pstate_boost_init(unsigned int cpu, int *support, int *active)
 	*active = cpuinfo_max == amd_pstate_max ? 1 : 0;
 }
 
+void amd_pstate_show_perf_and_freq(unsigned int cpu, int no_rounding)
+{
+	printf(_("    AMD PSTATE Highest Performance: %lu. Maximum Frequency: "),
+	       amd_pstate_get_data(cpu, AMD_PSTATE_HIGHEST_PERF));
+	/*
+	 * If boost isn't active, the cpuinfo_max doesn't indicate real max
+	 * frequency. So we read it back from amd-pstate sysfs entry.
+	 */
+	print_speed(amd_pstate_get_data(cpu, AMD_PSTATE_MAX_FREQ), no_rounding);
+	printf(".\n");
+
+	printf(_("    AMD PSTATE Nominal Performance: %lu. Nominal Frequency: "),
+	       acpi_cppc_get_data(cpu, NOMINAL_PERF));
+	print_speed(acpi_cppc_get_data(cpu, NOMINAL_FREQ) * 1000,
+		    no_rounding);
+	printf(".\n");
+
+	printf(_("    AMD PSTATE Lowest Non-linear Performance: %lu. Lowest Non-linear Frequency: "),
+	       acpi_cppc_get_data(cpu, LOWEST_NONLINEAR_PERF));
+	print_speed(amd_pstate_get_data(cpu, AMD_PSTATE_LOWEST_NONLINEAR_FREQ),
+		    no_rounding);
+	printf(".\n");
+
+	printf(_("    AMD PSTATE Lowest Performance: %lu. Lowest Frequency: "),
+	       acpi_cppc_get_data(cpu, LOWEST_PERF));
+	print_speed(acpi_cppc_get_data(cpu, LOWEST_FREQ) * 1000, no_rounding);
+	printf(".\n");
+}
+
 /* AMD P-State Helper Functions ************************************/
 #endif /* defined(__i386__) || defined(__x86_64__) */
diff --git a/tools/power/cpupower/utils/helpers/helpers.h b/tools/power/cpupower/utils/helpers/helpers.h
index fa2a8c1b1d26..96e4bede078b 100644
--- a/tools/power/cpupower/utils/helpers/helpers.h
+++ b/tools/power/cpupower/utils/helpers/helpers.h
@@ -142,6 +142,8 @@ extern int cpufreq_has_boost_support(unsigned int cpu, int *support,
 bool cpupower_amd_pstate_enabled(void);
 void amd_pstate_boost_init(unsigned int cpu,
 			   int *support, int *active);
+void amd_pstate_show_perf_and_freq(unsigned int cpu,
+				   int no_rounding);
 
 /* AMD P-State stuff **************************/
 
@@ -182,6 +184,9 @@ static inline bool cpupower_amd_pstate_enabled(void)
 static inline void amd_pstate_boost_init(unsigned int cpu, int *support,
 					 int *active)
 {}
+static inline void amd_pstate_show_perf_and_freq(unsigned int cpu,
+						 int no_rounding)
+{}
 
 /* cpuid and cpuinfo helpers  **************************/
 
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (8 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 09/10] cpupower: Add function to print AMD P-State performance capabilities Huang Rui
@ 2022-02-22 15:34 ` Huang Rui
  2022-02-23  3:37   ` Huang Rui
  2022-02-23  1:44 ` [PATCH v7 00/10] cpupower: Add AMD P-State Support Shuah Khan
  10 siblings, 1 reply; 14+ messages in thread
From: Huang Rui @ 2022-02-22 15:34 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Huang Rui

Add "-r --perf" option in cpupower-frequency-info to get the performance
and frequency values for AMD P-State.

Signed-off-by: Huang Rui <ray.huang@amd.com>
---
 .../cpupower/man/cpupower-frequency-info.1    |  3 +++
 tools/power/cpupower/utils/cpufreq-info.c     | 19 ++++++++++++++++++-
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/tools/power/cpupower/man/cpupower-frequency-info.1 b/tools/power/cpupower/man/cpupower-frequency-info.1
index 6aa8d239dff9..dd545b499480 100644
--- a/tools/power/cpupower/man/cpupower-frequency-info.1
+++ b/tools/power/cpupower/man/cpupower-frequency-info.1
@@ -53,6 +53,9 @@ human\-readable output for the \-f, \-w, \-s and \-y parameters.
 \fB\-n\fR \fB\-\-no-rounding\fR
 Output frequencies and latencies without rounding off values.
 .TP  
+\fB\-c\fR \fB\-\-perf\fR
+Get performances and frequencies capabilities of CPPC, by reading it from hardware (only available on the hardware with CPPC).
+.TP
 .SH "REMARKS"
 .LP 
 By default only values of core zero are displayed. How to display settings of
diff --git a/tools/power/cpupower/utils/cpufreq-info.c b/tools/power/cpupower/utils/cpufreq-info.c
index 235243ec5ce0..0646f615fe2d 100644
--- a/tools/power/cpupower/utils/cpufreq-info.c
+++ b/tools/power/cpupower/utils/cpufreq-info.c
@@ -438,6 +438,17 @@ static int get_latency(unsigned int cpu, unsigned int human)
 	return 0;
 }
 
+/* --performance / -c */
+
+static int get_perf_cap(unsigned int cpu)
+{
+	if (cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
+	    cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE)
+		amd_pstate_show_perf_and_freq(cpu, no_rounding);
+
+	return 0;
+}
+
 static void debug_output_one(unsigned int cpu)
 {
 	struct cpufreq_available_frequencies *freqs;
@@ -466,6 +477,7 @@ static void debug_output_one(unsigned int cpu)
 	if (get_freq_hardware(cpu, 1) < 0)
 		get_freq_kernel(cpu, 1);
 	get_boost_mode(cpu);
+	get_perf_cap(cpu);
 }
 
 static struct option info_opts[] = {
@@ -484,6 +496,7 @@ static struct option info_opts[] = {
 	{"proc",	 no_argument,		 NULL,	 'o'},
 	{"human",	 no_argument,		 NULL,	 'm'},
 	{"no-rounding", no_argument,	 NULL,	 'n'},
+	{"performance", no_argument,	 NULL,	 'c'},
 	{ },
 };
 
@@ -497,7 +510,7 @@ int cmd_freq_info(int argc, char **argv)
 	int output_param = 0;
 
 	do {
-		ret = getopt_long(argc, argv, "oefwldpgrasmybn", info_opts,
+		ret = getopt_long(argc, argv, "oefwldpgrasmybnc", info_opts,
 				  NULL);
 		switch (ret) {
 		case '?':
@@ -520,6 +533,7 @@ int cmd_freq_info(int argc, char **argv)
 		case 'e':
 		case 's':
 		case 'y':
+		case 'c':
 			if (output_param) {
 				output_param = -1;
 				cont = 0;
@@ -626,6 +640,9 @@ int cmd_freq_info(int argc, char **argv)
 		case 'y':
 			ret = get_latency(cpu, human);
 			break;
+		case 'c':
+			ret = get_perf_cap(cpu);
+			break;
 		}
 		if (ret)
 			return ret;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [PATCH v7 00/10] cpupower: Add AMD P-State Support
  2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
                   ` (9 preceding siblings ...)
  2022-02-22 15:34 ` [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information Huang Rui
@ 2022-02-23  1:44 ` Shuah Khan
  10 siblings, 0 replies; 14+ messages in thread
From: Shuah Khan @ 2022-02-23  1:44 UTC (permalink / raw)
  To: Huang Rui, Rafael J . Wysocki, linux-pm
  Cc: Deepak Sharma, Alex Deucher, Mario Limonciello, Steven Noonan,
	Nathan Fontenot, Jinzhou Su, Xiaojian Du, Perry Yuan,
	Jassmine Meng, Borislav Petkov, Peter Zijlstra, Ingo Molnar,
	Viresh Kumar, Steven Rostedt, Giovanni Gherdovich, linux-kernel,
	Shuah Khan

On 2/22/22 8:34 AM, Huang Rui wrote:
> Hi Shuah,
> 
> Since AMD P-State kernel is merged into 5.17-rc1, I would like to continue
> revising the AMD P-State support for the CPUPower tool. These series are
> rebased on latest bleeding-edge, any comments are warm for me.
> 
> See patch series of CPUPower in below git repo:
> V1: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v1
> V2: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v2
> V3: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v3
> V4: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v4
> V5: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=amd-pstate-dev-v5
> V6: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=cpupower-amd-pstate
> V7: https://git.kernel.org/pub/scm/linux/kernel/git/rui/linux.git/log/?h=cpupower-amd-pstate-v7
> 

> 
> Changes from V6 -> V7:
> - Fix the checkpatch warnings and errors.
> - Revise the patch 9 to move the AMD P-State information prints out of
>    boost function.
> - Add a new option to print the performance and frequency capabilities of
>    CPPC, and add related description in manpage documentation.
> 
>

Thank you. Applied to  https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux.git
cpupower branch for Linux 5.18-rc1

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information
  2022-02-22 15:34 ` [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information Huang Rui
@ 2022-02-23  3:37   ` Huang Rui
  2022-02-24  0:55     ` Shuah Khan
  0 siblings, 1 reply; 14+ messages in thread
From: Huang Rui @ 2022-02-23  3:37 UTC (permalink / raw)
  To: Shuah Khan, Rafael J . Wysocki, linux-pm
  Cc: Sharma, Deepak, Deucher, Alexander, Limonciello, Mario,
	Steven Noonan, Fontenot, Nathan, Su, Jinzhou (Joe),
	Du, Xiaojian, Yuan, Perry, Meng, Li (Jassmine),
	Borislav Petkov, Peter Zijlstra, Ingo Molnar, Viresh Kumar,
	Steven Rostedt, Giovanni Gherdovich, linux-kernel

On Tue, Feb 22, 2022 at 11:34:26PM +0800, Huang, Ray wrote:
> Add "-r --perf" option in cpupower-frequency-info to get the performance

Thanks Shuah! There is one typo ("-r --perf" --> "-c --perf") here. Because
"r" is occupied by option character. Would you mind to correct it in the
commit log?

Best Regards,
Ray

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information
  2022-02-23  3:37   ` Huang Rui
@ 2022-02-24  0:55     ` Shuah Khan
  0 siblings, 0 replies; 14+ messages in thread
From: Shuah Khan @ 2022-02-24  0:55 UTC (permalink / raw)
  To: Huang Rui, Rafael J . Wysocki, linux-pm
  Cc: Sharma, Deepak, Deucher, Alexander, Limonciello, Mario,
	Steven Noonan, Fontenot, Nathan, Su, Jinzhou (Joe),
	Du, Xiaojian, Yuan, Perry, Meng, Li (Jassmine),
	Borislav Petkov, Peter Zijlstra, Ingo Molnar, Viresh Kumar,
	Steven Rostedt, Giovanni Gherdovich, linux-kernel, Shuah Khan

On 2/22/22 8:37 PM, Huang Rui wrote:
> On Tue, Feb 22, 2022 at 11:34:26PM +0800, Huang, Ray wrote:
>> Add "-r --perf" option in cpupower-frequency-info to get the performance
> 
> Thanks Shuah! There is one typo ("-r --perf" --> "-c --perf") here. Because
> "r" is occupied by option character. Would you mind to correct it in the
> commit log?
> 

Done. Commit amended in
https://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux.git
cpupower branch for Linux 5.18-rc1

thanks,
-- Shuah

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2022-02-24  1:53 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-22 15:34 [PATCH v7 00/10] cpupower: Add AMD P-State Support Huang Rui
2022-02-22 15:34 ` [PATCH v7 01/10] cpupower: Add AMD P-State capability flag Huang Rui
2022-02-22 15:34 ` [PATCH v7 02/10] cpupower: Add the function to check AMD P-State enabled Huang Rui
2022-02-22 15:34 ` [PATCH v7 03/10] cpupower: Initial AMD P-State capability Huang Rui
2022-02-22 15:34 ` [PATCH v7 04/10] cpupower: Add the function to get the sysfs value from specific table Huang Rui
2022-02-22 15:34 ` [PATCH v7 05/10] cpupower: Introduce ACPI CPPC library Huang Rui
2022-02-22 15:34 ` [PATCH v7 06/10] cpupower: Add AMD P-State sysfs definition and access helper Huang Rui
2022-02-22 15:34 ` [PATCH v7 07/10] cpupower: Enable boost state support for AMD P-State module Huang Rui
2022-02-22 15:34 ` [PATCH v7 08/10] cpupower: Move print_speed function into misc helper Huang Rui
2022-02-22 15:34 ` [PATCH v7 09/10] cpupower: Add function to print AMD P-State performance capabilities Huang Rui
2022-02-22 15:34 ` [PATCH v7 10/10] cpupower: Add "perf" option to print AMD P-State information Huang Rui
2022-02-23  3:37   ` Huang Rui
2022-02-24  0:55     ` Shuah Khan
2022-02-23  1:44 ` [PATCH v7 00/10] cpupower: Add AMD P-State Support Shuah Khan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.