提交 ec3c44ff 编写于 作者: P Pu Wen 提交者: Caspar Zhang

HYGON: tools/cpupower: Add Hygon Dhyana support

commit 995d5f64b62f20f05b8e0972f07ec4d6c23333c9 upstream.

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: NPu Wen <puwen@hygon.cn>
Signed-off-by: NBorislav Petkov <bp@suse.de>
Acked-by: NShuah 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.cnAcked-by: NCaspar Zhang <caspar@linux.alibaba.com>
上级 4ed05f02
...@@ -170,6 +170,7 @@ static int get_boost_mode(unsigned int cpu) ...@@ -170,6 +170,7 @@ static int get_boost_mode(unsigned int cpu)
unsigned long pstates[MAX_HW_PSTATES] = {0,}; unsigned long pstates[MAX_HW_PSTATES] = {0,};
if (cpupower_cpu_info.vendor != X86_VENDOR_AMD && if (cpupower_cpu_info.vendor != X86_VENDOR_AMD &&
cpupower_cpu_info.vendor != X86_VENDOR_HYGON &&
cpupower_cpu_info.vendor != X86_VENDOR_INTEL) cpupower_cpu_info.vendor != X86_VENDOR_INTEL)
return 0; return 0;
...@@ -190,8 +191,9 @@ static int get_boost_mode(unsigned int cpu) ...@@ -190,8 +191,9 @@ static int get_boost_mode(unsigned int cpu)
printf(_(" Supported: %s\n"), support ? _("yes") : _("no")); printf(_(" Supported: %s\n"), support ? _("yes") : _("no"));
printf(_(" Active: %s\n"), active ? _("yes") : _("no")); printf(_(" Active: %s\n"), active ? _("yes") : _("no"));
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD && if ((cpupower_cpu_info.vendor == X86_VENDOR_AMD &&
cpupower_cpu_info.family >= 0x10) { cpupower_cpu_info.family >= 0x10) ||
cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
ret = decode_pstates(cpu, cpupower_cpu_info.family, b_states, ret = decode_pstates(cpu, cpupower_cpu_info.family, b_states,
pstates, &pstate_no); pstates, &pstate_no);
if (ret) if (ret)
......
...@@ -45,7 +45,7 @@ static int get_did(int family, union msr_pstate pstate) ...@@ -45,7 +45,7 @@ static int get_did(int family, union msr_pstate pstate)
if (family == 0x12) if (family == 0x12)
t = pstate.val & 0xf; t = pstate.val & 0xf;
else if (family == 0x17) else if (family == 0x17 || family == 0x18)
t = pstate.fam17h_bits.did; t = pstate.fam17h_bits.did;
else else
t = pstate.bits.did; t = pstate.bits.did;
...@@ -59,7 +59,7 @@ static int get_cof(int family, union msr_pstate pstate) ...@@ -59,7 +59,7 @@ static int get_cof(int family, union msr_pstate pstate)
int fid, did, cof; int fid, did, cof;
did = get_did(family, pstate); did = get_did(family, pstate);
if (family == 0x17) { if (family == 0x17 || family == 0x18) {
fid = pstate.fam17h_bits.fid; fid = pstate.fam17h_bits.fid;
cof = 200 * fid / did; cof = 200 * fid / did;
} else { } else {
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
#include "helpers/helpers.h" #include "helpers/helpers.h"
static const char *cpu_vendor_table[X86_VENDOR_MAX] = { static const char *cpu_vendor_table[X86_VENDOR_MAX] = {
"Unknown", "GenuineIntel", "AuthenticAMD", "Unknown", "GenuineIntel", "AuthenticAMD", "HygonGenuine",
}; };
#if defined(__i386__) || defined(__x86_64__) #if defined(__i386__) || defined(__x86_64__)
...@@ -109,6 +109,7 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info) ...@@ -109,6 +109,7 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info)
fclose(fp); fclose(fp);
/* Get some useful CPU capabilities from cpuid */ /* Get some useful CPU capabilities from cpuid */
if (cpu_info->vendor != X86_VENDOR_AMD && if (cpu_info->vendor != X86_VENDOR_AMD &&
cpu_info->vendor != X86_VENDOR_HYGON &&
cpu_info->vendor != X86_VENDOR_INTEL) cpu_info->vendor != X86_VENDOR_INTEL)
return ret; return ret;
...@@ -124,8 +125,9 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info) ...@@ -124,8 +125,9 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info)
if (cpuid_level >= 6 && (cpuid_ecx(6) & 0x1)) if (cpuid_level >= 6 && (cpuid_ecx(6) & 0x1))
cpu_info->caps |= CPUPOWER_CAP_APERF; cpu_info->caps |= CPUPOWER_CAP_APERF;
/* AMD Boost state enable/disable register */ /* AMD or Hygon Boost state enable/disable register */
if (cpu_info->vendor == X86_VENDOR_AMD) { if (cpu_info->vendor == X86_VENDOR_AMD ||
cpu_info->vendor == X86_VENDOR_HYGON) {
if (ext_cpuid_level >= 0x80000007 && if (ext_cpuid_level >= 0x80000007 &&
(cpuid_edx(0x80000007) & (1 << 9))) (cpuid_edx(0x80000007) & (1 << 9)))
cpu_info->caps |= CPUPOWER_CAP_AMD_CBP; cpu_info->caps |= CPUPOWER_CAP_AMD_CBP;
......
...@@ -61,7 +61,7 @@ extern int be_verbose; ...@@ -61,7 +61,7 @@ extern int be_verbose;
/* cpuid and cpuinfo helpers **************************/ /* cpuid and cpuinfo helpers **************************/
enum cpupower_cpu_vendor {X86_VENDOR_UNKNOWN = 0, X86_VENDOR_INTEL, 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_INV_TSC 0x00000001
#define CPUPOWER_CAP_APERF 0x00000002 #define CPUPOWER_CAP_APERF 0x00000002
......
...@@ -26,7 +26,7 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active, ...@@ -26,7 +26,7 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
* has Hardware determined variable increments instead. * 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 (!read_msr(cpu, MSR_AMD_HWCR, &val)) {
if (!(val & CPUPOWER_AMD_CPBDIS)) if (!(val & CPUPOWER_AMD_CPBDIS))
*active = 1; *active = 1;
......
...@@ -241,7 +241,8 @@ static int init_maxfreq_mode(void) ...@@ -241,7 +241,8 @@ static int init_maxfreq_mode(void)
if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_INV_TSC)) if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_INV_TSC))
goto use_sysfs; goto use_sysfs;
if (cpupower_cpu_info.vendor == X86_VENDOR_AMD) { if (cpupower_cpu_info.vendor == X86_VENDOR_AMD ||
cpupower_cpu_info.vendor == X86_VENDOR_HYGON) {
/* MSR_AMD_HWCR tells us whether TSC runs at P0/mperf /* MSR_AMD_HWCR tells us whether TSC runs at P0/mperf
* freq. * freq.
* A test whether hwcr is accessable/available would be: * A test whether hwcr is accessable/available would be:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册