Documentation/translations/zh_CN/power/opp.rst

Source file repositories/reference/linux-study-clean/Documentation/translations/zh_CN/power/opp.rst

File Facts

System
Linux kernel
Corpus path
Documentation/translations/zh_CN/power/opp.rst
Extension
.rst
Size
12290 bytes
Lines
342
Domain
Support Tooling And Documentation
Bucket
Documentation
Inferred role
Support Tooling And Documentation: documentation
Status
atlas-only

Why This File Exists

Repository support layer: documentation, build tooling, samples, user-space helper tools, generated initramfs support, licenses, and validation utilities.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!r) {
			pr_err("%s: unable to register mpu opp(%d)\n", r);
			goto no_cpufreq;
		}
		/* 做一些和cpufreq相关的事情 */
	 no_cpufreq:
		/* 做剩余的事情 */
	 }

3. OPP搜索函数
==============
cpufreq等高层框架对频率进行操作,为了将频率映射到相应的OPP,OPP库提供了便利的函数
来搜索OPP库内部管理的OPP链表。这些搜索函数如果找到匹配的OPP,将返回指向该OPP的指针,
否则返回错误。这些错误预计由标准的错误检查,如IS_ERR()来处理,并由调用者采取适当的
行动。

这些函数的调用者应在使用完OPP后调用dev_pm_opp_put()。否则,OPP的内存将永远不会
被释放,并导致内存泄露。

dev_pm_opp_find_freq_exact
	根据 *精确的* 频率和可用性来搜索OPP。这个函数对默认不可用的OPP特别有用。
	例子:在SoC框架检测到更高频率可用的情况下,它可以使用这个函数在调用
	dev_pm_opp_enable之前找到OPP::

	 opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
	 dev_pm_opp_put(opp);
	 /* 不要操作指针.. 只是做有效性检查.. */
	 if (IS_ERR(opp)) {
		pr_err("frequency not disabled!\n");
		/* 触发合适的操作.. */
	 } else {
		dev_pm_opp_enable(dev,1000000000);
	 }

	注意:
	  这是唯一一个可以搜索不可用OPP的函数。

dev_pm_opp_find_freq_floor
	搜索一个 *最多* 提供指定频率的可用OPP。这个函数在搜索较小的匹配或按频率
	递减的顺序操作OPP信息时很有用。
	例子:要找的一个设备的最高OPP::

	 freq = ULONG_MAX;
	 opp = dev_pm_opp_find_freq_floor(dev, &freq);
	 dev_pm_opp_put(opp);

dev_pm_opp_find_freq_ceil
	搜索一个 *最少* 提供指定频率的可用OPP。这个函数在搜索较大的匹配或按频率
	递增的顺序操作OPP信息时很有用。
	例1:找到一个设备最小的OPP::

	 freq = 0;
	 opp = dev_pm_opp_find_freq_ceil(dev, &freq);
	 dev_pm_opp_put(opp);

	例: 一个SoC的cpufreq_driver->target的简易实现::

	 soc_cpufreq_target(..)
	 {
		/* 做策略检查等操作 */
		/* 找到和请求最接近的频率 */
		opp = dev_pm_opp_find_freq_ceil(dev, &freq);
		dev_pm_opp_put(opp);
		if (!IS_ERR(opp))
			soc_switch_to_freq_voltage(freq);
		else
			/* 当不能满足请求时,要做的事 */
		/* 做其它事 */
	 }

Annotation

Implementation Notes