From 49fe01a1c12ed3ff5e39b2b41207757257bb8219 Mon Sep 17 00:00:00 2001 From: pongo1231 Date: Thu, 19 Dec 2024 22:33:26 +0100 Subject: [PATCH] nvidia: fix for 6.13 --- configs/victus/default.nix | 2 +- modules/nvidia.nix | 51 +++--- patches/nvidia/6.13/0001-KBuild-changes.patch | 61 +++++++ ...nux-aperture.c-for-removing-conflict.patch | 153 ++++++++++++++++ ...C-TTM-fbdev-emulation-for-Linux-6.13.patch | 163 ++++++++++++++++++ .../6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch | 75 ++++++++ .../nvidia/6.13/0005-OPEN-disable-LKCA.patch | 23 +++ 7 files changed, 507 insertions(+), 21 deletions(-) create mode 100644 patches/nvidia/6.13/0001-KBuild-changes.patch create mode 100644 patches/nvidia/6.13/0002-FROM-AOSC-Use-linux-aperture.c-for-removing-conflict.patch create mode 100644 patches/nvidia/6.13/0003-FROM-AOSC-TTM-fbdev-emulation-for-Linux-6.13.patch create mode 100644 patches/nvidia/6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch create mode 100644 patches/nvidia/6.13/0005-OPEN-disable-LKCA.patch diff --git a/configs/victus/default.nix b/configs/victus/default.nix index 19fec52..3df5a8b 100644 --- a/configs/victus/default.nix +++ b/configs/victus/default.nix @@ -10,7 +10,7 @@ { imports = [ (module /amdcpu.nix) - #(import (module /nvidia.nix) { platform = "amd"; }) + (import (module /nvidia.nix) { platform = "amd"; }) (module /power.nix) (module /libvirt.nix) (import (module /samba.nix) { sharePath = "/home/pongo/Public"; }) diff --git a/modules/nvidia.nix b/modules/nvidia.nix index 9ec5a3e..a93bf5d 100644 --- a/modules/nvidia.nix +++ b/modules/nvidia.nix @@ -19,25 +19,43 @@ let generic = args: finalAttrs.callPackage (import "${inputs.nixpkgs}/pkgs/os-specific/linux/nvidia-x11/generic.nix" args) { }; in { nvidiaPackages.production = (generic { - version = "565.57.01"; - sha256_64bit = "sha256-buvpTlheOF6IBPWnQVLfQUiHv4GcwhvZW3Ks0PsYLHo="; - openSha256 = "sha256-/tM3n9huz1MTE6KKtTCBglBMBGGL/GOHi5ZSUag4zXA="; - settingsSha256 = "sha256-H7uEe34LdmUFcMcS6bz7sbpYhg9zPCb/5AmZZFTx1QA="; + version = "565.77"; + sha256_64bit = "sha256-CnqnQsRrzzTXZpgkAtF7PbH9s7wbiTRNcM0SPByzFHw="; + openSha256 = "sha256-Fxo0t61KQDs71YA8u7arY+503wkAc1foaa51vi2Pl5I="; + settingsSha256 = "sha256-VUetj3LlOSz/LB+DDfMCN34uA4bNTTpjDrb6C6Iwukk="; persistencedSha256 = ""; - #patches = [ (patch /nvidia/0006-Fix-for-6.12.0-rc1-drm_mode_config_funcs.output_poll.patch) ]; - }).overrideAttrs (prevAttrs': { + + patches = [ + (patch /nvidia/6.13/0001-KBuild-changes.patch) + (patch /nvidia/6.13/0002-FROM-AOSC-Use-linux-aperture.c-for-removing-conflict.patch) + (patch /nvidia/6.13/0003-FROM-AOSC-TTM-fbdev-emulation-for-Linux-6.13.patch) + ]; + }).overrideAttrs (finalAttrs': prevAttrs': { # patched builder.sh to not include some egl libraries to prevent apps from blocking nvidia_drm unloading #builder = (patch /nvidia/builder.sh); - patches = prevAttrs'.patches ++ [ - + makeFlags = [ + "IGNORE_PREEMPT_RT_PRESENCE=1" + "NV_BUILD_SUPPORTS_HMM=1" + "SYSSRC=${finalAttrs.kernel.dev}/lib/modules/${finalAttrs.kernel.modDirVersion}/source" + "SYSOUT=${finalAttrs.kernel.dev}/lib/modules/${finalAttrs.kernel.modDirVersion}/build" ]; passthru = prevAttrs'.passthru // { - open = prevAttrs'.passthru.open.overrideAttrs (prevAttrs'': { + open = prevAttrs'.passthru.open.overrideAttrs (finalAttrs'': prevAttrs'': { patches = prevAttrs''.patches ++ [ - #(patch /nvidia/open/0006-Fix-for-6.12.0-rc1-drm_mode_config_funcs.output_poll.patch) - #(patch /nvidia/open/0007-Replace-PageSwapCache-for-6.12-kernel.patch) + (patch /nvidia/6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch) + (patch /nvidia/6.13/0005-OPEN-disable-LKCA.patch) + ]; + + makeFlags = [ + "SYSSRC=${finalAttrs.kernel.dev}/lib/modules/${finalAttrs.kernel.modDirVersion}/source" + "SYSOUT=${finalAttrs.kernel.dev}/lib/modules/${finalAttrs.kernel.modDirVersion}/build" + "MODLIB=$(out)/lib/modules/${finalAttrs.kernel.modDirVersion}" + { + aarch64-linux = "TARGET_ARCH=aarch64"; + x86_64-linux = "TARGET_ARCH=x86_64"; + }.${finalAttrs.stdenv.hostPlatform.system} ]; }); @@ -51,15 +69,8 @@ prime = { offload.enable = true; nvidiaBusId = "PCI:1:0:0"; - } // lib.optionalAttrs - (platform == "intel") - { - intelBusId = "PCI:0:2:0"; - } // lib.optionalAttrs - (platform == "amd") - { - amdgpuBusId = "PCI:5:0:0"; - }; + } // lib.optionalAttrs (platform == "intel") { intelBusId = "PCI:0:2:0"; } + // lib.optionalAttrs (platform == "amd") { amdgpuBusId = "PCI:5:0:0"; }; powerManagement = { enable = true; finegrained = true; diff --git a/patches/nvidia/6.13/0001-KBuild-changes.patch b/patches/nvidia/6.13/0001-KBuild-changes.patch new file mode 100644 index 0000000..4e5f89d --- /dev/null +++ b/patches/nvidia/6.13/0001-KBuild-changes.patch @@ -0,0 +1,61 @@ +From 74962a62abfc350c26d1cf7cc066ef7113a30108 Mon Sep 17 00:00:00 2001 +From: xtex +Date: Sat, 14 Dec 2024 12:39:40 +0800 +Subject: [PATCH] Fix symbolic links for Linux kernel 6.13-rc1 + +Cherry-pick of abc88d52ee5e86decd5e98b3223d3feec0dd66bc from nvidia-driver tracking repo. + +Link: https://gist.github.com/joanbm/d1f89391a4b20f4b56ba931ef6ca62da +Link: https://github.com/NVIDIA/open-gpu-kernel-modules/issues/747 +Author: Joan Bruguera +--- + kernel/nvidia-modeset/nvidia-modeset.Kbuild | 8 +++++--- + kernel/nvidia/nvidia.Kbuild | 8 +++++--- + 2 files changed, 10 insertions(+), 6 deletions(-) + +diff --git a/kernel/nvidia-modeset/nvidia-modeset.Kbuild b/kernel/nvidia-modeset/nvidia-modeset.Kbuild +index 9698b59e2..d0c244f62 100644 +--- a/kernel/nvidia-modeset/nvidia-modeset.Kbuild ++++ b/kernel/nvidia-modeset/nvidia-modeset.Kbuild +@@ -40,13 +40,15 @@ NV_KERNEL_MODULE_TARGETS += $(NVIDIA_MODESET_KO) + NVIDIA_MODESET_BINARY_OBJECT := $(src)/nvidia-modeset/nv-modeset-kernel.o_binary + NVIDIA_MODESET_BINARY_OBJECT_O := nvidia-modeset/nv-modeset-kernel.o + +-quiet_cmd_symlink = SYMLINK $@ +-cmd_symlink = ln -sf $< $@ ++# Rel. commit 80f289101690 "kbuild: change working directory to external module directory with M=" (Masahiro Yamada, 10 Nov 2024) ++# Ensure `$<` is absolute, since the link target is resolved relative to its path, not from where `ln` is run from. ++quiet_cmd_symlinkabs = SYMLINK $@ ++cmd_symlinkabs = ln -sf $(abspath $<) $@ + + targets += $(NVIDIA_MODESET_BINARY_OBJECT_O) + + $(obj)/$(NVIDIA_MODESET_BINARY_OBJECT_O): $(NVIDIA_MODESET_BINARY_OBJECT) FORCE +- $(call if_changed,symlink) ++ $(call if_changed,symlinkabs) + + nvidia-modeset-y += $(NVIDIA_MODESET_BINARY_OBJECT_O) + +diff --git a/kernel/nvidia/nvidia.Kbuild b/kernel/nvidia/nvidia.Kbuild +index ea4ef5bad..4262c6f35 100644 +--- a/kernel/nvidia/nvidia.Kbuild ++++ b/kernel/nvidia/nvidia.Kbuild +@@ -40,13 +40,15 @@ NVIDIA_KO = nvidia/nvidia.ko + NVIDIA_BINARY_OBJECT := $(src)/nvidia/nv-kernel.o_binary + NVIDIA_BINARY_OBJECT_O := nvidia/nv-kernel.o + +-quiet_cmd_symlink = SYMLINK $@ +- cmd_symlink = ln -sf $< $@ ++# Rel. commit 80f289101690 "kbuild: change working directory to external module directory with M=" (Masahiro Yamada, 10 Nov 2024) ++# Ensure `$<` is absolute, since the link target is resolved relative to its path, not from where `ln` is run from. ++quiet_cmd_symlinkabs = SYMLINK $@ ++ cmd_symlinkabs = ln -sf $(abspath $<) $@ + + targets += $(NVIDIA_BINARY_OBJECT_O) + + $(obj)/$(NVIDIA_BINARY_OBJECT_O): $(NVIDIA_BINARY_OBJECT) FORCE +- $(call if_changed,symlink) ++ $(call if_changed,symlinkabs) + + nvidia-y += $(NVIDIA_BINARY_OBJECT_O) + diff --git a/patches/nvidia/6.13/0002-FROM-AOSC-Use-linux-aperture.c-for-removing-conflict.patch b/patches/nvidia/6.13/0002-FROM-AOSC-Use-linux-aperture.c-for-removing-conflict.patch new file mode 100644 index 0000000..fae7798 --- /dev/null +++ b/patches/nvidia/6.13/0002-FROM-AOSC-Use-linux-aperture.c-for-removing-conflict.patch @@ -0,0 +1,153 @@ +From 8113cd50461f05da52b66934237415dd303ec55c Mon Sep 17 00:00:00 2001 +From: Bingwu Zhang +Date: Sat, 7 Dec 2024 23:01:26 +0800 +Subject: [PATCH 2/3] FROM AOSC: Use linux/aperture.c for removing conflicting + PCI devices on Linux 6.13.0-rc1+ +X-Developer-Signature: v=1; a=openpgp-sha256; l=6111; i=xtexchooser@duck.com; + h=from:subject; bh=hS408kVBp8zz0JO5do1a5Ut1vawCN67uYWAOfNTDy/w=; + b=owGbwMvMwCW2U4Ij7wZL9ETG02pJDOkhRf8j7mS/f32ZLdl9b2TWxCs3m5lyr+aoKs8zKJFn7 + /OcNSmho5SFQYyLQVZMkaXIsMGbVSedX3RZuSzMHFYmkCEMXJwCMBHD1YwMhyfeyKryPeXAv2pm + q5nasVPaO/YZnf4Q8X6PiPPvW3+PcDIy3HF1/3BpUxDXm5sWDPxPGJp/l2X9OHr21zPZv7ZrCmd + M5AEA +X-Developer-Key: i=xtexchooser@duck.com; a=openpgp; + fpr=7231804B052C670F15A6771DB918086ED8045B91 + +Link: https://github.com/torvalds/linux/commit/689274a56c0c088796d359f6c6267323931a2429 +Link: https://github.com/torvalds/linux/commit/7283f862bd991c8657e9bf1c02db772fcf018f13 +Link: https://github.com/NVIDIA/open-gpu-kernel-modules/issues/749 +--- + conftest.sh | 19 +++++++++++++++++++ + header-presence-tests.mk | 1 + + nvidia-drm/nvidia-drm-drv.c | 15 +++++++++++++++ + nvidia-drm/nvidia-drm-os-interface.h | 10 ++++++++++ + nvidia-drm/nvidia-drm-sources.mk | 1 + + 5 files changed, 46 insertions(+) + +diff --git a/kernel/conftest.sh b/kernel/conftest.sh +index fdceda72da33..5a0f39e0b2a7 100755 +--- a/kernel/conftest.sh ++++ b/kernel/conftest.sh +@@ -6615,6 +6615,8 @@ compile_test() { + # Added by commit 2916059147ea ("drm/aperture: Add infrastructure + # for aperture ownership") in v5.14. + # ++ # Removed by commit 689274a56c0c ("drm: Remove DRM aperture helpers") in v6.13. ++ # + CODE=" + #if defined(NV_DRM_DRM_APERTURE_H_PRESENT) + #include +@@ -6626,6 +6628,23 @@ compile_test() { + compile_check_conftest "$CODE" "NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT" "" "functions" + ;; + ++ aperture_remove_conflicting_pci_devices) ++ # ++ # Determine whether aperture_remove_conflicting_pci_devices is present. ++ # ++ # Added by commit 7283f862bd99 ("drm: Implement DRM aperture helpers under video/") in v6.0. ++ # ++ CODE=" ++ #if defined(NV_LINUX_APERTURE_H_PRESENT) ++ #include ++ #endif ++ void conftest_aperture_remove_conflicting_pci_devices(void) { ++ aperture_remove_conflicting_pci_devices(); ++ }" ++ ++ compile_check_conftest "$CODE" "NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT" "" "functions" ++ ;; ++ + drm_aperture_remove_conflicting_pci_framebuffers_has_driver_arg) + # + # Determine whether drm_aperture_remove_conflicting_pci_framebuffers +diff --git a/kernel/header-presence-tests.mk b/kernel/header-presence-tests.mk +index 9d5217a9f8b9..b02685418629 100644 +--- a/kernel/header-presence-tests.mk ++++ b/kernel/header-presence-tests.mk +@@ -34,6 +34,7 @@ NV_HEADER_PRESENCE_TESTS = \ + generated/autoconf.h \ + generated/compile.h \ + generated/utsrelease.h \ ++ linux/aperture.h \ + linux/efi.h \ + linux/kconfig.h \ + linux/platform/tegra/mc_utils.h \ +diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c +index 8f905f821444..57a4ab82b3fc 100644 +--- a/kernel/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel/nvidia-drm/nvidia-drm-drv.c +@@ -65,7 +65,16 @@ + #endif + + #if defined(NV_DRM_FBDEV_AVAILABLE) ++// Commit 7283f862bd99 ("drm: Implement DRM aperture helpers under video/") ++// moved implementation of drm_aperture_... to linux/aperture.c. ++// Commit 689274a56c0c ("drm: Remove DRM aperture helpers") ++// removed drm/drm_aperture.h. ++#if defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT) + #include ++#endif ++#if defined(NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT) ++#include ++#endif + #include + #endif + +@@ -2013,10 +2022,16 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) + if (bus_is_pci) { + struct pci_dev *pdev = to_pci_dev(device); + ++#if defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT) ++ printk(KERN_INFO "AOSC OS: %s: using drm_aperture for old kernels\n", nv_drm_driver.name); + #if defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_HAS_DRIVER_ARG) + drm_aperture_remove_conflicting_pci_framebuffers(pdev, &nv_drm_driver); + #else + drm_aperture_remove_conflicting_pci_framebuffers(pdev, nv_drm_driver.name); ++#endif ++#elif defined(NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT) ++ printk(KERN_INFO "AOSC OS: %s: using linux/aperture workaround for Linux 6.13+\n", nv_drm_driver.name); ++ aperture_remove_conflicting_pci_devices(pdev, nv_drm_driver.name); + #endif + nvKms->framebufferConsoleDisabled(nv_dev->pDevice); + } +diff --git a/kernel/nvidia-drm/nvidia-drm-os-interface.h b/kernel/nvidia-drm/nvidia-drm-os-interface.h +index a6b0f947e0ab..71ca5f226ad7 100644 +--- a/kernel/nvidia-drm/nvidia-drm-os-interface.h ++++ b/kernel/nvidia-drm/nvidia-drm-os-interface.h +@@ -63,11 +63,21 @@ typedef struct nv_timer nv_drm_timer; + #define NV_DRM_FBDEV_GENERIC_AVAILABLE + #endif + ++#if defined(NV_DRM_FBDEV_GENERIC_SETUP_PRESENT) && defined(NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT) ++#define NV_DRM_FBDEV_AVAILABLE ++#define NV_DRM_FBDEV_GENERIC_AVAILABLE ++#endif ++ + #if defined(NV_DRM_FBDEV_TTM_SETUP_PRESENT) && defined(NV_DRM_APERTURE_REMOVE_CONFLICTING_PCI_FRAMEBUFFERS_PRESENT) + #define NV_DRM_FBDEV_AVAILABLE + #define NV_DRM_FBDEV_TTM_AVAILABLE + #endif + ++#if defined(NV_DRM_FBDEV_TTM_SETUP_PRESENT) && defined(NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT) ++#define NV_DRM_FBDEV_AVAILABLE ++#define NV_DRM_FBDEV_TTM_AVAILABLE ++#endif ++ + struct page; + + /* Set to true when the atomic modeset feature is enabled. */ +diff --git a/kernel/nvidia-drm/nvidia-drm-sources.mk b/kernel/nvidia-drm/nvidia-drm-sources.mk +index 9aaebd04ace2..a4dcad6de609 100644 +--- a/kernel/nvidia-drm/nvidia-drm-sources.mk ++++ b/kernel/nvidia-drm/nvidia-drm-sources.mk +@@ -66,6 +66,7 @@ NV_CONFTEST_FUNCTION_COMPILE_TESTS += dma_fence_set_error + NV_CONFTEST_FUNCTION_COMPILE_TESTS += fence_set_error + NV_CONFTEST_FUNCTION_COMPILE_TESTS += sync_file_get_fence + NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_aperture_remove_conflicting_pci_framebuffers ++NV_CONFTEST_FUNCTION_COMPILE_TESTS += aperture_remove_conflicting_pci_devices + NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_fbdev_generic_setup + NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_fbdev_ttm_setup + NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_connector_attach_hdr_output_metadata_property +-- +2.47.1 + diff --git a/patches/nvidia/6.13/0003-FROM-AOSC-TTM-fbdev-emulation-for-Linux-6.13.patch b/patches/nvidia/6.13/0003-FROM-AOSC-TTM-fbdev-emulation-for-Linux-6.13.patch new file mode 100644 index 0000000..95c4997 --- /dev/null +++ b/patches/nvidia/6.13/0003-FROM-AOSC-TTM-fbdev-emulation-for-Linux-6.13.patch @@ -0,0 +1,163 @@ +From 686f6869c0edfc725e1af2e1e72e30caa7589887 Mon Sep 17 00:00:00 2001 +From: Bingwu Zhang +Date: Sat, 7 Dec 2024 23:56:43 +0800 +Subject: [PATCH 3/3] FROM AOSC: TTM fbdev emulation for Linux 6.13+ +X-Developer-Signature: v=1; a=openpgp-sha256; l=5409; i=xtexchooser@duck.com; + h=from:subject; bh=+rLvUfeSo5yL2QZg7/YHp54RjssmMnMdIH/tCswBBvY=; + b=owGbwMvMwCW2U4Ij7wZL9ETG02pJDOkhRf8L3Q/X+l1zYDhZoCS/Pnr5tvNPtq4Kaks5duFbP + JPGFdXmjlIWBjEuBlkxRZYiwwZvVp10ftFl5bIwc1iZQIYwcHEKwEQElzD84d39be3dDUWTfzS3 + 922c9aYriyd4c4NR2tKSmik7agSOnGZk+KX57nBit8ax2gr92xo/5GZ/kd/96+uWzbWl6dYO0/X + PcwAA +X-Developer-Key: i=xtexchooser@duck.com; a=openpgp; + fpr=7231804B052C670F15A6771DB918086ED8045B91 + +Link: https://github.com/torvalds/linux/commit/1000634477d8d178179b1ad45d92e925fabe3deb +Link: https://github.com/NVIDIA/open-gpu-kernel-modules/issues/749 +Signed-off-by: xtex +--- + nvidia-drm/nvidia-drm-drv.c | 72 ++++++++++++++++++++++++++++ + nvidia-drm/nvidia-drm-linux.c | 4 ++ + nvidia-drm/nvidia-drm-os-interface.h | 5 ++ + 3 files changed, 81 insertions(+) + +diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c +index 57a4ab82b3fc..2618d48a74af 100644 +--- a/kernel/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel/nvidia-drm/nvidia-drm-drv.c +@@ -1951,7 +1951,60 @@ void nv_drm_update_drm_driver_features(void) + #endif /* NV_DRM_ATOMIC_MODESET_AVAILABLE */ + } + ++#if !defined(NV_DRM_FBDEV_TTM_AVAILABLE) && \ ++ !defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) ++// AOSC OS: Workaround for Linux 6.13+ + ++static const struct drm_fb_helper_funcs nv_drm_fbdev_helper_funcs = { ++ .fb_probe = drm_fbdev_ttm_driver_fbdev_probe, ++}; ++ ++static void nv_drm_fbdev_client_unregister(struct drm_client_dev *client) ++{ ++ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); ++ if (fb_helper->info) { ++ drm_fb_helper_unregister_info(fb_helper); ++ } else { ++ drm_client_release(&fb_helper->client); ++ drm_fb_helper_unprepare(fb_helper); ++ kfree(fb_helper); ++ } ++} ++static int nv_drm_fbdev_client_restore(struct drm_client_dev *client) ++{ ++ drm_fb_helper_lastclose(client->dev); ++ return 0; ++} ++static int nv_drm_fbdev_client_hotplug(struct drm_client_dev *client) ++{ ++ struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); ++ struct drm_device *dev = client->dev; ++ int ret; ++ if (dev->fb_helper) ++ return drm_fb_helper_hotplug_event(dev->fb_helper); ++ ret = drm_fb_helper_init(dev, fb_helper); ++ if (ret) ++ goto err_drm_err; ++ if (!drm_drv_uses_atomic_modeset(dev)) ++ drm_helper_disable_unused_functions(dev); ++ ret = drm_fb_helper_initial_config(fb_helper); ++ if (ret) ++ goto err_drm_fb_helper_fini; ++ return 0; ++err_drm_fb_helper_fini: ++ drm_fb_helper_fini(fb_helper); ++err_drm_err: ++ drm_err(dev, "AOSC OS: NV-DRM: fbdev: Failed to setup emulation (ret=%d)\n", ret); ++ return ret; ++} ++ ++static const struct drm_client_funcs nv_drm_fbdev_client_funcs = { ++ .owner = THIS_MODULE, ++ .unregister = nv_drm_fbdev_client_unregister, ++ .restore = nv_drm_fbdev_client_restore, ++ .hotplug = nv_drm_fbdev_client_hotplug, ++}; ++#endif + + /* + * Helper function for allocate/register DRM device for given NVIDIA GPU ID. +@@ -1961,6 +2014,7 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) + struct nv_drm_device *nv_dev = NULL; + struct drm_device *dev = NULL; + struct device *device = gpu_info->os_device_ptr; ++ struct drm_fb_helper *fb_helper = NULL; + bool bus_is_pci; + + DRM_DEBUG( +@@ -2039,6 +2093,20 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) + drm_fbdev_ttm_setup(dev, 32); + #elif defined(NV_DRM_FBDEV_GENERIC_AVAILABLE) + drm_fbdev_generic_setup(dev, 32); ++ #else ++ // AOSC OS: Workaround for Linux 6.13+ ++ int drm_client_ret; ++ fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL); ++ if (!fb_helper) ++ return; ++ drm_fb_helper_prepare(dev, fb_helper, 32, &nv_drm_fbdev_helper_funcs); ++ drm_client_ret = drm_client_init(dev, &fb_helper->client, "fbdev", ++ &nv_drm_fbdev_client_funcs); ++ if (drm_client_ret) { ++ drm_err(dev, "AOSC OS: NV-DRM: Failed to register DRM client: %d\n", drm_client_ret); ++ goto failed_drm_client_init; ++ } ++ drm_client_register(&fb_helper->client); + #endif + } + #endif /* defined(NV_DRM_FBDEV_AVAILABLE) */ +@@ -2050,6 +2118,10 @@ void nv_drm_register_drm_device(const nv_gpu_info_t *gpu_info) + + return; /* Success */ + ++failed_drm_client_init: ++ drm_fb_helper_unprepare(fb_helper); ++ kfree(fb_helper); ++ + failed_drm_register: + + nv_drm_dev_free(dev); +diff --git a/kernel/nvidia-drm/nvidia-drm-linux.c b/kernel/nvidia-drm/nvidia-drm-linux.c +index 78d4c343fc80..87715c0bf09e 100644 +--- a/kernel/nvidia-drm/nvidia-drm-linux.c ++++ b/kernel/nvidia-drm/nvidia-drm-linux.c +@@ -39,8 +39,12 @@ MODULE_PARM_DESC( + fbdev, + "Create a framebuffer device (1 = enable, 0 = disable (default)) (EXPERIMENTAL)"); + module_param_named(fbdev, nv_drm_fbdev_module_param, bool, 0400); ++#else ++#error "AOSC OS: nvidia-drm fbdev should always be available." + #endif + ++#else ++#error "AOSC OS: nvidia-drm is not available" + #endif /* NV_DRM_AVAILABLE */ + + /************************************************************************* +diff --git a/kernel/nvidia-drm/nvidia-drm-os-interface.h b/kernel/nvidia-drm/nvidia-drm-os-interface.h +index 71ca5f226ad7..8195af32c39e 100644 +--- a/kernel/nvidia-drm/nvidia-drm-os-interface.h ++++ b/kernel/nvidia-drm/nvidia-drm-os-interface.h +@@ -78,6 +78,11 @@ typedef struct nv_timer nv_drm_timer; + #define NV_DRM_FBDEV_TTM_AVAILABLE + #endif + ++// AOSC OS: Always enable DRM fbdev ++// FIXME: Add config test for drm helper functions. ++// The implementation uses drm_client_register, which is added in v5.2-rc1. ++#define NV_DRM_FBDEV_AVAILABLE ++ + struct page; + + /* Set to true when the atomic modeset feature is enabled. */ +-- +2.47.1 + diff --git a/patches/nvidia/6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch b/patches/nvidia/6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch new file mode 100644 index 0000000..237ad38 --- /dev/null +++ b/patches/nvidia/6.13/0004-OPEN-Fix-MODULE_IMPORT_NS.patch @@ -0,0 +1,75 @@ +From 2c53bdfd0b99d5c59273d26c315d73b4e3d4af36 Mon Sep 17 00:00:00 2001 +From: xtex +Date: Sat, 14 Dec 2024 13:28:50 +0800 +Subject: [PATCH] FROM AOSC: Convert symbol namespace to string literal + +This fixes build on kernel 6.13+. + +Follow-up: cdd30ebb1b9f ("module: Convert symbol namespace to string literal") +Fixes: cdd30ebb1b9f ("module: Convert symbol namespace to string literal") +Signed-off-by: xtex +--- + kernel-open/conftest.sh | 15 +++++++++++++++ + kernel-open/nvidia/nv.c | 5 +++++ + kernel-open/nvidia/nvidia.Kbuild | 1 + + 3 files changed, 21 insertions(+) + +diff --git a/kernel-open/conftest.sh b/kernel-open/conftest.sh +index 5a0f39e0b..90736726b 100755 +--- a/kernel-open/conftest.sh ++++ b/kernel-open/conftest.sh +@@ -7193,6 +7193,21 @@ compile_test() { + compile_check_conftest "$CODE" "NV_FOLIO_TEST_SWAPCACHE_PRESENT" "" "functions" + ;; + ++ module_import_ns_string) ++ # ++ # Determine if the MODULE_IMPORT_NS() macro accepts string literal. ++ # ++ # Changed in cdd30ebb1b9f ("module: Convert symbol namespace to string literal") in 6.13-rc2 ++ # ++ CODE=" ++ #include ++ MODULE_IMPORT_NS(\"DMA_BUF\"); ++ void conftest_module_import_ns_string(void) { ++ }" ++ ++ compile_check_conftest "$CODE" "NV_MODULE_IMPORT_NS_STRING" "" "types" ++ ;; ++ + # When adding a new conftest entry, please use the correct format for + # specifying the relevant upstream Linux kernel commit. Please + # avoid specifying -rc kernels, and only use SHAs that actually exist +diff --git a/kernel-open/nvidia/nv.c b/kernel-open/nvidia/nv.c +index 83705a051..3414098c5 100644 +--- a/kernel-open/nvidia/nv.c ++++ b/kernel-open/nvidia/nv.c +@@ -105,6 +105,7 @@ + #endif + + #include "conftest/patches.h" ++#include "conftest/types.h" + + #include "detect-self-hosted.h" + +@@ -127,7 +128,11 @@ MODULE_ALIAS_CHARDEV_MAJOR(NV_MAJOR_DEVICE_NUMBER); + * DMA_BUF namespace is added by commit id 16b0314aa746 + * ("dma-buf: move dma-buf symbols into the DMA_BUF module namespace") in 5.16 + */ ++#if defined(NV_MODULE_IMPORT_NS_STRING) ++MODULE_IMPORT_NS("DMA_BUF"); ++#else + MODULE_IMPORT_NS(DMA_BUF); ++#endif + #endif // defined(MODULE_IMPORT_NS) + + const NvBool nv_is_rm_firmware_supported_os = NV_TRUE; +diff --git a/kernel-open/nvidia/nvidia.Kbuild b/kernel-open/nvidia/nvidia.Kbuild +index 4262c6f35..5f5c0201a 100644 +--- a/kernel-open/nvidia/nvidia.Kbuild ++++ b/kernel-open/nvidia/nvidia.Kbuild +@@ -276,3 +276,4 @@ NV_CONFTEST_GENERIC_COMPILE_TESTS += mdev_available + NV_CONFTEST_GENERIC_COMPILE_TESTS += cmd_uphy_display_port_init + NV_CONFTEST_GENERIC_COMPILE_TESTS += cmd_uphy_display_port_off + NV_CONFTEST_GENERIC_COMPILE_TESTS += memory_failure_mf_sw_simulated_defined ++NV_CONFTEST_GENERIC_COMPILE_TESTS += module_import_ns_string diff --git a/patches/nvidia/6.13/0005-OPEN-disable-LKCA.patch b/patches/nvidia/6.13/0005-OPEN-disable-LKCA.patch new file mode 100644 index 0000000..de79dd0 --- /dev/null +++ b/patches/nvidia/6.13/0005-OPEN-disable-LKCA.patch @@ -0,0 +1,23 @@ +From 28e20fdf3278d4e6e68584b6e3a506e832ab8b6b Mon Sep 17 00:00:00 2001 +From: xtex +Date: Sat, 14 Dec 2024 13:47:12 +0800 +Subject: [PATCH] FROM AOSC: Disable LKCA + +--- + kernel-open/nvidia/internal_crypt_lib.h | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/kernel-open/nvidia/internal_crypt_lib.h b/kernel-open/nvidia/internal_crypt_lib.h +index 2eac7d5e4..7279085f6 100644 +--- a/kernel-open/nvidia/internal_crypt_lib.h ++++ b/kernel-open/nvidia/internal_crypt_lib.h +@@ -65,7 +65,8 @@ + * define stubs to return errors. + */ + #if defined(NV_CRYPTO_PRESENT) && defined (NV_CONFIG_CRYPTO_PRESENT) +-#define USE_LKCA 1 ++// AOSC OS: 6b34562f0cfe ("crypto: akcipher - Drop sign/verify operations") breaks LKCA ++// #define USE_LKCA 1 + #endif + + #ifdef USE_LKCA