linux-fbdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Thomas Zimmermann <tzimmermann@suse.de>
To: javierm@redhat.com, deller@gmx.de
Cc: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org,
	Thomas Zimmermann <tzimmermann@suse.de>
Subject: [PATCH v2 30/32] fbdev: Move default fb_mmap code into helper function
Date: Mon, 27 Nov 2023 14:15:59 +0100	[thread overview]
Message-ID: <20231127131655.4020-31-tzimmermann@suse.de> (raw)
In-Reply-To: <20231127131655.4020-1-tzimmermann@suse.de>

Move the default fb_mmap code for I/O address spaces into the helper
function fb_io_mmap(). The helper can either be called via struct
fb_ops.fb_mmap or as the default if no fb_mmap has been set. Also
set the new helper in __FB_DEFAULT_IOMEM_OPS_MMAP.

In the mid-term, fb_io_mmap() is supposed to become optional. Fbdev
drivers will initialize their struct fb_ops.fb_mmap to the helper
and select a corresponding Kconfig token. The helper can then be made
optional at compile time.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
---
 drivers/video/fbdev/core/fb_chrdev.c  | 36 +++++----------------------
 drivers/video/fbdev/core/fb_io_fops.c | 27 ++++++++++++++++++++
 include/linux/fb.h                    |  3 ++-
 3 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/drivers/video/fbdev/core/fb_chrdev.c b/drivers/video/fbdev/core/fb_chrdev.c
