最近在看CPU如何动态调节频率的相关部分。系统会根据当前负载,以及温度情况来调节cpu的频率,以满足系统需求和省电。
cpu内部有温度传感器,当温度升高和降低到一定程度,都会出发中断,以此来调节频率(温度升高后,进行降频,温度降低后,如果系统仍需要更高频率,则把频率调高)。另外,系统会根据当前负载,进行调频。这个优先级比温度稍微低些,因为温度方面是通过中断来控制的。
首先,需要时刻更新当前需要的频率。
532 static struct cpufreq_driver omap_driver = {
533 .flags = CPUFREQ_STICKY,
534 .verify = omap_verify_speed,
535 .target = omap_target,
536 .get = omap_getspeed,
537 .init = omap_cpu_init,
538 .exit = omap_cpu_exit,
539 .name = "omap2plus",
540 .attr = omap_cpufreq_attr,
541 };
这里,最重要的函数omap_target中会进行频率调节(根据负载,调整当前频率为需要的频率),调用的地方呆会再看。先看看它的定义
267 static int omap_target(struct cpufreq_policy *policy,
268 unsigned int target_freq,
269 unsigned int relation)
270 {
271 unsigned int i;
272 int ret = 0;
273
274 if (!freq_table) {
275 dev_err(mpu_dev, "%s: cpu%d: no freq table!\n", __func__,
276 policy->cpu);
277 return -EINVAL;
278 }
279
280 ret = cpufreq_frequency_table_target(policy, freq_table, target_freq,
281 relation, &i);
282 if (ret) {
283 dev_dbg(mpu_dev, "%s: cpu%d: no freq match for %d(ret=%d)\n",
284 __func__, policy->cpu, target_freq, ret);
285 return ret;
286 }
287
288 mutex_lock(&omap_cpufreq_lock);
289
290 current_target_freq = freq_table[i].frequency;
291
292 if (!omap_cpufreq_suspended) {
293 #ifdef CONFIG_OMAP4_DPLL_CASCADING
294 if (cpu_is_omap44xx() && target_freq > policy->min)
295 omap4_dpll_cascading_blocker_hold(mp