Forum: FPGA, VHDL & Co. Windows 8, PCIe, DMA mit oder ohne Scatter Gather?


von Sebastian (Gast)


Lesenswert?

Hallo ihr,

ich hab eine Frage zu Scatter Gather DMA in Verbindung mit PCIe und 
Windows 8 64Bit.

Ich reserviere mir zwei Bereiche im Speicher. Einmal 4MByte und einmal 
1MByte. Nach aktueller Überlegung ist alles an einem Stück, d.h. ich 
bräuchte kein Scatter/Gather. Als Betriebssystem will ich Windows 8.1 
mit 64Bit verwenden.

Ich würde am liebsten ohne Scatter/Gather arbeiten, da ich zum einen den 
Implementierungsaufwand in den FPGA scheue und zum anderen die IP-Core 
Kosten...

Meine Überlegung ist die, 4MByte RAM sind von den möglichen 8GByte 
Arbeitsspeicher ja sehr überschaubar und sollten ja immer am Stück 
verfügbar sein. Aber bestimmt sagen kann ich das leider nicht.

Vielleicht habt ihr ein besseres Gefühl dafür. Was meint ihr? Lohnt sich 
der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"?


Vielen Dank,
Seb

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:

>
> Vielleicht habt ihr ein besseres Gefühl dafür. Was meint ihr? Lohnt sich
> der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"?
>

Pflicht ist es nicht, und IMO lohnt tut es sich nur bei sehr hohen 
Datenraten. (Gen 2/3 x8)

SGDMA ist nicht ohne, da man auch mit unaligned Buffern umgehen muss, es 
bei PCIe die EInschränkung gibt dass ein einzelner DMA Transfer nicht 
eine 4k Grenze passieren darf, und nich mehr Keinigkeiten. Und um auf 
Speed zu kommen, muss man grosse Transfer machen., sonst geht die 
Bandbreite im Overhead unter.

Auch auf der Treiberseite ist SGDMA auch viel aufwendiger als Common 
Buffer DMA.

Ein aligned Buffer von 4 MB sind normalerweise kein Problem wenn du den 
schon beim Initialsieren der Karte allozierst, also nicht etwa erst bei 
Bedarf.

Dein grösstes Problem ist aber Windows 8.1 64bit. Das akzeptiert keine 
unsignierte Treiber, und self signed nur im eingeschränkten 
Debug/Testmode.
32bit Windows lädt auch unsignierte.

von Markus F. (mfro)


Lesenswert?

Sebastian schrieb:
> Was meint ihr? Lohnt sich
> der Aufwand für Scatter/Gather oder ist es gar eine "Pflicht"?

Gehen wird das wahrscheinlich auch ohne.

Schau' dir mal diese Seite: 
http://msdn.microsoft.com/en-us/library/windows/hardware/ff554460%28v=vs.85%29.aspx 
.

Den Aufruf wirst Du wohl in einem Treiber ohne Scatter/Gather brauchen). 
Insbesondere der Abschnitt "Remarks" dürfte für dich interessant sein.

Wenn der Treiber beim Systemstart geladen wird und seinen Speicher nicht 
irgendwannmal wieder hergibt, dürften die 4 MByte in den meisten Fällen 
verfügbar sein.

Nur: sicher sagen kann das wohl keiner, möglicherweise haben ja auch 
andere Hardware-/Treiberhersteller (deren Treiber - warum auch immer - 
vor deinem geladen werden) keine Lust, das richtig zu machen...

Letztendlich läuft es auf genau drei Fragen raus:

Was kosten bei Euch zwanzig Hotlinecalls?
Was ist Euch eure Reputation als verlässlicher Lieferant wert?
Was schätzt Du an zusätzlichem Aufwand?

von Christian R. (supachris)


Lesenswert?

Lattice User schrieb:
> Dein grösstes Problem ist aber Windows 8.1 64bit. Das akzeptiert keine
> unsignierte Treiber, und self signed nur im eingeschränkten
> Debug/Testmode.
> 32bit Windows lädt auch unsignierte.

Naja, solange das kein WHQL Treiber werden soll, reicht ja selber 
signieren, das Code Signing Zertifikat von z.B. GlobalSign kostet ja 
nicht die Welt. Gibt auch noch günstigere, soweit ich weiß. Selbst Boot 
Start Drivers lassen sich mit dem Cross Signing Certificate im KMCS 
Modus damit signieren, ist zwar etwas aufwendiger, aber geht. Wer PCIe 
macht, macht ja sicher ein professionelles Produkt, da muss das Geld für 
eine Signatur auch da sein.

