Introdução à Estrutura de Gerenciamento de Energia Direcionada
A partir do Windows 10, versão 1903, a versão 3 da estrutura de gerenciamento de energia em tempo de execução (PoFx) fornece um modelo de energia direcionada opcional, Directed PoFx (DFx).
Com o DFx, o sistema operativo direciona as stacks de dispositivos para entrarem nos seus estados ociosos de baixo consumo quando o sistema entra em modo ocioso e não há atividade de software intermediada por ativadores, permitindo assim que o sistema entre em baixa potência de forma mais confiável.
O objetivo é tornar os sistemas mais eficientes em termos de consumo de energia e reduzir o consumo de energia dos dispositivos Windows em todos os formatos.
Atualmente, o DFx é suportado apenas para dispositivos com restrições de estado D. DFx ignora qualquer subárvore de dispositivo com uma restrição de estado F.
O DFx não desliga dispositivos de paginação ou depuração.
Requisitos para controladores WDF (não-miniporta)
Um driver WDF que é o proprietário da política de energia deve implementar uma política de S0-Idle apropriada especificando SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint na estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. Isso permitirá que o dispositivo desligue quando estiver ocioso. Como medida adicional de resiliência de potência, o condutor pode optar pelo DFx. O subsistema de alimentação pode direcionar o WDF para desligar o dispositivo se for uma restrição de estado D e ainda não tiver desligado quando o sistema entrar em um estado de espera moderno de baixa potência. Quando o subsistema de alimentação direciona o WDF para desligar o dispositivo, o WDF iniciará uma transição para um estado Dx de baixa energia. Isso é conceitualmente semelhante a como WDF pode desligar o dispositivo em resposta a uma transição de energia do sistema para Sx (onde x > 0). Quando o dispositivo for instruído a desligar pela PoFx, as solicitações de E/S geridas por energia ou uma chamada para WdfDeviceStopIdle não restaurarão o dispositivo a um estado D0 ativado. Consulte WdfDeviceStopIdle para obter mais informações.
Um driver pode ativar essa opção adicionando a seguinte chave do registro na seção de diretiva AddReg do INF na seção DDInstall.HW:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1
Um driver WDF direcionado para a versão 31 e superior habilitará o DFx por padrão. Se isso não for desejado, o driver pode desativar o DFx definindo a chave do Registro como 0:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0
Um driver WDF direcionado para a versão 33 e superior pode, alternativamente, desativar o DFx definindo o membro DirectedPoFxEnabled da estrutura WDF_POWER_FRAMEWORK_SETTINGS como WdfFalse.
Sugestão
Para inicializar a sua estrutura WDF_POWER_FRAMEWORK_SETTINGS, o driver deve invocar WDF_POWER_FRAMEWORK_SETTINGS_INIT.
Como a solicitação de tempo limite ocioso gerenciado pelo sistema faz com que o WDF se registre no PoFx em nome do driver, o driver não precisa se registrar no PoFx nesse cenário.
Se o driver especificar DriverManagedIdleTimeout, considere alternar para o tempo limite ocioso gerenciado pelo sistema. Se isso não for viável, use as diretrizes na seção WDM abaixo para optar pelo DFx.
Se o driver WDF não usar o gerenciamento de energia em tempo de execução, adicione suporte para ele e use o tempo limite ocioso gerenciado pelo sistema. Para fazer isso, forneça uma estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS como entrada para WdfDeviceAssignS0IdleSettings.
Requisitos para controladores WDM (não miniporta)
Se o driver não usar o suporte de estado ocioso gerido pelo sistema fornecido pelo WDF (ou seja, se o driver for um driver WDF a usar estado ocioso gerido pelo driver ou um driver WDM), ainda pode obter suporte DFx registando-se com o PoFx. Nesse cenário, o driver se registra com PoFx implementando:
- PO_FX_DIRECTED_POWER_DOWN_CALLBACK função de retorno de chamada
- PO_FX_DIRECTED_POWER_UP_CALLBACK função de retorno de chamada
Forneça ponteiros para esses callbacks na estrutura PO_FX_DEVICE_V3 que é entrada para a função PoFxRegisterDevice.
Para obter suporte DFx, um driver deve:
- Forneça os
PO_FX_DIRECTED_POWER*
callbacks ao registar-se no PoFx. - Ligue PoFxReportDevicePoweredOn a partir da função callback PO_FX_DIRECTED_POWER_UP_CALLBACK ao retornar da ociosidade. Se este for um driver WDF, ele pode definir um sinalizador e, em seguida, em EvtDeviceD0Entry, verifique o sinalizador e chame PoFxReportDevicePoweredOn.
- Chame PoFxReportDevicePoweredOn ao retomar da transição Sx. Se este for um driver WDF, precisará pré-processar IRP_MN_SET_POWER. O callback de pré-processamento deve apenas prosseguir se
Parameters.Power.Type == SystemPowerState
. Como o dispositivo pode permanecer no estado Dx durante todo o ciclo de suspensão/retomada, a abordagem acima de verificar um sinalizador em EvtDeviceD0Entry não funcionará. Em vez disso, a função de retorno de chamada de evento EvtDeviceWdmIrpPreprocess deve chamar IoSetCompletionRoutine para definir uma rotina IoCompletion e, a partir dessa rotina de conclusão, chamar PoFxReportDevicePoweredOn.
Exemplo
O exemplo a seguir mostra a opção de auto-registro descrita acima:
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;
}
Se o PO_FX_VERSION_V1
foi especificado anteriormente no seu driver, observe que a estrutura da matriz de componentes usa PO_FX_DEVICE_V3
PO_FX_COMPONENT_V2
.
Requisitos aplicáveis aos condutores de miniportos
Para classes de dispositivos que seguem um modelo de driver de porta/miniporta, os drivers de porta fornecidos pelo sistema normalmente lidam com a gestão da política de energia. Não se espera que a maioria das miniportas exija alterações de código para aderir ao DFx, pois o driver de porta correspondente deve lidar com o suporte a DFx.
Orientação para miniportos de terceiros de KS.sys
A partir do Windows 10, versão 2004 (também conhecido como 20H1 ou build 19041), KS.sys exclui o DFx e os requisitos HLK relacionados por padrão. Miniports de terceiros do KS.sys podem aderir ao DFx e ao HLK relacionado, registando-se no PoFx e adicionando a chave de registo KsDFxSupportEnable ao INF.
Um driver pode se registrar com PoFx usando a implementação mencionada nesta seção. Além disso, a seguinte linha precisa ser adicionada na seção diretiva AddReg .
HKR, , KSDFxSupportEnable, 0x00010001, 1
A seção AddReg pode ser invocada pela seção [DDInstall.HW] do dispositivo ou pela seção [service-install-section] do driver. Adicioná-lo na seção [DDInstall.HW] altera apenas esse dispositivo específico. Isso é útil se o mesmo driver for usado para diferentes combinações de VID/PID, mas o DFx precisa ser habilitado apenas para um dispositivo específico.
Adicionar a seção AddReg na [service-install-section] ativa o DFx para todos os dispositivos que utilizam esse driver.
Testes
A Microsoft fornece três testes para DFx: um teste de dispositivo único no Kit de Driver do Windows destinado a testar dispositivos especificados pelo usuário, um teste HLK no nível do dispositivo e um teste HLK no nível do sistema destinado a testar todos os dispositivos em um sistema.
O teste de dispositivo único está disponível como parte da ferramenta PwrTest que acompanha o WDK. Para aceder a ele, execute a ferramenta com a opção /directedfx
. Para obter mais informações, consulte Cenário PwrTest DirectedFx.
Para obter informações sobre testes HLK, consulte as seguintes páginas:
Recomenda-se testar DFx após uma transição S4 para detetar quaisquer casos em que um driver pode não estar chamando corretamente PoFxReportDevicePoweredOn após a retomada do S4.
Transições de estado DFx e S
- O estado D de destino para transições DFx deve corresponder ao do Runtime D3 (RTD3), que pode ser diferente do estado D de destino para transições S3/S4. Considere um cenário em que um dispositivo entra em D2 para RTD3, mas entra em D3 para S3/S4. Nesse caso, o estado D de destino para DFx deve ser D2.
- Da mesma forma, o comportamento de "arm-for-wake" para o DFx deve corresponder ao de RTD3, que pode diferir do usado nas transições S3/S4. Por exemplo, um dispositivo pode entrar em D2/wake-armed para RTD3, mas entrar em D3/no-wake-armed para S3/S4. Nesse cenário, as transições DFx também devem entrar em D2/wake-armed.
DFx e Runtime D3 (RTD3)
- Com o RTD3, um dispositivo normalmente entra em um estado D de menor potência quando fica ocioso. Se um novo trabalho for recebido, o dispositivo desperta imediatamente para D0. Com o DFx, o dispositivo deve continuar a permanecer no estado D de destino (e colocar novo trabalho em espera nas suas filas) até que o PoFx o direcione para retornar ao funcionamento.
Ver também
- Gestão de energia direcionada
- Preparar o hardware para o modo de espera moderno
- PwrTest
- Estrutura PO_FX_DEVICE_V3
- PO_FX_DIRECTED_POWER_DOWN_CALLBACK função de retorno de chamada
- PO_FX_DIRECTED_POWER_UP_CALLBACK função de retorno de chamada
- Função PoFxCompleteDirectedPowerDown
- Cenário do PwrTest DirectedFx
- Teste direcionado de dispositivo FX único
- Teste de verificação direcionada do sistema FX