Last active
December 7, 2024 23:18
-
-
Save xtexx/da92d9df902788b75f746f348552ae80 to your computer and use it in GitHub Desktop.
nvidia-drm 565.77 fix for Linux kernel 6.13-rc1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 8113cd50461f05da52b66934237415dd303ec55c Mon Sep 17 00:00:00 2001 | |
From: Bingwu Zhang <[email protected]> | |
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; [email protected]; | |
h=from:subject; bh=hS408kVBp8zz0JO5do1a5Ut1vawCN67uYWAOfNTDy/w=; | |
b=owGbwMvMwCW2U4Ij7wZL9ETG02pJDOkhRf8j7mS/f32ZLdl9b2TWxCs3m5lyr+aoKs8zKJFn7 | |
/OcNSmho5SFQYyLQVZMkaXIsMGbVSedX3RZuSzMHFYmkCEMXJwCMBHD1YwMhyfeyKryPeXAv2pm | |
q5nasVPaO/YZnf4Q8X6PiPPvW3+PcDIy3HF1/3BpUxDXm5sWDPxPGJp/l2X9OHr21zPZv7ZrCmd | |
M5AEA | |
X-Developer-Key: [email protected]; 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/conftest.sh b/conftest.sh | |
index fdceda72da33..5a0f39e0b2a7 100755 | |
--- a/conftest.sh | |
+++ b/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/header-presence-tests.mk b/header-presence-tests.mk | |
index 9d5217a9f8b9..b02685418629 100644 | |
--- a/header-presence-tests.mk | |
+++ b/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/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c | |
index 8f905f821444..57a4ab82b3fc 100644 | |
--- a/nvidia-drm/nvidia-drm-drv.c | |
+++ b/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 "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/nvidia-drm/nvidia-drm-os-interface.h b/nvidia-drm/nvidia-drm-os-interface.h | |
index a6b0f947e0ab..71ca5f226ad7 100644 | |
--- a/nvidia-drm/nvidia-drm-os-interface.h | |
+++ b/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/nvidia-drm/nvidia-drm-sources.mk b/nvidia-drm/nvidia-drm-sources.mk | |
index 9aaebd04ace2..a4dcad6de609 100644 | |
--- a/nvidia-drm/nvidia-drm-sources.mk | |
+++ b/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 | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
From 686f6869c0edfc725e1af2e1e72e30caa7589887 Mon Sep 17 00:00:00 2001 | |
From: Bingwu Zhang <[email protected]> | |
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; [email protected]; | |
h=from:subject; bh=+rLvUfeSo5yL2QZg7/YHp54RjssmMnMdIH/tCswBBvY=; | |
b=owGbwMvMwCW2U4Ij7wZL9ETG02pJDOkhRf8L3Q/X+l1zYDhZoCS/Pnr5tvNPtq4Kaks5duFbP | |
JPGFdXmjlIWBjEuBlkxRZYiwwZvVp10ftFl5bIwc1iZQIYwcHEKwEQElzD84d39be3dDUWTfzS3 | |
922c9aYriyd4c4NR2tKSmik7agSOnGZk+KX57nBit8ax2gr92xo/5GZ/kd/96+uWzbWl6dYO0/X | |
PcwAA | |
X-Developer-Key: [email protected]; 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 <[email protected]> | |
--- | |
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/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c | |
index 57a4ab82b3fc..2618d48a74af 100644 | |
--- a/nvidia-drm/nvidia-drm-drv.c | |
+++ b/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/nvidia-drm/nvidia-drm-linux.c b/nvidia-drm/nvidia-drm-linux.c | |
index 78d4c343fc80..87715c0bf09e 100644 | |
--- a/nvidia-drm/nvidia-drm-linux.c | |
+++ b/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/nvidia-drm/nvidia-drm-os-interface.h b/nvidia-drm/nvidia-drm-os-interface.h | |
index 71ca5f226ad7..8195af32c39e 100644 | |
--- a/nvidia-drm/nvidia-drm-os-interface.h | |
+++ b/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 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment