Utilisation de l’interface du pilote GUID_D3COLD_SUPPORT_INTERFACE

À compter de Windows 8, les pilotes peuvent appeler les routines de l’interface GUID_D3COLD_SUPPORT_INTERFACE pour déterminer les fonctionnalités D3cold des appareils et permettre à ces appareils d’utiliser D3cold. Les deux principales routines de cette interface sont SetD3ColdSupport et GetIdleWakeInfo.

L’interface du pilote GUID_D3COLD_SUPPORT_INTERFACE prend en charge le sous-état D3cold de l’état d’alimentation du périphérique D3. D3 est divisé en deux sous-états, D3hot et D3cold. D3 est l’état d’alimentation de l’appareil le plus faible, et D3cold utilise moins d’alimentation que D3hot. Un appareil peut entrer D3cold uniquement si l’appareil, le pilote de bus parent et le microprogramme de plateforme prennent en charge cet état. Un appareil qui prend en charge D3cold peut entrer et quitter cet état lorsque l’ordinateur est à l’état d’alimentation du système S0 (fonctionnement).

Le pilote qui est le propriétaire de la stratégie d’alimentation (PPO) de l’appareil appelle les routines de cette interface pour effectuer les opérations suivantes :

  • Découvrez si l’appareil, le pilote de bus parent et le microprogramme de plateforme prennent en charge les transitions vers le sous-état D3cold.
  • Découvrez si l’appareil peut signaler un événement de veille au processeur lorsque l’appareil se trouve dans le sous-état D3cold.
  • Activez et désactivez les transitions vers le sous-état D3cold par l’appareil.

Pour interroger cette interface, un pilote de périphérique envoie une IRP_MN_QUERY_INTERFACE IRP dans la pile des pilotes. Pour cette IRP, le pilote définit le paramètre d’entrée InterfaceType sur GUID_D3COLD_SUPPORT_INTERFACE. Une fois l’IRP terminé, le paramètre de sortie d’interface est un pointeur vers une structure D3COLD_SUPPORT_INTERFACE. Cette structure contient des pointeurs vers les routines dans l’interface.

Pour plus d’informations sur l’état d’alimentation du périphérique D3cold, consultez Prise en charge de D3cold dans un pilote.

Un pilote appelle la routine SetD3ColdSupport pour activer et désactiver dynamiquement les transitions d’un appareil vers D3cold qui peuvent se produire lorsque l’ordinateur est dans S0. Si l’appareil doit être en mesure de signaler un événement de veille à partir d’un état Dx de faible puissance entré par l’appareil, le pilote doit autoriser l’appareil à entrer D3cold uniquement si l’appareil peut signaler des événements de veille à partir de D3cold. Sinon, une fois que l’appareil est entré dans D3cold, il peut être indisponible jusqu’à ce que l’ordinateur quitte l’état S0.

Par défaut, avant le premier appel à la routine SetD3ColdSupport , les transitions D3hot-à-D3cold sont désactivées. Pour modifier cette valeur par défaut afin que les transitions D3hot-vers-D3cold soient activées avant le premier appel SetD3ColdSupport , le package de pilotes de l’appareil peut inclure les deux lignes suivantes dans la section DDInstall.HW du fichier INF qui installe le pilote :

Include = machine.inf
Needs = PciD3ColdSupported

La routine GetIdleWakeInfo permet au pilote d’un appareil de découvrir les états d’alimentation de l’appareil à partir desquels l’appareil peut signaler un événement de veille lorsque l’ordinateur est dans un état d’alimentation système particulier. L’appelant à cette routine spécifie un état d’alimentation du système comme paramètre d’entrée et, en tant que paramètre de sortie, la routine signale l’état d’alimentation de l’appareil le plus faible à partir duquel l’appareil peut signaler un événement d’attente lorsque l’ordinateur est à l’état d’alimentation du système spécifié. Par exemple, la routine GetIdleWakeInfo peut indiquer au pilote si l’appareil peut signaler un événement de veille à partir de D3cold lorsque l’ordinateur est en S0.

