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" |
