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
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.
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?
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.
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.
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.
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
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
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)
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
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.
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
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.
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?
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.
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?
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
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.
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