從 Windows 10 版本 1903 開始,第三版的運行時電源管理架構(PoFx)提供選擇性的指導型電源模型,指導型 PoFx(DFx)。
使用 DFx 時,作業系統會指示裝置堆疊在系統轉換為閑置時進入其適當的低功率閑置狀態,如果沒有 啟動器代理的軟體活動,這樣可使系統更可靠地進入低功率模式。
目標是讓系統更具電源效率,並降低不同尺寸的 Windows 裝置的能耗。
DFx 目前僅支援具有 D 狀態條件限制的裝置。 DFx 會略過任何具有 F 狀態條件約束的裝置子樹。
DFx 不會關機分頁或偵錯裝置。
WDF(非迷你埠)驅動程式的需求
作為 Power Policy 擁有者的 WDF 驅動程式必須透過在 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構中指定 SystemManagedIdleTimeout 或 SystemManagedIdleTimeoutWithHint,來實現適當的 S0-Idle 策略。 這可讓裝置在閑置時關閉電源。 作為增加電力韌性的措施,驅動程式可以選擇啟用 DFx。 如果它是一個 D 狀態約束,且在系統進入低功率的新式待命狀態時尚未關閉電源,電源子系統可能會指示 WDF 關閉該裝置的電源。 當電源子系統指示 WDF 關閉裝置電源時,WDF 會起始轉換為低功率 Dx 狀態的轉換。 這在概念上類似於WDF如何關閉裝置,以響應系統電源轉換至Sx(其中 x > 0)。 當裝置被 PoFx 指示關閉電源時,受電源管理的 IO 要求或呼叫 WdfDeviceStopIdle 都不會使裝置恢復為已開電源的 D0 狀態。 如需詳細資訊,請參閱 WdfDeviceStopIdle。
驅動程式可以選擇透過在 INF 的 AddReg 指令區段 中,於 DDInstall.HW 區段新增以下登錄機碼來加入:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1
以 31 版和更新版本為目標的 WDF 驅動程式預設會啟用 DFx。 如果不想使用此功能,驅動程式可以將登錄機碼設定為0,以退出DFx。
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0
以第 33 版和更新版本為目標的 WDF 驅動程式也可以藉由將 WDF_POWER_FRAMEWORK_SETTINGS 結構的 DirectedPoFxEnabled 成員設定為 WdfFalse,以退出 DFx。
小提示
若要初始化其 WDF_POWER_FRAMEWORK_SETTINGS 結構,您的驅動程式應該呼叫 WDF_POWER_FRAMEWORK_SETTINGS_INIT。
由於要求系統管理的閒置逾時會導致 WDF 代表驅動程式向 PoFx 註冊,因此在這種情況下,驅動程式不需要向 PoFx 註冊。
如果驅動程式指定 DriverManagedIdleTimeout,請考慮切換至系統管理的閑置逾時。 如果這不可行,請使用下列 WDM 區段中的指導方針來選擇加入 DFx。
如果WDF驅動程式不使用運行時間電源管理,請新增其支援,並使用系統管理的閑置逾時。 若要執行此操作,請提供 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構做為 WdfDeviceAssignS0IdleSettings的輸入。
WDM (非迷你埠) 驅動程式的需求
如果您的驅動程式未使用 WDF 提供的系統管理閒置支援功能(無論是 驅動程式管理的閒置的 WDF 驅動程式,或者是 WDM 驅動程式),它仍然可以透過向 PoFx 註冊來獲得 DFx 支援。 在此案例中,驅動程式會藉由實作下列方式向PoFx註冊:
在 PO_FX_DEVICE_V3 結構體中提供這些回呼的指標,這個結構體會被輸入到 PoFxRegisterDevice 函數。
若要取得 DFx 支援,驅動程式必須:
- 註冊 PoFx 時提供
PO_FX_DIRECTED_POWER*回呼函數 - 從閒置狀態返回時,在 PO_FX_DIRECTED_POWER_UP_CALLBACK 回呼函式中呼叫 PoFxReportDevicePoweredOn。 如果這是 WDF 驅動程式,它可以設定旗標,然後在 EvtDeviceD0Entry中檢查旗標並呼叫 PoFxReportDevicePoweredOn。
- 從 Sx 階段過渡恢復時,呼叫 PoFxReportDevicePoweredOn。 如果這是 WDF 驅動程式,則必須對 IRP_MN_SET_POWER 進行前置處理。 只有在滿足
Parameters.Power.Type == SystemPowerState條件時,前置處理回呼才應該繼續。 由於裝置可能在整個睡眠/繼續週期中保持 Dx 狀態,因此在 EvtDeviceD0Entry 中檢查旗標的上述方法將無法運作。 相反地,EvtDeviceWdmIrpPreprocess 事件回呼函數應該呼叫 IoSetCompletionRoutine,以設定 IoCompletion 例程,並在完成例程中呼叫 PoFxReportDevicePoweredOn。
範例
下列範例顯示上述的自我註冊選項:
PO_FX_DEVICE_V3 MyPoFxDevice;
POHANDLE MyPoFxHandle;
RtlZeroMemory(&MyPoFxDevice, sizeof(PO_FX_DEVICE_V3));
MyPoFxDevice.Version = PO_FX_VERSION_V3;
// Initialize other PoFx callbacks and other fields like
// components and their idle states.
MyPoFxDevice.DirectedPowerUpCallback = <Driver's DFx power up callback>
MyPoFxDevice.DirectedPowerDownCallback = <Driver's DFx power down callback>
Status = PoFxRegisterDevice(
<Driver's device object>,
(PPO_FX_DEVICE)&MyPoFxDevice,
&MyPoFxHandle);
if (!NT_SUCCESS(Status)) {
return Status;
}
如果您先前指定的驅動程式是 PO_FX_VERSION_V1,請注意,PO_FX_DEVICE_V3 結構會針對元件陣列結構使用 PO_FX_COMPONENT_V2。
迷你埠驅動程式的需求
針對遵循埠/迷你埠驅動程式模型的裝置類別,系統提供的埠驅動程式通常會負責電源政策擁有權。 大部分的迷你埠都不需要任何程式碼變更以選擇加入 DFx,因為對應的埠驅動程式預期會處理 DFx 支援。
KS.sys 第三方迷你端口的指導方針
從 Windows 10 版本 2004 開始(也稱為 20H1 或組建 19041),KS.sys 預設退出 DFx 和相關 HLK 需求。 KS.sys 的第三方迷你埠可以選擇加入 DFx 和相關的 HLK,方法是將自身註冊到 PoFx,並在 INF 中新增 KsDFxSupportEnable 登錄機碼。
驅動程式可以使用本節 中所述的實作,向 PoFx 註冊本身。 此外,下列這一行必須在 AddReg 指令 區段中新增。
HKR, , KSDFxSupportEnable, 0x00010001, 1
您可以透過裝置的 [DDInstall.HW] 區段或驅動程式的 [service-install-section] 來叫用 AddReg 區段。 將它新增至 [DDInstall.HW] 區段只會變更該特定裝置。 如果相同的驅動程式用於不同的 VID/PID 組合,但只有特定裝置才需要啟用 DFx,這非常有用。
在 [service-install-section] 中新增 AddReg 區段,啟用該驅動程式的所有裝置的 DFx 功能。
測試
Microsoft提供 DFx 的三項測試:Windows Driver Kit 中的單一裝置測試 用於測試使用者指定的裝置、裝置層級 HLK 測試,以及用於測試系統上所有裝置的系統層級 HLK 測試。
單一裝置測試是隨附於 WDK PwrTest 工具的一部分。 若要存取它,請使用 /directedfx 切換執行工具。 如需詳細資訊,請參閱 PwrTest DirectedFx 案例。
如需 HLK 測試的相關信息,請參閱下列頁面:
建議在 S4 轉換後測試 DFx,以識別驅動程式在從 S4 恢復後可能未正確呼叫 PoFxReportDevicePoweredOn 的情況。
DFx 和 S-狀態轉換
- DFx 轉換的目標 D 狀態應該符合運行時間 D3 (RTD3)的目標 D 狀態,這可能與 S3/S4 轉換的目標 D 狀態不同。 請考慮裝置針對 RTD3 輸入 D2 但針對 S3/S4 輸入 D3 的案例。 在此情況下,DFx 的目標 D 狀態應該是 D2。
- 同樣地,DFx 的喚醒預備行為應該與 RTD3 的一致,這可能與 S3/S4 轉換時使用的方法不同。 例如,裝置可能會進入針對 RTD3 的 D2/喚醒待命狀態,但進入針對 S3/S4 的 D3/無喚醒待命狀態。 在此案例中,DFx 切換也應該進入 D2/喚醒待命狀態。
DFx 和執行時 D3(RTD3)
- 使用 RTD3 時,裝置通常會在閒置時進入較低的電源 D 狀態。 如果收到新的工作,裝置會立即從睡眠狀態喚醒並進入 D0。 使用 DFx 時,裝置應該會繼續保持其目標 D 狀態(並在佇列上寫下新工作),直到 PoFx 指示它進行電源備份。