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 DCVS?

BUS DCVS,其 Bus Dynamic Clock and Voltage Scaling 的縮寫,它是一種總線頻率選擇的算法,用於在動態的工作負載間選擇最佳的頻率點,以滿足性能和功耗的平衡。

先來看看現代 SOC 架構,對於 DDR 這個 slave 而言,其對應的 master 會很多,例如 CPU,GPU,NPU,DISPLAY,CAMERA 等等。每隔一段時間各個 master 就會給你自己對帶寬的需求,最終由 RPM 彙總仲裁後設定最終的 DDR 頻率。

本文主要介紹主流平臺 CPU 的 BUS DCVS 策略

以上圖所示架構,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/socddr-bw 和 / sys/class/devfreq/socddr-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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/zUPcVOyP6mCtTMub5imf1w