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 02/10] fbdev/broadsheetfb: Generate deferred I/O ops Date: Thu, 6 Jul 2023 17:08:45 +0200 [thread overview] Message-ID: <20230706151432.20674-3-tzimmermann@suse.de> (raw) In-Reply-To: <20230706151432.20674-1-tzimmermann@suse.de> Use the existing generator macros to create deferred-I/O helpers for broadsheetfb and set them in the fb_ops structure. Functions for damage handling on memory ranges and areas are provided by the driver. Broadsheedfb's implementation of fb_write writes to system memory, so the generated code can use the respective helper internally. This also fixes a long-standing bug where fb_write returned an errno code instead of the number of written bytes. See the commit message of commit 921b7383f348 ("fbdev: Return number of bytes read or written") for more details. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/video/fbdev/broadsheetfb.c | 78 +++--------------------------- 1 file changed, 8 insertions(+), 70 deletions(-) diff --git a/drivers/video/fbdev/broadsheetfb.c b/drivers/video/fbdev/broadsheetfb.c index 5a5fe4bbc10b..cb725a91b6bb 100644 --- a/drivers/video/fbdev/broadsheetfb.c +++ b/drivers/video/fbdev/broadsheetfb.c @@ -970,90 +970,28 @@ static void broadsheetfb_dpy_deferred_io(struct fb_info *info, struct list_head } } -static void broadsheetfb_fillrect(struct fb_info *info, - const struct fb_fillrect *rect) +static void broadsheetfb_defio_damage_range(struct fb_info *info, off_t off, size_t len) { struct broadsheetfb_par *par = info->par; - sys_fillrect(info, rect); - broadsheetfb_dpy_update(par); } -static void broadsheetfb_copyarea(struct fb_info *info, - const struct fb_copyarea *area) +static void broadsheetfb_defio_damage_area(struct fb_info *info, u32 x, u32 y, + u32 width, u32 height) { struct broadsheetfb_par *par = info->par; - sys_copyarea(info, area); - broadsheetfb_dpy_update(par); } -static void broadsheetfb_imageblit(struct fb_info *info, - const struct fb_image *image) -{ - struct broadsheetfb_par *par = info->par; - - sys_imageblit(info, image); - - broadsheetfb_dpy_update(par); -} - -/* - * this is the slow path from userspace. they can seek and write to - * the fb. it's inefficient to do anything less than a full screen draw - */ -static ssize_t broadsheetfb_write(struct fb_info *info, const char __user *buf, - size_t count, loff_t *ppos) -{ - struct broadsheetfb_par *par = info->par; - unsigned long p = *ppos; - void *dst; - int err = 0; - unsigned long total_size; - - if (!info->screen_buffer) - return -ENODEV; - - total_size = info->fix.smem_len; - - if (p > total_size) - return -EFBIG; - - if (count > total_size) { - err = -EFBIG; - count = total_size; - } - - if (count + p > total_size) { - if (!err) - err = -ENOSPC; - - count = total_size - p; - } - - dst = info->screen_buffer + p; - - if (copy_from_user(dst, buf, count)) - err = -EFAULT; - - if (!err) - *ppos += count; - - broadsheetfb_dpy_update(par); - - return (err) ? err : count; -} +FB_GEN_DEFAULT_DEFERRED_SYS_OPS(broadsheetfb, + broadsheetfb_defio_damage_range, + broadsheetfb_defio_damage_area) static const struct fb_ops broadsheetfb_ops = { - .owner = THIS_MODULE, - .fb_read = fb_sys_read, - .fb_write = broadsheetfb_write, - .fb_fillrect = broadsheetfb_fillrect, - .fb_copyarea = broadsheetfb_copyarea, - .fb_imageblit = broadsheetfb_imageblit, - .fb_mmap = fb_deferred_io_mmap, + .owner = THIS_MODULE, + FB_DEFAULT_DEFERRED_OPS(broadsheetfb), }; static struct fb_deferred_io broadsheetfb_defio = { -- 2.41.0
WARNING: multiple messages have this Message-ID (diff)
From: Thomas Zimmermann <tzimmermann@suse.de> To: javierm@redhat.com, deller@gmx.de Cc: linux-fbdev@vger.kernel.org, Thomas Zimmermann <tzimmermann@suse.de>, dri-devel@lists.freedesktop.org Subject: [PATCH 02/10] fbdev/broadsheetfb: Generate deferred I/O ops Date: Thu, 6 Jul 2023 17:08:45 +0200 [thread overview] Message-ID: <20230706151432.20674-3-tzimmermann@suse.de> (raw) In-Reply-To: <20230706151432.20674-1-tzimmermann@suse.de> Use the existing generator macros to create deferred-I/O helpers for broadsheetfb and set them in the fb_ops structure. Functions for damage handling on memory ranges and areas are provided by the driver. Broadsheedfb's implementation of fb_write writes to system memory, so the generated code can use the respective helper internally. This also fixes a long-standing bug where fb_write returned an errno code instead of the number of written bytes. See the commit message of commit 921b7383f348 ("fbdev: Return number of bytes read or written") for more details. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/video/fbdev/broadsheetfb.c | 78 +++--------------------------- 1 file changed, 8 insertions(+), 70 deletions(-) diff --git a/drivers/video/fbdev/broadsheetfb.c b/drivers/video/fbdev/broadsheetfb.c index 5a5fe4bbc10b..cb725a91b6bb 100644 --- a/drivers/video/fbdev/broadsheetfb.c +++ b/drivers/video/fbdev/broadsheetfb.c @@ -970,90 +970,28 @@ static void broadsheetfb_dpy_deferred_io(struct fb_info *info, struct list_head } } -static void broadsheetfb_fillrect(struct fb_info *info, - const struct fb_fillrect *rect) +static void broadsheetfb_defio_damage_range(struct fb_info *info, off_t off, size_t len) { struct broadsheetfb_par *par = info->par; - sys_fillrect(info, rect); - broadsheetfb_dpy_update(par); } -static void broadsheetfb_copyarea(struct fb_info *info, - const struct fb_copyarea *area) +static void broadsheetfb_defio_damage_area(struct fb_info *info, u32 x, u32 y, + u32 width, u32 height) { struct broadsheetfb_par *par = info->par; - sys_copyarea(info, area); - broadsheetfb_dpy_update(par); } -static void broadsheetfb_imageblit(struct fb_info *info, - const struct fb_image *image) -{ - struct broadsheetfb_par *par = info->par; - - sys_imageblit(info, image); - - broadsheetfb_dpy_update(par); -} - -/* - * this is the slow path from userspace. they can seek and write to - * the fb. it's inefficient to do anything less than a full screen draw - */ -static ssize_t broadsheetfb_write(struct fb_info *info, const char __user *buf, - size_t count, loff_t *ppos) -{ - struct broadsheetfb_par *par = info->par; - unsigned long p = *ppos; - void *dst; - int err = 0; - unsigned long total_size; - - if (!info->screen_buffer) - return -ENODEV; - - total_size = info->fix.smem_len; - - if (p > total_size) - return -EFBIG; - - if (count > total_size) { - err = -EFBIG; - count = total_size; - } - - if (count + p > total_size) { - if (!err) - err = -ENOSPC; - - count = total_size - p; - } - - dst = info->screen_buffer + p; - - if (copy_from_user(dst, buf, count)) - err = -EFAULT; - - if (!err) - *ppos += count; - - broadsheetfb_dpy_update(par); - - return (err) ? err : count; -} +FB_GEN_DEFAULT_DEFERRED_SYS_OPS(broadsheetfb, + broadsheetfb_defio_damage_range, + broadsheetfb_defio_damage_area) static const struct fb_ops broadsheetfb_ops = { - .owner = THIS_MODULE, - .fb_read = fb_sys_read, - .fb_write = broadsheetfb_write, - .fb_fillrect = broadsheetfb_fillrect, - .fb_copyarea = broadsheetfb_copyarea, - .fb_imageblit = broadsheetfb_imageblit, - .fb_mmap = fb_deferred_io_mmap, + .owner = THIS_MODULE, + FB_DEFAULT_DEFERRED_OPS(broadsheetfb), }; static struct fb_deferred_io broadsheetfb_defio = { -- 2.41.0
next prev parent reply other threads:[~2023-07-06 15:14 UTC|newest] Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-07-06 15:08 [PATCH 00/10] fbdev: Generate deferred-I/O helpers Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 01/10] fbdev/broadsheetfb: Select FB_SYS_HELPERS_DEFERRED Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 19:13 ` Helge Deller 2023-07-07 7:38 ` Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann [this message] 2023-07-06 15:08 ` [PATCH 02/10] fbdev/broadsheetfb: Generate deferred I/O ops Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 03/10] fbdev/hecubafb: Select FB_SYS_HELPERS_DEFERRED Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 04/10] fbdev/hecubafb: Generate deferred I/O ops Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 05/10] fbdev/metronomefb: Select FB_SYS_HELPERS_DEFERRED Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 06/10] fbdev/metronomefb: Generate deferred I/O ops Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 07/10] fbdev/ssd1307fb: Select FB_SYS_HELPERS_DEFERRED Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 08/10] fbdev/ssd1307fb: Generate deferred I/O ops Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 17:41 ` Sam Ravnborg 2023-07-06 17:41 ` Sam Ravnborg 2023-07-06 15:08 ` [PATCH 09/10] fbdev/xen-fbfront: Select FB_SYS_HELPERS_DEFERRED Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 15:08 ` [PATCH 10/10] fbdev/xen-fbfront: Generate deferred I/O ops Thomas Zimmermann 2023-07-06 15:08 ` Thomas Zimmermann 2023-07-06 17:43 ` [PATCH 00/10] fbdev: Generate deferred-I/O helpers Sam Ravnborg 2023-07-06 17:43 ` Sam Ravnborg
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=20230706151432.20674-3-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: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.