Add initial support for kernel 6.15.0. Patch obtained by comparing sources from 7.1.8 and 7.2.0_BETA1 where upstream added support. https://bugs.gentoo.org/956675 --- a/vboxguest/Makefile-footer.gmk +++ b/vboxguest/Makefile-footer.gmk @@ -115,6 +115,7 @@ VBOXMOD_EXT := ko # build defs EXTRA_CFLAGS += $(VBOXMOD_CFLAGS) $(addprefix -I,$(KERN_INCL) $(VBOXMOD_INCL)) $(VBOXMOD_0_KFLAGS) $(KDEBUG) +ccflags-y += $(EXTRA_CFLAGS) $(VBOXMOD_0_TARGET)-y := $(VBOXMOD_OBJS) obj-m += $(VBOXMOD_0_TARGET).o --- a/vboxguest/r0drv/linux/timer-r0drv-linux.c +++ b/vboxguest/r0drv/linux/timer-r0drv-linux.c @@ -422,7 +422,11 @@ static void rtTimerLnxStopSubTimer(PRTTIMERLNXSUBTIMER pSubTimer, bool fHighRes) } else #endif +# if RTLNX_VER_MIN(6,15,0) + timer_delete(&pSubTimer->u.Std.LnxTimer); +#else del_timer(&pSubTimer->u.Std.LnxTimer); +#endif rtTimerLnxSetState(&pSubTimer->enmState, RTTIMERLNXSTATE_STOPPED); } @@ -470,7 +474,11 @@ static void rtTimerLnxDestroyIt(PRTTIMER pTimer) hrtimer_cancel(&pTimer->aSubTimers[iCpu].u.Hr.LnxTimer); else #endif +# if RTLNX_VER_MIN(6,15,0) + timer_delete_sync(&pTimer->aSubTimers[iCpu].u.Std.LnxTimer); +#else del_timer_sync(&pTimer->aSubTimers[iCpu].u.Std.LnxTimer); +#endif } /* @@ -1626,8 +1634,13 @@ RTDECL(int) RTTimerCreateEx(PRTTIMER *ppTimer, uint64_t u64NanoInterval, uint32_ #ifdef RTTIMER_LINUX_WITH_HRTIMER if (pTimer->fHighRes) { +#if RTLNX_VER_MIN(6,15,0) + hrtimer_setup(&pTimer->aSubTimers[iCpu].u.Hr.LnxTimer, + rtTimerLinuxHrCallback, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); +#else hrtimer_init(&pTimer->aSubTimers[iCpu].u.Hr.LnxTimer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); pTimer->aSubTimers[iCpu].u.Hr.LnxTimer.function = rtTimerLinuxHrCallback; +#endif } else #endif --- a/vboxsf/Makefile-footer.gmk +++ b/vboxsf/Makefile-footer.gmk @@ -115,6 +115,7 @@ VBOXMOD_EXT := ko # build defs EXTRA_CFLAGS += $(VBOXMOD_CFLAGS) $(addprefix -I,$(KERN_INCL) $(VBOXMOD_INCL)) $(VBOXMOD_0_KFLAGS) $(KDEBUG) +ccflags-y += $(EXTRA_CFLAGS) $(VBOXMOD_0_TARGET)-y := $(VBOXMOD_OBJS) obj-m += $(VBOXMOD_0_TARGET).o --- a/vboxsf/dirops.c +++ b/vboxsf/dirops.c @@ -1088,7 +1088,9 @@ static int vbsf_inode_create(struct inode *parent, struct dentry *dentry, int mo * @param mode file mode * @returns 0 on success, Linux error code otherwise */ -#if RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(9,6, 9,99) || defined(DOXYGEN_RUNNING) +#if RTLNX_VER_MIN(6,15,0) +static struct dentry *vbsf_inode_mkdir(struct mnt_idmap *idmap, struct inode *parent, struct dentry *dentry, umode_t mode) +#elif RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(9,6, 9,99) || defined(DOXYGEN_RUNNING) static int vbsf_inode_mkdir(struct mnt_idmap *idmap, struct inode *parent, struct dentry *dentry, umode_t mode) #elif RTLNX_VER_MIN(5,12,0) static int vbsf_inode_mkdir(struct user_namespace *ns, struct inode *parent, struct dentry *dentry, umode_t mode) @@ -1098,14 +1100,22 @@ static int vbsf_inode_mkdir(struct inode *parent, struct dentry *dentry, umode_t static int vbsf_inode_mkdir(struct inode *parent, struct dentry *dentry, int mode) #endif { + int rc; + TRACE(); AssertMsg(!(mode & S_IFMT) || (mode & S_IFMT) == S_IFDIR, ("0%o\n", mode)); - return vbsf_create_worker(parent, dentry, (mode & ~S_IFMT) | S_IFDIR, - SHFL_CF_ACT_CREATE_IF_NEW - | SHFL_CF_ACT_FAIL_IF_EXISTS - | SHFL_CF_ACCESS_READWRITE - | SHFL_CF_DIRECTORY, - false /*fStashHandle*/, false /*fDoLookup*/, NULL /*phHandle*/, NULL /*fCreated*/); + + rc = vbsf_create_worker(parent, dentry, (mode & ~S_IFMT) | S_IFDIR, + SHFL_CF_ACT_CREATE_IF_NEW + | SHFL_CF_ACT_FAIL_IF_EXISTS + | SHFL_CF_ACCESS_READWRITE + | SHFL_CF_DIRECTORY, + false /*fStashHandle*/, false /*fDoLookup*/, NULL /*phHandle*/, NULL /*fCreated*/); +#if RTLNX_VER_MIN(6,15,0) + return ERR_PTR(rc); +#else + return rc; +#endif } --- a/vboxvideo/Makefile-footer.gmk +++ b/vboxvideo/Makefile-footer.gmk @@ -115,6 +115,7 @@ VBOXMOD_EXT := ko # build defs EXTRA_CFLAGS += $(VBOXMOD_CFLAGS) $(addprefix -I,$(KERN_INCL) $(VBOXMOD_INCL)) $(VBOXMOD_0_KFLAGS) $(KDEBUG) +ccflags-y += $(EXTRA_CFLAGS) $(VBOXMOD_0_TARGET)-y := $(VBOXMOD_OBJS) obj-m += $(VBOXMOD_0_TARGET).o --- a/vboxvideo/vbox_fb.c +++ b/vboxvideo/vbox_fb.c @@ -260,7 +260,7 @@ static struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *helper) } #endif -static int vboxfb_create(struct drm_fb_helper *helper, +int vboxfb_create(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes) { struct vbox_fbdev *fbdev = @@ -407,9 +407,11 @@ static int vboxfb_create(struct drm_fb_helper *helper, return 0; } +#if RTLNX_VER_MAX(6,15,0) static struct drm_fb_helper_funcs vbox_fb_helper_funcs = { .fb_probe = vboxfb_create, }; +#endif #if RTLNX_VER_MAX(4,3,0) && !RTLNX_RHEL_MAJ_PREREQ(7,3) static void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper) @@ -478,7 +480,9 @@ int vbox_fbdev_init(struct drm_device *dev) vbox->fbdev = fbdev; spin_lock_init(&fbdev->dirty_lock); -#if RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(8,9, 8,99) || RTLNX_RHEL_RANGE(9,3, 9,99) +#if RTLNX_VER_MIN(6,15,0) + drm_fb_helper_prepare(dev, &fbdev->helper, 32, NULL); +#elif RTLNX_VER_MIN(6,3,0) || RTLNX_RHEL_RANGE(8,9, 8,99) || RTLNX_RHEL_RANGE(9,3, 9,99) drm_fb_helper_prepare(dev, &fbdev->helper, 32, &vbox_fb_helper_funcs); #elif RTLNX_VER_MIN(3,17,0) || RTLNX_RHEL_MIN(7,2) drm_fb_helper_prepare(dev, &fbdev->helper, &vbox_fb_helper_funcs); --- a/vboxvideo/vbox_mode.c +++ b/vboxvideo/vbox_mode.c @@ -653,12 +653,13 @@ static int vbox_get_modes(struct drm_connector *connector) return num_modes; } -#if RTLNX_VER_MAX(3,14,0) && !RTLNX_RHEL_MAJ_PREREQ(7,1) -static int vbox_mode_valid(struct drm_connector *connector, +#if RTLNX_VER_MIN(6,15,0) +static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, const struct drm_display_mode *mode) +#elif RTLNX_VER_MIN(3,14,0) || RTLNX_RHEL_MAJ_PREREQ(7,1) +static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) #else -static enum drm_mode_status vbox_mode_valid(struct drm_connector *connector, +static int vbox_mode_valid(struct drm_connector *connector, struct drm_display_mode *mode) #endif - struct drm_display_mode *mode) { return MODE_OK; } --- a/vboxvideo/vbox_drv.c +++ b/vboxvideo/vbox_drv.c @@ -39,6 +39,10 @@ # include #endif +#if RTLNX_VER_MIN(6,13,0) && defined(CONFIG_APERTURE_HELPERS) +# include +#endif + #if RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) # include #endif @@ -88,7 +92,9 @@ static int vbox_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) } #endif -# if RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) +# if RTLNX_VER_MIN(6,13,0) && defined(CONFIG_APERTURE_HELPERS) + ret = aperture_remove_conflicting_pci_devices(pdev, driver.name); +# elif RTLNX_VER_RANGE(5,14,0, 6,13,0) || RTLNX_RHEL_RANGE(8,6, 8,99) # if RTLNX_VER_MIN(5,15,0) || RTLNX_RHEL_RANGE(8,7, 8,99) || RTLNX_RHEL_MIN(9,1) || RTLNX_SUSE_MAJ_PREREQ(15,4) ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &driver); # else @@ -384,6 +390,9 @@ static struct drm_driver driver = { .desc = DRIVER_DESC, #if RTLNX_VER_MAX(6,14,0) .date = DRIVER_DATE, +#endif +#if RTLNX_VER_MIN(6,15,0) + .fbdev_probe = vboxfb_create, #endif .major = DRIVER_MAJOR, .minor = DRIVER_MINOR, @@ -404,7 +413,9 @@ static struct drm_driver driver = { .prime_fd_to_handle = drm_gem_prime_fd_to_handle, #endif .gem_prime_import = drm_gem_prime_import, +#if RTLNX_VER_MAX(6,15,0) .gem_prime_import_sg_table = vbox_gem_prime_import_sg_table, +#endif #if RTLNX_VER_MAX(6,6,0) && !RTLNX_RHEL_RANGE(9,4, 9,99) && !RTLNX_SUSE_MAJ_PREREQ(15, 6) .gem_prime_mmap = vbox_gem_prime_mmap, #endif --- a/vboxvideo/vbox_prime.c +++ b/vboxvideo/vbox_prime.c @@ -49,18 +49,20 @@ struct sg_table *vbox_gem_prime_get_sg_table(struct drm_gem_object *obj) return ERR_PTR(-ENOSYS); } -#if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2) +#if RTLNX_VER_MAX(6,15,0) +# if RTLNX_VER_MAX(3,18,0) && !RTLNX_RHEL_MAJ_PREREQ(7,2) struct drm_gem_object *vbox_gem_prime_import_sg_table( struct drm_device *dev, size_t size, struct sg_table *table) -#else +# else struct drm_gem_object *vbox_gem_prime_import_sg_table( struct drm_device *dev, struct dma_buf_attachment *attach, struct sg_table *table) -#endif +# endif { WARN_ONCE(1, "not implemented"); return ERR_PTR(-ENOSYS); } +#endif void *vbox_gem_prime_vmap(struct drm_gem_object *obj) { --- a/vboxvideo/vbox_drv.h +++ b/vboxvideo/vbox_drv.h @@ -428,6 +428,8 @@ int vbox_framebuffer_init(struct drm_device *dev, #endif struct drm_gem_object *obj); +int vboxfb_create(struct drm_fb_helper *helper, struct drm_fb_helper_surface_size *sizes); + int vbox_fbdev_init(struct drm_device *dev); void vbox_fbdev_fini(struct drm_device *dev); void vbox_fbdev_set_base(struct vbox_private *vbox, unsigned long gpu_addr);