linux内核 频率,Linux内核中CPU主频和电压调整 (三)
如何開發(fā)一個(gè)新的CPUFreq driver
初始化
首先,在一個(gè) __initcall level 7后者以后的函數(shù)中檢查內(nèi)核是否運(yùn)行在正確的CPU和正確的芯片組上面。
如果正確,則通過cpufreq_register_driver() 函數(shù), 注冊(cè)一個(gè)cpufreq_driver結(jié)構(gòu)體。
cpufreq_driver結(jié)構(gòu)體中必須包含:
cpufreq_driver.name:????? 驅(qū)動(dòng)名稱
cpufreq_driver.owner:???? THIS_MODULE
cpufreq_driver.init:??????????指向per-CPU初始化函數(shù)的指針
cpufreq_driver.verify:?????? 指向”verification“函數(shù)的指針
cpufreq_driver.setpolicy / cpufreq_driver.target:????? 詳見后面差異性介紹
還可以選擇性包含:
cpufreq_driver.exit:?????????? 指向per-CPU清理函數(shù)的指針
cpufreq_driver.resume:??指向per-CPU resume函數(shù)的指針。
此函數(shù)在中斷失能的情況下被調(diào)用。并且在 pre-suspend 主頻率或policy被恢復(fù)成->target 或者->setpolicy前調(diào)用。
cpufreq_driver.attr:??????????? 指向一個(gè)以NULL結(jié)尾的列表指針,該列表中的成員類型為 freq_attr結(jié)構(gòu)體。通過此參數(shù),允許用戶導(dǎo)出屬性到sysfs中。
Per-CPU初始化
當(dāng)一個(gè)新的CPU無論何時(shí)被注冊(cè)到設(shè)備模型中時(shí),或者在cpufreq驅(qū)動(dòng)注冊(cè)自己后, per-CPU初始化函數(shù) cpufreq_driver.init被調(diào)用。
該函數(shù)接受一個(gè)cpufreq_policy結(jié)構(gòu)體作為參數(shù)。
如果必要,針對(duì)用戶CPU類型,使能 CPUfreq支持。
policy->cpuinfo.min_freq / policy->cpuinfo.max_freq:??CPU所支持的最小/最大頻率。(單位: 千赫茲)
policy->cpuinfo.transition_latency????CPU在不同頻率之間切換時(shí)所需要的時(shí)間。(單位:納秒)
policy->cur:???CPU的當(dāng)前工作頻率
policy->min / policy->max
policy->policy? /? policy->governor:???? 必須包含針對(duì)該CPU的”缺省policy“。隨后,cpufreq_driver.verify/cpufreq_driver.setpolicy或
cpufreq_driver.target函數(shù)被調(diào)用時(shí)將使用這些定義值。
Verify / 驗(yàn)證
當(dāng)用戶決定使用一個(gè)新的policy(包含了policy, governor, min,max等值)時(shí), 該policy必須被驗(yàn)證。
如此,不合適的值將被更正。為了驗(yàn)證這些定義值, 一個(gè)頻率表輔助函數(shù)被使用。
必須確保至少有一個(gè)有效的工作頻率(該頻率位于policy->min 和 policy->max 之間)。
如果必要,首先增大policy->max; 如果沒有其他辦法,才能選擇降低 policy->min。
target 或 setpolicy
絕大多數(shù)cpufreq驅(qū)動(dòng),甚至大多數(shù)cpu倍頻算法僅僅允許處理器被設(shè)置在一個(gè)頻率上。
此種情況下,需要使用 ->target 調(diào)用。
某些具有處理器調(diào)頻能力的處理器,能夠在一定的頻率范圍內(nèi)切換頻率。
此種情況下,需要使用->setpolicy 調(diào)用。
target
target調(diào)用有三個(gè)參數(shù):
struct cpufreq_policy *policy
unsigned int target_frequency
unsigned int relation
CPUFreq驅(qū)動(dòng)必須在被調(diào)用的時(shí)候設(shè)置新的處理器頻率。 實(shí)際頻率必須根據(jù)如下規(guī)則來確定:
1) 盡量靠近 ”target_freq“頻率
2)必須滿足條件?? policy->min?? <=? new_freq? <=? policy->max
3)? 如果? relation == CPUFREQ_REL_L,? 嘗試選擇高于或等于 target_freq的新頻率
4) 如果? relation== CPUFREQ_REL_H,? 嘗試選擇低于或等于target_freq的新頻率
setpolicy
setpolicy函數(shù)僅僅只有一個(gè)參數(shù)。
struct cpufreq_policy*policy
需要設(shè)置處理器低頻限到 policy->min, 需要設(shè)置處理器高頻限到 policy->max
Frequency Table Helpers
大多數(shù)的處理器都僅支持設(shè)置成幾個(gè)特定的頻率。因此,一張頻率表被用來輔助驅(qū)動(dòng)開發(fā)。
通過調(diào)用函數(shù)
cpufreq_frequency_table_cpuinfo(struct?cpufreq_policy?*policy,
span?style="font-size:14px;">???????????????????????????????????struct?cpufreq_frequency_table?*table);cpuinfo->min_freq 被設(shè)置為 policy->min,? cpuinfo->max_freq 被設(shè)置成 policy->max。
下述函數(shù)用來驗(yàn)證處理器頻率設(shè)定。
int?cpufreq_frequency_table_verify(struct?cpufreq_policy?*policy,
struct?cpufreq_frequency_table?*table);
針對(duì) ->target 情況,? 對(duì)應(yīng)的函數(shù)為
int?cpufreq_frequency_table_target(struct?cpufreq_policy?*policy,
struct?cpufreq_frequency_table?*table,
unsigned?int?target_freq,
unsigned?int?relation,
unsigned?int?*index);
總結(jié)
以上是生活随笔為你收集整理的linux内核 频率,Linux内核中CPU主频和电压调整 (三)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Thymeleaf th:include
- 下一篇: 基于注意力机制的循环网络进行层级性多元标