Howto: Setting up FreeBSD 13.1 with nvidia + intel (So that the HDMI output works...)

dettus

Bicycle User
Okay guys, since I was once again unable to find an easy howto, I am writing this one here...
Hopefully it helps somebody!

Keywords: FreeBSD, Nvidia, Intel, Optimus, Drivers

So, my problem was, that I wanted to use the HDMI output of my Laptop on FreeBSD. It has a Geforce GTX 1070, and also a core i7, so it uses both graphics outputs. For a while there were drivers like "Optimus" or "Bumblebee" and "Nouveau" to take care of this. I REALLY do not know anything about them.

Anyways, so here's what I did:
First, I installed xorg
Code:
pkg install xorg

Then, I installed the driver for the graphics cards:
Code:
pkg install nvidia-driver

I WANTED to install drm-kmod as well, but there was not package. So I compiled it from the ports
Code:
cd /usr/ports/graphics/drm-kmod
make install

Next thing I did was to add a line to the /etc/rc.conf
Code:
vi /etc/rc.conf
kld_list="nvidia nvidia-modeset linux linux64 /boot/modules/i915kms.ko"
and the /boot/loader.conf
Code:
vi /boot/loader.conf
linux_enable="YES"

Then I rebooted
Code:
reboot
One thing I noticed was that the output has gotten smaller at this point.
Now, I needed a new xorg.conf
Code:
X -configure
mv /root/xorg.conf.new /usr/local/etc/X11/xorg.conf

I tested it
Code:
startx

It worked, so I cheered a bit, and then I danced.



And here is what the /usr/local/etc/X11/xorg.conf looks like:
Code:
Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        Screen      1  "Screen1" RightOf "Screen0"
        InputDevice    "Mouse0" "CorePointer"
        InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "Files"
        ModulePath   "/usr/local/lib/xorg/modules"
        FontPath     "/usr/local/share/fonts/misc/"
        FontPath     "/usr/local/share/fonts/TTF/"
        FontPath     "/usr/local/share/fonts/OTF/"
        FontPath     "/usr/local/share/fonts/Type1/"
        FontPath     "/usr/local/share/fonts/100dpi/"
        FontPath     "/usr/local/share/fonts/75dpi/"
        FontPath     "catalogue:/usr/local/etc/X11/fontpath.d"
EndSection

Section "Module"
        Load  "glx"
        Load  "glxserver_nvidia"
EndSection

Section "InputDevice"
        Identifier  "Keyboard0"
        Driver      "kbd"
EndSection

Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/sysmouse"
        Option      "ZAxisMapping" "4 5 6 7"
EndSection

Section "Monitor"
        Identifier   "Monitor0"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
EndSection

Section "Monitor"
        Identifier   "Monitor1"
        VendorName   "Monitor Vendor"
        ModelName    "Monitor Model"
EndSection

Section "Device"
        Identifier  "Card0"
        Driver      "nvidia"
        BusID       "PCI:1:0:0"
EndSection

Section "Device"
        ### Available Driver options are:-
        ### Values: <i>: integer, <f>: float, <bool>: "True"/"False",
        ### <string>: "String", <freq>: "<f> Hz/kHz/MHz",
        ### <percent>: "<f>%"
        ### [arg]: arg optional
        #Option     "SWcursor"                  # [<bool>]
        #Option     "kmsdev"                    # <str>
        #Option     "ShadowFB"                  # [<bool>]
        #Option     "AccelMethod"               # <str>
        #Option     "PageFlip"                  # [<bool>]
        #Option     "ZaphodHeads"               # <str>
        #Option     "DoubleShadow"              # [<bool>]
        #Option     "Atomic"                    # [<bool>]
        #Option     "VariableRefresh"           # [<bool>]
        #Option     "UseGammaLUT"               # [<bool>]
        #Option     "AsyncFlipSecondaries"      # [<bool>]
        Identifier  "Card1"
        Driver      "modesetting"
        BusID       "PCI:0:2:0"
EndSection

Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection

Section "Screen"
        Identifier "Screen1"
        Device     "Card1"
        Monitor    "Monitor1"
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     4
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     8
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     15
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     16
        EndSubSection
        SubSection "Display"
                Viewport   0 0
                Depth     24
        EndSubSection
EndSection
 
