Wake-Up surpresa

Um alerta surpresa é uma transição inesperada para D0. Depois que um dispositivo entra em D3cold, ele pode enfrentar um alerta surpresa como um efeito colateral quando o driver de outro dispositivo no mesmo power rail solicita uma transição de D3cold para D0. O driver do primeiro dispositivo deve receber uma notificação da ativação surpresa para impedir que o dispositivo permaneça em um estado D0 não inicializado.

Quando um dispositivo passa de D3hot para D3cold, ele provavelmente faz isso porque a fonte de energia que ele compartilha com alguns outros dispositivos foi desativada. Algum tempo depois que esses dispositivos entrarem em D3cold, o driver de um dos dispositivos poderá solicitar uma transição para D0. Em resposta a essa solicitação, o driver de barramento pai ou o driver de filtro ACPI ativa a fonte de alimentação e todos os dispositivos que compartilham a fonte de energia inserem seus estados de hardware padrão e ligados.

O único driver de dispositivo que espera essa alteração de estado de energia é o driver que solicitou a alteração. Os drivers dos outros dispositivos devem receber notificação dessa alteração para que possam inicializar corretamente seus dispositivos para operar em D0. Somente um driver que pode receber essa notificação deve permitir que seu dispositivo insira D3cold. Caso contrário, o driver não saberá quando o dispositivo entrar em D0.

Quando um dispositivo é ativado, ele insere um estado de hardware padrão não inicializado. Por exemplo, a Especificação PCI Express Base 3.0 define um estado D0 não inicializado que um dispositivo insere quando recebe energia pela primeira vez. A definição desse estado é específica para dispositivos PCI e PCI Express, mas os dispositivos que se conectam a outros barramentos são projetados para entrar em estados de hardware semelhantes quando são ativados.

No caso de um dispositivo PCI ou PCI Express que implementa várias funções, essas funções de dispositivo provavelmente compartilham o mesmo power rail. No entanto, cada função pode ter um driver separado e é improvável que os drivers dessas funções se comuniquem diretamente entre si. Quando o driver de uma dessas funções solicita uma alteração de estado de energia de D3cold para D0, os drivers das outras funções não esperam essa alteração. Quando essas outras funções recebem energia, seus drivers devem ser notificados para que possam configurar as funções para operar corretamente em D0.

Um motorista de ônibus detecta quando a energia de um dispositivo filho está sendo ativada. Se o driver de função deste dispositivo não solicitou uma transição para D0, o driver de barramento solicitará que o driver do dispositivo envie a si mesmo um IRP de energia D0 (uma solicitação de IRP_MN_SET_POWER com estado de destino = PowerDeviceD0) para inicializar o dispositivo para operar em D0. Nesse estado D0 inicializado, o driver de dispositivo pode iniciar a transição do dispositivo para d3hot. Os drivers de dispositivo podem receber notificações de transições surpresa para D0 de motoristas de ônibus das seguintes maneiras:

Começando com Windows 8, o driver de função de um dispositivo, atuando como o proprietário da política de energia, pode se registrar como um cliente da PoFx. Quando o motorista do ônibus notifica PoFx de que o dispositivo passou por uma transição surpresa para D0, o PoFx ajuda o dispositivo a se mover para um estado D0 inicializado e, em seguida, para D3hot. Primeiro, o PoFx chama a rotina DevicePowerRequiredCallback do driver para solicitar que o driver do dispositivo envie um IRP de energia D0 para baixo na pilha do dispositivo. Em seguida, a PoFx chama a rotina DevicePowerNotRequiredCallback do driver para notificar o driver do dispositivo de que o dispositivo não é necessário para permanecer no estado D0.

A partir do KMDF (Kernel-Mode Driver Framework) versão 1.11, o driver KMDF para um dispositivo de componente único pode se registrar indiretamente no PoFx chamando o método WdfDeviceWdmAssignPowerFrameworkSettings . Nessa chamada, o driver fornece ponteiros para rotinas de retorno de chamada que notificam o driver de transições surpresa para D0. Para obter mais informações, consulte Suporte a estados de energia funcionais.

Um driver que não registra seu dispositivo com PoFx ainda pode ser notificado de uma transição surpresa para D0 se o dispositivo estiver armado para ativação. Quando os motoristas de ônibus ativam a energia para o dispositivo, eles completam a solicitação de IRP_MN_WAIT_WAKE do motorista. Em resposta, o driver inicializa seu dispositivo para operar no D0. É provável que o dispositivo esteja ocioso, nesse caso, o driver, após algum tempo, moverá esse dispositivo para D3hot.

Um driver de função que não se registra com PoFx e que não arma seu dispositivo para ativação não recebe nenhuma notificação de uma transição surpresa de D3cold para D0. O dispositivo pode passar grandes quantidades de tempo em um estado D0 não inicializado. Nesse estado, todos os componentes no dispositivo normalmente são ativados. Para reduzir o consumo de energia por dispositivos ociosos, os drivers devem habilitar a entrada para D3cold somente se puderem receber notificações de transições surpresa para D0.