GUID_D3COLD_SUPPORT_INTERFACE 드라이버 인터페이스 사용

Windows 8 시작하여 드라이버는 GUID_D3COLD_SUPPORT_INTERFACE 인터페이스의 루틴을 호출하여 디바이스의 D3cold 기능을 확인하고 이러한 디바이스에서 D3cold를 사용할 수 있도록 할 수 있습니다. 이 인터페이스의 두 가지 기본 루틴은 SetD3ColdSupportGetIdleWakeInfo입니다.

GUID_D3COLD_SUPPORT_INTERFACE 드라이버 인터페이스는 D3 디바이스 전원 상태의 D3cold 하위 상태를 지원합니다. D3는 D3hot 및 D3cold라는 두 개의 하위 상태로 나뉩니다. D3는 전원이 가장 낮은 디바이스 전원 상태이며 D3cold는 D3hot보다 적은 전력을 사용합니다. 디바이스, 부모 버스 드라이버 및 플랫폼 펌웨어가 이 상태를 지원하는 경우에만 디바이스가 D3cold를 입력할 수 있습니다. D3cold를 지원하는 디바이스는 컴퓨터가 S0(작동 중) 시스템 전원 상태일 때 이 상태를 입력하고 종료할 수 있습니다.

디바이스의 PPO(전원 정책 소유자)인 드라이버는 이 인터페이스의 루틴을 호출하여 다음을 수행합니다.

  • 디바이스, 부모 버스 드라이버 및 플랫폼 펌웨어가 D3cold 하위 상태로의 전환을 지원하는지 확인합니다.
  • 디바이스가 D3cold 하위 상태일 때 디바이스가 절전 모드 해제 이벤트를 프로세서에 신호할 수 있는지 여부를 검색합니다.
  • 디바이스에서 D3cold 하위 상태로의 전환을 사용하거나 사용하지 않도록 설정합니다.

이 인터페이스를 쿼리하기 위해 디바이스 드라이버는 드라이버 스택 아래로 IRP_MN_QUERY_INTERFACE IRP를 보냅니다. 이 IRP의 경우 드라이버는 InterfaceType 입력 매개 변수를 GUID_D3COLD_SUPPORT_INTERFACE 설정합니다. IRP가 성공적으로 완료되면 Interface 출력 매개 변수는 D3COLD_SUPPORT_INTERFACE 구조체에 대한 포인터입니다. 이 구조체에는 인터페이스의 루틴에 대한 포인터가 포함되어 있습니다.

D3cold 디바이스 전원 상태에 대한 자세한 내용은 드라이버에서 D3cold 지원을 참조하세요.

드라이버는 SetD3ColdSupport 루틴을 호출하여 컴퓨터가 S0에 있을 때 발생할 수 있는 D3cold로의 디바이스 전환을 동적으로 사용하거나 사용하지 않도록 설정합니다. 디바이스가 디바이스가 들어오는 저전력 Dx 상태에서 절전 모드 해제 이벤트를 신호할 수 있어야 하는 경우 디바이스가 D3cold에서 절전 모드 해제 이벤트를 신호할 수 있는 경우에만 디바이스가 D3cold를 입력하도록 설정해야 합니다. 그렇지 않으면 디바이스가 D3cold에 진입한 후 컴퓨터가 S0 상태를 떠날 때까지 사용할 수 없을 수 있습니다.

기본적으로 SetD3ColdSupport 루틴에 대한 첫 번째 호출 전에 D3hot-D3cold 전환은 사용하지 않도록 설정됩니다. 첫 번째 SetD3ColdSupport 호출 전에 D3hot-D3cold 전환을 사용하도록 설정하도록 이 기본값을 변경하려면 디바이스의 드라이버 패키지에 드라이버를 설치하는 INF 파일의 DDInstall.HW 섹션에 다음 두 줄이 포함될 수 있습니다.

Include = machine.inf
Needs = PciD3ColdSupported

GetIdleWakeInfo 루틴을 사용하면 디바이스에서 컴퓨터가 특정 시스템 전원 상태에 있을 때 디바이스가 절전 모드 해제 이벤트를 신호로 표시할 수 있는 디바이스 전원 상태를 검색할 수 있습니다. 이 루틴에 대한 호출자는 시스템 전원 상태를 입력 매개 변수로 지정하고, 출력 매개 변수로서 루틴은 컴퓨터가 지정된 시스템 전원 상태에 있을 때 디바이스가 대기 이벤트를 신호로 표시할 수 있는 가장 낮은 전원 디바이스 전원 상태를 보고합니다. 예를 들어 GetIdleWakeInfo 루틴은 컴퓨터가 S0에 있을 때 디바이스가 D3cold에서 절전 모드 해제 이벤트를 신호로 표시할 수 있는지 여부를 드라이버에 알릴 수 있습니다.