index b73a122950a94..089441c9d810f 100644
--- a/drivers/video/fbdev/core/fb_chrdev.c
+++ b/drivers/video/fbdev/core/fb_chrdev.c
@@ -314,20 +314,16 @@ static long fb_compat_ioctl(struct file *file, unsigned int cmd,
 static int fb_mmap(struct file *file, struct vm_area_struct *vma)
 {
 	struct fb_info *info = file_fb_info(file);
-	unsigned long mmio_pgoff;
-	unsigned long start;
-	u32 len;
+	int res;
 
 	if (!info)
 		return -ENODEV;
+
 	mutex_lock(&info->mm_lock);
 
 	if (info->fbops->fb_mmap) {
-		int res;
 
 		res = info->fbops->fb_mmap(info, vma);
-		mutex_unlock(&info->mm_lock);
-		return res;
 #if IS_ENABLED(CONFIG_FB_DEFERRED_IO)
 	} else if (info->fbdefio) {
 		/*
@@ -335,35 +331,15 @@ static int fb_mmap(struct file *file, struct vm_area_struct *vma)
 		 * 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");
-		mutex_unlock(&info->mm_lock);
-		return -ENODEV;
+		res = -ENODEV;
 #endif
+	} else {
+		res = fb_io_mmap(info, vma);
 	}
 
-	/*
-	 * Ugh. This can be either the frame buffer mapping, or
-	 * if pgoff points past it, the mmio mapping.
-	 */
-	start = info->fix.smem_start;
-	len = info->fix.smem_len;
-	mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
-	if (vma->vm_pgoff >= mmio_pgoff) {
-		if (info->var.accel_flags) {
-			mutex_unlock(&info->mm_lock);
-			return -EINVAL;
-		}
-
-		vma->vm_pgoff -= mmio_pgoff;
-		start = info->fix.mmio_start;
-		len = info->fix.mmio_len;
-	}
 	mutex_unlock(&info->mm_lock);
 
-	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
-	vma->vm_page_prot = pgprot_framebuffer(vma->vm_page_prot, vma->vm_start,
-					       vma->vm_end, start);
-
-	return vm_iomap_memory(vma, start, len);
+	return res;
 }
 
 static int fb_open(struct inode *inode, struct file *file)
diff --git a/drivers/video/fbdev/core/fb_io_fops.c b/drivers/video/fbdev/core/fb_io_fops.c
index 871b829521af3..60805e43914e5 100644
--- a/drivers/video/fbdev/core/fb_io_fops.c
+++ b/drivers/video/fbdev/core/fb_io_fops.c
@@ -132,5 +132,32 @@ ssize_t fb_io_write(struct fb_info *info, const char __user *buf, size_t count,
 }
 EXPORT_SYMBOL(fb_io_write);
 
+int fb_io_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+	unsigned long start = info->fix.smem_start;
+	u32 len = info->fix.smem_len;
+	unsigned long mmio_pgoff = PAGE_ALIGN((start & ~PAGE_MASK) + len) >> PAGE_SHIFT;
+
+	/*
+	 * This can be either the framebuffer mapping, or if pgoff points
+	 * past it, the mmio mapping.
+	 */
+	if (vma->vm_pgoff >= mmio_pgoff) {
+		if (info->var.accel_flags)
+			return -EINVAL;
+
+		vma->vm_pgoff -= mmio_pgoff;
+		start = info->fix.mmio_start;
+		len = info->fix.mmio_len;
+	}
+
+	vma->vm_page_prot = vm_get_page_prot(vma->vm_flags);
+	vma->vm_page_prot = pgprot_framebuffer(vma->vm_page_prot, vma->vm_start,
+					       vma->vm_end, start);
+
+	return vm_iomap_memory(vma, start, len);
+}
+EXPORT_SYMBOL(fb_io_mmap);
+
 MODULE_DESCRIPTION("Fbdev helpers for framebuffers in I/O memory");
 MODULE_LICENSE("GPL");
diff --git a/include/linux/fb.h b/include/linux/fb.h
index 94e2c44c65699..a36d05b576b0c 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -536,6 +536,7 @@ extern ssize_t fb_io_read(struct fb_info *info, char __user *buf,
 			  size_t count, loff_t *ppos);
 extern ssize_t fb_io_write(struct fb_info *info, const char __user *buf,
 			   size_t count, loff_t *ppos);
+int fb_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
 
 #define __FB_DEFAULT_IOMEM_OPS_RDWR \
 	.fb_read	= fb_io_read, \
@@ -547,7 +548,7 @@ extern ssize_t fb_io_write(struct fb_info *info, const char __user *buf,
 	.fb_imageblit	= cfb_imageblit
 
 #define __FB_DEFAULT_IOMEM_OPS_MMAP \
-	.fb_mmap	= NULL /* default implementation */
+	.fb_mmap	= fb_io_mmap
 
 #define FB_DEFAULT_IOMEM_OPS \
 	__FB_DEFAULT_IOMEM_OPS_RDWR, \
-- 
2.43.0


  parent reply	other threads:[~2023-11-27 13:17 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-27 13:15 [PATCH v2 00/32] fbdev: Modularize helpers for struct fb_ops Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 01/32] fbdev/acornfb: Fix name of fb_ops initializer macro Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 02/32] fbdev/sm712fb: Use correct initializer macros for struct fb_ops Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 03/32] fbdev/vfb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 04/32] fbdev/vfb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 05/32] fbdev/arcfb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 06/32] fbdev/arcfb: Use generator macros for deferred I/O Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 07/32] auxdisplay/cfag12864bfb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 08/32] auxdisplay/cfag12864bfb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 09/32] auxdisplay/ht16k33: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 10/32] auxdisplay/ht16k33: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 11/32] hid/picolcd_fb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 12/32] fbdev/sh_mobile_lcdcfb: " Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 13/32] fbdev/sh_mobile_lcdcfb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 14/32] fbdev/smscufx: Select correct helpers Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 15/32] fbdev/udlfb: " Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 16/32] fbdev/au1200fb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 17/32] fbdev/au1200fb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 18/32] fbdev/ps3fb: Set FBINFO_VIRTFB flag Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 19/32] fbdev/ps3fb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 20/32] media/ivtvfb: Initialize fb_ops to fbdev I/O-memory helpers Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 21/32] fbdev/clps711x-fb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 22/32] fbdev/vt8500lcdfb: " Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 23/32] fbdev/wm8505fb: Initialize fb_ops to fbdev I/O-memory helpers Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 24/32] fbdev/cyber2000fb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 25/32] staging/sm750fb: Declare fb_ops as constant Thomas Zimmermann
2023-11-27 13:29   ` Greg Kroah-Hartman
2023-11-27 13:15 ` [PATCH v2 26/32] staging/sm750fb: Initialize fb_ops with fbdev macros Thomas Zimmermann
2023-11-27 13:30   ` Greg Kroah-Hartman
2023-11-27 13:15 ` [PATCH v2 27/32] fbdev: Rename FB_SYS_FOPS token to FB_SYSMEM_FOPS Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 28/32] fbdev: Remove trailing whitespaces Thomas Zimmermann
2023-11-27 13:15 ` [PATCH v2 29/32] fbdev: Push pgprot_decrypted() into mmap implementations Thomas Zimmermann
2023-11-27 13:15 ` Thomas Zimmermann [this message]
2023-11-27 13:16 ` [PATCH v2 31/32] fbdev: Warn on incorrect framebuffer access Thomas Zimmermann
2023-11-27 13:16 ` [PATCH v2 32/32] fbdev: Remove default file-I/O implementations Thomas Zimmermann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231127131655.4020-31-tzimmermann@suse.de \
    --to=tzimmermann@suse.de \
    --cc=deller@gmx.de \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=javierm@redhat.com \
    --cc=linux-fbdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).