this only works on efi systems and on the efifb driver.
to get native TTY resolutions with nvidia blob today (2017-07-xx) you have to run your framebuffer on efifb but efifb itself cant change resolution it only uses whatever it gets handed with, which means you need your firmware or bootloader to set it and hand it over. currently i think its only grub and rEFInd that can do so.
nvidia-drm/nvidia modesetting, currently does not like "CONFIG_HARDENED_USERCOPY" which is on by default in archlinux kernels. with it on you end up with errors like these in dmesg.
[drm:nvidia_drm_gem_import_nvkms_memory [nvidia_drm]] *ERROR* [nvidia-drm] [GPU ID 0x00000100] Failed to import NVKMS memory to GEM object
Compile your kernel without CONFIG_HARDENED_USERCOPY, to see if its enabled in your current one run
zgrep CONFIG_HARDENED_USERCOPY /proc/config.gz
you also need nvidia later then 346.16
when your kernel is installed without CONFIG_HARDENED_USERCOPY add
nvidia-drm.modeset=1
to your kernel cmdline to enable DRM kernel mode setting.
And you need to add these modules to your initramfs and then rebuild it.
nvidia nvidia_modeset nvidia_uvm nvidia_drm
on archlinux with pacman, you can avoid the possibility of forgetting to update your initramfs after an nvidia upgrade with a pacman hook, like this
/etc/pacman.d/hooks/nvidia.hook
[Trigger]
Operation=Install
Operation=Upgrade
Operation=Remove
Type=Package
Target=nvidia
[Action]
Depends=mkinitcpio
When=PostTransaction
Exec=/usr/bin/mkinitcpio -P
then its time to setup your bootloader to make it change resolution and then hand it over to efifb i did this with grub, this is an example of my grub.cfg
set timeout=2
set default=1
# Use UEFI's Graphics Output Protocol.
insmod efi_gop
# Enable VT-d while disabling intergrated graphics engine.
set cmdline="$cmdline intel_iommu=on,igfx_off"
# Attempt to set I/O elevator.
set cmdline="$cmdline elevator=cfq"
# disable watchdogs because blot
set cmdline="$cmdline nowatchdog nmi_watchdog=0 modprobe.blacklist=iTCO_wdt,iTCO_vendor_support"
# try set resolution to hand it over for efifb and give native tty resolutions with nvidia.
set gfxmode=1920x1080x32
set gfxpayload=keep
insmod gfxterm
loadfont unicode
set gfxterm_font=unicode
set lang=en_US
terminal_input console
terminal_output gfxterm
set cmdline="$cmdline nvidia-drm.modeset=1"
# cmdline for encryption
set cmdline="$cmdline cryptdevice=UUID=2b7f075b-e222-4ebc-ad67-899d3ccb8077:cryptroot:allow-discards crypto=sha512::512:0: root=/dev/mapper/cryptroot"
menuentry "Arch Linux" {
linux /vmlinuz-linux $cmdline rw
initrd /intel-ucode.img /initramfs-linux.img
}
menuentry "Arch Linux-zen" {
linux /vmlinuz-linux-zen $cmdline rw
initrd /intel-ucode.img /initramfs-linux-zen.img
}
menuentry "Arch Linux Fallback" {
linux /vmlinuz-linux $cmdline rw
initrd /intel-ucode.img /initramfs-linux-fallback.img
}
the magic happends at the # try set resolution, section. and thats it after booting you should have native tty resolutions on nvidia on efifb.
check with efifb if you have.
dmesg | grep efifb
[ 1.194901] efifb: probing for efifb
[ 1.194907] efifb: framebuffer at 0xe9000000, using 8128k, total 8128k
[ 1.194908] efifb: mode is 1920x1080x32, linelength=7680, pages=1
[ 1.194908] efifb: scrolling: redraw
[ 1.194909] efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
- Hat tip to earnestly's grub.cfg who's magic was reused