博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cppc 动态调频
阅读量:4216 次
发布时间:2019-05-26

本文共 2595 字,大约阅读时间需要 8 分钟。

CPPC 的全称是Collaborative Processor Performance ControlCPC 的全称是Per cpu table calledcppc是bios提供的一组acpi表,用于设置cpu的频率,这组acpi 表如下:/* * An example CPC table looks like the following. * *	Name(_CPC, Package() *			{ *			17, *			NumEntries *			1, *			// Revision *			ResourceTemplate(){Register(PCC, 32, 0, 0x120, 2)}, *			// Highest Performance *			ResourceTemplate(){Register(PCC, 32, 0, 0x124, 2)}, *			// Nominal Performance *			ResourceTemplate(){Register(PCC, 32, 0, 0x128, 2)}, *			// Lowest Nonlinear Performance *			ResourceTemplate(){Register(PCC, 32, 0, 0x12C, 2)}, *			// Lowest Performance *			ResourceTemplate(){Register(PCC, 32, 0, 0x130, 2)}, *			// Guaranteed Performance Register *			ResourceTemplate(){Register(PCC, 32, 0, 0x110, 2)}, *			// Desired Performance Register *			ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)}, *			.. *			.. *			.. * *		} * Each Register() encodes how to access that specific register. * e.g. a sample PCC entry has the following encoding: * *	Register ( *		PCC, *		AddressSpaceKeyword *		8, *		//RegisterBitWidth *		8, *		//RegisterBitOffset *		0x30, *		//RegisterAddress *		9 *		//AccessSize (subspace ID) *		0 *		) *	} */acpi 表中的每一项表达的含义上面也解释了,那cppc 表具体要怎么工作呢?具体是在driver/cpufreq/cppc_freq.c中这里的cppc_cpufreq_init是入口函数,这个函数向cpufreq的framework注册了一个可以调频的cpu driverstatic int __init cppc_cpufreq_init(void){	ret = cpufreq_register_driver(&cppc_cpufreq_driver);	if (ret)		goto out;}static struct cpufreq_driver cppc_cpufreq_driver = {	.flags = CPUFREQ_CONST_LOOPS,	.verify = cppc_verify_policy,	.target = cppc_cpufreq_set_target,	.get = cppc_cpufreq_get_rate,	.init = cppc_cpufreq_cpu_init,	.stop_cpu = cppc_cpufreq_stop_cpu,	.name = "cppc_cpufreq",};cppc_cpufreq_driver 最终的函数就是target,最终cpu调频就是通过target 这个回调函数来实现static int cppc_cpufreq_set_target(struct cpufreq_policy *policy,		unsigned int target_freq,		unsigned int relation){	struct cppc_cpudata *cpu;	struct cpufreq_freqs freqs;	u32 desired_perf;	int ret = 0;	cpu = all_cpu_data[policy->cpu];#得到要设置的频率	desired_perf = cppc_cpufreq_khz_to_perf(cpu, target_freq);	/* Return if it is exactly the same perf */	if (desired_perf == cpu->perf_ctrls.desired_perf)		return ret;	cpu->perf_ctrls.desired_perf = desired_perf;	freqs.old = policy->cur;	freqs.new = target_freq;	cpufreq_freq_transition_begin(policy, &freqs);#通过acpi 提供的的接口来设置cpu 频率	ret = cppc_set_perf(cpu->cpu, &cpu->perf_ctrls);	cpufreq_freq_transition_end(policy, &freqs, ret != 0);	if (ret)		pr_debug("Failed to set target on CPU:%d. ret:%d\n",				cpu->cpu, ret);	return ret;}这里的cppc_set_perf实现在driver/acpi/cppc_acpi.c中实现,通过这个接口就可以通过固件来设置cpu 频率.

 

转载地址:http://svnmi.baihongyu.com/

你可能感兴趣的文章
Oracle 11g 新特性 -- Online Patching (Hot Patching 热补丁)说明
查看>>
Oracle 11g 新特性 -- ASM 增强 说明
查看>>
Oracle 11g 新特性 -- Database Replay (重演) 说明
查看>>
Oracle 11g 新特性 -- 自动诊断资料档案库(ADR) 说明
查看>>
Oracle 11g 新特性 -- RMAN Data Recovery Advisor(DRA) 说明
查看>>
CSDN博客之星 投票说明
查看>>
Oracle wallet 配置 说明
查看>>
Oracle smon_scn_time 表 说明
查看>>
VBox fdisk 不显示 添加的硬盘 解决方法
查看>>
Secure CRT 自动记录日志 配置 小记
查看>>
RMAN RAC 到 单实例 duplicate 自动分配通道 触发 ORA-19505 错误
查看>>
mysql 随机分页的优化
查看>>
DB2快速创建测试库
查看>>
利用db2look查看ddl
查看>>
java中的mmap实现
查看>>
Redis的Aof被阻塞原因调查
查看>>
Redis Cluster的FailOver失败案例分析
查看>>
Android Alarm驱动源代码分析(Alarm.c)
查看>>
S3C2440上LCD驱动 (FrameBuffer)实例开发讲解
查看>>
Linux音频编程指南
查看>>