Criteri di copia e memorizzazione nella cache dei dati

Un driver miniport WaveCyclic copia i dati audio tra il buffer DMA, a cui accede l'hardware del controller audio HD e il buffer client, a cui accede l'applicazione audio in modalità utente:

  • Per un flusso di dati di riproduzione, il driver copia i dati dal buffer client al buffer DMA.

  • Per un flusso di dati di acquisizione, il driver copia i dati dal buffer DMA al buffer client.

Sia per la riproduzione che per i flussi di acquisizione, il driver può ottenere le migliori prestazioni abilitando la memorizzazione nella cache della memoria del buffer DMA (tipo di cache MmCached) e basandosi sul meccanismo di snooping del controller PCI per garantire la coesistenza della cache. Tuttavia, alcune implementazioni del controller PCI Express non sopprimono i trasferimenti di dati isocroni del controller AUDIO HD, ad esempio il chipset PCI Express iniziale di Intel.

Il driver di funzione non è in grado di rilevare se l'hardware del controller PCI supporta lo snooping dei trasferimenti di buffer DMA o esegue trasferimenti di dati isocroni. Per evitare potenziali problemi di coesistenza della cache, il driver disabilita la memorizzazione nella cache della memoria del buffer DMA specificando il tipo di memorizzazione nella cache per tale memoria come MmWriteCombined. (MmNonCached funzionerebbe anche, ma potrebbe non funzionare anche. Se si scrive un driver di adattatore personalizzato basato sul driver di funzione di esempio, il driver miniport WaveCyclic dovrebbe comportarsi in modo analogo, a meno che non sia possibile verificare che il controller PCI supporti effettivamente lo snooping dei trasferimenti di buffer DMA.

Per supportare dispositivi e sistemi che non eseguono lo snooping del bus, un driver di funzione personalizzato deve seguire queste regole:

  • Per un flusso di riproduzione, specificare il tipo di cache del buffer DMA come MmWriteCombined. Dopo aver copiato un blocco di dati dal buffer client al buffer DMA, chiamare la funzione KeMemoryBarrier per rendere i dati visibili al motore DMA. KeMemoryBarrier scarica i dati copiati in memoria in modo efficiente che lascia le cache dei dati del processore in gran parte indisturbate.

  • Per un flusso di acquisizione, specificare il tipo di cache del buffer DMA come MmWriteCombined o MmNonCached. Inoltre, il driver di funzione deve evitare di scrivere nel buffer DMA. Se deve eseguire l'elaborazione sul posto di campioni audio, deve prima copiare i dati altrove.

Il blocco di dati copiato dal driver di funzione nel buffer DMA non è necessario per iniziare o terminare su un limite del buffer di combinazione di scrittura e le relative dimensioni non devono essere un multiplo delle dimensioni del buffer di combinazione di scrittura (in genere, 32 o 64 byte).

Per i driver di funzione codec che usano la versione HDAUDIO_BUS_INTERFACE_BDL di DDI, la routine AllocateContiguousDmaBuffer esegue sia l'allocazione che il mapping della memoria del buffer DMA. La routine imposta sempre il tipo di cache del buffer su MmWriteCombined.

Per altre informazioni sulla combinazione di scrittura, vedere IA-32 Intel Architecture Software Developer's Manual nel sito Web Intel .