The next thing I need to figure out is how to actually be able to USE THIS: xorg opens two screens, but most window managers do not like this.
On top of that, setting "xinerama" "1" ends with a blank screen. :(
 
I WANTED to install drm-kmod as well, but there was not package. So I compiled it from the ports
drm-kmod gibt es sehr wohl als Package. Es ist aber von der FreeBSD-Verison abhängig. Es ist z.B. für FreeBSD 13.x drm-fbsd13-kmod.

vi /boot/loader.conf linux_enable="YES"
Wozu brauchst Du den Linux-Kram? bzw. wie steht der mit dem Grafiktreiber im Verhältnis?
Mal davon abgesehen packt man sowas eher in die /etc/rc.conf.
Evtl. gibts ja valide Gründe das in die /boot/loader.conf zu tun. Aber dann sollte man das halt auch begründen.
Vor allem: Wenn Du das hast, warum lädst Du dann das Linux-Modul noch mal via kld_list ?
 
afaik braucht man die Linux-Geschichte nur dann, wenn man die Pakete nicht benutzt und die Treiber neu bauen will. Dabei wird auf src zugegriffen und die Linux-Geschichte geschekt.

Ansonsten denke ich, dass man auch keine xorg.conf braucht.
zumindest fällt mir jetzt nicht direkt auf, was du da besonderes machst.
Außer genau die Geschichte mit Zuordnung der Monitore.
nvidia hatte übrigens immer ein eigenes Tool zum Schreiben einer xorg.conf, das manchmal HW besser erkennen konnte.

Meine fav gui für das Spielen mit Monitor-Layouts ist arandr.
Es greift auf xrandr zu, ohne dass man erst lesen muss, wie dieses funktioniert. Sehr einfach und intuitiv zu bedienen, ist das meine Lösung, wenn ich mal meinen Laptop an einem Beamer anschließen will und spontan die Bildschirme für mich passend anordnen möchte.
Eine gefundene Lösung kann auch gespeichert und als Script dann automatisch gestartet werden.
Sehr einfach, sehr komfortabel, gut zu benutzen.
 
arandr kenne ich nicht, aber es hat bei mir das gleiche Problem wie xrandr.

Die Besonderheit ist ja, dass mein Laptop sowohl die Intel, als auch die NVIDIA Graphikausgabe verwenden moechte.
Und dabei geht irgendwas schief.... xrandr erkennt z.B. nicht den HDMI-Ausgang, der bei mir eingebaut ist, und damit auch leider arandr nicht. :(

Code:
; xrandr --display :0.0
Screen 0: minimum 320 x 200, current 3840 x 2160, maximum 16384 x 16384
eDP-1 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 344mm x 193mm panning 3840x2160+0+0
   3840x2160     60.00*+  59.98    48.03    59.97 
   3200x1800     59.96    59.94 
   2880x1620     59.96    59.97 
   2560x1600     59.99    59.97 
   2560x1440     59.99    59.99    59.96    59.95 
   2048x1536     60.00 
   1920x1440     60.00 
   1856x1392     60.01 
   1792x1344     60.01 
   2048x1152     59.99    59.98    59.90    59.91 
   1920x1200     59.88    59.95 
   1920x1080     60.01    59.97    59.96    59.93 
   1600x1200     60.00 
   1680x1050     59.95    59.88 
   1400x1050     59.98 
   1600x900      59.99    59.94    59.95    59.82 
   1280x1024     60.02 
   1400x900      59.96    59.88 
   1280x960      60.00 
   1440x810      60.00    59.97 
   1368x768      59.88    59.85 
   1280x800      59.99    59.97    59.81    59.91 
   1280x720      60.00    59.99    59.86    59.74 
   1024x768      60.04    60.00 
   960x720       60.00 
   928x696       60.05 
   896x672       60.01 
   1024x576      59.95    59.96    59.90    59.82 
   960x600       59.93    60.00 
   960x540       59.96    59.99    59.63    59.82 
   800x600       60.00    60.32    56.25 
   840x525       60.01    59.88 
   864x486       59.92    59.57 
   700x525       59.98 
   800x450       59.95    59.82 
   640x512       60.02 
   700x450       59.96    59.88 
   640x480       60.00    59.94 
   720x405       59.51    58.99 
   684x384       59.88    59.85 
   640x400       59.88    59.98 
   640x360       59.86    59.83    59.84    59.32 
   512x384       60.00 
   512x288       60.00    59.92 
   480x270       59.63    59.82 
   400x300       60.32    56.34 
   432x243       59.92    59.57 
   320x240       60.05 
   360x202       59.51    59.13 
   320x180       59.84    59.32 
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)

Fuer den brauche ich den zweiten xorg-driver:
Code:
; xrandr --display :0.1
Screen 1: minimum 8 x 8, current 2560 x 1440, maximum 32767 x 32767
HDMI-0 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 597mm x 336mm
   2560x1440     59.95*+ 143.91   120.00 
   3840x2160     59.94    50.00 
   1920x1080    119.88    60.00    59.94    50.00    60.00    50.04 
   1280x1440     59.91 
   1280x1024     75.02    60.02 
   1280x720      59.94    50.00 
   1024x768     119.99   100.00    75.03    70.07    60.00 
   800x600      119.97   100.00    75.00    72.19    60.32    56.25 
   720x576       50.00 
   720x480       59.94 
   640x480      120.01    99.99    75.00    72.81    59.94    59.93 
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
 
afaik braucht man die Linux-Geschichte nur dann, wenn man die Pakete nicht benutzt und die Treiber neu bauen will.
Das kann gut sein. Also zumindest wenn man den nvidia-Treiber auch für Linux-Programme sprich den Linuxulator zur Verfügung stellen will. Sowas sollte dann aber erwähnt werden und nicht einfach ohne Erklärung vorgegeben werden.

Ansonsten denke ich, dass man auch keine xorg.conf braucht.
zumindest fällt mir jetzt nicht direkt auf, was du da besonderes machst.
Für den proprietären nvidia-Treiber schon. Weiß nicht, ob es brandaktuell noch so ist. Aber bisher war es immer so.
Aber ne eigene xorg.conf wird man in dem Fall schon deshalb brauchen, weil es ein Multigrafikkarten-Setup werden soll.

nvidia hatte übrigens immer ein eigenes Tool zum Schreiben einer xorg.conf, das manchmal HW besser erkennen konnte.
nvidia-xconfig
Gibts als Port (x11/nvidia-xconfig) bzw. Package
Meine fav gui für das Spielen mit Monitor-Layouts ist arandr.
Ich ergänze mal noch den Homepage-Link dazu:
https://christian.amsuess.com/tools/arandr/
Ist in den Ports zu finden unter x11/arandr bzw. als Package -> pkg install arandr
 
Willst Du das auch? Wenn nicht, ist es im UEFI (oder gleichwertig) nicht möglich, einer der beiden Grafikkarten zu deaktivieren?
Wenn du weisst, wie, immer her damit. :)
Ich finde es zumindest verdaechtig, dass die Xrandr so viele Output Moeglichkeiten zeigt. Wobei nur DP-1 bei beiden vorkommt....
 
