Partager via


Surprise Wake-Up

Un réveil surprise est une transition inattendue vers D0. Une fois qu’un appareil entre dans D3cold, il peut subir un réveil surprise en tant qu’effet secondaire lorsque le pilote d’un autre appareil sur le même rail d’alimentation demande une transition de D3cold à D0. Le pilote du premier appareil doit recevoir une notification de la mise en éveil surprise pour empêcher l’appareil de rester dans un état D0 non initialisé.

Lorsqu’un appareil passe de D3hot à D3cold, il le fait probablement parce que la source d’alimentation qu’il partage avec un certain nombre d’autres appareils a été désactivée. Une fois que ces appareils sont entrés dans D3cold, le pilote de l’un des appareils peut demander une transition vers D0. En réponse à cette demande, le pilote de bus parent ou le pilote de filtre ACPI active la source d’alimentation, et tous les appareils qui partagent la source d’alimentation entrent dans leur état matériel par défaut.

Le seul pilote de périphérique qui s’attend à ce changement d’état d’alimentation est le pilote qui a demandé la modification. Les pilotes des autres appareils doivent recevoir une notification de cette modification afin qu’ils puissent correctement initialiser leurs appareils pour fonctionner dans D0. Seul un pilote qui peut recevoir cette notification doit permettre à son appareil d’entrer D3cold. Sinon, le pilote ne saura pas quand l’appareil entre dans D0.

Lorsqu’un appareil est allumé, il passe à un état matériel non initialisé par défaut. Par exemple, la spécification PCI Express Base 3.0 définit un état non initialisé D0 qu’un appareil entre quand il reçoit l’alimentation pour la première fois. La définition de cet état est spécifique aux appareils PCI et PCI Express, mais les appareils qui se connectent à d’autres bus sont conçus pour entrer dans des états matériels similaires lorsqu’ils sont activés.

Dans le cas d’un appareil PCI ou PCI Express qui implémente plusieurs fonctions, ces fonctions d’appareil partagent probablement le même rail d’alimentation. Toutefois, chaque fonction peut avoir un pilote distinct et les pilotes de ces fonctions sont peu susceptibles de communiquer directement entre eux. Lorsque le pilote de l’une de ces fonctions demande un changement d’état d’alimentation de D3cold à D0, les pilotes des autres fonctions ne s’attendent pas à ce changement. Lorsque ces autres fonctions reçoivent de l’alimentation, leurs pilotes doivent être avertis afin qu’ils puissent configurer les fonctions pour qu’elles fonctionnent correctement dans D0.

Un pilote de bus détecte quand l’alimentation d’un appareil enfant est activée. Si le pilote de fonction de ce périphérique n’a pas demandé une transition vers D0, le pilote de bus invite le pilote de périphérique à s’envoyer un IRP d’alimentation D0 (une demande de IRP_MN_SET_POWER avec l’état cible = PowerDeviceD0) pour initialiser l’appareil pour qu’il fonctionne dans D0. À partir de cet état D0 initialisé, le pilote de périphérique peut ensuite lancer la transition de l’appareil vers D3hot. Les pilotes de périphérique peuvent recevoir des notifications de transitions surprises vers D0 à partir des pilotes de bus des manières suivantes :

À compter de Windows 8, le pilote de fonction d’un appareil, agissant en tant que propriétaire de la stratégie d’alimentation, peut s’inscrire en tant que client de PoFx. Lorsque le pilote de bus informe PoFx que l’appareil a subi une transition surprise vers D0, PoFx aide l’appareil à passer à un état D0 initialisé, puis à D3hot. Tout d’abord, PoFx appelle la routine DevicePowerRequiredCallback du pilote pour inviter le pilote à envoyer un IRP d’alimentation D0 dans la pile des appareils. Ensuite, PoFx appelle la routine DevicePowerNotRequiredCallback du pilote pour informer le pilote que l’appareil n’est pas obligé de rester dans l’état D0.

À compter de Kernel-Mode Driver Framework (KMDF) version 1.11, le pilote KMDF pour un appareil à composant unique peut indirectement s’inscrire auprès de PoFx en appelant la méthode WdfDeviceWdmAssignPowerFrameworkSettings . Dans cet appel, le pilote fournit des pointeurs vers des routines de rappel qui l’informent des transitions surprises vers D0. Pour plus d’informations, consultez Prise en charge des états d’alimentation fonctionnels.

Un pilote qui n’inscrit pas son appareil auprès de PoFx peut toujours être averti d’une transition surprise vers D0 si l’appareil est armé pour le réveil. Lorsque les pilotes de bus mettent l’appareil sous tension, ils effectuent la demande de IRP_MN_WAIT_WAKE du pilote. En réponse, le pilote initialise son appareil pour qu’il fonctionne dans D0. L’appareil est susceptible d’être inactif, auquel cas le pilote, après un certain temps, déplacera cet appareil vers D3hot.

Un pilote de fonction qui ne s’inscrit pas auprès de PoFx et qui n’arme pas son appareil pour le wake ne reçoit aucune notification d’une transition surprise de D3cold vers D0. L’appareil peut passer beaucoup de temps dans un état D0 non initialisé. Dans cet état, tous les composants de l’appareil sont généralement activés. Pour réduire la consommation d’énergie des appareils inactifs, les pilotes doivent autoriser l’entrée dans D3cold uniquement s’ils peuvent recevoir des notifications de transitions surprises vers D0.