von Lattice User (Gast)


Lesenswert?

Christian R. schrieb:
>
> Naja, solange das kein WHQL Treiber werden soll, reicht ja selber
> signieren, das Code Signing Zertifikat von z.B. GlobalSign kostet ja
> nicht die Welt. Gibt auch noch günstigere, soweit ich weiß. Selbst Boot
> Start Drivers lassen sich mit dem Cross Signing Certificate im KMCS
> Modus damit signieren, ist zwar etwas aufwendiger, aber geht.

Das ist richtig, aber GlobalSign und Co haben sich gegenüber Microsoft 
verpflichtet den Antragsteller zu verifizieren. Als Privatmensch wohl 
nicht machbar, zumindesten mit viel Aufwand verbunden. ca 200€/Jahr ist 
da kleinste Hinderniss.


> Wer PCIe
> macht, macht ja sicher ein professionelles Produkt, da muss das Geld für
> eine Signatur auch da sein.

Da wäre ich mir nicht so sicher.

von Christian R. (supachris)


Lesenswert?

Privat ist kein Problem bei GlobalSign, ist einfach mit Ausweiskopie. 
Unser Fraunhofer Institut da zu verifizieren war eine echte 
Herausforderung, denn die Institute sind rechtlich nicht eigenständig. 
Da ging das Zertifikat nur für die Fraunhofer Gesellschaft und ein 
Vorstand musste unterschreiben.

von Sebastian (Gast)


Lesenswert?

Danke für eure Antworten.
Mit der Lizensierung sehe ich bislang keine Problem. Mir ging es rein um 
das Scatter/Gather verfahren.

Da unsere Boards nur in bekannter Hardware eingebaut werden, versuche 
ich es jetzt erstmal ohne das Scatter/Gather.

@Markus F.: Danke auch für den guten Link.

Gruß,
Seb

von Sebastian (Gast)


Lesenswert?

Meinte natürlich Signierung nicht Lizensierung.
Sorry.

von Lattice User (Gast)


Lesenswert?

Keleiner Hinweis:

Zu Allozieren des Buffers solltest du keinesfalls 
"MmAllocateContiguousMemory" direkt aufrufen, sondern folgende Routine 
verwenden:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff540575%28v=vs.85%29.aspx

von Sebastian (Gast)


Lesenswert?

danke für den tipp

von Sebastian (Gast)


Lesenswert?

Es läuft recht gut. Ich verwende nun Windows 8.1 64Bit und ich kann über 
PCIe mit der Karte (Lattice FPGA) sprechen.
Was mir aber noch nicht ganz einleuchtet ist,...
- ich verwende aktuelle zwei 32Bit BARs (non-prefetchable)
- im Treiber habe ich ".Dma64BitAddresses = TRUE;" gesetzt
...und die Kombination funktioniert. Jupi :-)

Übersetze ich den FPGA IP-Core mit 64Bit Bars bekomme ich keine 
Kommunikation hin.

Nun meine Fragen:
- Sollte ich bei einem 64Bit Betriebssystem auch 64Bit BARs verwenden 
oder sind das zwei Paar Stiefel?
- Ich hab mal gelesen, dass bei 64Bit BARs nur prefetchable memory Sinn 
macht. Ist dem so?

Gruß,
Seb

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:
> Es läuft recht gut. Ich verwende nun Windows 8.1 64Bit und ich kann über
> PCIe mit der Karte (Lattice FPGA) sprechen.
> Was mir aber noch nicht ganz einleuchtet ist,...
> - ich verwende aktuelle zwei 32Bit BARs (non-prefetchable)
> - im Treiber habe ich ".Dma64BitAddresses = TRUE;" gesetzt
> ...und die Kombination funktioniert. Jupi :-)
>
> Übersetze ich den FPGA IP-Core mit 64Bit Bars bekomme ich keine
> Kommunikation hin.

Eine 64 Bit BAR belegt jeweils BAR Register:
z.B. für eine 64 kB grosse BAR sieht es so aus:
Bar0 : FFFF0004
Bar1 : FFFFFFFF

Eine 2. Bar wäre dann Bar2 + Bar3.