Wenn du weisst, wie, immer her damit. :)
Ich finde es zumindest verdaechtig, dass die Xrandr so viele Output Moeglichkeiten zeigt. Wobei nur DP-1 bei beiden vorkommt....

Es kann sein das du eine Grafiklösung hast wo man nicht mehr über das BIOS direkt nur "eine" laufen lassen kann - das ist bei moderneren Lösungen manchmal so und liegt soweit ich das verstanden hab daran wie die jeweils zusammen geschaltet sind.

Bei meinem (Windows) Notebook kann ich zb nur die große NVIDIA-Lösung exklusiv nutzen oder beide gleichzeitig, aber nicht die eingebaute stromsparende "exklusiv".

Das ist - unter Windows - aber auch kein Problem.
 
Wenn du weisst, wie, immer her damit.
Ob und wie es bei deinem Laptop möglich ist, weiß ich nicht.
Aber was passiert wenn Du den nvidia-Treiber nicht installierst bzw. nicht ladest/aktivierst?
Du könntest auch mit dem aktuellen (basiert auf FreeBSD-13.1R) NomadBSD (auf einem USB-Stick) und deinem Laptop testen, denn lt. devs:
NomadBSD doesn't support switchable graphics like Optimus yet.
Quelle: https://nomadbsd.org/handbook/handbook.html#ts_nvidia
D. h. man muss sich für eine Karte entscheiden.
 
Zuletzt bearbeitet:
ich frage nochmal nach, weil mir das immer noch nicht klar ist:
Ist es gewollt, dass nur eine der beiden Grakas erkannt und angesprochen wird, weil es sonst vielleicht Probleme gibt?
Oder sollen beide zusammen und gleichzeitig benutzt werden, um unterschiedliche Monitore an unterschiedlichen Karten zu benutzen?
 
Das Thema Intel/Nvidia hatte ich auch mal auf einem Lenovo W530. Ich habe im BIOS "exklusiv" auf Nvidia gesetzt, nutze also NUR Nvidia. Damit ist auch mein externen Mini HDMI Anschluss verfügbar und alles geht. Gut - Intel könnte ein wenig Strom sparen, aber dieses "Gefrickel" war mir irgendwann zu viel.
VG Norbert
 
Sowas wie z.B. Optimus hat bei mir auf meinem Thinkpad auch noch nie richtig funktioniert.


Hybride Kombinationen

Einige Notebooks besitzen zusätzlich zum Chipsatz oder Prozessor einen Grafikprozessor. Optimus kombiniert Intel® und NVIDIA Hardware. Umschaltbare Grafik bzw. Hybride Grafik ist eine Kombination aus Intel®, oder AMD® Prozessor mit AMD® Radeon GPU.

