Skip to content

Commit

Permalink
Add kernel 6.12 patch for 565
Browse files Browse the repository at this point in the history
  • Loading branch information
Tk-Glitch committed Nov 23, 2024
1 parent be494bd commit 8f5f63b
Show file tree
Hide file tree
Showing 2 changed files with 122 additions and 2 deletions.
29 changes: 27 additions & 2 deletions PKGBUILD
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ fi

pkgname=("${_pkgname_array[@]}")
pkgver=$_driver_version
pkgrel=261
pkgrel=262
arch=('x86_64')
url="http://www.nvidia.com/"
license=('custom:NVIDIA')
Expand Down Expand Up @@ -387,6 +387,7 @@ source=($_source_name
'make-modeset-fbdev-default-565.diff'
'6.11-fbdev.diff'
'nvidia-sleep.conf'
'kernel-6.12.patch'
)

msg2 "Selected driver integrity check behavior (md5sum or SKIP): $_md5sum" # If the driver is "known", return md5sum. If it isn't, return SKIP
Expand Down Expand Up @@ -444,7 +445,8 @@ md5sums=("$_md5sum"
'c06a9359969ba331bc9fac91fe0eeff2'
'c691df97015eee42d51b34b147dd5236'
'adfcf56ea4a4a420d9ef07b9d4b451dc'
'2b5b62c1265b3b6b18022a0a716e5fcd')
'2b5b62c1265b3b6b18022a0a716e5fcd'
'676d7039ff5b5e2bdd03db08fd1cba4e')

if [ "$_open_source_modules" = "true" ]; then
if [[ "$_srcbase" == "NVIDIA-kernel-module-source" ]]; then
Expand Down Expand Up @@ -938,6 +940,12 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf
fi
fi

# 6.12
if (( $(vercmp "$_kernel" "6.12") >= 0 )); then
_kernel612="1"
_whitelist612=( 565* )
fi

if [ "$_gcc14" = "true" ]; then
cd "$srcdir"/"$_pkg"/kernel-$_kernel
msg2 "Applying gcc-14 patch..."
Expand Down Expand Up @@ -1032,6 +1040,9 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf
if [ "$_patch" = "6.8" ]; then
_whitelist=(${_whitelist68[@]})
fi
if [ "$_patch" = "6.12" ]; then
_whitelist=(${_whitelist612[@]})
fi
patchy=0
if (( $(vercmp "$_kernel" "$_patch") >= 0 )); then
for yup in "${_whitelist[@]}"; do
Expand Down Expand Up @@ -1508,6 +1519,20 @@ DEST_MODULE_LOCATION[3]="/kernel/drivers/video"' dkms.conf
fi
fi

# 6.12
if [ "$_kernel612" = "1" ]; then
patchy=0
for yup in "${_whitelist612[@]}"; do
[[ $pkgver = $yup ]] && patchy=1
done
if [ "$patchy" = "1" ]; then
msg2 "Applying kernel-6.12.patch for dkms..."
patch -Np1 -i "$srcdir"/kernel-6.12.patch
else
msg2 "Skipping kernel-6.12.patch as it doesn't apply to this driver version..."
fi
fi

if [ "$_gcc14" = "true" ]; then
msg2 "Applying gcc-14 patch..."
if [[ $pkgver = 470* ]]; then
Expand Down
95 changes: 95 additions & 0 deletions patches/kernel-6.12.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
From b03fe816d7b2675afdb4c1d10fe7658a5f2b2f82 Mon Sep 17 00:00:00 2001
From: Rahul Rameshbabu <[email protected]>
Date: Tue, 12 Nov 2024 15:01:16 -0800
Subject: [PATCH 6/6] nvidia-drm: Set FOP_UNSIGNED_OFFSET for
nv_drm_fops.fop_flags if present

