使用 GUID_D3COLD_SUPPORT_INTERFACE 驅動程式介面

從Windows 8開始,驅動程式可以呼叫 GUID_D3COLD_SUPPORT_INTERFACE 介面中的常式,以判斷裝置的 D3cold 功能,並讓這些裝置能夠使用 D3cold。 此介面中的兩個主要常式為 SetD3ColdSupportGetIdleWakeInfo

GUID_D3COLD_SUPPORT_INTERFACE驅動程式介面支援 D3 裝置電源狀態的 D3cold 子版本。 D3 分成兩個子狀態:D3hot 和 D3cold。 D3 是最低電源的裝置電源狀態,而 D3cold 使用小於 D3hot 的電源。 只有在裝置、父匯流排驅動程式和平臺韌體支援此狀態時,裝置才能進入 D3cold。 當電腦處於 S0 (運作) 系統電源狀態時,支援 D3cold 的裝置可以進入並結束此狀態。

此驅動程式是電源原則擁有者 (PPO) ,裝置會呼叫此介面中的常式來執行下列動作:

  • 探索裝置、父匯流排驅動程式和平臺韌體是否支援轉換為 D3cold 子狀態。
  • 探索當裝置位於 D3cold 子狀態時,裝置是否可以向處理器發出喚醒事件訊號。
  • 啟用和停用裝置轉換為 D3cold 子系結。

若要查詢此介面,設備磁碟機會將IRP_MN_QUERY_INTERFACE IRP 傳送至驅動程式堆疊。 針對此 IRP,驅動程式會將 InterfaceType 輸入參數設定為 GUID_D3COLD_SUPPORT_INTERFACE。 成功完成 IRP 時,介面輸出參數是D3COLD_SUPPORT_INTERFACE結構的指標。 這個結構包含 介面中常式的指標。

如需 D3cold 裝置電源狀態的詳細資訊,請參閱 驅動程式中的支援 D3cold

驅動程式會呼叫 SetD3ColdSupport 常式,以動態啟用和停用裝置轉換至 D3cold,當電腦位於 S0 時可能發生。 如果裝置必須能夠發出來自裝置輸入之任何低電源 Dx 狀態的喚醒事件訊號,則只有在裝置可以發出來自 D3cold 的喚醒事件訊號時,驅動程式才應該讓裝置進入 D3cold。 否則,在裝置進入 D3cold 之後,電腦可能會無法使用,直到電腦離開 S0 狀態為止。

根據預設,在第一次呼叫 SetD3ColdSupport 常式之前,會停用 D3hot-to-D3cold 轉換。 若要變更此預設值,以便在第一次 SetD3ColdSupport 呼叫之前啟用 D3hot-to-D3cold 轉換,裝置的驅動程式套件可以在安裝驅動程式的 INF 檔案的 DDInstall.HW 區段中包含下列兩行:

Include = machine.inf
Needs = PciD3ColdSupported

GetIdleWakeInfo常式可讓裝置的驅動程式探索裝置電源狀態,當電腦處於特定系統電源狀態時,裝置可以從中發出喚醒事件訊號。 此常式的呼叫端會將系統電源狀態指定為輸入參數,而作為輸出參數,常式會報告裝置在電腦處於指定系統電源狀態時可發出等候事件的最低電源狀態。 例如, GetIdleWakeInfo 常式可以告訴驅動程式,當電腦位於 S0 時,裝置是否可以從 D3cold 發出喚醒事件。

GetIdleWakeInfo常式提供比從IRP_MN_QUERY_CAPABILITIES要求取得更完整的裝置喚醒資訊。 此要求會提供所有 Windows 支援版本的 DEVICE_CAPABILITIES 結構,以描述裝置的功能。 這個結構的 DeviceWake 成員包含 GetIdleWakeInfo 常式中可用的資訊子集。 此成員指出裝置可以發出等候事件訊號的最低電源狀態。 只有在電腦處於結構的 SystemWake 成員所表示的系統低電源狀態時,這個成員中的資訊才保證正確。 如果SystemWake = PowerSystemSleeping3DeviceWake中的資訊已知對 S3 有效,通常適用于 S1 和 S2,甚至可能適用于 S0。

不過,最佳做法是,驅動程式不應該假設 DeviceWake 方法中的資訊對於 SystemWake所指示狀態以外的任何系統電源狀態都是有效的。 對於某些裝置,裝置可以發出喚醒事件訊號的最低 Dx 狀態會根據電腦處於工作狀態 S0 或處於低電源狀態 (S1、S2、S3 或 S4) 而有所不同。 對於其他裝置,當電腦位於 S0 時,裝置所連接的匯流排可以處理喚醒訊號,但裝置無法。 只有 GetIdleWakeInfo 常式可以精確地描述這些裝置的裝置喚醒功能。

例如, PCI Express Base 3.0 規格 會定義兩個不同的機制來發出喚醒事件訊號,其中一種機制是在開啟 PCI Express 連結 (匯流排) 時使用,另一種是在關閉連結時使用。 開啟連結時,裝置會將PM_PME交易層封包的資料流程傳送 (TLP) ,以表示裝置應該從低電源 Dx 狀態移至 D0。 關閉連結時,裝置會要求開啟連結,讓裝置可以傳送PM_PME TLP。 若要要求開啟連結,裝置會針對較常見的裝置尺寸) 判斷其 WAKE# 訊號 (,或使用較不常見的) (指標機制。

PCI Express 規格要求所有公告能夠發出電源管理事件 (D3cold) 的裝置實作這兩種裝置喚醒機制,但驅動程式開發人員可能需要啟用未正確實作這些機制的裝置。

如果裝置可以在開啟連結時正確傳遞PM_PME TLP,驅動程式可以在電腦處於 S0 時啟用裝置輸入 D3hot。 如果裝置可以正確判斷其 WAKE# 訊號來開啟連結,然後使用 PM_PME TLP 起始轉換至 D0,驅動程式可以在電腦處於 S0 時啟用裝置輸入 D3cold。

不過,如果系統韌體 (BIOS) 無法保證 PCI Express 裝置喚醒機制是由硬體平臺正確處理,則驅動程式不應讓裝置進入 D3hot 或 D3cold。 驅動程式可以呼叫 GetIdleWakeInfo 常式,以探索這些機制的韌體宣告是否支援。 如果驅動程式使用 Kernel-Mode Driver Framework (KMDF) 1.11 或更新版本,呼叫 GetIdleWakeInfo 的便利替代方式是允許 WdfDeviceAssignS0IdleSettings 方法讓裝置閒置在裝置可以發出喚醒事件的最低電源 Dx 狀態。