Hello community,

here is the log from the commit of package cpupower for openSUSE:Factory 
checked in at 2019-10-30 14:46:51
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/cpupower (Old)
 and      /work/SRC/openSUSE:Factory/.cpupower.new.2990 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "cpupower"

Wed Oct 30 14:46:51 2019 rev:43 rq:743865 version:5.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/cpupower/cpupower.changes        2019-07-21 
11:33:30.216785821 +0200
+++ /work/SRC/openSUSE:Factory/.cpupower.new.2990/cpupower.changes      
2019-10-30 14:46:56.526126371 +0100
@@ -1,0 +2,5 @@
+Tue Oct 29 15:22:48 UTC 2019 - tr...@suse.de
+
+- Update turbostat to latest version 19.08.31
+
+-------------------------------------------------------------------

Old:
----
  turbostat-19.03.20.tar.bz2

New:
----
  turbostat-19.08.31.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ cpupower.spec ++++++
--- /var/tmp/diff_new_pack.MqXMEk/_old  2019-10-30 14:46:58.566128541 +0100
+++ /var/tmp/diff_new_pack.MqXMEk/_new  2019-10-30 14:46:58.570128544 +0100
@@ -20,7 +20,7 @@
 # Use this as version when things are in mainline kernel
 %define version %(rpm -q --qf '%{VERSION}' kernel-source)
 
-%define tsversion      19.03.20
+%define tsversion      19.08.31
 %define pbversion      17.05.11
 %define ssversion      1.0
 

++++++ cpupower_export_tarball_from_git.sh ++++++
--- /var/tmp/diff_new_pack.MqXMEk/_old  2019-10-30 14:46:58.626128604 +0100
+++ /var/tmp/diff_new_pack.MqXMEk/_new  2019-10-30 14:46:58.626128604 +0100
@@ -89,8 +89,11 @@
     fi
     TURBOSTAT_VERSION=$(echo "-$TURBOSTAT_VERSION")
     mv tools/power/x86/turbostat turbostat${TURBOSTAT_VERSION}
+    git checkout $GIT_TAG include/linux/bits.h
     git checkout $GIT_TAG arch/x86/include/asm/msr-index.h
     git checkout $GIT_TAG arch/x86/include/asm/intel-family.h
+    mkdir -p turbostat${TURBOSTAT_VERSION}/include/linux
+    cp include/linux/bits.h turbostat${TURBOSTAT_VERSION}/include/linux/bits.h
     cp arch/x86/include/asm/intel-family.h turbostat${TURBOSTAT_VERSION}
     cp arch/x86/include/asm/msr-index.h turbostat${TURBOSTAT_VERSION}
     tar -cvjf turbostat${TURBOSTAT_VERSION}.tar.bz2 
turbostat${TURBOSTAT_VERSION}

++++++ intel-speed-select-1.0.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/intel-speed-select-1.0/include/linux/isst_if.h 
new/intel-speed-select-1.0/include/linux/isst_if.h
--- old/intel-speed-select-1.0/include/linux/isst_if.h  2019-07-17 
17:32:14.599763664 +0200
+++ new/intel-speed-select-1.0/include/linux/isst_if.h  2019-10-29 
16:11:15.350429413 +0100
@@ -1,4 +1,4 @@
-/* SPDX-License-Identifier: GPL-2.0 */
+/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
 /*
  * Intel Speed Select Interface: OS to hardware Interface
  * Copyright (c) 2019, Intel Corporation.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/intel-speed-select-1.0/isst-config.c 
new/intel-speed-select-1.0/isst-config.c
--- old/intel-speed-select-1.0/isst-config.c    2019-07-17 00:15:29.000000000 
+0200
+++ new/intel-speed-select-1.0/isst-config.c    2019-10-28 21:05:03.000000000 
+0100
@@ -38,6 +38,7 @@
 static unsigned long long fact_trl;
 static int out_format_json;
 static int cmd_help;
+static int force_online_offline;
 
 /* clos related */
 static int current_clos = -1;
@@ -138,14 +139,14 @@
 int get_physical_package_id(int cpu)
 {
        return parse_int_file(
-               1, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",
+               0, "/sys/devices/system/cpu/cpu%d/topology/physical_package_id",
                cpu);
 }
 
 int get_physical_core_id(int cpu)
 {
        return parse_int_file(
-               1, "/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
+               0, "/sys/devices/system/cpu/cpu%d/topology/core_id", cpu);
 }
 
 int get_physical_die_id(int cpu)
@@ -165,6 +166,26 @@
        return topo_max_cpus;
 }
 
