1 .. SPDX-License-Identifier: GPL-2.0 2 3 .. include:: ../disclaimer-zh_TW.rst 4 5 :Original: Documentation/cpu-freq/cpu-drivers. 6 7 :翻譯: 8 9 司延騰 Yanteng Si <siyanteng@loongson.cn> 10 11 :校譯: 12 13 唐藝舟 Tang Yizhou <tangyeechou@gmail.com> 14 15 ======================================= 16 如何實現一個新的CPUFreq處理器驅動 17 ======================================= 18 19 作者: 20 21 22 - Dominik Brodowski <linux@brodo.de> 23 - Rafael J. Wysocki <rafael.j.wysocki@i 24 - Viresh Kumar <viresh.kumar@linaro.org 25 26 .. Contents 27 28 1. 怎麼做? 29 1.1 初始化 30 1.2 Per-CPU 初始化 31 1.3 驗證 32 1.4 target/target_index 或 setpolicy? 33 1.5 target/target_index 34 1.6 setpolicy 35 1.7 get_intermediate 與 target_intermedia 36 2. 頻率表助手 37 38 39 40 1. 怎麼做? 41 =========== 42 43 如果,你剛剛得到了一個全新的CPU/ 44 支持?很好,這裏有一些至關重要 45 46 47 1.1 初始化 48 ---------- 49 50 首先,在 __initcall level 7 (module_init() 51 運行在正確的CPU和正確的芯片組上 52 CPUfreq核心層註冊一個cpufreq_driver結 53 54 結構體cpufreq_driver應該包含什麼成 55 56 .name - 驅動的名字。 57 58 .init - 一個指向per-policy初始化函數 59 60 .verify - 一個指向"verification"函數的 61 62 .setpolicy 或 .fast_switch 或 .target 或 . 63 下文。 64 65 其它可選成員 66 67 .flags - 給cpufreq核心的提示。 68 69 .driver_data - cpufreq驅動程序的特有 70 71 .get_intermediate 和 target_intermediate - 72 的頻率。 73 74 .get - 返回CPU的當前頻率。 75 76 .bios_limit - 返回HW/BIOS對CPU的最大頻 77 78 .exit - 一個指向per-policy清理函數的 79 階段被調用。 80 81 .suspend - 一個指向per-policy暫停函數 82 後被調用。 83 84 .resume - 一個指向per-policy恢復函數 85 調用。 86 87 .ready - 一個指向per-policy準備函數 88 89 .attr - 一個指向NULL結尾的"struct freq 90 sysfs。 91 92 .boost_enabled - 如果設置,則啓用提 93 94 .set_boost - 一個指向per-policy函數的 95 96 97 1.2 Per-CPU 初始化 98 ------------------ 99 100 每當一個新的CPU被註冊到設備模型 101 略不存在,則會調用per-policy的初始 102 只爲某個策略調用一次,而不是對 103 *policy`` 作爲參數。現在該怎麼做呢 104 105 如果有必要,請在你的CPU上激活CPUf 106 107 然後,驅動程序必須填寫以下值: 108 109 +-----------------------------------+--------- 110 |policy->cpuinfo.min_freq和 | 該CPU 111 |policy->cpuinfo.max_freq | 112 | | 113 +-----------------------------------+--------- 114 |policy->cpuinfo.transition_latency | CPU在 115 | | 納秒 116 | | CPUFREQ_ 117 | | 118 +-----------------------------------+--------- 119 |policy->cur | 該CPU 120 | | 121 +-----------------------------------+--------- 122 |policy->min, | 必須 123 |policy->max, | 會用 124 |policy->policy and, if necessary, | cpufreq_ 125 |policy->governor | 之一 126 | | cpufreq_ 127 | | 128 +-----------------------------------+--------- 129 |policy->cpus | 該polic 130 | | (即與 131 | | 掩碼( 132 | | 更新 133 | | 134 +-----------------------------------+--------- 135 136 對於設置其中的一些值(cpuinfo.min[max 137 助。關於它們的更多信息,請參見 138 139 140 1.3 驗證 141 -------- 142 143 當用戶決定設置一個新的策略(由"po 144 以便糾正不兼容的值。爲了驗證這 145 *policy``, ``unsigned int min_freq``, ``unsign 146 關於頻率表輔助函數的詳細內容請 147 148 您需要確保至少有一個有效頻率( 149 要,先增大policy->max,只有在沒有 150 151 152 1.4 target 或 target_index 或 setpolicy 或 153 ---------------------------------------------- 154 155 大多數cpufreq驅動甚至大多數CPU頻率 156 可以使用->target(),->target_index()或-> 157 158 有些具有硬件調頻能力的處理器可 159 160 161 1.5. target/target_index 162 ------------------------ 163 164 target_index調用有兩個參數: ``struct 165 索引(用於索引頻率表項)。 166 167 當調用這裏時,CPUfreq驅動必須設置 168 169 在發生錯誤的情況下總是應該恢復 170 中間頻率。 171 172 已棄用 173 ---------- 174 target調用有三個參數。``struct cpufreq 175 unsigned int relation. 176 177 CPUfreq驅動在調用這裏時必須設置新 178 179 - 儘量貼近"目標頻率"。 180 - policy->min <= new_freq <= policy->max (這 181 - 如果 relation==CPUFREQ_REL_L,嘗試選 182 最低,但不能低於") 183 - 如果 relation==CPUFREQ_REL_H,嘗試選 184 最高,但不能高於") 185 186 這裏,頻率表輔助函數可能會幫助 187 188 1.6. fast_switch 189 ---------------- 190 191 這個函數用於從調度器的上下文進 192 個回調必須經過高度優化,以儘可 193 194 這個函數有兩個參數: ``struct cpufre 195 196 197 1.7 setpolicy 198 ------------- 199 200 setpolicy調用只需要一個 ``struct cpufre 201 率切換的下限設置爲policy->min,上 202 CPUFREQ_POLICY_PERFORMANCE時選擇面向性 203 也可以查看drivers/cpufreq/longrun.c中的 204 205 1.8 get_intermediate 和 target_intermediate 206 -------------------------------------------- 207 208 僅適用於未設置 target_index() 和 CPUFR 209 210 get_intermediate應該返回一個平臺想要 211 該頻率,然後再跳轉到'index'對應的 212 target_intermediate()或target_index()中處 213 214 在驅動程序不想爲某個目標頻率切 215 在這種情況下,cpufreq核心將直接調 216 217 注意:->target_index()應該在發生失敗 218 因爲cpufreq核心會爲此發送通知。 219 220 221 2. 頻率表輔助函數 222 ================= 223 224 由於大多數支持cpufreq的處理器只允 225 程序的一些工作。這樣的"頻率表" 226 含驅動程序的專用值,"frequency"成 227 cpufreq_frequency_table條目,頻率設置 228 CPUFREQ_ENTRY_INVALID。這些條目不需要 229 因爲搜索最佳匹配會更快。 230 231 如果在policy->freq_table字段中包含一 232 233 cpufreq_frequency_table_verify()保證至少 234 準則都被滿足。這對->verify調用很 235 236 cpufreq_frequency_table_target()是對應於-> 237 回包含CPU要設置的頻率的頻率表條 238 239 以下宏可以作爲cpufreq_frequency_table 240 241 cpufreq_for_each_entry(pos, table) - 遍歷頻 242 243 cpufreq_for_each_valid_entry(pos, table) - 該 244 使用參數"pos" -- 一個 ``cpufreq_frequenc 245 的 ``cpufreq_frequency_table *`` 。 246 247 例如:: 248 249 struct cpufreq_frequency_table *pos, * 250 251 cpufreq_for_each_entry(pos, driver_fre 252 /* Do something with pos */ 253 pos->frequency = ... 254 } 255 256 如果你需要在driver_freq_table中處理po 257 cpufreq_for_each_entry_idx() 和 cpufreq_for_e 258
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.