diff options
author | Len Brown <len.brown@intel.com> | 2015-03-26 00:50:30 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2015-04-18 14:20:51 -0400 |
commit | 0b2bb6925eb602eae993a4b5c282a8c18ad1c949 (patch) | |
tree | 24367037aecceac63d546eff7dc249871de4ee3a /tools | |
parent | f82263c6989c31ae9b94cecddffb29dcbec38710 (diff) |
tools/power turbostat: Initial Skylake support
Skylake adds some additional residency counters.
Skylake supports a different mix of RAPL registers
from any previous product.
In most other ways, Skylake is like Broadwell.
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/power/x86/turbostat/turbostat.c | 124 |
1 files changed, 111 insertions, 13 deletions
diff --git a/tools/power/x86/turbostat/turbostat.c b/tools/power/x86/turbostat/turbostat.c index 50341a322cb8..ad5688914446 100644 --- a/tools/power/x86/turbostat/turbostat.c +++ b/tools/power/x86/turbostat/turbostat.c | |||
@@ -57,6 +57,7 @@ unsigned int do_pc3; | |||
57 | unsigned int do_pc6; | 57 | unsigned int do_pc6; |
58 | unsigned int do_pc7; | 58 | unsigned int do_pc7; |
59 | unsigned int do_c8_c9_c10; | 59 | unsigned int do_c8_c9_c10; |
60 | unsigned int do_skl_residency; | ||
60 | unsigned int do_slm_cstates; | 61 | unsigned int do_slm_cstates; |
61 | unsigned int use_c1_residency_msr; | 62 | unsigned int use_c1_residency_msr; |
62 | unsigned int has_aperf; | 63 | unsigned int has_aperf; |
@@ -99,18 +100,18 @@ unsigned int do_ring_perf_limit_reasons; | |||
99 | #define RAPL_DRAM (1 << 3) | 100 | #define RAPL_DRAM (1 << 3) |
100 | /* 0x618 MSR_DRAM_POWER_LIMIT */ | 101 | /* 0x618 MSR_DRAM_POWER_LIMIT */ |
101 | /* 0x619 MSR_DRAM_ENERGY_STATUS */ | 102 | /* 0x619 MSR_DRAM_ENERGY_STATUS */ |
102 | /* 0x61c MSR_DRAM_POWER_INFO */ | ||
103 | #define RAPL_DRAM_PERF_STATUS (1 << 4) | 103 | #define RAPL_DRAM_PERF_STATUS (1 << 4) |
104 | /* 0x61b MSR_DRAM_PERF_STATUS */ | 104 | /* 0x61b MSR_DRAM_PERF_STATUS */ |
105 | #define RAPL_DRAM_POWER_INFO (1 << 5) | ||
106 | /* 0x61c MSR_DRAM_POWER_INFO */ | ||
105 | 107 | ||
106 | #define RAPL_CORES (1 << 5) | 108 | #define RAPL_CORES (1 << 6) |
107 | /* 0x638 MSR_PP0_POWER_LIMIT */ | 109 | /* 0x638 MSR_PP0_POWER_LIMIT */ |
108 | /* 0x639 MSR_PP0_ENERGY_STATUS */ | 110 | /* 0x639 MSR_PP0_ENERGY_STATUS */ |
109 | #define RAPL_CORE_POLICY (1 << 6) | 111 | #define RAPL_CORE_POLICY (1 << 7) |
110 | /* 0x63a MSR_PP0_POLICY */ | 112 | /* 0x63a MSR_PP0_POLICY */ |
111 | 113 | ||
112 | 114 | #define RAPL_GFX (1 << 8) | |
113 | #define RAPL_GFX (1 << 7) | ||
114 | /* 0x640 MSR_PP1_POWER_LIMIT */ | 115 | /* 0x640 MSR_PP1_POWER_LIMIT */ |
115 | /* 0x641 MSR_PP1_ENERGY_STATUS */ | 116 | /* 0x641 MSR_PP1_ENERGY_STATUS */ |
116 | /* 0x642 MSR_PP1_POLICY */ | 117 | /* 0x642 MSR_PP1_POLICY */ |
@@ -157,6 +158,10 @@ struct pkg_data { | |||
157 | unsigned long long pc8; | 158 | unsigned long long pc8; |
158 | unsigned long long pc9; | 159 | unsigned long long pc9; |
159 | unsigned long long pc10; | 160 | unsigned long long pc10; |
161 | unsigned long long pkg_wtd_core_c0; | ||
162 | unsigned long long pkg_any_core_c0; | ||
163 | unsigned long long pkg_any_gfxe_c0; | ||
164 | unsigned long long pkg_both_core_gfxe_c0; | ||
160 | unsigned int package_id; | 165 | unsigned int package_id; |
161 | unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ | 166 | unsigned int energy_pkg; /* MSR_PKG_ENERGY_STATUS */ |
162 | unsigned int energy_dram; /* MSR_DRAM_ENERGY_STATUS */ | 167 | unsigned int energy_dram; /* MSR_DRAM_ENERGY_STATUS */ |
@@ -320,6 +325,13 @@ void print_header(void) | |||
320 | if (do_ptm) | 325 | if (do_ptm) |
321 | outp += sprintf(outp, " PkgTmp"); | 326 | outp += sprintf(outp, " PkgTmp"); |
322 | 327 | ||
328 | if (do_skl_residency) { | ||
329 | outp += sprintf(outp, " Totl%%C0"); | ||
330 | outp += sprintf(outp, " Any%%C0"); | ||
331 | outp += sprintf(outp, " GFX%%C0"); | ||
332 | outp += sprintf(outp, " CPUGFX%%"); | ||
333 | } | ||
334 | |||
323 | if (do_pc2) | 335 | if (do_pc2) |
324 | outp += sprintf(outp, " Pkg%%pc2"); | 336 | outp += sprintf(outp, " Pkg%%pc2"); |
325 | if (do_pc3) | 337 | if (do_pc3) |
@@ -401,6 +413,12 @@ int dump_counters(struct thread_data *t, struct core_data *c, | |||
401 | 413 | ||
402 | if (p) { | 414 | if (p) { |
403 | outp += sprintf(outp, "package: %d\n", p->package_id); | 415 | outp += sprintf(outp, "package: %d\n", p->package_id); |
416 | |||
417 | outp += sprintf(outp, "Weighted cores: %016llX\n", p->pkg_wtd_core_c0); | ||
418 | outp += sprintf(outp, "Any cores: %016llX\n", p->pkg_any_core_c0); | ||
419 | outp += sprintf(outp, "Any GFX: %016llX\n", p->pkg_any_gfxe_c0); | ||
420 | outp += sprintf(outp, "CPU + GFX: %016llX\n", p->pkg_both_core_gfxe_c0); | ||
421 | |||
404 | outp += sprintf(outp, "pc2: %016llX\n", p->pc2); | 422 | outp += sprintf(outp, "pc2: %016llX\n", p->pc2); |
405 | if (do_pc3) | 423 | if (do_pc3) |
406 | outp += sprintf(outp, "pc3: %016llX\n", p->pc3); | 424 | outp += sprintf(outp, "pc3: %016llX\n", p->pc3); |
@@ -539,9 +557,18 @@ int format_counters(struct thread_data *t, struct core_data *c, | |||
539 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) | 557 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) |
540 | goto done; | 558 | goto done; |
541 | 559 | ||
560 | /* PkgTmp */ | ||
542 | if (do_ptm) | 561 | if (do_ptm) |
543 | outp += sprintf(outp, "%8d", p->pkg_temp_c); | 562 | outp += sprintf(outp, "%8d", p->pkg_temp_c); |
544 | 563 | ||
564 | /* Totl%C0, Any%C0 GFX%C0 CPUGFX% */ | ||
565 | if (do_skl_residency) { | ||
566 | outp += sprintf(outp, "%8.2f", 100.0 * p->pkg_wtd_core_c0/t->tsc); | ||
567 | outp += sprintf(outp, "%8.2f", 100.0 * p->pkg_any_core_c0/t->tsc); | ||
568 | outp += sprintf(outp, "%8.2f", 100.0 * p->pkg_any_gfxe_c0/t->tsc); | ||
569 | outp += sprintf(outp, "%8.2f", 100.0 * p->pkg_both_core_gfxe_c0/t->tsc); | ||
570 | } | ||
571 | |||
545 | if (do_pc2) | 572 | if (do_pc2) |
546 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc2/t->tsc); | 573 | outp += sprintf(outp, "%8.2f", 100.0 * p->pc2/t->tsc); |
547 | if (do_pc3) | 574 | if (do_pc3) |
@@ -644,6 +671,13 @@ void format_all_counters(struct thread_data *t, struct core_data *c, struct pkg_ | |||
644 | void | 671 | void |
645 | delta_package(struct pkg_data *new, struct pkg_data *old) | 672 | delta_package(struct pkg_data *new, struct pkg_data *old) |
646 | { | 673 | { |
674 | |||
675 | if (do_skl_residency) { | ||
676 | old->pkg_wtd_core_c0 = new->pkg_wtd_core_c0 - old->pkg_wtd_core_c0; | ||
677 | old->pkg_any_core_c0 = new->pkg_any_core_c0 - old->pkg_any_core_c0; | ||
678 | old->pkg_any_gfxe_c0 = new->pkg_any_gfxe_c0 - old->pkg_any_gfxe_c0; | ||
679 | old->pkg_both_core_gfxe_c0 = new->pkg_both_core_gfxe_c0 - old->pkg_both_core_gfxe_c0; | ||
680 | } | ||
647 | old->pc2 = new->pc2 - old->pc2; | 681 | old->pc2 = new->pc2 - old->pc2; |
648 | if (do_pc3) | 682 | if (do_pc3) |
649 | old->pc3 = new->pc3 - old->pc3; | 683 | old->pc3 = new->pc3 - old->pc3; |
@@ -790,6 +824,11 @@ void clear_counters(struct thread_data *t, struct core_data *c, struct pkg_data | |||
790 | c->c7 = 0; | 824 | c->c7 = 0; |
791 | c->core_temp_c = 0; | 825 | c->core_temp_c = 0; |
792 | 826 | ||
827 | p->pkg_wtd_core_c0 = 0; | ||
828 | p->pkg_any_core_c0 = 0; | ||
829 | p->pkg_any_gfxe_c0 = 0; | ||
830 | p->pkg_both_core_gfxe_c0 = 0; | ||
831 | |||
793 | p->pc2 = 0; | 832 | p->pc2 = 0; |
794 | if (do_pc3) | 833 | if (do_pc3) |
795 | p->pc3 = 0; | 834 | p->pc3 = 0; |
@@ -834,6 +873,13 @@ int sum_counters(struct thread_data *t, struct core_data *c, | |||
834 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) | 873 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) |
835 | return 0; | 874 | return 0; |
836 | 875 | ||
876 | if (do_skl_residency) { | ||
877 | average.packages.pkg_wtd_core_c0 += p->pkg_wtd_core_c0; | ||
878 | average.packages.pkg_any_core_c0 += p->pkg_any_core_c0; | ||
879 | average.packages.pkg_any_gfxe_c0 += p->pkg_any_gfxe_c0; | ||
880 | average.packages.pkg_both_core_gfxe_c0 += p->pkg_both_core_gfxe_c0; | ||
881 | } | ||
882 | |||
837 | average.packages.pc2 += p->pc2; | 883 | average.packages.pc2 += p->pc2; |
838 | if (do_pc3) | 884 | if (do_pc3) |
839 | average.packages.pc3 += p->pc3; | 885 | average.packages.pc3 += p->pc3; |
@@ -881,6 +927,13 @@ void compute_average(struct thread_data *t, struct core_data *c, | |||
881 | average.cores.c6 /= topo.num_cores; | 927 | average.cores.c6 /= topo.num_cores; |
882 | average.cores.c7 /= topo.num_cores; | 928 | average.cores.c7 /= topo.num_cores; |
883 | 929 | ||
930 | if (do_skl_residency) { | ||
931 | average.packages.pkg_wtd_core_c0 /= topo.num_packages; | ||
932 | average.packages.pkg_any_core_c0 /= topo.num_packages; | ||
933 | average.packages.pkg_any_gfxe_c0 /= topo.num_packages; | ||
934 | average.packages.pkg_both_core_gfxe_c0 /= topo.num_packages; | ||
935 | } | ||
936 | |||
884 | average.packages.pc2 /= topo.num_packages; | 937 | average.packages.pc2 /= topo.num_packages; |
885 | if (do_pc3) | 938 | if (do_pc3) |
886 | average.packages.pc3 /= topo.num_packages; | 939 | average.packages.pc3 /= topo.num_packages; |
@@ -987,6 +1040,16 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) | |||
987 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) | 1040 | if (!(t->flags & CPU_IS_FIRST_CORE_IN_PACKAGE)) |
988 | return 0; | 1041 | return 0; |
989 | 1042 | ||
1043 | if (do_skl_residency) { | ||
1044 | if (get_msr(cpu, MSR_PKG_WEIGHTED_CORE_C0_RES, &p->pkg_wtd_core_c0)) | ||
1045 | return -10; | ||
1046 | if (get_msr(cpu, MSR_PKG_ANY_CORE_C0_RES, &p->pkg_any_core_c0)) | ||
1047 | return -11; | ||
1048 | if (get_msr(cpu, MSR_PKG_ANY_GFXE_C0_RES, &p->pkg_any_gfxe_c0)) | ||
1049 | return -12; | ||
1050 | if (get_msr(cpu, MSR_PKG_BOTH_CORE_GFXE_C0_RES, &p->pkg_both_core_gfxe_c0)) | ||
1051 | return -13; | ||
1052 | } | ||
990 | if (do_pc3) | 1053 | if (do_pc3) |
991 | if (get_msr(cpu, MSR_PKG_C3_RESIDENCY, &p->pc3)) | 1054 | if (get_msr(cpu, MSR_PKG_C3_RESIDENCY, &p->pc3)) |
992 | return -9; | 1055 | return -9; |
@@ -1063,15 +1126,18 @@ int get_counters(struct thread_data *t, struct core_data *c, struct pkg_data *p) | |||
1063 | #define PCL_6R 9 /* PC6 Retention */ | 1126 | #define PCL_6R 9 /* PC6 Retention */ |
1064 | #define PCL__7 10 /* PC7 */ | 1127 | #define PCL__7 10 /* PC7 */ |
1065 | #define PCL_7S 11 /* PC7 Shrink */ | 1128 | #define PCL_7S 11 /* PC7 Shrink */ |
1066 | #define PCLUNL 12 /* Unlimited */ | 1129 | #define PCL__8 12 /* PC8 */ |
1130 | #define PCL__9 13 /* PC9 */ | ||
1131 | #define PCLUNL 14 /* Unlimited */ | ||
1067 | 1132 | ||
1068 | int pkg_cstate_limit = PCLUKN; | 1133 | int pkg_cstate_limit = PCLUKN; |
1069 | char *pkg_cstate_limit_strings[] = { "reserved", "unknown", "pc0", "pc1", "pc2", | 1134 | char *pkg_cstate_limit_strings[] = { "reserved", "unknown", "pc0", "pc1", "pc2", |
1070 | "pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "unlimited"}; | 1135 | "pc3", "pc4", "pc6", "pc6n", "pc6r", "pc7", "pc7s", "pc8", "pc9", "unlimited"}; |
1071 | 1136 | ||
1072 | int nhm_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCL__3, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLUNL}; | 1137 | int nhm_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCL__3, PCL__6, PCL__7, PCLRSV, PCLRSV, PCLUNL}; |
1073 | int snb_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCL__7, PCL_7S, PCLRSV, PCLUNL}; | 1138 | int snb_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCL__7, PCL_7S, PCLRSV, PCLUNL}; |
1074 | int hsw_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, PCLRSV, PCLUNL}; | 1139 | int hsw_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, PCLRSV, PCLUNL}; |
1140 | int skl_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL__3, PCL__6, PCL__7, PCL_7S, PCL__8, PCL__9}; | ||
1075 | int slv_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7}; | 1141 | int slv_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCLRSV, PCLRSV, PCL__4, PCLRSV, PCL__6, PCL__7}; |
1076 | int amt_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7}; | 1142 | int amt_pkg_cstate_limits[8] = {PCL__0, PCL__1, PCL__2, PCLRSV, PCLRSV, PCLRSV, PCL__6, PCL__7}; |
1077 | int phi_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL}; | 1143 | int phi_pkg_cstate_limits[8] = {PCL__0, PCL__2, PCL_6N, PCL_6R, PCLRSV, PCLRSV, PCLRSV, PCLUNL}; |
@@ -1619,6 +1685,8 @@ int probe_nhm_msrs(unsigned int family, unsigned int model) | |||
1619 | case 0x47: /* BDW */ | 1685 | case 0x47: /* BDW */ |
1620 | case 0x4F: /* BDX */ | 1686 | case 0x4F: /* BDX */ |
1621 | case 0x56: /* BDX-DE */ | 1687 | case 0x56: /* BDX-DE */ |
1688 | case 0x4E: /* SKL */ | ||
1689 | case 0x5E: /* SKL */ | ||
1622 | pkg_cstate_limits = hsw_pkg_cstate_limits; | 1690 | pkg_cstate_limits = hsw_pkg_cstate_limits; |
1623 | break; | 1691 | break; |
1624 | case 0x37: /* BYT */ | 1692 | case 0x37: /* BYT */ |
@@ -1895,14 +1963,18 @@ void rapl_probe(unsigned int family, unsigned int model) | |||
1895 | case 0x47: /* BDW */ | 1963 | case 0x47: /* BDW */ |
1896 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; | 1964 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_GFX | RAPL_PKG_POWER_INFO; |
1897 | break; | 1965 | break; |
1966 | case 0x4E: /* SKL */ | ||
1967 | case 0x5E: /* SKL */ | ||
1968 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; | ||
1969 | break; | ||
1898 | case 0x3F: /* HSX */ | 1970 | case 0x3F: /* HSX */ |
1899 | case 0x4F: /* BDX */ | 1971 | case 0x4F: /* BDX */ |
1900 | case 0x56: /* BDX-DE */ | 1972 | case 0x56: /* BDX-DE */ |
1901 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; | 1973 | do_rapl = RAPL_PKG | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_DRAM_PERF_STATUS | RAPL_PKG_PERF_STATUS | RAPL_PKG_POWER_INFO; |
1902 | break; | 1974 | break; |
1903 | case 0x2D: | 1975 | case 0x2D: |
1904 | case 0x3E: | 1976 | case 0x3E: |
1905 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS | RAPL_PKG_POWER_INFO; | 1977 | do_rapl = RAPL_PKG | RAPL_CORES | RAPL_CORE_POLICY | RAPL_DRAM | RAPL_DRAM_POWER_INFO | RAPL_PKG_PERF_STATUS | RAPL_DRAM_PERF_STATUS | RAPL_PKG_POWER_INFO; |
1906 | break; | 1978 | break; |
1907 | case 0x37: /* BYT */ | 1979 | case 0x37: /* BYT */ |
1908 | case 0x4D: /* AVN */ | 1980 | case 0x4D: /* AVN */ |
@@ -2092,19 +2164,18 @@ int print_rapl(struct thread_data *t, struct core_data *c, struct pkg_data *p) | |||
2092 | ((msr >> 48) & 1) ? "EN" : "DIS"); | 2164 | ((msr >> 48) & 1) ? "EN" : "DIS"); |
2093 | } | 2165 | } |
2094 | 2166 | ||
2095 | if (do_rapl & RAPL_DRAM) { | 2167 | if (do_rapl & RAPL_DRAM_POWER_INFO) { |
2096 | if (get_msr(cpu, MSR_DRAM_POWER_INFO, &msr)) | 2168 | if (get_msr(cpu, MSR_DRAM_POWER_INFO, &msr)) |
2097 | return -6; | 2169 | return -6; |
2098 | 2170 | ||
2099 | |||
2100 | fprintf(stderr, "cpu%d: MSR_DRAM_POWER_INFO,: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", | 2171 | fprintf(stderr, "cpu%d: MSR_DRAM_POWER_INFO,: 0x%08llx (%.0f W TDP, RAPL %.0f - %.0f W, %f sec.)\n", |
2101 | cpu, msr, | 2172 | cpu, msr, |
2102 | ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, | 2173 | ((msr >> 0) & RAPL_POWER_GRANULARITY) * rapl_power_units, |
2103 | ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, | 2174 | ((msr >> 16) & RAPL_POWER_GRANULARITY) * rapl_power_units, |
2104 | ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, | 2175 | ((msr >> 32) & RAPL_POWER_GRANULARITY) * rapl_power_units, |
2105 | ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); | 2176 | ((msr >> 48) & RAPL_TIME_GRANULARITY) * rapl_time_units); |
2106 | 2177 | } | |
2107 | 2178 | if (do_rapl & RAPL_DRAM) { | |
2108 | if (get_msr(cpu, MSR_DRAM_POWER_LIMIT, &msr)) | 2179 | if (get_msr(cpu, MSR_DRAM_POWER_LIMIT, &msr)) |
2109 | return -9; | 2180 | return -9; |
2110 | fprintf(stderr, "cpu%d: MSR_DRAM_POWER_LIMIT: 0x%08llx (%slocked)\n", | 2181 | fprintf(stderr, "cpu%d: MSR_DRAM_POWER_LIMIT: 0x%08llx (%slocked)\n", |
@@ -2173,6 +2244,8 @@ int has_snb_msrs(unsigned int family, unsigned int model) | |||
2173 | case 0x47: /* BDW */ | 2244 | case 0x47: /* BDW */ |
2174 | case 0x4F: /* BDX */ | 2245 | case 0x4F: /* BDX */ |
2175 | case 0x56: /* BDX-DE */ | 2246 | case 0x56: /* BDX-DE */ |
2247 | case 0x4E: /* SKL */ | ||
2248 | case 0x5E: /* SKL */ | ||
2176 | return 1; | 2249 | return 1; |
2177 | } | 2250 | } |
2178 | return 0; | 2251 | return 0; |
@@ -2193,12 +2266,36 @@ int has_hsw_msrs(unsigned int family, unsigned int model) | |||
2193 | switch (model) { | 2266 | switch (model) { |
2194 | case 0x45: /* HSW */ | 2267 | case 0x45: /* HSW */ |
2195 | case 0x3D: /* BDW */ | 2268 | case 0x3D: /* BDW */ |
2269 | case 0x4E: /* SKL */ | ||
2270 | case 0x5E: /* SKL */ | ||
2271 | return 1; | ||
2272 | } | ||
2273 | return 0; | ||
2274 | } | ||
2275 | |||
2276 | /* | ||
2277 | * SKL adds support for additional MSRS: | ||
2278 | * | ||
2279 | * MSR_PKG_WEIGHTED_CORE_C0_RES 0x00000658 | ||
2280 | * MSR_PKG_ANY_CORE_C0_RES 0x00000659 | ||
2281 | * MSR_PKG_ANY_GFXE_C0_RES 0x0000065A | ||
2282 | * MSR_PKG_BOTH_CORE_GFXE_C0_RES 0x0000065B | ||
2283 | */ | ||
2284 | int has_skl_msrs(unsigned int family, unsigned int model) | ||
2285 | { | ||
2286 | if (!genuine_intel) | ||
2287 | return 0; | ||
2288 | |||
2289 | switch (model) { | ||
2290 | case 0x4E: /* SKL */ | ||
2291 | case 0x5E: /* SKL */ | ||
2196 | return 1; | 2292 | return 1; |
2197 | } | 2293 | } |
2198 | return 0; | 2294 | return 0; |
2199 | } | 2295 | } |
2200 | 2296 | ||
2201 | 2297 | ||
2298 | |||
2202 | int is_slm(unsigned int family, unsigned int model) | 2299 | int is_slm(unsigned int family, unsigned int model) |
2203 | { | 2300 | { |
2204 | if (!genuine_intel) | 2301 | if (!genuine_intel) |
@@ -2384,6 +2481,7 @@ void process_cpuid() | |||
2384 | do_pc6 = (pkg_cstate_limit >= PCL__6); | 2481 | do_pc6 = (pkg_cstate_limit >= PCL__6); |
2385 | do_pc7 = do_snb_cstates && (pkg_cstate_limit >= PCL__7); | 2482 | do_pc7 = do_snb_cstates && (pkg_cstate_limit >= PCL__7); |
2386 | do_c8_c9_c10 = has_hsw_msrs(family, model); | 2483 | do_c8_c9_c10 = has_hsw_msrs(family, model); |
2484 | do_skl_residency = has_skl_msrs(family, model); | ||
2387 | do_slm_cstates = is_slm(family, model); | 2485 | do_slm_cstates = is_slm(family, model); |
2388 | bclk = discover_bclk(family, model); | 2486 | bclk = discover_bclk(family, model); |
2389 | 2487 | ||