diff --git a/crystal-linux/nvidiawayland.mdx b/crystal-linux/nvidiawayland.mdx index fe6d949..3a55a4e 100644 --- a/crystal-linux/nvidiawayland.mdx +++ b/crystal-linux/nvidiawayland.mdx @@ -1,40 +1,44 @@ --- title: How to make Wayland work on an NVIDIA GPU --- -Sometimes, GDM disables GNOME Wayland when it detects you have an NVIDIA GPU. If you want to force-enable GNOME Wayland, you first have to enable DRM [kernel mode setting](https://wiki.archlinux.org/title/Kernel_mode_setting) (KMS) on the NVIDIA driver so Wayland is able to run. To do this, you need to add a kernel parameter to tell the NVIDIA driver to enable KMS. The kernel parameter you need to add is `nvidia_drm.modeset=1`. +Wayland requires the nvidia gpu to have modesetting enabled, to do that you have to add the nvidia drivers to the mkinitcpio modules and add the `nvidia-drm.modeset=1` kernel flag -## GRUB -For example, if you are using GRUB, there should be a file called `/etc/default/grub`. In there should be a line in that file that looks like this: +## Adding the nvidia mkinitcpio modules +To add the required nvidia modules `nvidia nvidia_modeset nvidia_uvm nvidia_drm` to the mkinitcpio modules you'll have to edit `/etc/mkinitcpio.conf` by running `sudo nano /etc/mkinitcpio.conf` +in that file there should be a line that looks like this: ``` -GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet" +MODULES=() ``` -You want to append the new kernel parameter at the end of the line, between the quotes. Parameters are separated by spaces, so put a space after the last parameter and append the parameter there. Make sure to edit the file with super-user permissions (with `sudo`) or you will get errors writing the file. - -### Example - ``` -GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet nvidia_drm.modeset=1" +you want to add the modules in the parentheses, the module names are seperated by spaces, in the end the line should look like this: ``` -After you add the kernel parameter, you want to make sure GRUB knows that you have changed your kernel parameters. To do this, you need to rebuild your GRUB configuration file. To rebuild your GRUB configuration file, run `sudo grub-mkconfig -o /boot/grub/grub.cfg`, and your GRUB configuration should have the new kernel parameter and you can use it by rebooting your system. - -## What to do after you add the kernel parameter. -After you add the kernel parameter and restart, that might be all you need to do to get GNOME Wayland working. Check if you can access GNOME Wayland and if you can't, try these other steps. - -After that, reboot and see if GNOME Wayland works. If it still doesn't work, you need to add some modules to your initramfs for early boot modesetting. There should be a file (in Arch based distributions) called `/etc/mkinitcpio.conf`. In that file, there should be a `MODULES` line. On that line, there should be some parentheses. Between them, you can add kernel modules you want built into your initramfs (each module is separated by a space). We want to add some NVIDIA modules to our initramfs so it can be loaded early in the boot process. So add these modules to the file. Make sure to edit this file with super-user permissions. +MODLUES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) ``` -nvidia nvidia_modeset nvidia_uvm nvidia_drm +To save the file you have to press `CTRL+O` and to quit `CTRL+X` +Now you want to generate the initramfs: ``` -### Example +sudo mkinitcpio -P ``` -MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) +to regenerate the initcpio + +## Adding the kernel flag +To add the kernel flag with grub, you have to edit `/etc/default/grub` by running `sudo nano /etc/default/grub`, you should find a line that looks like this: ``` +GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet" +``` +You'll have to append `nvidia-drm.modeset=1` to that line, so that it would look like this: -And after that, you need to regenerate your initramfs. To do that, run this command. + ``` +GRUB_CMDLINE_LINUX_DEFAULT="loglevel=3 quiet nvidia_drm.modeset=1" ``` -sudo mkinitcpio -P +Just like with the mkinitcpio modules, to save and quit you'll have to first press `CTRL+O` and then `CTRL+X` +Once you add the kernel parameter, you want to regenerate the grub config to reflect the kernel flag changes, to do this you have to run ``` +sudo grub-mkconfig -o /boot/grub/grub.cfg +``` +This will generate the grub config and save it to /boot/grub/grub.cfg -### Removing the gdm udev that disables wayland -GDM uses some chipset dependent [udev rules](https://gitlab.gnome.org/GNOME/gdm/-/blob/main/data/61-gdm.rules.in) to see if it should force Xorg usage instead of letting you use Wayland. If you want to force-enable Wayland, run this command. +### Extra steps for GNOME and onyx +GDM uses some chipset dependent [udev rules](https://wiki.archlinux.org/title/Udev) to see if it should force Xorg usage instead of letting you use Wayland. These udev rules can be disabled by running this command: ``` sudo ln -s /dev/null /etc/udev/rules.d/61-gdm.rules ``` @@ -42,4 +46,15 @@ This command should symlink GDM's udev rules to *nothing*. Rules in `/etc/udev/r And after that, reboot and GNOME Wayland *should* be working! -If it still doesn't work, your GPU might not support Wayland on the proprietary NVIDIA drivers. There is no fix for this other than using the nouveau driver, which doesn't support everything that the proprietary NVIDIA driver does. +## Rebooting +Once you went through all the steps, meaning you: +- added the mkinitcpio modules +- generated the initcpio +- added the kernel flags with grub +- regenerated the grub config +- optionally disabled udev rules + +You should be able to use wayland! Just reboot and you should be able to log into a wayland session + + +If it still doesn't work, your GPU might not support Wayland on the proprietary NVIDIA drivers. There is no fix for this other than using the nouveau driver, which sadly doesn't perform as well as the propietary nvidia drivers.