diff options
3 files changed, 563 insertions, 1 deletions
diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r89690-5.14-fixes.patch b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r89690-5.14-fixes.patch new file mode 100644 index 0000000000..951bd5013d --- /dev/null +++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r89690-5.14-fixes.patch | |||
@@ -0,0 +1,442 @@ | |||
1 | Subject: Fix build errors with linux 5.14 | ||
2 | |||
3 | Upstream-Status: backport | ||
4 | |||
5 | svn-id: r89690 | ||
6 | |||
7 | Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com> | ||
8 | |||
9 | Index: 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 | |||
29 | Index: 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); | ||
152 | Index: 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); | ||
178 | Index: 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 | } | ||
347 | Index: 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 | /* | ||
373 | Index: 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); | ||
430 | Index: 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 | ||
diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r90497-regops-5.14-fix.patch b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r90497-regops-5.14-fix.patch new file mode 100644 index 0000000000..0d960fa4f5 --- /dev/null +++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers/r90497-regops-5.14-fix.patch | |||
@@ -0,0 +1,118 @@ | |||
1 | Subject: Fix regops build errors with linux 5.14 | ||
2 | |||
3 | Upstream-Status: backport | ||
4 | |||
5 | svn-id: r90497 | ||
6 | |||
7 | Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com> | ||
8 | |||
9 | Index: a/src/VBox/Additions/linux/sharedfolders/regops.c | ||
10 | =================================================================== | ||
11 | --- a/src/VBox/Additions/linux/sharedfolders/regops.c (revision 88716) | ||
12 | +++ a/src/VBox/Additions/linux/sharedfolders/regops.c (revision 90497) | ||
13 | @@ -2126,7 +2126,11 @@ | ||
14 | int rc = 0; | ||
15 | |||
16 | Assert(iov_iter_count(iter) + pStash->cb > 0); | ||
17 | +# if RTLNX_VER_MIN(5,14,0) | ||
18 | + if (!(iter->iter_type & ITER_KVEC)) { | ||
19 | +#else | ||
20 | if (!(iter->type & ITER_KVEC)) { | ||
21 | +#endif | ||
22 | /* | ||
23 | * Do we have a stashed page? | ||
24 | */ | ||
25 | @@ -2372,7 +2376,9 @@ | ||
26 | static size_t vbsf_iter_max_span_of_pages(struct iov_iter *iter) | ||
27 | { | ||
28 | size_t cPages; | ||
29 | -# if RTLNX_VER_MIN(3,16,0) | ||
30 | +#if RTLNX_VER_MIN(5,14,0) | ||
31 | + if (iter_is_iovec(iter) || (iter->iter_type & ITER_KVEC)) { | ||
32 | +#elif RTLNX_VER_MIN(3,16,0) | ||
33 | if (iter_is_iovec(iter) || (iter->type & ITER_KVEC)) { | ||
34 | #endif | ||
35 | const struct iovec *pCurIov = iter->iov; | ||
36 | @@ -2436,7 +2442,11 @@ | ||
37 | } else { | ||
38 | /* Won't bother with accurate counts for the next two types, just make | ||
39 | some rough estimates (does pipes have segments?): */ | ||
40 | +# if RTLNX_VER_MIN(5,14,0) | ||
41 | + size_t cSegs = iter->iter_type & ITER_BVEC ? RT_MAX(1, iter->nr_segs) : 1; | ||
42 | +# else | ||
43 | size_t cSegs = iter->type & ITER_BVEC ? RT_MAX(1, iter->nr_segs) : 1; | ||
44 | +#endif | ||
45 | cPages = (iov_iter_count(iter) + (PAGE_SIZE * 2 - 2) * cSegs) >> PAGE_SHIFT; | ||
46 | } | ||
47 | # endif | ||
48 | @@ -2588,8 +2598,14 @@ | ||
49 | struct vbsf_reg_info *sf_r = kio->ki_filp->private_data; | ||
50 | struct vbsf_super_info *pSuperInfo = VBSF_GET_SUPER_INFO(inode->i_sb); | ||
51 | |||
52 | +#if RTLNX_VER_MIN(5,14,0) | ||
53 | SFLOGFLOW(("vbsf_reg_read_iter: inode=%p file=%p size=%#zx off=%#llx type=%#x\n", | ||
54 | + inode, kio->ki_filp, cbToRead, kio->ki_pos, iter->iter_type)); | ||
55 | +#else | ||
56 | + SFLOGFLOW(("vbsf_reg_read_iter: inode=%p file=%p size=%#zx off=%#llx type=%#x\n", | ||
57 | inode, kio->ki_filp, cbToRead, kio->ki_pos, iter->type)); | ||
58 | +#endif | ||
59 | + | ||
60 | AssertReturn(S_ISREG(inode->i_mode), -EINVAL); | ||
61 | |||
62 | /* | ||
63 | @@ -2823,9 +2839,13 @@ | ||
64 | bool const fAppend = RT_BOOL(kio->ki_filp->f_flags & O_APPEND); | ||
65 | # endif | ||
66 | |||
67 | - | ||
68 | +#if RTLNX_VER_MIN(5,14,0) | ||
69 | SFLOGFLOW(("vbsf_reg_write_iter: inode=%p file=%p size=%#zx off=%#llx type=%#x\n", | ||
70 | + inode, kio->ki_filp, cbToWrite, offFile, iter->iter_type)); | ||
71 | +#else | ||
72 | + SFLOGFLOW(("vbsf_reg_write_iter: inode=%p file=%p size=%#zx off=%#llx type=%#x\n", | ||
73 | inode, kio->ki_filp, cbToWrite, offFile, iter->type)); | ||
74 | +#endif | ||
75 | AssertReturn(S_ISREG(inode->i_mode), -EINVAL); | ||
76 | |||
77 | /* | ||
78 | @@ -3737,7 +3757,27 @@ | ||
79 | } | ||
80 | #endif /* KERNEL_VERSION >= 2.6.24 */ | ||
81 | |||
82 | +#if RTLNX_VER_MIN(5,14,0) | ||
83 | +static int vbsf_write_end(struct file *file, struct address_space *mapping, | ||
84 | + loff_t pos, unsigned int len, unsigned int copied, | ||
85 | + struct page *page, void *fsdata) | ||
86 | +{ | ||
87 | + static uint64_t volatile s_cCalls = 0; | ||
88 | + if (s_cCalls++ < 16) | ||
89 | + { | ||
90 | + printk("vboxsf: Unexpected call to vbsf_write_end(pos=%#llx len=%#x)! Please report.\n", | ||
91 | + (unsigned long long)pos, len); | ||
92 | + RTLogBackdoorPrintf("vboxsf: Unexpected call to vbsf_write_end(pos=%#llx len=%#x)! Please report.\n", | ||
93 | + (unsigned long long)pos, len); | ||
94 | +# ifdef WARN_ON | ||
95 | + WARN_ON(1); | ||
96 | +# endif | ||
97 | + } | ||
98 | |||
99 | + return -ENOTSUPP; | ||
100 | +} | ||
101 | +#endif | ||
102 | + | ||
103 | #if RTLNX_VER_MIN(2,4,10) | ||
104 | |||
105 | # ifdef VBOX_UEK | ||
106 | @@ -3791,8 +3831,11 @@ | ||
107 | #if RTLNX_VER_MIN(2,5,12) | ||
108 | .set_page_dirty = __set_page_dirty_buffers, | ||
109 | #endif | ||
110 | -#if RTLNX_VER_MIN(2,6,24) | ||
111 | +#if RTLNX_VER_MIN(5,14,0) | ||
112 | .write_begin = vbsf_write_begin, | ||
113 | + .write_end = vbsf_write_end, | ||
114 | +#elif RTLNX_VER_MIN(2,6,24) | ||
115 | + .write_begin = vbsf_write_begin, | ||
116 | .write_end = simple_write_end, | ||
117 | #elif RTLNX_VER_MIN(2,5,45) | ||
118 | .prepare_write = simple_prepare_write, | ||
diff --git a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.26.bb b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.26.bb index 689782b7fd..84651ae64a 100644 --- a/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.26.bb +++ b/meta-oe/recipes-support/vboxguestdrivers/vboxguestdrivers_6.1.26.bb | |||
@@ -13,13 +13,15 @@ VBOX_NAME = "VirtualBox-${PV}" | |||
13 | 13 | ||
14 | SRC_URI = "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 \ | 14 | SRC_URI = "http://download.virtualbox.org/virtualbox/${PV}/${VBOX_NAME}.tar.bz2 \ |
15 | file://Makefile.utils \ | 15 | file://Makefile.utils \ |
16 | file://r89690-5.14-fixes.patch \ | ||
17 | file://r90497-regops-5.14-fix.patch \ | ||
16 | " | 18 | " |
17 | 19 | ||
18 | SRC_URI[md5sum] = "fce04bbef244b4df1a50e53d132d3e6f" | 20 | SRC_URI[md5sum] = "fce04bbef244b4df1a50e53d132d3e6f" |
19 | SRC_URI[sha256sum] = "0212602eea878d6c9fd7f4a3e0182da3e4505f31d25f5539fb8f7b1fbe366195" | 21 | SRC_URI[sha256sum] = "0212602eea878d6c9fd7f4a3e0182da3e4505f31d25f5539fb8f7b1fbe366195" |
20 | 22 | ||
21 | S ?= "${WORKDIR}/vbox_module" | 23 | S ?= "${WORKDIR}/vbox_module" |
22 | S_task-patch = "${WORKDIR}/${VBOX_NAME}" | 24 | S:task-patch = "${WORKDIR}/${VBOX_NAME}" |
23 | 25 | ||
24 | export BUILD_TARGET_ARCH="${ARCH}" | 26 | export BUILD_TARGET_ARCH="${ARCH}" |
25 | export BUILD_TARGET_ARCH:x86-64="amd64" | 27 | export BUILD_TARGET_ARCH:x86-64="amd64" |