GetIdleWakeInfo 루틴은 IRP_MN_QUERY_CAPABILITIES 요청에서 사용할 수 있는 것보다 더 완전한 디바이스 절전 모드 해제 정보를 제공합니다. 모든 버전의 Windows에서 지원하는 이 요청은 디바이스의 기능을 설명하는 DEVICE_CAPABILITIES 구조를 제공합니다. 이 구조체의 DeviceWake 멤버에는 GetIdleWakeInfo 루틴에서 사용할 수 있는 정보의 하위 집합이 포함되어 있습니다. 이 멤버는 디바이스가 대기 이벤트를 신호로 표시할 수 있는 가장 낮은 전원 디바이스 전원 상태를 나타냅니다. 이 멤버의 정보는 컴퓨터가 구조체의 SystemWake 멤버로 표시되는 시스템 저전력 상태인 경우에만 정확합니다. SystemWake = PowerSystemSleeping3의 경우 DeviceWake의 정보는 S3에 유효한 것으로 알려져 있으며 S1 및 S2에 대해 자주 유효할 수 있으며 S0에도 유효할 수 있습니다.

그러나 모범 사례로, 드라이버는 DeviceWake 메서드의 정보가 SystemWake에 표시된 상태 이외의 시스템 전원 상태에 유효하다고 가정해서는 안 됩니다. 일부 디바이스의 경우 디바이스에서 절전 모드 해제 이벤트를 알릴 수 있는 가장 낮은 Dx 상태는 컴퓨터가 작동 상태 S0인지 아니면 저전력 상태(S1, S2, S3 또는 S4)인지에 따라 달라집니다. 다른 디바이스의 경우 디바이스가 연결된 버스는 컴퓨터가 S0에 있을 때 절전 모드 해제 신호를 처리할 수 있지만 디바이스는 처리할 수 없습니다. GetIdleWakeInfo 루틴만 이러한 디바이스의 디바이스 절전 모드 해제 기능을 정확하게 설명할 수 있습니다.

예를 들어 PCI Express Base 3.0 사양 은 절전 모드 해제 이벤트를 신호하는 두 개의 별도 메커니즘을 정의합니다. 한 메커니즘은 PCI Express 링크(버스)가 켜져 있을 때 사용되고 다른 메커니즘은 링크가 꺼져 있을 때 사용됩니다. 링크가 켜지면 디바이스는 PM_PME TLL(트랜잭션 계층 패킷) 스트림을 전송하여 디바이스가 저전력 Dx 상태에서 D0으로 이동해야 한다는 신호를 보냅니다. 링크가 꺼지면 디바이스에서 PM_PME TOP를 보낼 수 있도록 링크를 켜도록 요청합니다. 링크를 켜도록 요청하기 위해 디바이스는 WAKE# 신호를 어설션하거나(더 일반적인 디바이스 폼 팩터의 경우) "비콘" 메커니즘(덜 일반적)을 사용합니다.

PCI Express 사양을 사용하려면 D3cold에서 PME(전원 관리 이벤트)를 신호하는 기능을 보급하는 모든 디바이스가 이러한 디바이스 절전 모드 해제 메커니즘을 모두 구현해야 하지만 드라이버 개발자는 이러한 메커니즘을 올바르게 구현하지 않는 디바이스를 사용하도록 설정해야 할 수 있습니다.

링크가 켜져 있을 때 디바이스가 PM_PME TOP를 올바르게 제공할 수 있는 경우 컴퓨터가 S0에 있을 때 드라이버에서 D3hot을 입력하도록 설정할 수 있습니다. 디바이스가 WAKE# 신호를 올바르게 어설션하여 링크를 설정한 다음 PM_PME TOP를 사용하여 D0으로의 전환을 시작할 수 있는 경우 드라이버는 컴퓨터가 S0에 있을 때 디바이스에서 D3cold를 입력하도록 설정할 수 있습니다.

그러나 시스템 펌웨어(BIOS)가 PCI Express 디바이스 절전 모드 해제 메커니즘이 하드웨어 플랫폼에서 올바르게 처리되도록 보장할 수 없는 경우 드라이버는 디바이스에서 D3hot 또는 D3cold를 입력하도록 설정해서는 안 됩니다. 드라이버는 GetIdleWakeInfo 루틴을 호출하여 펌웨어가 이러한 메커니즘에 대한 지원을 클레임하는지 여부를 검색할 수 있습니다. 드라이버가 KMDF(Kernel-Mode Driver Framework) 1.11 이상을 사용하는 경우 GetIdleWakeInfo 를 호출하는 편리한 대안은 WdfDeviceAssignS0IdleSettings 메서드를 사용하여 디바이스가 절전 모드 해제 이벤트를 신호로 표시할 수 있는 최하위 Dx 상태에서 디바이스를 유휴 상태로 설정할 수 있도록 하는 것입니다.