+static void set_cpu_online_offline(int cpu, int state)
+{
+       char buffer[128];
+       int fd;
+
+       snprintf(buffer, sizeof(buffer),
+                "/sys/devices/system/cpu/cpu%d/online", cpu);
+
+       fd = open(buffer, O_WRONLY);
+       if (fd < 0)
+               err(-1, "%s open failed", buffer);
+
+       if (state)
+               write(fd, "1\n", 2);
+       else
+               write(fd, "0\n", 2);
+
+       close(fd);
+}
+
 #define MAX_PACKAGE_COUNT 8
 #define MAX_DIE_PER_PACKAGE 2
 static void for_each_online_package_in_set(void (*callback)(int, void *, void 
*,
@@ -304,7 +325,7 @@
 int get_cpu_count(int pkg_id, int die_id)
 {
        if (pkg_id < MAX_PACKAGE_COUNT && die_id < MAX_DIE_PER_PACKAGE)
-               return cpu_cnt[pkg_id][die_id] + 1;
+               return cpu_cnt[pkg_id][die_id];
 
        return 0;
 }
@@ -402,6 +423,9 @@
                        int j;
 
                        for (j = 0; j < topo_max_cpus; ++j) {
+                               if (!CPU_ISSET_S(j, present_cpumask_size, 
present_cpumask))
+                                       continue;
+
                                if (cpu_map[j].pkg_id == pkg_id &&
                                    cpu_map[j].die_id == die_id &&
                                    cpu_map[j].punit_cpu_core == i) {
@@ -484,7 +508,7 @@
                int write = 0;
                int clos_id, core_id, ret = 0;
 
-               debug_printf("CLOS %d\n", cpu);
+               debug_printf("CPU %d\n", cpu);
 
                if (parameter & BIT(MBOX_CMD_WRITE_BIT)) {
                        value = req_data;
@@ -603,6 +627,10 @@
 
        close(fd);
 
+       if (isst_platform_info.api_version > supported_api_ver) {
+               printf("Incompatible API versions; Upgrade of tool is 
required\n");
+               return -1;
+       }
        return 0;
 }
 
@@ -645,8 +673,8 @@
        if (ret)
                perror("get_tdp_*");
        else
-               isst_display_result(cpu, outf, "perf-profile", (char *)arg3,
-                                   *(unsigned int *)arg4);
+               isst_ctdp_display_core_info(cpu, outf, arg3,
+                                           *(unsigned int *)arg4);
 }
 
 #define _get_tdp_level(desc, suffix, object, help)                             
   \
@@ -729,9 +757,34 @@
        ret = isst_set_tdp_level(cpu, tdp_level);
        if (ret)
                perror("set_tdp_level_for_cpu");
-       else
+       else {
                isst_display_result(cpu, outf, "perf-profile", "set_tdp_level",
                                    ret);
+               if (force_online_offline) {
+                       struct isst_pkg_ctdp_level_info ctdp_level;
+                       int pkg_id = get_physical_package_id(cpu);
+                       int die_id = get_physical_die_id(cpu);
+
+                       fprintf(stderr, "Option is set to online/offline\n");
+                       ctdp_level.core_cpumask_size =
+                               alloc_cpu_set(&ctdp_level.core_cpumask);
+                       isst_get_coremask_info(cpu, tdp_level, &ctdp_level);
+                       if (ctdp_level.cpu_count) {
+                               int i, max_cpus = get_topo_max_cpus();
+                               for (i = 0; i < max_cpus; ++i) {
+                                       if (pkg_id != 
get_physical_package_id(i) || die_id != get_physical_die_id(i))
+                                               continue;
+                                       if (CPU_ISSET_S(i, 
ctdp_level.core_cpumask_size, ctdp_level.core_cpumask)) {
+                                               fprintf(stderr, "online cpu 
%d\n", i);
+                                               set_cpu_online_offline(i, 1);
+                                       } else {
+                                               fprintf(stderr, "offline cpu 
%d\n", i);
+                                               set_cpu_online_offline(i, 0);
+                                       }
+                               }
+                       }
+               }
+       }
 }
 
 static void set_tdp_level(void)
@@ -740,6 +793,8 @@
                fprintf(stderr, "Set Config TDP level\n");
                fprintf(stderr,
                        "\t Arguments: -l|--level : Specify tdp level\n");
+               fprintf(stderr,
+                       "\t Optional Arguments: -o | online : online/offline 
for the tdp level\n");
                exit(0);
        }
 
@@ -1078,6 +1133,40 @@
        isst_ctdp_display_information_end(outf);
 }
 
+static void get_clos_info_for_cpu(int cpu, void *arg1, void *arg2, void *arg3,
+                                 void *arg4)
+{
+       int enable, ret, prio_type;
+
+       ret = isst_clos_get_clos_information(cpu, &enable, &prio_type);
+       if (ret)
+               perror("isst_clos_get_info");
+       else
+               isst_clos_display_clos_information(cpu, outf, enable, 
prio_type);
+}
+
+static void dump_clos_info(void)
+{
+       if (cmd_help) {
+               fprintf(stderr,
+                       "Print Intel Speed Select Technology core power 
information\n");
+               fprintf(stderr, "\tSpecify targeted cpu id with [--cpu|-c]\n");
+               exit(0);
+       }
+
+       if (!max_target_cpus) {
+               fprintf(stderr,
+                       "Invalid target cpu. Specify with [-c|--cpu]\n");
+               exit(0);
+       }
+
+       isst_ctdp_display_information_start(outf);
+       for_each_online_target_cpu_in_set(get_clos_info_for_cpu, NULL,
+                                         NULL, NULL, NULL);
+       isst_ctdp_display_information_end(outf);
+
+}
+
 static void set_clos_config_for_cpu(int cpu, void *arg1, void *arg2, void 
*arg3,
                                    void *arg4)
 {
@@ -1194,7 +1283,7 @@
        if (ret)
                perror("isst_clos_get_assoc_status");
        else
-               isst_display_result(cpu, outf, "core-power", "get-assoc", clos);
+               isst_clos_display_assoc_information(cpu, outf, clos);
 }
 
 static void get_clos_assoc(void)
@@ -1204,13 +1293,17 @@
                fprintf(stderr, "\tSpecify targeted cpu id with [--cpu|-c]\n");
                exit(0);
        }
-       if (max_target_cpus)
-               for_each_online_target_cpu_in_set(get_clos_assoc_for_cpu, NULL,
-                                                 NULL, NULL, NULL);
-       else {
+
+       if (!max_target_cpus) {
                fprintf(stderr,
                        "Invalid target cpu. Specify with [-c|--cpu]\n");
+               exit(0);
        }
+
+       isst_ctdp_display_information_start(outf);
+       for_each_online_target_cpu_in_set(get_clos_assoc_for_cpu, NULL,
+                                         NULL, NULL, NULL);
+       isst_ctdp_display_information_end(outf);
 }
 
 static struct process_cmd_struct isst_cmds[] = {
@@ -1227,10 +1320,11 @@
        { "turbo-freq", "info", dump_fact_config },
        { "turbo-freq", "enable", set_fact_enable },
        { "turbo-freq", "disable", set_fact_disable },
-       { "core-power", "info", dump_clos_config },
+       { "core-power", "info", dump_clos_info },
        { "core-power", "enable", set_clos_enable },
        { "core-power", "disable", set_clos_disable },
        { "core-power", "config", set_clos_config },
+       { "core-power", "get-config", dump_clos_config },
        { "core-power", "assoc", set_clos_assoc },
        { "core-power", "get-assoc", get_clos_assoc },
        { NULL, NULL, NULL }
@@ -1312,6 +1406,7 @@
        static struct option long_options[] = {
                { "bucket", required_argument, 0, 'b' },
                { "level", required_argument, 0, 'l' },
+               { "online", required_argument, 0, 'o' },
                { "trl-type", required_argument, 0, 'r' },
                { "trl", required_argument, 0, 't' },
                { "help", no_argument, 0, 'h' },
@@ -1328,7 +1423,7 @@
        option_index = start;
 
        optind = start + 1;
-       while ((opt = getopt_long(argc, argv, "b:l:t:c:d:e:n:m:p:w:h",
+       while ((opt = getopt_long(argc, argv, "b:l:t:c:d:e:n:m:p:w:ho",
                                  long_options, &option_index)) != -1) {
                switch (opt) {
                case 'b':
@@ -1340,6 +1435,9 @@
                case 'l':
                        tdp_level = atoi(optarg);
                        break;
+               case 'o':
+                       force_online_offline = 1;
+                       break;
                case 't':
                        sscanf(optarg, "0x%llx", &fact_trl);
                        break;
@@ -1358,7 +1456,6 @@
                /* CLOS related */
                case 'c':
                        current_clos = atoi(optarg);
-                       printf("clos %d\n", current_clos);
                        break;
                case 'd':
                        clos_desired = atoi(optarg);
@@ -1429,6 +1526,7 @@
        printf("\tenable\n");
        printf("\tdisable\n");
        printf("\tconfig\n");
+       printf("\tget-config\n");
        printf("\tassoc\n");
        printf("\tget-assoc\n");
 }
@@ -1491,7 +1589,7 @@
        printf("intel-speed-select [OPTIONS] FEATURE COMMAND 
COMMAND_ARGUMENTS\n");
        printf("\nUse this tool to enumerate and control the Intel Speed Select 
Technology features,\n");
        printf("\nFEATURE : [perf-profile|base-freq|turbo-freq|core-power]\n");
-       printf("\nFor help on each feature, use --h|--help\n");
+       printf("\nFor help on each feature, use -h|--help\n");
        printf("\tFor example:  intel-speed-select perf-profile -h\n");
 
        printf("\nFor additional help on each command for a feature, use 
--h|--help\n");
@@ -1514,7 +1612,6 @@
        printf("\tResult display uses a common format for each command:\n");
        printf("\tResults are formatted in text/JSON with\n");
        printf("\t\tPackage, Die, CPU, and command specific results.\n");
-       printf("\t\t\tFor Set commands, status is 0 for success and rest for 
failures\n");
        exit(1);
 }
 
@@ -1529,6 +1626,7 @@
 {
        int opt;
        int option_index = 0;
+       int ret;
 
        static struct option long_options[] = {
                { "cpu", required_argument, 0, 'c' },
@@ -1590,13 +1688,14 @@
        set_max_cpu_num();
        set_cpu_present_cpu_mask();
        set_cpu_target_cpu_mask();
-       isst_fill_platform_info();
-       if (isst_platform_info.api_version > supported_api_ver) {
-               printf("Incompatible API versions; Upgrade of tool is 
required\n");
-               exit(0);
-       }
+       ret = isst_fill_platform_info();
+       if (ret)
+               goto out;
 
        process_command(argc, argv);
+out:
+       free_cpu_set(present_cpumask);
+       free_cpu_set(target_cpumask);
 }
 
 int main(int argc, char **argv)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/intel-speed-select-1.0/isst-core.c 
new/intel-speed-select-1.0/isst-core.c
--- old/intel-speed-select-1.0/isst-core.c      2019-07-17 00:15:29.000000000 
+0200
+++ new/intel-speed-select-1.0/isst-core.c      2019-10-28 21:05:03.000000000 
+0100
@@ -188,8 +188,27 @@
        return 0;
 }
 
+int isst_get_trl_bucket_info(int cpu, unsigned long long *buckets_info)
+{
+       int ret;
+
+       debug_printf("cpu:%d bucket info via MSR\n", cpu);
+
+       *buckets_info = 0;
+
+       ret = isst_send_msr_command(cpu, 0x1ae, 0, buckets_info);
+       if (ret)
+               return ret;
+
+       debug_printf("cpu:%d bucket info via MSR successful 0x%llx\n", cpu,
+                    *buckets_info);
+
+       return 0;
+}
+
 int isst_set_tdp_level_msr(int cpu, int tdp_level)
 {
+       unsigned long long level = tdp_level;
        int ret;
 
        debug_printf("cpu: tdp_level via MSR %d\n", cpu, tdp_level);
@@ -202,8 +221,7 @@
        if (tdp_level > 2)
                return -1; /* invalid value */
 
-       ret = isst_send_msr_command(cpu, 0x64b, 1,
-                                   (unsigned long long *)&tdp_level);
+       ret = isst_send_msr_command(cpu, 0x64b, 1, &level);
        if (ret)
                return ret;
 
@@ -563,6 +581,10 @@
                if (ret)
                        return ret;
 
+               ret = isst_get_trl_bucket_info(cpu, &ctdp_level->buckets_info);
+               if (ret)
+                       return ret;
+
                ret = isst_get_get_trl(cpu, i, 0,
                                       ctdp_level->trl_sse_active_cores);
                if (ret)
@@ -596,6 +618,31 @@
 
        return 0;
 }
+
+int isst_clos_get_clos_information(int cpu, int *enable, int *type)
+{
+       unsigned int resp;
+       int ret;
+
+       ret = isst_send_mbox_command(cpu, CONFIG_CLOS, CLOS_PM_QOS_CONFIG, 0, 0,
+                                    &resp);
+       if (ret)
+               return ret;
+
+       debug_printf("cpu:%d CLOS_PM_QOS_CONFIG resp:%x\n", cpu, resp);
+
+       if (resp & BIT(1))
+               *enable = 1;
+       else
+               *enable = 0;
+
+       if (resp & BIT(2))
+               *type = 1;
+       else
+               *type = 0;
+
+       return 0;
+}
 
 int isst_pm_qos_config(int cpu, int enable_clos, int priority_type)
 {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/intel-speed-select-1.0/isst-display.c 
new/intel-speed-select-1.0/isst-display.c
--- old/intel-speed-select-1.0/isst-display.c   2019-07-17 00:15:29.000000000 
+0200
+++ new/intel-speed-select-1.0/isst-display.c   2019-10-28 21:05:03.000000000 
+0100
@@ -6,7 +6,34 @@
 
 #include "isst.h"
 
-#define DISP_FREQ_MULTIPLIER 100000
+#define DISP_FREQ_MULTIPLIER 100
+
+static void printcpulist(int str_len, char *str, int mask_size,
+                        cpu_set_t *cpu_mask)
+{
+       int i, first, curr_index, index;
+
+       if (!CPU_COUNT_S(mask_size, cpu_mask)) {
+               snprintf(str, str_len, "none");
+               return;
+       }
+
+       curr_index = 0;
+       first = 1;
+       for (i = 0; i < get_topo_max_cpus(); ++i) {
+               if (!CPU_ISSET_S(i, mask_size, cpu_mask))
+                       continue;
+               if (!first) {
+                       index = snprintf(&str[curr_index],
+                                        str_len - curr_index, ",");
+                       curr_index += index;
+               }
+               index = snprintf(&str[curr_index], str_len - curr_index, "%d",
+                                i);
+               curr_index += index;
+               first = 0;
+       }
+}
 
 static void printcpumask(int str_len, char *str, int mask_size,
                         cpu_set_t *cpu_mask)
@@ -133,7 +160,7 @@
        last_level = level;
 }
 
-static void print_packag_info(int cpu, FILE *outf)
+static void print_package_info(int cpu, FILE *outf)
 {
        char header[256];
 
@@ -156,7 +183,7 @@
        snprintf(header, sizeof(header), "speed-select-base-freq");
        format_and_print(outf, disp_level, header, NULL);
 
-       snprintf(header, sizeof(header), "high-priority-base-frequency(KHz)");
+       snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
        snprintf(value, sizeof(value), "%d",
                 pbf_info->p1_high * DISP_FREQ_MULTIPLIER);
        format_and_print(outf, disp_level + 1, header, value);
@@ -166,7 +193,13 @@
                     pbf_info->core_cpumask);
        format_and_print(outf, disp_level + 1, header, value);
 
-       snprintf(header, sizeof(header), "low-priority-base-frequency(KHz)");
+       snprintf(header, sizeof(header), "high-priority-cpu-list");
+       printcpulist(sizeof(value), value,
+                    pbf_info->core_cpumask_size,
+                    pbf_info->core_cpumask);
+       format_and_print(outf, disp_level + 1, header, value);
+
+       snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
        snprintf(value, sizeof(value), "%d",
                 pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
        format_and_print(outf, disp_level + 1, header, value);
@@ -209,7 +242,7 @@
 
                if (fact_avx & 0x01) {
                        snprintf(header, sizeof(header),
-                                "high-priority-max-frequency(KHz)");
+                                "high-priority-max-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
                                 bucket_info[j].sse_trl * DISP_FREQ_MULTIPLIER);
                        format_and_print(outf, base_level + 2, header, value);
@@ -217,7 +250,7 @@
 
                if (fact_avx & 0x02) {
                        snprintf(header, sizeof(header),
-                                "high-priority-max-avx2-frequency(KHz)");
+                                "high-priority-max-avx2-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
                                 bucket_info[j].avx_trl * DISP_FREQ_MULTIPLIER);
                        format_and_print(outf, base_level + 2, header, value);
@@ -225,7 +258,7 @@
 
                if (fact_avx & 0x04) {
                        snprintf(header, sizeof(header),
-                                "high-priority-max-avx512-frequency(KHz)");
+                                "high-priority-max-avx512-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
                                 bucket_info[j].avx512_trl *
                                         DISP_FREQ_MULTIPLIER);
@@ -235,25 +268,45 @@
        snprintf(header, sizeof(header),
                 "speed-select-turbo-freq-clip-frequencies");
        format_and_print(outf, base_level + 1, header, NULL);
-       snprintf(header, sizeof(header), "low-priority-max-frequency(KHz)");
+       snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
        snprintf(value, sizeof(value), "%d",
                 fact_info->lp_clipping_ratio_license_sse *
                         DISP_FREQ_MULTIPLIER);
        format_and_print(outf, base_level + 2, header, value);
        snprintf(header, sizeof(header),
-                "low-priority-max-avx2-frequency(KHz)");
+                "low-priority-max-avx2-frequency(MHz)");
        snprintf(value, sizeof(value), "%d",
                 fact_info->lp_clipping_ratio_license_avx2 *
                         DISP_FREQ_MULTIPLIER);
        format_and_print(outf, base_level + 2, header, value);
        snprintf(header, sizeof(header),
-                "low-priority-max-avx512-frequency(KHz)");
+                "low-priority-max-avx512-frequency(MHz)");
        snprintf(value, sizeof(value), "%d",
                 fact_info->lp_clipping_ratio_license_avx512 *
                         DISP_FREQ_MULTIPLIER);
        format_and_print(outf, base_level + 2, header, value);
 }
 
+void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
+                                unsigned int val)
+{
+       char header[256];
+       char value[256];
+
+       snprintf(header, sizeof(header), "package-%d",
+                get_physical_package_id(cpu));
+       format_and_print(outf, 1, header, NULL);
+       snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
+       format_and_print(outf, 2, header, NULL);
+       snprintf(header, sizeof(header), "cpu-%d", cpu);
+       format_and_print(outf, 3, header, NULL);
+
+       snprintf(value, sizeof(value), "%u", val);
+       format_and_print(outf, 4, prefix, value);
+
+       format_and_print(outf, 1, NULL, NULL);
+}
+
 void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
                                   struct isst_pkg_ctdp *pkg_dev)
 {
@@ -261,7 +314,7 @@
        char value[256];
        int i, base_level = 1;
 
-       print_packag_info(cpu, outf);
+       print_package_info(cpu, outf);
 
        for (i = 0; i <= pkg_dev->levels; ++i) {
                struct isst_pkg_ctdp_level_info *ctdp_level;
@@ -287,33 +340,41 @@
                             ctdp_level->core_cpumask);
                format_and_print(outf, base_level + 4, header, value);
 
+               snprintf(header, sizeof(header), "enable-cpu-list");
+               printcpulist(sizeof(value), value,
+                            ctdp_level->core_cpumask_size,
+                            ctdp_level->core_cpumask);
+               format_and_print(outf, base_level + 4, header, value);
+
                snprintf(header, sizeof(header), "thermal-design-power-ratio");
                snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
                format_and_print(outf, base_level + 4, header, value);
 
-               snprintf(header, sizeof(header), "base-frequency(KHz)");
+               snprintf(header, sizeof(header), "base-frequency(MHz)");
                snprintf(value, sizeof(value), "%d",
                         ctdp_level->tdp_ratio * DISP_FREQ_MULTIPLIER);
                format_and_print(outf, base_level + 4, header, value);
 
                snprintf(header, sizeof(header),
-                        "speed-select-turbo-freq-support");
-               snprintf(value, sizeof(value), "%d", ctdp_level->fact_support);
-               format_and_print(outf, base_level + 4, header, value);
-
-               snprintf(header, sizeof(header),
-                        "speed-select-base-freq-support");
-               snprintf(value, sizeof(value), "%d", ctdp_level->pbf_support);
+                        "speed-select-turbo-freq");
+               if (ctdp_level->fact_support) {
+                       if (ctdp_level->fact_enabled)
+                               snprintf(value, sizeof(value), "enabled");
+                       else
+                               snprintf(value, sizeof(value), "disabled");
+               } else
+                       snprintf(value, sizeof(value), "unsupported");
                format_and_print(outf, base_level + 4, header, value);
 
                snprintf(header, sizeof(header),
-                        "speed-select-base-freq-enabled");
-               snprintf(value, sizeof(value), "%d", ctdp_level->pbf_enabled);
-               format_and_print(outf, base_level + 4, header, value);
-
-               snprintf(header, sizeof(header),
-                        "speed-select-turbo-freq-enabled");
-               snprintf(value, sizeof(value), "%d", ctdp_level->fact_enabled);
+                        "speed-select-base-freq");
+               if (ctdp_level->pbf_support) {
+                       if (ctdp_level->pbf_enabled)
+                               snprintf(value, sizeof(value), "enabled");
+                       else
+                               snprintf(value, sizeof(value), "disabled");
+               } else
+                       snprintf(value, sizeof(value), "unsupported");
                format_and_print(outf, base_level + 4, header, value);
 
                snprintf(header, sizeof(header), "thermal-design-power(W)");
@@ -331,12 +392,14 @@
                        format_and_print(outf, base_level + 5, header, NULL);
 
                        snprintf(header, sizeof(header), "core-count");
-                       snprintf(value, sizeof(value), "%d", j);
+                       snprintf(value, sizeof(value), "%llu", 
(ctdp_level->buckets_info >> (j * 8)) & 0xff);
                        format_and_print(outf, base_level + 6, header, value);
 
-                       snprintf(header, sizeof(header), "turbo-ratio");
+                       snprintf(header, sizeof(header),
+                               "max-turbo-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
-                                ctdp_level->trl_sse_active_cores[j]);
+                                ctdp_level->trl_sse_active_cores[j] *
+                                 DISP_FREQ_MULTIPLIER);
                        format_and_print(outf, base_level + 6, header, value);
                }
                snprintf(header, sizeof(header), "turbo-ratio-limits-avx");
@@ -346,12 +409,14 @@
                        format_and_print(outf, base_level + 5, header, NULL);
 
                        snprintf(header, sizeof(header), "core-count");
-                       snprintf(value, sizeof(value), "%d", j);
+                       snprintf(value, sizeof(value), "%llu", 
(ctdp_level->buckets_info >> (j * 8)) & 0xff);
                        format_and_print(outf, base_level + 6, header, value);
 
-                       snprintf(header, sizeof(header), "turbo-ratio");
+                       snprintf(header, sizeof(header),
+                               "max-turbo-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
-                                ctdp_level->trl_avx_active_cores[j]);
+                                ctdp_level->trl_avx_active_cores[j] *
+                                 DISP_FREQ_MULTIPLIER);
                        format_and_print(outf, base_level + 6, header, value);
                }
 
@@ -362,12 +427,14 @@
                        format_and_print(outf, base_level + 5, header, NULL);
 
                        snprintf(header, sizeof(header), "core-count");
-                       snprintf(value, sizeof(value), "%d", j);
+                       snprintf(value, sizeof(value), "%llu", 
(ctdp_level->buckets_info >> (j * 8)) & 0xff);
                        format_and_print(outf, base_level + 6, header, value);
 
-                       snprintf(header, sizeof(header), "turbo-ratio");
+                       snprintf(header, sizeof(header),
+                               "max-turbo-frequency(MHz)");
                        snprintf(value, sizeof(value), "%d",
-                                ctdp_level->trl_avx_512_active_cores[j]);
+                                ctdp_level->trl_avx_512_active_cores[j] *
+                                 DISP_FREQ_MULTIPLIER);
                        format_and_print(outf, base_level + 6, header, value);
                }
                if (ctdp_level->pbf_support)
@@ -397,7 +464,7 @@
 void isst_pbf_display_information(int cpu, FILE *outf, int level,
                                  struct isst_pbf_info *pbf_info)
 {
-       print_packag_info(cpu, outf);
+       print_package_info(cpu, outf);
        _isst_pbf_display_information(cpu, outf, level, pbf_info, 4);
        format_and_print(outf, 1, NULL, NULL);
 }
@@ -406,7 +473,7 @@
                                   int fact_bucket, int fact_avx,
                                   struct isst_fact_info *fact_info)
 {
-       print_packag_info(cpu, outf);
+       print_package_info(cpu, outf);
        _isst_fact_display_information(cpu, outf, level, fact_bucket, fact_avx,
                                       fact_info, 4);
        format_and_print(outf, 1, NULL, NULL);
@@ -456,6 +523,57 @@
        format_and_print(outf, 1, NULL, NULL);
 }
 
+void isst_clos_display_clos_information(int cpu, FILE *outf,
+                                       int clos_enable, int type)
+{
+       char header[256];
+       char value[256];
+
+       snprintf(header, sizeof(header), "package-%d",
+                get_physical_package_id(cpu));
+       format_and_print(outf, 1, header, NULL);
+       snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
+       format_and_print(outf, 2, header, NULL);
+       snprintf(header, sizeof(header), "cpu-%d", cpu);
+       format_and_print(outf, 3, header, NULL);
+
+       snprintf(header, sizeof(header), "core-power");
+       format_and_print(outf, 4, header, NULL);
+
+       snprintf(header, sizeof(header), "enable-status");
+       snprintf(value, sizeof(value), "%d", clos_enable);
+       format_and_print(outf, 5, header, value);
+
+       snprintf(header, sizeof(header), "priority-type");
+       snprintf(value, sizeof(value), "%d", type);
+       format_and_print(outf, 5, header, value);
+
+       format_and_print(outf, 1, NULL, NULL);
+}
+
+void isst_clos_display_assoc_information(int cpu, FILE *outf, int clos)
+{
+       char header[256];
+       char value[256];
+
+       snprintf(header, sizeof(header), "package-%d",
+                get_physical_package_id(cpu));
+       format_and_print(outf, 1, header, NULL);
+       snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
+       format_and_print(outf, 2, header, NULL);
+       snprintf(header, sizeof(header), "cpu-%d", cpu);
+       format_and_print(outf, 3, header, NULL);
+
+       snprintf(header, sizeof(header), "get-assoc");
+       format_and_print(outf, 4, header, NULL);
+
+       snprintf(header, sizeof(header), "clos");
+       snprintf(value, sizeof(value), "%d", clos);
+       format_and_print(outf, 5, header, value);
+
+       format_and_print(outf, 1, NULL, NULL);
+}
+
 void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
                         int result)
 {
@@ -472,7 +590,10 @@
        snprintf(header, sizeof(header), "%s", feature);
        format_and_print(outf, 4, header, NULL);
        snprintf(header, sizeof(header), "%s", cmd);
-       snprintf(value, sizeof(value), "%d", result);
+       if (!result)
+               snprintf(value, sizeof(value), "success");
+       else
+               snprintf(value, sizeof(value), "failed(error %d)", result);
        format_and_print(outf, 5, header, value);
 
        format_and_print(outf, 1, NULL, NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/intel-speed-select-1.0/isst.h 
new/intel-speed-select-1.0/isst.h
--- old/intel-speed-select-1.0/isst.h   2019-07-17 00:15:29.000000000 +0200
+++ new/intel-speed-select-1.0/isst.h   2019-10-28 21:05:03.000000000 +0100
@@ -134,6 +134,7 @@
        size_t core_cpumask_size;
        cpu_set_t *core_cpumask;
        int cpu_count;
+       unsigned long long buckets_info;
        int trl_sse_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
        int trl_avx_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
        int trl_avx_512_active_cores[ISST_TRL_MAX_ACTIVE_CORES];
@@ -186,12 +187,16 @@
                                 int write, unsigned long long *req_resp);
 
 extern int isst_get_ctdp_levels(int cpu, struct isst_pkg_ctdp *pkg_dev);
+extern int isst_get_coremask_info(int cpu, int config_index,
+                          struct isst_pkg_ctdp_level_info *ctdp_level);
 extern int isst_get_process_ctdp(int cpu, int tdp_level,
                                 struct isst_pkg_ctdp *pkg_dev);
 extern void isst_get_process_ctdp_complete(int cpu,
                                           struct isst_pkg_ctdp *pkg_dev);
 extern void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
                                          struct isst_pkg_ctdp *pkg_dev);
+extern void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
+                                       unsigned int val);
 extern void isst_ctdp_display_information_start(FILE *outf);
 extern void isst_ctdp_display_information_end(FILE *outf);
 extern void isst_pbf_display_information(int cpu, FILE *outf, int level,
@@ -222,10 +227,14 @@
 extern int isst_clos_get_assoc_status(int cpu, int *clos_id);
 extern void isst_clos_display_information(int cpu, FILE *outf, int clos,
                                          struct isst_clos_config *clos_config);
-
+extern void isst_clos_display_assoc_information(int cpu, FILE *outf, int clos);
 extern int isst_read_reg(unsigned short reg, unsigned int *val);
 extern int isst_write_reg(int reg, unsigned int val);
 
 extern void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
                                int result);
