Zweck
Führt eine plattformspezifische DMA-Zuordnung für eine Liste virtueller Adressen aus
Syntax
#include <sys/dma.h>
int d_map_list (*handle, flags, minxfer, *virt_list, *bus_list)
struct d_handle *handle;
int flags;
int minxfer;
struct dio *virt_list;
struct dio *bus_list;
Anmerkung: Im Folgenden finden Sie die Schnittstellendefinition für 'd_map_list' , wenn die Flags DMA_ADDRESS_64 und DMA_ENABLE_64 im Aufruf D_map_init gesetzt sind.
int d_map_list (*handle, flags, minxfer, *virt_list, *bus_list)
struct d_handle *handle;
int flags;
int minxfer;
struct dio_64 *virt_list;
struct dio_64 *bus_list;
Parameter
| Element |
Beschreibung |
| Handle |
Gibt die vom D_map_init -Kernelservice zurückgegebene eindeutige Kennung an. |
| Flags |
Gibt eines der folgenden Flags an:
- DMA_AD
- Übertragungen von einer Einheit in den Speicher.
- BUS_DMA-Speichertyp
- Übertragungen von einer Einheit zu einer anderen Einheit.
- DMA_UMGEHUNG
- Überprüfen Sie den Seitenzugriff nicht.
- DMA_STMAP
- Zeigt eine kurzfristige Zuordnung an.
|
| Minxfer |
Gibt die Mindestübertragungsgröße für die Einheit an |
| Virtuelle Liste |
Gibt eine Liste mit Adressen und Längen virtueller Puffer an. |
| Busliste |
Gibt eine Liste mit Busadressen und Buslängen an |
Beschreibung
Der Kernel-Service 'd_map_list' ist eine busspezifische Dienstprogrammroutine, die vom D_map_init -Kernel-Service bestimmt wird und eine Liste virtueller Adressen und Größen akzeptiert und die resultierende Liste von Busadressen bereitstellt. Dieser Service füllt die entsprechende Busadressliste für die Verwendung durch die Einheit bei der DMA-Übertragung aus. Dieser Service ermöglicht die Scatter/Gather-Funktionalität einer Einheit und ermöglicht es der Einheit, mehrere Anforderungen zu kombinieren, die in Bezug auf die Einheit zusammenhängend sind. Die Listen werden über die Struktur Dio übergeben. Wenn der 'd_map_list' -Service die Zuordnung nicht abschließen kann, weil die Kapazität der bereitgestellten Dio -Struktur erschöpft ist, wird der Fehler DMA_DIOFULL zurückgegeben. Wenn der 'd_map_list' -Service die Zuordnung aufgrund erschöpfender Ressourcen, die für die Zuordnung erforderlich sind, nicht abschließen kann, wird der Fehler DMA_ANZ zurückgegeben. In beiden Fällen wird das Feld bytes_fertig der virtuellen Dio -Liste auf die Anzahl der erfolgreich zugeordneten Byte gesetzt. Dieser Bytezähler ist ein Vielfaches der Minxfer -Größe für die Einheit, wie im Aufruf an 'd_map_list'angegeben. Das Feld resid_iov wird auf den Index der übrigen _iovec -Felder in der Liste gesetzt. Wenn das Flag DMA_UMGEHUNG nicht gesetzt ist, überprüft dieser Service die Zugriffsberechtigungen für alle Seiten. Wenn auf einer Seite mit der Liste ein Zugriffsverstoß festgestellt wird, wird der Fehler DMA_NOACC zurückgegeben und das Feld bytes_fertig wird auf die Anzahl Byte vor der fehlerhaften Iovecgesetzt. Wenn die Zuordnung kurzfristig erfolgt (d. h., die Zuordnung wird aufgehoben, sobald die Ein-/Ausgabe abgeschlossen ist), müssen Sie das Flag DMA_STMAP setzen.
Hinweis:
- Wenn der Rückgabewert DMA_NOACC empfangen wird, erfolgt keine Zuordnung und die Busliste ist nicht definiert. In diesem Fall wird das Feld resid_iov auf den Index der _iovec gesetzt, bei der der Zugriffsverstoß aufgetreten ist.
- Sie können das Makro D_MAP_LIST verwenden, das in der Datei /usr/include/sys/dma.h bereitgestellt wird, um Aufrufe des Kernel-Service d_map_list zu codieren.
Rückgabewerte
| Element |
Beschreibung |
| DMA_ANZ |
Gibt an, dass die Ressourcen während der Zuordnung ausgeschöpft waren. |
Anmerkung: 'd_map_list' mögliche partielle Übertragung wurde zugeordnet. Der Einheitentreiber kann die partielle Übertragung fortsetzen und den Rest bei einem nachfolgenden 'd_map_list' -Aufruf übergeben oder 'd_unmap_list' aufrufen, um die partielle Zuordnung rückgängig zu machen. Wenn eine Teilübertragung ausgegeben wird, muss der Treiber 'd_unmap_list' aufrufen, wenn die Ein-/Ausgabe abgeschlossen ist.
| Element |
Beschreibung |
| DMA_DIOFULL |
Gibt an, dass die Zielbusliste voll ist. |
Anmerkung: 'd_map_list' mögliche partielle Übertragung wurde zugeordnet. Der Einheitentreiber kann die partielle Übertragung fortsetzen und den Rest bei einem nachfolgenden 'd_map_list' -Aufruf übergeben oder 'd_unmap_list' aufrufen, um die partielle Zuordnung rückgängig zu machen. Wenn eine Teilübertragung ausgegeben wird, muss der Treiber 'd_unmap_list' aufrufen, wenn die Ein-/Ausgabe abgeschlossen ist.
| Element |
Beschreibung |
| DMA_NOACC |
Gibt keine Zugriffsberechtigung für eine Seite in der Liste an. |
.
Anmerkung: 'd_map_list' Es wurde keine Zuordnung durchgeführt. Es ist nicht erforderlich, dass der Einheitentreiber 'd_unmap_list'aufruft, aber der Treiber muss die fehlerhafte E/A-Anforderung fehlschlagen und den Rest in einem nachfolgenden 'd_map_list' -Aufruf erneut übergeben.
| Element |
Beschreibung |
| DMA_SUMME |
Gibt an, dass die gesamte Übertragung erfolgreich zugeordnet wurde. |
Anmerkung: 'd_map_list' wurde erfolgreich zugeordnet. Der Einheitentreiber muss 'd_unmap_list' aufrufen, wenn die Ein-/Ausgabe abgeschlossen ist. Bei einer Langzeitzuordnung muss der Treiber 'd_unmap_list' aufrufen, wenn die Langzeitzuordnung nicht mehr erforderlich ist.