diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-08-24 17:10:02 -0400 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2015-08-24 17:10:02 -0400 |
commit | 82bb70c599d81e6b2535f887b02e1719cc4856ac (patch) | |
tree | 8287bf6923c0f3b09d0e298f240229037ccc68d4 | |
parent | 2e5e8fd1ff9d802ab74df1ceaa5243da30491a45 (diff) | |
parent | bd6906ed3d7a00d55c9bd368a640ef83bb487d1d (diff) |
Merge branch 'turbostat' of https://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux into pm-tools
Pull turbostat changes for v4.3 from Len Brown.
* 'turbostat' of https://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux:
tools/power turbostat: fix typo on DRAM column in Joules-mode
tools/power turbostat: fix parameter passing for forked command
tools/power turbostat: dump CONFIG_TDP
tools/power turbostat: cpu0 is no longer hard-coded, so update output
tools/power turbostat: update turbostat(8)
-rw-r--r-- | arch/x86/include/asm/msr-index.h | 6 | ||||
-rw-r--r-- | tools/power/x86/turbostat/turbostat.8 | 5 | ||||
-rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 100 |
3 files changed, 94 insertions, 17 deletions
diff --git a/arch/x86/include/asm/msr-index.h b/arch/x86/include/asm/msr-index.h index 9ebc3d009373..6deb8e3b71a7 100644 --- a/arch/x86/include/asm/msr-index.h +++ b/arch/x86/include/asm/msr-index.h | |||
@@ -170,6 +170,12 @@ | |||
170 | #define MSR_PP1_ENERGY_STATUS 0x00000641 | 170 | #define MSR_PP1_ENERGY_STATUS 0x00000641 |
171 | #define MSR_PP1_POLICY 0x00000642 | 171 | #define MSR_PP1_POLICY 0x00000642 |
172 | 172 | ||
173 | #define MSR_CONFIG_TDP_NOMINAL 0x00000648 | ||
174 | #define MSR_CONFIG_TDP_LEVEL_1 0x00000649 | ||
175 | #define MSR_CONFIG_TDP_LEVEL_2 0x0000064A | ||
176 | #define MSR_CONFIG_TDP_CONTROL 0x0000064B | ||
177 | #define MSR_TURBO_ACTIVATION_RATIO 0x0000064C | ||
178 | |||
173 | #define MSR_PKG_WEIGHTED_CORE_C0_RES 0x00000658 | 179 | #define MSR_PKG_WEIGHTED_CORE_C0_RES 0x00000658 |
174 | #define MSR_PKG_ANY_CORE_C0_RES 0x00000659 | 180 | #define MSR_PKG_ANY_CORE_C0_RES 0x00000659 |
175 | #define MSR_PKG_ANY_GFXE_C0_RES 0x0000065A | 181 | #define MSR_PKG_ANY_GFXE_C0_RES 0x0000065A |
diff --git a/tools/power/x86/turbostat/turbostat.8 b/tools/power/x86/turbostat/turbostat.8 index 05b8fc38dc8b..622db685b4f9 100644 --- a/tools/power/x86/turbostat/turbostat.8 +++ b/tools/power/x86/turbostat/turbostat.8 | |||
@@ -251,11 +251,6 @@ Although it is not guaranteed by the architecture, turbostat assumes | |||
251 | that they count at TSC rate, which is true on all processors tested to date. | 251 | that they count at TSC rate, which is true on all processors tested to date. |
252 | 252 | ||
253 | .SH REFERENCES | 253 | .SH REFERENCES |
254 | "Intel® Turbo Boost Technology | ||
255 | in Intel® Core™ Microarchitecture (Nehalem) Based Processors" | ||
256 | http://download.intel.com/design/processor/applnots/320354.pdf | ||
257 | |||
258 | "Intel® 64 and IA-32 Architectures Software Developer's Manual | ||
259 | Volume 3B: System Programming Guide" | 254 | Volume 3B: System Programming Guide" |
260 | http://www.intel.com/products/processor/manuals/ | 255 | http://www.intel.com/products/processor/manuals/ |
261 | 256 | ||
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 323b65edfc97..9655cb49c7cb 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -372,7 +372,7 @@ void print_header(void) | |||
372 | if (do_rapl & RAPL_GFX) | 372 | if (do_rapl & RAPL_GFX) |
373 | outp += sprintf(outp, " GFX_J"); | 373 | outp += sprintf(outp, " GFX_J"); |
374 | if (do_rapl & RAPL_DRAM) | 374 | if (do_rapl & RAPL_DRAM) |
375 | outp += sprintf(outp, " RAM_W"); | 375 | outp += sprintf(outp, " RAM_J"); |
376 | if (do_rapl & RAPL_PKG_PERF_STATUS) | 376 | if (do_rapl & RAPL_PKG_PERF_STATUS) |
377 | outp += sprintf(outp, " PKG_%%"); | 377 | outp += sprintf(outp, " PKG_%%"); |
378 | if (do_rapl & RAPL_DRAM_PERF_STATUS) | 378 | if (do_rapl & RAPL_DRAM_PERF_STATUS) |
@@ -1157,7 +1157,7 @@ dump_nhm_platform_info(void) | |||
1157 | 1157 | ||
1158 | get_msr(base_cpu, MSR_NHM_PLATFORM_INFO, &msr); | 1158 | get_msr(base_cpu, MSR_NHM_PLATFORM_INFO, &msr); |
1159 | 1159 | ||
1160 | fprintf(stderr, "cpu0: MSR_NHM_PLATFORM_INFO: 0x%08llx\n", msr); | 1160 | fprintf(stderr, "cpu%d: MSR_NHM_PLATFORM_INFO: 0x%08llx\n", base_cpu, msr); |
1161 | 1161 | ||
1162 | ratio = (msr >> 40) & 0xFF; | 1162 | ratio = (msr >> 40) & 0xFF; |
1163 | fprintf(stderr, "%d * %.0f = %.0f MHz max efficiency frequency\n", | 1163 | fprintf(stderr, "%d * %.0f = %.0f MHz max efficiency frequency\n", |
@@ -1168,8 +1168,8 @@ dump_nhm_platform_info(void) | |||
1168 | ratio, bclk, ratio * bclk); | 1168 | ratio, bclk, ratio * bclk); |
1169 | 1169 | ||
1170 | get_msr(base_cpu, MSR_IA32_POWER_CTL, &msr); | 1170 | get_msr(base_cpu, MSR_IA32_POWER_CTL, &msr); |
1171 | fprintf(stderr, "cpu0: MSR_IA32_POWER_CTL: 0x%08llx (C1E auto-promotion: %sabled)\n", | 1171 | fprintf(stderr, "cpu%d: MSR_IA32_POWER_CTL: 0x%08llx (C1E auto-promotion: %sabled)\n", |
1172 | msr, msr & 0x2 ? "EN" : "DIS"); | 1172 | base_cpu, msr, msr & 0x2 ? "EN" : "DIS"); |
1173 | 1173 | ||
1174 | return; | 1174 | return; |
1175 | } | 1175 | } |
@@ -1182,7 +1182,7 @@ dump_hsw_turbo_ratio_limits(void) | |||
1182 | 1182 | ||
1183 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT2, &msr); | 1183 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT2, &msr); |
1184 | 1184 | ||
1185 | fprintf(stderr, "cpu0: MSR_TURBO_RATIO_LIMIT2: 0x%08llx\n", msr); | 1185 | fprintf(stderr, "cpu%d: MSR_TURBO_RATIO_LIMIT2: 0x%08llx\n", base_cpu, msr); |
1186 | 1186 | ||
1187 | ratio = (msr >> 8) & 0xFF; | 1187 | ratio = (msr >> 8) & 0xFF; |
1188 | if (ratio) | 1188 | if (ratio) |
@@ -1204,7 +1204,7 @@ dump_ivt_turbo_ratio_limits(void) | |||
1204 | 1204 | ||
1205 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT1, &msr); | 1205 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT1, &msr); |
1206 | 1206 | ||
1207 | fprintf(stderr, "cpu0: MSR_TURBO_RATIO_LIMIT1: 0x%08llx\n", msr); | 1207 | fprintf(stderr, "cpu%d: MSR_TURBO_RATIO_LIMIT1: 0x%08llx\n", base_cpu, msr); |
1208 | 1208 | ||
1209 | ratio = (msr >> 56) & 0xFF; | 1209 | ratio = (msr >> 56) & 0xFF; |
1210 | if (ratio) | 1210 | if (ratio) |
@@ -1256,7 +1256,7 @@ dump_nhm_turbo_ratio_limits(void) | |||
1256 | 1256 | ||
1257 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT, &msr); | 1257 | get_msr(base_cpu, MSR_TURBO_RATIO_LIMIT, &msr); |
1258 | 1258 | ||
1259 | fprintf(stderr, "cpu0: MSR_TURBO_RATIO_LIMIT: 0x%08llx\n", msr); | 1259 | fprintf(stderr, "cpu%d: MSR_TURBO_RATIO_LIMIT: 0x%08llx\n", base_cpu, msr); |
1260 | 1260 | ||
1261 | ratio = (msr >> 56) & 0xFF; | 1261 | ratio = (msr >> 56) & 0xFF; |
1262 | if (ratio) | 1262 | if (ratio) |
@@ -1312,8 +1312,8 @@ dump_knl_turbo_ratio_limits(void) | |||
1312 | 1312 | ||
1313 | get_msr(base_cpu, MSR_NHM_TURBO_RATIO_LIMIT, &msr); | 1313 | get_msr(base_cpu, MSR_NHM_TURBO_RATIO_LIMIT, &msr); |
1314 | 1314 | ||
1315 | fprintf(stderr, "cpu0: MSR_NHM_TURBO_RATIO_LIMIT: 0x%08llx\n", | 1315 | fprintf(stderr, "cpu%d: MSR_NHM_TURBO_RATIO_LIMIT: 0x%08llx\n", |
1316 | msr); | 1316 | base_cpu, msr); |
1317 | 1317 | ||
1318 | /** | 1318 | /** |
1319 | * Turbo encoding in KNL is as follows: | 1319 | * Turbo encoding in KNL is as follows: |
@@ -1371,7 +1371,7 @@ dump_nhm_cst_cfg(void) | |||
1371 | #define SNB_C1_AUTO_UNDEMOTE (1UL << 27) | 1371 | #define SNB_C1_AUTO_UNDEMOTE (1UL << 27) |
1372 | #define SNB_C3_AUTO_UNDEMOTE (1UL << 28) | 1372 | #define SNB_C3_AUTO_UNDEMOTE (1UL << 28) |
1373 | 1373 | ||
1374 | fprintf(stderr, "cpu0: MSR_NHM_SNB_PKG_CST_CFG_CTL: 0x%08llx", msr); | 1374 | fprintf(stderr, "cpu%d: MSR_NHM_SNB_PKG_CST_CFG_CTL: 0x%08llx", base_cpu, msr); |
1375 | 1375 | ||
1376 | fprintf(stderr, " (%s%s%s%s%slocked: pkg-cstate-limit=%d: %s)\n", | 1376 | fprintf(stderr, " (%s%s%s%s%slocked: pkg-cstate-limit=%d: %s)\n", |
1377 | (msr & SNB_C3_AUTO_UNDEMOTE) ? "UNdemote-C3, " : "", | 1377 | (msr & SNB_C3_AUTO_UNDEMOTE) ? "UNdemote-C3, " : "", |
@@ -1384,6 +1384,49 @@ dump_nhm_cst_cfg(void) | |||
1384 | return; | 1384 | return; |
1385 | } | 1385 | } |
1386 | 1386 | ||
1387 | static void | ||
1388 | dump_config_tdp(void) | ||
1389 | { | ||
1390 | unsigned long long msr; | ||
1391 | |||
1392 | get_msr(base_cpu, MSR_CONFIG_TDP_NOMINAL, &msr); | ||
1393 | fprintf(stderr, "cpu%d: MSR_CONFIG_TDP_NOMINAL: 0x%08llx", base_cpu, msr); | ||
1394 | fprintf(stderr, " (base_ratio=%d)\n", (unsigned int)msr & 0xEF); | ||
1395 | |||
1396 | get_msr(base_cpu, MSR_CONFIG_TDP_LEVEL_1, &msr); | ||
1397 | fprintf(stderr, "cpu%d: MSR_CONFIG_TDP_LEVEL_1: 0x%08llx (", base_cpu, msr); | ||
1398 | if (msr) { | ||
1399 | fprintf(stderr, "PKG_MIN_PWR_LVL1=%d ", (unsigned int)(msr >> 48) & 0xEFFF); | ||
1400 | fprintf(stderr, "PKG_MAX_PWR_LVL1=%d ", (unsigned int)(msr >> 32) & 0xEFFF); | ||
1401 | fprintf(stderr, "LVL1_RATIO=%d ", (unsigned int)(msr >> 16) & 0xEF); | ||
1402 | fprintf(stderr, "PKG_TDP_LVL1=%d", (unsigned int)(msr) & 0xEFFF); | ||
1403 | } | ||
1404 | fprintf(stderr, ")\n"); | ||
1405 | |||
1406 | get_msr(base_cpu, MSR_CONFIG_TDP_LEVEL_2, &msr); | ||
1407 | fprintf(stderr, "cpu%d: MSR_CONFIG_TDP_LEVEL_2: 0x%08llx (", base_cpu, msr); | ||
1408 | if (msr) { | ||
1409 | fprintf(stderr, "PKG_MIN_PWR_LVL2=%d ", (unsigned int)(msr >> 48) & 0xEFFF); | ||
1410 | fprintf(stderr, "PKG_MAX_PWR_LVL2=%d ", (unsigned int)(msr >> 32) & 0xEFFF); | ||
1411 | fprintf(stderr, "LVL2_RATIO=%d ", (unsigned int)(msr >> 16) & 0xEF); | ||
1412 | fprintf(stderr, "PKG_TDP_LVL2=%d", (unsigned int)(msr) & 0xEFFF); | ||
1413 | } | ||
1414 | fprintf(stderr, ")\n"); | ||
1415 | |||
1416 | get_msr(base_cpu, MSR_CONFIG_TDP_CONTROL, &msr); | ||
1417 | fprintf(stderr, "cpu%d: MSR_CONFIG_TDP_CONTROL: 0x%08llx (", base_cpu, msr); | ||
1418 | if ((msr) & 0x3) | ||
1419 | fprintf(stderr, "TDP_LEVEL=%d ", (unsigned int)(msr) & 0x3); | ||
1420 | fprintf(stderr, " lock=%d", (unsigned int)(msr >> 31) & 1); | ||
1421 | fprintf(stderr, ")\n"); | ||
1422 | |||
1423 | get_msr(base_cpu, MSR_TURBO_ACTIVATION_RATIO, &msr); | ||
1424 | fprintf(stderr, "cpu%d: MSR_TURBO_ACTIVATION_RATIO: 0x%08llx (", base_cpu, msr); | ||
1425 | fprintf(stderr, "MAX_NON_TURBO_RATIO=%d", (unsigned int)(msr) & 0xEF); | ||
1426 | fprintf(stderr, " lock=%d", (unsigned int)(msr >> 31) & 1); | ||
1427 | fprintf(stderr, ")\n"); | ||
1428 | } | ||
1429 | |||
1387 | void free_all_buffers(void) | 1430 | void free_all_buffers(void) |
1388 | { | 1431 | { |
1389 | CPU_FREE(cpu_present_set); | 1432 | CPU_FREE(cpu_present_set); |
@@ -1873,6 +1916,36 @@ int has_knl_turbo_ratio_limit(unsigned int family, unsigned int model) | |||
1873 | return 0; | 1916 | return 0; |
1874 | } | 1917 | } |
1875 | } | 1918 | } |
1919 | int has_config_tdp(unsigned int family, unsigned int model) | ||
1920 | { | ||
1921 | if (!genuine_intel) | ||
1922 | return 0; | ||
1923 | |||
1924 | if (family != 6) | ||
1925 | return 0; | ||
1926 | |||
1927 | switch (model) { | ||
1928 | case 0x3A: /* IVB */ | ||
1929 | case 0x3E: /* IVB Xeon */ | ||
1930 | |||
1931 | case 0x3C: /* HSW */ | ||
1932 | case 0x3F: /* HSX */ | ||
1933 | case 0x45: /* HSW */ | ||
1934 | case 0x46: /* HSW */ | ||
1935 | case 0x3D: /* BDW */ | ||
1936 | case 0x47: /* BDW */ | ||
1937 | case 0x4F: /* BDX */ | ||
1938 | case 0x56: /* BDX-DE */ | ||
1939 | case 0x4E: /* SKL */ | ||
1940 | case 0x5E: /* SKL */ | ||
1941 | |||
1942 | case 0x57: /* Knights Landing */ | ||
1943 | return 1; | ||
1944 | default: | ||
1945 | return 0; | ||
1946 | } | ||
1947 | } | ||
1948 | |||
1876 | static void | 1949 | static void |
1877 | dump_cstate_pstate_config_info(family, model) | 1950 | dump_cstate_pstate_config_info(family, model) |
1878 | { | 1951 | { |
@@ -1893,6 +1966,9 @@ dump_cstate_pstate_config_info(family, model) | |||
1893 | if (has_knl_turbo_ratio_limit(family, model)) | 1966 | if (has_knl_turbo_ratio_limit(family, model)) |
1894 | dump_knl_turbo_ratio_limits(); | 1967 | dump_knl_turbo_ratio_limits(); |
1895 | 1968 | ||
1969 | if (has_config_tdp(family, model)) | ||
1970 | dump_config_tdp(); | ||
1971 | |||
1896 | dump_nhm_cst_cfg(); | 1972 | dump_nhm_cst_cfg(); |
1897 | } | 1973 | } |
1898 | 1974 | ||
@@ -3014,7 +3090,7 @@ int get_and_dump_counters(void) | |||
3014 | } | 3090 | } |
3015 | 3091 | ||
3016 | void print_version() { | 3092 | void print_version() { |
3017 | fprintf(stderr, "turbostat version 4.7 27-May, 2015" | 3093 | fprintf(stderr, "turbostat version 4.7 17-June, 2015" |
3018 | " - Len Brown <lenb@kernel.org>\n"); | 3094 | " - Len Brown <lenb@kernel.org>\n"); |
3019 | } | 3095 | } |
3020 | 3096 | ||
@@ -3042,7 +3118,7 @@ void cmdline(int argc, char **argv) | |||
3042 | 3118 | ||
3043 | progname = argv[0]; | 3119 | progname = argv[0]; |
3044 | 3120 | ||
3045 | while ((opt = getopt_long_only(argc, argv, "C:c:Ddhi:JM:m:PpST:v", | 3121 | while ((opt = getopt_long_only(argc, argv, "+C:c:Ddhi:JM:m:PpST:v", |
3046 | long_options, &option_index)) != -1) { | 3122 | long_options, &option_index)) != -1) { |
3047 | switch (opt) { | 3123 | switch (opt) { |
3048 | case 'C': | 3124 | case 'C': |