-
-
Save joanbm/a6d3f7f873a60dec0aa4a734c0f1d64e to your computer and use it in GitHub Desktop.
| From 839b964bd5be20275a4d1add020e68e407380adb Mon Sep 17 00:00:00 2001 | |
| From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= <[email protected]> | |
| Date: Sat, 17 Aug 2024 14:26:04 +0000 | |
| Subject: [PATCH] Tentative fix for NVIDIA 470.256.02 driver for Linux 6.12-rc1 | |
| Note that the fix requires enabling DRM kernel mode setting | |
| (add the `nvidia-drm.modeset=1` parameter to the kernel command line). | |
| (Thanks xtexChooser for the memory management fixes!) | |
| --- | |
| nvidia-drm/nvidia-drm-drv.c | 47 +++++++++++++++++++++++++++++++++++++ | |
| 1 file changed, 47 insertions(+) | |
| diff --git a/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c | |
| index f350134..d6233a5 100644 | |
| --- a/nvidia-drm/nvidia-drm-drv.c | |
| +++ b/nvidia-drm/nvidia-drm-drv.c | |
| @@ -84,6 +84,11 @@ | |
| #include <drm/drm_atomic_helper.h> | |
| #endif | |
| +#include <linux/version.h> | |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) | |
| +#include <drm/drm_client.h> | |
| +#endif | |
| + | |
| static struct nv_drm_device *dev_list = NULL; | |
| #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE) | |
| @@ -168,7 +173,12 @@ static const struct drm_mode_config_funcs nv_mode_config_funcs = { | |
| .atomic_check = nv_drm_atomic_check, | |
| .atomic_commit = nv_drm_atomic_commit, | |
| +#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 12, 0) | |
| + // Rel. commit. "drm: Remove struct drm_mode_config_funcs.output_poll_changed" (Thomas Zimmermann, 12 Aug 2024) | |
| + // Replace this callback with a DRM client's hotplug callback. | |
| + // This is required for e.g. /sys/class/drm/card*/modes to work. | |
| .output_poll_changed = nv_drm_output_poll_changed, | |
| +#endif | |
| }; | |
| static void nv_drm_event_callback(const struct NvKmsKapiEvent *event) | |
| @@ -739,6 +749,10 @@ static const struct file_operations nv_drm_fops = { | |
| .read = drm_read, | |
| .llseek = noop_llseek, | |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) | |
| + // Rel. commit. "fs: move FMODE_UNSIGNED_OFFSET to fop_flags" (Christian Brauner, 9 Aug 2024) | |
| + .fop_flags = FOP_UNSIGNED_OFFSET, | |
| +#endif | |
| }; | |
| static const struct drm_ioctl_desc nv_drm_ioctls[] = { | |
| @@ -906,7 +920,18 @@ static void nv_drm_update_drm_driver_features(void) | |
| #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ | |
| } | |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) | |
| +static int hotplug_helper_client_hotplug(struct drm_client_dev *client) | |
| +{ | |
| + nv_drm_output_poll_changed(client->dev); | |
| + return 0; | |
| +} | |
| +static const struct drm_client_funcs nv_hotplug_helper_client_funcs = { | |
| + .owner = THIS_MODULE, | |
| + .hotplug = hotplug_helper_client_hotplug, | |
| +}; | |
| +#endif | |
| /* | |
| * Helper function for allocate/register DRM device for given NVIDIA GPU ID. | |
| @@ -962,6 +987,20 @@ static void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) | |
| goto failed_drm_register; | |
| } | |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) | |
| + /* Register a DRM client for receiving hotplug events */ | |
| + struct drm_client_dev *client = kzalloc(sizeof(*client), GFP_KERNEL); | |
| + if (client == NULL || drm_client_init(dev, client, | |
| + "nv-hotplug-helper", &nv_hotplug_helper_client_funcs)) { | |
| + printk(KERN_WARNING "Failed to initialize the nv-hotplug-helper DRM client" | |
| + " (ensure DRM kernel mode setting is enabled via nvidia-drm.modeset=1).\n"); | |
| + goto failed_drm_client_init; | |
| + } | |
| + | |
| + drm_client_register(client); | |
| + pr_info("Registered the nv-hotplug-helper DRM client.\n"); | |
| +#endif | |
| + | |
| /* Add NVIDIA-DRM device into list */ | |
| nv_dev->next = dev_list; | |
| @@ -969,6 +1008,14 @@ static void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) | |
| return; /* Success */ | |
| +#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0) | |
| +failed_drm_client_init: | |
| + | |
| + kfree(client); | |
| + drm_dev_unregister(dev); | |
| + | |
| +#endif | |
| + | |
| failed_drm_register: | |
| nv_drm_dev_free(dev); | |
| -- | |
| 2.47.0 | |
The top post only contains the patch for Linux 6.12, to apply all the patches up to 6.12 you can use the snippet from Augusto7743 you previously quoted, or I recently created a nvidia-470xx-linux-mainline repository with all the patches along with some helper scripts.
@ MedHatchi re: compiler version mismatch
the dirty workaround here is to run:
cd NVIDIA-Linux-x86_64-470.256.02
nvidia-installer --no-cc-version-check
which may succeed in compiling but may lead to incompatibility problems after installation. But worth a try.
Tried to apply the patch on Gentoo.
Kernel: gentoo-sources-6.12.31
nvidia-drivers-470.256.02-r2
It fails to compile with:
home/temp/portage/x11-drivers/nvidia-drivers-470.256.02-r2/work/kernel/nvidia/os-mlock.c:23:12: error: implicit declaration of function ‘follow_pfn’; did you mean ‘folio_pfn’? [-Wimplicit-function-declaration]
23 | return follow_pfn(vma, address, pfn);
| ^~~~~~~~~~
| folio_pfn
make[3]: *** [scripts/Makefile.build:229: /home/temp/portage/x11-drivers/nvidia-drivers-470.256.02-r2/work/kernel/nvidia/os-mlock.o] Error 1
make[2]: *** [/usr/src/linux-6.12.31-gentoo/Makefile:1947: /home/temp/portage/x11-drivers/nvidia-drivers-470.256.02-r2/work/kernel] Error 2
make[1]: *** [Makefile:224: __sub-make] Error 2
make[1]: Leaving directory '/usr/src/linux-6.12.31-gentoo'
make: *** [Makefile:80: modules] Error 2
@sven76 You need to apply the previous patches, e.g. for Kernel 6.10 support, as well. You can find all the patches in the nvidia-470xx-linux-mainline repository.
(If it makes things simpler, you can just apply all of them - the patches for the newest kernels don't break support for older kernels).
i had kali linux 2025.2 that is built with 14.3 and now i installed 2025.1a that is built with gcc 14.2 held them with apt-mark i've done full upgrade gcc version remain the same = 14.2.0 driver install dkms problem and display the box of x-config then boot to cli till i add nvidiadrm modeset so it boot to GUI ,i will reinstall kali 2025.2 and downgrade gcc on that version and try again (btw i guess the top post contains all 5 patches in one i think)