xf86-video-nvidia: allow build with kernel 5.18

Patch from:
- https://gist.github.com/joanbm/c00f9e19731d80269a4badc595f63b68
This commit is contained in:
Rudi Heitbaum 2022-04-24 23:07:35 +00:00
parent c7267d2369
commit 31ba5c2738

View File

@ -0,0 +1,289 @@
From 0ec02378bcc0d35d713fd93ba42c3848bc8b1077 Mon Sep 17 00:00:00 2001
From: Joan Bruguera <joanbrugueram@gmail.com>
Date: Sat, 12 Mar 2022 08:37:32 +0100
Subject: [PATCH 1/2] Buildfix NVIDIA 470.103.01 for Linux 5.18-rc1 (part 1)
---
common/inc/nv-linux.h | 7 +++++++
nvidia-drm/nvidia-drm-drv.c | 4 ++++
nvidia-drm/nvidia-drm-gem.c | 6 ++++++
3 files changed, 17 insertions(+)
diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h
index 82e19d6..58e66c7 100644
--- a/kernel/common/inc/nv-linux.h
+++ b/kernel/common/inc/nv-linux.h
@@ -11,6 +11,8 @@
#ifndef _NV_LINUX_H_
#define _NV_LINUX_H_
+#warning Do not buy NVIDIA for your next GPU!
+#include <linux/version.h>
#include "nvstatus.h"
#include "nv.h"
#include "nv-ioctl-numa.h"
@@ -958,7 +960,12 @@ static inline pgprot_t nv_adjust_pgprot(pgprot_t vm_prot, NvU32 extra)
* When AMD memory encryption is enabled, device memory mappings with the
* C-bit set read as 0xFF, so ensure the bit is cleared for user mappings.
*/
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0) && defined(_ASM_X86_PGTABLE_H))
+ // Rel. commit "x86/coco: Add API to handle encryption mask" (Kirill A. Shutemov, 22 Feb 2022)
+ prot = __pgprot(__sme_clr(pgprot_val(prot)));
+#else
prot = pgprot_decrypted(prot);
+#endif
#endif
return prot;
}
diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c
index d7067a4..f57cbc8 100644
--- a/kernel/nvidia-drm/nvidia-drm-drv.c
+++ b/kernel/nvidia-drm/nvidia-drm-drv.c
@@ -20,6 +20,7 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include <linux/version.h>
#include "nvidia-drm-conftest.h" /* NV_DRM_AVAILABLE and NV_DRM_DRM_GEM_H_PRESENT */
#include "nvidia-drm-priv.h"
@@ -254,7 +255,10 @@ nv_drm_init_mode_config(struct nv_drm_device *nv_dev,
#if defined(NV_DRM_FORMAT_MODIFIERS_PRESENT)
/* Allow clients to define framebuffer layouts using DRM format modifiers */
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0))
+ // Rel. commit "drm: remove allow_fb_modifiers" (Tomohito Esaki, 28 Jan 2022)
dev->mode_config.allow_fb_modifiers = true;
+#endif
#endif
/* Initialize output polling support */
diff --git a/kernel/nvidia-drm/nvidia-drm-gem.c b/kernel/nvidia-drm/nvidia-drm-gem.c
index 82de645..8cd3f76 100644
--- a/kernel/nvidia-drm/nvidia-drm-gem.c
+++ b/kernel/nvidia-drm/nvidia-drm-gem.c
@@ -49,6 +49,12 @@
#include "nv-mm.h"
+#include <linux/version.h>
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0))
+// Rel. commit "dma-buf-map: Rename to iosys-map" (Lucas De Marchi, 4 Feb 2022)
+#define dma_buf_map iosys_map
+#endif
+
void nv_drm_gem_free(struct drm_gem_object *gem)
{
struct nv_drm_gem_object *nv_gem = to_nv_gem_object(gem);
--
2.35.1
From 6b934e829fb942d1735e2371320ddbec089c6900 Mon Sep 17 00:00:00 2001
From: Joan Bruguera <joanbrugueram@gmail.com>
Date: Mon, 4 Apr 2022 19:59:51 +0200
Subject: [PATCH 2/2] Buildfix NVIDIA 470.103.01 for Linux 5.18-rc1 (part 2)
See also: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d56baf6efaf14e2910610216c581ca71d6940012
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7968778914e53788a01c2dee2692cab157de9ac0
---
nvidia-uvm/uvm_gpu.c | 8 ++++----
nvidia/linux_nvswitch.c | 18 +++++++++---------
nvidia/nv.c | 18 +++++++++---------
3 files changed, 22 insertions(+), 22 deletions(-)
diff --git a/kernel/nvidia-uvm/uvm_gpu.c b/kernel/nvidia-uvm/uvm_gpu.c
index f58c00b..c9607a8 100644
--- a/kernel/nvidia-uvm/uvm_gpu.c
+++ b/kernel/nvidia-uvm/uvm_gpu.c
@@ -3059,16 +3059,16 @@ out:
NV_STATUS uvm_gpu_map_cpu_pages(uvm_gpu_t *gpu, struct page *page, size_t size, NvU64 *dma_addr_out)
{
- NvU64 dma_addr = pci_map_page(gpu->parent->pci_dev, page, 0, size, PCI_DMA_BIDIRECTIONAL);
+ NvU64 dma_addr = dma_map_page(&gpu->parent->pci_dev->dev, page, 0, size, DMA_BIDIRECTIONAL);
UVM_ASSERT(PAGE_ALIGNED(size));
- if (pci_dma_mapping_error(gpu->parent->pci_dev, dma_addr))
+ if (dma_mapping_error(&gpu->parent->pci_dev->dev, dma_addr))
return NV_ERR_OPERATING_SYSTEM;
if (dma_addr < gpu->parent->dma_addressable_start ||
dma_addr + size - 1 > gpu->parent->dma_addressable_limit) {
- pci_unmap_page(gpu->parent->pci_dev, dma_addr, size, PCI_DMA_BIDIRECTIONAL);
+ dma_unmap_page(&gpu->parent->pci_dev->dev, dma_addr, size, DMA_BIDIRECTIONAL);
UVM_ERR_PRINT_RL("PCI mapped range [0x%llx, 0x%llx) not in the addressable range [0x%llx, 0x%llx), GPU %s\n",
dma_addr,
dma_addr + (NvU64)size,
@@ -3102,7 +3102,7 @@ void uvm_gpu_unmap_cpu_pages(uvm_gpu_t *gpu, NvU64 dma_address, size_t size)
if (gpu->parent->npu)
dma_address = nv_expand_nvlink_addr(dma_address);
dma_address += gpu->parent->dma_addressable_start;
- pci_unmap_page(gpu->parent->pci_dev, dma_address, size, PCI_DMA_BIDIRECTIONAL);
+ dma_unmap_page(&gpu->parent->pci_dev->dev, dma_address, size, DMA_BIDIRECTIONAL);
atomic64_sub(size, &gpu->parent->mapped_cpu_pages_size);
}
diff --git a/kernel/nvidia/linux_nvswitch.c b/kernel/nvidia/linux_nvswitch.c
index ddfc53c..714b9eb 100644
--- a/kernel/nvidia/linux_nvswitch.c
+++ b/kernel/nvidia/linux_nvswitch.c
@@ -2139,11 +2139,11 @@ _nvswitch_to_pci_dma_direction
)
{
if (direction == NVSWITCH_DMA_DIR_TO_SYSMEM)
- return PCI_DMA_FROMDEVICE;
+ return DMA_FROM_DEVICE;
else if (direction == NVSWITCH_DMA_DIR_FROM_SYSMEM)
- return PCI_DMA_TODEVICE;
+ return DMA_TO_DEVICE;
else
- return PCI_DMA_BIDIRECTIONAL;
+ return DMA_BIDIRECTIONAL;
}
NvlStatus
@@ -2164,9 +2164,9 @@ nvswitch_os_map_dma_region
dma_dir = _nvswitch_to_pci_dma_direction(direction);
- *dma_handle = (NvU64)pci_map_single(pdev, cpu_addr, size, dma_dir);
+ *dma_handle = (NvU64) dma_map_single(&pdev->dev, cpu_addr, size, dma_dir);
- if (pci_dma_mapping_error(pdev, *dma_handle))
+ if (dma_mapping_error(&pdev->dev, *dma_handle))
{
pr_err("nvidia-nvswitch: unable to create PCI DMA mapping\n");
return -NVL_ERR_GENERIC;
@@ -2193,7 +2193,7 @@ nvswitch_os_unmap_dma_region
dma_dir = _nvswitch_to_pci_dma_direction(direction);
- pci_unmap_single(pdev, dma_handle, size, dma_dir);
+ dma_unmap_single(&pdev->dev, dma_handle, size, dma_dir);
return NVL_SUCCESS;
}
@@ -2210,7 +2210,7 @@ nvswitch_os_set_dma_mask
if (!pdev)
return -NVL_BAD_ARGS;
- if (pci_set_dma_mask(pdev, DMA_BIT_MASK(dma_addr_width)))
+ if (dma_set_mask(&pdev->dev, DMA_BIT_MASK(dma_addr_width)))
return -NVL_ERR_GENERIC;
return NVL_SUCCESS;
@@ -2233,7 +2233,7 @@ nvswitch_os_sync_dma_region_for_cpu
dma_dir = _nvswitch_to_pci_dma_direction(direction);
- pci_dma_sync_single_for_cpu(pdev, dma_handle, size, dma_dir);
+ dma_sync_single_for_cpu(&pdev->dev, dma_handle, size, dma_dir);
return NVL_SUCCESS;
}
@@ -2255,7 +2255,7 @@ nvswitch_os_sync_dma_region_for_device
dma_dir = _nvswitch_to_pci_dma_direction(direction);
- pci_dma_sync_single_for_device(pdev, dma_handle, size, dma_dir);
+ dma_sync_single_for_device(&pdev->dev, dma_handle, size, dma_dir);
return NVL_SUCCESS;
}
diff --git a/kernel/nvidia/nv.c b/kernel/nvidia/nv.c
index 92a7dc6..5065158 100644
--- a/kernel/nvidia/nv.c
+++ b/kernel/nvidia/nv.c
@@ -2821,13 +2821,13 @@ nv_set_dma_address_size(
*/
if (!nvl->tce_bypass_enabled)
{
- pci_set_dma_mask(nvl->pci_dev, new_mask);
+ dma_set_mask(&nvl->pci_dev->dev, new_mask);
/* Certain kernels have a bug which causes pci_set_consistent_dma_mask
* to call GPL sme_active symbol, this bug has already been fixed in a
* minor release update but detect the failure scenario here to prevent
* an installation regression */
#if !NV_IS_EXPORT_SYMBOL_GPL_sme_active
- pci_set_consistent_dma_mask(nvl->pci_dev, new_mask);
+ dma_set_coherent_mask(&nvl->pci_dev->dev, new_mask);
#endif
}
}
@@ -4524,19 +4524,19 @@ NvU64 NV_API_CALL nv_get_dma_start_address(
* as the starting address for all DMA mappings.
*/
saved_dma_mask = pci_dev->dma_mask;
- if (pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64)) != 0)
+ if (dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64)) != 0)
{
goto done;
}
- dma_addr = pci_map_single(pci_dev, NULL, 1, DMA_BIDIRECTIONAL);
- if (pci_dma_mapping_error(pci_dev, dma_addr))
+ dma_addr = dma_map_single(&pci_dev->dev, NULL, 1, DMA_BIDIRECTIONAL);
+ if (dma_mapping_error(&pci_dev->dev, dma_addr))
{
- pci_set_dma_mask(pci_dev, saved_dma_mask);
+ dma_set_mask(&pci_dev->dev, saved_dma_mask);
goto done;
}
- pci_unmap_single(pci_dev, dma_addr, 1, DMA_BIDIRECTIONAL);
+ dma_unmap_single(&pci_dev->dev, dma_addr, 1, DMA_BIDIRECTIONAL);
/*
* From IBM: "For IODA2, native DMA bypass or KVM TCE-based implementation
@@ -4568,7 +4568,7 @@ NvU64 NV_API_CALL nv_get_dma_start_address(
*/
nv_printf(NV_DBG_WARNINGS,
"NVRM: DMA window limited by platform\n");
- pci_set_dma_mask(pci_dev, saved_dma_mask);
+ dma_set_mask(&pci_dev->dev, saved_dma_mask);
goto done;
}
else if ((dma_addr & saved_dma_mask) != 0)
@@ -4587,7 +4587,7 @@ NvU64 NV_API_CALL nv_get_dma_start_address(
*/
nv_printf(NV_DBG_WARNINGS,
"NVRM: DMA window limited by memory size\n");
- pci_set_dma_mask(pci_dev, saved_dma_mask);
+ dma_set_mask(&pci_dev->dev, saved_dma_mask);
goto done;
}
}
--
2.35.1
From 689ede6109d1b8aef914809f290e75632c338b9f Mon Sep 17 00:00:00 2001
From: Joan Bruguera <joanbrugueram@gmail.com>
Date: Sat, 9 Apr 2022 19:42:24 +0200
Subject: [PATCH] Buildfix NVIDIA 470.103.01 for Linux 5.18-rc2
acpi_bus_get_device was removed and its trivial replacement acpi_fetch_acpi_dev
is GPL-exported, so just disable ACPI support as I don't want to deal with it.
---
nvidia/nv-acpi.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/nvidia/nv-acpi.c b/kernel/nvidia/nv-acpi.c
index faf8b44..22a9152 100644
--- a/kernel/nvidia/nv-acpi.c
+++ b/kernel/nvidia/nv-acpi.c
@@ -16,7 +16,8 @@
#include <linux/acpi.h>
-#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED)
+#include <linux/version.h>
+#if defined(NV_LINUX_ACPI_EVENTS_SUPPORTED) && (LINUX_VERSION_CODE < KERNEL_VERSION(5, 18, 0))
static NV_STATUS nv_acpi_extract_integer (const union acpi_object *, void *, NvU32, NvU32 *);
static NV_STATUS nv_acpi_extract_buffer (const union acpi_object *, void *, NvU32, NvU32 *);
static NV_STATUS nv_acpi_extract_package (const union acpi_object *, void *, NvU32, NvU32 *);
--
2.35.1