Wake-Up sorpresa
Una sorpresa di riattivazione è una transizione imprevista a D0. Dopo che un dispositivo entra in D3cold, potrebbe verificarsi una riattivazione a sorpresa come effetto collaterale quando il driver per un altro dispositivo nella stessa guida di alimentazione richiede una transizione da D3cold a D0. Il driver per il primo dispositivo deve ricevere la notifica della riattivazione a sorpresa per impedire che il dispositivo rimanga in uno stato D0 non inizializzato.
Quando un dispositivo passa da D3hot a D3cold, probabilmente lo fa perché la fonte di alimentazione che condivide con un certo numero di altri dispositivi è stata disattivata. Qualche tempo dopo che questi dispositivi immettono D3cold, il driver per uno dei dispositivi potrebbe richiedere una transizione a D0. In risposta a questa richiesta, il driver del bus padre o il driver di filtro ACPI attiva l'alimentazione e tutti i dispositivi che condividono la fonte di alimentazione immettono gli stati hardware predefiniti di alimentazione.
L'unico driver di dispositivo che prevede questa modifica dello stato di alimentazione è il driver che ha richiesto la modifica. I driver per gli altri dispositivi devono ricevere una notifica di questa modifica in modo che possano inizializzare correttamente i dispositivi per funzionare in D0. Solo un driver in grado di ricevere questa notifica deve consentire al dispositivo di immettere D3cold. In caso contrario, il driver non saprà quando il dispositivo entra in D0.
Quando un dispositivo è attivato, viene attivato uno stato hardware predefinito non inizializzato. Ad esempio, la specifica PCI Express Base 3.0 definisce uno stato D0 non inizializzato che un dispositivo entra quando riceve la potenza per la prima volta. La definizione di questo stato è specifica per i dispositivi PCI e PCI Express, ma i dispositivi che si connettono ad altri bus sono progettati per immettere stati hardware simili quando sono attivati.
Nel caso di un dispositivo PCI o PCI Express che implementa più funzioni, queste funzioni del dispositivo condividono probabilmente la stessa guida di alimentazione. Tuttavia, ogni funzione potrebbe avere un driver separato e i driver per queste funzioni probabilmente non comunicano direttamente tra loro. Quando il driver per una di queste funzioni richiede una modifica dello stato di alimentazione da D3cold a D0, i driver per le altre funzioni non prevedono questa modifica. Quando queste altre funzioni ricevono alimentazione, i driver devono ricevere una notifica in modo che possano configurare le funzioni in modo che funzionino correttamente in D0.
Un driver del bus rileva quando viene attivata l'alimentazione di un dispositivo figlio. Se il driver di funzione di questo dispositivo non ha richiesto una transizione a D0, il driver del bus richiede al driver di dispositivo di inviare un IRP di alimentazione D0 (una richiesta di IRP_MN_SET_POWER con stato di destinazione = PowerDeviceD0) per inizializzare il dispositivo da usare in D0. Da questo stato D0 inizializzato, il driver di dispositivo può quindi avviare la transizione del dispositivo a D3hot. I driver di dispositivo possono ricevere notifiche di transizioni di sorpresa a D0 dai conducenti di autobus nei modi seguenti:
- I driver di dispositivo che si registrano direttamente o indirettamente come client del framework di risparmio energia di runtime (PoFx) ricevono callback di notifica.
- I driver per i dispositivi che armevano i dispositivi per la riattivazione hanno le richieste di IRP_MN_WAIT_WAKE in sospeso completate dai conducenti dell'autobus.
A partire da Windows 8, il driver di funzione di un dispositivo, che funge da proprietario dei criteri di alimentazione, può registrarsi come client di PoFx. Quando il conducente dell'autobus notifica a PoFx che il dispositivo ha riscontrato una transizione a sorpresa a D0, PoFx aiuta il dispositivo a passare a uno stato D0 inizializzato e quindi a D3hot. Prima di tutto, PoFx chiama la routine DevicePowerRequiredCallback del driver per richiedere al driver di dispositivo di inviare un IRP di alimentazione D0 nello stack di dispositivi. PoFx chiama quindi la routine DevicePowerNotRequiredCallback del driver per notificare al driver di dispositivo che il dispositivo non deve rimanere nello stato D0.
A partire da Kernel-Mode Driver Framework (KMDF) versione 1.11, il driver KMDF per un dispositivo a singolo componente può registrarsi indirettamente con PoFx chiamando il metodo WdfDeviceWdmAssignPowerFrameworkSettings . In questa chiamata, il driver fornisce puntatori alle routine di callback che notificano al driver transizioni di sorpresa a D0. Per altre informazioni, vedere Supporto degli stati di alimentazione funzionale.
Un driver che non registra il dispositivo con PoFx può comunque ricevere una notifica di transizione a sorpresa a D0 se il dispositivo è armato per la riattivazione. Quando i conducenti dell'autobus accendono l'alimentazione del dispositivo, completano la richiesta di IRP_MN_WAIT_WAKE del conducente. In risposta, il driver inizializza il dispositivo in modo che funzioni in D0. È probabile che il dispositivo sia inattiva, nel qual caso il driver, dopo qualche tempo, sposta il dispositivo in D3hot.
Un driver di funzione che non esegue la registrazione con PoFx e che non armerà il dispositivo per la riattivazione non riceve alcuna notifica di una transizione a sorpresa da D3cold a D0. Il dispositivo potrebbe impiegare grandi quantità di tempo in uno stato D0 non inizializzato. In questo stato, tutti i componenti del dispositivo vengono in genere attivati. Per ridurre il consumo di energia da dispositivi inattive, i driver devono abilitare l'ingresso a D3cold solo se possono ricevere notifiche di transizioni di sorpresa a D0.