Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package evdi for openSUSE:Factory checked in at 2026-04-18 21:35:08 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/evdi (Old) and /work/SRC/openSUSE:Factory/.evdi.new.11940 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "evdi" Sat Apr 18 21:35:08 2026 rev:15 rq:1347838 version:1.14.15 Changes: -------- --- /work/SRC/openSUSE:Factory/evdi/evdi.changes 2026-01-06 17:47:37.789143731 +0100 +++ /work/SRC/openSUSE:Factory/.evdi.new.11940/evdi.changes 2026-04-18 21:35:18.526956386 +0200 @@ -1,0 +2,10 @@ +Fri Apr 17 09:11:11 UTC 2026 - Jiri Slaby <[email protected]> + +- Update to version 1.14.15 + * Preliminary support for linux kernel v7.0 + * Improve performance on Intel Core Ultra 7 platform + * Fix audio issues during MS Teams call + * Fix "Failed to map scanout buffer" error on Intel Core Ultra 7 platform + * Set libEvdi license to LGPL v2.1-or-later + +------------------------------------------------------------------- Old: ---- evdi-1.14.12.tar.gz New: ---- evdi-1.14.15.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ evdi.spec ++++++ --- /var/tmp/diff_new_pack.R9HvBo/_old 2026-04-18 21:35:19.258986220 +0200 +++ /var/tmp/diff_new_pack.R9HvBo/_new 2026-04-18 21:35:19.258986220 +0200 @@ -21,12 +21,12 @@ Name: evdi Release: 0 -Version: 1.14.12 +Version: 1.14.15 Summary: Extensible Virtual Display Interface (EVDI) is a Linux Kernel Module License: GPL-2.0-only AND LGPL-2.1-only Group: System/Kernel URL: https://github.com/DisplayLink/evdi -Source0: evdi-%{version}.tar.gz +Source0: https://github.com/DisplayLink/evdi/archive/refs/tags/v%{version}.tar.gz#/evdi-%{version}.tar.gz Source1: evdi-kmp-preamble Source2: evdi-rpmlintrc Patch0: buildfix.patch ++++++ evdi-1.14.12.tar.gz -> evdi-1.14.15.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/README.md new/evdi-1.14.15/README.md --- old/evdi-1.14.12/README.md 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/README.md 2026-02-25 08:24:01.000000000 +0100 @@ -43,7 +43,7 @@ ## Licensing Elements of this project are licensed under various licenses. In particular, the `module` and `library` are licensed -under GPL v2 and LGPL v2.1 respectively - consult separate `LICENSE` files in subfolders. Remaining files and subfolders (unless +under GPL v2 and LGPL v2.1-or-later respectively - consult separate `LICENSE` files in subfolders. Remaining files and subfolders (unless a separate `LICENSE` file states otherwise) are licensed under MIT license. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/ci/build_against_kernel new/evdi-1.14.15/ci/build_against_kernel --- old/evdi-1.14.12/ci/build_against_kernel 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/ci/build_against_kernel 2026-02-25 08:24:01.000000000 +0100 @@ -237,7 +237,7 @@ local src_dir local KTAG=v${KVER} - local extra_cflags="-DCONFIG_FB" + local extra_cflags="-DCONFIG_DRM_TTM_HELPER" if [ "${KVER}" == "master" ]; then KTAG="origin/master" else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/ci/deb_config new/evdi-1.14.15/ci/deb_config --- old/evdi-1.14.12/ci/deb_config 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/ci/deb_config 2026-02-25 08:24:01.000000000 +0100 @@ -8,7 +8,7 @@ evdi_maintainer='Synaptics Technical Support <[email protected]>' # shellcheck disable=SC2034 -evdi_version='1.14.12' +evdi_version='1.14.15' # shellcheck disable=SC2034 evdi_description="Extensible Virtual Display Interface (EVDI) is a Linux® kernel module that enables management of multiple screens. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/library/Makefile new/evdi-1.14.15/library/Makefile --- old/evdi-1.14.12/library/Makefile 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/library/Makefile 2026-02-25 08:24:01.000000000 +0100 @@ -11,10 +11,10 @@ DEPS = evdi_ioctl.h CFLAGS := -I../module -std=gnu99 -fPIC -D_FILE_OFFSET_BITS=64 $(CFLAGS) $$($(PKG_CONFIG) --cflags-only-I libdrm) -LIBVER := 1.14.12 +LIBVER := 1.14.15 LIBABI := 1 -PREFIX ?= /usr/local +PREFIX ?= /usr LIBDIR ?= $(PREFIX)/lib default: libevdi.so.$(LIBVER) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/library/evdi_lib.c new/evdi-1.14.15/library/evdi_lib.c --- old/evdi-1.14.12/library/evdi_lib.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/library/evdi_lib.c 2026-02-25 08:24:01.000000000 +0100 @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1-only +// SPDX-License-Identifier: LGPL-2.1-or-later // Copyright (c) 2015 - 2024 DisplayLink (UK) Ltd. #include <stddef.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/library/evdi_lib.h new/evdi-1.14.15/library/evdi_lib.h --- old/evdi-1.14.12/library/evdi_lib.h 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/library/evdi_lib.h 2026-02-25 08:24:01.000000000 +0100 @@ -1,4 +1,4 @@ -/* SPDX-License-Identifier: LGPL-2.1-only +/* SPDX-License-Identifier: LGPL-2.1-or-later * Copyright (c) 2015 - 2024 DisplayLink (UK) Ltd. */ @@ -15,7 +15,7 @@ #define LIBEVDI_VERSION_MAJOR 1 #define LIBEVDI_VERSION_MINOR 14 -#define LIBEVDI_VERSION_PATCH 12 +#define LIBEVDI_VERSION_PATCH 15 struct evdi_lib_version { int version_major; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/library/evdi_procfs.c new/evdi-1.14.15/library/evdi_procfs.c --- old/evdi-1.14.12/library/evdi_procfs.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/library/evdi_procfs.c 2026-02-25 08:24:01.000000000 +0100 @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1-only +// SPDX-License-Identifier: LGPL-2.1-or-later // Copyright (c) 2015 - 2024 DisplayLink (UK) Ltd. #include "evdi_lib.h" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/Kconfig new/evdi-1.14.15/module/Kconfig --- old/evdi-1.14.12/module/Kconfig 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/Kconfig 2026-02-25 08:24:01.000000000 +0100 @@ -24,6 +24,7 @@ tristate "KUnit tests for evdi" if !KUNIT_ALL_TESTS depends on DRM_EVDI && KUNIT default KUNIT_ALL_TESTS + select DRM_TTM_HELPER help KUnit tests for evdi DRM module. This option is useful for kernel developers. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/Makefile new/evdi-1.14.15/module/Makefile --- old/evdi-1.14.12/module/Makefile 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/Makefile 2026-02-25 08:24:01.000000000 +0100 @@ -59,7 +59,7 @@ DKMS ?= dkms RM ?= rm -MODVER=1.14.12 +MODVER=1.14.15 ifeq ($(KVER),) KVER := $(shell uname -r) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/dkms.conf new/evdi-1.14.15/module/dkms.conf --- old/evdi-1.14.12/module/dkms.conf 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/dkms.conf 2026-02-25 08:24:01.000000000 +0100 @@ -7,7 +7,7 @@ # PACKAGE_NAME="evdi" -PACKAGE_VERSION=1.14.12 +PACKAGE_VERSION=1.14.15 AUTOINSTALL=yes MAKE[0]="make all INCLUDEDIR=/lib/modules/$kernelver/build/include KVERSION=$kernelver DKMS_BUILD=1" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/dkms_install.sh new/evdi-1.14.15/module/dkms_install.sh --- old/evdi-1.14.12/module/dkms_install.sh 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/dkms_install.sh 2026-02-25 08:24:01.000000000 +0100 @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-only # Copyright (c) 2023 DisplayLink (UK) Ltd. -evdi_version='1.14.12' +evdi_version='1.14.15' EVDI_DIR=$(dirname "${BASH_SOURCE[0]}") EVDI_REBOOT_RATIONALE= diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_connector.c new/evdi-1.14.15/module/evdi_connector.c --- old/evdi-1.14.12/module/evdi_connector.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_connector.c 2026-02-25 08:24:01.000000000 +0100 @@ -184,7 +184,7 @@ struct drm_connector *connector; struct evdi_device *evdi = dev->dev_private; - connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL); + connector = kzalloc_obj(*connector, GFP_KERNEL); if (!connector) return -ENOMEM; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_debug.h new/evdi-1.14.15/module/evdi_debug.h --- old/evdi-1.14.12/module/evdi_debug.h 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_debug.h 2026-02-25 08:24:01.000000000 +0100 @@ -10,6 +10,7 @@ #define EVDI_DEBUG_H #include "evdi_params.h" +#include <linux/version.h> #define EVDI_LOGLEVEL_FATAL 1 #define EVDI_LOGLEVEL_ERROR 2 @@ -54,4 +55,10 @@ void evdi_log_process(char *buf, size_t size); + +#if KERNEL_VERSION(6, 20, 0) <= LINUX_VERSION_CODE +#else +#define kzalloc_obj(obj, flags) kzalloc(sizeof(typeof(obj)), flags) +#endif + #endif /* EVDI_DEBUG_H */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_drm_drv.c new/evdi-1.14.15/module/evdi_drm_drv.c --- old/evdi-1.14.12/module/evdi_drm_drv.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_drm_drv.c 2026-02-25 08:24:01.000000000 +0100 @@ -104,12 +104,6 @@ .open = evdi_driver_open, .postclose = evdi_driver_postclose, -#if KERNEL_VERSION(6, 15, 0) <= LINUX_VERSION_CODE -#ifdef CONFIG_FB - .fbdev_probe = evdifb_create, -#endif -#endif - /* gem hooks */ #if KERNEL_VERSION(5, 11, 0) <= LINUX_VERSION_CODE || defined(EL8) #elif KERNEL_VERSION(5, 9, 0) <= LINUX_VERSION_CODE @@ -182,7 +176,7 @@ int ret; EVDI_CHECKPT(); - evdi = kzalloc(sizeof(struct evdi_device), GFP_KERNEL); + evdi = kzalloc_obj(*evdi, GFP_KERNEL); if (!evdi) return -ENOMEM; @@ -198,11 +192,6 @@ goto err_free; evdi_modeset_init(dev); -#ifdef CONFIG_FB - ret = evdi_fbdev_init(dev); - if (ret) - goto err_init; -#endif /* CONFIG_FB */ ret = drm_vblank_init(dev, 1); if (ret) @@ -218,9 +207,6 @@ return 0; err_init: -#ifdef CONFIG_FB - evdi_fbdev_cleanup(dev); -#endif /* CONFIG_FB */ err_free: EVDI_ERROR("Failed to setup drm device %d\n", ret); evdi_cursor_free(evdi->cursor); @@ -289,10 +275,6 @@ static void evdi_drm_device_deinit(struct drm_device *dev) { drm_kms_helper_poll_fini(dev); -#ifdef CONFIG_FB - evdi_fbdev_unplug(dev); - evdi_fbdev_cleanup(dev); -#endif /* CONFIG_FB */ evdi_modeset_cleanup(dev); drm_atomic_helper_shutdown(dev); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_drm_drv.h new/evdi-1.14.15/module/evdi_drm_drv.h --- old/evdi-1.14.12/module/evdi_drm_drv.h 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_drm_drv.h 2026-02-25 08:24:01.000000000 +0100 @@ -79,6 +79,7 @@ struct drm_framebuffer base; struct evdi_gem_object *obj; bool active; + bool is_from_xe; }; #define to_evdi_fb(x) container_of(x, struct evdi_framebuffer, base) @@ -98,14 +99,6 @@ long evdi_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); #endif - -#ifdef CONFIG_FB -int evdi_fbdev_init(struct drm_device *dev); -void evdi_fbdev_cleanup(struct drm_device *dev); -void evdi_fbdev_unplug(struct drm_device *dev); -int evdifb_create(struct drm_fb_helper *helper, - struct drm_fb_helper_surface_size *sizes); -#endif /* CONFIG_FB */ struct drm_framebuffer *evdi_fb_user_fb_create( struct drm_device *dev, struct drm_file *file, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_encoder.c new/evdi-1.14.15/module/evdi_encoder.c --- old/evdi-1.14.12/module/evdi_encoder.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_encoder.c 2026-02-25 08:24:01.000000000 +0100 @@ -51,7 +51,7 @@ struct drm_encoder *encoder; int ret = 0; - encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL); + encoder = kzalloc_obj(*encoder, GFP_KERNEL); if (!encoder) goto err; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_fb.c new/evdi-1.14.15/module/evdi_fb.c --- old/evdi-1.14.12/module/evdi_fb.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_fb.c 2026-02-25 08:24:01.000000000 +0100 @@ -12,9 +12,6 @@ */ #include <linux/slab.h> -#ifdef CONFIG_FB -#include <linux/fb.h> -#endif /* CONFIG_FB */ #include <linux/dma-buf.h> #include <linux/version.h> #if KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE || defined(EL8) @@ -86,141 +83,6 @@ return rect; } -#ifdef CONFIG_FB -static int evdi_handle_damage(struct evdi_framebuffer *fb, - int x, int y, int width, int height) -{ - const struct drm_clip_rect dirty_rect = { x, y, x + width, y + height }; - const struct drm_clip_rect rect = - evdi_framebuffer_sanitize_rect(fb, &dirty_rect); - struct drm_device *dev = fb->base.dev; - struct evdi_device *evdi = dev->dev_private; - - EVDI_CHECKPT(); - - if (!fb->active) - return 0; - evdi_painter_set_scanout_buffer(evdi->painter, fb); - evdi_painter_mark_dirty(evdi, &rect); - - return 0; -} - -static int evdi_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) -{ - unsigned long start = vma->vm_start; - unsigned long size = vma->vm_end - vma->vm_start; - unsigned long offset = vma->vm_pgoff << PAGE_SHIFT; - unsigned long page, pos; - - if (vma->vm_pgoff > (~0UL >> PAGE_SHIFT)) - return -EINVAL; - - if (offset > info->fix.smem_len || - size > info->fix.smem_len - offset) - return -EINVAL; - - pos = (unsigned long)info->fix.smem_start + offset; - - pr_notice("mmap() framebuffer addr:%lu size:%lu\n", pos, size); - - while (size > 0) { - page = vmalloc_to_pfn((void *)pos); - if (remap_pfn_range(vma, start, page, PAGE_SIZE, PAGE_SHARED)) - return -EAGAIN; - - start += PAGE_SIZE; - pos += PAGE_SIZE; - if (size > PAGE_SIZE) - size -= PAGE_SIZE; - else - size = 0; - } - - return 0; -} - -static void evdi_fb_fillrect(struct fb_info *info, - const struct fb_fillrect *rect) -{ - struct evdi_fbdev *efbdev = info->par; - - EVDI_CHECKPT(); - sys_fillrect(info, rect); - evdi_handle_damage(&efbdev->efb, rect->dx, rect->dy, rect->width, - rect->height); -} - -static void evdi_fb_copyarea(struct fb_info *info, - const struct fb_copyarea *region) -{ - struct evdi_fbdev *efbdev = info->par; - - EVDI_CHECKPT(); - sys_copyarea(info, region); - evdi_handle_damage(&efbdev->efb, region->dx, region->dy, region->width, - region->height); -} - -static void evdi_fb_imageblit(struct fb_info *info, - const struct fb_image *image) -{ - struct evdi_fbdev *efbdev = info->par; - - EVDI_CHECKPT(); - sys_imageblit(info, image); - evdi_handle_damage(&efbdev->efb, image->dx, image->dy, image->width, - image->height); -} - -/* - * It's common for several clients to have framebuffer open simultaneously. - * e.g. both fbcon and X. Makes things interesting. - * Assumes caller is holding info->lock (for open and release at least) - */ -static int evdi_fb_open(struct fb_info *info, int user) -{ - struct evdi_fbdev *efbdev = info->par; - - efbdev->fb_count++; - pr_notice("open /dev/fb%d user=%d fb_info=%p count=%d\n", - info->node, user, info, efbdev->fb_count); - - return 0; -} - -/* - * Assumes caller is holding info->lock mutex (for open and release at least) - */ -static int evdi_fb_release(struct fb_info *info, int user) -{ - struct evdi_fbdev *efbdev = info->par; - - efbdev->fb_count--; - - pr_warn("released /dev/fb%d user=%d count=%d\n", - info->node, user, efbdev->fb_count); - - return 0; -} -static const struct fb_ops evdifb_ops = { - .owner = THIS_MODULE, - .fb_check_var = drm_fb_helper_check_var, - .fb_set_par = drm_fb_helper_set_par, - .fb_fillrect = evdi_fb_fillrect, - .fb_copyarea = evdi_fb_copyarea, - .fb_imageblit = evdi_fb_imageblit, - .fb_pan_display = drm_fb_helper_pan_display, - .fb_blank = drm_fb_helper_blank, - .fb_setcmap = drm_fb_helper_setcmap, - .fb_debug_enter = drm_fb_helper_debug_enter, - .fb_debug_leave = drm_fb_helper_debug_leave, - .fb_mmap = evdi_fb_mmap, - .fb_open = evdi_fb_open, - .fb_release = evdi_fb_release, -}; -#endif /* CONFIG_FB */ - #if KERNEL_VERSION(5, 0, 0) <= LINUX_VERSION_CODE || defined(EL8) #else /* @@ -361,251 +223,32 @@ return drm_framebuffer_init(dev, &efb->base, &evdifb_funcs); } -#ifdef CONFIG_FB -int evdifb_create(struct drm_fb_helper *helper, - struct drm_fb_helper_surface_size *sizes) -{ - struct evdi_fbdev *efbdev = (struct evdi_fbdev *)helper; - struct drm_device *dev = efbdev->helper.dev; - struct fb_info *info; - struct device *device = dev->dev; - struct drm_framebuffer *fb; - struct drm_mode_fb_cmd2 mode_cmd; - struct evdi_gem_object *obj; - uint32_t size; - int ret = 0; - - if (sizes->surface_bpp == 24) { - sizes->surface_bpp = 32; - } else if (sizes->surface_bpp != 32) { - EVDI_ERROR("Not supported pixel format (bpp=%d)\n", - sizes->surface_bpp); - return -EINVAL; - } - - mode_cmd.width = sizes->surface_width; - mode_cmd.height = sizes->surface_height; - mode_cmd.pitches[0] = mode_cmd.width * ((sizes->surface_bpp + 7) / 8); - - mode_cmd.pixel_format = drm_mode_legacy_fb_format(sizes->surface_bpp, - sizes->surface_depth); - - size = mode_cmd.pitches[0] * mode_cmd.height; - size = ALIGN(size, PAGE_SIZE); - - obj = evdi_gem_alloc_object(dev, size); - if (!obj) - goto out; - - ret = evdi_gem_vmap(obj); - if (ret) { - DRM_ERROR("failed to vmap fb\n"); - goto out_gfree; - } - - info = framebuffer_alloc(0, device); - if (!info) { - ret = -ENOMEM; - goto out_gfree; - } - info->par = efbdev; - - ret = evdi_framebuffer_init(dev, &efbdev->efb, -#if KERNEL_VERSION(6, 17, 0) <= LINUX_VERSION_CODE - NULL, -#endif - &mode_cmd, obj); - if (ret) - goto out_gfree; - - fb = &efbdev->efb.base; - - efbdev->helper.fb = fb; -#if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - efbdev->helper.info = info; -#else - efbdev->helper.fbdev = info; -#endif - - - strscpy(info->fix.id, "evdidrmfb", sizeof(info->fix.id)); - - info->screen_base = efbdev->efb.obj->vmapping; - info->fix.smem_len = size; - info->fix.smem_start = (unsigned long)efbdev->efb.obj->vmapping; - -#if KERNEL_VERSION(6, 4, 0) <= LINUX_VERSION_CODE || defined(EL9) -#elif KERNEL_VERSION(4, 20, 0) <= LINUX_VERSION_CODE || defined(EL8) - info->flags = FBINFO_DEFAULT; -#else - info->flags = FBINFO_DEFAULT | FBINFO_CAN_FORCE_OUTPUT; -#endif - - efbdev->fb_ops = &evdifb_ops; - info->fbops = efbdev->fb_ops; - -#if KERNEL_VERSION(5, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) - drm_fb_helper_fill_info(info, &efbdev->helper, sizes); -#else - drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth); - drm_fb_helper_fill_var(info, &efbdev->helper, sizes->fb_width, - sizes->fb_height); -#endif - - ret = fb_alloc_cmap(&info->cmap, 256, 0); - if (ret) { - ret = -ENOMEM; - goto out_gfree; - } - - DRM_DEBUG_KMS("allocated %dx%d vmal %p\n", - fb->width, fb->height, efbdev->efb.obj->vmapping); - - return ret; - out_gfree: -#if KERNEL_VERSION(5, 9, 0) <= LINUX_VERSION_CODE || defined(EL8) - drm_gem_object_put(&efbdev->efb.obj->base); -#else - drm_gem_object_put_unlocked(&efbdev->efb.obj->base); -#endif - out: - return ret; -} - -#if KERNEL_VERSION(6, 15, 0) <= LINUX_VERSION_CODE || defined(EL9) || defined(EL10) -#else -static struct drm_fb_helper_funcs evdi_fb_helper_funcs = { - .fb_probe = evdifb_create, -}; -#endif - -static void evdi_fbdev_destroy(__always_unused struct drm_device *dev, - struct evdi_fbdev *efbdev) -{ - struct fb_info *info; - -#if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - if (efbdev->helper.info) { - info = efbdev->helper.info; -#else - if (efbdev->helper.fbdev) { - info = efbdev->helper.fbdev; -#endif - unregister_framebuffer(info); - if (info->cmap.len) - fb_dealloc_cmap(&info->cmap); - - framebuffer_release(info); - } - drm_fb_helper_fini(&efbdev->helper); - if (efbdev->efb.obj) { - drm_framebuffer_unregister_private(&efbdev->efb.base); - drm_framebuffer_cleanup(&efbdev->efb.base); -#if KERNEL_VERSION(5, 9, 0) <= LINUX_VERSION_CODE || defined(EL8) - drm_gem_object_put(&efbdev->efb.obj->base); -#else - drm_gem_object_put_unlocked(&efbdev->efb.obj->base); -#endif - } -} - -int evdi_fbdev_init(struct drm_device *dev) +int evdi_fb_get_bpp(uint32_t format) { - struct evdi_device *evdi; - struct evdi_fbdev *efbdev; - int ret; - - evdi = dev->dev_private; - efbdev = kzalloc(sizeof(struct evdi_fbdev), GFP_KERNEL); - if (!efbdev) - return -ENOMEM; - - evdi->fbdev = efbdev; -#if KERNEL_VERSION(6, 15, 0) <= LINUX_VERSION_CODE || defined(EL9) || defined(EL10) - drm_fb_helper_prepare(dev, &efbdev->helper, 32, NULL); -#elif KERNEL_VERSION(6, 3, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - drm_fb_helper_prepare(dev, &efbdev->helper, 32, &evdi_fb_helper_funcs); -#else - drm_fb_helper_prepare(dev, &efbdev->helper, &evdi_fb_helper_funcs); -#endif - -#if KERNEL_VERSION(5, 7, 0) <= LINUX_VERSION_CODE || defined(EL8) - ret = drm_fb_helper_init(dev, &efbdev->helper); -#else - ret = drm_fb_helper_init(dev, &efbdev->helper, 1); -#endif - if (ret) { - kfree(efbdev); - return ret; - } - -#if KERNEL_VERSION(5, 7, 0) <= LINUX_VERSION_CODE || defined(EL8) -#else - drm_fb_helper_single_add_all_connectors(&efbdev->helper); -#endif - -#if KERNEL_VERSION(6, 3, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - ret = drm_fb_helper_initial_config(&efbdev->helper); -#else - ret = drm_fb_helper_initial_config(&efbdev->helper, 32); -#endif + const struct drm_format_info *info = drm_format_info(format); - if (ret) { - drm_fb_helper_fini(&efbdev->helper); - kfree(efbdev); - } - return ret; + if (!info) + return 0; + return info->cpp[0] * 8; } -void evdi_fbdev_cleanup(struct drm_device *dev) +#if KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE +static bool is_xe_gem(struct dma_buf *dmabuf) { - struct evdi_device *evdi = dev->dev_private; + struct drm_gem_object *obj; - if (!evdi->fbdev) - return; + if (!dmabuf) + return false; + if (dmabuf->ops->vmap != drm_gem_dmabuf_vmap || !dmabuf->owner) + return false; + obj = dmabuf->priv; + if (!obj || !obj->funcs) + return false; - evdi_fbdev_destroy(dev, evdi->fbdev); - kfree(evdi->fbdev); - evdi->fbdev = NULL; + return strncmp("xe", dmabuf->owner->name, min_t(size_t, 2, strlen(dmabuf->owner->name))) == 0; + return false; } - -void evdi_fbdev_unplug(struct drm_device *dev) -{ - struct evdi_device *evdi = dev->dev_private; - struct evdi_fbdev *efbdev; - - if (!evdi->fbdev) - return; - - efbdev = evdi->fbdev; -#if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - if (efbdev->helper.info) { - struct fb_info *info; - - info = efbdev->helper.info; -#else - if (efbdev->helper.fbdev) { - struct fb_info *info; - - info = efbdev->helper.fbdev; -#endif -#if KERNEL_VERSION(5, 6, 0) <= LINUX_VERSION_CODE || defined(EL8) - unregister_framebuffer(info); -#else - unlink_framebuffer(info); #endif - } -} -#endif /* CONFIG_FB */ - -int evdi_fb_get_bpp(uint32_t format) -{ - const struct drm_format_info *info = drm_format_info(format); - - if (!info) - return 0; - return info->cpp[0] * 8; -} struct drm_framebuffer *evdi_fb_user_fb_create( struct drm_device *dev, @@ -652,6 +295,10 @@ mode_cmd, to_evdi_bo(obj)); if (ret) goto err_inval; + +#if KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE + efb->is_from_xe = is_xe_gem(obj->dma_buf); +#endif return &efb->base; err_no_mem: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_gem.c new/evdi-1.14.15/module/evdi_gem.c --- old/evdi-1.14.12/module/evdi_gem.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_gem.c 2026-02-25 08:24:01.000000000 +0100 @@ -15,8 +15,10 @@ #include <linux/dma-buf-map.h> #endif #if KERNEL_VERSION(5, 16, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) +#include <drm/drm_gem_ttm_helper.h> #include <drm/drm_prime.h> #include <drm/drm_file.h> +#include <linux/minmax.h> #elif KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE #else #include <drm/drmP.h> @@ -97,7 +99,7 @@ { struct evdi_gem_object *obj; - obj = kzalloc(sizeof(*obj), GFP_KERNEL); + obj = kzalloc_obj(*obj, GFP_KERNEL); if (obj == NULL) return NULL; @@ -290,6 +292,77 @@ evdi_gem_put_pages(obj); mutex_unlock(&obj->pages_lock); } +# if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) +#if IS_ENABLED(CONFIG_DRM_TTM_HELPER) +static bool is_xe_gem_ttm_object_without_vmap(struct dma_buf *dmabuf) +{ + struct drm_gem_object *obj; + + if (dmabuf->ops->vmap != drm_gem_dmabuf_vmap || !dmabuf->owner) + return false; + obj = dmabuf->priv; + if (!obj || !obj->funcs) + return false; + + if (strncmp("xe", dmabuf->owner->name, min_t(size_t, 2, strlen(dmabuf->owner->name))) != 0) + return false; + + return obj->funcs->vmap == NULL; +} + +static int dma_buf_vmap_xe_gem_unlocked(struct dma_buf *dmabuf, struct iosys_map *map) +{ + int ret; + + iosys_map_clear(map); + + if (WARN_ON(!dmabuf)) + return -EINVAL; + + dma_resv_lock(dmabuf->resv, NULL); + ret = drm_gem_ttm_vmap(dmabuf->priv, map); + dma_resv_unlock(dmabuf->resv); + + return ret; +} + +static void dma_buf_vunmap_xe_gem_unlocked(struct dma_buf *dmabuf, struct iosys_map *map) +{ + if (WARN_ON(!dmabuf)) + return; + + dma_resv_lock(dmabuf->resv, NULL); + drm_gem_ttm_vunmap(dmabuf->priv, map); + dma_resv_unlock(dmabuf->resv); +} + +#endif + +static int evdi_dma_buf_vmap_unlocked(struct dma_buf *dmabuf, struct iosys_map *map) +{ + int ret = -EINVAL; + +#if IS_ENABLED(CONFIG_DRM_TTM_HELPER) + if (is_xe_gem_ttm_object_without_vmap(dmabuf)) + ret = dma_buf_vmap_xe_gem_unlocked(dmabuf, map); +#endif + if (ret) + ret = dma_buf_vmap_unlocked(dmabuf, map); + return ret; +} + +static void evdi_dma_buf_vunmap_unlocked(struct dma_buf *dmabuf, struct iosys_map *map) +{ +#if IS_ENABLED(CONFIG_DRM_TTM_HELPER) + if (is_xe_gem_ttm_object_without_vmap(dmabuf)) + dma_buf_vunmap_xe_gem_unlocked(dmabuf, map); + else + dma_buf_vunmap_unlocked(dmabuf, map); +#else + dma_buf_vunmap_unlocked(dmabuf, map); +#endif +} +#endif int evdi_gem_vmap(struct evdi_gem_object *obj) { @@ -305,7 +378,7 @@ #if KERNEL_VERSION(5, 11, 0) <= LINUX_VERSION_CODE || defined(EL8) # if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - ret = dma_buf_vmap_unlocked(obj->base.import_attach->dmabuf, &map); + ret = evdi_dma_buf_vmap_unlocked(obj->base.import_attach->dmabuf, &map); # else ret = dma_buf_vmap(obj->base.import_attach->dmabuf, &map); # endif @@ -343,7 +416,7 @@ iosys_map_set_vaddr(&map, obj->vmapping); # if KERNEL_VERSION(6, 2, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) - dma_buf_vunmap_unlocked(obj->base.import_attach->dmabuf, &map); + evdi_dma_buf_vunmap_unlocked(obj->base.import_attach->dmabuf, &map); # else dma_buf_vunmap(obj->base.import_attach->dmabuf, &map); # endif @@ -404,9 +477,8 @@ int ret = 0; obj = drm_gem_object_lookup(file, handle); - if (obj == NULL) { + if (obj == NULL) return -ENOENT; - } gobj = to_evdi_bo(obj); ret = evdi_pin_pages(gobj); @@ -431,6 +503,24 @@ return ret; } +#if KERNEL_VERSION(5, 8, 0) <= LINUX_VERSION_CODE +#else +#define for_each_sgtable_page(sgt, piter, pgoffset) \ + for_each_sg_page(sgt->sgl, piter, sgt->orig_nents, pgoffset) +#endif + +static int evdi_get_sg_table_pages_num(struct sg_table *sgt) +{ + struct sg_page_iter page_iter; + int npages = 0; + + for_each_sgtable_page(sgt, &page_iter, 0) { + npages++; + } + + return npages; +} + struct drm_gem_object * evdi_prime_import_sg_table(struct drm_device *dev, struct dma_buf_attachment *attach, @@ -438,6 +528,7 @@ { struct evdi_gem_object *obj; int npages; + int npages_sg; bool called_by_mutter; called_by_mutter = evdi_was_called_by_mutter(); @@ -447,6 +538,8 @@ return ERR_CAST(obj); npages = DIV_ROUND_UP(attach->dmabuf->size, PAGE_SIZE); + npages_sg = evdi_get_sg_table_pages_num(sg); + npages = npages < npages_sg ? npages_sg : npages_sg; DRM_DEBUG_PRIME("Importing %d pages\n", npages); obj->pages = kvmalloc_array(npages, sizeof(struct page *), GFP_KERNEL); if (!obj->pages) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_modeset.c new/evdi-1.14.15/module/evdi_modeset.c --- old/evdi-1.14.12/module/evdi_modeset.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_modeset.c 2026-02-25 08:24:01.000000000 +0100 @@ -432,7 +432,7 @@ int ret; char *plane_type = (type == DRM_PLANE_TYPE_CURSOR) ? "cursor" : "primary"; - plane = kzalloc(sizeof(*plane), GFP_KERNEL); + plane = kzalloc_obj(*plane, GFP_KERNEL); if (plane == NULL) { EVDI_ERROR("Failed to allocate %s plane\n", plane_type); return NULL; @@ -469,7 +469,7 @@ int status = 0; EVDI_CHECKPT(); - crtc = kzalloc(sizeof(struct drm_crtc), GFP_KERNEL); + crtc = kzalloc_obj(*crtc, GFP_KERNEL); if (crtc == NULL) return -ENOMEM; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_painter.c new/evdi-1.14.15/module/evdi_painter.c --- old/evdi-1.14.12/module/evdi_painter.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_painter.c 2026-02-25 08:24:01.000000000 +0100 @@ -14,14 +14,13 @@ #include <drm/drm_file.h> #include <drm/drm_vblank.h> #include <drm/drm_ioctl.h> +#include <drm/drm_gem_framebuffer_helper.h> #elif KERNEL_VERSION(5, 5, 0) <= LINUX_VERSION_CODE #else #include <drm/drmP.h> #endif #include <drm/drm_edid.h> -#if defined(CONFIG_X86) #include <drm/drm_cache.h> -#endif #include "evdi_drm.h" #include "evdi_drm_drv.h" #include "evdi_cursor.h" @@ -31,17 +30,19 @@ #include <linux/compiler.h> #include <linux/platform_device.h> #include <linux/completion.h> - +#include <linux/ktime.h> +#include <linux/debugfs.h> #include <linux/dma-buf.h> #include <linux/vt_kern.h> +#include <linux/vmalloc.h> #if KERNEL_VERSION(5, 4, 0) <= LINUX_VERSION_CODE || defined(EL8) #include <linux/compiler_attributes.h> #endif /* Import of DMA_BUF namespace was reverted in EL8 */ -#if KERNEL_VERSION(6, 13, 0) <= LINUX_VERSION_CODE || defined(EL10) +#if KERNEL_VERSION(6, 13, 0) <= LINUX_VERSION_CODE || defined(EL9) || defined(EL10) MODULE_IMPORT_NS("DMA_BUF"); -#elif KERNEL_VERSION(5, 16, 0) <= LINUX_VERSION_CODE || defined(EL9) +#elif KERNEL_VERSION(5, 16, 0) <= LINUX_VERSION_CODE MODULE_IMPORT_NS(DMA_BUF); #endif @@ -116,6 +117,9 @@ unsigned int ddcci_buffer_length; struct notifier_block vt_notifier; int fg_console; +#if KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE + struct dentry *debugfs_measure_copy; +#endif }; static void expand_rect(struct drm_clip_rect *a, const struct drm_clip_rect *b) @@ -169,6 +173,39 @@ *count = 1; } +#if KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) +static int copy_primary_pixels_on_xe(struct evdi_framebuffer *efb, + char __user *buffer, + int buf_byte_stride, + int const max_x, + int const max_y) +{ + int y; + struct drm_framebuffer *fb = &efb->base; + const int byte_span = max_x * 4; + struct iosys_map dst_mapping = IOSYS_MAP_INIT_VADDR(vmalloc(max_x * 4)); + + for (y = 0; y < max_y; ++y) { + const int src_offset = fb->offsets[0] + fb->pitches[0] * y; + struct iosys_map src_mapping = IOSYS_MAP_INIT_VADDR((char *)efb->obj->vmapping + src_offset); + const int dst_offset = buf_byte_stride * y; + char __user *dst = buffer + dst_offset; + + drm_clflush_virt_range(src_mapping.vaddr, byte_span); + drm_memcpy_from_wc(&dst_mapping, &src_mapping, byte_span); + if (copy_to_user(dst, dst_mapping.vaddr, byte_span)) + return -EFAULT; + + src_mapping.vaddr += fb->pitches[0]; + dst += buf_byte_stride; + } + + vfree(dst_mapping.vaddr); + return 0; + +} +#endif + static int copy_primary_pixels(struct evdi_framebuffer *efb, char __user *buffer, int buf_byte_stride, @@ -181,6 +218,11 @@ EVDI_CHECKPT(); +#if KERNEL_VERSION(5, 18, 0) <= LINUX_VERSION_CODE || defined(EL8) || defined(EL9) + if (efb->is_from_xe) + return copy_primary_pixels_on_xe(efb, buffer, buf_byte_stride, max_x, max_y); +#endif + for (r = rects; r != rects + num_rects; ++r) { const int byte_offset = r->x1 * 4; const int byte_span = (r->x2 - r->x1) * 4; @@ -371,7 +413,7 @@ { struct evdi_event_update_ready_pending *event; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event) { EVDI_ERROR("Failed to create update ready event\n"); return NULL; @@ -419,7 +461,7 @@ struct evdi_event_cursor_set_pending *event; struct evdi_gem_object *eobj = NULL; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event) { EVDI_ERROR("Failed to create cursor set event\n"); return NULL; @@ -466,7 +508,7 @@ { struct evdi_event_cursor_move_pending *event; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event) { EVDI_ERROR("Failed to create cursor move event\n"); return NULL; @@ -498,7 +540,7 @@ { struct evdi_event_dpms_pending *event; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event) { EVDI_ERROR("Failed to create dpms event\n"); return NULL; @@ -526,7 +568,7 @@ { struct evdi_event_mode_changed_pending *event; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event) { EVDI_ERROR("Failed to create mode changed event\n"); return NULL; @@ -813,7 +855,7 @@ struct platform_device *platdev = to_platform_device(ddev->dev); int result = 0; - evdi->i2c_adapter = kzalloc(sizeof(*evdi->i2c_adapter), GFP_KERNEL); + evdi->i2c_adapter = kzalloc_obj(*evdi->i2c_adapter, GFP_KERNEL); if (!evdi->i2c_adapter) { EVDI_ERROR("(card%d) Failed to allocate for i2c adapter\n", @@ -1219,10 +1261,61 @@ EVDI_TEST_HOOK(evdi_testhook_painter_vt_register(&painter->vt_notifier)); } +#if KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE +static int evdi_painter_debugfs_measure_copy_fb(void *data, u64 val) +{ + struct evdi_painter *painter = (struct evdi_painter *)data; + struct drm_framebuffer *fb; + struct evdi_framebuffer *efb; + uint32_t dst_buf_size = 0; + struct iosys_map dst_mapping = IOSYS_MAP_INIT_VADDR(NULL); + ktime_t copy_start_time = 0; + ktime_t copy_end_time = 0; + uint32_t copy_time = 0; + + + fb = drm_framebuffer_lookup(painter->drm_device, painter->drm_filp, val); + + if (!fb) { + EVDI_ERROR("Failed to lookup fb %llu\n", val); + return 0; + } + + efb = to_evdi_fb(fb); + dst_buf_size = fb->obj[0]->size; + dst_mapping.vaddr = vmalloc(dst_buf_size); + + if (evdi_gem_vmap(efb->obj) == -ENOMEM || !efb->obj->vmapping) { + EVDI_ERROR("Failed to map buffer\n"); + goto put_fb; + } + + drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE); + copy_start_time = ktime_get(); + + memcpy(dst_mapping.vaddr, efb->obj->vmapping, dst_buf_size); + + copy_end_time = ktime_get(); + drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE); + + evdi_gem_vunmap(efb->obj); + vfree(dst_mapping.vaddr); + copy_time = ktime_to_ms(copy_end_time - copy_start_time); + + EVDI_DEBUG("debugfs: measure_copy_fb %llu takes %u [ms]\n", val, copy_time); +put_fb: + + drm_framebuffer_put(fb); + return copy_time; +} + +DEFINE_DEBUGFS_ATTRIBUTE(evdi_painter_debug_test_ops, NULL, evdi_painter_debugfs_measure_copy_fb, "%llu\n"); +#endif + int evdi_painter_init(struct evdi_device *dev) { EVDI_CHECKPT(); - dev->painter = kzalloc(sizeof(*dev->painter), GFP_KERNEL); + dev->painter = kzalloc_obj(*dev->painter, GFP_KERNEL); if (dev->painter) { mutex_init(&dev->painter->lock); dev->painter->edid = NULL; @@ -1232,6 +1325,9 @@ dev->painter->vblank = NULL; dev->painter->drm_device = dev->ddev; evdi_painter_register_to_vt(dev->painter); +#if KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE + dev->painter->debugfs_measure_copy = debugfs_create_file("measure_copy_fb", 0400, dev->ddev->debugfs_root, dev->painter, &evdi_painter_debug_test_ops); +#endif INIT_LIST_HEAD(&dev->painter->pending_events); INIT_DELAYED_WORK(&dev->painter->send_events_work, @@ -1251,6 +1347,9 @@ } painter_lock(painter); +#if KERNEL_VERSION(6, 7, 0) <= LINUX_VERSION_CODE + debugfs_lookup_and_remove("measure_copy_fb", painter->drm_device->debugfs_root); +#endif evdi_painter_unregister_from_vt(painter); kfree(painter->edid); painter->edid_length = 0; @@ -1303,7 +1402,7 @@ { struct evdi_event_ddcci_data_pending *event; - event = kzalloc(sizeof(*event), GFP_KERNEL); + event = kzalloc_obj(*event, GFP_KERNEL); if (!event || !msg) { EVDI_ERROR("Failed to create ddcci data event\n"); return NULL; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_platform_dev.c new/evdi-1.14.15/module/evdi_platform_dev.c --- old/evdi-1.14.12/module/evdi_platform_dev.c 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_platform_dev.c 2026-02-25 08:24:01.000000000 +0100 @@ -59,7 +59,7 @@ struct evdi_platform_device_data *data; EVDI_CHECKPT(); - data = kzalloc(sizeof(struct evdi_platform_device_data), GFP_KERNEL); + data = kzalloc_obj(*data, GFP_KERNEL); if (!data) return -ENOMEM; #if KERNEL_VERSION(5, 9, 0) <= LINUX_VERSION_CODE || defined(EL8) @@ -85,7 +85,7 @@ return PTR_ERR_OR_ZERO(dev); } -/* EL9 kernel removed the callback that was returning void */ +/* EL9 kernel removed the callback that was returning void. Do not use for EL9 */ #if KERNEL_VERSION(6, 11, 0) <= LINUX_VERSION_CODE void evdi_platform_device_remove(struct platform_device *pdev) #else @@ -98,6 +98,7 @@ evdi_drm_device_remove(data->drm_dev); kfree(data); +/* Need to return int for EL9 kernels */ #if KERNEL_VERSION(6, 11, 0) <= LINUX_VERSION_CODE #else return 0; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_platform_dev.h new/evdi-1.14.15/module/evdi_platform_dev.h --- old/evdi-1.14.12/module/evdi_platform_dev.h 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_platform_dev.h 2026-02-25 08:24:01.000000000 +0100 @@ -32,7 +32,7 @@ void evdi_platform_dev_destroy(struct platform_device *dev); int evdi_platform_device_probe(struct platform_device *pdev); -/* EL9 kernel removed the callback that was returning void */ +/* EL9 kernel removed the callback that was returning void. Do not use for EL9 */ #if KERNEL_VERSION(6, 11, 0) <= LINUX_VERSION_CODE void evdi_platform_device_remove(struct platform_device *pdev); #else diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/evdi-1.14.12/module/evdi_platform_drv.h new/evdi-1.14.15/module/evdi_platform_drv.h --- old/evdi-1.14.12/module/evdi_platform_drv.h 2025-12-19 13:26:18.000000000 +0100 +++ new/evdi-1.14.15/module/evdi_platform_drv.h 2026-02-25 08:24:01.000000000 +0100 @@ -27,14 +27,14 @@ #define DRIVER_NAME "evdi" #define DRIVER_DESC "Extensible Virtual Display Interface" -#if KERNEL_VERSION(6, 14, 0) <= LINUX_VERSION_CODE +#if KERNEL_VERSION(6, 14, 0) <= LINUX_VERSION_CODE || defined(EL9) || defined(EL10) #else -#define DRIVER_DATE "20251219" +#define DRIVER_DATE "20260225" #endif #define DRIVER_MAJOR 1 #define DRIVER_MINOR 14 -#define DRIVER_PATCH 12 +#define DRIVER_PATCH 15 void evdi_platform_remove_all_devices(struct device *device); unsigned int evdi_platform_device_count(struct device *device);