>
> Nun meine Fragen:
> - Sollte ich bei einem 64Bit Betriebssystem auch 64Bit BARs verwenden
> oder sind das zwei Paar Stiefel?
> - Ich hab mal gelesen, dass bei 64Bit BARs nur prefetchable memory Sinn
> macht. Ist dem so?

Jein
Da spielt PCI legacy rein, eigentlich ist bei PCIe diese Einscnränkung 
nicht mehr nötig, da eine PCIe Bridge nicht mehr raten muss wieviele 
DWORDs ein Lesezugriff anfordert.
(Hat damit zu tun wie bei PCI Bursts funktionieren)

von Sebastian (Gast)


Lesenswert?

Hallo LatticeUser,

danke für deine Antwort.
Wenn ich dich richtig verstehe, dann ist es für ein 64Bit Betriebssystem 
egal ob eine 32Bit BAR oder 64Bit BAR verwendet wird.

Ist es auch für ein 32Bit Betriebssystem egal?
Heißt eine 32Bit BAR auch gleichzeitig, dass der allozierte 
Speicherbereich nur im "unteren" Arbeitsspeicherbereich sich wieder 
findet?

Gruß und einen schönen Abend,
Seb

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:

> Ist es auch für ein 32Bit Betriebssystem egal?

Ist auch egal.
Falls ein BIOS die Möglichkeit hat, die BAR jenseits von 4 Gbyte 
anzulegen (gilt auch für prefechable BARs) muss es entweder eine 
Einstllung anbieten, oder das 32bit OS muss damit zurande kommen. (z.B. 
die BAr neu setzen).

> Heißt eine 32Bit BAR auch gleichzeitig, dass der allozierte
> Speicherbereich nur im "unteren" Arbeitsspeicherbereich sich wieder
> findet?

Nein, DMA hat mit der BAR nichts zu tun. Du gibst bei IoGetDmaAdapter an 
ob 64Bit DMA kannst.

http://msdn.microsoft.com/en-us/library/windows/hardware/ff543107%28v=vs.85%29.aspx

Wenn du nur 32bit unterstüzten willst, gibt es bei 32bit Windows mit PAE 
Support (z.B. Windows 2000 Server) u.U. Probleme, da dann noch 
Translationsregisters alloziert werden müssen.

von Sebastian (Gast)


Lesenswert?

@LatticeUser: Danke für deine Hilfe
Gruß, Seb

von Sebastian (Gast)


Lesenswert?

Guten Morgen,

ich bin nochmal über eine Frage gestolpert, welche ich mir noch nicht 
beantworten kann.
Folgende Aussage steht im Raum:
Wenn ich den Treiber ohne Scatter Gather benutze, dann wird der 
Speicherbereich im "Kernel-Space" verwendet. Wenn der Treiber Scatter 
Gather benutzt, dann wird der Speicherbereich im "User-Space" 
abgebildet. Für Applikationen im Betriebssystem sei es nur sauber, wenn 
der "User-Space" verwendet wird. Zugriffe auf den "Kernel-Space" seinen 
tunlichst zu vermeiden.

Stimmt die Aussage so? Oder ist es möglich auch ohne Scatter Gather den 
Adressbreich in den User-Space zu mappen?

Danke,
Seb

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:
> Guten Morgen,
>
> ich bin nochmal über eine Frage gestolpert, welche ich mir noch nicht
> beantworten kann.
> Folgende Aussage steht im Raum:
> Wenn ich den Treiber ohne Scatter Gather benutze, dann wird der
> Speicherbereich im "Kernel-Space" verwendet. Wenn der Treiber Scatter
> Gather benutzt, dann wird der Speicherbereich im "User-Space"
> abgebildet. Für Applikationen im Betriebssystem sei es nur sauber, wenn
> der "User-Space" verwendet wird. Zugriffe auf den "Kernel-Space" seinen
> tunlichst zu vermeiden.
>
> Stimmt die Aussage so? Oder ist es möglich auch ohne Scatter Gather den
> Adressbreich in den User-Space zu mappen?

Ja kann man, würde ich aber nicht.
Ich verwende eine Ringbuffer Struktur im Kernel, aus dem dann die 
Applikation mit IOctls (oder read/write) liest, bzw schreibt.

von Sebastian (Gast)


Lesenswert?

Lattice User schrieb:
> Ja kann man, würde ich aber nicht.

