Devfreq Bus Dcvs

一、引言

计算机的世界里,CPU任务分为CPU bound和IO bound。而实际场景下往往是两者混合型任务。针对性能的优化,普遍关注点都在CPU上(不论是CPU的频点和CPU的选核), 往往忽略对IO bound的任务的优化。而DDR作为SOC芯片代码运行空间和数据缓存空间,在不同应用状态下,SOC对DDR访问的带宽需求不一样。譬如听音乐时访问带宽需求较小,此时DDR工作在较低的频率,而通过 络信 观看高清视频时,则对带宽需求较大。DDR则需要提高工作频率。由此可见,SOC需要根据系统的运行情况动态调整DDR的总线工作频,以提高CPU工作效率,并降低系统在运行状态的功耗,达到性能功耗的平衡。

二、BUS DCVS

什么是BUS DCVSp>

BUS DCVS,其 Bus Dynamic Clock and Voltage Scaling 的缩写,它是一种总线频率选择的算法,用于在动态的工作负载间选择最佳的频率点,以满足性能和功耗的平衡。

先来看看现代SOC架构,对于DDR这个slave而言,其对应的master会很多,例如 CPU,GPU,NPU,DISPLAY,CAMERA 等等。每隔一段时间各个master就会给你自己对带宽的需求,最终由RPM汇总仲裁后设定最终的DDR频率。

以上图所示架构,BUS DCVS主要是根据L2->L3,L3->system cache,System 和cache->DDR 等路径上对带宽的需求,选择最合适的频点以达到功耗和性能的平衡。

Bus DCVS 提供了2种调频策略

1. bw_hwmon (bandwidth hardwaremonitor)

基于CPU到cache 和 cache 到 DDR 的流量带宽调整cache 和 DDR的频率

2. memlat(memory latency)

基于 cache和 DDR 的 CPU 相关统计数据来调整相应频率。

三、BUS DCVS 软件架构

BUS DCVS分为3个大部分

1. User space (用户空间)

表现形式为sysfs 节点。路径为/sys/class/devfreq/soc*ddr-bw和/sys/class/devfreq/soc*ddr-lat(分别对应2种不同的策略方式)。当然还有devfreq的标准节点,min_freq/max_freq/cur_freq。用户空间的软件可以通过访问对应的文件获取当前master 对 DDR的带宽需求。如果具有某些权限,设置可以通过设置相应的参数来控制当前master 对 DDR 带宽需求的策略

2. Kernel space(内核空间)

CPU 的BUS DCVS与其他的非CPUFreq调频的外设一样,是基于devfreq 框架的一套机制。其核心为devfreq framework,设备的抽象为bimc-bwmon 和arm-memlat-mon,策略的抽象为governor bw_hwmon 和 memlat。

3. RPM OS

其主要作用是手机各个master voted的ddr 带宽,最终设定DDR的频率到LPDDR的硬件上。

四、bw_hwmon策略

1. 源码路径

a)   drivers/devfreq/devfreq_devbw.c

b)   drivers/devfreq/bimc-bwmon.c

c)   driver/devfreq/governor_bw_hwmon.c

d)   arch/arm64/boot/dts/vendor/qcom/

2. bw_hwmon软件框图

bw_hwmon策略涉及到的模块大致分为 devbw,bimc-bwmon,和devfreq framework。

a)  bimc-bwmon:其代表代表 BIMC带宽监视器的设备,可用于测量来自 BIMC 主端口的读/写流量的带宽。

b) devbw:master对ddr slave的带宽需求

c) devfreq framework:非 CPU 设备的通用动态电压和频率缩放 (DVFS) 框架bw_hwmon调频策略的触发时机

d) 根据时间片轮询查看单位时间窗口的平均带宽

e) 根据配置带宽上升下降的阈值作为触发点,一旦在单位时间内上升或者下降过快,则触发中断通知更新频率

基于上述的触发时机,bimc-bwmon收到硬件监测到的带宽信息,根据软件的计算规则,预估需要调整的带宽,将其下发至devbw匹配OPP表,将需要的频率通过RPM驱动发送到RPM core,根据多个master对带宽的需求最终决策DDR需求的频率。

3. 初始化流程

a)   bimc-bwmon驱动通过设备名”qcom,bimc-bwmon[0-4]”匹配到对应的devicetree中的硬件信息,获取中断 ,获取控制器的版本,针对不同功能的控制器进行初始化。然后调用register_bw_hwmon初始化devfreq_governor类,并赋值其函数指针get_target_freq和event_handler,最终通过devfreq_add_governor注册到devfreq framework。

