linuxPackages_latest.nvidiaPackages.latest: fix fbdev on 6.13
This commit is contained in:
@@ -0,0 +1,156 @@
|
||||
From 88b8ae7642ef21e685d51148e8f57c3dfa1323ac Mon Sep 17 00:00:00 2001
|
||||
From: Bingwu Zhang <xtex@aosc.io>
|
||||
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 <xtexchooser@duck.com>
|
||||
Signed-off-by: Eric Naim <dnaim@cachyos.org>
|
||||
---
|
||||
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
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
From 11501d99348a04c608a19330d984188f4766e603 Mon Sep 17 00:00:00 2001
|
||||
From: Bingwu Zhang <xtex@aosc.io>
|
||||
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 <dnaim@cachyos.org>
|
||||
---
|
||||
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 <drm/drm_aperture.h>
|
||||
@@ -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 <linux/aperture.h>
|
||||
+ #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 <drm/drm_aperture.h>
|
||||
+#endif
|
||||
+#if defined(NV_APERTURE_REMOVE_CONFLICTING_PCI_DEVICES_PRESENT)
|
||||
+#include <linux/aperture.h>
|
||||
+#endif
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#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
|
||||
|
||||
@@ -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
|
||||
];
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user