Unusable Linux text console with nvidia-drm modeset=1 or if nvidia-persistenced is loaded

This is an RTX 3080.

I use regular Legacy BIOS boot (not UEFI), GRUB set to gfxpayload=keep, Plymouth set to text theme “details”. So I get a classic 80x25 text console on kernel boot and during the whole init process, until X starts.

Now the bad part. Mid-boot, the console hangs when the nvidia driver gets loaded (presumably by nvidia-persistenced). The screen freezes, the blinking cursor is gone. You can’t do anything about it until other consoles (tty2 and so on) start.

Whether I let it get to GUI login, or start the system in multi-user.target (aka runlevel 3), I can then switch consoles and get a login prompt. However:

  • whenever cursor reaches bottom of the screen (cat a file, ls a directory, ps -ef, dmesg, you name it), the console freezes and the only way to unfreeze it is to switch to another one and back (which makes you lose scrollback with shift-pgup/pgdn as usual)
  • after going back to it, sometimes things look normal (until you reach bottom of the screen again, like by pressing enter :)), but often times the “viewport” is bottom half of the screen (let’s say bottom 12 lines, I haven’t counted) but it’s displayed in the top half, while the bottom is some old output
  • clear/reset don’t do much, neither does setfont (font changes but breakage remains)
  • I was also able to get small bit of colorful garbage after switching to X and back, suggesting something else corrupted that bit of screen memory
  • when the console is “frozen”, there’s no way to make it scroll or display anything, but you can type commands (or login blindly if you’re trying to get into rescue.target but that also loads the driver ;)), and when you switch to another console and back, there’s at least some output. So it’s like things still going into the buffer somewhere, it’s just not the part of memory that gets displayed. Again: Shift-PgDn doesn’t do anything, scroll lock/^Q have no effect, Alt-SysRq-R etc. don’t show anything, dmesg in console (which would normally fill the whole buffer) doesn’t change anything. So it’s not like being scrolled up. It’s really detaching what you see from the actual buffer.

By trial and error I found out that:

  • if I start the system without X, switch console, log in as root and systemctl stop nvidia-persistenced, screen blinks and the problem disappears, as long as nvidia-drm.ko was loaded with modeset=0
  • if nvidia-drm.ko was loaded with modeset=1, it needs rmmod to fix the console even if neither X or nvidia-persistenced is running
  • as you’d expect, even if I disable nvidia-persistenced, as soon as X starts, text consoles break

The text mode console enters a broken state after one of:

  • loading nvidia-persistenced service
  • loading nvidia-drm.ko with modeset=1
  • starting Xorg

I’ve tried several kernel/driver combinations, everything I have available in Fedora 33 at this moment (initial release, current update and the update from updates-testing)

  • kernel 5.8.15, 5.12.14-5.12.17, 5.13.3
  • driver 455.28, 465.31, 470.57.02
    Most importantly, 4 combinations of newest/oldest have been tested to eliminate the potential of this being a new bug.

The issue seems to be specific to this card, or the Ampere architecture.

The difference between this 3080 and my old 1080 Ti was that monitor doesn’t blank out between the BIOS and GRUB screens, which I’m super happy about, but clearly this card has a different “text” mode for a 1080p display, so maybe this is connected to the problem somehow?

I wish I had access to more hardware and haven’t immediately sold the 1080 Ti…