]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
tools/cpupower: Add Hygon Dhyana support
authorPu Wen <puwen@hygon.cn>
Thu, 4 Oct 2018 01:21:43 +0000 (09:21 +0800)
committerBorislav Petkov <bp@suse.de>
Thu, 4 Oct 2018 07:57:25 +0000 (09:57 +0200)
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: Pu Wen <puwen@hygon.cn>
Signed-off-by: Borislav Petkov <bp@suse.de>
Acked-by: Shuah 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
tools/power/cpupower/utils/cpufreq-info.c
tools/power/cpupower/utils/helpers/amd.c
tools/power/cpupower/utils/helpers/cpuid.c
tools/power/cpupower/utils/helpers/helpers.h
tools/power/cpupower/utils/helpers/misc.c
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c

index df43cd45d810447a50787c58964515ee79ea226d..56e54eabc65cd69abe0d6258a3c36b1bbaf12b24 100644 (file)
@@ -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)
index bb41cdd0df6bfe527cb956c531250cf5866d5ea9..65beaeefeef047937d6f0c11d76c6ed916d884d2 100644 (file)
@@ -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 {
index 732b0b41ba261664eefb9e862f7a7174bcc9fca0..5cc39d4e23edb29871d72aac9f2361a90f4de0d2 100644 (file)
@@ -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 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info)
        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 @@ int get_cpu_info(struct cpupower_cpu_info *cpu_info)
        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;
index 41da392be448a9abc63ec9032ced298095416bd6..902139689315ef290907d0aa6c30f8bcd30ba5ff 100644 (file)
@@ -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
index 80fdf55f414dce474a87a38606bb83d3d816aaef..f406adc40bad5189529817a4fbb8b8981a5ef4c8 100644 (file)
@@ -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;
index d7c2a6d13dea1a1d4734fb51842eb12b86ef0317..f2a7e9cfd5770f973f681b2ada1b7ed9eeea01cd 100644 (file)
@@ -241,7 +241,8 @@ static int init_maxfreq_mode(void)
        if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_INV_TSC))
                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
                 * freq.
                 * A test whether hwcr is accessable/available would be: