Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux

Pull idle update from Len Brown:
"Add support for new Haswell-ULT CPU idle power states"

* 'release' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux:
intel_idle: initial C8, C9, C10 support
tools/power turbostat: display C8, C9, C10 residency

+78 -2
+3
arch/x86/include/uapi/asm/msr-index.h
··· 120 120 #define MSR_CORE_C6_RESIDENCY 0x000003fd 121 121 #define MSR_CORE_C7_RESIDENCY 0x000003fe 122 122 #define MSR_PKG_C2_RESIDENCY 0x0000060d 123 + #define MSR_PKG_C8_RESIDENCY 0x00000630 124 + #define MSR_PKG_C9_RESIDENCY 0x00000631 125 + #define MSR_PKG_C10_RESIDENCY 0x00000632 123 126 124 127 /* Run Time Average Power Limiting (RAPL) Interface */ 125 128
+21
drivers/idle/intel_idle.c
··· 273 273 .target_residency = 500, 274 274 .enter = &intel_idle }, 275 275 { 276 + .name = "C8-HSW", 277 + .desc = "MWAIT 0x40", 278 + .flags = MWAIT2flg(0x40) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 279 + .exit_latency = 300, 280 + .target_residency = 900, 281 + .enter = &intel_idle }, 282 + { 283 + .name = "C9-HSW", 284 + .desc = "MWAIT 0x50", 285 + .flags = MWAIT2flg(0x50) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 286 + .exit_latency = 600, 287 + .target_residency = 1800, 288 + .enter = &intel_idle }, 289 + { 290 + .name = "C10-HSW", 291 + .desc = "MWAIT 0x60", 292 + .flags = MWAIT2flg(0x60) | CPUIDLE_FLAG_TIME_VALID | CPUIDLE_FLAG_TLB_FLUSHED, 293 + .exit_latency = 2600, 294 + .target_residency = 7700, 295 + .enter = &intel_idle }, 296 + { 276 297 .enter = NULL } 277 298 }; 278 299
+1 -1
include/linux/cpuidle.h
··· 17 17 #include <linux/completion.h> 18 18 #include <linux/hrtimer.h> 19 19 20 - #define CPUIDLE_STATE_MAX 8 20 + #define CPUIDLE_STATE_MAX 10 21 21 #define CPUIDLE_NAME_LEN 16 22 22 #define CPUIDLE_DESC_LEN 32 23 23
+53 -1
tools/power/x86/turbostat/turbostat.c
··· 46 46 unsigned int skip_c1; 47 47 unsigned int do_nhm_cstates; 48 48 unsigned int do_snb_cstates; 49 + unsigned int do_c8_c9_c10; 49 50 unsigned int has_aperf; 50 51 unsigned int has_epb; 51 52 unsigned int units = 1000000000; /* Ghz etc */ ··· 121 120 unsigned long long pc3; 122 121 unsigned long long pc6; 123 122 unsigned long long pc7; 123 + unsigned long long pc8; 124 + unsigned long long pc9; 125 + unsigned long long pc10; 124 126 unsigned int package_id; 125 127 unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ 126 128 unsigned int energy_dram; /* MSR_DRAM_ENERGY_STATUS */ ··· 286 282 outp += sprintf(outp, " %%pc6"); 287 283 if (do_snb_cstates) 288 284 outp += sprintf(outp, " %%pc7"); 285 + if (do_c8_c9_c10) { 286 + outp += sprintf(outp, " %%pc8"); 287 + outp += sprintf(outp, " %%pc9"); 288 + outp += sprintf(outp, " %%pc10"); 289 + } 289 290 290 291 if (do_rapl & RAPL_PKG) 291 292 outp += sprintf(outp, " Pkg_W"); ··· 345 336 fprintf(stderr, "pc3: %016llX\n", p->pc3); 346 337 fprintf(stderr, "pc6: %016llX\n", p->pc6); 347 338 fprintf(stderr, "pc7: %016llX\n", p->pc7); 339 + fprintf(stderr, "pc8: %016llX\n", p->pc8); 340 + fprintf(stderr, "pc9: %016llX\n", p->pc9); 341 + fprintf(stderr, "pc10: %016llX\n", p->pc10); 348 342 fprintf(stderr, "Joules PKG: %0X\n", p->energy_pkg); 349 343 fprintf(stderr, "Joules COR: %0X\n", p->energy_cores); 350 344 fprintf(stderr, "Joules GFX: %0X\n", p->energy_gfx); ··· 505 493 outp += sprintf(outp, " %6.2f", 100.0 * p->pc6/t->tsc); 506 494 if (do_snb_cstates) 507 495 outp += sprintf(outp, " %6.2f", 100.0 * p->pc7/t->tsc); 496 + if (do_c8_c9_c10) { 497 + outp += sprintf(outp, " %6.2f", 100.0 * p->pc8/t->tsc); 498 + outp += sprintf(outp, " %6.2f", 100.0 * p->pc9/t->tsc); 499 + outp += sprintf(outp, " %6.2f", 100.0 * p->pc10/t->tsc); 500 + } 508 501 509 502 /* 510 503 * If measurement interval exceeds minimum RAPL Joule Counter range, ··· 586 569 old->pc3 = new->pc3 - old->pc3; 587 570 old->pc6 = new->pc6 - old->pc6; 588 571 old->pc7 = new->pc7 - old->pc7; 572 + old->pc8 = new->pc8 - old->pc8; 573 + old->pc9 = new->pc9 - old->pc9; 574 + old->pc10 = new->pc10 - old->pc10; 589 575 old->pkg_temp_c = new->pkg_temp_c; 590 576 591 577 DELTA_WRAP32(new->energy_pkg, old->energy_pkg); ··· 722 702 p->pc3 = 0; 723 703 p->pc6 = 0; 724 704 p->pc7 = 0; 705 + p->pc8 = 0; 706 + p->pc9 = 0; 707 + p->pc10 = 0; 725 708 726 709 p->energy_pkg = 0; 727 710 p->energy_dram = 0; ··· 763 740 average.packages.pc3 += p->pc3; 764 741 average.packages.pc6 += p->pc6; 765 742 average.packages.pc7 += p->pc7; 743 + average.packages.pc8 += p->pc8; 744 + average.packages.pc9 += p->pc9; 745 + average.packages.pc10 += p->pc10; 766 746 767 747 average.packages.energy_pkg += p->energy_pkg; 768 748 average.packages.energy_dram += p->energy_dram; ··· 807 781 average.packages.pc3 /= topo.num_packages; 808 782 average.packages.pc6 /= topo.num_packages; 809 783 average.packages.pc7 /= topo.num_packages; 784 + 785 + average.packages.pc8 /= topo.num_packages; 786 + average.packages.pc9 /= topo.num_packages; 787 + average.packages.pc10 /= topo.num_packages; 810 788 } 811 789 812 790 static unsigned long long rdtsc(void) ··· 909 879 return -11; 910 880 if (get_msr(cpu, MSR_PKG_C7_RESIDENCY, &p->pc7)) 911 881 return -12; 882 + } 883 + if (do_c8_c9_c10) { 884 + if (get_msr(cpu, MSR_PKG_C8_RESIDENCY, &p->pc8)) 885 + return -13; 886 + if (get_msr(cpu, MSR_PKG_C9_RESIDENCY, &p->pc9)) 887 + return -13; 888 + if (get_msr(cpu, MSR_PKG_C10_RESIDENCY, &p->pc10)) 889 + return -13; 912 890 } 913 891 if (do_rapl & RAPL_PKG) { 914 892 if (get_msr(cpu, MSR_PKG_ENERGY_STATUS, &msr)) ··· 1800 1762 return 0; 1801 1763 } 1802 1764 1765 + int has_c8_c9_c10(unsigned int family, unsigned int model) 1766 + { 1767 + if (!genuine_intel) 1768 + return 0; 1769 + 1770 + switch (model) { 1771 + case 0x45: 1772 + return 1; 1773 + } 1774 + return 0; 1775 + } 1776 + 1777 + 1803 1778 double discover_bclk(unsigned int family, unsigned int model) 1804 1779 { 1805 1780 if (is_snb(family, model)) ··· 1969 1918 do_nhm_cstates = genuine_intel; /* all Intel w/ non-stop TSC have NHM counters */ 1970 1919 do_smi = do_nhm_cstates; 1971 1920 do_snb_cstates = is_snb(family, model); 1921 + do_c8_c9_c10 = has_c8_c9_c10(family, model); 1972 1922 bclk = discover_bclk(family, model); 1973 1923 1974 1924 do_nehalem_turbo_ratio_limit = has_nehalem_turbo_ratio_limit(family, model); ··· 2331 2279 cmdline(argc, argv); 2332 2280 2333 2281 if (verbose) 2334 - fprintf(stderr, "turbostat v3.3 March 15, 2013" 2282 + fprintf(stderr, "turbostat v3.4 April 17, 2013" 2335 2283 " - Len Brown <lenb@kernel.org>\n"); 2336 2284 2337 2285 turbostat_init();