diff --git a/headers/os/drivers/cpufreq.h b/headers/os/drivers/cpufreq.h index 7a4301feeb..ad36f9998a 100644 --- a/headers/os/drivers/cpufreq.h +++ b/headers/os/drivers/cpufreq.h @@ -17,6 +17,8 @@ const int kCPUPerformanceScaleMax = 1000; typedef struct cpufreq_module_info { module_info info; + float rank; + status_t (*increase_performance)(int delta, bool allowBoost); status_t (*decrease_performance)(int delta); } cpufreq_module_info; diff --git a/src/add-ons/kernel/power/cpufreq/intel_pstates/intel_pstates.cpp b/src/add-ons/kernel/power/cpufreq/intel_pstates/intel_pstates.cpp index 7af294bf9c..f7f7fe1f9a 100644 --- a/src/add-ons/kernel/power/cpufreq/intel_pstates/intel_pstates.cpp +++ b/src/add-ons/kernel/power/cpufreq/intel_pstates/intel_pstates.cpp @@ -222,6 +222,8 @@ static cpufreq_module_info sIntelPStates = { std_ops, }, + 1.0f, + increase_performance, decrease_performance, }; diff --git a/src/system/kernel/cpu.cpp b/src/system/kernel/cpu.cpp index 5ab8d26294..3b7a5ad804 100644 --- a/src/system/kernel/cpu.cpp +++ b/src/system/kernel/cpu.cpp @@ -63,13 +63,22 @@ load_cpufreq_module() while (true) { char name[B_FILE_NAME_LENGTH]; size_t nameLength = sizeof(name); + cpufreq_module_info* current = NULL; if (read_next_module_name(cookie, name, &nameLength) != B_OK) break; - if (get_module(name, (module_info**)&sCPUPerformanceModule) == B_OK) { + if (get_module(name, (module_info**)¤t) == B_OK) { dprintf("found cpufreq module: %s\n", name); - break; + + if (sCPUPerformanceModule != NULL) { + if (sCPUPerformanceModule->rank < current->rank) { + put_module(sCPUPerformanceModule->info.name); + sCPUPerformanceModule = current; + } else + put_module(name); + } else + sCPUPerformanceModule = current; } }