+
+extern int isst_clos_get_clos_information(int cpu, int *enable, int *type);
+extern void isst_clos_display_clos_information(int cpu, FILE *outf,
+                                              int clos_enable, int type);
 #endif

++++++ turbostat-19.03.20.tar.bz2 -> turbostat-19.08.31.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/turbostat-19.03.20/Makefile 
new/turbostat-19.08.31/Makefile
--- old/turbostat-19.03.20/Makefile     2019-05-06 02:42:58.000000000 +0200
+++ new/turbostat-19.08.31/Makefile     2019-10-28 21:05:03.000000000 +0100
@@ -9,9 +9,10 @@
 endif
 
 turbostat : turbostat.c
-override CFLAGS +=     -Wall
+override CFLAGS +=     -O2 -Wall -I../../../include
 override CFLAGS +=     
-DMSRHEADER='"../../../../arch/x86/include/asm/msr-index.h"'
 override CFLAGS +=     
-DINTEL_FAMILY_HEADER='"../../../../arch/x86/include/asm/intel-family.h"'
+override CFLAGS +=     -D_FORTIFY_SOURCE=2
 
 %: %.c
        @mkdir -p $(BUILD_OUTPUT)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/turbostat-19.03.20/include/linux/bits.h 
new/turbostat-19.08.31/include/linux/bits.h
--- old/turbostat-19.03.20/include/linux/bits.h 1970-01-01 01:00:00.000000000 
+0100
+++ new/turbostat-19.08.31/include/linux/bits.h 2019-10-29 16:21:38.630462997 
+0100
@@ -0,0 +1,29 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __LINUX_BITS_H
+#define __LINUX_BITS_H
+
+#include <linux/const.h>
+#include <asm/bitsperlong.h>
+
+#define BIT(nr)                        (UL(1) << (nr))
+#define BIT_ULL(nr)            (ULL(1) << (nr))
+#define BIT_MASK(nr)           (UL(1) << ((nr) % BITS_PER_LONG))
+#define BIT_WORD(nr)           ((nr) / BITS_PER_LONG)
+#define BIT_ULL_MASK(nr)       (ULL(1) << ((nr) % BITS_PER_LONG_LONG))
+#define BIT_ULL_WORD(nr)       ((nr) / BITS_PER_LONG_LONG)
+#define BITS_PER_BYTE          8
+
+/*
+ * Create a contiguous bitmask starting at bit position @l and ending at
+ * position @h. For example
+ * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
+ */
+#define GENMASK(h, l) \
+       (((~UL(0)) - (UL(1) << (l)) + 1) & \
+        (~UL(0) >> (BITS_PER_LONG - 1 - (h))))
+
+#define GENMASK_ULL(h, l) \
+       (((~ULL(0)) - (ULL(1) << (l)) + 1) & \
+        (~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h))))
+
+#endif /* __LINUX_BITS_H */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/turbostat-19.03.20/intel-family.h 
new/turbostat-19.08.31/intel-family.h
--- old/turbostat-19.03.20/intel-family.h       2019-06-05 13:11:05.123908025 
+0200
+++ new/turbostat-19.08.31/intel-family.h       2019-10-29 16:21:38.634462997 
+0100
@@ -5,12 +5,34 @@
 /*
  * "Big Core" Processors (Branded as Core, Xeon, etc...)
  *
- * The "_X" parts are generally the EP and EX Xeons, or the
- * "Extreme" ones, like Broadwell-E, or Atom microserver.
- *
  * While adding a new CPUID for a new microarchitecture, add a new
  * group to keep logically sorted out in chronological order. Within
  * that group keep the CPUID for the variants sorted by model number.
+ *
+ * The defined symbol names have the following form:
+ *     INTEL_FAM6{OPTFAMILY}_{MICROARCH}{OPTDIFF}
+ * where:
+ * OPTFAMILY   Describes the family of CPUs that this belongs to. Default
+ *             is assumed to be "_CORE" (and should be omitted). Other values
+ *             currently in use are _ATOM and _XEON_PHI
+ * MICROARCH   Is the code name for the micro-architecture for this core.
+ *             N.B. Not the platform name.
+ * OPTDIFF     If needed, a short string to differentiate by market segment.
+ *
+ *             Common OPTDIFFs:
+ *
+ *                     - regular client parts
+ *             _L      - regular mobile parts
+ *             _G      - parts with extra graphics on
+ *             _X      - regular server parts
+ *             _D      - micro server parts
+ *
+ *             Historical OPTDIFFs:
+ *
+ *             _EP     - 2 socket server parts
+ *             _EX     - 4+ socket server parts
+ *
+ * The #define line may optionally include a comment including platform names.
  */
 
 #define INTEL_FAM6_CORE_YONAH          0x0E
