CPUFreq 核心和 CPUFreq 通知器概述

作者

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 分配的表