(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.