@@ -34,25 +56,35 @@
 #define INTEL_FAM6_IVYBRIDGE           0x3A
 #define INTEL_FAM6_IVYBRIDGE_X         0x3E
 
-#define INTEL_FAM6_HASWELL_CORE                0x3C
+#define INTEL_FAM6_HASWELL             0x3C
 #define INTEL_FAM6_HASWELL_X           0x3F
-#define INTEL_FAM6_HASWELL_ULT         0x45
-#define INTEL_FAM6_HASWELL_GT3E                0x46
+#define INTEL_FAM6_HASWELL_L           0x45
+#define INTEL_FAM6_HASWELL_G           0x46
 
-#define INTEL_FAM6_BROADWELL_CORE      0x3D
-#define INTEL_FAM6_BROADWELL_GT3E      0x47
+#define INTEL_FAM6_BROADWELL           0x3D
+#define INTEL_FAM6_BROADWELL_G         0x47
 #define INTEL_FAM6_BROADWELL_X         0x4F
-#define INTEL_FAM6_BROADWELL_XEON_D    0x56
+#define INTEL_FAM6_BROADWELL_D         0x56
 
-#define INTEL_FAM6_SKYLAKE_MOBILE      0x4E
-#define INTEL_FAM6_SKYLAKE_DESKTOP     0x5E
+#define INTEL_FAM6_SKYLAKE_L           0x4E
+#define INTEL_FAM6_SKYLAKE             0x5E
 #define INTEL_FAM6_SKYLAKE_X           0x55