Die Implementierungen dieser Hybrid-Grafik-Systeme variieren und Xorg in FreeBSD ist nicht in der Lage, alle Versionen der Hardware zu betreiben.

Einige Computer bieten jedoch eine BIOS-Option, um eine der beiden Grafikkarten zu deaktivieren oder den diskreten Modus einzuschalten. Zum Beispiel ist es manchmal möglich, die NVIDIA GPU in einem Optimus-System zu deaktivieren. Intel® Video kann dann mit einem Intel® Treiber verwendet werden.

Die BIOS-Einstellungen sind abhängig vom Modell des Computers. In manchen Situationen können beide GPUs aktiviert bleiben. Um solch ein System lauffähig zu machen genügt es bereits, nur die Haupt-GPU im Abschnitt Device der Konfigurationsdatei zu setzen.
 
Das Thema Intel/Nvidia hatte ich auch mal auf einem Lenovo W530. Ich habe im BIOS "exklusiv" auf Nvidia gesetzt, nutze also NUR Nvidia. Damit ist auch mein externen Mini HDMI Anschluss verfügbar und alles geht. Gut - Intel könnte ein wenig Strom sparen, aber dieses "Gefrickel" war mir irgendwann zu viel.
VG Norbert

Ja, der ist von 2013 oder so - bei vielen aktuelleren Modellen geht das (Siehe meinen Post) so nicht mehr. Da kann man nicht mehr "exklusiv" auf eine Schalten.

Das hat wie erwähnt damit zu tun wie die beiden Grafiklösung technisch auf den Mainboard verbunden sind.
 
Ob und wie es bei deinem Laptop möglich ist, weiß ich nicht.
Aber was passiert wenn Du den nvidia-Treiber nicht installierst bzw. nicht ladest/aktivierst
Dann funktioniert der eingebaute Monitor. Aber nicht der HDMI-0 Anschluss. (Siehe xrandr Output oben.)


Ich habs vorher uebrigens mit OpenBSD laufen lassen. Funktionierte auch super, also bis auf den HDMI Output. Aber jetzt wollte ich mal FreeBSD ausprobieren.

Hier uebrigens mein Laptop: https://bsd-hardware.info/?probe=3ab3e4b671
 
Dann funktioniert der eingebaute Monitor. Aber nicht der HDMI-0 Anschluss.
Naheliegend wäre dann ja mal zu gucken wie es ist, wenn man die Intel-Grafik deaktiviert (sprich den Treiber i915kms nicht lädt und ggf. auch sicherstellen das er nicht geladen wird) und nur nvidia-modeset drin hat.
Selbstredend bei der xorg.conf genau so.

Was man auch noch probieren könnte ist die Monitorerkennung nicht der Automatik überlassen, sondern sie halt fest in die xorg.conf einzutragen.
 
Es gibt bei aktuellen Laptops im Wesentlichen zwei Systeme:

  • Die Softwarelösung: Einer der beiden GPUs - meist die interne GPU - ist physisch mit den Ausgängen verbunden. Die andere GPU - meist die externe GPU - ist headless. Damit sie ein Bild ausgeben kann, muss sie in den Framebuffer der anderen GPU schreiben. Dazu kommt etwas Softwaremagie um die Powerstates zu schalten und so. Hat den Vorteil das es einfach in Hardware zu implementieren und damit recht günstig ist. Der Nachteil ist, dass der gemeinsame Framebuffer auf die Performance schlägt und Tearing kaum zu vermeiden ist. Nachdem Windows 10 die Sache halbwegs standardisiert hat und sich Nvidia und die Kernelentwickler auf ein Framebufferformat einigen konnte, funktioniert das unter Linux inzwischen recht gut. FreeBSD weiß ich nicht, aber die Chancen sind da.
  • Die Hardwarelösung: Interne und externe GPU sind durch einen Hardwareswitch miteinander verdrahtet, eventuell sind noch Ausgänge exklusiv mit einer GPU verbunden. Ist zwar recht aufwändig umzusetzen, hat aber den Vorteil, dass beide GPUs optimal direkt auf den Monitor zugreifen können. Leider ist es sehr vom jeweiligen Laptop abhängig und schon unter Linux wackelig. Nvidia will da was standardisieren, aber ob das jemals ins BSD-Lager durchsickert, steht in den Sternen: https://www.phoronix.com/news/NVIDIA-Dynamic-Mux-Switching

Bei dir klingt es nach der Hardwarelösung und ich fürchte, dass beide GPU auf dem gleichen X11 Screen nur mit ganz bösen Frickeleien wie VirtualGL. Watt mutt, datt mutt. Die Hardware ist schließlich da. Aber wenns geht, würde ich es lassen.
 
Zurück
Oben