cppc 动态调频

CPPC 的全称是Collaborative Processor Performance Control
CPC 的全称是Per cpu table called
cppc是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 driver
static 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 频率.

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Cpp是一种高级编程语言,被广泛用于开发各种类型的应用程序。它继承了C语言的基本语法和特性,并在此基础上进行了扩展和改进。Cpp具有面向对象的编程能力,支持封装、继承和多态等概念。相比于C语言,Cpp提供了更强大的数据类型和更丰富的库函数,使得程序的开发更加高效和方便。 C是一种通用的编程语言,是很多其他编程语言的基础。它具有高效、简洁和可移植的特性,广泛应用于系统级编程和嵌入式开发。与Cpp相比,C语言更加底层,更加接近计算机硬件。编写C语言程序需要更加关注内存和性能等细节,但也使程序更加高效和灵活。 Makefile是一种用于自动化构建程序的工具。通过定义一系列规则和依赖关系,Makefile可以自动判断需要重新编译的文件,并生成最终的可执行文件。它可以大大简化程序的管理和构建过程,尤其适用于大型的项目。使用Makefile,我们可以通过运行一个简单的命令就可以自动完成编译、链接和测试等繁琐的工作。 总结来说,Cpp是一种高级编程语言,C是一种通用的编程语言,而Makefile是一种用于自动化构建程序的工具。它们在程序开发过程中都起到了重要的作用,对于提高开发效率和管理程序非常有帮助。 ### 回答2: C++是一种高级编程语言,它是C语言的扩展和增强版本。C++具有更强大的面向对象特性和更高级的抽象能力,同时也兼容C语言的语法和库函数,因此可以方便地与C代码进行混合编程。 C语言是一种通用的高级编程语言,它提供了一系列的库函数和语法规则,非常适合用于系统编程和嵌入式开发。通过使用C语言,可以编写高效而底层的代码,灵活控制计算机硬件资源。 Makefile是一种用于自动化构建软件的工具。通过编写Makefile,可以定义编译、链接和运行程序的规则和依赖关系。Makefile在C/C++的开发中经常使用,它可以根据文件修改的依赖关系,仅重新编译被修改过的文件,以提高编译的效率。 在C/C++的开发过程中,通常会使用C语言编写底层的系统代码和对硬件资源的操作,并使用C++编写上层业务逻辑和面向对象的代码。通过使用Makefile,可以将源代码、库文件和头文件的编译过程自动化,简化了编译和构建的步骤。 总结来说,C++是C语言的扩展和增强版本,具有更丰富的特性和抽象能力;C语言是一种通用的高级编程语言,非常适合于系统编程和嵌入式开发;而Makefile是一种用于自动化构建软件的工具,可以简化编译和构建的过程。在C/C++的开发中,这三者经常会同时使用。 ### 回答3: CPP (C++)是一种编程语言,它是C语言的扩展版本,具有更多的功能和特性。CPP是面向对象的语言,支持封装、继承和多态等特性,同时还具有更强大的数据类型和模板机制。CPP被广泛应用于开发各种类型的软件和应用程序,特别是在游戏开发、系统编程和科学计算等领域。 C语言是一种通用的、高级的编程语言,它于1972年由Dennis Ritchie开发。C语言的设计原则是简洁、高效和可移植性,适用于系统级编程和嵌入式开发。C语言是一种结构化的语言,具有丰富的控制结构和强大的指针操作,但不支持面向对象编程。 Makefile是一种用于自动化构建软件的工具,它可以根据源代码的依赖关系和规则来自动编译和链接程序。Makefile通常使用文本文件编写,其中定义了编译器、编译参数、链接器等工具的命令和选项。通过Makefile,开发人员可以轻松地管理复杂的项目结构,只需通过运行make命令,就能自动编译更新的代码文件,而无需手动编译每个文件。 在C和CPP编程中,Makefile是一个非常重要的工具,它可以帮助程序员管理代码的编译过程,提高开发效率。Makefile可以根据源代码的修改情况自动更新需要重新编译的文件,而不必重新编译所有的源文件,从而加快了编译的速度。此外,Makefile还可以定义其他任务,如执行测试、清理临时文件等,极大地简化了整个开发过程。 总之,CPP是一种面向对象的编程语言,C是一种结构化的编程语言,而Makefile是一个用于自动化构建软件的工具。它们在不同的层面上贡献着程序开发的便利性和高效性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值