-#define INTEL_FAM6_KABYLAKE_MOBILE     0x8E
-#define INTEL_FAM6_KABYLAKE_DESKTOP    0x9E
+#define INTEL_FAM6_KABYLAKE_L          0x8E
+#define INTEL_FAM6_KABYLAKE            0x9E
+
+#define INTEL_FAM6_CANNONLAKE_L                0x66
+
+#define INTEL_FAM6_ICELAKE_X           0x6A
+#define INTEL_FAM6_ICELAKE_D           0x6C
+#define INTEL_FAM6_ICELAKE             0x7D
+#define INTEL_FAM6_ICELAKE_L           0x7E
+#define INTEL_FAM6_ICELAKE_NNPI                0x9D
 
-#define INTEL_FAM6_CANNONLAKE_MOBILE   0x66
+#define INTEL_FAM6_TIGERLAKE_L         0x8C
+#define INTEL_FAM6_TIGERLAKE           0x8D
 
-#define INTEL_FAM6_ICELAKE_MOBILE      0x7E
+#define INTEL_FAM6_COMETLAKE           0xA5
+#define INTEL_FAM6_COMETLAKE_L         0xA6
 
 /* "Small Core" Processors (Atom) */
 
@@ -64,16 +96,21 @@
 #define INTEL_FAM6_ATOM_SALTWELL_TABLET        0x35 /* Cloverview */
 
 #define INTEL_FAM6_ATOM_SILVERMONT     0x37 /* Bay Trail, Valleyview */
-#define INTEL_FAM6_ATOM_SILVERMONT_X   0x4D /* Avaton, Rangely */
+#define INTEL_FAM6_ATOM_SILVERMONT_D   0x4D /* Avaton, Rangely */
 #define INTEL_FAM6_ATOM_SILVERMONT_MID 0x4A /* Merriefield */
 
 #define INTEL_FAM6_ATOM_AIRMONT                0x4C /* Cherry Trail, Braswell 
*/
 #define INTEL_FAM6_ATOM_AIRMONT_MID    0x5A /* Moorefield */
+#define INTEL_FAM6_ATOM_AIRMONT_NP     0x75 /* Lightning Mountain */
 
 #define INTEL_FAM6_ATOM_GOLDMONT       0x5C /* Apollo Lake */
-#define INTEL_FAM6_ATOM_GOLDMONT_X     0x5F /* Denverton */
+#define INTEL_FAM6_ATOM_GOLDMONT_D     0x5F /* Denverton */
+
+/* Note: the micro-architecture is "Goldmont Plus" */
 #define INTEL_FAM6_ATOM_GOLDMONT_PLUS  0x7A /* Gemini Lake */
-#define INTEL_FAM6_ATOM_TREMONT_X      0x86 /* Jacobsville */
+
+#define INTEL_FAM6_ATOM_TREMONT_D      0x86 /* Jacobsville */
+#define INTEL_FAM6_ATOM_TREMONT                0x96 /* Elkhart Lake */
 
 /* Xeon Phi */
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/turbostat-19.03.20/msr-index.h 
new/turbostat-19.08.31/msr-index.h
--- old/turbostat-19.03.20/msr-index.h  2019-06-05 13:11:05.123908025 +0200
+++ new/turbostat-19.08.31/msr-index.h  2019-10-29 16:21:38.638462997 +0100
@@ -2,6 +2,8 @@
 #ifndef _ASM_X86_MSR_INDEX_H
 #define _ASM_X86_MSR_INDEX_H
 
+#include <linux/bits.h>
+
 /*
  * CPU model specific register (MSR) numbers.
  *
@@ -40,14 +42,14 @@
 /* Intel MSRs. Some also available on other CPUs */
 
 #define MSR_IA32_SPEC_CTRL             0x00000048 /* Speculation Control */
-#define SPEC_CTRL_IBRS                 (1 << 0)   /* Indirect Branch 
Restricted Speculation */
+#define SPEC_CTRL_IBRS                 BIT(0)     /* Indirect Branch 
Restricted Speculation */
 #define SPEC_CTRL_STIBP_SHIFT          1          /* Single Thread Indirect 
Branch Predictor (STIBP) bit */
-#define SPEC_CTRL_STIBP                        (1 << SPEC_CTRL_STIBP_SHIFT)    
/* STIBP mask */
+#define SPEC_CTRL_STIBP                        BIT(SPEC_CTRL_STIBP_SHIFT)      
/* STIBP mask */
 #define SPEC_CTRL_SSBD_SHIFT           2          /* Speculative Store Bypass 
Disable bit */
-#define SPEC_CTRL_SSBD                 (1 << SPEC_CTRL_SSBD_SHIFT)     /* 
Speculative Store Bypass Disable */
+#define SPEC_CTRL_SSBD                 BIT(SPEC_CTRL_SSBD_SHIFT)       /* 
Speculative Store Bypass Disable */
 
 #define MSR_IA32_PRED_CMD              0x00000049 /* Prediction Command */
-#define PRED_CMD_IBPB                  (1 << 0)   /* Indirect Branch 
Prediction Barrier */
+#define PRED_CMD_IBPB                  BIT(0)     /* Indirect Branch 
Prediction Barrier */
 
 #define MSR_PPIN_CTL                   0x0000004e
 #define MSR_PPIN                       0x0000004f
@@ -59,6 +61,15 @@
 #define MSR_PLATFORM_INFO_CPUID_FAULT_BIT      31
 #define MSR_PLATFORM_INFO_CPUID_FAULT          
BIT_ULL(MSR_PLATFORM_INFO_CPUID_FAULT_BIT)
 
+#define MSR_IA32_UMWAIT_CONTROL                        0xe1
+#define MSR_IA32_UMWAIT_CONTROL_C02_DISABLE    BIT(0)
+#define MSR_IA32_UMWAIT_CONTROL_RESERVED       BIT(1)
+/*
+ * The time field is bit[31:2], but representing a 32bit value with
+ * bit[1:0] zero.
+ */
+#define MSR_IA32_UMWAIT_CONTROL_TIME_MASK      (~0x03U)
+
 #define MSR_PKG_CST_CONFIG_CONTROL     0x000000e2
 #define NHM_C3_AUTO_DEMOTE             (1UL << 25)
 #define NHM_C1_AUTO_DEMOTE             (1UL << 26)
@@ -69,20 +80,25 @@
 #define MSR_MTRRcap                    0x000000fe
 
 #define MSR_IA32_ARCH_CAPABILITIES     0x0000010a
-#define ARCH_CAP_RDCL_NO               (1 << 0)   /* Not susceptible to 
Meltdown */
-#define ARCH_CAP_IBRS_ALL              (1 << 1)   /* Enhanced IBRS support */
-#define ARCH_CAP_SKIP_VMENTRY_L1DFLUSH (1 << 3)   /* Skip L1D flush on vmentry 
*/
-#define ARCH_CAP_SSB_NO                        (1 << 4)   /*
-                                                   * Not susceptible to 
Speculative Store Bypass
-                                                   * attack, so no Speculative 
Store Bypass
-                                                   * control required.
-                                                   */
+#define ARCH_CAP_RDCL_NO               BIT(0)  /* Not susceptible to Meltdown 
*/
+#define ARCH_CAP_IBRS_ALL              BIT(1)  /* Enhanced IBRS support */
+#define ARCH_CAP_SKIP_VMENTRY_L1DFLUSH BIT(3)  /* Skip L1D flush on vmentry */
+#define ARCH_CAP_SSB_NO                        BIT(4)  /*
+                                                * Not susceptible to 
Speculative Store Bypass
+                                                * attack, so no Speculative 
Store Bypass
+                                                * control required.
+                                                */
+#define ARCH_CAP_MDS_NO                        BIT(5)   /*
+                                                 * Not susceptible to
+                                                 * Microarchitectural Data
+                                                 * Sampling (MDS) 
vulnerabilities.
+                                                 */
 
 #define MSR_IA32_FLUSH_CMD             0x0000010b
-#define L1D_FLUSH                      (1 << 0)   /*
-                                                   * Writeback and invalidate 
the
-                                                   * L1 data cache.
-                                                   */
+#define L1D_FLUSH                      BIT(0)  /*
+                                                * Writeback and invalidate the
+                                                * L1 data cache.
+                                                */
 
 #define MSR_IA32_BBL_CR_CTL            0x00000119
 #define MSR_IA32_BBL_CR_CTL3           0x0000011e
@@ -116,6 +132,7 @@
 #define LBR_INFO_CYCLES                        0xffff
 
 #define MSR_IA32_PEBS_ENABLE           0x000003f1
+#define MSR_PEBS_DATA_CFG              0x000003f2
 #define MSR_IA32_DS_AREA               0x00000600
 #define MSR_IA32_PERF_CAPABILITIES     0x00000345
 #define MSR_PEBS_LD_LAT_THRESHOLD      0x000003f6
@@ -358,13 +375,22 @@
 /* Alternative perfctr range with full access. */
 #define MSR_IA32_PMC0                  0x000004c1
 
-/* AMD64 MSRs. Not complete. See the architecture manual for a more
-   complete list. */
+/* Auto-reload via MSR instead of DS area */
+#define MSR_RELOAD_PMC0                        0x000014c1
+#define MSR_RELOAD_FIXED_CTR0          0x00001309
 
+/*
+ * AMD64 MSRs. Not complete. See the architecture manual for a more
+ * complete list.
+ */
 #define MSR_AMD64_PATCH_LEVEL          0x0000008b
 #define MSR_AMD64_TSC_RATIO            0xc0000104
 #define MSR_AMD64_NB_CFG               0xc001001f
+#define MSR_AMD64_CPUID_FN_1           0xc0011004
 #define MSR_AMD64_PATCH_LOADER         0xc0010020
