執行時電源管理

Xe PM 實現了系統級掛起狀態和機會執行時掛起狀態的主要例程。

系統級掛起(S 狀態)- 通常這是由 ACPI 驅動的作業系統發起的掛起,用於實現 S0ix(又名 S2idle、freeze)、S3(掛起到 RAM)、S4(掛起到磁碟)。這裡的主要函式是 xe_pm_suspendxe_pm_resume。它們是掛起和從這些狀態恢復的主要入口點。

PCI 裝置掛起(D 狀態)- 這是機會性的 PCIe 裝置低功耗狀態 D3,由 PCI 子系統和 ACPI 在 runtime_pm 基礎設施的幫助下控制。PCI D3 很特殊,可以表示 D3hot,其中 Vcc 電源開啟以保持記憶體活動並實現更快的低延遲恢復,或者 D3Cold,其中 Vcc 電源關閉以實現更好的節能。PCI 層次結構的 Vcc 控制只能在 PCI 根埠級別進行控制,而裝置驅動程式可能位於多個橋/交換機之後,並與其他裝置配對。因此,PCI 子系統無法執行到 D3Cold 的轉換。來自 PCI 子系統的最低執行時 PM 可能是 D3hot。然後,如果同一根埠中的所有這些配對裝置都處於 D3hot 狀態,ACPI 將在此處提供幫助並執行其自己的方法(_PR3 和 _OFF)以執行從 D3hot 到 D3cold 的轉換。Xe 可能會透過在進入執行時掛起之前呼叫 pci_d3cold_disable(root_pdev) 來阻止此轉換。這將基於執行時條件,例如 VRAM 使用情況,以便快速低延遲恢復。

執行時 PM - Linux 核心提供的此基礎設施允許裝置驅動程式指示何時可以執行時掛起,以便可以將裝置置於 D3(如果支援)或允許更深層的軟體包睡眠狀態(PC 狀態)和/或其他低級別電源狀態。Xe PM 元件提供 xe_pm_runtime_suspendxe_pm_runtime_resume 函式,PCI 子系統將在轉換到/從執行時掛起之前呼叫這些函式。

此外,Xe PM 提供了 get 和 put 函式,Xe 驅動程式將使用它們來指示活動。為了避免與記憶體管理相關的鎖定複雜性,只要有可能,這些 get 和 put 函式都需要從更高/更外層呼叫。需要從外層保護的主要情況是:IOCTL、sysfs、debugfs、dma-buf 共享、GPU 執行。

此元件不負責 GT 空閒(RC6)或 GT 頻率管理(RPS)。

內部 API

bool xe_rpm_reclaim_safe(const struct xe_device *xe)

是否可以從回收上下文中完成執行時恢復

引數

const struct xe_device *xe

xe 裝置。

返回

如果從回收上下文中執行時恢復是安全的,則返回 true。否則返回 false。

int xe_pm_suspend(struct xe_device *xe)

系統掛起的助手,即 S0->S3 / S0->S2idle

引數

struct xe_device *xe

xe 裝置例項

返回

成功時返回 0

int xe_pm_resume(struct xe_device *xe)

系統恢復的助手 S3->S0 / S2idle->S0

引數

struct xe_device *xe

xe 裝置例項

返回

成功時返回 0

int xe_pm_init(struct xe_device *xe)

初始化 Xe 電源管理

引數

struct xe_device *xe

xe 裝置例項

描述

此元件負責系統和裝置睡眠狀態。

成功時返回 0,否則返回負錯誤程式碼。

void xe_pm_fini(struct xe_device *xe)

完成 PM

引數

struct xe_device *xe

xe 裝置例項

bool xe_pm_runtime_suspended(struct xe_device *xe)

檢查 runtime_pm 狀態是否已掛起

引數

struct xe_device *xe

xe 裝置例項

描述

這不提供任何保證裝置將保持掛起狀態,因為它可能與執行時狀態轉換競爭。它只能用作不可靠的斷言,以確保我們在嘗試訪問某些記憶體時沒有處於睡眠狀態。

如果 PCI 裝置已掛起,則返回 true,否則返回 false。

int xe_pm_runtime_suspend(struct xe_device *xe)

為 D3hot/D3Cold 準備我們的裝置

引數

struct xe_device *xe

xe 裝置例項

描述

成功時返回 0,否則返回負錯誤程式碼。

int xe_pm_runtime_resume(struct xe_device *xe)

從 D3hot/D3Cold 喚醒

引數

struct xe_device *xe

xe 裝置例項

描述

成功時返回 0,否則返回負錯誤程式碼。

void xe_pm_runtime_get(struct xe_device *xe)

獲取 runtime_pm 引用並同步恢復

引數

struct xe_device *xe

xe 裝置例項

void xe_pm_runtime_put(struct xe_device *xe)

放回 runtime_pm 引用並標記為空閒

引數

struct xe_device *xe

xe 裝置例項

int xe_pm_runtime_get_ioctl(struct xe_device *xe)

在 ioctl 之前獲取 runtime_pm 引用

引數

struct xe_device *xe

xe 裝置例項

返回

任何大於或等於 0 的數字表示成功,否則為負錯誤程式碼。

bool xe_pm_runtime_get_if_active(struct xe_device *xe)

如果裝置處於活動狀態,則獲取 runtime_pm 引用

引數

struct xe_device *xe

xe 裝置例項

返回

如果裝置已喚醒(無論之前的引用數量如何)並且已獲取新引用,則為 True,否則為 False。

bool xe_pm_runtime_get_if_in_use(struct xe_device *xe)

如果裝置處於活動狀態且已獲取之前的引用,則獲取新引用

引數

struct xe_device *xe

xe 裝置例項

返回

如果裝置已喚醒,之前已獲取引用,並且現在已獲取新引用,則為 True,否則為 False。

void xe_pm_runtime_get_noresume(struct xe_device *xe)

增加執行時 PM 使用計數器而不恢復

引數

struct xe_device *xe

xe 裝置例項

描述

此函式應在內部位置使用,這些位置肯定已受到 xe_pm_runtime_get 的外部呼叫者的保護。如果未受保護,它將發出警告。無論如何,在此函式之後應放回引用,因為它總是會增加使用計數器。

bool xe_pm_runtime_resume_and_get(struct xe_device *xe)

恢復,然後如果已喚醒,則獲取 runtime_pm 引用。

引數

struct xe_device *xe

xe 裝置例項

返回

如果裝置已喚醒並且已獲取引用,則為 True,否則為 False。

void xe_pm_assert_unbounded_bridge(struct xe_device *xe)

在無界 pcie 父橋上停用 PM

引數

struct xe_device *xe

xe 裝置例項

int xe_pm_set_vram_threshold(struct xe_device *xe, u32 threshold)

設定用於允許/阻止 D3Cold 的 vram 閾值

引數

struct xe_device *xe

xe 裝置例項

u32 threshold

D3cold 閾值的 VRAM 大小(以位為單位)

描述

成功時返回 0,否則返回負錯誤程式碼。

void xe_pm_d3cold_allowed_toggle(struct xe_device *xe)

檢查切換 d3cold.allowed 的條件

引數

struct xe_device *xe

xe 裝置例項

描述

在 runtime_pm 空閒回撥期間呼叫。在執行時掛起之前檢查所有 D3Cold 條件。

int xe_pm_module_init(void)

執行 xe_pm 特定的模組初始化。

引數

void

無引數

返回

成功時返回 0。當前不會失敗。