Linux kernel commit 641bb4394f40 ("fs: move FMODE_UNSIGNED_OFFSET to
fop_flags") introduced a new .fop_flags define, FOP_UNSIGNED_OFFSET, for
struct file_operations. A check in drm_open_helper was added to ensure DRM
device drivers mark that all file offsets passed for working with DRM fs
nodes are unsigned values. If a DRM device driver fails to set this static
member, opening DRM device nodes (/dev/dri/card*) will fail. This commit
will land in Linux kernel v6.12.

To ensure DRM clients will continue to function with kernel v6.12 and
above, set FOP_UNSIGNED_OFFSET for nv_drm_fops.fop_flags if
FOP_UNSIGNED_OFFSET is present in the linux kernel headers being built
against. Without doing so, userspace DRM clients will fail to function. An
example is being unable to launch Wayland compositors.

KWin logs without this change:
kwin_core: Failed to open /dev/dri/card1 device (Invalid argument)
kwin_wayland_drm: failed to open drm device at "/dev/dri/card1"
kwin_core: Failed to open /dev/dri/card0 device (Invalid argument)
kwin_wayland_drm: failed to open drm device at "/dev/dri/card0"
kwin_wayland_drm: No suitable DRM devices have been found

Linux kernel warning generated without this change:
[Oct 2 02:15] ------------[ cut here ]------------
[ +0.000009] WARNING: CPU: 2 PID: 464 at drivers/gpu/drm/drm_file.c:312 drm_open_helper+0x134/0x150
<snip>
[ +0.000108] Unloaded tainted modules: nvidia(OE):1 nvidia_modeset(OE):1 nvidia_drm(OE):1 [last unloaded: ttm]
[ +0.000024] CPU: 2 UID: 0 PID: 464 Comm: systemd-logind Tainted: G OE 6.12.0-rc1-next-20241001-sound+ #10 c8090f98b0209abebde89ba1e4c08c75331eef4d
[ +0.000016] Tainted: [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[ +0.000004] Hardware name: System manufacturer PRIME Z390-A/PRIME Z390-A, BIOS 0224 08/14/2018
[ +0.000005] RIP: 0010:drm_open_helper+0x134/0x150
<snip>
[ +0.000005] Call Trace:
[ +0.000006] <TASK>
[ +0.000004] ? drm_open_helper+0x134/0x150
[ +0.000008] ? __warn.cold+0x93/0xf6
[ +0.000011] ? drm_open_helper+0x134/0x150
[ +0.000009] ? report_bug+0xff/0x140
[ +0.000009] ? handle_bug+0x58/0x90
[ +0.000010] ? exc_invalid_op+0x17/0x70
[ +0.000010] ? asm_exc_invalid_op+0x1a/0x20
[ +0.000018] ? drm_open_helper+0x134/0x150
[ +0.000008] drm_open+0x73/0x110
[ +0.000007] drm_stub_open+0x9b/0xd0
[ +0.000009] chrdev_open+0xb0/0x230
[ +0.000014] ? __pfx_chrdev_open+0x10/0x10
[ +0.000011] do_dentry_open+0x14c/0x4a0
[ +0.000013] vfs_open+0x2e/0xe0
[ +0.000009] path_openat+0x82f/0x13f0
[ +0.000016] do_filp_open+0xc4/0x170
[ +0.000020] do_sys_openat2+0xae/0xe0
[ +0.000010] __x64_sys_openat+0x55/0xa0
[ +0.000009] do_syscall_64+0x82/0x190
[ +0.000008] ? do_readlinkat+0xc5/0x180
[ +0.000008] ? syscall_exit_to_user_mode+0x37/0x1c0
[ +0.000010] ? do_syscall_64+0x8e/0x190
[ +0.000007] ? do_sys_openat2+0x9c/0xe0
[ +0.000009] ? syscall_exit_to_user_mode+0x37/0x1c0
[ +0.000008] ? do_syscall_64+0x8e/0x190
[ +0.000007] ? syscall_exit_to_user_mode+0x37/0x1c0
[ +0.000007] ? do_syscall_64+0x8e/0x190
[ +0.000006] ? do_syscall_64+0x8e/0x190
[ +0.000007] entry_SYSCALL_64_after_hwframe+0x76/0x7e
[ +0.000012] RIP: 0033:0x7f90c1cec2e3
<snip>
[ +0.000004] ---[ end trace 0000000000000000 ]---

Signed-off-by: Rahul Rameshbabu <[email protected]>
---
nvidia-drm/nvidia-drm-drv.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c
index 8cb94219..16f0d13e 100644
--- a/kernel-dkms/nvidia-drm/nvidia-drm-drv.c
+++ b/kernel-dkms/nvidia-drm/nvidia-drm-drv.c
@@ -1711,6 +1711,10 @@ static const struct file_operations nv_drm_fops = {
.read = drm_read,

.llseek = noop_llseek,
+
+#if defined(FOP_UNSIGNED_OFFSET)
+ .fop_flags = FOP_UNSIGNED_OFFSET,
+#endif
};

static const struct drm_ioctl_desc nv_drm_ioctls[] = {
--
2.47.0

0 comments on commit 8f5f63b

Please sign in to comment.