Skip to content

Instantly share code, notes, and snippets.

@Vigilans
Created July 25, 2023 02:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Vigilans/eb54564f83ed065f5dc1000abc3db6af to your computer and use it in GitHub Desktop.
Save Vigilans/eb54564f83ed065f5dc1000abc3db6af to your computer and use it in GitHub Desktop.
Patches for building nvidia-legacy-390xx-kernel-dkms_390.157-1 with clang on linux 6.x kernel
# DKMS configuration for the NVIDIA kernel module. -*- sh -*-
# The version is replaced at build time by dh_dkms invoked in debian/rules.
PACKAGE_NAME="nvidia-legacy-390xx"
PACKAGE_VERSION="390.157"
# The NVIDIA driver does not support real-time kernels.
# Can't easily set this via BUILD_EXCLUSIVE.
[[ "$kernelver" =~ "-rt-" ]] && build_exclude="yes"
AUTOINSTALL=yes
PATCH=(nvidia-graphics-drivers-legacy-390xx-kernel-6.3-with-clang.patch cc_version_check-gcc5.patch bashisms.patch 0001-backport-error-on-unknown-conftests.patch 0002-backport-error-on-unknown-conftests-uvm-part.patch 0003-backport-set_-memory-pages-_array-_uc-changes-from-5.patch 0004-fix-conftest-includes.patch do-div-cast.patch fragile-ARCH.patch use-kbuild-compiler.patch use-kbuild-flags.patch conftest-verbose.patch nvidia-use-ARCH.o_binary.patch nvidia-modeset-use-ARCH.o_binary.patch include-swiotlb-header-on-arm.patch ignore_xen_on_arm.patch arm-outer-sync.patch nvidia-drm-arm-cflags.patch armhf-on-arm64-kernel.patch nvidia-graphics-drivers-legacy-390xx-kernel-6.4.patch)
MAKE[0]="env NV_VERBOSE=1 \
make ${parallel_jobs+-j$parallel_jobs} modules KERNEL_UNAME=${kernelver}"
CLEAN="make KERNEL_UNAME=${kernelver} clean"
BUILT_MODULE_NAME[0]="nvidia"
DEST_MODULE_NAME[0]="$PACKAGE_NAME"
DEST_MODULE_LOCATION[0]="/updates/dkms"
BUILT_MODULE_NAME[1]="nvidia-modeset"
DEST_MODULE_NAME[1]="$PACKAGE_NAME-modeset"
DEST_MODULE_LOCATION[1]="/updates/dkms"
BUILT_MODULE_NAME[2]="nvidia-drm"
DEST_MODULE_NAME[2]="$PACKAGE_NAME-drm"
DEST_MODULE_LOCATION[2]="/updates/dkms"
BUILT_MODULE_NAME[3]="nvidia-uvm"
DEST_MODULE_NAME[3]="$PACKAGE_NAME-uvm"
DEST_MODULE_LOCATION[3]="/updates/dkms"
diff -ur a/conftest.sh b/conftest.sh
--- a/conftest.sh 2023-06-01 20:00:46.719933661 +0800
+++ b/conftest.sh 2023-06-01 21:26:23.218584390 +0800
@@ -255,6 +255,9 @@
CFLAGS="$CFLAGS -mfentry -DCC_USING_FENTRY"
fi
fi
+
+ # Warnings
+ CFLAGS="$CFLAGS -Wno-error=implicit-function-declaration"
}
CONFTEST_PREAMBLE="#include \"conftest/headers.h\"
@@ -294,6 +297,12 @@
echo "$CONFTEST_PREAMBLE
$CODE" > conftest$$.c
+ if [ -n "$PRINT" ]; then
+ >&2 echo "$CONFTEST_PREAMBLE
+ $CODE"
+ >&2 echo "$CC $CFLAGS -c conftest$$.c"
+ fi
+
$CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
rm -f conftest$$.c
@@ -860,6 +869,25 @@
return
fi
+ echo "$CONFTEST_PREAMBLE
+ #include <linux/acpi.h>
+
+ acpi_op_remove conftest_op_remove_routine;
+
+ void conftest_acpi_device_ops_remove(struct acpi_device *device) {
+ return conftest_op_remove_routine(device);
+ }" > conftest$$.c
+
+ $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
+ rm -f conftest$$.c
+
+ if [ -f conftest$$.o ]; then
+ rm -f conftest$$.o
+ echo "#define NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT 1" | append_conftest "types"
+ echo "#define NV_ACPI_DEVICE_OPS_REMOVE_VOID_RETURN" | append_conftest "types"
+ return
+ fi
+
CODE="
#include <linux/acpi.h>
@@ -4646,6 +4674,25 @@
compile_check_conftest "$CODE" "NV_ACPI_VIDEO_BACKLIGHT_USE_NATIVE" "" "functions"
;;
+
+ vma_vm_flags)
+ echo "$CONFTEST_PREAMBLE
+ #include <linux/mm_types.h>
+ #include <linux/mm.h>
+ void conftest_vma_vm_flags(void) {
+ struct vm_area_struct *vma;
+ vma->vm_flags |= VM_IO;
+ }" > conftest$$.c
+
+ $CC $CFLAGS -c conftest$$.c >/dev/null 2>&1
+ rm -f conftest$$.c
+
+ if [ -f conftest$$.o ]; then
+ rm -f conftest$$.o
+ echo "#define NV_VMA_VM_FLAGS_NON_CONST" | append_conftest "types"
+ return
+ fi
+ ;;
esac
}
@@ -4765,14 +4812,14 @@
echo "However, mixing compiler versions between the kernel";
echo "and kernel modules can result in subtle bugs that are";
echo "difficult to diagnose.";
- echo "";
- echo "*** Failed CC version check. Bailing out! ***";
- echo "";
+ # echo "";
+ # echo "*** Failed CC version check. Bailing out! ***";
+ # echo "";
elif [ "$VERBOSE" = "just_msg" ]; then
echo "The kernel was built with ${kernel_cc_string}, but the" \
"current compiler version is `$CC --version | head -n 1`.";
fi
- exit 1;
+ exit 0;
fi
;;
diff -ur a/Kbuild b/Kbuild
--- a/Kbuild 2023-06-01 20:00:46.716600311 +0800
+++ b/Kbuild 2023-06-01 21:37:31.631878921 +0800
@@ -68,6 +68,7 @@
EXTRA_CFLAGS += $(call cc-option,-Werror=undef,)
EXTRA_CFLAGS += -DNV_SPECTRE_V2=$(NV_SPECTRE_V2)
EXTRA_CFLAGS += -DNV_KERNEL_INTERFACE_LAYER
+EXTRA_CFLAGS += -Wno-error=unused-command-line-argument -Wno-error=strict-prototypes
#
# Detect SGI UV systems and apply system-specific optimizations.
diff -ur a/nvidia/nv-acpi.c b/nvidia/nv-acpi.c
--- a/nvidia/nv-acpi.c 2023-06-01 20:00:46.719933661 +0800
+++ b/nvidia/nv-acpi.c 2023-06-01 21:09:10.110158992 +0800
@@ -23,7 +23,9 @@
static int nv_acpi_add (struct acpi_device *);
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
+#if defined(NV_ACPI_DEVICE_OPS_REMOVE_VOID_RETURN)
+static void nv_acpi_remove_one_arg(struct acpi_device *device);
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
static int nv_acpi_remove_two_args(struct acpi_device *device, int type);
#else
static int nv_acpi_remove_one_arg(struct acpi_device *device);
@@ -331,7 +333,9 @@
return 0;
}
-#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
+#if defined(NV_ACPI_DEVICE_OPS_REMOVE_VOID_RETURN)
+static void nv_acpi_remove_one_arg(struct acpi_device *device)
+#elif !defined(NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT) || (NV_ACPI_DEVICE_OPS_REMOVE_ARGUMENT_COUNT == 2)
static int nv_acpi_remove_two_args(struct acpi_device *device, int type)
#else
static int nv_acpi_remove_one_arg(struct acpi_device *device)
@@ -384,8 +388,9 @@
module_put(THIS_MODULE);
device->driver_data = NULL;
}
-
+#if !defined(NV_ACPI_DEVICE_OPS_REMOVE_VOID_RETURN)
return status;
+#endif
}
static void nv_acpi_event(acpi_handle handle, u32 event_type, void *data)
diff -ur a/nvidia/nvidia.Kbuild b/nvidia/nvidia.Kbuild
--- a/nvidia/nvidia.Kbuild 2023-06-01 20:00:46.723267010 +0800
+++ b/nvidia/nvidia.Kbuild 2023-06-01 21:21:33.040487461 +0800
@@ -209,6 +209,7 @@
NV_CONFTEST_TYPE_COMPILE_TESTS += vmalloc_has_pgprot_t_arg
NV_CONFTEST_TYPE_COMPILE_TESTS += pci_dev_has_skip_bus_pm
NV_CONFTEST_TYPE_COMPILE_TESTS += pci_channel_state
+NV_CONFTEST_TYPE_COMPILE_TESTS += vma_vm_flags
NV_CONFTEST_GENERIC_COMPILE_TESTS += dom0_kernel_present
NV_CONFTEST_GENERIC_COMPILE_TESTS += nvidia_vgpu_kvm_build
diff -ur a/nvidia/nv-mmap.c b/nvidia/nv-mmap.c
--- a/nvidia/nv-mmap.c 2023-06-01 20:00:46.723267010 +0800
+++ b/nvidia/nv-mmap.c 2023-06-01 21:32:12.473639152 +0800
@@ -447,7 +447,11 @@
addr = mmap_start;
// Needed for the linux kernel for mapping compound pages
+#if defined(NV_VMA_VM_FLAGS_NON_CONST)
vma->vm_flags |= VM_MIXEDMAP;
+#else
+ vm_flags_set(vma, VM_MIXEDMAP);
+#endif
for (j = 0; j < pages; j++)
{
@@ -471,7 +475,11 @@
}
}
- vma->vm_flags |= VM_IO;
+#if defined(NV_VMA_VM_FLAGS_NON_CONST)
+ vma->vm_flags |= VM_IO;
+#else
+ vm_flags_set(vma, VM_IO);
+#endif
}
else
{
@@ -533,15 +541,25 @@
NV_PRINT_AT(NV_DBG_MEMINFO, at);
+#if defined(NV_VMA_VM_FLAGS_NON_CONST)
vma->vm_flags |= (VM_IO | VM_LOCKED | VM_RESERVED);
vma->vm_flags |= (VM_DONTEXPAND | VM_DONTDUMP);
+#else
+ vm_flags_set(vma, VM_IO | VM_LOCKED | VM_RESERVED);
+ vm_flags_set(vma, VM_DONTEXPAND | VM_DONTDUMP);
+#endif
}
if ((prot & NV_PROTECT_WRITEABLE) == 0)
{
vma->vm_page_prot = NV_PGPROT_READ_ONLY(vma->vm_page_prot);
+#if defined(NV_VMA_VM_FLAGS_NON_CONST)
vma->vm_flags &= ~VM_WRITE;
vma->vm_flags &= ~VM_MAYWRITE;
+#else
+ vm_flags_clear(vma, VM_WRITE);
+ vm_flags_clear(vma, VM_MAYWRITE);
+#endif
}
vma->vm_ops = &nv_vm_ops;
diff -ur a/nvidia-drm/nvidia-drm-connector.c b/nvidia-drm/nvidia-drm-connector.c
--- a/nvidia-drm/nvidia-drm-connector.c 2023-06-01 20:00:46.723267010 +0800
+++ b/nvidia-drm/nvidia-drm-connector.c 2023-06-01 21:49:29.945419448 +0800
@@ -98,7 +98,12 @@
break;
}
- if (connector->override_edid) {
+ int override = 0;
+ mutex_lock(&connector->edid_override_mutex);
+ if (connector->edid_override)
+ override = 1;
+ mutex_unlock(&connector->edid_override_mutex);
+ if (override) {
const struct drm_property_blob *edid = connector->edid_blob_ptr;
if (edid->length <= sizeof(pDetectParams->edid.buffer)) {
@@ -111,6 +116,7 @@
}
}
+
if (!nvKms->getDynamicDisplayInfo(nv_dev->pDevice, pDetectParams)) {
NV_DRM_DEV_LOG_ERR(
nv_dev,
diff -ur a/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c
--- a/nvidia-drm/nvidia-drm-drv.c 2023-06-01 20:00:46.723267010 +0800
+++ b/nvidia-drm/nvidia-drm-drv.c 2023-06-01 21:50:48.782474687 +0800
@@ -241,7 +241,7 @@
/* Currently unused. Update when needed. */
- dev->mode_config.fb_base = 0;
+ // dev->mode_config.fb_base = 0;
dev->mode_config.async_page_flip = false;
diff -ur a/nvidia-drm/nvidia-drm-fb.c b/nvidia-drm/nvidia-drm-fb.c
--- a/nvidia-drm/nvidia-drm-fb.c 2023-06-01 20:00:46.723267010 +0800
+++ b/nvidia-drm/nvidia-drm-fb.c 2023-06-01 21:55:43.793928784 +0800
@@ -30,6 +30,7 @@
#include "nvidia-drm-utils.h"
#include "nvidia-drm-gem.h"
+#include <drm/drm_modeset_helper.h>
#include <drm/drm_crtc_helper.h>
static void nv_drm_framebuffer_destroy(struct drm_framebuffer *fb)
diff -ur a/nvidia-uvm/uvm8.c b/nvidia-uvm/uvm8.c
--- a/nvidia-uvm/uvm8.c 2023-06-01 20:00:46.726600361 +0800
+++ b/nvidia-uvm/uvm8.c 2023-06-01 21:39:07.522351555 +0800
@@ -658,7 +658,12 @@
// Using VM_DONTCOPY would be nice, but madvise(MADV_DOFORK) can reset that
// so we have to handle vm_open on fork anyway. We could disable MADV_DOFORK
// with VM_IO, but that causes other mapping issues.
+#if defined(NV_VMA_VM_FLAGS_NON_CONST)
vma->vm_flags |= VM_MIXEDMAP | VM_DONTEXPAND;
+#else
+ vm_flags_set(vma, VM_MIXEDMAP | VM_DONTEXPAND);
+#endif
+
vma->vm_ops = &uvm_vm_ops_managed;
diff --git a/conftest.sh b/conftest.sh
index 1b17a37..80ff621 100644
--- a/conftest.sh
+++ b/conftest.sh
@@ -4698,6 +4698,30 @@ compile_test() {
fi
;;
+ drm_driver_has_dumb_destroy)
+ #
+ # Determine if the 'drm_driver' structure has a 'dumb_destroy'
+ # function pointer.
+ #
+ # Removed by commit 96a7b60f6ddb2 ("drm: remove dumb_destroy
+ # callback") in v6.3 linux-next (2023-02-10).
+ #
+ CODE="
+ #if defined(NV_DRM_DRMP_H_PRESENT)
+ #include <drm/drmP.h>
+ #endif
+
+ #if defined(NV_DRM_DRM_DRV_H_PRESENT)
+ #include <drm/drm_drv.h>
+ #endif
+
+ int conftest_drm_driver_has_dumb_destroy(void) {
+ return offsetof(struct drm_driver, dumb_destroy);
+ }"
+
+ compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_DUMB_DESTROY" "" "types"
+ ;;
+
# When adding a new conftest entry, please use the correct format for
# specifying the relevant upstream Linux kernel commit.
#
diff --git a/nvidia-drm/nvidia-drm-drv.c b/nvidia-drm/nvidia-drm-drv.c
index 629a445..8ee1d04 100644
--- a/nvidia-drm/nvidia-drm-drv.c
+++ b/nvidia-drm/nvidia-drm-drv.c
@@ -762,7 +762,9 @@ static void nv_drm_update_drm_driver_features(void)
nv_drm_driver.dumb_create = nv_drm_dumb_create;
nv_drm_driver.dumb_map_offset = nv_drm_dumb_map_offset;
+#if defined(NV_DRM_DRIVER_HAS_DUMB_DESTROY)
nv_drm_driver.dumb_destroy = nv_drm_dumb_destroy;
+#endif
#if defined(NV_DRM_DRIVER_HAS_GEM_PRIME_CALLBACKS)
nv_drm_driver.gem_vm_ops = &nv_drm_gem_vma_ops;
diff --git a/nvidia-drm/nvidia-drm-gem-nvkms-memory.c b/nvidia-drm/nvidia-drm-gem-nvkms-memory.c
index cd60138..6843fb0 100644
--- a/nvidia-drm/nvidia-drm-gem-nvkms-memory.c
+++ b/nvidia-drm/nvidia-drm-gem-nvkms-memory.c
@@ -226,12 +226,14 @@ done:
return ret;
}
+#if defined(NV_DRM_DRIVER_HAS_DUMB_DESTROY)
int nv_drm_dumb_destroy(struct drm_file *file,
struct drm_device *dev,
uint32_t handle)
{
return drm_gem_handle_delete(file, handle);
}
+#endif
/* XXX Move these vma operations to os layer */
diff --git a/nvidia-drm/nvidia-drm-gem-nvkms-memory.h b/nvidia-drm/nvidia-drm-gem-nvkms-memory.h
index 2d9d1a1..9bde6cd 100644
--- a/nvidia-drm/nvidia-drm-gem-nvkms-memory.h
+++ b/nvidia-drm/nvidia-drm-gem-nvkms-memory.h
@@ -79,9 +79,11 @@ int nv_drm_dumb_map_offset(struct drm_file *file,
struct drm_device *dev, uint32_t handle,
uint64_t *offset);
+#if defined(NV_DRM_DRIVER_HAS_DUMB_DESTROY)
int nv_drm_dumb_destroy(struct drm_file *file,
struct drm_device *dev,
uint32_t handle);
+#endif
extern const struct vm_operations_struct nv_drm_gem_vma_ops;
diff --git a/nvidia-drm/nvidia-drm.Kbuild b/nvidia-drm/nvidia-drm.Kbuild
index e283874..393b912 100644
--- a/nvidia-drm/nvidia-drm.Kbuild
+++ b/nvidia-drm/nvidia-drm.Kbuild
@@ -106,3 +106,4 @@ NV_CONFTEST_TYPE_COMPILE_TESTS += drm_device_has_pdev
NV_CONFTEST_TYPE_COMPILE_TESTS += dma_resv_add_fence
NV_CONFTEST_TYPE_COMPILE_TESTS += dma_resv_reserve_fences
NV_CONFTEST_TYPE_COMPILE_TESTS += reservation_object_reserve_shared_has_num_fences_arg
+NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_dumb_destroy
nvidia-graphics-drivers-legacy-390xx-kernel-6.3-with-clang.patch
cc_version_check-gcc5.patch
bashisms.patch
# kernel support
0001-backport-error-on-unknown-conftests.patch
0002-backport-error-on-unknown-conftests-uvm-part.patch
0003-backport-set_-memory-pages-_array-_uc-changes-from-5.patch
0004-fix-conftest-includes.patch
do-div-cast.patch
# build system updates
fragile-ARCH.patch
use-kbuild-compiler.patch
use-kbuild-flags.patch
conftest-verbose.patch
nvidia-use-ARCH.o_binary.patch
nvidia-modeset-use-ARCH.o_binary.patch
# armhf support
include-swiotlb-header-on-arm.patch
ignore_xen_on_arm.patch
arm-outer-sync.patch
nvidia-drm-arm-cflags.patch
armhf-on-arm64-kernel.patch
nvidia-graphics-drivers-legacy-390xx-kernel-6.4.patch
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment