Uso de la interfaz del controlador de GUID_D3COLD_SUPPORT_INTERFACE

A partir de Windows 8, los controladores pueden llamar a las rutinas de la interfaz GUID_D3COLD_SUPPORT_INTERFACE para determinar las funcionalidades D3cold de los dispositivos y permitir que estos dispositivos usen D3cold. Las dos rutinas principales de esta interfaz son SetD3ColdSupport y GetIdleWakeInfo.

La interfaz del controlador GUID_D3COLD_SUPPORT_INTERFACE proporciona compatibilidad con el subestado D3cold del estado de alimentación del dispositivo D3. D3 se divide en dos subestados, D3hot y D3cold. D3 es el estado de energía del dispositivo con la potencia más baja y D3cold usa menos potencia que D3hot. Un dispositivo solo puede especificar D3cold si el dispositivo, el controlador de bus primario y el firmware de la plataforma admiten este estado. Un dispositivo que admita D3cold puede entrar y salir de este estado cuando el equipo está en el estado de alimentación del sistema S0 (en funcionamiento).

El controlador que es el propietario de la directiva de energía (PPO) para el dispositivo llama a las rutinas de esta interfaz para hacer lo siguiente:

  • Descubra si el dispositivo, el controlador de bus primario y el firmware de la plataforma admiten transiciones al subestado D3cold.
  • Descubra si el dispositivo puede indicar un evento de reactivación al procesador cuando el dispositivo está en el subestado D3cold.
  • Habilite y deshabilite las transiciones al subestado D3cold por parte del dispositivo.

Para consultar esta interfaz, un controlador de dispositivo envía una IRP_MN_QUERY_INTERFACE IRP a la pila de controladores. Para este IRP, el controlador establece el parámetro de entrada InterfaceType en GUID_D3COLD_SUPPORT_INTERFACE. Cuando se completa correctamente el IRP, el parámetro de salida interface es un puntero a una estructura de D3COLD_SUPPORT_INTERFACE. Esta estructura contiene punteros a las rutinas de la interfaz .

Para obtener más información sobre el estado de alimentación del dispositivo D3cold, consulte Compatibilidad con D3cold en un controlador.

Un controlador llama a la rutina SetD3ColdSupport para habilitar y deshabilitar dinámicamente las transiciones de un dispositivo a D3cold que pueden producirse cuando el equipo está en S0. Si el dispositivo debe poder indicar un evento de reactivación desde cualquier estado Dx de bajo consumo que entre en el dispositivo, el controlador debe permitir que el dispositivo entre en D3cold solo si el dispositivo puede indicar eventos de reactivación desde D3cold. De lo contrario, después de que el dispositivo entre en D3cold, es posible que no esté disponible hasta que el equipo deje el estado S0.

De forma predeterminada, antes de la primera llamada a la rutina SetD3ColdSupport , se deshabilitan las transiciones D3hot-to-D3cold. Para cambiar este valor predeterminado para que las transiciones D3hot-to-D3cold estén habilitadas antes de la primera llamada a SetD3ColdSupport , el paquete de controladores del dispositivo puede incluir las dos líneas siguientes en la sección DDInstall.HW del archivo INF que instala el controlador:

Include = machine.inf
Needs = PciD3ColdSupported

La rutina GetIdleWakeInfo permite al controlador detectar los estados de alimentación del dispositivo desde los que el dispositivo puede indicar un evento de reactivación cuando el equipo está en un estado de alimentación del sistema determinado. El autor de la llamada a esta rutina especifica un estado de alimentación del sistema como parámetro de entrada y, como parámetro de salida, la rutina informa del estado de alimentación del dispositivo con tecnología más baja desde la que el dispositivo puede indicar un evento de espera cuando el equipo está en el estado de alimentación del sistema especificado. Por ejemplo, la rutina GetIdleWakeInfo puede indicar al controlador si el dispositivo puede indicar un evento de reactivación desde D3cold cuando el equipo está en S0.

La rutina GetIdleWakeInfo proporciona información de reactivación de dispositivo más completa de la que está disponible en la solicitud de IRP_MN_QUERY_CAPABILITIES . Esta solicitud, que admite todas las versiones de Windows, proporciona una estructura de DEVICE_CAPABILITIES que describe las funcionalidades de un dispositivo. El miembro DeviceWake de esta estructura contiene un subconjunto de la información que está disponible en la rutina GetIdleWakeInfo . Este miembro indica el estado de alimentación del dispositivo con tecnología más baja desde el que un dispositivo puede indicar un evento de espera. Se garantiza que la información de este miembro es precisa solo si el equipo está en el estado de baja potencia del sistema indicado por el miembro SystemWake de la estructura. Si SystemWake = PowerSystemSleeping3, se sabe que la información de DeviceWake es válida para S3, podría ser válida con frecuencia para S1 y S2, e incluso podría ser válida para S0.

Sin embargo, como procedimiento recomendado, un controlador no debe suponer que la información del método DeviceWake es válida para cualquier estado de alimentación del sistema distinto del estado indicado por SystemWake. Para algunos dispositivos, el estado Dx más bajo desde el que un dispositivo puede señalar un evento de reactivación varía según si el equipo está en estado de trabajo S0 o en un estado de baja potencia (S1, S2, S3 o S4). Para otros dispositivos, los buses a los que están conectados los dispositivos pueden controlar las señales de reactivación cuando el equipo está en S0, pero los dispositivos no. Solo la rutina GetIdleWakeInfo puede describir con precisión las funcionalidades de reactivación del dispositivo de estos dispositivos.

Por ejemplo, la especificación PCI Express Base 3.0 define dos mecanismos independientes para indicar eventos de reactivación: se usa un mecanismo cuando se activa el vínculo PCI Express (bus) y el otro se usa cuando el vínculo está desactivado. Cuando el vínculo está activado, el dispositivo envía una secuencia de PM_PME paquetes de capa de transacción (TLP) para indicar que el dispositivo debe pasar de un estado Dx de baja potencia a D0. Cuando el vínculo está desactivado, el dispositivo solicita que el vínculo esté activado para que el dispositivo pueda enviar PM_PME TLP. Para solicitar que el vínculo esté activado, el dispositivo declara su señal WAKE# (para el factor de forma de dispositivo más común) o usa el mecanismo de "señalización" (menos común).

La especificación PCI Express requiere que todos los dispositivos que anuncian la capacidad de indicar eventos de administración de energía (PME) desde D3cold implementen ambos mecanismos de reactivación de dispositivos, pero es posible que un desarrollador de controladores tenga que habilitar un dispositivo que no implemente correctamente estos mecanismos.

Si el dispositivo puede entregar correctamente PM_PME TLP cuando el vínculo está activado, el controlador puede permitir que el dispositivo entre D3hot cuando el equipo está en S0. Si el dispositivo puede declarar correctamente su señal WAKE# para activar el vínculo y, a continuación, usar PM_PME TLP para iniciar la transición a D0, el controlador puede permitir que el dispositivo escriba D3cold cuando el equipo está en S0.

Sin embargo, el controlador no debe permitir que el dispositivo entre D3hot o D3cold si el firmware del sistema (el BIOS) no puede garantizar que la plataforma de hardware controle correctamente los mecanismos de reactivación del dispositivo PCI Express. Un controlador puede llamar a la rutina GetIdleWakeInfo para detectar si la compatibilidad de notificaciones de firmware con estos mecanismos. Si un controlador usa Kernel-Mode Driver Framework (KMDF) 1.11 o posterior, una alternativa conveniente para llamar a GetIdleWakeInfo es permitir que el método WdfDeviceAssignS0IdleSettings permita que el dispositivo esté inactivo en el estado Dx con tecnología más baja desde el que el dispositivo puede indicar un evento de reactivación.