(namely, by the kernel commit a41e0ab394e42c7c09ddd8155d2cc3ca17bdce55 which changes screen_info into a field in the new sysfb_primary_display)
As a result, the driver can’t detect any existing framebuffer devices, which leads to black screen at attempting to switch to any virtual console after the driver has been loaded, even with fbdev=0(at least under xorg, I don’t use Wayland).
Downgrading to a 6.19 kernel, or reverting the patch series leading to that commit brings the ability to switch to a virtual console back.
This is a patch to correct the vconsole problem described in
(namely, by the kernel commit a41e0ab394e42c7c09ddd8155d2cc3ca17bdce55 which changes screen_info into a field in the new sysfb_primary_display)
As a result, the driver can’t detect any existing framebuffer devices, which leads to black screen at attempting to switch to any virtual console after the driver has been loaded, even with fbdev=0(at least under xorg, I don’t use Wayland).
Downgrading to a 6.19 kernel, or reverting the patch series leading to that commit brings the ability to switch t…
This patch is based on
https://aur.archlinux.org/cgit/aur.git/tree/nvidia-470xx-fix-linux-7.0.patch?h=nvidia-470xx-utils
for using nvidia-595.71.05 driver in linux-7.0.x.
This patch has only been tested on my PC running kernel 7.0.9 and Plasma 6 in
wayland mode.
diff -rc open-gpu-kernel-modules/kernel-open/common/inc/nv-linux.h open-gpu-kernel-modules-patched/kernel-open/common/inc/nv-linux.h
*** open-gpu-kernel-modules/kernel-open/common/inc/nv-linux.h 2026-04-29 20:14:48.329492428 +0900
--- open-gpu-kernel-modules-patched/kernel-open/common/inc/nv-linux.h 2026-05-21 20:46:16.519198627 +0900
***************
*** 169,174 ****
--- 169,177 ----
#include <linux/efi.h> /* efi_enabled */
#include <linux/fb.h> /* fb_info struct */
#include <linux/screen_info.h> /* screen_info */
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 20, 0)
+ #include <linux/sysfb.h> /* sysfb_primary_display */
+ #endif
#if !defined(CONFIG_PCI)
#warning "Attempting to build driver for a platform with no PCI support!"
diff -rc open-gpu-kernel-modules/kernel-open/nvidia/nv.c open-gpu-kernel-modules-patched/kernel-open/nvidia/nv.c
*** open-gpu-kernel-modules/kernel-open/nvidia/nv.c 2026-04-29 20:14:48.339492273 +0900
--- open-gpu-kernel-modules-patched/kernel-open/nvidia/nv.c 2026-05-21 21:15:31.384917170 +0900
***************
*** 6409,6416 ****
* After commit b8466fe82b79 ("efi: move screen_info into efi init code")
* in v6.7, 'screen_info' is exported as GPL licensed symbol for ARM64.
*/
!
! #if NV_CHECK_EXPORT_SYMBOL(screen_info)
/*
* If there is not a framebuffer console, return 0 size.
*
--- 6409,6423 ----
* After commit b8466fe82b79 ("efi: move screen_info into efi init code")
* in v6.7, 'screen_info' is exported as GPL licensed symbol for ARM64.
*/
! #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 20, 0)
! // Rel. commit "sysfb: Replace screen_info with sysfb_primary_display" (Thomas Zimmermann, 26 Nov 2025)
! const struct screen_info *si = &sysfb_primary_display.screen;
! #elif NV_CHECK_EXPORT_SYMBOL(screen_info)
! const struct screen_info *si = &screen_info;
! #endif
!
! #if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 20, 0)) || \
! NV_CHECK_EXPORT_SYMBOL(screen_info)
/*
* If there is not a framebuffer console, return 0 size.
*
***************
*** 6418,6430 ****
* initialization, and then will be set to a value, such as
* VIDEO_TYPE_VLFB or VIDEO_TYPE_EFI if an fbdev console is used.
*/
! if (screen_info.orig_video_isVGA > 1)
{
! NvU64 physAddr = screen_info.lfb_base;
#if defined(VIDEO_CAPABILITY_64BIT_BASE)
! if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
{
! physAddr |= (NvU64)screen_info.ext_lfb_base << 32;
}
#endif
/*
--- 6425,6437 ----
* initialization, and then will be set to a value, such as
* VIDEO_TYPE_VLFB or VIDEO_TYPE_EFI if an fbdev console is used.
*/
! if (si->orig_video_isVGA > 1)
{
! NvU64 physAddr = si->lfb_base;
#if defined(VIDEO_CAPABILITY_64BIT_BASE)
! if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)
{
! physAddr |= (NvU64)si->ext_lfb_base << 32;
}
#endif
/*
***************
*** 6436,6445 ****
NV_IS_CONSOLE_MAPPED(nv, physAddr))
{
*pPhysicalAddress = physAddr;
! *pFbWidth = screen_info.lfb_width;
! *pFbHeight = screen_info.lfb_height;
! *pFbDepth = screen_info.lfb_depth;
! *pFbPitch = screen_info.lfb_linelength;
*pFbSize = (NvU64)(*pFbHeight) * (NvU64)(*pFbPitch);
return;
}
--- 6443,6452 ----
NV_IS_CONSOLE_MAPPED(nv, physAddr))
{
*pPhysicalAddress = physAddr;
! *pFbWidth = si->lfb_width;
! *pFbHeight = si->lfb_height;
! *pFbDepth = si->lfb_depth;
! *pFbPitch = si->lfb_linelength;
*pFbSize = (NvU64)(*pFbHeight) * (NvU64)(*pFbPitch);
return;
}
@chenqian you can use ``` sequence (these must be the only characters on a given line) to mark the beginning and the end of a code block, so it will be properly formatted.
Thank you for your advice. I have edited it so it should be more readable now.
Thank you for the report and the patches. Filed an internal bug for investigation.
NVBug 6274897.
The issue was fixed in 610.57.04.
ionen
August 8, 2026, 11:54am
7
…but still seems present in the recently released 580.178.04 for legacy cards users.