From d1fd3bcac1ef7da7cd9624f87d8d6ab2768880f1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= <joanbrugueram@gmail.com>
Date: Sun, 15 Feb 2026 11:31:28 +0000
Subject: [PATCH] Tentative fix for NVIDIA 470.256.02 driver for Linux 7.0-rc1

---
 common/inc/nv-linux.h                |  3 +++
 nvidia-drm/nvidia-dma-fence-helper.h |  7 ++++---
 nvidia/nv.c                          | 23 +++++++++++++++--------
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/common/inc/nv-linux.h b/common/inc/nv-linux.h
index e095a89..2ab5074 100644
--- a/kernel/common/inc/nv-linux.h
+++ b/kernel/common/inc/nv-linux.h
@@ -223,6 +223,9 @@ static inline uid_t __kuid_val(uid_t uid)
 
 #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 --git a/nvidia-drm/nvidia-dma-fence-helper.h b/nvidia-drm/nvidia-dma-fence-helper.h
index a09ab76..6221bf2 100644
--- a/kernel/nvidia-drm/nvidia-dma-fence-helper.h
+++ b/kernel/nvidia-drm/nvidia-dma-fence-helper.h
@@ -89,11 +89,12 @@ nv_dma_fence_default_wait(nv_dma_fence_t *fence,
 #endif
 }
 
-static inline int nv_dma_fence_signal(nv_dma_fence_t *fence) {
+// Rel. commit "dma-buf/dma-fence: Remove return code of signaling-functions" (Philipp Stanner, 1 Dec 2025)
+static inline void nv_dma_fence_signal(nv_dma_fence_t *fence) {
 #if defined(NV_LINUX_FENCE_H_PRESENT)
-    return fence_signal(fence);
+    fence_signal(fence);
 #else
-    return dma_fence_signal(fence);
+    dma_fence_signal(fence);
 #endif
 }
 
diff --git a/nvidia/nv.c b/nvidia/nv.c
index 57b5024..ef7dde6 100644
--- a/kernel/nvidia/nv.c
+++ b/kernel/nvidia/nv.c
@@ -5639,8 +5639,15 @@ void NV_API_CALL nv_get_screen_info(
      * 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 NV_CHECK_EXPORT_SYMBOL(screen_info)
+#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.
      *
@@ -5648,21 +5655,21 @@ void NV_API_CALL nv_get_screen_info(
      * 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)
+    if (si->orig_video_isVGA > 1)
     {
-        NvU64 physAddr = screen_info.lfb_base;
+        NvU64 physAddr = si->lfb_base;
 #if defined(VIDEO_CAPABILITY_64BIT_BASE)
-        physAddr |= (NvU64)screen_info.ext_lfb_base << 32;
+        physAddr |= (NvU64)si->ext_lfb_base << 32;
 #endif
 
         /* Make sure base address is mapped to GPU BAR */
         if (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;
+            *pFbWidth = si->lfb_width;
+            *pFbHeight = si->lfb_height;
+            *pFbDepth = si->lfb_depth;
+            *pFbPitch = si->lfb_linelength;
             *pFbSize = (NvU64)(*pFbHeight) * (NvU64)(*pFbPitch);
         }
     }
-- 
2.53.0

