裝置頻率縮放¶
簡介¶
該框架為任意裝置上的動態電壓和頻率切換(Dynamic Voltage and Frequency Switching)提供了標準的核心介面。
它透過類似於 cpufreq 子系統的 sysfs 檔案暴露了頻率調節控制。
對於可以測量當前使用情況的裝置,其頻率可以由調頻器(governors)自動調整。
API¶
裝置驅動需要初始化一個 devfreq_profile 並呼叫 devfreq_add_device() 函式來建立一個 devfreq 例項。
-
struct devfreq_dev_status¶
devfreq 使用者裝置提供給調頻器的資料。表示效能統計資訊。
定義:
struct devfreq_dev_status {
unsigned long total_time;
unsigned long busy_time;
unsigned long current_frequency;
void *private_data;
};
成員
total_timedevfreq_dev_status 例項所代表的總時間
busy_time裝置在總時間中工作的時長。
current_frequency當前工作頻率。
private_datadevfreq 框架未指定的一個條目。裝置和特定調頻器可以透過 private_data 擁有自己的協議。然而,由於這是調頻器特有的,使用它的調頻器將只與瞭解它的裝置相容。
-
struct devfreq_dev_profile¶
devfreq 的使用者裝置配置檔案
定義:
struct devfreq_dev_profile {
unsigned long initial_freq;
unsigned int polling_ms;
enum devfreq_timer timer;
int (*target)(struct device *dev, unsigned long *freq, u32 flags);
int (*get_dev_status)(struct device *dev, struct devfreq_dev_status *stat);
int (*get_cur_freq)(struct device *dev, unsigned long *freq);
void (*exit)(struct device *dev);
unsigned long *freq_table;
unsigned int max_state;
bool is_cooling_device;
};
成員
initial_freq呼叫
devfreq_add_device()時的工作頻率。polling_ms輪詢間隔,單位為毫秒。0 表示停用輪詢。
timer定時器型別可以是可延遲定時器或延遲定時器。
target裝置應將其工作頻率設定為 freq 或略高於 freq 的值。如果 freq 高於任何可操作頻率,則設定為最大值。在返回之前,目標函式應將 freq 設定為當前頻率。“flags”引數的可能值已在上面透過“DEVFREQ_FLAG_*”宏進行解釋。
get_dev_status裝置應向 devfreq 提供當前的效能狀態。建議調頻器不要直接使用此項。相反,建議調頻器結合 devfreq.last_status 使用 devfreq_update_stats()。
get_cur_freq裝置應提供其當前的工作頻率。
exit一個可選的回撥函式,當 devfreq 因錯誤或呼叫
devfreq_remove_device()而移除 devfreq 物件時被呼叫。如果使用者已在通知頭註冊了 devfreq->nb,則此時應登出它。freq_table可選的頻率列表,用於支援統計,且 freq_table 必須按升序生成。
max_statefreq_table 的大小。
is_cooling_device一個不言自明的布林值,賦予裝置冷卻效果屬性。
-
struct devfreq_stats¶
devfreq 裝置行為統計
定義:
struct devfreq_stats {
unsigned int total_trans;
unsigned int *trans_table;
u64 *time_in_state;
u64 last_update;
};
成員
total_transdevfreq 轉換次數。
trans_tabledevfreq 轉換統計。
time_in_statedevfreq 狀態統計。
last_update統計資訊上次更新的時間。
-
struct devfreq¶
裝置 devfreq 結構
定義:
struct devfreq {
struct list_head node;
struct mutex lock;
struct device dev;
struct devfreq_dev_profile *profile;
const struct devfreq_governor *governor;
struct opp_table *opp_table;
struct notifier_block nb;
struct delayed_work work;
unsigned long *freq_table;
unsigned int max_state;
unsigned long previous_freq;
struct devfreq_dev_status last_status;
void *data;
void *governor_data;
struct dev_pm_qos_request user_min_freq_req;
struct dev_pm_qos_request user_max_freq_req;
unsigned long scaling_min_freq;
unsigned long scaling_max_freq;
bool stop_polling;
unsigned long suspend_freq;
unsigned long resume_freq;
atomic_t suspend_count;
struct devfreq_stats stats;
struct srcu_notifier_head transition_notifier_list;
struct thermal_cooling_device *cdev;
struct notifier_block nb_min;
struct notifier_block nb_max;
};
成員
node列表節點 - 包含已註冊的 devfreq 裝置。
lock用於保護 devfreq 訪問的互斥鎖。
dev由 devfreq 類註冊的裝置。dev.parent 是使用 devfreq 的裝置。
profile裝置特定的 devfreq 配置檔案
governor根據使用情況選擇頻率的方法。
opp_table對 dev.parent 的 OPP 表的引用(如果存在)。
nb用於通知 devfreq 物件重新評估可操作頻率的通知塊。devfreq 使用者可以使用 devfreq.nb 註冊到相應的通知器呼叫鏈。
work用於負載監控的延遲工作。
freq_tabledevfreq 驅動使用的當前頻率表。
max_state頻率表中存在的條目數量。
previous_freq先前配置的頻率值。
last_statusdevfreq 使用者裝置資訊,效能統計
datadevfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。
governor_data調頻器的私有資料,devfreq 核心不觸及它。
user_min_freq_req使用者(透過 sysfs)發出的 PM QoS 最小頻率請求
user_max_freq_req使用者(透過 sysfs)發出的 PM QoS 最大頻率請求
scaling_min_freq限制 OPP 介面請求的最小頻率
scaling_max_freq限制 OPP 介面請求的最大頻率
stop_polling裝置的 devfreq 輪詢狀態。
suspend_freq裝置在掛起階段設定的頻率。
resume_freq裝置在恢復階段設定的頻率。
suspend_count裝置的掛起請求計數器。
statsdevfreq 裝置行為統計
transition_notifier_listDEVFREQ_TRANSITION_NOTIFIER 通知器的列表頭。
cdev如果 devfreq 具有冷卻屬性,則為冷卻裝置指標。
nb_minDEV_PM_QOS_MIN_FREQUENCY 的通知塊。
nb_maxDEV_PM_QOS_MAX_FREQUENCY 的通知塊。
描述
該結構儲存給定裝置的 devfreq 資訊。
請注意,當調頻器訪問 struct devfreq 的函式條目時(struct devfreq_governor 中定義的回撥上下文除外),調頻器應使用 struct devfreq 中的 struct mutex 鎖來保護其訪問。調頻器也可以使用此互斥鎖來保護其在 void *data 中的私有資料。
-
struct devfreq_simple_ondemand_data¶
傳遞給
struct devfreq和 devfreq_add_device 的void *data。
定義:
struct devfreq_simple_ondemand_data {
unsigned int upthreshold;
unsigned int downdifferential;
};
成員
upthreshold如果負載超過此值,頻率會跳升。指定 0 以使用預設值。有效值範圍為 0 到 100。
downdifferential如果負載低於 upthreshold - downdifferential,調頻器可能會考慮降低頻率。指定 0 以使用預設值。有效值範圍為 0 到 100。必須滿足 downdifferential < upthreshold。
描述
如果傳遞給調頻器的 devfreq_simple_ondemand_data 指標為 NULL,調頻器將使用預設值。
-
struct devfreq_passive_data¶
傳遞給
struct devfreq和 devfreq_add_device 的void *data。
定義:
struct devfreq_passive_data {
struct devfreq *parent;
int (*get_target_freq)(struct devfreq *this, unsigned long *freq);
enum devfreq_parent_dev_type parent_type;
struct devfreq *this;
struct notifier_block nb;
struct list_head cpu_data_list;
};
成員
parent父裝置的 devfreq 例項。
get_target_freq可選回撥,返回使用被動調頻器的裝置所需的執行頻率。當被動調頻器需要透過父 devfreq 裝置的(除被動調頻器之外的)其他調頻器所設定的新頻率來決定下一個頻率時,會呼叫此函式。如果 devfreq 裝置有特定的方法來決定下一個頻率,則應使用此回撥。
parent_type裝置的父型別。
this本裝置的 devfreq 例項。
nb用於 DEVFREQ_TRANSITION_NOTIFIER 或 CPUFREQ_TRANSITION_NOTIFIER 列表的通知塊。
cpu_data_list所有 cpufreq_policy 的 CPU 頻率資料列表。
描述
devfreq_passive_data 必須設定父裝置的 devfreq 例項以及除被動調頻器之外的其他調頻器。但是,不需要初始化 'this' 和 'nb' 欄位,因為 devfreq 核心會處理它們。
-
struct devfreq_event_dev¶
devfreq-event 裝置
定義:
struct devfreq_event_dev {
struct list_head node;
struct device dev;
struct mutex lock;
u32 enable_count;
const struct devfreq_event_desc *desc;
};
成員
node包含已註冊的 devfreq-event 裝置。
dev由 devfreq-event 類註冊的裝置。dev.parent 是使用 devfreq-event 的裝置。
lock用於保護 devfreq-event 訪問的互斥鎖。
enable_countenable 函式被呼叫的次數。
descdevfreq-event 裝置的描述。
描述
該結構包含 devfreq-event 裝置資訊。
-
struct devfreq_event_data¶
devfreq-event 資料
定義:
struct devfreq_event_data {
unsigned long load_count;
unsigned long total_count;
};
成員
load_countdevfreq-event 裝置在給定週期內的負載計數。
total_countdevfreq-event 裝置在給定週期內的總計數。每個計數可能表示一個時鐘週期、一個時間單位(納秒/微秒/等)或裝置驅動程式希望的任何內容。通常,利用率是 load_count / total_count。
描述
該結構包含 devfreq-event 裝置在輪詢週期內的資料。
-
struct devfreq_event_ops¶
devfreq-event 裝置的操作
定義:
struct devfreq_event_ops {
int (*enable)(struct devfreq_event_dev *edev);
int (*disable)(struct devfreq_event_dev *edev);
int (*reset)(struct devfreq_event_dev *edev);
int (*set_event)(struct devfreq_event_dev *edev);
int (*get_event)(struct devfreq_event_dev *edev, struct devfreq_event_data *edata);
};
成員
enable啟用 devfreq-event 裝置。
disable停用 devfreq-event 裝置。
reset重置 devfreq-event 裝置的所有設定。
set_event為 devfreq-event 裝置設定特定的事件型別。
get_event獲取具有特定事件型別的 devfreq-event 裝置的結果。
描述
該結構包含可由 devfreq-event 裝置驅動程式實現的 devfreq-event 裝置操作。
-
struct devfreq_event_desc¶
devfreq-event 裝置的描述符
定義:
struct devfreq_event_desc {
const char *name;
u32 event_type;
void *driver_data;
const struct devfreq_event_ops *ops;
};
成員
namedevfreq-event 裝置的名稱。
event_type由驅動程式確定和使用的事件型別
driver_datadevfreq-event 驅動程式的私有資料。
ops控制 devfreq-event 裝置的操作。
描述
每個 devfreq-event 裝置都由這個結構描述。該結構包含 devfreq-event 裝置的各種資料。event_type 描述了將在暫存器中計數的內容。它可能選擇計數,例如,讀取請求、寫入資料(位元組)等。支援的完整型別列表位於特定標頭檔案中:include/dt-bindings/pmu/。
-
void devfreq_get_freq_range(struct devfreq *devfreq, unsigned long *min_freq, unsigned long *max_freq)¶
獲取當前頻率範圍
引數
struct devfreq *devfreqdevfreq 例項
unsigned long *min_freq最小頻率
unsigned long *max_freq最大頻率
描述
這考慮了所有約束。
引數
struct devfreq *devfreqdevfreq 例項
unsigned long freq更新目標頻率
引數
struct devfreq *devfreqdevfreq 例項。
unsigned long freq父裝置的新頻率。此引數僅用於使用被動調頻器的 devfreq 裝置。
注意
- 在呼叫 devfreq_update_target 之前鎖定 devfreq->lock。該函式
應該只由
update_devfreq()和 devfreq 調頻器使用。
引數
struct devfreq *devfreqdevfreq 例項。
注意
- 在呼叫 update_devfreq 之前鎖定 devfreq->lock
此函式是為調頻器匯出的。
引數
struct devfreq *devfreqdevfreq 例項。
描述
啟動 devfreq 裝置負載監控的輔助函式。預設情況下,可延遲定時器用於負載監控。但使用者可以使用 devfreq_dev_profile 中的“timer”型別更改此行為。在將裝置新增到 devfreq 框架時,devfreq 調頻器會響應 DEVFREQ_GOV_START 事件呼叫此函式。
引數
struct devfreq *devfreqdevfreq 例項。
描述
停止 devfreq 裝置負載監控的輔助函式。當裝置從 devfreq 框架中移除時,調頻器會響應 DEVFREQ_GOV_STOP 事件呼叫此函式。
引數
struct devfreq *devfreqdevfreq 例項。
描述
掛起 devfreq 裝置負載監控的輔助函式。當輪詢間隔設定為零時,調頻器會響應 DEVFREQ_GOV_SUSPEND 事件呼叫此函式。
注意
儘管此函式與 devfreq_monitor_stop() 相同,但為了提供收集轉換統計資訊的鉤子,有意將其分開。
引數
struct devfreq *devfreqdevfreq 例項。
描述
恢復 devfreq 裝置負載監控的輔助函式。當輪詢間隔設定為非零時,調頻器會響應 DEVFREQ_GOV_RESUME 事件呼叫此函式。
引數
struct devfreq *devfreqdevfreq 例項。
unsigned int *delay要設定的新輪詢間隔。
描述
設定新的負載監控輪詢間隔的輔助函式。調頻器會響應 DEVFREQ_GOV_UPDATE_INTERVAL 事件呼叫此函式。
-
struct devfreq *devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile, const char *governor_name, void *data)¶
為裝置新增 devfreq 功能
引數
struct device *dev要新增 devfreq 功能的裝置。
struct devfreq_dev_profile *profile執行 devfreq 的裝置特定配置檔案。
const char *governor_name選擇頻率的策略名稱。
void *datadevfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。
-
struct devfreq *devm_devfreq_add_device(struct device *dev, struct devfreq_dev_profile *profile, const char *governor_name, void *data)¶
資源管理的
devfreq_add_device()
引數
struct device *dev要新增 devfreq 功能的裝置。
struct devfreq_dev_profile *profile執行 devfreq 的裝置特定配置檔案。
const char *governor_name選擇頻率的策略名稱。
void *datadevfreq 驅動傳遞給調頻器的資料,調頻器不應修改它。
描述
此函式使用裝置資源管理自動管理 devfreq 裝置的記憶體,並簡化 devfreq 裝置記憶體的釋放操作。
-
void devm_devfreq_remove_device(struct device *dev, struct devfreq *devfreq)¶
資源管理的
devfreq_remove_device()
引數
struct device *dev從中移除 devfreq 功能的裝置。
struct devfreq *devfreq要移除的 devfreq 例項
引數
struct devfreq *devfreq要掛起的 devfreq 例項
描述
此函式旨在由持有 devfreq 的裝置驅動程式的 pm 回撥(例如,runtime_suspend、suspend)呼叫。
引數
struct devfreq *devfreq要恢復的 devfreq 例項
描述
此函式旨在由持有 devfreq 的裝置驅動程式的 pm 回撥(例如,runtime_resume、resume)呼叫。
-
int devfreq_add_governor(struct devfreq_governor *governor)¶
新增 devfreq 調頻器
引數
struct devfreq_governor *governor要新增的 devfreq 調頻器
-
int devm_devfreq_add_governor(struct device *dev, struct devfreq_governor *governor)¶
新增 devfreq 調頻器
引數
struct device *dev新增 devfreq 調頻器的裝置
struct devfreq_governor *governor要新增的 devfreq 調頻器
描述
這是 devfreq_add_governor() 的資源管理變體。
-
int devfreq_remove_governor(struct devfreq_governor *governor)¶
從裝置中移除 devfreq 功能。
引數
struct devfreq_governor *governor要移除的 devfreq 調頻器
-
struct dev_pm_opp *devfreq_recommended_opp(struct device *dev, unsigned long *freq, u32 flags)¶
獲取目標回撥函式給定頻率值的合適 OPP 的輔助函式。
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
unsigned long *freq傳遞給目標函式的頻率
u32 flagsdevfreq 框架傳遞的標誌。
描述
呼叫者在使用返回的 OPP 後,需要呼叫 dev_pm_opp_put()。
-
int devfreq_register_opp_notifier(struct device *dev, struct devfreq *devfreq)¶
在 OPP 可用性發生任何變化時通知 devfreq 的輔助函式。
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
-
int devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq)¶
停止在 OPP 可用性發生任何變化時通知 devfreq 的輔助函式。
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
描述
在 devfreq_dev_profile 的 exit() 回撥中,如果使用了 devfreq_recommended_opp,則必須包含此項。
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
-
void devm_devfreq_unregister_opp_notifier(struct device *dev, struct devfreq *devfreq)¶
資源管理的 devfreq_unregister_opp_notifier()
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
-
int devfreq_register_notifier(struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)¶
向 devfreq 註冊驅動程式
引數
struct devfreq *devfreqdevfreq 物件。
struct notifier_block *nb要註冊的通知塊。
unsigned int listDEVFREQ_TRANSITION_NOTIFIER。
-
int devm_devfreq_register_notifier(struct device *dev, struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)¶
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
struct notifier_block *nb要登出的通知塊。
unsigned int listDEVFREQ_TRANSITION_NOTIFIER。
描述
-
void devm_devfreq_unregister_notifier(struct device *dev, struct devfreq *devfreq, struct notifier_block *nb, unsigned int list)¶
引數
struct device *devdevfreq 使用者裝置。(devfreq 的父級)
struct devfreq *devfreqdevfreq 物件。
struct notifier_block *nb要登出的通知塊。
unsigned int listDEVFREQ_TRANSITION_NOTIFIER。
描述
資源管理的 devfreq_unregister_notifier()
-
int devfreq_event_enable_edev(struct devfreq_event_dev *edev)¶
啟用 devfreq-event 裝置並增加 devfreq-event 裝置的 enable_count。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式會增加 enable_count 並啟用 devfreq-event 裝置。devfreq 裝置在使用 devfreq-event 裝置之前應先啟用它。
-
int devfreq_event_disable_edev(struct devfreq_event_dev *edev)¶
停用 devfreq-event 裝置並減少 devfreq-event 裝置的 enable_count。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式會減少 enable_count 並停用 devfreq-event 裝置。devfreq-event 裝置停用後,devfreq 裝置無法對其進行 get/set/reset 操作。
-
bool devfreq_event_is_enabled(struct devfreq_event_dev *edev)¶
檢查 devfreq-event 裝置是否已啟用。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式檢查 devfreq-event 裝置是否已啟用。如果返回 true,則 devfreq-event 裝置已啟用。如果返回 false,則 devfreq-event 裝置已停用。
-
int devfreq_event_set_event(struct devfreq_event_dev *edev)¶
設定 devfreq-event 裝置事件以啟動。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式將事件設定到 devfreq-event 裝置以啟動,從而獲取可能是各種事件型別的事件資料。
-
int devfreq_event_get_event(struct devfreq_event_dev *edev, struct devfreq_event_data *edata)¶
從 devfreq-event 裝置獲取 {load|total}_count。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
struct devfreq_event_data *edatadevfreq-event 裝置的計算資料
描述
請注意,此函式在停止 devfreq-event 裝置的整個序列程序後,從 devfreq-event 裝置獲取計算出的事件資料。
-
int devfreq_event_reset_event(struct devfreq_event_dev *edev)¶
重置 devfreq-event 裝置的所有操作。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式停止 devfreq-event 裝置的所有操作,並重置當前事件資料,使 devfreq-event 裝置進入初始狀態。
-
struct devfreq_event_dev *devfreq_event_get_edev_by_phandle(struct device *dev, const char *phandle_name, int index)¶
從裝置樹獲取 devfreq-event 裝置。
引數
struct device *dev指向給定裝置的指標
const char *phandle_name包含 phandle 值的屬性名稱
int indexdevfreq-event 裝置列表中的索引
描述
請注意,此函式返回 devfreq-event 裝置的指標。
-
int devfreq_event_get_edev_count(struct device *dev, const char *phandle_name)¶
獲取 devfreq-event 裝置的數量
引數
struct device *dev指向給定裝置的指標
const char *phandle_name包含 phandle 值的屬性名稱
描述
請注意,此函式返回 devfreq-event 裝置的數量。
-
struct devfreq_event_dev *devfreq_event_add_edev(struct device *dev, struct devfreq_event_desc *desc)¶
新增新的 devfreq-event 裝置。
引數
struct device *dev擁有正在建立的 devfreq-event 裝置的裝置
struct devfreq_event_desc *descdevfreq-event 裝置的描述符,其中包含 devfreq-event 裝置的基本資料。
描述
請注意,此函式將新的 devfreq-event 裝置新增到 devfreq-event 類列表,並註冊 devfreq-event 裝置的裝置。
-
int devfreq_event_remove_edev(struct devfreq_event_dev *edev)¶
移除已註冊的 devfreq-event 裝置。
引數
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式移除已註冊的 devfreq-event 裝置。
-
struct devfreq_event_dev *devm_devfreq_event_add_edev(struct device *dev, struct devfreq_event_desc *desc)¶
資源管理的
devfreq_event_add_edev()
引數
struct device *dev擁有正在建立的 devfreq-event 裝置的裝置
struct devfreq_event_desc *descdevfreq-event 裝置的描述符,其中包含 devfreq-event 裝置的基本資料。
描述
請注意,此函式使用裝置資源管理自動管理 devfreq-event 裝置的記憶體,並簡化 devfreq-event 裝置記憶體的釋放操作。
-
void devm_devfreq_event_remove_edev(struct device *dev, struct devfreq_event_dev *edev)¶
引數
struct device *dev擁有正在建立的 devfreq-event 裝置的裝置
struct devfreq_event_dev *edevdevfreq-event 裝置
描述
請注意,此函式使用裝置資源管理自動管理 devfreq-event 裝置的記憶體。