裝置電源管理資料型別

struct dev_pm_ops

裝置 PM 回撥。

定義:

struct dev_pm_ops {
    int (*prepare)(struct device *dev);
    void (*complete)(struct device *dev);
    int (*suspend)(struct device *dev);
    int (*resume)(struct device *dev);
    int (*freeze)(struct device *dev);
    int (*thaw)(struct device *dev);
    int (*poweroff)(struct device *dev);
    int (*restore)(struct device *dev);
    int (*suspend_late)(struct device *dev);
    int (*resume_early)(struct device *dev);
    int (*freeze_late)(struct device *dev);
    int (*thaw_early)(struct device *dev);
    int (*poweroff_late)(struct device *dev);
    int (*restore_early)(struct device *dev);
    int (*suspend_noirq)(struct device *dev);
    int (*resume_noirq)(struct device *dev);
    int (*freeze_noirq)(struct device *dev);
    int (*thaw_noirq)(struct device *dev);
    int (*poweroff_noirq)(struct device *dev);
    int (*restore_noirq)(struct device *dev);
    int (*runtime_suspend)(struct device *dev);
    int (*runtime_resume)(struct device *dev);
    int (*runtime_idle)(struct device *dev);
};

成員

prepare

此回撥的主要作用是阻止裝置的新的子裝置在其返回後被註冊(驅動程式的子系統以及通常核心的其餘部分應該阻止新的 probe 方法呼叫在 prepare() 成功後被執行)。如果 prepare() 檢測到它無法處理的情況(例如,已在進行的子裝置的註冊),它可以返回 -EAGAIN,以便 PM 核心可以再次執行它(例如,在新子設備註冊後),以從競爭條件中恢復。此方法針對所有型別的掛起轉換執行,並且緊跟著其中一個掛起回撥:suspend()freeze()poweroff()。如果轉換是掛起到記憶體或待機狀態(即,與休眠無關),則 prepare() 的返回值可用於指示 PM 核心,如果適用,將裝置留在執行時掛起狀態。即,如果 prepare() 返回一個正數,則 PM 核心將理解為宣告該裝置似乎已執行時掛起,並且如果其所有後代也處於執行時掛起狀態,則可以在整個轉換和隨後的恢復期間將其保持在該狀態。如果發生這種情況,complete() 將在 prepare() 之後直接執行,並且必須確保裝置在系統恢復後的正常執行。PM 核心在開始為任何裝置呼叫掛起回撥之前,為所有裝置執行子系統級別 prepare(),因此通常可以假設裝置是功能正常的,或者在執行 prepare() 時響應執行時恢復請求。但是,裝置驅動程式不得假設此時使用者空間是否可用,並且從 prepare() 中請求韌體是無效的(這樣做為時已晚)。從 GFP_KERNEL 模式下的 prepare() 中分配大量記憶體也是無效的。[要解決這些限制,驅動程式可以註冊在任務凍結之前執行的掛起和休眠通知程式。]

complete

撤消 prepare() 所做的更改。此方法在所有型別的恢復轉換中執行,緊跟其中一個恢復回撥:resume()thaw()restore()。如果在驅動程式的掛起回撥:suspend()freeze()poweroff() 可以執行之前,狀態轉換失敗(例如,如果掛起回撥對 PM 核心之前嘗試掛起的其他裝置之一失敗),也會呼叫此方法。PM 核心在為所有裝置執行適當的恢復回撥後,執行子系統級別 complete()。如果掛起轉換開始時對應的 prepare() 返回一個正數,並且裝置處於執行時掛起狀態(沒有為其執行任何掛起和恢復回撥),則 complete() 將是在恢復期間為裝置執行的唯一回調。在這種情況下,complete() 必須準備好執行任何必要的步驟,以確保裝置在系統恢復後正常執行。為此,complete() 可以檢查裝置的 power.direct_complete 標誌,以瞭解是否已(未設定)或未(已設定)為其執行先前的掛起和恢復回撥。

suspend

在將系統置於保留主儲存器內容的睡眠狀態之前執行。要執行的確切操作取決於裝置的子系統(PM 域、裝置型別、類或匯流排型別),但通常裝置在子系統級別 suspend() 返回後必須處於靜止狀態,因此它不會執行任何 I/O 或 DMA。在為所有裝置呼叫子系統級別 prepare() 之後,為所有裝置執行子系統級別 suspend()

resume

