Partilhar via


Utilizando a Interface de Driver GUID_D3COLD_SUPPORT_INTERFACE

A partir do 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 o D3cold. As duas rotinas principais nesta 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 de menor potência, e D3cold usa menos energia do que D3hot. Um dispositivo só pode entrar no D3cold se o dispositivo, o controlador de barramento pai e o firmware da plataforma suportarem esse estado. Um dispositivo que suporta D3cold pode entrar e sair deste estado quando o computador está no estado de energia S0 (estado operacional).

O driver que é o proprietário da política de energia (PPO) para o dispositivo utiliza as rotinas desta interface para executar o seguinte:

  • Descubra se o dispositivo, o controlador de barramento pai e o firmware da plataforma suportam transições para o subestado D3cold.
  • Descubra se o dispositivo pode sinalizar um evento de despertar para o processador quando o dispositivo estiver no subestado D3cold.
  • Habilite e desative as transições para o subestado D3cold pelo dispositivo.

Para consultar esta interface, um driver de dispositivo envia um IRP_MN_QUERY_INTERFACE IRP na pilha do driver. Para este 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. Esta estrutura contém ponteiros para as rotinas na interface.

Para obter mais informações sobre o estado de energia do dispositivo D3cold, consulte Suporte de D3cold em um controlador.

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á em S0. Se o dispositivo deve ser capaz de sinalizar um evento de despertar a partir de qualquer estado Dx de baixa potência em que entra, o driver deve permitir que entre em D3cold apenas se puder sinalizar eventos de despertar a partir de D3cold. Caso contrário, depois que o dispositivo entra no D3cold, ele pode ficar indisponível até que o computador saia do estado S0.

Por padrão, antes da primeira chamada para a rotina SetD3ColdSupport , as transições D3hot-to-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 para o 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 a partir dos quais o dispositivo pode sinalizar um evento de despertar quando o computador está em um estado de energia específico do sistema. O chamador para essa rotina especifica um estado de energia do sistema como um parâmetro de entrada e, como um parâmetro de saída, a rotina relata o estado de energia do dispositivo de menor potência a partir 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 dizer ao driver se o dispositivo pode sinalizar um evento de despertar de D3cold quando o computador está em S0.

A rotina GetIdleWakeInfo fornece informações de ativação do dispositivo mais completas do que as disponíveis na solicitação de IRP_MN_QUERY_CAPABILITIES . Esta solicitação, que todas as versões do Windows suportam, fornece uma estrutura de 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 . Este membro indica o estado de energia do dispositivo de menor potência a partir do qual um dispositivo pode sinalizar um evento de espera. As informações neste membro são garantidamente precisas apenas se o computador estiver no estado de baixa energia do sistema indicado pelo membro SystemWake da estrutura. Se SystemWake = PowerSystemSleeping3, as informações em DeviceWake são conhecidas por serem 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 a partir do qual um dispositivo pode sinalizar um evento de despertar varia de acordo com se o computador está no estado de funcionamento S0 ou em um estado de baixo consumo de energia (S1, S2, S3 ou S4). Para outros dispositivos, os barramentos aos quais os dispositivos estão conectados podem lidar com sinais de despertar quando o computador está em S0, mas os dispositivos não podem. Somente a rotina GetIdleWakeInfo pode descrever com precisão os recursos de ativação de dispositivo desses dispositivos.

Por exemplo, a Especificação Base 3.0 do PCI Express define dois mecanismos separados para sinalizar eventos de despertar: um mecanismo é usado quando o link PCI Express (barramento) está ligado, e o outro é usado quando o link está desligado. Quando o link é ligado, o dispositivo envia um fluxo de PM_PME Transaction Layer Packets (TLPs) para sinalizar que o dispositivo deve passar de um estado Dx de baixo consumo de energia para D0. Quando o link é desativado, o dispositivo solicita que o link seja ativado para que o dispositivo possa enviar TLPs PM_PME. Para solicitar que o link seja ligado, o dispositivo afirma seu sinal WAKE# (para o fator de forma do dispositivo mais comum) ou usa o mecanismo de "beaconing" (menos comum).

A especificação PCI Express requer que todos os dispositivos que anunciam a capacidade de sinalizar eventos de gerenciamento de energia (PMEs) do D3cold implementem ambos os mecanismos de despertar do dispositivo, mas um desenvolvedor de driver pode precisar habilitar um dispositivo que não implemente corretamente esses mecanismos.

Se o dispositivo conseguir entregar corretamente os PM_PME TLPs quando o link estiver ativado, o driver poderá habilitar o dispositivo para entrar em D3hot quando o computador estiver em S0. Se o dispositivo pode afirmar corretamente o seu sinal WAKE# para ligar o link e, em seguida, usar TLPs PM_PME para iniciar a transição para D0, o driver pode habilitar o dispositivo para entrar em D3cold quando o computador estiver em S0.

No entanto, o driver não deve permitir que o dispositivo entre em D3hot ou D3cold se o firmware do sistema (o BIOS) não puder garantir que os mecanismos de despertar do dispositivo PCI Express sejam geridos 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 Driver Framework (KMDF) 1.11 ou posterior, uma alternativa conveniente para chamar GetIdleWakeInfo é permitir que o método WdfDeviceAssignS0IdleSettings permita que o dispositivo fique ocioso no estado Dx de menor potência a partir do qual o dispositivo pode sinalizar um evento de despertar.