La routine GetIdleWakeInfo fournit des informations de veille d’appareil plus complètes que celles disponibles à partir de la demande IRP_MN_QUERY_CAPABILITIES . Cette demande, prise en charge par toutes les versions de Windows, fournit une structure DEVICE_CAPABILITIES qui décrit les fonctionnalités d’un appareil. Le membre DeviceWake de cette structure contient un sous-ensemble des informations disponibles à partir de la routine GetIdleWakeInfo . Ce membre indique l’état d’alimentation de l’appareil le plus faible à partir duquel un appareil peut signaler un événement d’attente. Les informations contenues dans ce membre sont garanties d’être exactes uniquement si l’ordinateur se trouve dans l’état de faible puissance du système indiqué par le membre SystemWake de la structure. Si SystemWake = PowerSystemSleeping3, les informations contenues dans DeviceWake sont connues pour être valides pour S3, peuvent souvent être valides pour S1 et S2, et peuvent même être valides pour S0.

Toutefois, comme bonne pratique, un pilote ne doit pas supposer que les informations contenues dans la méthode DeviceWake sont valides pour tout état d’alimentation du système autre que l’état indiqué par SystemWake. Pour certains appareils, l’état Dx le plus bas à partir duquel un appareil peut signaler un événement de veille varie selon que l’ordinateur est à l’état de fonctionnement S0 ou à faible consommation d’énergie (S1, S2, S3 ou S4). Pour les autres appareils, les bus auxquels les appareils sont connectés peuvent gérer les signaux de veille lorsque l’ordinateur est en S0, mais les appareils ne le peuvent pas. Seule la routine GetIdleWakeInfo peut décrire avec précision les fonctionnalités de veille de l’appareil de ces appareils.

Par exemple, la spécification PCI Express Base 3.0 définit deux mécanismes distincts pour signaler les événements de veille : un mécanisme est utilisé lorsque la liaison PCI Express (bus) est activée et l’autre est utilisée lorsque le lien est désactivé. Lorsque le lien est activé, l’appareil envoie un flux de PM_PME paquets de couche transactionnelle (TPL) pour signaler que l’appareil doit passer d’un état Dx faible consommation à D0. Lorsque le lien est désactivé, l’appareil demande que le lien soit activé afin que l’appareil puisse envoyer PM_PME TLD. Pour demander que le lien soit activé, l’appareil affirme son signal WAKE# (pour le facteur de forme de l’appareil le plus courant) ou utilise le mécanisme « beaconing » (moins courant).

La spécification PCI Express exige que tous les appareils qui publient la possibilité de signaler des événements de gestion de l’alimentation (PME) à partir de D3cold implémentent ces deux mécanismes de veille d’appareil, mais un développeur de pilotes peut avoir besoin d’activer un appareil qui n’implémente pas correctement ces mécanismes.

Si l’appareil peut remettre correctement PM_PME TTLPs lorsque le lien est activé, le pilote peut permettre à l’appareil d’entrer D3hot lorsque l’ordinateur est en S0. Si l’appareil peut correctement affirmer son signal WAKE# pour activer le lien, puis utiliser PM_PME TTLPs pour lancer la transition vers D0, le pilote peut autoriser l’appareil à entrer D3cold lorsque l’ordinateur est en S0.

Toutefois, le pilote ne doit pas permettre à l’appareil d’entrer D3hot ou D3cold si le microprogramme système (le BIOS) ne peut pas garantir que les mécanismes de veille d’appareil PCI Express sont correctement gérés par la plateforme matérielle. Un pilote peut appeler la routine GetIdleWakeInfo pour déterminer si les revendications du microprogramme prennent en charge ces mécanismes. Si un pilote utilise Kernel-Mode Driver Framework (KMDF) 1.11 ou version ultérieure, une alternative pratique à l’appel de GetIdleWakeInfo consiste à autoriser la méthode WdfDeviceAssignS0IdleSettings à permettre à l’appareil d’être inactif dans l’état Dx le plus bas à partir duquel l’appareil peut signaler un événement de veille.