fbdev: Remove default file-I/O implementations
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 27 Nov 2023 13:16:01 +0000 (14:16 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Wed, 29 Nov 2023 11:20:53 +0000 (12:20 +0100)
Drop the default implementations for file read, write and mmap
operations. Each fbdev driver must now provide an implementation
and select any necessary helpers. If no implementation has been
set, fbdev returns an errno code to user space. The code is the
same as if the operation had not been set in the file_operations
struct.

This change makes the fbdev helpers for I/O memory optional. Most
systems only use system-memory framebuffers via DRM's fbdev emulation.

v2:
* warn once if I/O callbacks are missing (Javier)

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231127131655.4020-33-tzimmermann@suse.de
drivers/video/fbdev/core/Kconfig
drivers/video/fbdev/core/fb_chrdev.c
include/linux/fb.h

index faab5d50cac3cf0e721063cbf5448512eae07f07..21053bf00dc58cbe9e67d6780ccf66007e7b0817 100644 (file)
@@ -4,7 +4,6 @@
 #
 
 config FB_CORE
-       select FB_IOMEM_FOPS
        select VIDEO_CMDLINE
        tristate
 
index 089441c9d810f96b74a730878c8d5c3fc48902fa..4ebd16b7e3b8d677928f53866eb794ae3f534868 100644 (file)
@@ -34,13 +34,13 @@ static ssize_t fb_read(struct file *file, char __user *buf, size_t count, loff_t
        if (!info)
                return -ENODEV;
 
+       if (fb_WARN_ON_ONCE(info, !info->fbops->fb_read))
+               return -EINVAL;
+
        if (info->state != FBINFO_STATE_RUNNING)
                return -EPERM;
 
-       if (info->fbops->fb_read)
-               return info->fbops->fb_read(info, buf, count, ppos);
-
-       return fb_io_read(info, buf, count, ppos);
+       return info->fbops->fb_read(info, buf, count, ppos);
 }
 
 static ssize_t fb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
@@ -50,13 +50,13 @@ static ssize_t fb_write(struct file *file, const char __user *buf, size_t count,
        if (!info)
                return -ENODEV;
 
+       if (fb_WARN_ON_ONCE(info, !info->fbops->fb_write))
+               return -EINVAL;
+
        if (info->state != FBINFO_STATE_RUNNING)
                return -EPERM;
 
-       if (info->fbops->fb_write)
-               return info->fbops->fb_write(info, buf, count, ppos);
-
-       return fb_io_write(info, buf, count, ppos);
+       return info->fbops->fb_write(info, buf, count, ppos);
 }
 
 static long do_fb_ioctl(struct fb_info *info, unsigned int cmd,
@@ -319,24 +319,11 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma)
        if (!info)
                return -ENODEV;
 
-       mutex_lock(&info->mm_lock);
-
-       if (info->fbops->fb_mmap) {
-
-               res = info->fbops->fb_mmap(info, vma);
-#if IS_ENABLED(CONFIG_FB_DEFERRED_IO)
-       } else if (info->fbdefio) {
-               /*
-                * FB deferred I/O wants you to handle mmap in your drivers. At a
-                * minimum, point struct fb_ops.fb_mmap to fb_deferred_io_mmap().
-                */
-               dev_warn_once(info->dev, "fbdev mmap not set up for deferred I/O.\n");
-               res = -ENODEV;
-#endif
-       } else {
-               res = fb_io_mmap(info, vma);
-       }
+       if (fb_WARN_ON_ONCE(info, !info->fbops->fb_mmap))
+               return -ENODEV;
 
+       mutex_lock(&info->mm_lock);
+       res = info->fbops->fb_mmap(info, vma);
        mutex_unlock(&info->mm_lock);
 
        return res;
index 24f0ec36623528fc16d4af1eee325b22600ae87b..05dc9624897df9fe01b06ab18bea1ea23b53ecda 100644 (file)
@@ -867,4 +867,9 @@ static inline bool fb_modesetting_disabled(const char *drvname)
 #define fb_warn_once(fb_info, fmt, ...)                                        \
        pr_warn_once("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
 
+#define fb_WARN_ONCE(fb_info, condition, fmt, ...) \
+       WARN_ONCE(condition, "fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
+#define fb_WARN_ON_ONCE(fb_info, x) \
+       fb_WARN_ONCE(fb_info, (x), "%s", "fb_WARN_ON_ONCE(" __stringify(x) ")")
+
 #endif /* _LINUX_FB_H */