2016-03-21 5 views
1

Ich versuche, einen zusammenhängenden Speicher zu verwenden, den ich reserviert habe, während ich beim Booten den Parameter "mem" an Linux übergebe.Reservieren von Speicher für DMA-Verwendung

Jetzt habe ich die physikalische Adresse dieses Speicherplatzes, den ich zuvor reserviert habe, und die Länge davon, und ich möchte diesen reservierten Platz für DMA-Zwecke in meinem Treiber nutzen.

Normalerweise würde ich dma_alloc_coherent() verwenden, und wenn ich CMA verwenden würde, würde ich das auch verwenden, aber in diesem Fall ist es anders.

Nun habe ich gelesen, dass ein akzeptabler Weg, um einen physischen Raum des Abbildens virtuellen Raum auf Kernel ist ioremap

Und eine akzeptable Art und Weise der „Übernahme“ einen zusammenhängenden Raum für DMA-Zwecke zu verwenden ist dma_map_single zu verwenden (Zuordnung für Busadresse)

Ich habe Probleme, die beiden zu kombinieren. ioremap funktioniert und gibt eine virtuelle Adresse zurück. Nun, ich habe gelesen, dass dies keine gewöhnliche virtuelle Adresse ist und ich nur Zugriffsmethoden verwenden sollte, um aus diesem Speicher zu lesen/schreiben.

Das ist, wenn ich versuche, diese virtuelle Adresse an dma_map_single übergeben, meldet es keinen Fehler, aber ich vermute, dass dies falsch ist.

Bin ich es richtig? Was kann ich tun, damit es so funktioniert, wie es sollte?

10x

+0

Ich bin zu faul zu suchen, aber auf dieser Website passiert diese Frage einmal pro Jahr. – 0andriy

+0

Danke. Vielleicht bin ich nicht geschickt in der Suche, aber ich habe verschiedene Varianten gesucht und gefunden, aber nicht meinen Fall. –

Antwort

2

Sie richtig machen Sie brauchen nicht um den Speicher zu reservieren, da Sie es bereits auf Booten festgelegt, aber Sie müssen dam_map_single verwenden Cache-Probleme zum Beispiel zu verhindern, wenn Sie einen DMA tun wollen vom Speicher zum Gerät, aber der RAM ist nicht mit dem L2-Cache synchronisiert (der Cache hat eine neuere Version) Sie erhalten die falschen Daten, so müssen Sie vor und nach der DMA-Operation zuordnen und unmappen

+0

Danke. Ich war nicht sicher, dma_map_single die richtige Adresse zu übergeben. –

+0

@Liran Es tut uns leid, den Thread zu hacken, aber Memory-Mapping mit ioremap erstellt wird nicht zwischengespeichert. Kann es direkt an ein Gerät für die dma weitergegeben werden? – shunty

+0

Wenn Sie von einem io-Speicher auf andere kopieren, ist es in Ordnung, aber die meiste Zeit kopieren Sie von DDR zu Gerät (oder umgekehrt) und die DDR kann zwischengespeichert werden –

Verwandte Themen