Linux driver 595.71.05 still tries to use screen_info struct which was refactored in 7.0 kernel

(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

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.