1 diff --git a/kernel/common/inc/nv-linux.h b/kernel/common/inc/nv-linux.h
2 index ab06dbc..dd335b5 100644
3 --- a/kernel/common/inc/nv-linux.h
4 +++ b/kernel/common/inc/nv-linux.h
5 @@ -159,7 +159,7 @@ static inline uid_t __kuid_val(kuid_t uid)
9 -#if defined(NVCPU_X86_64) && !defined(HAVE_COMPAT_IOCTL)
10 +#if defined(NVCPU_X86_64) && !defined(NV_FILE_OPERATIONS_HAS_COMPAT_IOCTL)
11 #include <linux/syscalls.h> /* sys_ioctl() */
12 #include <linux/ioctl32.h> /* register_ioctl32_conversion() */
14 diff --git a/kernel/common/inc/nv-mm.h b/kernel/common/inc/nv-mm.h
15 index d2d7657..a5325fe 100644
16 --- a/kernel/common/inc/nv-mm.h
17 +++ b/kernel/common/inc/nv-mm.h
18 @@ -144,9 +144,13 @@ typedef int vm_fault_t;
21 #if defined(NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG)
23 + #if defined (NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG)
24 return get_user_pages_remote(tsk, mm, start, nr_pages, flags,
27 + return get_user_pages_remote(mm, start, nr_pages, flags,
33 @@ -159,7 +163,7 @@ typedef int vm_fault_t;
36 #if defined(NV_GET_USER_PAGES_HAS_WRITE_AND_FORCE_ARGS)
37 - #define NV_GET_USER_PAGES_REMOTE NV_GET_USER_PAGES
38 + #define NV_GET_USER_PAGES_REMOTE get_user_pages
41 #include <linux/sched.h>
42 diff --git a/kernel/conftest.sh b/kernel/conftest.sh
43 index e900963..ef82dee 100755
44 --- a/kernel/conftest.sh
45 +++ b/kernel/conftest.sh
46 @@ -3043,6 +3043,7 @@ compile_test() {
48 if [ -f conftest$$.o ]; then
49 echo "#undef NV_GET_USER_PAGES_REMOTE_PRESENT" | append_conftest "functions"
50 + echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
51 echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
52 echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
54 @@ -3070,14 +3071,20 @@ compile_test() {
57 if [ -f conftest$$.o ]; then
58 + echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
59 echo "#define NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
60 echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
65 + echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
68 # conftest #3: check if get_user_pages_remote() has locked argument
70 + # Return if these arguments are present. Fall through to conftest #4
71 + # if these args are absent.
73 echo "$CONFTEST_PREAMBLE
75 long get_user_pages_remote(struct task_struct *tsk,
76 @@ -3095,13 +3102,40 @@ compile_test() {
79 if [ -f conftest$$.o ]; then
80 + echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
81 + echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
87 + # conftest #4: check if get_user_pages_remote() does not take
90 + echo "$CONFTEST_PREAMBLE
91 + #include <linux/mm.h>
92 + long get_user_pages_remote(struct mm_struct *mm,
93 + unsigned long start,
94 + unsigned long nr_pages,
95 + unsigned int gup_flags,
96 + struct page **pages,
97 + struct vm_area_struct **vmas,
102 + $CC $CFLAGS -c conftest$$.c > /dev/null 2>&1
105 + if [ -f conftest$$.o ]; then
106 + echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
107 echo "#define NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
111 + echo "#define NV_GET_USER_PAGES_REMOTE_HAS_TSK_ARG" | append_conftest "functions"
112 echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_LOCKED_ARG" | append_conftest "functions"
114 - echo "#undef NV_GET_USER_PAGES_REMOTE_HAS_WRITE_AND_FORCE_ARGS" | append_conftest "functions"
119 @@ -4131,6 +4165,115 @@ compile_test() {
120 compile_check_conftest "$CODE" "NV_PCI_DEV_HAS_SKIP_BUS_PM" "" "types"
123 + drm_gem_object_put_unlocked)
125 + # Determine if the function drm_gem_object_put_unlocked() is present.
127 + # In v5.9-rc1, commit 2f4dd13d4bb8 ("drm/gem: add
128 + # drm_gem_object_put helper") removes drm_gem_object_put_unlocked()
129 + # function and replace its definition by transient macro. Commit
130 + # ab15d56e27be ("drm: remove transient
131 + # drm_gem_object_put_unlocked()") finally removes
132 + # drm_gem_object_put_unlocked() macro.
135 + #if defined(NV_DRM_DRMP_H_PRESENT)
136 + #include <drm/drmP.h>
139 + #if defined(NV_DRM_DRM_GEM_H_PRESENT)
140 + #include <drm/drm_gem.h>
142 + void conftest_drm_gem_object_put_unlocked(void) {
143 + drm_gem_object_put_unlocked();
146 + compile_check_conftest "$CODE" "NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT" "" "functions"
149 + drm_display_mode_has_vrefresh)
151 + # Determine if the 'drm_display_mode' structure has a 'vrefresh'
154 + # Removed by commit 0425662fdf05 ("drm: Nuke mode->vrefresh") in
158 + #include <drm/drm_modes.h>
160 + int conftest_drm_display_mode_has_vrefresh(void) {
161 + return offsetof(struct drm_display_mode, vrefresh);
164 + compile_check_conftest "$CODE" "NV_DRM_DISPLAY_MODE_HAS_VREFRESH" "types"
168 + drm_driver_master_set_has_int_return_type)
170 + # Determine if drm_driver::master_set() returns integer value
172 + # Changed to void by commit 907f53200f98 ("drm: vmwgfx: remove
173 + # drm_driver::master_set() return type") in v5.9-rc1.
176 + #if defined(NV_DRM_DRMP_H_PRESENT)
177 + #include <drm/drmP.h>
180 + #if defined(NV_DRM_DRM_DRV_H_PRESENT)
181 + #include <drm/drm_drv.h>
184 + int conftest_drm_driver_master_set_has_int_return_type(struct drm_driver *drv,
185 + struct drm_device *dev, struct drm_file *file_priv, bool from_open) {
187 + return drv->master_set(dev, file_priv, from_open);
190 + compile_check_conftest "$CODE" "NV_DRM_DRIVER_SET_MASTER_HAS_INT_RETURN_TYPE" "" "types"
193 + drm_driver_has_gem_free_object)
195 + # Determine if the 'drm_driver' structure has a 'gem_free_object'
196 + # function pointer.
198 + # drm_driver::gem_free_object is removed by commit 1a9458aeb8eb
199 + # ("drm: remove drm_driver::gem_free_object") in v5.9-rc1.
202 + #if defined(NV_DRM_DRMP_H_PRESENT)
203 + #include <drm/drmP.h>
206 + #if defined(NV_DRM_DRM_DRV_H_PRESENT)
207 + #include <drm/drm_drv.h>
210 + int conftest_drm_driver_has_gem_free_object(void) {
211 + return offsetof(struct drm_driver, gem_free_object);
214 + compile_check_conftest "$CODE" "NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT" "" "types"
219 + # Determine if vga_tryget() is present
221 + # vga_tryget() was removed by commit f369bc3f9096 ("vgaarb: mark
222 + # vga_tryget static") in v5.9-rc1 (2020-08-01).
225 + #include <linux/vgaarb.h>
226 + void conftest_vga_tryget(void) {
230 + compile_check_conftest "$CODE" "NV_VGA_TRYGET_PRESENT" "" "functions"
235 diff --git a/kernel/nvidia-drm/nvidia-drm-drv.c b/kernel/nvidia-drm/nvidia-drm-drv.c
236 index 17e377d..1b4cc6d 100644
237 --- a/kernel/nvidia-drm/nvidia-drm-drv.c
238 +++ b/kernel/nvidia-drm/nvidia-drm-drv.c
239 @@ -466,8 +466,8 @@ static void nv_drm_unload(struct drm_device *dev)
241 #if defined(NV_DRM_ATOMIC_MODESET_AVAILABLE)
243 -static int nv_drm_master_set(struct drm_device *dev,
244 - struct drm_file *file_priv, bool from_open)
245 +static int __nv_drm_master_set(struct drm_device *dev,
246 + struct drm_file *file_priv, bool from_open)
248 struct nv_drm_device *nv_dev = to_nv_device(dev);
250 @@ -478,6 +478,21 @@ static int nv_drm_master_set(struct drm_device *dev,
254 +#if defined(NV_DRM_DRIVER_SET_MASTER_HAS_INT_RETURN_TYPE)
255 +static int nv_drm_master_set(struct drm_device *dev,
256 + struct drm_file *file_priv, bool from_open)
258 + return __nv_drm_master_set(dev, file_priv, from_open);
261 +static void nv_drm_master_set(struct drm_device *dev,
262 + struct drm_file *file_priv, bool from_open)
264 + WARN_ON(__nv_drm_master_set(dev, file_priv, from_open) != 0);
269 #if defined(NV_DRM_MASTER_DROP_HAS_FROM_RELEASE_ARG)
271 void nv_drm_master_drop(struct drm_device *dev,
272 @@ -677,7 +692,9 @@ static struct drm_driver nv_drm_driver = {
274 DRIVER_GEM | DRIVER_RENDER,
276 +#if defined(NV_DRM_DRIVER_HAS_GEM_FREE_OBJECT)
277 .gem_free_object = nv_drm_gem_free,
280 .ioctls = nv_drm_ioctls,
281 .num_ioctls = ARRAY_SIZE(nv_drm_ioctls),
282 diff --git a/kernel/nvidia-drm/nvidia-drm-gem.h b/kernel/nvidia-drm/nvidia-drm-gem.h
283 index 5691a7a..18c50ca 100644
284 --- a/kernel/nvidia-drm/nvidia-drm-gem.h
285 +++ b/kernel/nvidia-drm/nvidia-drm-gem.h
286 @@ -87,7 +87,13 @@ static inline void
287 nv_drm_gem_object_unreference_unlocked(struct nv_drm_gem_object *nv_gem)
289 #if defined(NV_DRM_GEM_OBJECT_GET_PRESENT)
291 +#if defined(NV_DRM_GEM_OBJECT_PUT_UNLOCK_PRESENT)
292 drm_gem_object_put_unlocked(&nv_gem->base);
294 + drm_gem_object_put(&nv_gem->base);
298 drm_gem_object_unreference_unlocked(&nv_gem->base);
300 diff --git a/kernel/nvidia-drm/nvidia-drm-utils.c b/kernel/nvidia-drm/nvidia-drm-utils.c
301 index 8cb2d5e..e30b2b6 100644
302 --- a/kernel/nvidia-drm/nvidia-drm-utils.c
303 +++ b/kernel/nvidia-drm/nvidia-drm-utils.c
304 @@ -103,7 +103,9 @@ void
305 nvkms_display_mode_to_drm_mode(const struct NvKmsKapiDisplayMode *displayMode,
306 struct drm_display_mode *mode)
308 +#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
309 mode->vrefresh = (displayMode->timings.refreshRate + 500) / 1000; /* In Hz */
312 mode->clock = (displayMode->timings.pixelClockHz + 500) / 1000; /* In Hz */
314 @@ -189,7 +191,11 @@ bool drm_format_to_nvkms_format(u32 format,
315 void drm_mode_to_nvkms_display_mode(const struct drm_display_mode *src,
316 struct NvKmsKapiDisplayMode *dst)
318 +#if defined(NV_DRM_DISPLAY_MODE_HAS_VREFRESH)
319 dst->timings.refreshRate = src->vrefresh * 1000;
321 + dst->timings.refreshRate = drm_mode_vrefresh(src) * 1000;
324 dst->timings.pixelClockHz = src->clock * 1000; /* In Hz */
326 diff --git a/kernel/nvidia/nv.c b/kernel/nvidia/nv.c
327 index 15983f6..cfb2375 100644
328 --- a/kernel/nvidia/nv.c
329 +++ b/kernel/nvidia/nv.c
330 @@ -3872,7 +3872,9 @@ nvidia_probe
332 #if defined(CONFIG_VGA_ARB) && !defined(NVCPU_PPC64LE)
333 #if defined(VGA_DEFAULT_DEVICE)
334 +#if defined(NV_VGA_TRYGET_PRESENT)
335 vga_tryget(VGA_DEFAULT_DEVICE, VGA_RSRC_LEGACY_MASK);
338 vga_set_legacy_decoding(dev, VGA_RSRC_NONE);
342 --- NVIDIA-Linux-x86_64-390.138-no-compat32/kernel/nvidia/nvidia.Kbuild~ 2020-05-14 12:29:28.000000000 +0200
343 +++ NVIDIA-Linux-x86_64-390.138-no-compat32/kernel/nvidia/nvidia.Kbuild 2020-10-21 09:20:14.480482097 +0200
345 NV_CONFTEST_GENERIC_COMPILE_TESTS += list_cut_position
346 NV_CONFTEST_GENERIC_COMPILE_TESTS += vm_fault_t
348 +NV_CONFTEST_FUNCTION_COMPILE_TESTS += drm_gem_object_put_unlocked
349 +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_display_mode_has_vrefresh
350 +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_master_set_has_int_return_type
351 +NV_CONFTEST_TYPE_COMPILE_TESTS += drm_driver_has_gem_free_object
352 +NV_CONFTEST_FUNCTION_COMPILE_TESTS += vga_tryget
354 NV_CONFTEST_MACRO_COMPILE_TESTS += INIT_WORK