int cthd_msr::disable_turbo() { int cpu_count = get_no_cpus(); unsigned long long val; int ret; for (int i = 0; i < cpu_count; ++i) { /* This method is recommended only for BIOS ret = read_msr(i, MSR_IA32_MISC_ENABLE, &val); if (ret < 0) return THD_ERROR; val |= MSR_IA32_MISC_ENABLE_TURBO_DISABLE; ret = write_msr(i, MSR_IA32_MISC_ENABLE, val); if (ret < 0) return THD_ERROR; */ ret = read_msr(i, MSR_IA32_PERF_CTL, &val); if (ret < 0) return THD_ERROR; val |= TURBO_DISENGAGE_BIT; ret = write_msr(i, MSR_IA32_PERF_CTL, val); if (ret < 0) return THD_ERROR; } thd_log_info("Turbo disabled \n"); return THD_SUCCESS; }
bool cthd_msr::check_turbo_status() { int cpu_count = get_no_cpus(); unsigned long long val; int ret; // Return false even if one of the core is not enabled for (int i = 0; i < cpu_count; ++i) { ret = read_msr(i, MSR_IA32_MISC_ENABLE, &val); if (ret < 0) return false; if (val & MSR_IA32_MISC_ENABLE_TURBO_DISABLE) return false; } return true; }
int cthd_msr::set_clock_mod_duty_cycle(int state) { int cpu_count = get_no_cpus(); unsigned long long val; int ret; thd_log_info("Set T stated %d \n", state); // First bit is reserved state = state << 1; for (int i = 0; i < cpu_count; ++i) { ret = read_msr(i, MSR_IA32_THERM_CONTROL, &val); if (ret < 0) { thd_log_debug("set_clock_mod_duty_cycle current MSR read failed\n"); return THD_ERROR; } thd_log_debug("set_clock_mod_duty_cycle current %x\n", (unsigned int) val); if (!state) { val &= ~MSR_IA32_CLK_MOD_ENABLE; } else { val |= MSR_IA32_CLK_MOD_ENABLE; } val &= ~MSR_IA32_CLK_MOD_DUTY_CYCLE_MASK; val |= (state & MSR_IA32_CLK_MOD_DUTY_CYCLE_MASK); thd_log_debug("set_clock_mod_duty_cycle current set to %x\n", (unsigned int) val); ret = write_msr(i, MSR_IA32_THERM_CONTROL, val); if (ret < 0) { thd_log_warn( "set_clock_mod_duty_cycle current set failed to write\n"); return THD_ERROR; } } return THD_SUCCESS; }