Implementare il ribilanciamento PnP per i driver audio PortCls

Il ribilanciamento PnP viene usato in determinati scenari PCI in cui le risorse di memoria devono essere riallocate.

Il ribilanciamento può essere attivato in due scenari principali:

  1. Hotplug PCI: un utente collega un dispositivo e il bus PCI non dispone di risorse sufficienti per caricare il driver per il nuovo dispositivo. Alcuni esempi di dispositivi che rientrano in questa categoria includono l'Archiviazione Unicode, USB-C e NVME. In questo scenario le risorse di memoria devono essere riorganizzato e consolidato (ribilanciato) per supportare l'aggiunta di altri dispositivi.
  2. BAR ridimensionabili pci: dopo che un driver per un dispositivo è stato caricato correttamente in memoria, richiede risorse aggiuntive. Alcuni esempi di dispositivi includono schede grafiche e dispositivi di archiviazione di fascia alta. Per altre informazioni sul supporto dei driver video, vedere Supporto bar ridimensionabile. Questo argomento descrive le operazioni da eseguire per implementare il ribilanciamento PnP per i driver audio PortCls.

Il ribilanciamento PnP è disponibile in Windows 10, versione 1511 e versioni successive di Windows.

Requisiti di ribilanciamento

I driver audio portcls possono supportare il ribilanciamento se vengono soddisfatte le condizioni seguenti:

Per supportare il ribilanciamento quando sono presenti flussi audio attivi, i driver audio portcls devono soddisfare uno di questi due requisiti aggiuntivi.

OPPURE

Comportamento del flusso audio quando si verifica il ribilanciamento

Se viene attivato il ribilanciamento, quando sono presenti flussi audio attivi e il driver supporta il ribilanciamento per i flussi audio attivi, tutti i flussi audio attivi verranno arrestati e non verranno riavviati automaticamente.

Interfaccia COM IPortClsPnp

IPortClsPnp è l'interfaccia di gestione PnP esposta dal driver della classe di porta (PortCls) all'adattatore.

IPortClsPnp eredita da IUnknown e supporta anche i metodi seguenti:

I driver miniport audio possono registrare un'interfaccia di notifica PNP usando le esportazioni portcls o tramite l'interfaccia COM IPortClsPnp esposta sull'oggetto porta WaveRT. Usare IPortClsPnp::RegisterAdapterPnpManagement e IPortClsPnp::UnregisterAdapterPnpManagement per registrare e annullare la registrazione.

Required PortCls Export DDIs

IAdapterPnpManagement è un'interfaccia che gli adapter devono implementare e registrare se vogliono ricevere messaggi di gestione PnP. Registrare questa interfaccia con PortCls usando PcRegisterAdapterPnpManagement. Annullare la registrazione di questa interfaccia con PortCls usando PcUnregisterAdapterPnpManagement.

DDI driver necessari

Per supportare il ribilanciamento, è necessario implementare le DDI IAdapterPnpManagement seguenti.

  • IAdapterPnpManagement::GetSupportedRebalanceType viene chiamato da Portcls durante l'elaborazione di QueryStop. Il miniport restituisce il tipo di ribilanciamento supportato come definito nell'enumerazione PC_REBALANCE_TYPE .

    Nota Portcls acquisisce il blocco globale del dispositivo prima di effettuare questa chiamata, quindi il miniport deve eseguire questa chiamata il più velocemente possibile.

  • IAdapterPnpManagement::P npQueryStop viene richiamato da portcls poco prima di avere esito positivo su QueryStop IRP. Si tratta solo di una notifica e la chiamata non restituisce un valore.

    Nota Portcls acquisisce il blocco globale del dispositivo prima di effettuare questa chiamata, quindi il miniport deve eseguire questa chiamata il più velocemente possibile. Mentre stop è in sospeso, Portcls bloccherà (contenere) le nuove richieste di creazione.

  • IAdapterPnpManagement::P npCancelStop viene richiamato da portcls durante l'elaborazione di CanceStop IRP. Questa è solo una notifica. È possibile che il miniport riceva PnpCancelStop anche senza ricevere in precedenza una notifica PnpQueryStop. Il miniport deve essere scritto per supportare questo comportamento. Ad esempio, questo è il caso in cui la logica QueryStop ha esito negativo su IRP prima che Portcls abbia la possibilità di inoltrare questa notifica al miniport. In questo scenario il gestore PnP richiama ancora un arresto annulla PnP.

    Nota Portcls acquisisce il blocco globale del dispositivo prima di effettuare questa chiamata, quindi il miniport deve eseguire questa chiamata il più velocemente possibile. Mentre stop è in sospeso, Portcls bloccherà (contenere) le nuove richieste di creazione. PortCls riavvia tutte le richieste create con penna quando viene annullata un'interruzione in sospeso.

  • IAdapterPnpManagement::P npStop viene richiamato da Portcls dopo l'arresto di tutte le operazioni Ioctl e lo spostamento dei flussi attivi dallo stato [run|pause|acquire] allo stato [stop]. Questa chiamata non viene effettuata mantenendo il blocco globale del dispositivo. Il miniport ha quindi l'opportunità di attendere le operazioni asincrone (elementi di lavoro, dpc, thread asincroni) e annullare la registrazione dei relativi sottodispositivi audio. Prima di tornare da questa chiamata, il miniport deve assicurarsi che tutte le risorse h/w siano state rilasciate.

    Nota Il miniport non deve attendere l'eliminazione degli oggetti miniport/stream correnti perché non è chiaro quando i client audio esistenti rilasciano gli handle correnti. Il thread PnpStop non può bloccarsi per sempre senza arrestare il sistema, ad esempio un thread PnP/Power.

IMiniportPnpNotify

IMiniportPnpNotify è un'interfaccia facoltativa per consentire agli oggetti miniport (sottodispositivi audio) di ricevere notifiche di modifica dello stato PnP.

I miniport hanno l'opportunità di ricevere una notifica di arresto PnP per ogni sottodispositivo audio registrato. Per ricevere questa notifica, il dispositivo secondario deve supportare IMiniportPnpNotify. In questa interfaccia viene definita solo la notifica IMiniportPnpNotify::P npStop.

L'interfaccia IMiniportPnpNotify è disponibile sia in WaveRT che nella topologia.

Nota Poiché Portcls acquisisce il blocco globale del dispositivo prima di effettuare questa chiamata, il miniport deve eseguire questa chiamata il più velocemente possibile. Il miniport non deve attendere altre attività durante l'elaborazione di questa chiamata per evitare deadlock quando altri thread/elementi di lavoro sono in attesa del blocco globale del dispositivo. Se necessario, il miniport può attendere nella chiamata IAdapterPnpManagement::P npStop.