From: Thomas Zimmermann <tzimmermann@suse.de>
To: daniel@ffwll.ch, airlied@gmail.com, deller@gmx.de, javierm@redhat.com
Cc: linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org,
Thomas Zimmermann <tzimmermann@suse.de>
Subject: [PATCH 21/43] drm/fbdev-dma: Implement damage handling and deferred I/O
Date: Tue, 12 Mar 2024 16:45:16 +0100 [thread overview]
Message-ID: <20240312154834.26178-22-tzimmermann@suse.de> (raw)
In-Reply-To: <20240312154834.26178-1-tzimmermann@suse.de>
Add support for damage handling and deferred I/O to fbdev-dma. This
enables fbdev-dma to support all DMA-memory-based DRM drivers, even
such with a dirty callback in their framebuffers.
The patch adds the code for deferred I/O and also sets a dedicated
helper for struct fb_ops.fb_mmap that support coherent mappings.
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
---
drivers/gpu/drm/drm_fbdev_dma.c | 65 ++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 14 deletions(-)
diff --git a/drivers/gpu/drm/drm_fbdev_dma.c b/drivers/gpu/drm/drm_fbdev_dma.c
index 6c9427bb4053b..8ffd072368bca 100644
--- a/drivers/gpu/drm/drm_fbdev_dma.c
+++ b/drivers/gpu/drm/drm_fbdev_dma.c
@@ -4,6 +4,7 @@
#include <drm/drm_crtc_helper.h>
#include <drm/drm_drv.h>
+#include <drm/drm_fb_dma_helper.h>
#include <drm/drm_fb_helper.h>
#include <drm/drm_framebuffer.h>
#include <drm/drm_gem_dma_helper.h>
@@ -35,6 +36,22 @@ static int drm_fbdev_dma_fb_release(struct fb_info *info, int user)
return 0;
}
+FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_dma,
+ drm_fb_helper_damage_range,
+ drm_fb_helper_damage_area);
+
+static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+ struct drm_fb_helper *fb_helper = info->par;
+ struct drm_framebuffer *fb = fb_helper->fb;
+ struct drm_gem_dma_object *dma = drm_fb_dma_get_gem_obj(fb, 0);
+
+ if (!dma->map_noncoherent)
+ vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot);
+
+ return fb_deferred_io_mmap(info, vma);
+}
+
static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
{
struct drm_fb_helper *fb_helper = info->par;
@@ -51,20 +68,13 @@ static void drm_fbdev_dma_fb_destroy(struct fb_info *info)
kfree(fb_helper);
}
-static int drm_fbdev_dma_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
-{
- struct drm_fb_helper *fb_helper = info->par;
-
- return drm_gem_prime_mmap(fb_helper->buffer->gem, vma);
-}
-
static const struct fb_ops drm_fbdev_dma_fb_ops = {
.owner = THIS_MODULE,
.fb_open = drm_fbdev_dma_fb_open,
.fb_release = drm_fbdev_dma_fb_release,
- __FB_DEFAULT_DMAMEM_OPS_RDWR,
+ __FB_DEFAULT_DEFERRED_OPS_RDWR(drm_fbdev_dma),
DRM_FB_HELPER_DEFAULT_OPS,
- __FB_DEFAULT_DMAMEM_OPS_DRAW,
+ __FB_DEFAULT_DEFERRED_OPS_DRAW(drm_fbdev_dma),
.fb_mmap = drm_fbdev_dma_fb_mmap,
.fb_destroy = drm_fbdev_dma_fb_destroy,
};
@@ -98,10 +108,6 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
dma_obj = to_drm_gem_dma_obj(buffer->gem);
fb = buffer->fb;
- if (drm_WARN_ON(dev, fb->funcs->dirty)) {
- ret = -ENODEV; /* damage handling not supported; use generic emulation */
- goto err_drm_client_buffer_delete;
- }
ret = drm_client_buffer_vmap(buffer, &map);
if (ret) {
@@ -112,7 +118,7 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
}
fb_helper->buffer = buffer;
- fb_helper->fb = buffer->fb;
+ fb_helper->fb = fb;
info = drm_fb_helper_alloc_info(fb_helper);
if (IS_ERR(info)) {
@@ -133,8 +139,19 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
info->fix.smem_start = page_to_phys(virt_to_page(info->screen_buffer));
info->fix.smem_len = info->screen_size;
+ /* deferred I/O */
+ fb_helper->fbdefio.delay = HZ / 20;
+ fb_helper->fbdefio.deferred_io = drm_fb_helper_deferred_io;
+
+ info->fbdefio = &fb_helper->fbdefio;
+ ret = fb_deferred_io_init(info);
+ if (ret)
+ goto err_drm_fb_helper_release_info;
+
return 0;
+err_drm_fb_helper_release_info:
+ drm_fb_helper_release_info(fb_helper);
err_drm_client_buffer_vunmap:
fb_helper->fb = NULL;
fb_helper->buffer = NULL;
@@ -144,8 +161,28 @@ static int drm_fbdev_dma_helper_fb_probe(struct drm_fb_helper *fb_helper,
return ret;
}
+static int drm_fbdev_dma_helper_fb_dirty(struct drm_fb_helper *helper,
+ struct drm_clip_rect *clip)
+{
+ struct drm_device *dev = helper->dev;
+ int ret;
+
+ /* Call damage handlers only if necessary */
+ if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+ return 0;
+
+ if (helper->fb->funcs->dirty) {
+ ret = helper->fb->funcs->dirty(helper->fb, NULL, 0, 0, clip, 1);
+ if (drm_WARN_ONCE(dev, ret, "Dirty helper failed: ret=%d\n", ret))
+ return ret;
+ }
+
+ return 0;
+}
+
static const struct drm_fb_helper_funcs drm_fbdev_dma_helper_funcs = {
.fb_probe = drm_fbdev_dma_helper_fb_probe,
+ .fb_dirty = drm_fbdev_dma_helper_fb_dirty,
};
/*
--
2.44.0
next prev parent reply other threads:[~2024-03-12 15:48 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-12 15:44 [PATCH 00/43] drm: Provide fbdev emulation per memory manager Thomas Zimmermann
2024-03-12 15:44 ` [PATCH 01/43] drm/fbdev-generic: Do not set physical framebuffer address Thomas Zimmermann
2024-03-17 12:43 ` Javier Martinez Canillas
2024-03-18 8:19 ` Thomas Zimmermann
2024-03-18 2:35 ` Zack Rusin
2024-03-18 7:59 ` Thomas Zimmermann
2024-03-18 8:44 ` Maxime Ripard
2024-03-18 9:48 ` Javier Martinez Canillas
2024-03-18 22:22 ` [01/43] " Sui Jingfeng
2024-03-12 15:44 ` [PATCH 02/43] fbdev/deferred-io: Move pageref setup into separate helper Thomas Zimmermann
2024-03-17 12:49 ` Javier Martinez Canillas
2024-03-12 15:44 ` [PATCH 03/43] fbdev/deferred-io: Clean up pageref on lastclose Thomas Zimmermann
2024-03-17 13:19 ` Javier Martinez Canillas
2024-03-12 15:44 ` [PATCH 04/43] fbdev/deferred-io: Test screen_buffer for vmalloc'ed memory Thomas Zimmermann
2024-03-17 13:20 ` Javier Martinez Canillas
2024-03-12 15:45 ` [PATCH 05/43] fbdev/deferred-io: Test smem_start for I/O memory Thomas Zimmermann
2024-03-18 17:03 ` Javier Martinez Canillas
2024-03-12 15:45 ` [PATCH 06/43] fbdev/deferred-io: Always call get_page() for framebuffer pages Thomas Zimmermann
2024-03-18 17:04 ` Javier Martinez Canillas
2024-03-12 15:45 ` [PATCH 07/43] fbdev/deferred-io: Provide get_page hook in struct fb_deferred_io Thomas Zimmermann
2024-03-18 17:11 ` Javier Martinez Canillas
2024-03-12 15:45 ` [PATCH 08/43] drm/fbdev: Add fbdev-shmem Thomas Zimmermann
2024-03-12 16:14 ` Geert Uytterhoeven
2024-03-13 8:19 ` Thomas Zimmermann
2024-03-13 9:03 ` Geert Uytterhoeven
2024-03-13 9:24 ` Thomas Zimmermann
2024-03-13 9:56 ` Geert Uytterhoeven
2024-03-12 15:45 ` [PATCH 09/43] drm/ast: Use fbdev-shmem Thomas Zimmermann
2024-03-13 14:03 ` Jocelyn Falempe
2024-03-12 15:45 ` [PATCH 10/43] drm/gud: " Thomas Zimmermann
2024-03-17 19:21 ` Noralf Trønnes
2024-03-12 15:45 ` [PATCH 11/43] drm/hyperv: " Thomas Zimmermann
2024-03-12 16:08 ` Deepak Rawat
2024-03-12 15:45 ` [PATCH 12/43] drm/mgag200: " Thomas Zimmermann
2024-03-13 14:03 ` Jocelyn Falempe
2024-03-18 7:56 ` Thomas Zimmermann
2024-03-18 9:23 ` Jocelyn Falempe
2024-03-12 15:45 ` [PATCH 13/43] drm/solomon: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 14/43] drm/tiny/cirrus: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 15/43] drm/tiny/gm12u320: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 16/43] drm/tiny/ofdrm: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 17/43] drm/tiny/simpledrm: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 18/43] drm/udl: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 19/43] drm/virtio: " Thomas Zimmermann
2024-03-28 14:55 ` Dmitry Osipenko
2024-03-12 15:45 ` [PATCH 20/43] drm/vkms: " Thomas Zimmermann
2024-03-12 15:45 ` Thomas Zimmermann [this message]
2024-03-12 15:45 ` [PATCH 22/43] drm/arm/komeda: Use fbdev-dma Thomas Zimmermann
2024-03-13 10:53 ` Liviu Dudau
2024-03-12 15:45 ` [PATCH 23/43] drm/hisilicon/kirin: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 24/43] drm/imx/lcdc: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 25/43] drm/ingenic: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 26/43] drm/mediatek: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 27/43] drm/panel/panel-ilitek-9341: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 28/43] drm/renesas/rcar-du: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 29/43] drm/renesas/rz-du: " Thomas Zimmermann
2024-03-12 19:14 ` Biju Das
2024-03-13 8:30 ` Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 30/43] drm/renesas/shmobile: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 31/43] drm/rockchip: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 32/43] drm/tiny/hx8357d: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 33/43] drm/tiny/ili9163: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 34/43] drm/tiny/ili9225: " Thomas Zimmermann
2024-03-12 22:20 ` David Lechner
2024-03-12 15:45 ` [PATCH 35/43] drm/tiny/ili9341: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 36/43] drm/tiny/ili9486: " Thomas Zimmermann
2024-03-12 15:45 ` [PATCH 37/43] drm/tiny/mi0283qt: " Thomas Zimmermann
2024-03-17 19:21 ` Noralf Trønnes
2024-03-12 15:45 ` [PATCH 38/43] drm/tiny/panel-mipi-dbi: " Thomas Zimmermann
2024-03-17 19:22 ` Noralf Trønnes
2024-03-12 15:45 ` [PATCH 39/43] drm/tiny/repaper: " Thomas Zimmermann
2024-03-17 19:22 ` Noralf Trønnes
2024-03-12 15:45 ` [PATCH 40/43] drm/tiny/st7586: " Thomas Zimmermann
2024-03-12 22:21 ` David Lechner
2024-03-12 15:45 ` [PATCH 41/43] drm/tiny/st7735r: " Thomas Zimmermann
2024-03-12 22:21 ` David Lechner
2024-03-12 15:45 ` [PATCH 42/43] drm/fbdev-generic: Convert to fbdev-ttm Thomas Zimmermann
2024-10-22 13:31 ` Jon Hunter
2024-10-22 14:55 ` Thomas Zimmermann
2024-10-22 15:36 ` Jon Hunter
2024-10-23 6:43 ` Thomas Zimmermann
2024-10-23 8:44 ` Jon Hunter
2024-10-23 8:49 ` Jon Hunter
2024-03-12 15:45 ` [PATCH 43/43] drm/fbdev: Clean up fbdev documentation 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=20240312154834.26178-22-tzimmermann@suse.de \
--to=tzimmermann@suse.de \
--cc=airlied@gmail.com \
--cc=daniel@ffwll.ch \
--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).