+#define MSR_AMD_PERF_CTL               0xc0010062
+#define MSR_AMD_PERF_STATUS            0xc0010063
+#define MSR_AMD_PSTATE_DEF_BASE                0xc0010064
 #define MSR_AMD64_OSVW_ID_LENGTH       0xc0010140
 #define MSR_AMD64_OSVW_STATUS          0xc0010141
 #define MSR_AMD64_LS_CFG               0xc0011020
@@ -543,9 +569,6 @@
 #define MSR_IA32_PERF_STATUS           0x00000198
 #define MSR_IA32_PERF_CTL              0x00000199
 #define INTEL_PERF_CTL_MASK            0xffff
-#define MSR_AMD_PSTATE_DEF_BASE                0xc0010064
-#define MSR_AMD_PERF_STATUS            0xc0010063
-#define MSR_AMD_PERF_CTL               0xc0010062
 
 #define MSR_IA32_MPERF                 0x000000e7
 #define MSR_IA32_APERF                 0x000000e8
@@ -781,6 +804,14 @@
 #define MSR_CORE_PERF_GLOBAL_CTRL      0x0000038f
 #define MSR_CORE_PERF_GLOBAL_OVF_CTRL  0x00000390
 
+/* PERF_GLOBAL_OVF_CTL bits */
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT       55
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI           (1ULL << 
MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT)
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_OVF_BUF_BIT              62
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_OVF_BUF                  (1ULL <<  
MSR_CORE_PERF_GLOBAL_OVF_CTRL_OVF_BUF_BIT)
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_COND_CHGD_BIT            63
+#define MSR_CORE_PERF_GLOBAL_OVF_CTRL_COND_CHGD                        (1ULL 
<< MSR_CORE_PERF_GLOBAL_OVF_CTRL_COND_CHGD_BIT)
+
 /* Geode defined MSRs */
 #define MSR_GEODE_BUSCONT_CONF0                0x00001900
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/turbostat-19.03.20/turbostat.c 
new/turbostat-19.08.31/turbostat.c
--- old/turbostat-19.03.20/turbostat.c  2019-05-06 02:42:58.000000000 +0200
+++ new/turbostat-19.08.31/turbostat.c  2019-10-28 21:05:03.000000000 +0100
@@ -1,22 +1,10 @@
+// SPDX-License-Identifier: GPL-2.0-only
 /*
  * turbostat -- show CPU frequency and C-state residency
  * on modern Intel and AMD processors.
  *
  * Copyright (c) 2013 Intel Corporation.
  * Len Brown <len.br...@intel.com>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
 #define _GNU_SOURCE
@@ -51,7 +39,6 @@
 int *fd_percpu;
 struct timeval interval_tv = {5, 0};
 struct timespec interval_ts = {5, 0};
-struct timespec one_msec = {0, 1000000};
 unsigned int num_iterations;
 unsigned int debug;
 unsigned int quiet;
@@ -72,6 +59,7 @@
 unsigned int units = 1000000;  /* MHz etc */
 unsigned int genuine_intel;
 unsigned int authentic_amd;
+unsigned int hygon_genuine;
 unsigned int max_level, max_extended_level;
 unsigned int has_invariant_tsc;
 unsigned int do_nhm_platform_info;
@@ -112,6 +100,7 @@
 unsigned int has_hwp_pkg;              /* IA32_HWP_REQUEST_PKG */
 unsigned int has_misc_feature_control;
 unsigned int first_counter_read = 1;
+int ignore_stdin;
 
 #define RAPL_PKG               (1 << 0)
                                        /* 0x610 MSR_PKG_POWER_LIMIT */
@@ -178,6 +167,7 @@
 struct thread_data {
        struct timeval tv_begin;
        struct timeval tv_end;
+       struct timeval tv_delta;
        unsigned long long tsc;
        unsigned long long aperf;
        unsigned long long mperf;
@@ -518,6 +508,7 @@
 unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_sysfs | BIC_APIC | 
BIC_X2APIC;
 
 #define DO_BIC(COUNTER_NAME) (bic_enabled & bic_present & COUNTER_NAME)
+#define DO_BIC_READ(COUNTER_NAME) (bic_present & COUNTER_NAME)
 #define ENABLE_BIC(COUNTER_NAME) (bic_enabled |= COUNTER_NAME)
 #define BIC_PRESENT(COUNTER_BIT) (bic_present |= COUNTER_BIT)
 #define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT)
@@ -861,7 +852,6 @@
                outp += sprintf(outp, "pc8: %016llX\n", p->pc8);
                outp += sprintf(outp, "pc9: %016llX\n", p->pc9);
                outp += sprintf(outp, "pc10: %016llX\n", p->pc10);
-               outp += sprintf(outp, "pc10: %016llX\n", p->pc10);
                outp += sprintf(outp, "cpu_lpi: %016llX\n", p->cpu_lpi);
                outp += sprintf(outp, "sys_lpi: %016llX\n", p->sys_lpi);
                outp += sprintf(outp, "Joules PKG: %0X\n", p->energy_pkg);
@@ -923,7 +913,7 @@
        if (DO_BIC(BIC_TOD))
                outp += sprintf(outp, "%10ld.%06ld\t", t->tv_end.tv_sec, 
t->tv_end.tv_usec);
 
-       interval_float = tv_delta.tv_sec + tv_delta.tv_usec/1000000.0;
+       interval_float = t->tv_delta.tv_sec + t->tv_delta.tv_usec/1000000.0;
 
        tsc = t->tsc * tsc_tweak;
 
@@ -1299,6 +1289,14 @@
        }
 }
 
+int soft_c1_residency_display(int bic)
+{
+       if (!DO_BIC(BIC_CPU_c1) || use_c1_residency_msr)
+               return 0;
+
+       return DO_BIC_READ(bic);
+}
+
 /*
  * old = new - old
  */
@@ -1321,6 +1319,7 @@
         * over-write old w/ new so we can print end of interval values
         */
 
+       timersub(&new->tv_begin, &old->tv_begin, &old->tv_delta);
        old->tv_begin = new->tv_begin;
        old->tv_end = new->tv_end;
 
@@ -1334,7 +1333,8 @@
 
        old->c1 = new->c1 - old->c1;
 
