drm/omapdrm: Use GEM mmap for fbdev emulation
authorThomas Zimmermann <tzimmermann@suse.de>
Fri, 7 Jul 2023 08:32:00 +0000 (10:32 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 24 Jul 2023 18:14:43 +0000 (20:14 +0200)
The fbdev emulation currently uses fbdev's default mmap code, which
has been written for I/O memory. Provide an mmap that uses GEM's mmap
infrastructure.

Utilize fine-grained fbdev macros to initialize struct fb_ops. The
macros set the read/write and the draw callbacks for DMA memory. Set
the fb_mmap callback to omapdrm's new mmap helper. Also select the
correct Kconfig token for fbdev's DMA helpers. Note that the DMA
helpers are the same as for system memory.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Acked-by: Maxime Ripard <mripard@kernel.org>
Cc: Tomi Valkeinen <tomi.valkeinen@ideasonboard.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230707083422.18691-10-tzimmermann@suse.de
drivers/gpu/drm/omapdrm/Kconfig
drivers/gpu/drm/omapdrm/omap_fbdev.c

index b4ac76c..d3c4877 100644 (file)
@@ -4,7 +4,7 @@ config DRM_OMAP
        depends on DRM && OF
        depends on ARCH_OMAP2PLUS
        select DRM_KMS_HELPER
-       select FB_SYS_HELPERS if DRM_FBDEV_EMULATION
+       select FB_DMA_HELPERS if DRM_FBDEV_EMULATION
        select VIDEOMODE_HELPERS
        select HDMI
        default n
index fe6639c..c6df42f 100644 (file)
@@ -76,6 +76,15 @@ fallback:
        return drm_fb_helper_pan_display(var, fbi);
 }
 
+static int omap_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       struct drm_fb_helper *helper = info->par;
+       struct drm_framebuffer *fb = helper->fb;
+       struct drm_gem_object *bo = drm_gem_fb_get_obj(fb, 0);
+
+       return drm_gem_mmap_obj(bo, omap_gem_mmap_size(bo), vma);
+}
+
 static void omap_fbdev_fb_destroy(struct fb_info *info)
 {
        struct drm_fb_helper *helper = info->par;
@@ -97,14 +106,16 @@ static void omap_fbdev_fb_destroy(struct fb_info *info)
 
 static const struct fb_ops omap_fb_ops = {
        .owner = THIS_MODULE,
-       FB_DEFAULT_SYS_OPS,
+       __FB_DEFAULT_DMA_OPS_RDWR,
        .fb_check_var   = drm_fb_helper_check_var,
        .fb_set_par     = drm_fb_helper_set_par,
        .fb_setcmap     = drm_fb_helper_setcmap,
        .fb_blank       = drm_fb_helper_blank,
        .fb_pan_display = omap_fbdev_pan_display,
+       __FB_DEFAULT_DMA_OPS_DRAW,
        .fb_ioctl       = drm_fb_helper_ioctl,
-       .fb_destroy = omap_fbdev_fb_destroy,
+       .fb_mmap        = omap_fbdev_fb_mmap,
+       .fb_destroy     = omap_fbdev_fb_destroy,
 };
 
 static int omap_fbdev_create(struct drm_fb_helper *helper,