Uso dell'interfaccia driver GUID_D3COLD_SUPPORT_INTERFACE

A partire da Windows 8, i driver possono chiamare le routine nell'interfaccia GUID_D3COLD_SUPPORT_INTERFACE per determinare le funzionalità D3cold dei dispositivi e consentire a questi dispositivi di usare D3cold. Le due routine primarie in questa interfaccia sono SetD3ColdSupport e GetIdleWakeInfo.

L'interfaccia del driver di GUID_D3COLD_SUPPORT_INTERFACE fornisce supporto per lo stato secondario D3cold dello stato di alimentazione del dispositivo D3. D3 è diviso in due sottostate, D3hot e D3cold. D3 è lo stato di alimentazione del dispositivo più basso e D3cold usa meno potenza di D3hot. Un dispositivo può immettere D3cold solo se il dispositivo, il driver del bus padre e il firmware della piattaforma supportano questo stato. Un dispositivo che supporta D3cold può immettere e uscire da questo stato quando il computer si trova nello stato di alimentazione del sistema S0 (funzionante).

Il driver che è il proprietario di power policy (PPO) per il dispositivo chiama le routine in questa interfaccia per eseguire le operazioni seguenti:

  • Individuare se il dispositivo, il driver del bus padre e il firmware della piattaforma supportano le transizioni alla sottostate D3cold.
  • Individuare se il dispositivo può segnalare un evento di riattivazione al processore quando il dispositivo si trova nella sottostate D3cold.
  • Abilitare e disabilitare le transizioni alla sottostate D3cold dal dispositivo.

Per eseguire una query per questa interfaccia, un driver di dispositivo invia un IRP_MN_QUERY_INTERFACE IRP verso il basso dello stack di driver. Per questa IRP, il driver imposta il parametro di input InterfaceType su GUID_D3COLD_SUPPORT_INTERFACE. Al termine del completamento dell'IRP, il parametro di output dell'interfaccia è un puntatore a una struttura D3COLD_SUPPORT_INTERFACE. Questa struttura contiene puntatori alle routine nell'interfaccia.

Per altre informazioni sullo stato di alimentazione del dispositivo D3cold, vedere Supporto D3cold in un driver.

Un driver chiama la routine SetD3ColdSupport per abilitare e disabilitare dinamicamente le transizioni di un dispositivo a D3cold che possono verificarsi quando il computer è in S0. Se il dispositivo deve essere in grado di segnalare un evento di riattivazione da qualsiasi stato Dx a bassa potenza immesso dal dispositivo, il driver deve consentire al dispositivo di immettere D3cold solo se il dispositivo può segnalare eventi di riattivazione da D3cold. In caso contrario, dopo che il dispositivo entra in D3cold, potrebbe non essere disponibile fino a quando il computer non lascia lo stato S0.

Per impostazione predefinita, prima della prima chiamata alla routine SetD3ColdSupport, le transizioni D3hot-to-D3cold sono disabilitate. Per modificare questa impostazione predefinita in modo che le transizioni D3hot-to-D3coldd siano abilitate prima della prima chiamata SetD3ColdSupport , il pacchetto driver per il dispositivo può includere le due righe seguenti nella sezione DDInstall.HW del file INF che installa il driver:

Include = machine.inf
Needs = PciD3ColdSupported

La routine GetIdleWakeInfo consente al driver di un dispositivo di individuare gli stati di alimentazione del dispositivo da cui il dispositivo può segnalare un evento di riattivazione quando il computer si trova in un determinato stato di alimentazione del sistema. Il chiamante a questa routine specifica uno stato di alimentazione del sistema come parametro di input e, come parametro di output, la routine segnala lo stato di alimentazione del dispositivo più basso da cui il dispositivo può segnalare un evento di attesa quando il computer si trova nello stato di alimentazione del sistema specificato. Ad esempio, la routine GetIdleWakeInfo può indicare al driver se il dispositivo può segnalare un evento di riattivazione da D3cold quando il computer è in S0.

