git: c90c46ea239f - main - linux: add dma-buf and sync_file ioctl handlers

Nick Price <[email protected]>
Newsgroups gmane.os.freebsd.devel.cvs.src,gmane.os.freebsd.current.scm
Message-ID <[email protected]>
The branch main has been updated by nprice:

URL: https://cgit.FreeBSD.org/src/commit/?id=c90c46ea239f2514f1af82c1fa9dc0b4f20361e7

commit c90c46ea239f2514f1af82c1fa9dc0b4f20361e7
Author:     Nick Price <[email protected]>
AuthorDate: 2026-08-09 23:43:12 +0000
Commit:     Nick Price <[email protected]>
CommitDate: 2026-08-19 00:02:26 +0000

    linux: add dma-buf and sync_file ioctl handlers
    
    drm-kmod already implements the dma-buf and sync_file ioctls, but
    linux_ioctl.c had no handler group for the 'b' and '>' magic bytes, so
    the requests never reached it and returned EINVAL from
    linux_ioctl_fallback().  Route the commands drm-kmod services to
    sys_ioctl(), translating the direction bits with SETDIR(); everything
    else still falls through to the fallback and keeps getting named in
    dmesg.
    
    Approved-by: adrian
    Accepted-by: dumbbell
    Signed-off-by: Nick Price <[email protected]>
    (cherry picked from commit d6a7e89504af337413af39fd121026f512c0a35d)
---
 sys/compat/linux/linux_ioctl.c | 38 ++++++++++++++++++++++++++++++++++++++
 sys/compat/linux/linux_ioctl.h | 20 ++++++++++++++++++++
 2 files changed, 58 insertions(+)

diff --git a/sys/compat/linux/linux_ioctl.c b/sys/compat/linux/linux_ioctl.c
index b68e950a2dcf..dd261aeca56d 100644
--- a/sys/compat/linux/linux_ioctl.c
+++ b/sys/compat/linux/linux_ioctl.c
@@ -108,6 +108,8 @@ DEFINE_LINUX_IOCTL_SET(sound, SOUND);
 DEFINE_LINUX_IOCTL_SET(termio, TERMIO);
 DEFINE_LINUX_IOCTL_SET(private, PRIVATE);
 DEFINE_LINUX_IOCTL_SET(drm, DRM);
+DEFINE_LINUX_IOCTL_SET(dmabuf, DMABUF);
+DEFINE_LINUX_IOCTL_SET(syncfile, SYNCFILE);
 DEFINE_LINUX_IOCTL_SET(sg, SG);
 DEFINE_LINUX_IOCTL_SET(v4l, VIDEO);
 DEFINE_LINUX_IOCTL_SET(v4l2, VIDEO2);
@@ -2579,6 +2581,42 @@ linux_ioctl_drm(struct thread *td, struct linux_ioctl_args *args)
 	return (sys_ioctl(td, (struct ioctl_args *)args));
 }
 
+/*
+ * dma-buf ioctl handler (drm-kmod)
+ */
+static int
+linux_ioctl_dmabuf(struct thread *td, struct linux_ioctl_args *args)
+{
+
+	switch (args->cmd & 0xffff) {
+	case LINUX_DMA_BUF_IOCTL_SYNC:
+	case LINUX_DMA_BUF_IOCTL_EXPORT_SYNC_FILE:
+	case LINUX_DMA_BUF_IOCTL_IMPORT_SYNC_FILE:
+		args->cmd = SETDIR(args->cmd);
+		return (sys_ioctl(td, (struct ioctl_args *)args));
+	}
+
+	return (ENOIOCTL);
+}
+
+/*
+ * sync_file ioctl handler (drm-kmod)
+ */
+static int
+linux_ioctl_syncfile(struct thread *td, struct linux_ioctl_args *args)
+{
+
+	switch (args->cmd & 0xffff) {
+	case LINUX_SYNC_IOC_MERGE:
+	case LINUX_SYNC_IOC_FILE_INFO:
+	case LINUX_SYNC_IOC_SET_DEADLINE:
+		args->cmd = SETDIR(args->cmd);
+		return (sys_ioctl(td, (struct ioctl_args *)args));
+	}
+
+	return (ENOIOCTL);
+}
+
 #ifdef COMPAT_LINUX32
 static int
 linux_ioctl_sg_io(struct thread *td, struct linux_ioctl_args *args)
diff --git a/sys/compat/linux/linux_ioctl.h b/sys/compat/linux/linux_ioctl.h
index 769f56b7de51..5585f7e866fe 100644
--- a/sys/compat/linux/linux_ioctl.h
+++ b/sys/compat/linux/linux_ioctl.h
@@ -622,6 +622,26 @@
 #define	LINUX_IOCTL_DRM_MIN	0x6400
 #define	LINUX_IOCTL_DRM_MAX	0x64ff
 
+/*
+ * dma-buf
+ */
+#define	LINUX_DMA_BUF_IOCTL_SYNC		0x6200
+#define	LINUX_DMA_BUF_IOCTL_EXPORT_SYNC_FILE	0x6202
+#define	LINUX_DMA_BUF_IOCTL_IMPORT_SYNC_FILE	0x6203
+
+#define	LINUX_IOCTL_DMABUF_MIN	0x6200
+#define	LINUX_IOCTL_DMABUF_MAX	0x62ff
+
+/*
+ * sync_file
+ */
+#define	LINUX_SYNC_IOC_MERGE		0x3e03
+#define	LINUX_SYNC_IOC_FILE_INFO	0x3e04
+#define	LINUX_SYNC_IOC_SET_DEADLINE	0x3e05
+
+#define	LINUX_IOCTL_SYNCFILE_MIN	0x3e00
+#define	LINUX_IOCTL_SYNCFILE_MAX	0x3eff
+
 /*
  * video
  */
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.