Commit 995d5f64 authored by Pu Wen's avatar Pu Wen Committed by Borislav Petkov
Browse files

tools/cpupower: Add Hygon Dhyana support



The tool cpupower is useful to get CPU frequency information and monitor
power stats on the Hygon Dhyana platform. So add Hygon Dhyana support to
it by checking vendor and family to share the code path of AMD family
17h.

Signed-off-by: default avatarPu Wen <puwen@hygon.cn>
Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
Acked-by: default avatarShuah Khan (Samsung OSG) <shuah@kernel.org>
CC: Prarit Bhargava <prarit@redhat.com>
CC: Shuah Khan <shuah@kernel.org>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Thomas Renninger <trenn@suse.com>
CC: linux-pm@vger.kernel.org
Link: http://lkml.kernel.org/r/5ce86123a7b9dad925ac583d88d2f921040e859b.1538583282.git.puwen@hygon.cn
parent cc9690cf
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -170,6 +170,7 @@ static int get_boost_mode(unsigned int cpu)
	unsigned long pstates[MAX_HW_PSTATES] = {0,};

	if (cpupower_cpu_info.vendor != X86_VENDOR_AMD &&
	    cpupower_cpu_info.vendor != X86_VENDOR_HYGON &&
	    cpupower_cpu_info.vendor != X86_VENDOR_INTEL)
		return 0;

@@ -190,8 +191,9 @@ static int get_boost_mode(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) {
	if ((cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
	     cpupower_cpu_info.family >= 0x10) ||
	     cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
		ret = decode_pstates(cpu, cpupower_cpu_info.family, b_states,
				     pstates, &pstate_no);
		if (ret)
+2 −2
Original line number Diff line number Diff line
@@ -45,7 +45,7 @@ static int get_did(int family, union msr_pstate pstate)

	if (family == 0x12)
		t = pstate.val & 0xf;
	else if (family == 0x17)
	else if (family == 0x17 || family == 0x18)
		t = pstate.fam17h_bits.did;
	else
		t = pstate.bits.did;
@@ -59,7 +59,7 @@ static int get_cof(int family, union msr_pstate pstate)
	int fid, did, cof;

	did = get_did(family, pstate);
	if (family == 0x17) {
	if (family == 0x17 || family == 0x18) {
		fid = pstate.fam17h_bits.fid;
		cof = 200 * fid / did;
	} else {
+5 −3
Original line number Diff line number Diff line
@@ -8,7 +8,7 @@
#include "helpers/helpers.h"

static const char *cpu_vendor_table[X86_VENDOR_MAX] = {
	"Unknown", "GenuineIntel", "AuthenticAMD",
	"Unknown", "GenuineIntel", "AuthenticAMD", "HygonGenuine",
};

#if defined(__i386__) || defined(__x86_64__)
@@ -109,6 +109,7 @@ out:
	fclose(fp);
	/* Get some useful CPU capabilities from cpuid */
	if (cpu_info->vendor != X86_VENDOR_AMD &&
	    cpu_info->vendor != X86_VENDOR_HYGON &&
	    cpu_info->vendor != X86_VENDOR_INTEL)
		return ret;

@@ -124,8 +125,9 @@ out:
	if (cpuid_level >= 6 && (cpuid_ecx(6) & 0x1))
		cpu_info->caps |= CPUPOWER_CAP_APERF;

	/* AMD Boost state enable/disable register */
	if (cpu_info->vendor == X86_VENDOR_AMD) {
	/* AMD or Hygon Boost state enable/disable register */
	if (cpu_info->vendor == X86_VENDOR_AMD ||
	    cpu_info->vendor == X86_VENDOR_HYGON) {
		if (ext_cpuid_level >= 0x80000007 &&
		    (cpuid_edx(0x80000007) & (1 << 9)))
			cpu_info->caps |= CPUPOWER_CAP_AMD_CBP;
+1 −1
Original line number Diff line number Diff line
@@ -61,7 +61,7 @@ extern int be_verbose;

/* cpuid and cpuinfo helpers  **************************/
enum cpupower_cpu_vendor {X86_VENDOR_UNKNOWN = 0, X86_VENDOR_INTEL,
			  X86_VENDOR_AMD, X86_VENDOR_MAX};
			  X86_VENDOR_AMD, X86_VENDOR_HYGON, X86_VENDOR_MAX};

#define CPUPOWER_CAP_INV_TSC		0x00000001
#define CPUPOWER_CAP_APERF		0x00000002
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
		 * has Hardware determined variable increments instead.
		 */

		if (cpu_info.family == 0x17) {
		if (cpu_info.family == 0x17 || cpu_info.family == 0x18) {
			if (!read_msr(cpu, MSR_AMD_HWCR, &val)) {
				if (!(val & CPUPOWER_AMD_CPBDIS))
					*active = 1;
Loading