diff --git a/pkgs/os-specific/linux/nvidia-x11/TTM-fbdev-emulation-for-Linux-6.13.patch b/pkgs/os-specific/linux/nvidia-x11/TTM-fbdev-emulation-for-Linux-6.13.patch new file mode 100644 index 000000000000..3376f8341b9f --- /dev/null +++ b/pkgs/os-specific/linux/nvidia-x11/TTM-fbdev-emulation-for-Linux-6.13.patch @@ -0,0 +1,156 @@ +From 88b8ae7642ef21e685d51148e8f57c3dfa1323ac Mon Sep 17 00:00:00 2001 +From: Bingwu Zhang +Date: Sat, 7 Dec 2024 23:56:43 +0800 +Subject: [PATCH 10/10] FROM AOSC: TTM fbdev emulation for Linux 6.13+ + +Link: https://github.com/torvalds/linux/commit/1000634477d8d178179b1ad45d92e925fabe3deb +Link: https://github.com/NVIDIA/open-gpu-kernel-modules/issues/749 +Signed-off-by: xtex +Signed-off-by: Eric Naim +--- + kernel-open/nvidia-drm/nvidia-drm-drv.c | 72 +++++++++++++++++++ + kernel-open/nvidia-drm/nvidia-drm-linux.c | 4 ++ + .../nvidia-drm/nvidia-drm-os-interface.h | 5 ++ + 3 files changed, 81 insertions(+) + +diff --git a/kernel-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c +index 2e4f6404..ab85152f 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel-open/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-open/nvidia-drm/nvidia-drm-linux.c b/kernel-open/nvidia-drm/nvidia-drm-linux.c +index 83d40983..ac4fe967 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-linux.c ++++ b/kernel-open/nvidia-drm/nvidia-drm-linux.c +@@ -39,8 +39,12 @@ MODULE_PARM_DESC( + fbdev, + "Create a framebuffer device (1 = enable (default), 0 = disable) (EXPERIMENTAL)"); + module_param_named(fbdev, nv_drm_fbdev_module_param, bool, 0400); ++#else ++#error "nvidia-drm fbdev should always be available." + #endif + ++#else ++#error "nvidia-drm is not available" + #endif /* NV_DRM_AVAILABLE */ + + /************************************************************************* +diff --git a/kernel-open/nvidia-drm/nvidia-drm-os-interface.h b/kernel-open/nvidia-drm/nvidia-drm-os-interface.h +index 71ca5f22..8195af32 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-os-interface.h ++++ b/kernel-open/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/pkgs/os-specific/linux/nvidia-x11/Use-linux-aperture.c-for-removing-conflict.patch b/pkgs/os-specific/linux/nvidia-x11/Use-linux-aperture.c-for-removing-conflict.patch new file mode 100644 index 000000000000..ecff6a2bb0ce --- /dev/null +++ b/pkgs/os-specific/linux/nvidia-x11/Use-linux-aperture.c-for-removing-conflict.patch @@ -0,0 +1,146 @@ +From 11501d99348a04c608a19330d984188f4766e603 Mon Sep 17 00:00:00 2001 +From: Bingwu Zhang +Date: Sat, 7 Dec 2024 23:01:26 +0800 +Subject: [PATCH 09/10] FROM AOSC: Use linux/aperture.c for removing + conflicting PCI devices on Linux 6.13.0-rc1+ + +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 +Signed-off-by: Eric Naim +--- + kernel-open/conftest.sh | 19 +++++++++++++++++++ + kernel-open/header-presence-tests.mk | 1 + + kernel-open/nvidia-drm/nvidia-drm-drv.c | 15 +++++++++++++++ + .../nvidia-drm/nvidia-drm-os-interface.h | 10 ++++++++++ + kernel-open/nvidia-drm/nvidia-drm-sources.mk | 1 + + 5 files changed, 46 insertions(+) + +diff --git a/kernel-open/conftest.sh b/kernel-open/conftest.sh +index fdceda72..5a0f39e0 100755 +--- a/kernel-open/conftest.sh ++++ b/kernel-open/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-open/header-presence-tests.mk b/kernel-open/header-presence-tests.mk +index 9d5217a9..b0268541 100644 +--- a/kernel-open/header-presence-tests.mk ++++ b/kernel-open/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-open/nvidia-drm/nvidia-drm-drv.c b/kernel-open/nvidia-drm/nvidia-drm-drv.c +index 8f905f82..2e4f6404 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-drv.c ++++ b/kernel-open/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 "%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 "%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-open/nvidia-drm/nvidia-drm-os-interface.h b/kernel-open/nvidia-drm/nvidia-drm-os-interface.h +index a6b0f947..71ca5f22 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-os-interface.h ++++ b/kernel-open/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-open/nvidia-drm/nvidia-drm-sources.mk b/kernel-open/nvidia-drm/nvidia-drm-sources.mk +index 9aaebd04..a4dcad6d 100644 +--- a/kernel-open/nvidia-drm/nvidia-drm-sources.mk ++++ b/kernel-open/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/pkgs/os-specific/linux/nvidia-x11/default.nix b/pkgs/os-specific/linux/nvidia-x11/default.nix index 1e073aab2682..a97f70a0bd29 100644 --- a/pkgs/os-specific/linux/nvidia-x11/default.nix +++ b/pkgs/os-specific/linux/nvidia-x11/default.nix @@ -89,6 +89,8 @@ rec { patchesOpen = [ ./nvidia-nv-Convert-symbol-namespace-to-string-literal.patch ./crypto-Add-fix-for-6.13-Module-compilation.patch + ./Use-linux-aperture.c-for-removing-conflict.patch + ./TTM-fbdev-emulation-for-Linux-6.13.patch ]; });