tools/power turbostat: Support more than 64 built-in-counters

We have out-grown the ability to use a 64-bit memory location
to inventory every possible built-in counter.
Leverage the the CPU_SET(3) macros to break this barrier.

Also, break the Joules & Watts counters into two,
since we can no longer 'or' them together...

Signed-off-by: Len Brown <len.brown@intel.com>

Len Brown 8d14a098 d240b441

+402 -150
+402 -150
tools/power/x86/turbostat/turbostat.c
··· 210 { 0x0, "pct_idle", NULL, 0, 0, 0, NULL, 0 }, 211 }; 212 213 - #define MAX_BIC (sizeof(bic) / sizeof(struct msr_counter)) 214 - #define BIC_USEC (1ULL << 0) 215 - #define BIC_TOD (1ULL << 1) 216 - #define BIC_Package (1ULL << 2) 217 - #define BIC_Node (1ULL << 3) 218 - #define BIC_Avg_MHz (1ULL << 4) 219 - #define BIC_Busy (1ULL << 5) 220 - #define BIC_Bzy_MHz (1ULL << 6) 221 - #define BIC_TSC_MHz (1ULL << 7) 222 - #define BIC_IRQ (1ULL << 8) 223 - #define BIC_SMI (1ULL << 9) 224 - #define BIC_cpuidle (1ULL << 10) 225 - #define BIC_CPU_c1 (1ULL << 11) 226 - #define BIC_CPU_c3 (1ULL << 12) 227 - #define BIC_CPU_c6 (1ULL << 13) 228 - #define BIC_CPU_c7 (1ULL << 14) 229 - #define BIC_ThreadC (1ULL << 15) 230 - #define BIC_CoreTmp (1ULL << 16) 231 - #define BIC_CoreCnt (1ULL << 17) 232 - #define BIC_PkgTmp (1ULL << 18) 233 - #define BIC_GFX_rc6 (1ULL << 19) 234 - #define BIC_GFXMHz (1ULL << 20) 235 - #define BIC_Pkgpc2 (1ULL << 21) 236 - #define BIC_Pkgpc3 (1ULL << 22) 237 - #define BIC_Pkgpc6 (1ULL << 23) 238 - #define BIC_Pkgpc7 (1ULL << 24) 239 - #define BIC_Pkgpc8 (1ULL << 25) 240 - #define BIC_Pkgpc9 (1ULL << 26) 241 - #define BIC_Pkgpc10 (1ULL << 27) 242 - #define BIC_CPU_LPI (1ULL << 28) 243 - #define BIC_SYS_LPI (1ULL << 29) 244 - #define BIC_PkgWatt (1ULL << 30) 245 - #define BIC_CorWatt (1ULL << 31) 246 - #define BIC_GFXWatt (1ULL << 32) 247 - #define BIC_PkgCnt (1ULL << 33) 248 - #define BIC_RAMWatt (1ULL << 34) 249 - #define BIC_PKG__ (1ULL << 35) 250 - #define BIC_RAM__ (1ULL << 36) 251 - #define BIC_Pkg_J (1ULL << 37) 252 - #define BIC_Cor_J (1ULL << 38) 253 - #define BIC_GFX_J (1ULL << 39) 254 - #define BIC_RAM_J (1ULL << 40) 255 - #define BIC_Mod_c6 (1ULL << 41) 256 - #define BIC_Totl_c0 (1ULL << 42) 257 - #define BIC_Any_c0 (1ULL << 43) 258 - #define BIC_GFX_c0 (1ULL << 44) 259 - #define BIC_CPUGFX (1ULL << 45) 260 - #define BIC_Core (1ULL << 46) 261 - #define BIC_CPU (1ULL << 47) 262 - #define BIC_APIC (1ULL << 48) 263 - #define BIC_X2APIC (1ULL << 49) 264 - #define BIC_Die (1ULL << 50) 265 - #define BIC_GFXACTMHz (1ULL << 51) 266 - #define BIC_IPC (1ULL << 52) 267 - #define BIC_CORE_THROT_CNT (1ULL << 53) 268 - #define BIC_UNCORE_MHZ (1ULL << 54) 269 - #define BIC_SAM_mc6 (1ULL << 55) 270 - #define BIC_SAMMHz (1ULL << 56) 271 - #define BIC_SAMACTMHz (1ULL << 57) 272 - #define BIC_Diec6 (1ULL << 58) 273 - #define BIC_SysWatt (1ULL << 59) 274 - #define BIC_Sys_J (1ULL << 60) 275 - #define BIC_NMI (1ULL << 61) 276 - #define BIC_CPU_c1e (1ULL << 62) 277 - #define BIC_pct_idle (1ULL << 63) 278 279 - #define BIC_GROUP_TOPOLOGY (BIC_Package | BIC_Node | BIC_CoreCnt | BIC_PkgCnt | BIC_Core | BIC_CPU | BIC_Die) 280 - #define BIC_GROUP_THERMAL_PWR (BIC_CoreTmp | BIC_PkgTmp | BIC_PkgWatt | BIC_CorWatt | BIC_GFXWatt | BIC_RAMWatt | BIC_PKG__ | BIC_RAM__ | BIC_SysWatt) 281 - #define BIC_GROUP_FREQUENCY (BIC_Avg_MHz | BIC_Busy | BIC_Bzy_MHz | BIC_TSC_MHz | BIC_GFXMHz | BIC_GFXACTMHz | BIC_SAMMHz | BIC_SAMACTMHz | BIC_UNCORE_MHZ) 282 - #define BIC_GROUP_HW_IDLE (BIC_Busy | BIC_CPU_c1 | BIC_CPU_c3 | BIC_CPU_c6 | BIC_CPU_c7 | BIC_GFX_rc6 | BIC_Pkgpc2 | BIC_Pkgpc3 | BIC_Pkgpc6 | BIC_Pkgpc7 | BIC_Pkgpc8 | BIC_Pkgpc9 | BIC_Pkgpc10 | BIC_CPU_LPI | BIC_SYS_LPI | BIC_Mod_c6 | BIC_Totl_c0 | BIC_Any_c0 | BIC_GFX_c0 | BIC_CPUGFX | BIC_SAM_mc6 | BIC_Diec6) 283 - #define BIC_GROUP_SW_IDLE (BIC_Busy | BIC_cpuidle | BIC_pct_idle ) 284 - #define BIC_GROUP_IDLE (BIC_GROUP_HW_IDLE | BIC_pct_idle) 285 - #define BIC_OTHER (BIC_IRQ | BIC_NMI | BIC_SMI | BIC_ThreadC | BIC_CoreTmp | BIC_IPC) 286 287 - #define BIC_DISABLED_BY_DEFAULT (BIC_USEC | BIC_TOD | BIC_APIC | BIC_X2APIC | BIC_cpuidle) 288 289 - unsigned long long bic_enabled = (0xFFFFFFFFFFFFFFFFULL & ~BIC_DISABLED_BY_DEFAULT); 290 - unsigned long long bic_present = BIC_USEC | BIC_TOD | BIC_cpuidle | BIC_pct_idle | BIC_APIC | BIC_X2APIC; 291 292 - #define DO_BIC(COUNTER_NAME) (bic_enabled & bic_present & COUNTER_NAME) 293 - #define DO_BIC_READ(COUNTER_NAME) (bic_present & COUNTER_NAME) 294 - #define ENABLE_BIC(COUNTER_NAME) (bic_enabled |= COUNTER_NAME) 295 - #define BIC_PRESENT(COUNTER_BIT) (bic_present |= COUNTER_BIT) 296 - #define BIC_NOT_PRESENT(COUNTER_BIT) (bic_present &= ~COUNTER_BIT) 297 - #define BIC_IS_ENABLED(COUNTER_BIT) (bic_enabled & COUNTER_BIT) 298 299 /* 300 * MSR_PKG_CST_CONFIG_CONTROL decoding for pkg_cstate_limit: ··· 1350 int msr_shift; /* Positive mean shift right, negative mean shift left */ 1351 double *platform_rapl_msr_scale; /* Scale applied to values read by MSR (platform dependent, filled at runtime) */ 1352 unsigned int rci_index; /* Maps data from perf counters to global variables */ 1353 - unsigned long long bic; 1354 double compat_scale; /* Some counters require constant scaling to be in the same range as other, similar ones */ 1355 unsigned long long flags; 1356 }; ··· 1365 .msr_shift = 0, 1366 .platform_rapl_msr_scale = &rapl_energy_units, 1367 .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1368 - .bic = BIC_PkgWatt | BIC_Pkg_J, 1369 .compat_scale = 1.0, 1370 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1371 }, ··· 1391 .msr_shift = 0, 1392 .platform_rapl_msr_scale = &rapl_energy_units, 1393 .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1394 - .bic = BIC_PkgWatt | BIC_Pkg_J, 1395 .compat_scale = 1.0, 1396 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1397 }, ··· 1417 .msr_shift = 0, 1418 .platform_rapl_msr_scale = &rapl_energy_units, 1419 .rci_index = RAPL_RCI_INDEX_ENERGY_CORES, 1420 - .bic = BIC_CorWatt | BIC_Cor_J, 1421 .compat_scale = 1.0, 1422 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1423 }, ··· 1443 .msr_shift = 0, 1444 .platform_rapl_msr_scale = &rapl_dram_energy_units, 1445 .rci_index = RAPL_RCI_INDEX_DRAM, 1446 - .bic = BIC_RAMWatt | BIC_RAM_J, 1447 .compat_scale = 1.0, 1448 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1449 }, ··· 1469 .msr_shift = 0, 1470 .platform_rapl_msr_scale = &rapl_energy_units, 1471 .rci_index = RAPL_RCI_INDEX_GFX, 1472 - .bic = BIC_GFXWatt | BIC_GFX_J, 1473 .compat_scale = 1.0, 1474 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1475 }, ··· 1495 .msr_shift = 0, 1496 .platform_rapl_msr_scale = &rapl_time_units, 1497 .rci_index = RAPL_RCI_INDEX_PKG_PERF_STATUS, 1498 - .bic = BIC_PKG__, 1499 .compat_scale = 100.0, 1500 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1501 }, ··· 1508 .msr_shift = 0, 1509 .platform_rapl_msr_scale = &rapl_time_units, 1510 .rci_index = RAPL_RCI_INDEX_DRAM_PERF_STATUS, 1511 - .bic = BIC_RAM__, 1512 .compat_scale = 100.0, 1513 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1514 }, ··· 1521 .msr_shift = 0, 1522 .platform_rapl_msr_scale = &rapl_energy_units, 1523 .rci_index = RAPL_RCI_INDEX_CORE_ENERGY, 1524 - .bic = BIC_CorWatt | BIC_Cor_J, 1525 .compat_scale = 1.0, 1526 .flags = 0, 1527 }, ··· 1547 .msr_shift = 0, 1548 .platform_rapl_msr_scale = &rapl_psys_energy_units, 1549 .rci_index = RAPL_RCI_INDEX_ENERGY_PLATFORM, 1550 - .bic = BIC_SysWatt | BIC_Sys_J, 1551 .compat_scale = 1.0, 1552 .flags = RAPL_COUNTER_FLAG_PLATFORM_COUNTER | RAPL_COUNTER_FLAG_USE_MSR_SUM, 1553 }, ··· 1609 const char *perf_name; 1610 unsigned long long msr; 1611 unsigned int rci_index; /* Maps data from perf counters to global variables */ 1612 - unsigned long long bic; 1613 unsigned long long flags; 1614 int pkg_cstate_limit; 1615 }; ··· 1621 .perf_name = "c1-residency", 1622 .msr = MSR_CORE_C1_RES, 1623 .rci_index = CCSTATE_RCI_INDEX_C1_RESIDENCY, 1624 - .bic = BIC_CPU_c1, 1625 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_THREAD, 1626 .pkg_cstate_limit = 0, 1627 }, ··· 1631 .perf_name = "c3-residency", 1632 .msr = MSR_CORE_C3_RESIDENCY, 1633 .rci_index = CCSTATE_RCI_INDEX_C3_RESIDENCY, 1634 - .bic = BIC_CPU_c3, 1635 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1636 .pkg_cstate_limit = 0, 1637 }, ··· 1641 .perf_name = "c6-residency", 1642 .msr = MSR_CORE_C6_RESIDENCY, 1643 .rci_index = CCSTATE_RCI_INDEX_C6_RESIDENCY, 1644 - .bic = BIC_CPU_c6, 1645 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1646 .pkg_cstate_limit = 0, 1647 }, ··· 1651 .perf_name = "c7-residency", 1652 .msr = MSR_CORE_C7_RESIDENCY, 1653 .rci_index = CCSTATE_RCI_INDEX_C7_RESIDENCY, 1654 - .bic = BIC_CPU_c7, 1655 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1656 .pkg_cstate_limit = 0, 1657 }, ··· 1661 .perf_name = "c2-residency", 1662 .msr = MSR_PKG_C2_RESIDENCY, 1663 .rci_index = PCSTATE_RCI_INDEX_C2_RESIDENCY, 1664 - .bic = BIC_Pkgpc2, 1665 .flags = 0, 1666 .pkg_cstate_limit = PCL__2, 1667 }, ··· 1671 .perf_name = "c3-residency", 1672 .msr = MSR_PKG_C3_RESIDENCY, 1673 .rci_index = PCSTATE_RCI_INDEX_C3_RESIDENCY, 1674 - .bic = BIC_Pkgpc3, 1675 .flags = 0, 1676 .pkg_cstate_limit = PCL__3, 1677 }, ··· 1681 .perf_name = "c6-residency", 1682 .msr = MSR_PKG_C6_RESIDENCY, 1683 .rci_index = PCSTATE_RCI_INDEX_C6_RESIDENCY, 1684 - .bic = BIC_Pkgpc6, 1685 .flags = 0, 1686 .pkg_cstate_limit = PCL__6, 1687 }, ··· 1691 .perf_name = "c7-residency", 1692 .msr = MSR_PKG_C7_RESIDENCY, 1693 .rci_index = PCSTATE_RCI_INDEX_C7_RESIDENCY, 1694 - .bic = BIC_Pkgpc7, 1695 .flags = 0, 1696 .pkg_cstate_limit = PCL__7, 1697 }, ··· 1701 .perf_name = "c8-residency", 1702 .msr = MSR_PKG_C8_RESIDENCY, 1703 .rci_index = PCSTATE_RCI_INDEX_C8_RESIDENCY, 1704 - .bic = BIC_Pkgpc8, 1705 .flags = 0, 1706 .pkg_cstate_limit = PCL__8, 1707 }, ··· 1711 .perf_name = "c9-residency", 1712 .msr = MSR_PKG_C9_RESIDENCY, 1713 .rci_index = PCSTATE_RCI_INDEX_C9_RESIDENCY, 1714 - .bic = BIC_Pkgpc9, 1715 .flags = 0, 1716 .pkg_cstate_limit = PCL__9, 1717 }, ··· 1721 .perf_name = "c10-residency", 1722 .msr = MSR_PKG_C10_RESIDENCY, 1723 .rci_index = PCSTATE_RCI_INDEX_C10_RESIDENCY, 1724 - .bic = BIC_Pkgpc10, 1725 .flags = 0, 1726 .pkg_cstate_limit = PCL_10, 1727 }, ··· 2416 2417 static void bic_disable_msr_access(void) 2418 { 2419 - const unsigned long bic_msrs = BIC_Mod_c6 | BIC_CoreTmp | 2420 - BIC_Totl_c0 | BIC_Any_c0 | BIC_GFX_c0 | BIC_CPUGFX | BIC_PkgTmp; 2421 - 2422 - bic_enabled &= ~bic_msrs; 2423 2424 free_sys_msr_counters(); 2425 } ··· 2622 * for all the strings in comma separate name_list, 2623 * set the approprate bit in return value. 2624 */ 2625 - unsigned long long bic_lookup(char *name_list, enum show_hide_mode mode) 2626 { 2627 unsigned int i; 2628 - unsigned long long retval = 0; 2629 2630 while (name_list) { 2631 char *comma; ··· 2636 2637 for (i = 0; i < MAX_BIC; ++i) { 2638 if (!strcmp(name_list, bic[i].name)) { 2639 - retval |= (1ULL << i); 2640 break; 2641 } 2642 if (!strcmp(name_list, "all")) { 2643 - retval |= ~0; 2644 break; 2645 } else if (!strcmp(name_list, "topology")) { 2646 - retval |= BIC_GROUP_TOPOLOGY; 2647 break; 2648 } else if (!strcmp(name_list, "power")) { 2649 - retval |= BIC_GROUP_THERMAL_PWR; 2650 break; 2651 } else if (!strcmp(name_list, "idle")) { 2652 - retval |= BIC_GROUP_IDLE; 2653 break; 2654 } else if (!strcmp(name_list, "swidle")) { 2655 - retval |= BIC_GROUP_SW_IDLE; 2656 break; 2657 } else if (!strcmp(name_list, "sysfs")) { /* legacy compatibility */ 2658 - retval |= BIC_GROUP_SW_IDLE; 2659 break; 2660 } else if (!strcmp(name_list, "hwidle")) { 2661 - retval |= BIC_GROUP_HW_IDLE; 2662 break; 2663 } else if (!strcmp(name_list, "frequency")) { 2664 - retval |= BIC_GROUP_FREQUENCY; 2665 break; 2666 } else if (!strcmp(name_list, "other")) { 2667 - retval |= BIC_OTHER; 2668 break; 2669 } 2670 - 2671 } 2672 if (i == MAX_BIC) { 2673 if (mode == SHOW_LIST) { ··· 2695 name_list++; 2696 2697 } 2698 - return retval; 2699 } 2700 2701 void print_header(char *delim) ··· 7581 unsigned long long msr; 7582 unsigned int time_unit; 7583 double tdp; 7584 - const unsigned long long bic_watt_bits = BIC_SysWatt | BIC_PkgWatt | BIC_CorWatt | BIC_RAMWatt | BIC_GFXWatt; 7585 - const unsigned long long bic_joules_bits = BIC_Sys_J | BIC_Pkg_J | BIC_Cor_J | BIC_RAM_J | BIC_GFX_J; 7586 7587 - if (rapl_joules) 7588 - bic_enabled &= ~bic_watt_bits; 7589 - else 7590 - bic_enabled &= ~bic_joules_bits; 7591 7592 if (!platform->rapl_msrs || no_msr) 7593 return; 7594 7595 if (!(platform->rapl_msrs & RAPL_PKG_PERF_STATUS)) 7596 - bic_enabled &= ~BIC_PKG__; 7597 if (!(platform->rapl_msrs & RAPL_DRAM_PERF_STATUS)) 7598 - bic_enabled &= ~BIC_RAM__; 7599 7600 /* units on package 0, verify later other packages match */ 7601 if (get_msr(base_cpu, MSR_RAPL_POWER_UNIT, &msr)) ··· 7641 { 7642 unsigned long long msr; 7643 double tdp; 7644 - const unsigned long long bic_watt_bits = BIC_PkgWatt | BIC_CorWatt; 7645 - const unsigned long long bic_joules_bits = BIC_Pkg_J | BIC_Cor_J; 7646 7647 - if (rapl_joules) 7648 - bic_enabled &= ~bic_watt_bits; 7649 - else 7650 - bic_enabled &= ~bic_joules_bits; 7651 7652 if (!platform->rapl_msrs || no_msr) 7653 return; ··· 8395 enum rapl_unit unit; 8396 unsigned int next_domain; 8397 8398 - if (!BIC_IS_ENABLED(cai->bic)) 8399 continue; 8400 8401 memset(domain_visited, 0, num_domains * sizeof(*domain_visited)); ··· 8459 8460 /* If any CPU has access to the counter, make it present */ 8461 if (has_counter) 8462 - BIC_PRESENT(cai->bic); 8463 } 8464 8465 free(domain_visited); ··· 8680 if (!per_core && pkg_visited[pkg_id]) 8681 continue; 8682 8683 - const bool counter_needed = BIC_IS_ENABLED(cai->bic) || 8684 (soft_c1 && (cai->flags & CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY)); 8685 const bool counter_supported = (platform->supported_cstates & cai->feature_mask); 8686 ··· 8707 8708 /* If any CPU has access to the counter, make it present */ 8709 if (has_counter) 8710 - BIC_PRESENT(cai->bic); 8711 } 8712 8713 free(cores_visited); ··· 9443 void check_perf_access(void) 9444 { 9445 if (no_perf || !BIC_IS_ENABLED(BIC_IPC) || !has_instr_count_access()) 9446 - bic_enabled &= ~BIC_IPC; 9447 } 9448 9449 bool perf_has_hybrid_devices(void) ··· 10012 * disable more BICs, since it can't be reported accurately. 10013 */ 10014 if (platform->enable_tsc_tweak && !has_base_hz) { 10015 - bic_enabled &= ~BIC_Busy; 10016 - bic_enabled &= ~BIC_Bzy_MHz; 10017 } 10018 } 10019 ··· 11029 no_perf = 1; 11030 break; 11031 case 'e': 11032 - /* --enable specified counter */ 11033 - bic_enabled = bic_enabled | bic_lookup(optarg, SHOW_LIST); 11034 break; 11035 case 'f': 11036 force_load++; 11037 break; 11038 case 'd': 11039 debug++; 11040 - ENABLE_BIC(BIC_DISABLED_BY_DEFAULT); 11041 break; 11042 case 'H': 11043 /* 11044 * --hide: do not show those specified 11045 * multiple invocations simply clear more bits in enabled mask 11046 */ 11047 - bic_enabled &= ~bic_lookup(optarg, HIDE_LIST); 11048 break; 11049 case 'h': 11050 default: ··· 11075 rapl_joules++; 11076 break; 11077 case 'l': 11078 - ENABLE_BIC(BIC_DISABLED_BY_DEFAULT); 11079 list_header_only++; 11080 quiet++; 11081 break; ··· 11112 * subsequent invocations can add to it. 11113 */ 11114 if (shown == 0) 11115 - bic_enabled = bic_lookup(optarg, SHOW_LIST); 11116 - else 11117 - bic_enabled |= bic_lookup(optarg, SHOW_LIST); 11118 shown = 1; 11119 break; 11120 case 'S': ··· 11149 int main(int argc, char **argv) 11150 { 11151 int fd, ret; 11152 11153 fd = open("/sys/fs/cgroup/cgroup.procs", O_WRONLY); 11154 if (fd < 0)
··· 210 { 0x0, "pct_idle", NULL, 0, 0, 0, NULL, 0 }, 211 }; 212 213 + /* n.b. bic_names must match the order in bic[], above */ 214 + enum bic_names { 215 + BIC_USEC, 216 + BIC_TOD, 217 + BIC_Package, 218 + BIC_Node, 219 + BIC_Avg_MHz, 220 + BIC_Busy, 221 + BIC_Bzy_MHz, 222 + BIC_TSC_MHz, 223 + BIC_IRQ, 224 + BIC_SMI, 225 + BIC_cpuidle, 226 + BIC_CPU_c1, 227 + BIC_CPU_c3, 228 + BIC_CPU_c6, 229 + BIC_CPU_c7, 230 + BIC_ThreadC, 231 + BIC_CoreTmp, 232 + BIC_CoreCnt, 233 + BIC_PkgTmp, 234 + BIC_GFX_rc6, 235 + BIC_GFXMHz, 236 + BIC_Pkgpc2, 237 + BIC_Pkgpc3, 238 + BIC_Pkgpc6, 239 + BIC_Pkgpc7, 240 + BIC_Pkgpc8, 241 + BIC_Pkgpc9, 242 + BIC_Pkgpc10, 243 + BIC_CPU_LPI, 244 + BIC_SYS_LPI, 245 + BIC_PkgWatt, 246 + BIC_CorWatt, 247 + BIC_GFXWatt, 248 + BIC_PkgCnt, 249 + BIC_RAMWatt, 250 + BIC_PKG__, 251 + BIC_RAM__, 252 + BIC_Pkg_J, 253 + BIC_Cor_J, 254 + BIC_GFX_J, 255 + BIC_RAM_J, 256 + BIC_Mod_c6, 257 + BIC_Totl_c0, 258 + BIC_Any_c0, 259 + BIC_GFX_c0, 260 + BIC_CPUGFX, 261 + BIC_Core, 262 + BIC_CPU, 263 + BIC_APIC, 264 + BIC_X2APIC, 265 + BIC_Die, 266 + BIC_GFXACTMHz, 267 + BIC_IPC, 268 + BIC_CORE_THROT_CNT, 269 + BIC_UNCORE_MHZ, 270 + BIC_SAM_mc6, 271 + BIC_SAMMHz, 272 + BIC_SAMACTMHz, 273 + BIC_Diec6, 274 + BIC_SysWatt, 275 + BIC_Sys_J, 276 + BIC_NMI, 277 + BIC_CPU_c1e, 278 + BIC_pct_idle, 279 + MAX_BIC 280 + }; 281 282 + void print_bic_set(char *s, cpu_set_t *set) 283 + { 284 + int i; 285 286 + assert(MAX_BIC < CPU_SETSIZE); 287 288 + printf("%s:", s); 289 290 + for (i = 0; i <= MAX_BIC; ++i) { 291 + 292 + if (CPU_ISSET(i, set)) { 293 + assert(i < MAX_BIC); 294 + printf(" %s", bic[i].name); 295 + } 296 + } 297 + putchar('\n'); 298 + } 299 + 300 + static cpu_set_t bic_group_topology; 301 + static cpu_set_t bic_group_thermal_pwr; 302 + static cpu_set_t bic_group_frequency; 303 + static cpu_set_t bic_group_hw_idle; 304 + static cpu_set_t bic_group_sw_idle; 305 + static cpu_set_t bic_group_idle; 306 + static cpu_set_t bic_group_other; 307 + static cpu_set_t bic_group_disabled_by_default; 308 + static cpu_set_t bic_enabled; 309 + static cpu_set_t bic_present; 310 + 311 + /* modify */ 312 + #define BIC_INIT(set) CPU_ZERO(set) 313 + 314 + #define SET_BIC(COUNTER_NUMBER, set) CPU_SET(COUNTER_NUMBER, set) 315 + #define CLR_BIC(COUNTER_NUMBER, set) CPU_CLR(COUNTER_NUMBER, set) 316 + 317 + #define BIC_PRESENT(COUNTER_NUMBER) SET_BIC(COUNTER_NUMBER, &bic_present) 318 + #define BIC_NOT_PRESENT(COUNTER_NUMBER) CPU_CLR(COUNTER_NUMBER, &bic_present) 319 + 320 + /* test */ 321 + #define BIC_IS_ENABLED(COUNTER_NUMBER) CPU_ISSET(COUNTER_NUMBER, &bic_enabled) 322 + #define DO_BIC_READ(COUNTER_NUMBER) CPU_ISSET(COUNTER_NUMBER, &bic_present) 323 + #define DO_BIC(COUNTER_NUMBER) (CPU_ISSET(COUNTER_NUMBER, &bic_enabled) && CPU_ISSET(COUNTER_NUMBER, &bic_present)) 324 + 325 + static void bic_set_all(cpu_set_t *set) 326 + { 327 + int i; 328 + 329 + assert(MAX_BIC < CPU_SETSIZE); 330 + 331 + for (i = 0; i < MAX_BIC; ++i) 332 + SET_BIC(i, set); 333 + } 334 + 335 + /* 336 + * bic_clear_bits() 337 + * clear all the bits from "clr" in "dst" 338 + */ 339 + static void bic_clear_bits(cpu_set_t *dst, cpu_set_t *clr) 340 + { 341 + int i; 342 + 343 + assert(MAX_BIC < CPU_SETSIZE); 344 + 345 + for (i = 0; i < MAX_BIC; ++i) 346 + if (CPU_ISSET(i, clr)) 347 + CLR_BIC(i, dst); 348 + } 349 + 350 + static void bic_groups_init(void) 351 + { 352 + BIC_INIT(&bic_group_topology); 353 + SET_BIC(BIC_Package, &bic_group_topology); 354 + SET_BIC(BIC_Node, &bic_group_topology); 355 + SET_BIC(BIC_CoreCnt, &bic_group_topology); 356 + SET_BIC(BIC_PkgCnt, &bic_group_topology); 357 + SET_BIC(BIC_Core, &bic_group_topology); 358 + SET_BIC(BIC_CPU, &bic_group_topology); 359 + SET_BIC(BIC_Die, &bic_group_topology); 360 + 361 + BIC_INIT(&bic_group_thermal_pwr); 362 + SET_BIC(BIC_CoreTmp, &bic_group_thermal_pwr); 363 + SET_BIC(BIC_PkgTmp, &bic_group_thermal_pwr); 364 + SET_BIC(BIC_PkgWatt, &bic_group_thermal_pwr); 365 + SET_BIC(BIC_CorWatt, &bic_group_thermal_pwr); 366 + SET_BIC(BIC_GFXWatt, &bic_group_thermal_pwr); 367 + SET_BIC(BIC_RAMWatt, &bic_group_thermal_pwr); 368 + SET_BIC(BIC_PKG__, &bic_group_thermal_pwr); 369 + SET_BIC(BIC_RAM__, &bic_group_thermal_pwr); 370 + SET_BIC(BIC_SysWatt, &bic_group_thermal_pwr); 371 + 372 + BIC_INIT(&bic_group_frequency); 373 + SET_BIC(BIC_Avg_MHz, &bic_group_frequency); 374 + SET_BIC(BIC_Busy, &bic_group_frequency); 375 + SET_BIC(BIC_Bzy_MHz, &bic_group_frequency); 376 + SET_BIC(BIC_TSC_MHz, &bic_group_frequency); 377 + SET_BIC(BIC_GFXMHz, &bic_group_frequency); 378 + SET_BIC(BIC_GFXACTMHz, &bic_group_frequency); 379 + SET_BIC(BIC_SAMMHz, &bic_group_frequency); 380 + SET_BIC(BIC_SAMACTMHz, &bic_group_frequency); 381 + SET_BIC(BIC_UNCORE_MHZ, &bic_group_frequency); 382 + 383 + BIC_INIT(&bic_group_hw_idle); 384 + SET_BIC(BIC_Busy, &bic_group_hw_idle); 385 + SET_BIC(BIC_CPU_c1, &bic_group_hw_idle); 386 + SET_BIC(BIC_CPU_c3, &bic_group_hw_idle); 387 + SET_BIC(BIC_CPU_c6, &bic_group_hw_idle); 388 + SET_BIC(BIC_CPU_c7, &bic_group_hw_idle); 389 + SET_BIC(BIC_GFX_rc6, &bic_group_hw_idle); 390 + SET_BIC(BIC_Pkgpc2, &bic_group_hw_idle); 391 + SET_BIC(BIC_Pkgpc3, &bic_group_hw_idle); 392 + SET_BIC(BIC_Pkgpc6, &bic_group_hw_idle); 393 + SET_BIC(BIC_Pkgpc7, &bic_group_hw_idle); 394 + SET_BIC(BIC_Pkgpc8, &bic_group_hw_idle); 395 + SET_BIC(BIC_Pkgpc9, &bic_group_hw_idle); 396 + SET_BIC(BIC_Pkgpc10, &bic_group_hw_idle); 397 + SET_BIC(BIC_CPU_LPI, &bic_group_hw_idle); 398 + SET_BIC(BIC_SYS_LPI, &bic_group_hw_idle); 399 + SET_BIC(BIC_Mod_c6, &bic_group_hw_idle); 400 + SET_BIC(BIC_Totl_c0, &bic_group_hw_idle); 401 + SET_BIC(BIC_Any_c0, &bic_group_hw_idle); 402 + SET_BIC(BIC_GFX_c0, &bic_group_hw_idle); 403 + SET_BIC(BIC_CPUGFX, &bic_group_hw_idle); 404 + SET_BIC(BIC_SAM_mc6, &bic_group_hw_idle); 405 + SET_BIC(BIC_Diec6, &bic_group_hw_idle); 406 + 407 + BIC_INIT(&bic_group_sw_idle); 408 + SET_BIC(BIC_Busy, &bic_group_sw_idle); 409 + SET_BIC(BIC_cpuidle, &bic_group_sw_idle); 410 + SET_BIC(BIC_pct_idle, &bic_group_sw_idle); 411 + 412 + BIC_INIT(&bic_group_idle); 413 + CPU_OR(&bic_group_idle, &bic_group_idle, &bic_group_hw_idle); 414 + SET_BIC(BIC_pct_idle, &bic_group_idle); 415 + 416 + BIC_INIT(&bic_group_other); 417 + SET_BIC(BIC_IRQ, &bic_group_other); 418 + SET_BIC(BIC_NMI, &bic_group_other); 419 + SET_BIC(BIC_SMI, &bic_group_other); 420 + SET_BIC(BIC_ThreadC, &bic_group_other); 421 + SET_BIC(BIC_CoreTmp, &bic_group_other); 422 + SET_BIC(BIC_IPC, &bic_group_other); 423 + 424 + BIC_INIT(&bic_group_disabled_by_default); 425 + SET_BIC(BIC_USEC, &bic_group_disabled_by_default); 426 + SET_BIC(BIC_TOD, &bic_group_disabled_by_default); 427 + SET_BIC(BIC_cpuidle, &bic_group_disabled_by_default); 428 + SET_BIC(BIC_APIC, &bic_group_disabled_by_default); 429 + SET_BIC(BIC_X2APIC, &bic_group_disabled_by_default); 430 + 431 + BIC_INIT(&bic_enabled); 432 + bic_set_all(&bic_enabled); 433 + bic_clear_bits(&bic_enabled, &bic_group_disabled_by_default); 434 + 435 + BIC_INIT(&bic_present); 436 + SET_BIC(BIC_USEC, &bic_present); 437 + SET_BIC(BIC_TOD, &bic_present); 438 + SET_BIC(BIC_cpuidle, &bic_present); 439 + SET_BIC(BIC_APIC, &bic_present); 440 + SET_BIC(BIC_X2APIC, &bic_present); 441 + SET_BIC(BIC_pct_idle, &bic_present); 442 + } 443 444 /* 445 * MSR_PKG_CST_CONFIG_CONTROL decoding for pkg_cstate_limit: ··· 1205 int msr_shift; /* Positive mean shift right, negative mean shift left */ 1206 double *platform_rapl_msr_scale; /* Scale applied to values read by MSR (platform dependent, filled at runtime) */ 1207 unsigned int rci_index; /* Maps data from perf counters to global variables */ 1208 + unsigned int bic_number; 1209 double compat_scale; /* Some counters require constant scaling to be in the same range as other, similar ones */ 1210 unsigned long long flags; 1211 }; ··· 1220 .msr_shift = 0, 1221 .platform_rapl_msr_scale = &rapl_energy_units, 1222 .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1223 + .bic_number = BIC_PkgWatt, 1224 + .compat_scale = 1.0, 1225 + .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1226 + }, 1227 + { 1228 + .feature_mask = RAPL_PKG, 1229 + .perf_subsys = "power", 1230 + .perf_name = "energy-pkg", 1231 + .msr = MSR_PKG_ENERGY_STATUS, 1232 + .msr_mask = 0xFFFFFFFFFFFFFFFF, 1233 + .msr_shift = 0, 1234 + .platform_rapl_msr_scale = &rapl_energy_units, 1235 + .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1236 + .bic_number = BIC_Pkg_J, 1237 .compat_scale = 1.0, 1238 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1239 }, ··· 1233 .msr_shift = 0, 1234 .platform_rapl_msr_scale = &rapl_energy_units, 1235 .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1236 + .bic_number = BIC_PkgWatt, 1237 + .compat_scale = 1.0, 1238 + .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1239 + }, 1240 + { 1241 + .feature_mask = RAPL_AMD_F17H, 1242 + .perf_subsys = "power", 1243 + .perf_name = "energy-pkg", 1244 + .msr = MSR_PKG_ENERGY_STAT, 1245 + .msr_mask = 0xFFFFFFFFFFFFFFFF, 1246 + .msr_shift = 0, 1247 + .platform_rapl_msr_scale = &rapl_energy_units, 1248 + .rci_index = RAPL_RCI_INDEX_ENERGY_PKG, 1249 + .bic_number = BIC_Pkg_J, 1250 .compat_scale = 1.0, 1251 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1252 }, ··· 1246 .msr_shift = 0, 1247 .platform_rapl_msr_scale = &rapl_energy_units, 1248 .rci_index = RAPL_RCI_INDEX_ENERGY_CORES, 1249 + .bic_number = BIC_CorWatt, 1250 + .compat_scale = 1.0, 1251 + .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1252 + }, 1253 + { 1254 + .feature_mask = RAPL_CORE_ENERGY_STATUS, 1255 + .perf_subsys = "power", 1256 + .perf_name = "energy-cores", 1257 + .msr = MSR_PP0_ENERGY_STATUS, 1258 + .msr_mask = 0xFFFFFFFFFFFFFFFF, 1259 + .msr_shift = 0, 1260 + .platform_rapl_msr_scale = &rapl_energy_units, 1261 + .rci_index = RAPL_RCI_INDEX_ENERGY_CORES, 1262 + .bic_number = BIC_Cor_J, 1263 .compat_scale = 1.0, 1264 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1265 }, ··· 1259 .msr_shift = 0, 1260 .platform_rapl_msr_scale = &rapl_dram_energy_units, 1261 .rci_index = RAPL_RCI_INDEX_DRAM, 1262 + .bic_number = BIC_RAMWatt, 1263 + .compat_scale = 1.0, 1264 + .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1265 + }, 1266 + { 1267 + .feature_mask = RAPL_DRAM, 1268 + .perf_subsys = "power", 1269 + .perf_name = "energy-ram", 1270 + .msr = MSR_DRAM_ENERGY_STATUS, 1271 + .msr_mask = 0xFFFFFFFFFFFFFFFF, 1272 + .msr_shift = 0, 1273 + .platform_rapl_msr_scale = &rapl_dram_energy_units, 1274 + .rci_index = RAPL_RCI_INDEX_DRAM, 1275 + .bic_number = BIC_RAM_J, 1276 .compat_scale = 1.0, 1277 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1278 }, ··· 1272 .msr_shift = 0, 1273 .platform_rapl_msr_scale = &rapl_energy_units, 1274 .rci_index = RAPL_RCI_INDEX_GFX, 1275 + .bic_number = BIC_GFXWatt, 1276 + .compat_scale = 1.0, 1277 + .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1278 + }, 1279 + { 1280 + .feature_mask = RAPL_GFX, 1281 + .perf_subsys = "power", 1282 + .perf_name = "energy-gpu", 1283 + .msr = MSR_PP1_ENERGY_STATUS, 1284 + .msr_mask = 0xFFFFFFFFFFFFFFFF, 1285 + .msr_shift = 0, 1286 + .platform_rapl_msr_scale = &rapl_energy_units, 1287 + .rci_index = RAPL_RCI_INDEX_GFX, 1288 + .bic_number = BIC_GFX_J, 1289 .compat_scale = 1.0, 1290 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1291 }, ··· 1285 .msr_shift = 0, 1286 .platform_rapl_msr_scale = &rapl_time_units, 1287 .rci_index = RAPL_RCI_INDEX_PKG_PERF_STATUS, 1288 + .bic_number = BIC_PKG__, 1289 .compat_scale = 100.0, 1290 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1291 }, ··· 1298 .msr_shift = 0, 1299 .platform_rapl_msr_scale = &rapl_time_units, 1300 .rci_index = RAPL_RCI_INDEX_DRAM_PERF_STATUS, 1301 + .bic_number = BIC_RAM__, 1302 .compat_scale = 100.0, 1303 .flags = RAPL_COUNTER_FLAG_USE_MSR_SUM, 1304 }, ··· 1311 .msr_shift = 0, 1312 .platform_rapl_msr_scale = &rapl_energy_units, 1313 .rci_index = RAPL_RCI_INDEX_CORE_ENERGY, 1314 + .bic_number = BIC_CorWatt, 1315 + .compat_scale = 1.0, 1316 + .flags = 0, 1317 + }, 1318 + { 1319 + .feature_mask = RAPL_AMD_F17H, 1320 + .perf_subsys = NULL, 1321 + .perf_name = NULL, 1322 + .msr = MSR_CORE_ENERGY_STAT, 1323 + .msr_mask = 0xFFFFFFFF, 1324 + .msr_shift = 0, 1325 + .platform_rapl_msr_scale = &rapl_energy_units, 1326 + .rci_index = RAPL_RCI_INDEX_CORE_ENERGY, 1327 + .bic_number = BIC_Cor_J, 1328 .compat_scale = 1.0, 1329 .flags = 0, 1330 }, ··· 1324 .msr_shift = 0, 1325 .platform_rapl_msr_scale = &rapl_psys_energy_units, 1326 .rci_index = RAPL_RCI_INDEX_ENERGY_PLATFORM, 1327 + .bic_number = BIC_SysWatt, 1328 + .compat_scale = 1.0, 1329 + .flags = RAPL_COUNTER_FLAG_PLATFORM_COUNTER | RAPL_COUNTER_FLAG_USE_MSR_SUM, 1330 + }, 1331 + { 1332 + .feature_mask = RAPL_PSYS, 1333 + .perf_subsys = "power", 1334 + .perf_name = "energy-psys", 1335 + .msr = MSR_PLATFORM_ENERGY_STATUS, 1336 + .msr_mask = 0x00000000FFFFFFFF, 1337 + .msr_shift = 0, 1338 + .platform_rapl_msr_scale = &rapl_psys_energy_units, 1339 + .rci_index = RAPL_RCI_INDEX_ENERGY_PLATFORM, 1340 + .bic_number = BIC_Sys_J, 1341 .compat_scale = 1.0, 1342 .flags = RAPL_COUNTER_FLAG_PLATFORM_COUNTER | RAPL_COUNTER_FLAG_USE_MSR_SUM, 1343 }, ··· 1373 const char *perf_name; 1374 unsigned long long msr; 1375 unsigned int rci_index; /* Maps data from perf counters to global variables */ 1376 + unsigned int bic_number; 1377 unsigned long long flags; 1378 int pkg_cstate_limit; 1379 }; ··· 1385 .perf_name = "c1-residency", 1386 .msr = MSR_CORE_C1_RES, 1387 .rci_index = CCSTATE_RCI_INDEX_C1_RESIDENCY, 1388 + .bic_number = BIC_CPU_c1, 1389 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_THREAD, 1390 .pkg_cstate_limit = 0, 1391 }, ··· 1395 .perf_name = "c3-residency", 1396 .msr = MSR_CORE_C3_RESIDENCY, 1397 .rci_index = CCSTATE_RCI_INDEX_C3_RESIDENCY, 1398 + .bic_number = BIC_CPU_c3, 1399 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1400 .pkg_cstate_limit = 0, 1401 }, ··· 1405 .perf_name = "c6-residency", 1406 .msr = MSR_CORE_C6_RESIDENCY, 1407 .rci_index = CCSTATE_RCI_INDEX_C6_RESIDENCY, 1408 + .bic_number = BIC_CPU_c6, 1409 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1410 .pkg_cstate_limit = 0, 1411 }, ··· 1415 .perf_name = "c7-residency", 1416 .msr = MSR_CORE_C7_RESIDENCY, 1417 .rci_index = CCSTATE_RCI_INDEX_C7_RESIDENCY, 1418 + .bic_number = BIC_CPU_c7, 1419 .flags = CSTATE_COUNTER_FLAG_COLLECT_PER_CORE | CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY, 1420 .pkg_cstate_limit = 0, 1421 }, ··· 1425 .perf_name = "c2-residency", 1426 .msr = MSR_PKG_C2_RESIDENCY, 1427 .rci_index = PCSTATE_RCI_INDEX_C2_RESIDENCY, 1428 + .bic_number = BIC_Pkgpc2, 1429 .flags = 0, 1430 .pkg_cstate_limit = PCL__2, 1431 }, ··· 1435 .perf_name = "c3-residency", 1436 .msr = MSR_PKG_C3_RESIDENCY, 1437 .rci_index = PCSTATE_RCI_INDEX_C3_RESIDENCY, 1438 + .bic_number = BIC_Pkgpc3, 1439 .flags = 0, 1440 .pkg_cstate_limit = PCL__3, 1441 }, ··· 1445 .perf_name = "c6-residency", 1446 .msr = MSR_PKG_C6_RESIDENCY, 1447 .rci_index = PCSTATE_RCI_INDEX_C6_RESIDENCY, 1448 + .bic_number = BIC_Pkgpc6, 1449 .flags = 0, 1450 .pkg_cstate_limit = PCL__6, 1451 }, ··· 1455 .perf_name = "c7-residency", 1456 .msr = MSR_PKG_C7_RESIDENCY, 1457 .rci_index = PCSTATE_RCI_INDEX_C7_RESIDENCY, 1458 + .bic_number = BIC_Pkgpc7, 1459 .flags = 0, 1460 .pkg_cstate_limit = PCL__7, 1461 }, ··· 1465 .perf_name = "c8-residency", 1466 .msr = MSR_PKG_C8_RESIDENCY, 1467 .rci_index = PCSTATE_RCI_INDEX_C8_RESIDENCY, 1468 + .bic_number = BIC_Pkgpc8, 1469 .flags = 0, 1470 .pkg_cstate_limit = PCL__8, 1471 }, ··· 1475 .perf_name = "c9-residency", 1476 .msr = MSR_PKG_C9_RESIDENCY, 1477 .rci_index = PCSTATE_RCI_INDEX_C9_RESIDENCY, 1478 + .bic_number = BIC_Pkgpc9, 1479 .flags = 0, 1480 .pkg_cstate_limit = PCL__9, 1481 }, ··· 1485 .perf_name = "c10-residency", 1486 .msr = MSR_PKG_C10_RESIDENCY, 1487 .rci_index = PCSTATE_RCI_INDEX_C10_RESIDENCY, 1488 + .bic_number = BIC_Pkgpc10, 1489 .flags = 0, 1490 .pkg_cstate_limit = PCL_10, 1491 }, ··· 2180 2181 static void bic_disable_msr_access(void) 2182 { 2183 + CLR_BIC(BIC_Mod_c6, &bic_enabled); 2184 + CLR_BIC(BIC_CoreTmp, &bic_enabled); 2185 + CLR_BIC(BIC_Totl_c0, &bic_enabled); 2186 + CLR_BIC(BIC_Any_c0, &bic_enabled); 2187 + CLR_BIC(BIC_GFX_c0, &bic_enabled); 2188 + CLR_BIC(BIC_CPUGFX, &bic_enabled); 2189 + CLR_BIC(BIC_PkgTmp, &bic_enabled); 2190 2191 free_sys_msr_counters(); 2192 } ··· 2383 * for all the strings in comma separate name_list, 2384 * set the approprate bit in return value. 2385 */ 2386 + void bic_lookup(cpu_set_t *ret_set, char *name_list, enum show_hide_mode mode) 2387 { 2388 unsigned int i; 2389 2390 while (name_list) { 2391 char *comma; ··· 2398 2399 for (i = 0; i < MAX_BIC; ++i) { 2400 if (!strcmp(name_list, bic[i].name)) { 2401 + SET_BIC(i, ret_set); 2402 break; 2403 } 2404 if (!strcmp(name_list, "all")) { 2405 + bic_set_all(ret_set); 2406 break; 2407 } else if (!strcmp(name_list, "topology")) { 2408 + CPU_OR(ret_set, ret_set, &bic_group_topology); 2409 break; 2410 } else if (!strcmp(name_list, "power")) { 2411 + CPU_OR(ret_set, ret_set, &bic_group_thermal_pwr); 2412 break; 2413 } else if (!strcmp(name_list, "idle")) { 2414 + CPU_OR(ret_set, ret_set, &bic_group_idle); 2415 break; 2416 } else if (!strcmp(name_list, "swidle")) { 2417 + CPU_OR(ret_set, ret_set, &bic_group_sw_idle); 2418 break; 2419 } else if (!strcmp(name_list, "sysfs")) { /* legacy compatibility */ 2420 + CPU_OR(ret_set, ret_set, &bic_group_sw_idle); 2421 break; 2422 } else if (!strcmp(name_list, "hwidle")) { 2423 + CPU_OR(ret_set, ret_set, &bic_group_hw_idle); 2424 break; 2425 } else if (!strcmp(name_list, "frequency")) { 2426 + CPU_OR(ret_set, ret_set, &bic_group_frequency); 2427 break; 2428 } else if (!strcmp(name_list, "other")) { 2429 + CPU_OR(ret_set, ret_set, &bic_group_other); 2430 break; 2431 } 2432 } 2433 if (i == MAX_BIC) { 2434 if (mode == SHOW_LIST) { ··· 2458 name_list++; 2459 2460 } 2461 } 2462 2463 void print_header(char *delim) ··· 7345 unsigned long long msr; 7346 unsigned int time_unit; 7347 double tdp; 7348 7349 + if (rapl_joules) { 7350 + CLR_BIC(BIC_SysWatt, &bic_enabled); 7351 + CLR_BIC(BIC_PkgWatt, &bic_enabled); 7352 + CLR_BIC(BIC_CorWatt, &bic_enabled); 7353 + CLR_BIC(BIC_RAMWatt, &bic_enabled); 7354 + CLR_BIC(BIC_GFXWatt, &bic_enabled); 7355 + } else { 7356 + CLR_BIC(BIC_Sys_J, &bic_enabled); 7357 + CLR_BIC(BIC_Pkg_J, &bic_enabled); 7358 + CLR_BIC(BIC_Cor_J, &bic_enabled); 7359 + CLR_BIC(BIC_RAM_J, &bic_enabled); 7360 + CLR_BIC(BIC_GFX_J, &bic_enabled); 7361 + } 7362 7363 if (!platform->rapl_msrs || no_msr) 7364 return; 7365 7366 if (!(platform->rapl_msrs & RAPL_PKG_PERF_STATUS)) 7367 + CLR_BIC(BIC_PKG__, &bic_enabled); 7368 if (!(platform->rapl_msrs & RAPL_DRAM_PERF_STATUS)) 7369 + CLR_BIC(BIC_RAM__, &bic_enabled); 7370 7371 /* units on package 0, verify later other packages match */ 7372 if (get_msr(base_cpu, MSR_RAPL_POWER_UNIT, &msr)) ··· 7398 { 7399 unsigned long long msr; 7400 double tdp; 7401 7402 + if (rapl_joules) { 7403 + CLR_BIC(BIC_SysWatt, &bic_enabled); 7404 + CLR_BIC(BIC_CorWatt, &bic_enabled); 7405 + } else { 7406 + CLR_BIC(BIC_Pkg_J, &bic_enabled); 7407 + CLR_BIC(BIC_Cor_J, &bic_enabled); 7408 + } 7409 7410 if (!platform->rapl_msrs || no_msr) 7411 return; ··· 8151 enum rapl_unit unit; 8152 unsigned int next_domain; 8153 8154 + if (!BIC_IS_ENABLED(cai->bic_number)) 8155 continue; 8156 8157 memset(domain_visited, 0, num_domains * sizeof(*domain_visited)); ··· 8215 8216 /* If any CPU has access to the counter, make it present */ 8217 if (has_counter) 8218 + BIC_PRESENT(cai->bic_number); 8219 } 8220 8221 free(domain_visited); ··· 8436 if (!per_core && pkg_visited[pkg_id]) 8437 continue; 8438 8439 + const bool counter_needed = BIC_IS_ENABLED(cai->bic_number) || 8440 (soft_c1 && (cai->flags & CSTATE_COUNTER_FLAG_SOFT_C1_DEPENDENCY)); 8441 const bool counter_supported = (platform->supported_cstates & cai->feature_mask); 8442 ··· 8463 8464 /* If any CPU has access to the counter, make it present */ 8465 if (has_counter) 8466 + BIC_PRESENT(cai->bic_number); 8467 } 8468 8469 free(cores_visited); ··· 9199 void check_perf_access(void) 9200 { 9201 if (no_perf || !BIC_IS_ENABLED(BIC_IPC) || !has_instr_count_access()) 9202 + CLR_BIC(BIC_IPC, &bic_enabled); 9203 } 9204 9205 bool perf_has_hybrid_devices(void) ··· 9768 * disable more BICs, since it can't be reported accurately. 9769 */ 9770 if (platform->enable_tsc_tweak && !has_base_hz) { 9771 + CLR_BIC(BIC_Busy, &bic_enabled); 9772 + CLR_BIC(BIC_Bzy_MHz, &bic_enabled); 9773 } 9774 } 9775 ··· 10785 no_perf = 1; 10786 break; 10787 case 'e': 10788 + /* --enable specified counter, without clearning existing list */ 10789 + bic_lookup(&bic_enabled, optarg, SHOW_LIST); 10790 break; 10791 case 'f': 10792 force_load++; 10793 break; 10794 case 'd': 10795 debug++; 10796 + bic_set_all(&bic_enabled); 10797 break; 10798 case 'H': 10799 /* 10800 * --hide: do not show those specified 10801 * multiple invocations simply clear more bits in enabled mask 10802 */ 10803 + { 10804 + cpu_set_t bic_group_hide; 10805 + 10806 + BIC_INIT(&bic_group_hide); 10807 + 10808 + bic_lookup(&bic_group_hide, optarg, HIDE_LIST); 10809 + bic_clear_bits(&bic_enabled, &bic_group_hide); 10810 + } 10811 break; 10812 case 'h': 10813 default: ··· 10824 rapl_joules++; 10825 break; 10826 case 'l': 10827 + bic_set_all(&bic_enabled); 10828 list_header_only++; 10829 quiet++; 10830 break; ··· 10861 * subsequent invocations can add to it. 10862 */ 10863 if (shown == 0) 10864 + BIC_INIT(&bic_enabled); 10865 + bic_lookup(&bic_enabled, optarg, SHOW_LIST); 10866 shown = 1; 10867 break; 10868 case 'S': ··· 10899 int main(int argc, char **argv) 10900 { 10901 int fd, ret; 10902 + 10903 + bic_groups_init(); 10904 10905 fd = open("/sys/fs/cgroup/cgroup.procs", O_WRONLY); 10906 if (fd < 0)