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, PoFx Direcionada (DFx).

Com a DFx, o sistema operacional direciona as pilhas de dispositivos para entrar em seus estados de ociosidade de baixo consumo de energia apropriados quando o sistema faz a transição para ocioso e não há atividade de software intermediada pelo ativador e, assim, permite que o sistema entre em baixa energia de forma mais confiável.

O objetivo é tornar os sistemas mais eficientes em termos de energia e reduzir o consumo de energia para dispositivos Windows nos fatores forma.

No momento, a DFx tem suporte apenas para dispositivos com restrições de estado D. A DFx ignora qualquer subárvore de dispositivo com uma restrição de estado F.

A DFx não desliga dispositivos de paginação ou depuração.

Requisitos para drivers WDF (não miniporta)

Um driver WDF que é um proprietário de política de energia deve implementar uma diretiva S0-Idle apropriada ao especificar SystemManagedIdleTimeout ou SystemManagedIdleTimeoutWithHint na estrutura WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS. Isso permitirá que o dispositivo desligue quando estiver ocioso. Como uma medida de resiliência adicional, o driver pode optar pela DFx ao adicionar a chave a seguir do Registro à seção de diretiva AddReg do INF dentro da seção DDInstall.HW:

HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1

Um driver WDF direcionado para a versão 31 e superior habilitará a DFx por padrão. Se isso não for desejado, o driver poderá desativar a 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, como alternativa, recusar a DFx ao definir o membro DirectedPoFxEnabled da estrutura WDF_POWER_FRAMEWORK_SETTINGS como WdfFalse.

Dica

Para inicializar sua estrutura WDF_POWER_FRAMEWORK_SETTINGS, seu driver deverá chamar WDF_POWER_FRAMEWORK_SETTINGS_INIT.

Como a solicitação de tempo limite ocioso gerenciado pelo sistema faz com que o WDF se registre na PoFx em nome do driver, o driver não precisa se registrar na 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 pela DFx.

Se o driver WDF não usar o gerenciamento de energia em runtime, adicione suporte a 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 drivers WDM (não miniporta)

Se o driver não usar o suporte ocioso gerenciado pelo sistema fornecido pelo WDF (o driver é um driver WDF que usa ociosidade gerenciada por driver, ou um driver WDM), ele ainda poderá obter suporte DFx registrando-se na PoFx. Neste cenário, o driver se registra na PoFx ao implementar:

Forneça ponteiros para esses retornos de chamada em uma estrutura PO_FX_DEVICE_V3 que seja entrada para a função PoFxRegisterDevice.

Para obter suporte a DFx, um driver deverá:

  • Forneça os retornos de chamada PO_FX_DIRECTED_POWER* ao se registrar na PoFx
  • Chame PoFxReportDevicePoweredOn de sua função de retorno de chamada PO_FX_DIRECTED_POWER_UP_CALLBACK no retorno de ociosidade. Se este for um driver WDF, ele poderá definir um sinalizador e, em seguida, em EvtDeviceD0Entry, verifique o sinalizador e chame PoFxReportDevicePoweredOn.
  • Chame PoFxReportDevicePoweredOn na retomada da transição Sx. Se este for um driver WDF, ele precisará pré-processar IRP_MN_SET_POWER. O retorno de chamada de pré-processamento só deverá 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 deverá chamar IoSetCompletionRoutine para definir uma rotina IoCompletion e, da rotina de conclusão, chamar PoFxReportDevicePoweredOn.

Exemplo

O exemplo a seguir mostra a opção de registro automático 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 driver PO_FX_VERSION_V1 especificado anteriormente, observe que as estruturas PO_FX_DEVICE_V3 usam PO_FX_COMPONENT_V2 para a estrutura de matriz de componentes.

Requisitos para drivers de miniporta

Para classes de dispositivos que seguem um modelo de driver de porta/miniporta, os drivers de porta fornecidos pelo sistema normalmente lidam com a propriedade da política de energia. Não se espera que a maioria das miniportas exija alterações de código para optar pela DFx, pois espera-se que o driver de porta correspondente manipule o suporte a DFx.

Orientação para miniportas de terceiros de KS.sys

A partir do Windows 10, versão 2004 (também conhecida como 20H1, ou compilação 19041), o KS.sys desativa os requisitos de DFx e HLK relacionados por padrão. Minports de terceiros de KS.sys podem aceitar a DFx e o HLK relacionado registrando-se na PoFx e adicionando a chave do Registro KsDFxSupportEnable ao INF.

Um driver pode se registrar na PoFx usando a implementação mencionada nesta seção. Além disso, a linha a seguir precisa ser adicionada à seção da 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 à seção [DDInstall.HW] altera apenas esse dispositivo específico. Isso será útil se o mesmo driver for usado para diferentes combinações de VID/PID, mas a DFx precisar ser habilitada apenas para um dispositivo específico.

A adição da seção AddReg à seção [service-install-section] aceita a DFx para todos os dispositivos que usam esse driver.

Testando

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 acessá-lo, execute a ferramenta com a opção /directedfx. Para obter mais informações, consulte Cenário de PwrTest DirectedFx.

Para obter informações sobre testes HLK, consulte as seguintes páginas:

Recomenda-se testar a DFx após uma transição do S4 para detectar quaisquer casos em que um driver pode não estar chamando PoFxReportDevicePoweredOn corretamente após a retomada do S4.

Transições DFx e Estado S

  • O estado D de destino para transições DFx devem corresponder ao 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 arm-for-wake para DFx deve corresponder ao de RTD3, que pode ser diferente daquele usado em 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. Neste 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 chegar, o dispositivo acordará imediatamente para D0. Com o DFx, o dispositivo deve continuar em seu estado D de destino (e deixar novo trabalho pendente em suas filas) até que a PoFx o direcione para ligar novamente.

Confira também