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);

Reply via email to