Usando a interface do driver GUID_D3COLD_SUPPORT_INTERFACE
Começando com Windows 8, os drivers podem chamar as rotinas na interface GUID_D3COLD_SUPPORT_INTERFACE para determinar os recursos D3cold dos dispositivos e permitir que esses dispositivos usem D3cold. As duas rotinas principais nessa interface são SetD3ColdSupport e GetIdleWakeInfo.
A interface do driver GUID_D3COLD_SUPPORT_INTERFACE fornece suporte para o subestado D3cold do estado de energia do dispositivo D3. D3 é dividido em dois subestados, D3hot e D3cold. D3 é o estado de energia do dispositivo mais baixo e d3cold usa menos energia do que D3hot. Um dispositivo só poderá inserir D3cold se o dispositivo, o driver do barramento pai e o firmware da plataforma deem suporte a esse estado. Um dispositivo que dá suporte a D3cold pode entrar e sair desse estado quando o computador estiver no estado de energia do sistema S0 (em funcionamento).
O driver que é o PPO (proprietário da política de energia) para o dispositivo chama as rotinas nessa interface para fazer o seguinte:
- Descubra se o dispositivo, o driver de barramento pai e o firmware de plataforma dão suporte a transições para o subestado D3cold.
- Descubra se o dispositivo pode sinalizar um evento de ativação para o processador quando o dispositivo estiver no subestado D3cold.
- Habilite e desabilite as transições para o subestado D3cold pelo dispositivo.
Para consultar essa interface, um driver de dispositivo envia uma IRP_MN_QUERY_INTERFACE IRP para baixo na pilha do driver. Para esse IRP, o driver define o parâmetro de entrada InterfaceType como GUID_D3COLD_SUPPORT_INTERFACE. Após a conclusão bem-sucedida do IRP, o parâmetro de saída interface é um ponteiro para uma estrutura D3COLD_SUPPORT_INTERFACE. Essa estrutura contém ponteiros para as rotinas na interface.
Para obter mais informações sobre o estado de energia do dispositivo D3cold, consulte Suporte a D3cold em um Driver.
Um driver chama a rotina SetD3ColdSupport para habilitar e desabilitar dinamicamente as transições de um dispositivo para D3cold que podem ocorrer quando o computador está no S0. Se o dispositivo precisar ser capaz de sinalizar um evento de ativação de qualquer estado Dx de baixa potência que o dispositivo insere, o driver deverá permitir que o dispositivo insira D3cold somente se o dispositivo puder sinalizar eventos de ativação de D3cold. Caso contrário, depois que o dispositivo entrar em D3cold, ele poderá ficar indisponível até que o computador deixe o estado S0.
Por padrão, antes da primeira chamada para a rotina SetD3ColdSupport , as transições D3hot para D3cold são desabilitadas. Para alterar esse padrão para que as transições D3hot-to-D3cold sejam habilitadas antes da primeira chamada SetD3ColdSupport , o pacote de driver do dispositivo pode incluir as duas linhas a seguir na seção DDInstall.HW do arquivo INF que instala o driver:
Include = machine.inf
Needs = PciD3ColdSupported
A rotina GetIdleWakeInfo permite que o driver de um dispositivo descubra os estados de energia do dispositivo dos quais o dispositivo pode sinalizar um evento de ativação quando o computador estiver em um estado de energia do sistema específico. O chamador para essa rotina especifica um estado de energia do sistema como um parâmetro de entrada e, como parâmetro de saída, a rotina relata o estado de energia do dispositivo de menor potência do qual o dispositivo pode sinalizar um evento de espera quando o computador está no estado de energia do sistema especificado. Por exemplo, a rotina GetIdleWakeInfo pode informar ao driver se o dispositivo pode sinalizar um evento de ativação de D3cold quando o computador está em S0.
A rotina GetIdleWakeInfo fornece informações de ativação de dispositivo mais completas do que as disponíveis na solicitação de IRP_MN_QUERY_CAPABILITIES . Essa solicitação, que todas as versões do Windows dão suporte, fornece uma estrutura DEVICE_CAPABILITIES que descreve os recursos de um dispositivo. O membro DeviceWake dessa estrutura contém um subconjunto das informações disponíveis na rotina GetIdleWakeInfo . Esse membro indica o estado de energia do dispositivo de menor potência do qual um dispositivo pode sinalizar um evento de espera. As informações neste membro terão a garantia de serem precisas somente se o computador estiver no estado de baixa potência do sistema indicado pelo membro SystemWake da estrutura. Se SystemWake = PowerSystemSleeping3, as informações em DeviceWake são conhecidas como válidas para S3, podem ser frequentemente válidas para S1 e S2 e podem até ser válidas para S0.
No entanto, como prática recomendada, um driver não deve assumir que as informações no método DeviceWake são válidas para qualquer estado de energia do sistema diferente do estado indicado por SystemWake. Para alguns dispositivos, o estado Dx mais baixo do qual um dispositivo pode sinalizar um evento de ativação varia de acordo com se o computador está no estado de trabalho S0 ou em um estado de baixa potência (S1, S2, S3 ou S4). Para outros dispositivos, os barramentos aos quais os dispositivos estão conectados podem lidar com sinais de ativação quando o computador está no S0, mas os dispositivos não podem. Somente a rotina GetIdleWakeInfo pode descrever com precisão os recursos de ativação do dispositivo desses dispositivos.
Por exemplo, a Especificação PCI Express Base 3.0 define dois mecanismos separados para sinalizar eventos de ativação— um mecanismo é usado quando o link do PCI Express (barramento) é ativado e o outro é usado quando o link é desativado. Quando o link é ativado, o dispositivo envia um fluxo de TLPs (pacotes de camada de transação) PM_PME para sinalizar que o dispositivo deve passar de um estado Dx de baixa potência para D0. Quando o link está desativado, o dispositivo solicita que o link seja ativado para que o dispositivo possa enviar PM_PME TLPs. Para solicitar que o link seja ativado, o dispositivo declara seu sinal WAKE# (para o fator de forma de dispositivo mais comum) ou usa o mecanismo de "beaconing" (menos comum).
A especificação do PCI Express exige que todos os dispositivos que anunciam a capacidade de sinalizar PMEs (eventos de gerenciamento de energia) do D3cold implementem esses dois mecanismos de ativação de dispositivo, mas um desenvolvedor de driver pode precisar habilitar um dispositivo que não implemente corretamente esses mecanismos.
Se o dispositivo puder entregar corretamente PM_PME TLPs quando o link estiver ativado, o driver poderá permitir que o dispositivo insira D3hot quando o computador estiver no S0. Se o dispositivo puder declarar corretamente seu sinal WAKE# para ativar o link e, em seguida, usar PM_PME TLPs para iniciar a transição para D0, o driver poderá permitir que o dispositivo insira D3cold quando o computador estiver no S0.
No entanto, o driver não deve permitir que o dispositivo insira D3hot ou D3cold se o firmware do sistema (o BIOS) não puder garantir que os mecanismos de ativação de dispositivo do PCI Express sejam tratados corretamente pela plataforma de hardware. Um driver pode chamar a rotina GetIdleWakeInfo para descobrir se o firmware reivindica suporte para esses mecanismos. Se um driver usa Kernel-Mode KMDF (Driver Framework) 1.11 ou posterior, uma alternativa conveniente para chamar GetIdleWakeInfo é permitir que o método WdfDeviceAssignS0IdleSettings habilite o dispositivo para ocioso no estado Dx mais baixo do qual o dispositivo pode sinalizar um evento de ativação.