b) devbw驱动通过如下设备名”qcom,devbw*”匹配到对应的devicetree中的硬件信息,初始化devbw 设备的信息dev_data类,并将其设置为driver的私有数据。设置devfreq framework结构的devfreq_dev_profile中的target 和 get_dev_status函数及polling_ms的初始值。

同时设置设备的OPP表(OPP表的代码以DTS的形式表现)。

最终通过devfreq_add_device将devbw 设备添加到devfreq framework的devfreq list链表中。此时会与devfreq governor建立两者的联系。

c) 当event_handler收到GOV_START信 以后,start_monitor 会注册中断函数,此中断就对应上升下降阈值的触发时机。如果有设置polling_ms则会queue_delayed_work 更新频率。

4. 频率调整流程

如上图所示为devfreq framework的通用的更新外设频率的流程

updatedevfreq 为核心函数,其流程如下

  1. 通过get_target_freq重新评估需要的频率

  2. 通过get_cur_freq获取当前的频率,如果实现此接口,则使用上次的频率作为当前频率

  3. 最后通过target 函数指针调用设置硬件的clock

其中get_target_freq 函数指针对应的函数就是bus dcvs的策略算法实现,此处为devfreq_bw_hwmon_get_freq,其本质就是get_bw_and_set_irq函数。

5. get_bw_and_set_irq

此策略中的变量参数比较多,但是本质上最基本的计算方式如下图所示

AB:平均需求的带宽

IB:瞬时需求的带宽

a) guard_band_mbps:基于性能的目的引入guard_band,在投票之前为measured_mbps += guard_band_mbps,为了解决带宽更新不及时导致的问题

b) decay_rate:此参数的范围为0-100,如果设置为100则不考虑历史的影响。且只有在当前测量值比上一次需求带宽小的情况才生效,用于避免频率更新后的乒乓性。

c) bw_step:类似取整的参数,用于降低更新频率的频繁性。

d) io_percent:用于计算IB,CPU的执行过程是一部分时间在访存,一部分时间在执行。相当于设定访存所占时间的百分比。

五、memlat策略

1. 源码路径

a)  drivers/devfreq/devfreq_devbw.c

b)   drivers/devfreq/arm-memlat-mon.c

c)   driver/devfreq/governor_memlat.c

d)   arch/arm64/boot/dts/vendor/qcom/

2. memlat软件架构

Gover normemlat 是对 bw_hwmon机制的补充,主要对应memory latency sensitivity的任务

memlat策略涉及到的模块大致分为 devbw,memlat-mon,和devfreq framework。

1) memlat-mon:其代表的是使用PMU来度量访存延时的设备。

2) devbw:master对ddr slave的带宽需求。

3) devfreqframework:非 CPU 设备的通用动态电压和频率缩放 (DVFS) 框架。

3. 初始化流程

a)   设备dts信息

qcom,target-dev:此设备对应的master。

qcom,cachemiss-ev:测量的缓存未命中事件。

qcom,core-dev-table:CPU核心频率到所需带宽投票的映射表。

operating-points-v2:从master到slave的带宽OPP表。

b)   arm-memlat-mon驱动通过设备名”qcom,arm-memlat*”匹配到对应的devicetree中的硬件信息,获取miss_ev_id,并对相关结构体进行初始化。然后调用register_memlat初始化devfreq_governor类,并赋值其函数指针get_target_freq和event_handler,最终通过devfreq_add_governor注册到devfreq framework。

c) 同bw_hwmon策略一样,event_handle 收到GOV_START信 以后,调用start_hwmon对相关的events进行初始化,同时启动delayed work更新频率。

4. 频率调整流程

此策略的因子比较简单。在每次的时间周期内,统计PM Uevent获取的instructions count 和 L2miss rate,只有当inst / miss 小于ratioceil的时候才会触发更新频率。最终将需求的带宽频率调用devfreq_bw的set_bw函数设置到硬件。

六、总结

随着各大厂商对芯片性能功耗的极致优化,对于一些cpu stall的场景可以通过BUS DCVS更精细化的优化进行改善。最后祝愿各位在技术的道路上越走越远。

参考:

https://android.googlesource.com/kernel/msm

https://android.googlesource.com/kernel/msm-extra/devicetree/

https://blog.csdn.net/feelabclihu/article/details/105592301

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92471 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月9日
下一篇 2022年2月9日

相关推荐