Commit 8813e86f authored by Thomas Zimmermann's avatar Thomas Zimmermann
Browse files

fbdev: Remove default file-I/O implementations



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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231127131655.4020-33-tzimmermann@suse.de
parent b3e88137
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@
#

config FB_CORE
	select FB_IOMEM_FOPS
	select VIDEO_CMDLINE
	tristate

+12 −25
Original line number Diff line number Diff line
@@ -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);
}

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

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) {
	if (fb_WARN_ON_ONCE(info, !info->fbops->fb_mmap))
		return -ENODEV;

	mutex_lock(&info->mm_lock);
	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);
	}

	mutex_unlock(&info->mm_lock);

	return res;
+5 −0
Original line number Diff line number Diff line
@@ -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 */