summarylogtreecommitdiffstats
path: root/0006-kernel-5.14.patch
diff options
context:
space:
mode:
authortaz2021-09-16 17:00:28 +0200
committertaz2021-09-16 17:00:28 +0200
commit0b4d1ceb26f27cf82c0b404a52011d1c2c5fcd1e (patch)
tree834501068635c7b8352ce56fa5a079ee70d9d0ca /0006-kernel-5.14.patch
parente191027b2cb48eb17aac9f66a57f936fdadc1b20 (diff)
downloadaur-0b4d1ceb26f27cf82c0b404a52011d1c2c5fcd1e.tar.gz
fix for 5.14, without DRM_LEGACY kernel option
Diffstat (limited to '0006-kernel-5.14.patch')
-rw-r--r--0006-kernel-5.14.patch236
1 files changed, 173 insertions, 63 deletions
diff --git a/0006-kernel-5.14.patch b/0006-kernel-5.14.patch
index 5f610963e4fd..56c8c45ddb0b 100644
--- a/0006-kernel-5.14.patch
+++ b/0006-kernel-5.14.patch
@@ -1,103 +1,213 @@
---- a/kernel/os-interface.c
-+++ b/kernel/os-interface.c
-@@ -549,7 +549,11 @@
- // the requested timeout has expired, loop until less
- // than a jiffie of the desired delay remains.
- //
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
-+ current->__state = TASK_INTERRUPTIBLE;
-+#else
- current->state = TASK_INTERRUPTIBLE;
-+#endif
- do
- {
- schedule_timeout(jiffies);
---- a/kernel/nv-drm.c
-+++ b/kernel/nv-drm.c
-@@ -57,10 +57,13 @@
+diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c
+--- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/nv-drm.c 2021-07-25 10:29:29.336505688 +0200
++++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/nv-drm.c 2021-09-16 16:49:10.929858547 +0200
+@@ -57,8 +57,11 @@
#if defined(NV_DRM_GET_PCI_DEV_PRESENT)
#define nv_drm_get_pci_dev drm_get_pci_dev
#else
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
#include <drm/drm_agpsupport.h>
+-
++#else
++#include <drm/drm_legacy.h>
+#endif
-
#include "linux/dma-buf.h"
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
struct nv_drm_agp_head {
- struct agp_kern_info agp_info;
- struct list_head memory;
-@@ -177,6 +180,7 @@
- dev->agp = NULL;
+@@ -82,6 +85,11 @@
+ struct list_head head;
+ };
+
++struct nv_drm_extra_priv_data {
++ struct pci_dev *pdev;
++ struct drm_agp_head *agp;
++};
++
+ /*
+ * Code from drm_agp_init/nv_drm_{free,unbind}_agp
+ * Extracted from commit: 5b8b9d0c6d0e0f1993c6c56deaf9646942c49d94, file: drivers/gpu/drm/drm_agpsupport.c
+@@ -89,13 +97,14 @@
+ struct drm_agp_head *nv_drm_agp_init(struct drm_device *dev)
+ {
+ struct nv_drm_agp_head *head = NULL;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
+
+ head = kzalloc(sizeof(*head), GFP_KERNEL);
+ if (!head)
+ return NULL;
+- head->bridge = agp_find_bridge(dev->pdev);
++ head->bridge = agp_find_bridge(extra->pdev);
+ if (!head->bridge) {
+- head->bridge = agp_backend_acquire(dev->pdev);
++ head->bridge = agp_backend_acquire(extra->pdev);
+ if (!head->bridge) {
+ kfree(head);
+ return NULL;
+@@ -133,48 +142,71 @@
+ static void nv_drm_pci_agp_init(struct drm_device *dev)
+ {
+ if (drm_core_check_feature(dev, DRIVER_USE_AGP)) {
+- if (pci_find_capability(dev->pdev, PCI_CAP_ID_AGP))
+- dev->agp = nv_drm_agp_init(dev);
+- if (dev->agp) {
+- dev->agp->agp_mtrr = arch_phys_wc_add(
+- dev->agp->agp_info.aper_base,
+- dev->agp->agp_info.aper_size *
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++
++ if (pci_find_capability(extra->pdev, PCI_CAP_ID_AGP))
++ extra->agp = nv_drm_agp_init(dev);
++ if (extra->agp) {
++ extra->agp->agp_mtrr = arch_phys_wc_add(
++ extra->agp->agp_info.aper_base,
++ extra->agp->agp_info.aper_size *
+ 1024 * 1024);
+ }
}
}
+
++#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
++
++#else
++/* copied from v5.14.5 */
++int nv_drm_legacy_agp_release(struct drm_device *dev)
++{
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++
++ if (!extra->agp || !extra->agp->acquired)
++ return -EINVAL;
++ agp_backend_release(extra->agp->bridge);
++ extra->agp->acquired = 0;
++ return 0;
++}
+#endif
++
+ void nv_drm_legacy_agp_clear(struct drm_device *dev)
+ {
+ struct nv_drm_agp_mem *entry, *tempe;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
- static int nv_drm_get_pci_dev(struct pci_dev *pdev,
- const struct pci_device_id *ent,
-@@ -195,7 +199,9 @@
- if (ret)
- goto err_free;
+- if (!dev->agp)
++ if (!extra->agp)
+ return;
+ if (!drm_core_check_feature(dev, DRIVER_LEGACY))
+ return;
+
+- list_for_each_entry_safe(entry, tempe, &dev->agp->memory, head) {
++ list_for_each_entry_safe(entry, tempe, &extra->agp->memory, head) {
+ if (entry->bound)
+ nv_drm_unbind_agp(entry->memory);
+ nv_drm_free_agp(entry->memory, entry->pages);
+ kfree(entry);
+ }
+- INIT_LIST_HEAD(&dev->agp->memory);
++ INIT_LIST_HEAD(&extra->agp->memory);
+- if (dev->agp->acquired)
++ if (extra->agp->acquired)
+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
- dev->pdev = pdev;
+ drm_agp_release(dev);
+-
+- dev->agp->acquired = 0;
+- dev->agp->enabled = 0;
++#else
++ nv_drm_legacy_agp_release(dev);
+#endif
- #ifdef __alpha__
- dev->hose = pdev->sysdata;
- #endif
-@@ -203,11 +209,13 @@
- if (drm_core_check_feature(dev, DRIVER_MODESET))
- pci_set_drvdata(pdev, dev);
++ extra->agp->acquired = 0;
++ extra->agp->enabled = 0;
+ }
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
- nv_drm_pci_agp_init(dev);
+ void nv_drm_pci_agp_destroy(struct drm_device *dev)
+ {
+- if (dev->agp) {
+- arch_phys_wc_del(dev->agp->agp_mtrr);
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
++ if (extra->agp) {
++ arch_phys_wc_del(extra->agp->agp_mtrr);
+ nv_drm_legacy_agp_clear(dev);
+- kfree(dev->agp);
+- dev->agp = NULL;
++ kfree(extra->agp);
++ extra->agp = NULL;
+ }
+ }
- ret = drm_dev_register(dev, ent->driver_data);
- if (ret)
- goto err_agp;
-+#endif
+@@ -183,6 +215,7 @@
+ struct drm_driver *driver)
+ {
+ struct drm_device *dev;
++ struct nv_drm_extra_priv_data *extra;
+ int ret;
- /* No locking needed since shadow-attach is single-threaded since it may
- * only be called from the per-driver module init hook. */
-@@ -218,9 +226,11 @@
+ DRM_DEBUG("\n");
+@@ -191,11 +224,18 @@
+ if (IS_ERR(dev))
+ return PTR_ERR(dev);
- return 0;
++ extra = kzalloc(sizeof(*extra), GFP_KERNEL);
++ if (IS_ERR(extra))
++ goto err_free;
++
++ extra->pdev = pdev;
++
+ ret = pci_enable_device(pdev);
+ if (ret)
+- goto err_free;
++ goto err_free2;
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
+- dev->pdev = pdev;
++ /* use the not used (i hope) dev_private to store deprecated/legacy pointers */
++ dev->dev_private = extra;
+ #ifdef __alpha__
+ dev->hose = pdev->sysdata;
+ #endif
+@@ -221,6 +261,8 @@
err_agp:
nv_drm_pci_agp_destroy(dev);
pci_disable_device(pdev);
-+#endif
++err_free2:
++ kfree(extra);
err_free:
drm_dev_put(dev);
return ret;
-@@ -306,11 +316,13 @@
+@@ -303,10 +345,11 @@
+ )
+ {
+ nv_linux_state_t *nvl;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next)
{
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
- if (nvl->dev == dev->pdev)
+- if (nvl->dev == dev->pdev)
++ if (nvl->dev == extra->pdev)
{
nvl->drm = dev;
return 0;
- }
-+#endif
- }
-
- return -ENODEV;
-@@ -330,12 +342,14 @@
+@@ -327,10 +370,11 @@
+ )
+ {
+ nv_linux_state_t *nvl;
++ struct nv_drm_extra_priv_data *extra = dev->dev_private;
for (nvl = nv_linux_devices; nvl != NULL; nvl = nvl->next)
{
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(5, 14, 0)
- if (nvl->dev == dev->pdev)
+- if (nvl->dev == dev->pdev)
++ if (nvl->dev == extra->pdev)
{
BUG_ON(nvl->drm != dev);
nvl->drm = NULL;
- return 0;
- }
+diff -Naur NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c
+--- NVIDIA-Linux-x86_64-340.108-no-compat32.5.13/kernel/os-interface.c 2021-07-25 10:29:29.083168593 +0200
++++ NVIDIA-Linux-x86_64-340.108-no-compat32.5.14/kernel/os-interface.c 2021-09-16 13:17:43.345906445 +0200
+@@ -549,7 +549,11 @@
+ // the requested timeout has expired, loop until less
+ // than a jiffie of the desired delay remains.
+ //
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 14, 0)
++ current->__state = TASK_INTERRUPTIBLE;
++#else
+ current->state = TASK_INTERRUPTIBLE;
+#endif
- }
-
- return -ENODEV;
+ do
+ {
+ schedule_timeout(jiffies);