• 342查看
  • 0回复

[芯片硬件] 电源管理入门-10 OPP介绍

[复制链接]


该用户从未签到

发表于 3-3-2024 09:07:52 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


电源管理入门-10 OPP介绍w1.jpg

之前的文章设置clock的时候多次提到了(Operating Performance Point)OPP,例如DEVFreq、CPUFreq等,在现代SoC上存在有Power Domain,也可以以Power Domain为单位进行OPP的电压频率定义。

1. 什么是OPP,怎么用?


在SoC内,某些domain可以运行在较低的频率和电压下,而其他domain可以运行在较高的频率和电压下,某个domain所支持的<频率,电压>对的集合被称为Operating Performance Point,缩写OPP。

在DTS中配置后自动有OPP框架驱动加载使用,例如CPU的OPP,从设备树文件arch/arm/boot/dts/imx6ull.dtsi中找到
cpu0: cpu@0 {
        compatible = "arm,cortex-a7";
        device_type = "cpu";
        reg = <0>;
        clock-latency = <61036>; /* two CLK32 periods */
        operating-points = <
                /* kHz        uV */
                900000        1275000
                792000        1225000
                528000        1175000
                396000        1025000
                198000        950000
        >;
        fsl,soc-operating-points = <
                /* KHz        uV */
                900000        1175000
                792000        1175000
                528000        1175000
                396000        1175000
                198000        1175000
        >;

2. 系统初始化加载OPP信息

DT_MACHINE_START

--》imx6ul_init_late

--》imx6ul_opp_init

--》_of_add_opp_table_v1(dev);

--》_opp_add_v1

--》_opp_add

_of_add_opp_table_v1中会根据DTS中信息找到对应的信息:

电源管理入门-10 OPP介绍w2.jpg

_opp_add_v1中会把DTS中信息提取出来,存入struct dev_pm_opp *new_opp;
电源管理入门-10 OPP介绍w3.jpg

这里struct dev_pm_opp如下:
struct dev_pm_opp {
        struct list_head node;

        bool available;
        unsigned long rate;
        unsigned long u_volt;

        struct device_opp *dev_opp;
        struct rcu_head head;
};

node: 用于链表管理此设备下的opp。 available: 用于判断此opp使能可以使用。 rate: 频率,单位Hz u_volt: 电压。 dev_opp: struct device_opp类型指针,指向此opp所属的设备。

3. 触发使用

例如输入命令:
echo 700000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

__cpufreq_driver_target->__target_index->cpufreq_driver->target_index
static int set_target(struct cpufreq_policy *policy, unsigned int index)
{
        struct private_data *priv = policy->driver_data;

        return dev_pm_opp_set_rate(priv->cpu_dev,
            policy->freq_table[index].frequency * 1000);
}

dev_pm_opp_set_rate()函数在drivers/base/power/opp/core.c中定义
        opp_table = _find_opp_table(dev);

        clk = opp_table->clk;
        freq = clk_round_rate(clk, target_freq);
        if ((long)freq <= 0)
                freq = target_freq;

        old_freq = clk_get_rate(clk);

  ret = _generic_set_opp_clk_only(dev, clk, old_freq, freq);

clk_set_rate进行频率设置。

4. API介绍


    dev_pm_opp_add :( WARNING: Do not use this function in interrupt context.)
      向指定的设备添加一个频率/电压(opp table)组合,频率和电压的单位分别是Hz和uV。

    dev_pm_opp_remove:
      remove an opp from opp table.

    dev_pm_opp_get:
      increment the reference count of opp.

    dev_pm_opp_enable:
      用于使能指定的OPP,调用dev_pm_opp_add添加进去的OPP,默认是enable的。

    dev_pm_opp_disable:
      虽然设备支持某些OPP,但driver有可能觉得比较危险,不想使用,则可以调用dev_pm_opp_disable接口,禁止该OPP。

    dev_pm_opp_get_voltage:
      获得电压。

    dev_pm_opp_get_freq:
      获得频率。

    dev_pm_opp_set_regulators:
      进行voltage scaling

    dev_pm_opp_put_regulators:
      free the resources acquired by the OPP core

    dev_pm_opp_set_rate:
      This routine configures the device for the OPP with the lowest frequency greater than or equal to the target frequency.

    dev_pm_opp_get_opp_count:
      获取opp table opps numbers

    dev_pm_opp_of_add_table :
      解析并初始化一个设备的opp table。

    OPP的查询接口包括:
      dev_pm_opp_find_freq_floor,查询小于或者等于指定freq的OPP,在返回OPP的同时,从freq指针中返回实际的freq值;dev_pm_opp_find_freq_ceil,查询大于或者等于指定freq的OPP,在返回OPP的同时,从freq指针中返回实际的freq值;dev_pm_opp_find_freq_exact,精确查找指定freq的OPP,同时通过available变量,可以控制是否查找处于disable状态的OPP。上面两个查找接口,是不查找处于disable状态的OPP的。


后记:

Linux驱动的套路其实就是DTS里面有个compatible,然后内核启动的时候走各种平台设备初始化就会去寻找加载,然后变成链表结构体。在使用的时候:用户通过设备节点或者中断产生或者内核进程触发就可以运行。

“啥都懂一点,啥都不精通,

干啥都能干,干啥啥不是,

专业入门劝退,堪称程序员杂家”。

欢迎各位自己有博客公众号的留言:申请转载,多谢!

后续会继续更新,纯干货分析,欢迎分享给朋友,欢迎点赞、收藏、在看、划线和评论交流以!


该用户从未签到

发表于 14-3-2025 16:38:00 | 显示全部楼层
关于您提到的电源管理入门中关于OPP的介绍,以下是专业回复:

OPP(Operating Performance Point)是描述特定硬件区域或模块在特定条件下的运行性能参数集合,通常包括电压和频率等参数。在现代SoC(系统级芯片)中,由于存在多个运行域(Power Domain),不同运行域可以根据需求运行在各自最优的电压和频率下。通过定义和管理这些OPP,系统可以获得最佳的性能和能效表现。在设备树源(DTS)中配置后,OPP框架会自动驱动加载使用,以实现对硬件性能的动态管理和调整。具体应用时,需要根据硬件设计和性能需求合理选择和管理OPP。
回复 支持 反对

使用道具 举报

快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 19-8-2025 12:32 , Processed in 0.520576 second(s), 38 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.