La routine GetIdleWakeInfo fornisce informazioni di riattivazione del dispositivo più complete rispetto a quelle disponibili dalla richiesta di IRP_MN_QUERY_CAPABILITIES . Questa richiesta, che tutte le versioni del supporto di Windows, forniscono una struttura DEVICE_CAPABILITIES che descrive le funzionalità di un dispositivo. Il membro DeviceWake di questa struttura contiene un subset delle informazioni disponibili dalla routine GetIdleWakeInfo . Questo membro indica lo stato di alimentazione del dispositivo più basso da cui un dispositivo può segnalare un evento di attesa. Le informazioni in questo membro sono garantite per essere accurate solo se il computer si trova nello stato di bassa potenza del sistema indicato dal membro SystemWake della struttura. Se SystemWakePowerSystemSleeping3, le informazioni in DeviceWake = sono note per essere valide per S3, potrebbero essere spesso valide per S1 e S2 e potrebbero anche essere valide per S0.

Tuttavia, come procedura consigliata, un driver non deve presupporre che le informazioni nel metodo DeviceWake siano valide per qualsiasi stato di alimentazione del sistema diverso dallo stato indicato da SystemWake. Per alcuni dispositivi, lo stato dx più basso da cui un dispositivo può segnalare un evento di riattivazione varia in base al fatto che il computer si trova nello stato di lavoro S0 o in uno stato di bassa potenza (S1, S2, S3 o S4). Per altri dispositivi, gli autobus a cui i dispositivi sono connessi possono gestire i segnali di riattivazione quando il computer è in S0, ma i dispositivi non possono. Solo la routine GetIdleWakeInfo può descrivere accuratamente le funzionalità di riattivazione del dispositivo di questi dispositivi.

Ad esempio, la specifica PCI Express Base 3.0 definisce due meccanismi separati per segnalare gli eventi di riattivazione, un meccanismo viene usato quando viene attivato il collegamento PCI Express (bus) e l'altro viene usato quando il collegamento viene disattivato. Quando il collegamento viene attivato, il dispositivo invia un flusso di pacchetti a livello di transazione (TLP) di PM_PME per segnalare che il dispositivo deve passare da uno stato Dx a basso risparmio energia a D0. Quando il collegamento viene disattivato, il dispositivo richiede che il collegamento venga attivato in modo che il dispositivo possa inviare PM_PME TLP. Per richiedere che il collegamento sia attivato, il dispositivo asserisce il segnale WAKE# (per il fattore di forma del dispositivo più comune) o usa il meccanismo "beaconing" (meno comune).

La specifica PCI Express richiede che tutti i dispositivi che annunciano la possibilità di segnalare eventi di gestione energia da D3cold implementano entrambi questi meccanismi di riattivazione del dispositivo, ma uno sviluppatore di driver potrebbe dover abilitare un dispositivo che non implementa correttamente questi meccanismi.

Se il dispositivo può recapitare correttamente PM_PME TLP quando il collegamento viene attivato, il driver può abilitare il dispositivo per immettere D3hot quando il computer è in S0. Se il dispositivo può affermare correttamente il segnale WAKE# per attivare il collegamento e quindi usare PM_PME TLP per avviare la transizione a D0, il driver può abilitare il dispositivo per immettere D3cold quando il computer è in S0.

Tuttavia, il driver non deve abilitare il dispositivo per immettere D3hot o D3cold se il firmware di sistema (bios) non può garantire che i meccanismi di riattivazione del dispositivo PCI Express siano gestiti correttamente dalla piattaforma hardware. Un driver può chiamare la routine GetIdleWakeInfo per individuare se le attestazioni del firmware supportano questi meccanismi. Se un driver usa Kernel-Mode Driver Framework (KMDF) 1.11 o versione successiva, un'alternativa pratica alla chiamata a GetIdleWakeInfo consiste nell'consentire al metodo WdfDeviceAssignS0IdleSettings di abilitare il dispositivo a inattività nello stato Dx con alimentazione minima da cui il dispositivo può segnalare un evento di riattivazione.