CPUFreq 核心和 CPUFreq 通知器概述¶
- 作者
Dominik Brodowski <linux@brodo.de>
David Kimdon <dwhedon@debian.org>
Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Viresh Kumar <viresh.kumar@linaro.org>
1. 一般資訊¶
CPUFreq 核心程式碼位於 drivers/cpufreq/cpufreq.c。此 cpufreq 程式碼為 CPUFreq 架構驅動程式(執行實際頻率轉換的程式碼段)以及“通知器”提供了標準化的介面。這些通知器是裝置驅動程式或核心的其他部分,它們需要被告知策略更改(例如 ACPI 等熱管理模組)或所有頻率更改(例如時序程式碼),甚至可能需要強制某些速度限制(例如 ARM 架構上的 LCD 驅動程式)。此外,核心“常量”loops_per_jiffy 會在此處根據頻率更改進行更新。
cpufreq 策略的引用計數由 cpufreq_cpu_get 和 cpufreq_cpu_put 完成,它們確保 cpufreq 驅動程式正確註冊到核心,並且在呼叫 cpufreq_put_cpu 之前不會被解除安裝。這還確保了相關的 cpufreq 策略在使用時不會被釋放。
2. CPUFreq 通知器¶
CPUFreq 通知器遵循標準的核心通知器介面。有關通知器的詳細資訊,請參見 linux/include/linux/notifier.h。
有兩種不同的 CPUFreq 通知器——策略通知器和轉換通知器。
2.1 CPUFreq 策略通知器¶
當建立或刪除新策略時,這些通知器會收到通知。
階段在通知器的第二個引數中指定。當策略首次建立時,階段為 CPUFREQ_CREATE_POLICY;當策略被移除時,階段為 CPUFREQ_REMOVE_POLICY。
第三個引數,一個 void *pointer,指向一個 struct cpufreq_policy,其中包含多個值,包括 min、max(新策略的最低和最高頻率(以 kHz 為單位))。
2.2 CPUFreq 轉換通知器¶
當 CPUfreq 驅動程式切換 CPU 核心頻率且此更改不涉及任何外部影響時,對於策略中的每個線上 CPU,這些通知器會收到兩次通知。
第二個引數指定階段——CPUFREQ_PRECHANGE 或 CPUFREQ_POSTCHANGE。
第三個引數是一個 struct cpufreq_freqs,包含以下值:
policy |
指向 struct cpufreq_policy 的指標 |
old |
舊頻率 |
new |
新頻率 |
flags |
cpufreq 驅動程式的標誌 |
3. 使用工作效能點 (OPP) 生成 CPUFreq 表¶
有關 OPP 的詳細資訊,請參閱 工作效能點 (OPP) 庫
- dev_pm_opp_init_cpufreq_table -
此函式提供了一個即用型轉換例程,用於將 OPP 層關於可用頻率的內部資訊轉換為可直接提供給 cpufreq 的格式。
警告
請勿在中斷上下文中使用此函式。
示例
soc_pm_init() { /* Do things */ r = dev_pm_opp_init_cpufreq_table(dev, &freq_table); if (!r) policy->freq_table = freq_table; /* Do other things */ }注意
此函式僅在除了 CONFIG_PM_OPP 之外還啟用了 CONFIG_CPU_FREQ 時才可用。
- dev_pm_opp_free_cpufreq_table
釋放由 dev_pm_opp_init_cpufreq_table 分配的表