Operating Performance Points(性能操作點)

文章標題翻譯可能不是很準確,但是還是比較靠近本質意思。

opp全名Operating Performance Points。可參考linux官方文檔:linux/Documentation/power/opp.txt。

1、介紹

1.1、什麼是性能操作點?

    現如今功能複雜的soc是由很多子功能模塊協作組成的。在執行各種用例的操作系統中,在SOC中,並不是所有的模塊都需要一直工作在最高頻率。爲了解決這中場景,SOC中的子模塊被分組到不同的域中。允許一些域運行在低電壓低頻率環境下,與此同時,另一些域運行在高電壓高頻率的環境下。

    這些由頻率、電壓配對組,構成的離散元素數組(用以支持不同的環境域)的集合,被稱作性能操作點(OPP)。

例如:

假設MPU設備支持,在最小1伏特的電壓下可以運行300MHZ,在最小1.2伏特的電壓下可以運行800MHZ,在最小1.3伏特的電壓下可以運行1GHZ。其對應的離線元素數組,

{HZ            ,uV         }

{300000000, 1000000}

{800000000, 1200000}

{1000000000, 1300000}

1.2、性能操作點庫

    OPP庫提供了一系列幫助函數,用於管理和獲取性能操作點的信息。該庫位於linux源碼目錄drivers/base/power/opp.c。

    opp庫可以通過開啓CONFIG_PM_OPP配置菜單項來使能。opp庫的典型用法如下:

    註冊一系列默認opps清單或接口——》修改指定用例的opps——》搜索獲取Opps信息。

    opp這一抽象層,期望每一個域都由特定的設備指針呈現出來。soc框架層,通過opp軟件層註冊一系列初始化的每個設備的opps清單。這份清單(操作點集合數組),期望每個設備有至少5個最優的典型值組合。這份初始化清單包含一系列opps,框架層期望默認被安全地使能的opps。

    opp可用性說明

    系統操作過程中,soc框架會根據每個設備在外部因素的影響下,選擇控制某個設備的opps可用或不可用。

    例如:溫度管理時或者其他外部場景,soc框架可能會選擇關閉高頻率的對應的Opp數組頻率、電壓對,保證能繼續安全地執行,直到被關閉的opp可以被再次打開。

2、初始opp清單註冊

    soc實現的名爲dev_pm_opp_add的函數會遍歷每個設備添加opps。soc框架預計會註冊少於5個最優的Opps條目的典型值。通過註冊OPP生成的列表由OPP庫在整個設備操作中維護。soc框架層接着就可以通過接口dev_pm_opp_enable和dev_pm_opp_disable動態地控制opp的可用性。

    添加opp

    使用接口dev_pm_opp_add增加一個新的opp,用於設備指針代表的特定的域。一旦添加成功,該opp就可以被控制其可用性。

    提示:該接口慎用於中斷上下文。

3、opp搜索功能

    高層級的框架層,例如cpufreq,操作頻率。爲了找到頻率對應到opp的元素,opp庫提供了處理函數,用於搜索opp庫中內部管理的清單列表。如果找到匹配值,就返回opp對應元素的指針。如果使用過了這個OPP,那麼應該調用dev_pm_opp_put函數接口,釋放它。不然該opp獲取的內存得不到釋放,而產生內存泄露的風險。

    查找指定的頻率,並使能該頻率的一段代碼用法示例:

opp = dev_pm_opp_find_freq_exact(dev, 1000000000, false);
         dev_pm_opp_put(opp);
         /* dont operate on the pointer.. just do a sanity check.. */
         if (IS_ERR(opp)) {
                pr_err("frequency not disabled!\n");
                /* trigger appropriate actions.. */
         } else {
                dev_pm_opp_enable(dev,1000000000);
         }

4、opp可用性控制功能

    在OPP庫中註冊的默認OPP列表可能無法滿足所有可能的情況。opp庫提供了一組函數用於調整opp清單中的Opp。這使SoC框架可以對可操作使用的OPP集進行精細的動態控制。

5、opp數據檢索功能

    由於opp庫提取了opp信息,那麼一組用於更新獲取opp結構體中的信息顯得很有必要。一旦搜索函數獲取到了opp的指針,下列函數就可以被soc框架層用於獲取opp層提供的opp信息。

    dev_pm_opp_get_voltage —— 獲取opp指針提供的電壓。

    dev_pm_opp_get_freq —— 獲取頻率。

    dev_pm_opp_get_opp_count —— 獲取設備的Opp條目數。

6、數據結構

    經典的soc包含了很多有效可用的電壓域。每個域都由設備指針提供呢呈現。這其中的對應關係可以看下圖:

SoC

 |- device 1

 |      |- opp 1 (availability, freq, voltage)

 |      |- opp 2 ..

 ...    ...

 |      `- opp n ..

 |- device 2

 ...

 `- device m

    上圖指示了設備1有opp1和opp2等條目,每個opp都有自己的頻率、電壓對值。soc包含了設備1、設備2......設備m。

opp庫維護了組成soc框架的內部opp鏈表結構。但是,代表實際OPP和域的結構是OPP庫本身的內部結構,以允許在系統之間可重用的適當抽象。

struct dev_pm_opp opp庫的內部數據結構,用於表示Opp
struct device 用於opp層識別一個域

    總而言之,用一個簡圖描述數據結構體的操作,

Initialization / modification:

           +-----+           /- dev_pm_opp_enable

dev_pm_opp_add --> | opp | <-------

  |        +-----+           \- dev_pm_opp_disable

  \-------> domain_info(device)

 

Search functions:

                   /-- dev_pm_opp_find_freq_ceil  ---\   +-----+

domain_info<---- dev_pm_opp_find_freq_exact -----> | opp |

                   \-- dev_pm_opp_find_freq_floor ---/   +-----+

 

Retrieval functions:

+-----+   /- dev_pm_opp_get_voltage

| opp | <---

+-----+   \- dev_pm_opp_get_freq

 

domain_info <- dev_pm_opp_get_opp_count

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章