-       if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz)) {
+       if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) ||
+           soft_c1_residency_display(BIC_Avg_MHz)) {
                if ((new->aperf > old->aperf) && (new->mperf > old->mperf)) {
                        old->aperf = new->aperf - old->aperf;
                        old->mperf = new->mperf - old->mperf;
@@ -1416,6 +1416,8 @@
        t->tv_begin.tv_usec = 0;
        t->tv_end.tv_sec = 0;
        t->tv_end.tv_usec = 0;
+       t->tv_delta.tv_sec = 0;
+       t->tv_delta.tv_usec = 0;
 
        t->tsc = 0;
        t->aperf = 0;
@@ -1585,6 +1587,9 @@
 
        for_all_cpus(sum_counters, t, c, p);
 
+       /* Use the global time delta for the average. */
+       average.threads.tv_delta = tv_delta;
+
        average.threads.tsc /= topo.num_cpus;
        average.threads.aperf /= topo.num_cpus;
        average.threads.mperf /= topo.num_cpus;
@@ -1726,7 +1731,7 @@
        if (!DO_BIC(BIC_X2APIC))
                return;
 
-       if (authentic_amd) {
+       if (authentic_amd || hygon_genuine) {
                unsigned int topology_extensions;
 
                if (max_extended_level < 0x8000001e)
@@ -1774,19 +1779,20 @@
        struct msr_counter *mp;
        int i;
 
-       gettimeofday(&t->tv_begin, (struct timezone *)NULL);
-
        if (cpu_migrate(cpu)) {
                fprintf(outf, "Could not migrate to CPU %d\n", cpu);
                return -1;
        }
 
+       gettimeofday(&t->tv_begin, (struct timezone *)NULL);
+
        if (first_counter_read)
                get_apic_id(t);
 retry:
        t->tsc = rdtsc();       /* we are running on local CPU of interest */
 
-       if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz)) {
+       if (DO_BIC(BIC_Avg_MHz) || DO_BIC(BIC_Busy) || DO_BIC(BIC_Bzy_MHz) ||
+           soft_c1_residency_display(BIC_Avg_MHz)) {
                unsigned long long tsc_before, tsc_between, tsc_after, 
aperf_time, mperf_time;
 
                /*
@@ -1863,20 +1869,20 @@
        if (!(t->flags & CPU_IS_FIRST_THREAD_IN_CORE))
                goto done;
 
-       if (DO_BIC(BIC_CPU_c3)) {
+       if (DO_BIC(BIC_CPU_c3) || soft_c1_residency_display(BIC_CPU_c3)) {
                if (get_msr(cpu, MSR_CORE_C3_RESIDENCY, &c->c3))
                        return -6;
        }
 
-       if (DO_BIC(BIC_CPU_c6) && !do_knl_cstates) {
+       if ((DO_BIC(BIC_CPU_c6) || soft_c1_residency_display(BIC_CPU_c6)) && 
!do_knl_cstates) {
                if (get_msr(cpu, MSR_CORE_C6_RESIDENCY, &c->c6))
                        return -7;
-       } else if (do_knl_cstates) {
+       } else if (do_knl_cstates || soft_c1_residency_display(BIC_CPU_c6)) {
                if (get_msr(cpu, MSR_KNL_CORE_C6_RESIDENCY, &c->c6))
                        return -7;
        }
 
-       if (DO_BIC(BIC_CPU_c7))
+       if (DO_BIC(BIC_CPU_c7) || soft_c1_residency_display(BIC_CPU_c7))
                if (get_msr(cpu, MSR_CORE_C7_RESIDENCY, &c->c7))
                        return -8;
 
@@ -2162,7 +2168,7 @@
        switch (model) {
        case INTEL_FAM6_ATOM_GOLDMONT:
        case INTEL_FAM6_SKYLAKE_X:
-       case INTEL_FAM6_ATOM_GOLDMONT_X:
+       case INTEL_FAM6_ATOM_GOLDMONT_D:
                return 1;
        }
        return 0;
@@ -2924,6 +2930,7 @@
        if (retval != 1) {
                fprintf(stderr, "Disabling Low Power Idle CPU output\n");
                BIC_NOT_PRESENT(BIC_CPU_LPI);
+               fclose(fp);
                return -1;
        }
 
@@ -2950,6 +2957,7 @@
        if (retval != 1) {
                fprintf(stderr, "Disabling Low Power Idle System output\n");
                BIC_NOT_PRESENT(BIC_SYS_LPI);
+               fclose(fp);
                return -1;
        }
        fclose(fp);
@@ -2997,8 +3005,6 @@
                        fprintf(stderr, "SIGUSR1\n");
                break;
        }
-       /* make sure this manually-invoked interval is at least 1ms long */
-       nanosleep(&one_msec, NULL);
 }
 
 void setup_signal_handler(void)
@@ -3017,29 +3023,38 @@
 
 void do_sleep(void)
 {
-       struct timeval select_timeout;
+       struct timeval tout;
+       struct timespec rest;
        fd_set readfds;
        int retval;
 
        FD_ZERO(&readfds);
        FD_SET(0, &readfds);
 
-       if (!isatty(fileno(stdin))) {
+       if (ignore_stdin) {
                nanosleep(&interval_ts, NULL);
                return;
        }
 
-       select_timeout = interval_tv;
-       retval = select(1, &readfds, NULL, NULL, &select_timeout);
+       tout = interval_tv;
+       retval = select(1, &readfds, NULL, NULL, &tout);
 
        if (retval == 1) {
                switch (getc(stdin)) {
                case 'q':
                        exit_requested = 1;
                        break;
+               case EOF:
+                       /*
+                        * 'stdin' is a pipe closed on the other end. There
+                        * won't be any further input.
+                        */
+                       ignore_stdin = 1;
+                       /* Sleep the rest of the time */
+                       rest.tv_sec = (tout.tv_sec + tout.tv_usec / 1000000);
+                       rest.tv_nsec = (tout.tv_usec % 1000000) * 1000;
+                       nanosleep(&rest, NULL);
                }
-               /* make sure this manually-invoked interval is at least 1ms 
long */
-               nanosleep(&one_msec, NULL);
        }
 }
 
@@ -3219,14 +3234,15 @@
                pkg_cstate_limits = snb_pkg_cstate_limits;
                has_misc_feature_control = 1;
                break;
-       case INTEL_FAM6_HASWELL_CORE:   /* HSW */
+       case INTEL_FAM6_HASWELL:        /* HSW */
+       case INTEL_FAM6_HASWELL_G:      /* HSW */
        case INTEL_FAM6_HASWELL_X:      /* HSX */
-       case INTEL_FAM6_HASWELL_GT3E:   /* HSW */
-       case INTEL_FAM6_BROADWELL_CORE: /* BDW */
-       case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
+       case INTEL_FAM6_HASWELL_L:      /* HSW */
+       case INTEL_FAM6_BROADWELL:      /* BDW */
+       case INTEL_FAM6_BROADWELL_G:    /* BDW */
        case INTEL_FAM6_BROADWELL_X:    /* BDX */
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
+       case INTEL_FAM6_SKYLAKE_L:      /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:   /* CNL */
                pkg_cstate_limits = hsw_pkg_cstate_limits;
                has_misc_feature_control = 1;
                break;
@@ -3236,7 +3252,7 @@
                break;
        case INTEL_FAM6_ATOM_SILVERMONT:        /* BYT */
                no_MSR_MISC_PWR_MGMT = 1;
-       case INTEL_FAM6_ATOM_SILVERMONT_X:      /* AVN */
+       case INTEL_FAM6_ATOM_SILVERMONT_D:      /* AVN */
                pkg_cstate_limits = slv_pkg_cstate_limits;
                break;
        case INTEL_FAM6_ATOM_AIRMONT:   /* AMT */
@@ -3248,7 +3264,7 @@
                break;
        case INTEL_FAM6_ATOM_GOLDMONT:  /* BXT */
        case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
-       case INTEL_FAM6_ATOM_GOLDMONT_X:        /* DNV */
+       case INTEL_FAM6_ATOM_GOLDMONT_D:        /* DNV */
                pkg_cstate_limits = glm_pkg_cstate_limits;
                break;
        default:
@@ -3291,7 +3307,7 @@
                return 0;
 
        switch (model) {
-       case INTEL_FAM6_ATOM_GOLDMONT_X:
+       case INTEL_FAM6_ATOM_GOLDMONT_D:
                return 1;
        }
        return 0;
@@ -3415,14 +3431,15 @@
 
        switch (model) {
        case INTEL_FAM6_IVYBRIDGE:      /* IVB */
-       case INTEL_FAM6_HASWELL_CORE:   /* HSW */
+       case INTEL_FAM6_HASWELL:        /* HSW */
        case INTEL_FAM6_HASWELL_X:      /* HSX */
-       case INTEL_FAM6_HASWELL_GT3E:   /* HSW */
-       case INTEL_FAM6_BROADWELL_CORE: /* BDW */
-       case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
+       case INTEL_FAM6_HASWELL_L:      /* HSW */
+       case INTEL_FAM6_HASWELL_G:      /* HSW */
+       case INTEL_FAM6_BROADWELL:      /* BDW */
+       case INTEL_FAM6_BROADWELL_G:    /* BDW */
        case INTEL_FAM6_BROADWELL_X:    /* BDX */
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
+       case INTEL_FAM6_SKYLAKE_L:      /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:   /* CNL */
        case INTEL_FAM6_SKYLAKE_X:      /* SKX */
 
        case INTEL_FAM6_XEON_PHI_KNL:   /* Knights Landing */
@@ -3804,7 +3821,7 @@
 
        switch (model) {
        case INTEL_FAM6_ATOM_SILVERMONT:
-       case INTEL_FAM6_ATOM_SILVERMONT_X:
+       case INTEL_FAM6_ATOM_SILVERMONT_D:
                return 30.0;
        default:
                return 135.0;
@@ -3815,6 +3832,7 @@
 {
        switch (family) {
        case 0x17:
+       case 0x18:
        default:
                /* This is the max stock TDP of HEDT/Server Fam17h chips */
                return 250.0;
@@ -3852,10 +3870,11 @@
        switch (model) {
        case INTEL_FAM6_SANDYBRIDGE:
        case INTEL_FAM6_IVYBRIDGE:
-       case INTEL_FAM6_HASWELL_CORE:   /* HSW */
-       case INTEL_FAM6_HASWELL_GT3E:   /* HSW */
-       case INTEL_FAM6_BROADWELL_CORE: /* BDW */
-       case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
+       case INTEL_FAM6_HASWELL:        /* HSW */
+       case INTEL_FAM6_HASWELL_L:      /* HSW */
+       case INTEL_FAM6_HASWELL_G:      /* HSW */
+       case INTEL_FAM6_BROADWELL:      /* BDW */
+       case INTEL_FAM6_BROADWELL_G:    /* BDW */
                do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | 
RAPL_PKG_POWER_INFO;
                if (rapl_joules) {
                        BIC_PRESENT(BIC_Pkg_J);
@@ -3875,8 +3894,8 @@
                else
                        BIC_PRESENT(BIC_PkgWatt);
                break;
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
+       case INTEL_FAM6_SKYLAKE_L:      /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:   /* CNL */
                do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM 
| RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_GFX | RAPL_PKG_POWER_INFO;
                BIC_PRESENT(BIC_PKG__);
                BIC_PRESENT(BIC_RAM__);
@@ -3923,7 +3942,7 @@
                }
                break;
        case INTEL_FAM6_ATOM_SILVERMONT:        /* BYT */
-       case INTEL_FAM6_ATOM_SILVERMONT_X:      /* AVN */
+       case INTEL_FAM6_ATOM_SILVERMONT_D:      /* AVN */
                do_rapl = RAPL_PKG | RAPL_CORES;
                if (rapl_joules) {
                        BIC_PRESENT(BIC_Pkg_J);
@@ -3933,7 +3952,7 @@
                        BIC_PRESENT(BIC_CorWatt);
                }
                break;
-       case INTEL_FAM6_ATOM_GOLDMONT_X:        /* DNV */
+       case INTEL_FAM6_ATOM_GOLDMONT_D:        /* DNV */
                do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | 
RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO | 
RAPL_CORES_ENERGY_STATUS;
                BIC_PRESENT(BIC_PKG__);
                BIC_PRESENT(BIC_RAM__);
@@ -3994,6 +4013,7 @@
 
        switch (family) {
        case 0x17: /* Zen, Zen+ */
+       case 0x18: /* Hygon Dhyana */
                do_rapl = RAPL_AMD_F17H | RAPL_PER_CORE_ENERGY;
                if (rapl_joules) {
                        BIC_PRESENT(BIC_Pkg_J);
@@ -4014,7 +4034,7 @@
        rapl_energy_units = ldexp(1.0, -(msr >> 8 & 0x1f));
        rapl_power_units = ldexp(1.0, -(msr & 0xf));
 
-       tdp = get_tdp_amd(model);
+       tdp = get_tdp_amd(family);
 
        rapl_joule_counter_range = 0xFFFFFFFF * rapl_energy_units / tdp;
        if (!quiet)
@@ -4030,7 +4050,7 @@
 {
        if (genuine_intel)
                rapl_probe_intel(family, model);
-       if (authentic_amd)
+       if (authentic_amd || hygon_genuine)
                rapl_probe_amd(family, model);
 }
 
@@ -4043,8 +4063,9 @@
                return;
 
        switch (model) {
-       case INTEL_FAM6_HASWELL_CORE:   /* HSW */
-       case INTEL_FAM6_HASWELL_GT3E:   /* HSW */
+       case INTEL_FAM6_HASWELL:        /* HSW */
+       case INTEL_FAM6_HASWELL_L:      /* HSW */
+       case INTEL_FAM6_HASWELL_G:      /* HSW */
                do_gfx_perf_limit_reasons = 1;
        case INTEL_FAM6_HASWELL_X:      /* HSX */
                do_core_perf_limit_reasons = 1;
@@ -4259,27 +4280,28 @@
        switch (model) {
        case INTEL_FAM6_SANDYBRIDGE:
        case INTEL_FAM6_SANDYBRIDGE_X:
-       case INTEL_FAM6_IVYBRIDGE:      /* IVB */
-       case INTEL_FAM6_IVYBRIDGE_X:    /* IVB Xeon */
-       case INTEL_FAM6_HASWELL_CORE:   /* HSW */
-       case INTEL_FAM6_HASWELL_X:      /* HSW */
-       case INTEL_FAM6_HASWELL_GT3E:   /* HSW */
-       case INTEL_FAM6_BROADWELL_CORE: /* BDW */
-       case INTEL_FAM6_BROADWELL_GT3E: /* BDW */
-       case INTEL_FAM6_BROADWELL_X:    /* BDX */
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
-       case INTEL_FAM6_SKYLAKE_X:      /* SKX */
-       case INTEL_FAM6_ATOM_GOLDMONT:  /* BXT */
+       case INTEL_FAM6_IVYBRIDGE:              /* IVB */
+       case INTEL_FAM6_IVYBRIDGE_X:            /* IVB Xeon */
+       case INTEL_FAM6_HASWELL:                /* HSW */
+       case INTEL_FAM6_HASWELL_X:              /* HSW */
+       case INTEL_FAM6_HASWELL_L:              /* HSW */
+       case INTEL_FAM6_HASWELL_G:              /* HSW */
+       case INTEL_FAM6_BROADWELL:              /* BDW */
+       case INTEL_FAM6_BROADWELL_G:            /* BDW */
+       case INTEL_FAM6_BROADWELL_X:            /* BDX */
+       case INTEL_FAM6_SKYLAKE_L:              /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:           /* CNL */
+       case INTEL_FAM6_SKYLAKE_X:              /* SKX */
+       case INTEL_FAM6_ATOM_GOLDMONT:          /* BXT */
        case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
-       case INTEL_FAM6_ATOM_GOLDMONT_X:        /* DNV */
+       case INTEL_FAM6_ATOM_GOLDMONT_D:        /* DNV */
                return 1;
        }
        return 0;
 }
 
 /*
- * HSW adds support for additional MSRs:
+ * HSW ULT added support for C8/C9/C10 MSRs:
  *
  * MSR_PKG_C8_RESIDENCY                0x00000630
  * MSR_PKG_C9_RESIDENCY                0x00000631
@@ -4290,16 +4312,16 @@
  * MSR_PKGC10_IRTL             0x00000635
  *
  */
-int has_hsw_msrs(unsigned int family, unsigned int model)
+int has_c8910_msrs(unsigned int family, unsigned int model)
 {
        if (!genuine_intel)
                return 0;
 
        switch (model) {
-       case INTEL_FAM6_HASWELL_CORE:
-       case INTEL_FAM6_BROADWELL_CORE: /* BDW */
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
+       case INTEL_FAM6_HASWELL_L:      /* HSW */
+       case INTEL_FAM6_BROADWELL:      /* BDW */
+       case INTEL_FAM6_SKYLAKE_L:      /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:   /* CNL */
        case INTEL_FAM6_ATOM_GOLDMONT:  /* BXT */
        case INTEL_FAM6_ATOM_GOLDMONT_PLUS:
                return 1;
@@ -4321,8 +4343,8 @@
                return 0;
 
        switch (model) {
-       case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
-       case INTEL_FAM6_CANNONLAKE_MOBILE:      /* CNL */
+       case INTEL_FAM6_SKYLAKE_L:      /* SKL */
+       case INTEL_FAM6_CANNONLAKE_L:   /* CNL */
                return 1;
        }
        return 0;
@@ -4334,7 +4356,7 @@
                return 0;
        switch (model) {
        case INTEL_FAM6_ATOM_SILVERMONT:        /* BYT */
-       case INTEL_FAM6_ATOM_SILVERMONT_X:      /* AVN */
+       case INTEL_FAM6_ATOM_SILVERMONT_D:      /* AVN */
                return 1;
        }
        return 0;
@@ -4357,7 +4379,7 @@
                return 0;
 
        switch (model) {
-       case INTEL_FAM6_CANNONLAKE_MOBILE: /* CNL */
+       case INTEL_FAM6_CANNONLAKE_L: /* CNL */
                return 1;
        }
 
@@ -4580,21 +4602,22 @@
        case INTEL_FAM6_XEON_PHI_KNM:
                return INTEL_FAM6_XEON_PHI_KNL;
 
-       case INTEL_FAM6_HASWELL_ULT:
-               return INTEL_FAM6_HASWELL_CORE;
-
        case INTEL_FAM6_BROADWELL_X:
-       case INTEL_FAM6_BROADWELL_XEON_D:       /* BDX-DE */
+       case INTEL_FAM6_BROADWELL_D:    /* BDX-DE */
                return INTEL_FAM6_BROADWELL_X;
 
-       case INTEL_FAM6_SKYLAKE_MOBILE:
-       case INTEL_FAM6_SKYLAKE_DESKTOP:
-       case INTEL_FAM6_KABYLAKE_MOBILE:
-       case INTEL_FAM6_KABYLAKE_DESKTOP:
-               return INTEL_FAM6_SKYLAKE_MOBILE;
+       case INTEL_FAM6_SKYLAKE_L:
+       case INTEL_FAM6_SKYLAKE:
+       case INTEL_FAM6_KABYLAKE_L:
+       case INTEL_FAM6_KABYLAKE:
+               return INTEL_FAM6_SKYLAKE_L;
+
+       case INTEL_FAM6_ICELAKE_L:
+       case INTEL_FAM6_ICELAKE_NNPI:
+               return INTEL_FAM6_CANNONLAKE_L;
 
-       case INTEL_FAM6_ICELAKE_MOBILE:
-               return INTEL_FAM6_CANNONLAKE_MOBILE;
+       case INTEL_FAM6_ATOM_TREMONT_D:
+               return INTEL_FAM6_ATOM_GOLDMONT_D;
        }
        return model;
 }
@@ -4612,6 +4635,8 @@
                genuine_intel = 1;
        else if (ebx == 0x68747541 && ecx == 0x444d4163 && edx == 0x69746e65)
                authentic_amd = 1;
+       else if (ebx == 0x6f677948 && ecx == 0x656e6975 && edx == 0x6e65476e)
+               hygon_genuine = 1;
 
        if (!quiet)
                fprintf(outf, "CPUID(0): %.4s%.4s%.4s ",
@@ -4743,10 +4768,10 @@
 
                        if (crystal_hz == 0)
                                switch(model) {
-                               case INTEL_FAM6_SKYLAKE_MOBILE: /* SKL */
+                               case INTEL_FAM6_SKYLAKE_L:      /* SKL */
                                        crystal_hz = 24000000;  /* 24.0 MHz */
                                        break;
-                               case INTEL_FAM6_ATOM_GOLDMONT_X:        /* DNV 
*/
+                               case INTEL_FAM6_ATOM_GOLDMONT_D:        /* DNV 
*/
                                        crystal_hz = 25000000;  /* 25.0 MHz */
                                        break;
                                case INTEL_FAM6_ATOM_GOLDMONT:  /* BXT */
@@ -4832,12 +4857,12 @@
                BIC_NOT_PRESENT(BIC_CPU_c7);
                BIC_NOT_PRESENT(BIC_Pkgpc7);
        }
-       if (has_hsw_msrs(family, model)) {
+       if (has_c8910_msrs(family, model)) {
                BIC_PRESENT(BIC_Pkgpc8);
                BIC_PRESENT(BIC_Pkgpc9);
                BIC_PRESENT(BIC_Pkgpc10);
        }
-       do_irtl_hsw = has_hsw_msrs(family, model);
+       do_irtl_hsw = has_c8910_msrs(family, model);
        if (has_skl_msrs(family, model)) {
                BIC_PRESENT(BIC_Totl_c0);
                BIC_PRESENT(BIC_Any_c0);
@@ -5135,7 +5160,7 @@
 
 void allocate_output_buffer()
 {
-       output_buffer = calloc(1, (1 + topo.num_cpus) * 1024);
+       output_buffer = calloc(1, (1 + topo.num_cpus) * 2048);
        outp = output_buffer;
        if (outp == NULL)
                err(-1, "calloc output buffer");
@@ -5281,7 +5306,7 @@
 }
 
 void print_version() {
-       fprintf(outf, "turbostat version 19.03.20"
+       fprintf(outf, "turbostat version 19.08.31"
                " - Len Brown <l...@kernel.org>\n");
 }
 

++++++ turbostat_makefile_fix_asm_header.patch ++++++
--- /var/tmp/diff_new_pack.MqXMEk/_old  2019-10-30 14:46:58.790128778 +0100
+++ /var/tmp/diff_new_pack.MqXMEk/_new  2019-10-30 14:46:58.790128778 +0100
@@ -1,15 +1,17 @@
-Index: turbostat-19.03.20/Makefile
+Index: turbostat-19.08.31/Makefile
 ===================================================================
---- turbostat-19.03.20.orig/Makefile   2019-04-08 16:09:47.094469287 +0200
-+++ turbostat-19.03.20/Makefile        2019-04-08 16:10:18.490470979 +0200
-@@ -10,8 +10,8 @@ endif
+--- turbostat-19.08.31.orig/Makefile   2019-10-29 15:23:56.962276473 +0100
++++ turbostat-19.08.31/Makefile        2019-10-29 16:12:52.926434670 +0100
+@@ -9,9 +9,9 @@ ifeq ("$(origin O)", "command line")
+ endif
  
  turbostat : turbostat.c
- override CFLAGS +=    -Wall
+-override CFLAGS +=    -O2 -Wall -I../../../include
 -override CFLAGS +=    
-DMSRHEADER='"../../../../arch/x86/include/asm/msr-index.h"'
 -override CFLAGS +=    
-DINTEL_FAMILY_HEADER='"../../../../arch/x86/include/asm/intel-family.h"'
++override CFLAGS +=    -O2 -Wall -I ./include
 +override CFLAGS +=    -DMSRHEADER='"msr-index.h"'
 +override CFLAGS +=    -DINTEL_FAMILY_HEADER='"intel-family.h"'
+ override CFLAGS +=    -D_FORTIFY_SOURCE=2
  
  %: %.c
-       @mkdir -p $(BUILD_OUTPUT)


Reply via email to