OMAP PM 介面¶
本文件描述了臨時的 OMAP PM 介面。驅動程式開發者使用這些函式將最小延遲或吞吐量限制通知給核心電源管理程式碼。隨著時間的推移,其目標是將 OMAP PM 介面的功能合併到 Linux PM QoS 程式碼中。
驅動程式需要表達 PM 引數,這些引數需滿足以下條件:
支援 TI SRF 中存在的電源管理引數範圍;
將驅動程式與底層的 PM 引數實現分離,無論是 TI SRF、Linux PM QoS、Linux 延遲框架還是其他;
以基本單位(如延遲和吞吐量)來指定 PM 引數,而不是特定於 OMAP 或特定 OMAP 變體的單位;
允許與其他架構(例如 DaVinci)共享的驅動程式以不影響非 OMAP 系統的方式新增這些限制,
可以立即實現,同時對其他架構的干擾最小。
本文件提出了 OMAP PM 介面,包括以下五個用於驅動程式碼的電源管理函式:
設定最大 MPU 喚醒延遲
(*pdata->set_max_mpu_wakeup_lat)(struct device *dev, unsigned long t)
設定最大裝置喚醒延遲
(*pdata->set_max_dev_wakeup_lat)(struct device *dev, unsigned long t)
設定最大系統 DMA 傳輸啟動延遲 (CORE pwrdm)
(*pdata->set_max_sdma_lat)(struct device *dev, long t)
設定裝置所需的最小匯流排吞吐量
(*pdata->set_min_bus_tput)(struct device *dev, u8 agent_id, unsigned long r)
返回裝置丟失上下文的次數
(*pdata->get_dev_context_loss_count)(struct device *dev)
所有 OMAP PM 介面函式的進一步文件可在 arch/arm/plat-omap/include/mach/omap-pm.h 中找到。
OMAP PM 層旨在是臨時的¶
其目的是最終 Linux PM QoS 層應支援 OMAP3 中存在的電源管理功能範圍。隨著這種情況的發生,使用 OMAP PM 介面的現有驅動程式可以修改為使用 Linux PM QoS 程式碼;OMAP PM 介面也就可以取消了。
驅動程式使用 OMAP PM 函式¶
如上述示例中的“pdata”所示,這些函式透過驅動程式 .platform_data 結構中的函式指標暴露給驅動程式。board-*.c 檔案初始化這些函式指標以指向相應的 OMAP PM 函式
set_max_dev_wakeup_lat 將指向 omap_pm_set_max_dev_wakeup_lat() 等。其他不支援這些函式的架構應將這些函式指標設定為 NULL。驅動程式應使用以下慣用法
if (pdata->set_max_dev_wakeup_lat) (*pdata->set_max_dev_wakeup_lat)(dev, t);
這些函式最常見的用法可能是指定從中斷髮生到裝置變得可訪問的最大時間。為此,驅動程式編寫者應使用 set_max_mpu_wakeup_lat() 函式來限制 MPU 喚醒延遲,並使用 set_max_dev_wakeup_lat() 函式來限制裝置喚醒延遲(從 clk_enable() 到可訪問性)。例如
/* Limit MPU wakeup latency */
if (pdata->set_max_mpu_wakeup_lat)
(*pdata->set_max_mpu_wakeup_lat)(dev, tc);
/* Limit device powerdomain wakeup latency */
if (pdata->set_max_dev_wakeup_lat)
(*pdata->set_max_dev_wakeup_lat)(dev, td);
/* total wakeup latency in this example: (tc + td) */
PM 引數可以透過使用新值再次呼叫該函式來覆蓋。透過以引數 t 為 -1 呼叫該函式可以移除設定(set_max_bus_tput() 除外,該函式應以引數 r 為 0 呼叫)。
上述第五個函式 omap_pm_get_dev_context_loss_count() 旨在作為一種最佳化,允許驅動程式確定裝置是否已丟失其內部上下文。如果上下文已丟失,驅動程式必須在繼續之前恢復其內部上下文。
其他專用介面函式¶
上述列出的五個函式旨在供任何裝置驅動程式使用。DSPBridge 和 CPUFreq 有一些特殊要求。DSPBridge 以 OPP ID 的形式表示目標 DSP 效能級別。CPUFreq 以 MPU 頻率的形式表示目標 MPU 效能級別。OMAP PM 介面包含用於這些特殊情況的函式,以將輸入資訊(OPPs/MPU 頻率)轉換為底層電源管理實現所需的格式
(*pdata->dsp_get_opp_table)(void)
(*pdata->dsp_set_min_opp)(u8 opp_id)
(*pdata->dsp_get_opp)(void)
(*pdata->cpu_get_freq_table)(void)
(*pdata->cpu_set_freq)(unsigned long f)
(*pdata->cpu_get_freq)(void)
為平臺定製 OPP¶
定義 CONFIG_PM 應該會為晶片啟用 OPP 層,並且 OPP 表的註冊應該會自動進行。然而,在特殊情況下,可能需要調整預設的 OPP 表,例如:
啟用預設情況下停用但在平臺上可以啟用的預設 OPP
在平臺上停用不支援的 OPP
在這些情況下,定義並新增自定義 OPP 表條目,板級檔案需要執行以下額外步驟:
arch/arm/mach-omapx/board-xyz.c
#include "pm.h"
....
static void __init omap_xyz_init_irq(void)
{
....
/* Initialize the default table */
omapx_opp_init();
/* Do customization to the defaults */
....
}
- 注意
omapx_opp_init 將是 omap3_opp_init 或根據 OMAP 系列要求而定。