blob: 951bd5013dff5f909a40dcb089d60364c70fc390 [file] [log] [blame]
Andrew Geissler5199d832021-09-24 16:47:35 -05001Subject: Fix build errors with linux 5.14
2
3Upstream-Status: backport
4
5svn-id: r89690
6
7Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
8
9Index: a/src/VBox/Additions/linux/drm/vbox_drv.h
10===================================================================
11--- a/src/VBox/Additions/linux/drm/vbox_drv.h (revision 89690)
12+++ a/src/VBox/Additions/linux/drm/vbox_drv.h (revision 90498)
13@@ -227,6 +227,15 @@
14 sizeof(HGSMIHOSTFLAGS))
15 #define HOST_FLAGS_OFFSET GUEST_HEAP_USABLE_SIZE
16
17+/** Field @pdev of struct drm_device was removed in 5.14. This macro
18+ * transparently handles this change. Input argument is a pointer
19+ * to struct drm_device. */
20+#if RTLNX_VER_MIN(5,14,0)
21+# define VBOX_DRM_TO_PCI_DEV(_dev) to_pci_dev(_dev->dev)
22+#else
23+# define VBOX_DRM_TO_PCI_DEV(_dev) _dev->pdev
24+#endif
25+
26 /** How frequently we refresh if the guest is not providing dirty rectangles. */
27 #define VBOX_REFRESH_PERIOD (HZ / 2)
28
29Index: a/src/VBox/Additions/linux/drm/vbox_main.c
30===================================================================
31--- a/src/VBox/Additions/linux/drm/vbox_main.c (revision 89690)
32+++ a/src/VBox/Additions/linux/drm/vbox_main.c (revision 90498)
33@@ -290,7 +290,7 @@
34 /* Take a command buffer for each screen from the end of usable VRAM. */
35 vbox->available_vram_size -= vbox->num_crtcs * VBVA_MIN_BUFFER_SIZE;
36
37- vbox->vbva_buffers = pci_iomap_range(vbox->dev->pdev, 0,
38+ vbox->vbva_buffers = pci_iomap_range(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0,
39 vbox->available_vram_size,
40 vbox->num_crtcs *
41 VBVA_MIN_BUFFER_SIZE);
42@@ -311,7 +311,7 @@
43 return 0;
44
45 err_pci_iounmap:
46- pci_iounmap(vbox->dev->pdev, vbox->vbva_buffers);
47+ pci_iounmap(VBOX_DRM_TO_PCI_DEV(vbox->dev), vbox->vbva_buffers);
48 return ret;
49 }
50
51@@ -318,7 +318,7 @@
52 static void vbox_accel_fini(struct vbox_private *vbox)
53 {
54 vbox_disable_accel(vbox);
55- pci_iounmap(vbox->dev->pdev, vbox->vbva_buffers);
56+ pci_iounmap(VBOX_DRM_TO_PCI_DEV(vbox->dev), vbox->vbva_buffers);
57 }
58
59 /** Do we support the 4.3 plus mode hint reporting interface? */
60@@ -393,7 +393,7 @@
61
62 /* Map guest-heap at end of vram */
63 vbox->guest_heap =
64- pci_iomap_range(vbox->dev->pdev, 0, GUEST_HEAP_OFFSET(vbox),
65+ pci_iomap_range(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0, GUEST_HEAP_OFFSET(vbox),
66 GUEST_HEAP_SIZE);
67 if (!vbox->guest_heap)
68 return -ENOMEM;
69@@ -442,7 +442,7 @@
70 err_destroy_guest_pool:
71 gen_pool_destroy(vbox->guest_pool);
72 err_unmap_guest_heap:
73- pci_iounmap(vbox->dev->pdev, vbox->guest_heap);
74+ pci_iounmap(VBOX_DRM_TO_PCI_DEV(vbox->dev), vbox->guest_heap);
75 return ret;
76 }
77
78@@ -452,7 +452,7 @@
79 cancel_delayed_work(&vbox->refresh_work);
80 vbox_accel_fini(vbox);
81 gen_pool_destroy(vbox->guest_pool);
82- pci_iounmap(vbox->dev->pdev, vbox->guest_heap);
83+ pci_iounmap(VBOX_DRM_TO_PCI_DEV(vbox->dev), vbox->guest_heap);
84 }
85
86 #if RTLNX_VER_MIN(4,19,0) || RTLNX_RHEL_MIN(8,3)
87@@ -567,12 +567,16 @@
88
89 size = roundup(size, PAGE_SIZE);
90 if (size == 0)
91+ {
92+ DRM_ERROR("bad size\n");
93 return -EINVAL;
94+ }
95
96 ret = vbox_bo_create(dev, size, 0, 0, &vboxbo);
97 if (ret) {
98 if (ret != -ERESTARTSYS)
99 DRM_ERROR("failed to allocate GEM object\n");
100+ DRM_ERROR("failed to allocate GEM (%d)\n", ret);
101 return ret;
102 }
103
104@@ -628,6 +632,21 @@
105 {
106 struct vbox_bo *vbox_bo = gem_to_vbox_bo(obj);
107
108+#if RTLNX_VER_MIN(5,14,0)
109+ /* Starting from kernel 5.14, there is a warning appears in dmesg
110+ * on attempt to desroy pinned buffer object. Make sure it is unpinned. */
111+ while (vbox_bo->bo.pin_count)
112+ {
113+ int ret;
114+ ret = vbox_bo_unpin(vbox_bo);
115+ if (ret)
116+ {
117+ DRM_ERROR("unable to unpin buffer object\n");
118+ break;
119+ }
120+ }
121+#endif
122+
123 ttm_bo_put(&vbox_bo->bo);
124 }
125
126@@ -648,7 +667,7 @@
127 u32 handle, u64 *offset)
128 {
129 struct drm_gem_object *obj;
130- int ret;
131+ int ret = 0;
132 struct vbox_bo *bo;
133
134 mutex_lock(&dev->struct_mutex);
135@@ -665,8 +684,15 @@
136 bo = gem_to_vbox_bo(obj);
137 *offset = vbox_bo_mmap_offset(bo);
138
139+#if RTLNX_VER_MIN(5,14,0)
140+ ret = drm_vma_node_allow(&bo->bo.base.vma_node, file);
141+ if (ret)
142+ {
143+ DRM_ERROR("unable to grant previladges to user");
144+ }
145+#endif
146+
147 drm_gem_object_put(obj);
148- ret = 0;
149
150 out_unlock:
151 mutex_unlock(&dev->struct_mutex);
152Index: a/src/VBox/Additions/linux/drm/vbox_mode.c
153===================================================================
154--- a/src/VBox/Additions/linux/drm/vbox_mode.c (revision 89690)
155+++ a/src/VBox/Additions/linux/drm/vbox_mode.c (revision 90498)
156@@ -245,6 +245,10 @@
157 vbox_bo_unpin(bo);
158 vbox_bo_unreserve(bo);
159 }
160+ else
161+ {
162+ DRM_ERROR("unable to lock buffer object: error %d\n", ret);
163+ }
164 }
165
166 if (&vbox->fbdev->afb == vbox_fb)
167@@ -856,7 +860,9 @@
168 vbox->cursor_data_size = data_size;
169 dst = vbox->cursor_data;
170
171-#if RTLNX_VER_MIN(5,12,0)
172+#if RTLNX_VER_MIN(5,14,0)
173+ ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.resource->num_pages, &uobj_map);
174+#elif RTLNX_VER_MIN(5,12,0)
175 ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.mem.num_pages, &uobj_map);
176 #else
177 ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &uobj_map);
178Index: a/src/VBox/Additions/linux/drm/vbox_ttm.c
179===================================================================
180--- a/src/VBox/Additions/linux/drm/vbox_ttm.c (revision 89690)
181+++ a/src/VBox/Additions/linux/drm/vbox_ttm.c (revision 90498)
182@@ -41,6 +41,10 @@
183 # include <drm/ttm/ttm_page_alloc.h>
184 #endif
185
186+#if RTLNX_VER_MIN(5,14,0)
187+# include <drm/ttm/ttm_range_manager.h>
188+#endif
189+
190 #if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2)
191 #define PLACEMENT_FLAGS(placement) (placement)
192 #else
193@@ -174,11 +178,13 @@
194 *pl = vboxbo->placement;
195 }
196
197+#if RTLNX_VER_MAX(5,14,0)
198 static int vbox_bo_verify_access(struct ttm_buffer_object *bo,
199 struct file *filp)
200 {
201 return 0;
202 }
203+#endif
204
205 #if RTLNX_VER_MAX(5,10,0)
206 static int vbox_ttm_io_mem_reserve(struct ttm_bo_device *bdev,
207@@ -234,10 +240,10 @@
208 mem->bus.caching = ttm_write_combined;
209 # endif
210 # if RTLNX_VER_MIN(5,10,0)
211- mem->bus.offset = (mem->start << PAGE_SHIFT) + pci_resource_start(vbox->dev->pdev, 0);
212+ mem->bus.offset = (mem->start << PAGE_SHIFT) + pci_resource_start(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0);
213 # else
214 mem->bus.offset = mem->start << PAGE_SHIFT;
215- mem->start = pci_resource_start(vbox->dev->pdev, 0);
216+ mem->start = pci_resource_start(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0);
217 # endif
218 mem->bus.is_iomem = true;
219 break;
220@@ -373,7 +379,9 @@
221 .eviction_valuable = ttm_bo_eviction_valuable,
222 #endif
223 .evict_flags = vbox_bo_evict_flags,
224+#if RTLNX_VER_MAX(5,14,0)
225 .verify_access = vbox_bo_verify_access,
226+#endif
227 .io_mem_reserve = &vbox_ttm_io_mem_reserve,
228 .io_mem_free = &vbox_ttm_io_mem_free,
229 #if RTLNX_VER_MIN(4,12,0) || RTLNX_RHEL_MAJ_PREREQ(7,5)
230@@ -451,12 +459,12 @@
231 }
232
233 #ifdef DRM_MTRR_WC
234- vbox->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 0),
235- pci_resource_len(dev->pdev, 0),
236+ vbox->fb_mtrr = drm_mtrr_add(pci_resource_start(VBOX_DRM_TO_PCI_DEV(dev), 0),
237+ pci_resource_len(VBOX_DRM_TO_PCI_DEV(dev), 0),
238 DRM_MTRR_WC);
239 #else
240- vbox->fb_mtrr = arch_phys_wc_add(pci_resource_start(dev->pdev, 0),
241- pci_resource_len(dev->pdev, 0));
242+ vbox->fb_mtrr = arch_phys_wc_add(pci_resource_start(VBOX_DRM_TO_PCI_DEV(dev), 0),
243+ pci_resource_len(VBOX_DRM_TO_PCI_DEV(dev), 0));
244 #endif
245 return 0;
246
247@@ -477,8 +485,8 @@
248 {
249 #ifdef DRM_MTRR_WC
250 drm_mtrr_del(vbox->fb_mtrr,
251- pci_resource_start(vbox->dev->pdev, 0),
252- pci_resource_len(vbox->dev->pdev, 0), DRM_MTRR_WC);
253+ pci_resource_start(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0),
254+ pci_resource_len(VBOX_DRM_TO_PCI_DEV(vbox->dev), 0), DRM_MTRR_WC);
255 #else
256 arch_phys_wc_del(vbox->fb_mtrr);
257 #endif
258@@ -560,6 +568,9 @@
259 static const struct drm_gem_object_funcs vbox_drm_gem_object_funcs = {
260 .free = vbox_gem_free_object,
261 .print_info = drm_gem_ttm_print_info,
262+# if RTLNX_VER_MIN(5,14,0)
263+ .mmap = drm_gem_ttm_mmap,
264+# endif
265 };
266 #endif
267
268@@ -598,6 +609,17 @@
269 sizeof(struct vbox_bo));
270 #endif
271
272+#if RTLNX_VER_MIN(5,14,0)
273+ /* Initialization of the following was removed from DRM stack
274+ * in 5.14, so we need to do it manually. */
275+ vboxbo->bo.base.funcs = &vbox_drm_gem_object_funcs;
276+ kref_init(&vboxbo->bo.base.refcount);
277+ vboxbo->bo.base.size = size;
278+ vboxbo->bo.base.dev = dev;
279+ dma_resv_init(&vboxbo->bo.base._resv);
280+ drm_vma_node_reset(&vboxbo->bo.base.vma_node);
281+#endif
282+
283 ret = ttm_bo_init(&vbox->ttm.bdev, &vboxbo->bo, size,
284 ttm_bo_type_device, &vboxbo->placement,
285 #if RTLNX_VER_MAX(4,17,0) && !RTLNX_RHEL_MAJ_PREREQ(7,6) && !RTLNX_SUSE_MAJ_PREREQ(15,1) && !RTLNX_SUSE_MAJ_PREREQ(12,5)
286@@ -613,7 +635,11 @@
287 NULL, vbox_bo_ttm_destroy);
288 #endif
289 if (ret)
290- goto err_free_vboxbo;
291+ {
292+ /* In case of failure, ttm_bo_init() supposed to call
293+ * vbox_bo_ttm_destroy() which in turn will free @vboxbo. */
294+ goto err_exit;
295+ }
296
297 *pvboxbo = vboxbo;
298
299@@ -621,12 +647,15 @@
300
301 err_free_vboxbo:
302 kfree(vboxbo);
303+err_exit:
304 return ret;
305 }
306
307 static inline u64 vbox_bo_gpu_offset(struct vbox_bo *bo)
308 {
309-#if RTLNX_VER_MIN(5,9,0) || RTLNX_RHEL_MIN(8,4) || RTLNX_SUSE_MAJ_PREREQ(15,3)
310+#if RTLNX_VER_MIN(5,14,0)
311+ return bo->bo.resource->start << PAGE_SHIFT;
312+#elif RTLNX_VER_MIN(5,9,0) || RTLNX_RHEL_MIN(8,4) || RTLNX_SUSE_MAJ_PREREQ(15,3)
313 return bo->bo.mem.start << PAGE_SHIFT;
314 #else
315 return bo->bo.offset;
316@@ -685,7 +714,7 @@
317 struct ttm_operation_ctx ctx = { false, false };
318 # endif
319 #endif
320- int ret;
321+ int ret = 0;
322 #if RTLNX_VER_MAX(5,11,0)
323 int i;
324 #endif
325@@ -765,6 +794,7 @@
326 {
327 struct drm_file *file_priv;
328 struct vbox_private *vbox;
329+ int ret = -EINVAL;
330
331 if (unlikely(vma->vm_pgoff < DRM_FILE_PAGE_OFFSET))
332 return -EINVAL;
333@@ -772,5 +802,12 @@
334 file_priv = filp->private_data;
335 vbox = file_priv->minor->dev->dev_private;
336
337- return ttm_bo_mmap(filp, vma, &vbox->ttm.bdev);
338+#if RTLNX_VER_MIN(5,14,0)
339+ if (drm_dev_is_unplugged(file_priv->minor->dev))
340+ return -ENODEV;
341+ ret = drm_gem_mmap(filp, vma);
342+#else
343+ ret = ttm_bo_mmap(filp, vma, &vbox->ttm.bdev);
344+#endif
345+ return ret;
346 }
347Index: a/src/VBox/Additions/linux/drm/vbox_fb.c
348===================================================================
349--- a/src/VBox/Additions/linux/drm/vbox_fb.c (revision 89690)
350+++ a/src/VBox/Additions/linux/drm/vbox_fb.c (revision 90498)
351@@ -301,7 +301,9 @@
352 return ret;
353 }
354
355-#if RTLNX_VER_MIN(5,12,0)
356+#if RTLNX_VER_MIN(5,14,0)
357+ ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.resource->num_pages, &bo->kmap);
358+#elif RTLNX_VER_MIN(5,12,0)
359 ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.mem.num_pages, &bo->kmap);
360 #else
361 ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap);
362@@ -337,8 +339,8 @@
363 * This seems to be done for safety checking that the framebuffer
364 * is not registered twice by different drivers.
365 */
366- info->apertures->ranges[0].base = pci_resource_start(dev->pdev, 0);
367- info->apertures->ranges[0].size = pci_resource_len(dev->pdev, 0);
368+ info->apertures->ranges[0].base = pci_resource_start(VBOX_DRM_TO_PCI_DEV(dev), 0);
369+ info->apertures->ranges[0].size = pci_resource_len(VBOX_DRM_TO_PCI_DEV(dev), 0);
370
371 #if RTLNX_VER_MIN(5,2,0) || RTLNX_RHEL_MAJ_PREREQ(8,2)
372 /*
373Index: a/src/VBox/Additions/linux/drm/vbox_drv.c
374===================================================================
375--- a/src/VBox/Additions/linux/drm/vbox_drv.c (revision 89690)
376+++ a/src/VBox/Additions/linux/drm/vbox_drv.c (revision 90498)
377@@ -43,6 +43,10 @@
378 # include <drm/drm_probe_helper.h>
379 #endif
380
381+#if RTLNX_VER_MIN(5,14,0)
382+# include <drm/drm_aperture.h>
383+#endif
384+
385 #include "version-generated.h"
386 #include "revision-generated.h"
387
388@@ -65,12 +69,23 @@
389 struct drm_device *dev = NULL;
390 int ret = 0;
391
392+# if RTLNX_VER_MIN(5,14,0)
393+ ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, "vboxvideofb");
394+ if (ret)
395+ {
396+ printk("unable to remove conflicting framebuffer devices\n");
397+ return ret;
398+ }
399+# endif /* 5.14 */
400+
401 dev = drm_dev_alloc(&driver, &pdev->dev);
402 if (IS_ERR(dev)) {
403 ret = PTR_ERR(dev);
404 goto err_drv_alloc;
405 }
406+#if RTLNX_VER_MAX(5,14,0)
407 dev->pdev = pdev;
408+#endif
409 pci_set_drvdata(pdev, dev);
410
411 ret = vbox_driver_load(dev);
412@@ -125,7 +140,7 @@
413
414 drm_kms_helper_poll_disable(dev);
415
416- pci_save_state(dev->pdev);
417+ pci_save_state(VBOX_DRM_TO_PCI_DEV(dev));
418
419 drm_fb_helper_set_suspend_unlocked(&vbox->fbdev->helper, true);
420
421@@ -147,7 +162,7 @@
422 {
423 int ret;
424
425- if (pci_enable_device(dev->pdev))
426+ if (pci_enable_device(VBOX_DRM_TO_PCI_DEV(dev)))
427 return -EIO;
428
429 ret = vbox_drm_thaw(dev);
430Index: a/src/VBox/Additions/linux/drm/vbox_irq.c
431===================================================================
432--- a/src/VBox/Additions/linux/drm/vbox_irq.c (revision 89690)
433+++ a/src/VBox/Additions/linux/drm/vbox_irq.c (revision 90498)
434@@ -206,7 +206,7 @@
435 INIT_WORK(&vbox->hotplug_work, vbox_hotplug_worker);
436 vbox_update_mode_hints(vbox);
437 #if RTLNX_VER_MIN(3,16,0) || RTLNX_RHEL_MAJ_PREREQ(7,1)
438- return drm_irq_install(vbox->dev, vbox->dev->pdev->irq);
439+ return drm_irq_install(vbox->dev, VBOX_DRM_TO_PCI_DEV(vbox->dev)->irq);
440 #else
441 return drm_irq_install(vbox->dev);
442 #endif