在系統從保留主儲存器內容的睡眠狀態喚醒後執行。要執行的確切操作取決於裝置的子系統,但通常驅動程式應再次開始工作,響應硬體事件和軟體請求(裝置本身可以保持在低功耗狀態,等待執行時恢復發生)。執行其驅動程式的 resume() 回撥時,裝置的狀態取決於平臺和裝置所屬的子系統。在大多數平臺上,在 resume() 期間,對時鐘等資源的可用性沒有限制。在為所有裝置呼叫子系統級別 resume_noirq() 之後,為所有裝置執行子系統級別 resume()

freeze

特定於休眠,在建立休眠映像之前執行。類似於 suspend(),但它不應使裝置能夠發出喚醒事件或更改其電源狀態。大多數子系統(PCI 匯流排型別是值得注意的例外)希望驅動程式級別 freeze() 將裝置設定儲存在記憶體中,以供 restore() 在隨後的從休眠恢復期間使用。在為所有裝置呼叫子系統級別 prepare() 之後,為所有裝置執行子系統級別 freeze()

thaw

特定於休眠,在建立休眠映像之後或者如果映像建立失敗時執行。在嘗試從這樣的映像恢復主儲存器的內容失敗後也會執行。撤消先前的 freeze() 所做的更改,以便裝置可以像在呼叫 freeze() 之前立即一樣執行。在為所有裝置呼叫子系統級別 thaw_noirq() 之後,為所有裝置執行子系統級別 thaw()。在轉換錯誤的情況下,它也可以在 freeze() 之後直接執行。

poweroff

特定於休眠,在儲存休眠映像後執行。類似於 suspend(),但它不需要將裝置的設定儲存在記憶體中。在為所有裝置呼叫子系統級別 prepare() 之後,為所有裝置執行子系統級別 poweroff()

restore

特定於休眠,在從休眠映像恢復主儲存器的內容後執行,類似於 resume()

suspend_late

繼續由 suspend() 啟動的操作。對於許多裝置,suspend_late() 可能會指向與執行時掛起回撥相同的回撥例程。

resume_early

準備執行 resume()。對於許多裝置,resume_early() 可能會指向與執行時恢復回撥相同的回撥例程。

freeze_late

繼續由 freeze() 啟動的操作。類似於 suspend_late(),但它不應使裝置能夠發出喚醒事件或更改其電源狀態。

thaw_early

準備執行 thaw()。撤消先前的 freeze_late() 所做的更改。

poweroff_late

繼續由 poweroff() 啟動的操作。類似於 suspend_late(),但它不需要將裝置的設定儲存在記憶體中。

restore_early

準備執行 restore(),類似於 resume_early()

suspend_noirq

完成由 suspend() 啟動的操作。執行掛起裝置可能與其驅動程式的 interrupts 處理程式競爭所需的任何其他操作,保證在執行 suspend_noirq() 時不會執行 interrupts 處理程式。通常,在子系統級別 suspend_noirq() 成功返回後,預計裝置將處於低功耗狀態(適用於目標系統睡眠狀態)。如果裝置可以生成系統喚醒訊號並且已啟用喚醒系統,則應在該時間配置為這樣做。但是,根據平臺和裝置的子系統,suspend()suspend_late() 可能允許將裝置置於低功耗狀態,並將其配置為生成喚醒訊號,在這種情況下,通常不需要定義 suspend_noirq()

resume_noirq

準備執行 resume(),方法是執行恢復裝置可能與其驅動程式的 interrupts 處理程式競爭所需的任何操作,保證在執行 resume_noirq() 時不會執行 interrupts 處理程式。

freeze_noirq

完成由 freeze() 啟動的操作。執行凍結裝置可能與其驅動程式的 interrupts 處理程式競爭所需的任何其他操作,保證在執行 freeze_noirq() 時不會執行 interrupts 處理程式。裝置的電源狀態不應被 freeze()freeze_late()freeze_noirq() 更改,並且不應透過任何這些回撥配置為發出系統喚醒訊號。

thaw_noirq

準備執行 thaw(),方法是執行解凍裝置可能與其驅動程式的 interrupts 處理程式競爭所需的任何操作,保證在執行 thaw_noirq() 時不會執行 interrupts 處理程式。

poweroff_noirq

完成由 poweroff() 啟動的操作。類似於 suspend_noirq(),但它不需要將裝置的設定儲存在記憶體中。

restore_noirq

準備執行 restore(),方法是執行解凍裝置可能與其驅動程式的 interrupts 處理程式競爭所需的任何操作,保證在執行 restore_noirq() 時不會執行 interrupts 處理程式。類似於 resume_noirq()

runtime_suspend

由於電源管理,準備裝置處於無法與 CPU 和 RAM 通訊的狀態。這不一定意味著應將裝置置於低功耗狀態。例如,如果裝置位於即將關閉的連結之後,則裝置可能保持全功率狀態。如果裝置確實進入低功耗狀態並且能夠生成執行時喚醒事件,則應為其啟用遠端喚醒(即,允許裝置透過中斷請求更改其電源狀態的硬體機制)。

runtime_resume

響應硬體生成的喚醒事件或軟體的請求,將裝置置於完全活動狀態。如果需要,將裝置置於全功率狀態並恢復其暫存器,使其完全執行。

runtime_idle

裝置似乎不活動,如果滿足所有必要條件,則可能將其置於低功耗狀態。檢查這些條件,如果允許 PM 核心為裝置排隊掛起請求,則返回 0。

描述

幾個裝置電源狀態轉換在外部可見,影響掛起的 I/O 佇列的狀態,以及(對於接觸硬體的驅動程式)interrupts、喚醒、DMA 和其他硬體狀態。也可能存在到驅動程式堆疊的其餘部分透明的各種低功耗模式的內部轉換(例如,關閉未主動使用的時鐘的驅動程式)。

外部可見的轉換是在此結構中包含的回撥的幫助下處理的,通常涉及兩個級別的回撥。首先,PM 核心執行 PM 域、裝置型別、類和匯流排型別提供的回撥。它們是子系統級別的回撥,預計會執行裝置驅動程式提供的回撥,儘管它們可以選擇不這樣做。如果驅動程式回撥被執行,它們必須與子系統級別的回撥協作,以實現適合給定系統轉換的目標,給定轉換階段和裝置所屬的子系統。

除了 complete() 之外,所有上述回撥都返回錯誤程式碼。但是,由 resume()thaw()restore()resume_noirq()thaw_noirq()restore_noirq() 返回的錯誤程式碼不會導致 PM 核心中止返回它們的恢復轉換。在這些情況下返回的錯誤程式碼僅列印到系統日誌以進行除錯。儘管如此,建議驅動程式僅在不可恢復的故障情況下(即,當正在處理的裝置拒絕恢復並變得不可用時)從其恢復方法返回錯誤程式碼,以允許將來修改 PM 核心,使其可以避免嘗試處理未能恢復的裝置及其子裝置。

允許在執行上述回撥時登出裝置。但是,回撥例程不得嘗試登出為其呼叫的裝置,儘管它可以登出該裝置的子裝置(例如,如果它檢測到系統處於睡眠狀態時子裝置已拔下)。

還有與裝置的執行時電源管理相關的回撥。同樣,按照慣例,這些回撥由 PM 核心為子系統(PM 域、裝置型別、類和匯流排型別)執行,並且子系統級別的回撥預計會呼叫驅動程式回撥。此外,裝置驅動程式的回撥要執行的確切操作通常取決於平臺和裝置所屬的子系統。

有關 runtime_suspend()runtime_resume()runtime_idle() 回撥在裝置執行時電源管理中的作用的更多資訊,請參閱I/O 裝置的執行時電源管理框架

struct dev_pm_domain

電源管理域表示。

定義:

struct dev_pm_domain {
    struct dev_pm_ops       ops;
    int (*start)(struct device *dev);
    void (*detach)(struct device *dev, bool power_off);
    int (*activate)(struct device *dev);
    void (*sync)(struct device *dev);
    void (*dismiss)(struct device *dev);
    int (*set_performance_state)(struct device *dev, unsigned int state);
};

成員

ops

與此域關聯的電源管理操作。

start

當用戶需要透過域啟動裝置時呼叫。

detach

從域中刪除裝置時呼叫。

activate

在為匯流排型別和驅動程式執行 probe 例程之前呼叫。

sync

在成功的驅動程式 probe 後呼叫。

dismiss

在不成功的驅動程式 probe 後以及驅動程式刪除後呼叫。

set_performance_state

呼叫以請求新的效能狀態。

描述

電源域提供在系統掛起、休眠、系統恢復期間以及執行時 PM 轉換期間執行的回撥,而不是子系統級別和驅動程式級別的回撥。