Hallo Lattice User, danke für die Antwort.

Ist das (ohne Scatter Gather) auch mit Windows 8 bzw. Windows 10 
möglich?

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:

>
> Ist das (ohne Scatter Gather) auch mit Windows 8 bzw. Windows 10
> möglich?

Selbstverständlich ist das möglich.

von Sebastian (Gast)


Lesenswert?

Lattice User schrieb:
> Selbstverständlich ist das möglich.

Danke für die klare Aussage.

Gruß und schönen Abend,
Seb

von Sebastian (Gast)


Lesenswert?

Ich hab nun einen Treiber ohne Scatter Gather. Er funktioniert sehr gut.
Jedoch habe ich folgendes Problem:
- Hibernate Modus: funktioniert
- Sleep Modus: funktioniert nicht (meine Software liest nur FFFFF... aus 
dem Arbeitsspeicher)

Ich hab bisher keine Ahnung woran das liegen kann bzw. was der 
Unterschied für den Treiber zwischen Hibernate und Sleep ist.

Vielleicht hat jemand einen Tipp für mich wo ich suchen könnte.

Vielen Dank,
Seb.

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:
> Ich hab nun einen Treiber ohne Scatter Gather. Er funktioniert sehr gut.
> Jedoch habe ich folgendes Problem:
> - Hibernate Modus: funktioniert
> - Sleep Modus: funktioniert nicht (meine Software liest nur FFFFF... aus
> dem Arbeitsspeicher)
>
> Ich hab bisher keine Ahnung woran das liegen kann bzw. was der
> Unterschied für den Treiber zwischen Hibernate und Sleep ist.
>

Welches Hibernate? Das Pseudo Aus von Windows 8 oder Save to Disk?

Aus welchen Speicher wird nur FFFFF..... gelesenen?

von Sebastian (Gast)


Lesenswert?

Hallo Lattice User,

entschuldige die nicht eindeutige Frage.

Mit Hibernate meine ich den Ruhezustand von Windows 8.1. Also 
wahrscheinlich das "Save to Disk", wie du es geschrieben hast.

Mit Speicher meinte ich meine über BAR0 und BAR1 allozierter 
Speicherbereich im Arbeitsspeicher.

Nach einem Hibernatezyklus (in Ruhezustand und wieder zurück) sind die 
Daten im Arbeitsspeicher plausibel.
Nach einem Sleepzyklus (in Standby und wieder zurück) sind die Daten 
falsch, ich lese nur FFFFFFF... zurück

Danke für deine Mühe und einen schönen Abend,
Seb

von Lattice User (Gast)


Lesenswert?

Sebastian schrieb:
> Hallo Lattice User,
>
> entschuldige die nicht eindeutige Frage.
>
> Mit Hibernate meine ich den Ruhezustand von Windows 8.1. Also
> wahrscheinlich das "Save to Disk", wie du es geschrieben hast.
>
> Mit Speicher meinte ich meine über BAR0 und BAR1 allozierter
> Speicherbereich im Arbeitsspeicher.

Das ist sehr unklar ausgedrückt, da dabei kein Arbeitspeicher alloziert 
wird sondern der Memory auf der Karte in den Addressraum des Prozessors 
gemappt wird (ausserhalb des Arbeitsspeichers!), und auch eine virtuelle 
Addresse bekommt.

>
> Nach einem Hibernatezyklus (in Ruhezustand und wieder zurück) sind die
> Daten im Arbeitsspeicher plausibel.
> Nach einem Sleepzyklus (in Standby und wieder zurück) sind die Daten
> falsch, ich lese nur FFFFFFF... zurück
>

Das bedeutet dass der PCI Expresslink nicht wieder hochkommt, bzw das 
System die Karte nicht konfiguriert.

Eine mögliche Ursache ist, dass der FPGA zu lange zum Laden des Bitimage 
braucht (SPI flash lesen), und noch nicht bereit ist wenn das BIOS die 
Karte konfigurieren möchte.

Eventuell mal einen anderen Slot probieren, insbesondere im x16 Slot 
sind manche BIOSe extrem ungedultig.

von Sebastian (Gast)


Lesenswert?

Guten Morgen und vielen Danke "Lattice-User".
Das mit dem SPI-Flash ist ein guter Hinweis. Ich werden mal prüfen ob 
sich da etwas optiermieren lässt.
Vielen Dank.

Gruß, Seb

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.