drm/fb-helper: Move generic fbdev emulation into separate source file
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 3 Nov 2022 15:14:44 +0000 (16:14 +0100)
committerThomas Zimmermann <tzimmermann@suse.de>
Sat, 5 Nov 2022 16:12:04 +0000 (17:12 +0100)
Move the generic fbdev implementation into its own source and header
file. Adapt drivers. No functional changes, but some of the internal
helpers have been renamed to fit into the drm_fbdev_ naming scheme.

v3:
* rename drm_fbdev.{c,h} to drm_fbdev_generic.{c,h}
* rebase onto vmwgfx changes
* rebase onto xlnx changes
* fix include statements in amdgpu

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221103151446.2638-22-tzimmermann@suse.de
63 files changed:
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/arm/display/komeda/komeda_drv.c
drivers/gpu/drm/arm/hdlcd_drv.c
drivers/gpu/drm/arm/malidp_drv.c
drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_fbdev_generic.c [new file with mode: 0644]
drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
drivers/gpu/drm/gud/gud_drv.c
drivers/gpu/drm/hisilicon/hibmc/hibmc_drm_drv.c
drivers/gpu/drm/hisilicon/kirin/kirin_drm_drv.c
drivers/gpu/drm/hyperv/hyperv_drm_drv.c
drivers/gpu/drm/imx/dcss/dcss-kms.c
drivers/gpu/drm/imx/imx-drm-core.c
drivers/gpu/drm/ingenic/ingenic-drm-drv.c
drivers/gpu/drm/kmb/kmb_drv.c
drivers/gpu/drm/logicvc/logicvc_drm.c
drivers/gpu/drm/mcde/mcde_drv.c
drivers/gpu/drm/mediatek/mtk_drm_drv.c
drivers/gpu/drm/meson/meson_drv.c
drivers/gpu/drm/mgag200/mgag200_drv.c
drivers/gpu/drm/mxsfb/lcdif_drv.c
drivers/gpu/drm/mxsfb/mxsfb_drv.c
drivers/gpu/drm/panel/panel-ilitek-ili9341.c
drivers/gpu/drm/pl111/pl111_drv.c
drivers/gpu/drm/qxl/qxl_drv.c
drivers/gpu/drm/rcar-du/rcar_du_drv.c
drivers/gpu/drm/rockchip/rockchip_drm_drv.c
drivers/gpu/drm/solomon/ssd130x.c
drivers/gpu/drm/sti/sti_drv.c
drivers/gpu/drm/stm/drv.c
drivers/gpu/drm/sun4i/sun4i_drv.c
drivers/gpu/drm/tidss/tidss_drv.c
drivers/gpu/drm/tilcdc/tilcdc_drv.c
drivers/gpu/drm/tiny/arcpgu.c
drivers/gpu/drm/tiny/bochs.c
drivers/gpu/drm/tiny/cirrus.c
drivers/gpu/drm/tiny/gm12u320.c
drivers/gpu/drm/tiny/hx8357d.c
drivers/gpu/drm/tiny/ili9163.c
drivers/gpu/drm/tiny/ili9225.c
drivers/gpu/drm/tiny/ili9341.c
drivers/gpu/drm/tiny/ili9486.c
drivers/gpu/drm/tiny/mi0283qt.c
drivers/gpu/drm/tiny/ofdrm.c
drivers/gpu/drm/tiny/panel-mipi-dbi.c
drivers/gpu/drm/tiny/repaper.c
drivers/gpu/drm/tiny/simpledrm.c
drivers/gpu/drm/tiny/st7586.c
drivers/gpu/drm/tiny/st7735r.c
drivers/gpu/drm/tve200/tve200_drv.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/vboxvideo/vbox_drv.c
drivers/gpu/drm/vc4/vc4_drv.c
drivers/gpu/drm/virtio/virtgpu_drv.c
drivers/gpu/drm/vkms/vkms_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/xlnx/zynqmp_kms.c
include/drm/drm_fb_helper.h
include/drm/drm_fbdev_generic.h [new file with mode: 0644]

index 6e55c47288e4232773b7aa5c35aeaee10e85bfe4..c44a54cadb618f4948abbaca2ce889f6f08633ea 100644 (file)
@@ -117,7 +117,9 @@ drm_kms_helper-y := \
        drm_self_refresh_helper.o \
        drm_simple_kms_helper.o
 drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o
-drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o
+drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += \
+       drm_fbdev_generic.o \
+       drm_fb_helper.o
 obj-$(CONFIG_DRM_KMS_HELPER) += drm_kms_helper.o
 
 #
index 3c9fecdd6b2f322fc7f1dbbb28aecf91739c84f6..ca96ee2c2c962696b6b0aca1ab30862f53f89722 100644 (file)
@@ -25,6 +25,7 @@
 #include <drm/amdgpu_drm.h>
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_vblank.h>
 #include <drm/drm_managed.h>
index 9fce4239d4ad4d39f19428029e0f41a09b4b5524..3f4e719eebd8571d6656998afccb0bfdc90e2188 100644 (file)
@@ -9,7 +9,7 @@
 #include <linux/platform_device.h>
 #include <linux/component.h>
 #include <linux/pm_runtime.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_module.h>
 #include <drm/drm_of.h>
 #include "komeda_dev.h"
index a032003c340cc9690ff352456cebf776209e2fb3..3219cc33d7f699debc0a2f9a674d7321a5540a5b 100644 (file)
@@ -26,7 +26,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_modeset_helper.h>
index 1d0b0c54ccc74a96d1486e2108b1e007f4600ee1..b734dbdcc5773739b20ea72c3e8fe44422f6dac9 100644 (file)
@@ -19,7 +19,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index a94f1a9e8f4094b16bc8f9bcb7c7d1a64d194c17..718119e168a698ac2c9a3ed9abefc00121c84ea8 100644 (file)
@@ -16,7 +16,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index bbeb5defc8f5caef1f2fef68bac2e70377456242..420fc75c240e4d1c7dfb5f0edcd7b08a121e002e 100644 (file)
@@ -33,6 +33,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_module.h>
 #include <drm/drm_probe_helper.h>
index f7e7f4e919c779eebeaa32136089632482af0927..a2bb5b916235257efef93a1ca783cf8cb4cabe9b 100644 (file)
@@ -19,7 +19,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index 105d9c8fe3250f385337501bab6ee5827809ca02..5eb2f0d4bf8d459b04e5c514de0a703e6e8ee78c 100644 (file)
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/console.h>
-#include <linux/dma-buf.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/slab.h>
 #include <linux/sysrq.h>
-#include <linux/vmalloc.h>
 
 #include <drm/drm_atomic.h>
-#include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_print.h>
 #include <drm/drm_vblank.h>
 
-#include "drm_crtc_helper_internal.h"
 #include "drm_internal.h"
 
 static bool drm_fbdev_emulation = true;
@@ -372,80 +365,6 @@ static void drm_fb_helper_resume_worker(struct work_struct *work)
        console_unlock();
 }
 
-static void drm_fb_helper_damage_blit_real(struct drm_fb_helper *fb_helper,
-                                          struct drm_clip_rect *clip,
-                                          struct iosys_map *dst)
-{
-       struct drm_framebuffer *fb = fb_helper->fb;
-       size_t offset = clip->y1 * fb->pitches[0];
-       size_t len = clip->x2 - clip->x1;
-       unsigned int y;
-       void *src;
-
-       switch (drm_format_info_bpp(fb->format, 0)) {
-       case 1:
-               offset += clip->x1 / 8;
-               len = DIV_ROUND_UP(len + clip->x1 % 8, 8);
-               break;
-       case 2:
-               offset += clip->x1 / 4;
-               len = DIV_ROUND_UP(len + clip->x1 % 4, 4);
-               break;
-       case 4:
-               offset += clip->x1 / 2;
-               len = DIV_ROUND_UP(len + clip->x1 % 2, 2);
-               break;
-       default:
-               offset += clip->x1 * fb->format->cpp[0];
-               len *= fb->format->cpp[0];
-               break;
-       }
-
-       src = fb_helper->info->screen_buffer + offset;
-       iosys_map_incr(dst, offset); /* go to first pixel within clip rect */
-
-       for (y = clip->y1; y < clip->y2; y++) {
-               iosys_map_memcpy_to(dst, 0, src, len);
-               iosys_map_incr(dst, fb->pitches[0]);
-               src += fb->pitches[0];
-       }
-}
-
-static int drm_fb_helper_damage_blit(struct drm_fb_helper *fb_helper,
-                                    struct drm_clip_rect *clip)
-{
-       struct drm_client_buffer *buffer = fb_helper->buffer;
-       struct iosys_map map, dst;
-       int ret;
-
-       /*
-        * We have to pin the client buffer to its current location while
-        * flushing the shadow buffer. In the general case, concurrent
-        * modesetting operations could try to move the buffer and would
-        * fail. The modeset has to be serialized by acquiring the reservation
-        * object of the underlying BO here.
-        *
-        * For fbdev emulation, we only have to protect against fbdev modeset
-        * operations. Nothing else will involve the client buffer's BO. So it
-        * is sufficient to acquire struct drm_fb_helper.lock here.
-        */
-       mutex_lock(&fb_helper->lock);
-
-       ret = drm_client_buffer_vmap(buffer, &map);
-       if (ret)
-               goto out;
-
-       dst = map;
-       drm_fb_helper_damage_blit_real(fb_helper, clip, &dst);
-
-       drm_client_buffer_vunmap(buffer);
-
-out:
-       mutex_unlock(&fb_helper->lock);
-
-       return ret;
-}
-
 static void drm_fb_helper_damage_work(struct work_struct *work)
 {
        struct drm_fb_helper *helper = container_of(work, struct drm_fb_helper, damage_work);
@@ -2326,423 +2245,10 @@ EXPORT_SYMBOL(drm_fb_helper_lastclose);
  *
  * This function can be used as the
  * &drm_mode_config_funcs.output_poll_changed callback for drivers that only
- * need to call drm_fb_helper_hotplug_event().
+ * need to call drm_fbdev.hotplug_event().
  */
 void drm_fb_helper_output_poll_changed(struct drm_device *dev)
 {
        drm_fb_helper_hotplug_event(dev->fb_helper);
 }
 EXPORT_SYMBOL(drm_fb_helper_output_poll_changed);
-
-static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper)
-{
-       struct drm_device *dev = fb_helper->dev;
-       struct drm_framebuffer *fb = fb_helper->fb;
-
-       return dev->mode_config.prefer_shadow_fbdev ||
-              dev->mode_config.prefer_shadow ||
-              fb->funcs->dirty;
-}
-
-/* @user: 1=userspace, 0=fbcon */
-static int drm_fbdev_fb_open(struct fb_info *info, int user)
-{
-       struct drm_fb_helper *fb_helper = info->par;
-
-       /* No need to take a ref for fbcon because it unbinds on unregister */
-       if (user && !try_module_get(fb_helper->dev->driver->fops->owner))
-               return -ENODEV;
-
-       return 0;
-}
-
-static int drm_fbdev_fb_release(struct fb_info *info, int user)
-{
-       struct drm_fb_helper *fb_helper = info->par;
-
-       if (user)
-               module_put(fb_helper->dev->driver->fops->owner);
-
-       return 0;
-}
-
-static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper)
-{
-       struct fb_info *fbi = fb_helper->info;
-       void *shadow = NULL;
-
-       if (!fb_helper->dev)
-               return;
-
-       if (fbi) {
-               if (fbi->fbdefio)
-                       fb_deferred_io_cleanup(fbi);
-               if (drm_fbdev_use_shadow_fb(fb_helper))
-                       shadow = fbi->screen_buffer;
-       }
-
-       drm_fb_helper_fini(fb_helper);
-
-       if (shadow)
-               vfree(shadow);
-       else if (fb_helper->buffer)
-               drm_client_buffer_vunmap(fb_helper->buffer);
-
-       drm_client_framebuffer_delete(fb_helper->buffer);
-}
-
-static void drm_fbdev_release(struct drm_fb_helper *fb_helper)
-{
-       drm_fbdev_cleanup(fb_helper);
-       drm_client_release(&fb_helper->client);
-       kfree(fb_helper);
-}
-
-/*
- * fb_ops.fb_destroy is called by the last put_fb_info() call at the end of
- * unregister_framebuffer() or fb_release().
- */
-static void drm_fbdev_fb_destroy(struct fb_info *info)
-{
-       drm_fbdev_release(info->par);
-}
-
-static int drm_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
-{
-       struct drm_fb_helper *fb_helper = info->par;
-
-       if (drm_fbdev_use_shadow_fb(fb_helper))
-               return fb_deferred_io_mmap(info, vma);
-       else if (fb_helper->dev->driver->gem_prime_mmap)
-               return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma);
-       else
-               return -ENODEV;
-}
-
-static bool drm_fbdev_use_iomem(struct fb_info *info)
-{
-       struct drm_fb_helper *fb_helper = info->par;
-       struct drm_client_buffer *buffer = fb_helper->buffer;
-
-       return !drm_fbdev_use_shadow_fb(fb_helper) && buffer->map.is_iomem;
-}
-
-static ssize_t drm_fbdev_fb_read(struct fb_info *info, char __user *buf,
-                                size_t count, loff_t *ppos)
-{
-       ssize_t ret;
-
-       if (drm_fbdev_use_iomem(info))
-               ret = drm_fb_helper_cfb_read(info, buf, count, ppos);
-       else
-               ret = drm_fb_helper_sys_read(info, buf, count, ppos);
-
-       return ret;
-}
-
-static ssize_t drm_fbdev_fb_write(struct fb_info *info, const char __user *buf,
-                                 size_t count, loff_t *ppos)
-{
-       ssize_t ret;
-
-       if (drm_fbdev_use_iomem(info))
-               ret = drm_fb_helper_cfb_write(info, buf, count, ppos);
-       else
-               ret = drm_fb_helper_sys_write(info, buf, count, ppos);
-
-       return ret;
-}
-
-static void drm_fbdev_fb_fillrect(struct fb_info *info,
-                                 const struct fb_fillrect *rect)
-{
-       if (drm_fbdev_use_iomem(info))
-               drm_fb_helper_cfb_fillrect(info, rect);
-       else
-               drm_fb_helper_sys_fillrect(info, rect);
-}
-
-static void drm_fbdev_fb_copyarea(struct fb_info *info,
-                                 const struct fb_copyarea *area)
-{
-       if (drm_fbdev_use_iomem(info))
-               drm_fb_helper_cfb_copyarea(info, area);
-       else
-               drm_fb_helper_sys_copyarea(info, area);
-}
-
-static void drm_fbdev_fb_imageblit(struct fb_info *info,
-                                  const struct fb_image *image)
-{
-       if (drm_fbdev_use_iomem(info))
-               drm_fb_helper_cfb_imageblit(info, image);
-       else
-               drm_fb_helper_sys_imageblit(info, image);
-}
-
-static const struct fb_ops drm_fbdev_fb_ops = {
-       .owner          = THIS_MODULE,
-       DRM_FB_HELPER_DEFAULT_OPS,
-       .fb_open        = drm_fbdev_fb_open,
-       .fb_release     = drm_fbdev_fb_release,
-       .fb_destroy     = drm_fbdev_fb_destroy,
-       .fb_mmap        = drm_fbdev_fb_mmap,
-       .fb_read        = drm_fbdev_fb_read,
-       .fb_write       = drm_fbdev_fb_write,
-       .fb_fillrect    = drm_fbdev_fb_fillrect,
-       .fb_copyarea    = drm_fbdev_fb_copyarea,
-       .fb_imageblit   = drm_fbdev_fb_imageblit,
-};
-
-static struct fb_deferred_io drm_fbdev_defio = {
-       .delay          = HZ / 20,
-       .deferred_io    = drm_fb_helper_deferred_io,
-};
-
-/*
- * This function uses the client API to create a framebuffer backed by a dumb buffer.
- *
- * The _sys_ versions are used for &fb_ops.fb_read, fb_write, fb_fillrect,
- * fb_copyarea, fb_imageblit.
- */
-static int drm_fb_helper_generic_probe(struct drm_fb_helper *fb_helper,
-                                      struct drm_fb_helper_surface_size *sizes)
-{
-       struct drm_client_dev *client = &fb_helper->client;
-       struct drm_device *dev = fb_helper->dev;
-       struct drm_client_buffer *buffer;
-       struct drm_framebuffer *fb;
-       struct fb_info *fbi;
-       u32 format;
-       struct iosys_map map;
-       int ret;
-
-       drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
-                   sizes->surface_width, sizes->surface_height,
-                   sizes->surface_bpp);
-
-       format = drm_mode_legacy_fb_format(sizes->surface_bpp, sizes->surface_depth);
-       buffer = drm_client_framebuffer_create(client, sizes->surface_width,
-                                              sizes->surface_height, format);
-       if (IS_ERR(buffer))
-               return PTR_ERR(buffer);
-
-       fb_helper->buffer = buffer;
-       fb_helper->fb = buffer->fb;
-       fb = buffer->fb;
-
-       fbi = drm_fb_helper_alloc_info(fb_helper);
-       if (IS_ERR(fbi))
-               return PTR_ERR(fbi);
-
-       fbi->fbops = &drm_fbdev_fb_ops;
-       fbi->screen_size = sizes->surface_height * fb->pitches[0];
-       fbi->fix.smem_len = fbi->screen_size;
-       fbi->flags = FBINFO_DEFAULT;
-
-       drm_fb_helper_fill_info(fbi, fb_helper, sizes);
-
-       if (drm_fbdev_use_shadow_fb(fb_helper)) {
-               fbi->screen_buffer = vzalloc(fbi->screen_size);
-               if (!fbi->screen_buffer)
-                       return -ENOMEM;
-               fbi->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
-
-               fbi->fbdefio = &drm_fbdev_defio;
-               fb_deferred_io_init(fbi);
-       } else {
-               /* buffer is mapped for HW framebuffer */
-               ret = drm_client_buffer_vmap(fb_helper->buffer, &map);
-               if (ret)
-                       return ret;
-               if (map.is_iomem) {
-                       fbi->screen_base = map.vaddr_iomem;
-               } else {
-                       fbi->screen_buffer = map.vaddr;
-                       fbi->flags |= FBINFO_VIRTFB;
-               }
-
-               /*
-                * Shamelessly leak the physical address to user-space. As
-                * page_to_phys() is undefined for I/O memory, warn in this
-                * case.
-                */
-#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
-               if (fb_helper->hint_leak_smem_start && fbi->fix.smem_start == 0 &&
-                   !drm_WARN_ON_ONCE(dev, map.is_iomem))
-                       fbi->fix.smem_start =
-                               page_to_phys(virt_to_page(fbi->screen_buffer));
-#endif
-       }
-
-       return 0;
-}
-
-static int drm_fbdev_fb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
-{
-       struct drm_device *dev = helper->dev;
-       int ret;
-
-       if (!drm_fbdev_use_shadow_fb(helper))
-               return 0;
-
-       /* Call damage handlers only if necessary */
-       if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
-               return 0;
-
-       if (helper->buffer) {
-               ret = drm_fb_helper_damage_blit(helper, clip);
-               if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
-                       return ret;
-       }
-
-       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_fb_helper_generic_funcs = {
-       .fb_probe = drm_fb_helper_generic_probe,
-       .fb_dirty = drm_fbdev_fb_dirty,
-};
-
-static void drm_fbdev_client_unregister(struct drm_client_dev *client)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-
-       if (fb_helper->info)
-               /* drm_fbdev_fb_destroy() takes care of cleanup */
-               drm_fb_helper_unregister_info(fb_helper);
-       else
-               drm_fbdev_release(fb_helper);
-}
-
-static int drm_fbdev_client_restore(struct drm_client_dev *client)
-{
-       drm_fb_helper_lastclose(client->dev);
-
-       return 0;
-}
-
-static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
-{
-       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
-       struct drm_device *dev = client->dev;
-       int ret;
-
-       /* Setup is not retried if it has failed */
-       if (!fb_helper->dev && fb_helper->funcs)
-               return 0;
-
-       if (dev->fb_helper)
-               return drm_fb_helper_hotplug_event(dev->fb_helper);
-
-       if (!dev->mode_config.num_connector) {
-               drm_dbg_kms(dev, "No connectors found, will not create framebuffer!\n");
-               return 0;
-       }
-
-       drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs);
-
-       ret = drm_fb_helper_init(dev, fb_helper);
-       if (ret)
-               goto err;
-
-       if (!drm_drv_uses_atomic_modeset(dev))
-               drm_helper_disable_unused_functions(dev);
-
-       ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp);
-       if (ret)
-               goto err_cleanup;
-
-       return 0;
-
-err_cleanup:
-       drm_fbdev_cleanup(fb_helper);
-err:
-       fb_helper->dev = NULL;
-       fb_helper->info = NULL;
-
-       drm_err(dev, "fbdev: Failed to setup generic emulation (ret=%d)\n", ret);
-
-       return ret;
-}
-
-static const struct drm_client_funcs drm_fbdev_client_funcs = {
-       .owner          = THIS_MODULE,
-       .unregister     = drm_fbdev_client_unregister,
-       .restore        = drm_fbdev_client_restore,
-       .hotplug        = drm_fbdev_client_hotplug,
-};
-
-/**
- * drm_fbdev_generic_setup() - Setup generic fbdev emulation
- * @dev: DRM device
- * @preferred_bpp: Preferred bits per pixel for the device.
- *                 @dev->mode_config.preferred_depth is used if this is zero.
- *
- * This function sets up generic fbdev emulation for drivers that supports
- * dumb buffers with a virtual address and that can be mmap'ed.
- * drm_fbdev_generic_setup() shall be called after the DRM driver registered
- * the new DRM device with drm_dev_register().
- *
- * Restore, hotplug events and teardown are all taken care of. Drivers that do
- * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
- * Simple drivers might use drm_mode_config_helper_suspend().
- *
- * Drivers that set the dirty callback on their framebuffer will get a shadow
- * fbdev buffer that is blitted onto the real buffer. This is done in order to
- * make deferred I/O work with all kinds of buffers. A shadow buffer can be
- * requested explicitly by setting struct drm_mode_config.prefer_shadow or
- * struct drm_mode_config.prefer_shadow_fbdev to true beforehand. This is
- * required to use generic fbdev emulation with SHMEM helpers.
- *
- * This function is safe to call even when there are no connectors present.
- * Setup will be retried on the next hotplug event.
- *
- * The fbdev is destroyed by drm_dev_unregister().
- */
-void drm_fbdev_generic_setup(struct drm_device *dev,
-                            unsigned int preferred_bpp)
-{
-       struct drm_fb_helper *fb_helper;
-       int ret;
-
-       drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
-       drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
-
-       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
-       if (!fb_helper) {
-               drm_err(dev, "Failed to allocate fb_helper\n");
-               return;
-       }
-
-       ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
-       if (ret) {
-               kfree(fb_helper);
-               drm_err(dev, "Failed to register client: %d\n", ret);
-               return;
-       }
-
-       /*
-        * FIXME: This mixes up depth with bpp, which results in a glorious
-        * mess, resulting in some drivers picking wrong fbdev defaults and
-        * others wrong preferred_depth defaults.
-        */
-       if (!preferred_bpp)
-               preferred_bpp = dev->mode_config.preferred_depth;
-       if (!preferred_bpp)
-               preferred_bpp = 32;
-       fb_helper->preferred_bpp = preferred_bpp;
-
-       ret = drm_fbdev_client_hotplug(&fb_helper->client);
-       if (ret)
-               drm_dbg_kms(dev, "client hotplug ret=%d\n", ret);
-
-       drm_client_register(&fb_helper->client);
-}
-EXPORT_SYMBOL(drm_fbdev_generic_setup);
diff --git a/drivers/gpu/drm/drm_fbdev_generic.c b/drivers/gpu/drm/drm_fbdev_generic.c
new file mode 100644 (file)
index 0000000..2d6083a
--- /dev/null
@@ -0,0 +1,493 @@
+// SPDX-License-Identifier: MIT
+
+#include <linux/moduleparam.h>
+
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_drv.h>
+#include <drm/drm_fb_helper.h>
+#include <drm/drm_framebuffer.h>
+#include <drm/drm_print.h>
+
+#include <drm/drm_fbdev_generic.h>
+
+static bool drm_fbdev_use_shadow_fb(struct drm_fb_helper *fb_helper)
+{
+       struct drm_device *dev = fb_helper->dev;
+       struct drm_framebuffer *fb = fb_helper->fb;
+
+       return dev->mode_config.prefer_shadow_fbdev ||
+              dev->mode_config.prefer_shadow ||
+              fb->funcs->dirty;
+}
+
+/* @user: 1=userspace, 0=fbcon */
+static int drm_fbdev_fb_open(struct fb_info *info, int user)
+{
+       struct drm_fb_helper *fb_helper = info->par;
+
+       /* No need to take a ref for fbcon because it unbinds on unregister */
+       if (user && !try_module_get(fb_helper->dev->driver->fops->owner))
+               return -ENODEV;
+
+       return 0;
+}
+
+static int drm_fbdev_fb_release(struct fb_info *info, int user)
+{
+       struct drm_fb_helper *fb_helper = info->par;
+
+       if (user)
+               module_put(fb_helper->dev->driver->fops->owner);
+
+       return 0;
+}
+
+static void drm_fbdev_cleanup(struct drm_fb_helper *fb_helper)
+{
+       struct fb_info *fbi = fb_helper->info;
+       void *shadow = NULL;
+
+       if (!fb_helper->dev)
+               return;
+
+       if (fbi) {
+               if (fbi->fbdefio)
+                       fb_deferred_io_cleanup(fbi);
+               if (drm_fbdev_use_shadow_fb(fb_helper))
+                       shadow = fbi->screen_buffer;
+       }
+
+       drm_fb_helper_fini(fb_helper);
+
+       if (shadow)
+               vfree(shadow);
+       else if (fb_helper->buffer)
+               drm_client_buffer_vunmap(fb_helper->buffer);
+
+       drm_client_framebuffer_delete(fb_helper->buffer);
+}
+
+static void drm_fbdev_release(struct drm_fb_helper *fb_helper)
+{
+       drm_fbdev_cleanup(fb_helper);
+       drm_client_release(&fb_helper->client);
+       kfree(fb_helper);
+}
+
+/*
+ * fb_ops.fb_destroy is called by the last put_fb_info() call at the end of
+ * unregister_framebuffer() or fb_release().
+ */
+static void drm_fbdev_fb_destroy(struct fb_info *info)
+{
+       drm_fbdev_release(info->par);
+}
+
+static int drm_fbdev_fb_mmap(struct fb_info *info, struct vm_area_struct *vma)
+{
+       struct drm_fb_helper *fb_helper = info->par;
+
+       if (drm_fbdev_use_shadow_fb(fb_helper))
+               return fb_deferred_io_mmap(info, vma);
+       else if (fb_helper->dev->driver->gem_prime_mmap)
+               return fb_helper->dev->driver->gem_prime_mmap(fb_helper->buffer->gem, vma);
+       else
+               return -ENODEV;
+}
+
+static bool drm_fbdev_use_iomem(struct fb_info *info)
+{
+       struct drm_fb_helper *fb_helper = info->par;
+       struct drm_client_buffer *buffer = fb_helper->buffer;
+
+       return !drm_fbdev_use_shadow_fb(fb_helper) && buffer->map.is_iomem;
+}
+
+static ssize_t drm_fbdev_fb_read(struct fb_info *info, char __user *buf,
+                                size_t count, loff_t *ppos)
+{
+       ssize_t ret;
+
+       if (drm_fbdev_use_iomem(info))
+               ret = drm_fb_helper_cfb_read(info, buf, count, ppos);
+       else
+               ret = drm_fb_helper_sys_read(info, buf, count, ppos);
+
+       return ret;
+}
+
+static ssize_t drm_fbdev_fb_write(struct fb_info *info, const char __user *buf,
+                                 size_t count, loff_t *ppos)
+{
+       ssize_t ret;
+
+       if (drm_fbdev_use_iomem(info))
+               ret = drm_fb_helper_cfb_write(info, buf, count, ppos);
+       else
+               ret = drm_fb_helper_sys_write(info, buf, count, ppos);
+
+       return ret;
+}
+
+static void drm_fbdev_fb_fillrect(struct fb_info *info,
+                                 const struct fb_fillrect *rect)
+{
+       if (drm_fbdev_use_iomem(info))
+               drm_fb_helper_cfb_fillrect(info, rect);
+       else
+               drm_fb_helper_sys_fillrect(info, rect);
+}
+
+static void drm_fbdev_fb_copyarea(struct fb_info *info,
+                                 const struct fb_copyarea *area)
+{
+       if (drm_fbdev_use_iomem(info))
+               drm_fb_helper_cfb_copyarea(info, area);
+       else
+               drm_fb_helper_sys_copyarea(info, area);
+}
+
+static void drm_fbdev_fb_imageblit(struct fb_info *info,
+                                  const struct fb_image *image)
+{
+       if (drm_fbdev_use_iomem(info))
+               drm_fb_helper_cfb_imageblit(info, image);
+       else
+               drm_fb_helper_sys_imageblit(info, image);
+}
+
+static const struct fb_ops drm_fbdev_fb_ops = {
+       .owner          = THIS_MODULE,
+       DRM_FB_HELPER_DEFAULT_OPS,
+       .fb_open        = drm_fbdev_fb_open,
+       .fb_release     = drm_fbdev_fb_release,
+       .fb_destroy     = drm_fbdev_fb_destroy,
+       .fb_mmap        = drm_fbdev_fb_mmap,
+       .fb_read        = drm_fbdev_fb_read,
+       .fb_write       = drm_fbdev_fb_write,
+       .fb_fillrect    = drm_fbdev_fb_fillrect,
+       .fb_copyarea    = drm_fbdev_fb_copyarea,
+       .fb_imageblit   = drm_fbdev_fb_imageblit,
+};
+
+static struct fb_deferred_io drm_fbdev_defio = {
+       .delay          = HZ / 20,
+       .deferred_io    = drm_fb_helper_deferred_io,
+};
+
+/*
+ * This function uses the client API to create a framebuffer backed by a dumb buffer.
+ */
+static int drm_fbdev_fb_probe(struct drm_fb_helper *fb_helper,
+                             struct drm_fb_helper_surface_size *sizes)
+{
+       struct drm_client_dev *client = &fb_helper->client;
+       struct drm_device *dev = fb_helper->dev;
+       struct drm_client_buffer *buffer;
+       struct drm_framebuffer *fb;
+       struct fb_info *fbi;
+       u32 format;
+       struct iosys_map map;
+       int ret;
+
+       drm_dbg_kms(dev, "surface width(%d), height(%d) and bpp(%d)\n",
+                   sizes->surface_width, sizes->surface_height,
+                   sizes->surface_bpp);
+
+       format = drm_mode_legacy_fb_format(sizes->surface_bpp, sizes->surface_depth);
+       buffer = drm_client_framebuffer_create(client, sizes->surface_width,
+                                              sizes->surface_height, format);
+       if (IS_ERR(buffer))
+               return PTR_ERR(buffer);
+
+       fb_helper->buffer = buffer;
+       fb_helper->fb = buffer->fb;
+       fb = buffer->fb;
+
+       fbi = drm_fb_helper_alloc_info(fb_helper);
+       if (IS_ERR(fbi))
+               return PTR_ERR(fbi);
+
+       fbi->fbops = &drm_fbdev_fb_ops;
+       fbi->screen_size = sizes->surface_height * fb->pitches[0];
+       fbi->fix.smem_len = fbi->screen_size;
+       fbi->flags = FBINFO_DEFAULT;
+
+       drm_fb_helper_fill_info(fbi, fb_helper, sizes);
+
+       if (drm_fbdev_use_shadow_fb(fb_helper)) {
+               fbi->screen_buffer = vzalloc(fbi->screen_size);
+               if (!fbi->screen_buffer)
+                       return -ENOMEM;
+               fbi->flags |= FBINFO_VIRTFB | FBINFO_READS_FAST;
+
+               fbi->fbdefio = &drm_fbdev_defio;
+               fb_deferred_io_init(fbi);
+       } else {
+               /* buffer is mapped for HW framebuffer */
+               ret = drm_client_buffer_vmap(fb_helper->buffer, &map);
+               if (ret)
+                       return ret;
+               if (map.is_iomem) {
+                       fbi->screen_base = map.vaddr_iomem;
+               } else {
+                       fbi->screen_buffer = map.vaddr;
+                       fbi->flags |= FBINFO_VIRTFB;
+               }
+
+               /*
+                * Shamelessly leak the physical address to user-space. As
+                * page_to_phys() is undefined for I/O memory, warn in this
+                * case.
+                */
+#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
+               if (fb_helper->hint_leak_smem_start && fbi->fix.smem_start == 0 &&
+                   !drm_WARN_ON_ONCE(dev, map.is_iomem))
+                       fbi->fix.smem_start =
+                               page_to_phys(virt_to_page(fbi->screen_buffer));
+#endif
+       }
+
+       return 0;
+}
+
+static void drm_fbdev_damage_blit_real(struct drm_fb_helper *fb_helper,
+                                      struct drm_clip_rect *clip,
+                                      struct iosys_map *dst)
+{
+       struct drm_framebuffer *fb = fb_helper->fb;
+       size_t offset = clip->y1 * fb->pitches[0];
+       size_t len = clip->x2 - clip->x1;
+       unsigned int y;
+       void *src;
+
+       switch (drm_format_info_bpp(fb->format, 0)) {
+       case 1:
+               offset += clip->x1 / 8;
+               len = DIV_ROUND_UP(len + clip->x1 % 8, 8);
+               break;
+       case 2:
+               offset += clip->x1 / 4;
+               len = DIV_ROUND_UP(len + clip->x1 % 4, 4);
+               break;
+       case 4:
+               offset += clip->x1 / 2;
+               len = DIV_ROUND_UP(len + clip->x1 % 2, 2);
+               break;
+       default:
+               offset += clip->x1 * fb->format->cpp[0];
+               len *= fb->format->cpp[0];
+               break;
+       }
+
+       src = fb_helper->info->screen_buffer + offset;
+       iosys_map_incr(dst, offset); /* go to first pixel within clip rect */
+
+       for (y = clip->y1; y < clip->y2; y++) {
+               iosys_map_memcpy_to(dst, 0, src, len);
+               iosys_map_incr(dst, fb->pitches[0]);
+               src += fb->pitches[0];
+       }
+}
+
+static int drm_fbdev_damage_blit(struct drm_fb_helper *fb_helper,
+                                struct drm_clip_rect *clip)
+{
+       struct drm_client_buffer *buffer = fb_helper->buffer;
+       struct iosys_map map, dst;
+       int ret;
+
+       /*
+        * We have to pin the client buffer to its current location while
+        * flushing the shadow buffer. In the general case, concurrent
+        * modesetting operations could try to move the buffer and would
+        * fail. The modeset has to be serialized by acquiring the reservation
+        * object of the underlying BO here.
+        *
+        * For fbdev emulation, we only have to protect against fbdev modeset
+        * operations. Nothing else will involve the client buffer's BO. So it
+        * is sufficient to acquire struct drm_fb_helper.lock here.
+        */
+       mutex_lock(&fb_helper->lock);
+
+       ret = drm_client_buffer_vmap(buffer, &map);
+       if (ret)
+               goto out;
+
+       dst = map;
+       drm_fbdev_damage_blit_real(fb_helper, clip, &dst);
+
+       drm_client_buffer_vunmap(buffer);
+
+out:
+       mutex_unlock(&fb_helper->lock);
+
+       return ret;
+}
+
+static int drm_fbdev_fb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *clip)
+{
+       struct drm_device *dev = helper->dev;
+       int ret;
+
+       if (!drm_fbdev_use_shadow_fb(helper))
+               return 0;
+
+       /* Call damage handlers only if necessary */
+       if (!(clip->x1 < clip->x2 && clip->y1 < clip->y2))
+               return 0;
+
+       if (helper->buffer) {
+               ret = drm_fbdev_damage_blit(helper, clip);
+               if (drm_WARN_ONCE(dev, ret, "Damage blitter failed: ret=%d\n", ret))
+                       return ret;
+       }
+
+       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_fb_helper_generic_funcs = {
+       .fb_probe = drm_fbdev_fb_probe,
+       .fb_dirty = drm_fbdev_fb_dirty,
+};
+
+static void drm_fbdev_client_unregister(struct drm_client_dev *client)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+
+       if (fb_helper->info)
+               /* drm_fbdev_fb_destroy() takes care of cleanup */
+               drm_fb_helper_unregister_info(fb_helper);
+       else
+               drm_fbdev_release(fb_helper);
+}
+
+static int drm_fbdev_client_restore(struct drm_client_dev *client)
+{
+       drm_fb_helper_lastclose(client->dev);
+
+       return 0;
+}
+
+static int drm_fbdev_client_hotplug(struct drm_client_dev *client)
+{
+       struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client);
+       struct drm_device *dev = client->dev;
+       int ret;
+
+       /* Setup is not retried if it has failed */
+       if (!fb_helper->dev && fb_helper->funcs)
+               return 0;
+
+       if (dev->fb_helper)
+               return drm_fb_helper_hotplug_event(dev->fb_helper);
+
+       if (!dev->mode_config.num_connector) {
+               drm_dbg_kms(dev, "No connectors found, will not create framebuffer!\n");
+               return 0;
+       }
+
+       drm_fb_helper_prepare(dev, fb_helper, &drm_fb_helper_generic_funcs);
+
+       ret = drm_fb_helper_init(dev, fb_helper);
+       if (ret)
+               goto err;
+
+       if (!drm_drv_uses_atomic_modeset(dev))
+               drm_helper_disable_unused_functions(dev);
+
+       ret = drm_fb_helper_initial_config(fb_helper, fb_helper->preferred_bpp);
+       if (ret)
+               goto err_cleanup;
+
+       return 0;
+
+err_cleanup:
+       drm_fbdev_cleanup(fb_helper);
+err:
+       fb_helper->dev = NULL;
+       fb_helper->info = NULL;
+
+       drm_err(dev, "fbdev: Failed to setup generic emulation (ret=%d)\n", ret);
+
+       return ret;
+}
+
+static const struct drm_client_funcs drm_fbdev_client_funcs = {
+       .owner          = THIS_MODULE,
+       .unregister     = drm_fbdev_client_unregister,
+       .restore        = drm_fbdev_client_restore,
+       .hotplug        = drm_fbdev_client_hotplug,
+};
+
+/**
+ * drm_fbdev_generic_setup() - Setup generic fbdev emulation
+ * @dev: DRM device
+ * @preferred_bpp: Preferred bits per pixel for the device.
+ *                 @dev->mode_config.preferred_depth is used if this is zero.
+ *
+ * This function sets up generic fbdev emulation for drivers that supports
+ * dumb buffers with a virtual address and that can be mmap'ed.
+ * drm_fbdev_generic_setup() shall be called after the DRM driver registered
+ * the new DRM device with drm_dev_register().
+ *
+ * Restore, hotplug events and teardown are all taken care of. Drivers that do
+ * suspend/resume need to call drm_fb_helper_set_suspend_unlocked() themselves.
+ * Simple drivers might use drm_mode_config_helper_suspend().
+ *
+ * Drivers that set the dirty callback on their framebuffer will get a shadow
+ * fbdev buffer that is blitted onto the real buffer. This is done in order to
+ * make deferred I/O work with all kinds of buffers. A shadow buffer can be
+ * requested explicitly by setting struct drm_mode_config.prefer_shadow or
+ * struct drm_mode_config.prefer_shadow_fbdev to true beforehand. This is
+ * required to use generic fbdev emulation with SHMEM helpers.
+ *
+ * This function is safe to call even when there are no connectors present.
+ * Setup will be retried on the next hotplug event.
+ *
+ * The fbdev is destroyed by drm_dev_unregister().
+ */
+void drm_fbdev_generic_setup(struct drm_device *dev,
+                            unsigned int preferred_bpp)
+{
+       struct drm_fb_helper *fb_helper;
+       int ret;
+
+       drm_WARN(dev, !dev->registered, "Device has not been registered.\n");
+       drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n");
+
+       fb_helper = kzalloc(sizeof(*fb_helper), GFP_KERNEL);
+       if (!fb_helper)
+               return;
+
+       ret = drm_client_init(dev, &fb_helper->client, "fbdev", &drm_fbdev_client_funcs);
+       if (ret) {
+               kfree(fb_helper);
+               drm_err(dev, "Failed to register client: %d\n", ret);
+               return;
+       }
+
+       /*
+        * FIXME: This mixes up depth with bpp, which results in a glorious
+        * mess, resulting in some drivers picking wrong fbdev defaults and
+        * others wrong preferred_depth defaults.
+        */
+       if (!preferred_bpp)
+               preferred_bpp = dev->mode_config.preferred_depth;
+       if (!preferred_bpp)
+               preferred_bpp = 32;
+       fb_helper->preferred_bpp = preferred_bpp;
+
+       ret = drm_fbdev_client_hotplug(&fb_helper->client);
+       if (ret)
+               drm_dbg_kms(dev, "client hotplug ret=%d\n", ret);
+
+       drm_client_register(&fb_helper->client);
+}
+EXPORT_SYMBOL(drm_fbdev_generic_setup);
index b4acc3422ba4501b6c678a99e5620a8efa1ec26c..8579c7629f5e12edbe7b0ec5c89f8713a390c3bf 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_modeset_helper.h>
 #include <drm/drm_module.h>
index 8d1630b8edac1e7cd4cd76cbd6373ce221809831..d57dab104358bf5921d9a8a3f1f91b03c6396a57 100644 (file)
@@ -18,7 +18,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 5a2e1cac06b2ec787f916c716aadc0aa874e2f84..22053c613644ae13e0ae476cc68a61ca2988bfd8 100644 (file)
@@ -17,6 +17,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_gem_vram_helper.h>
 #include <drm/drm_managed.h>
index 73ee7f25f7346f3caf5a7e7b5882dbaae0a1a9f4..9c5d49bf40c97ef2ee791c3c83c77449ddeffc1e 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index ca127ff797f756ad1b32b318edccf5233d2bbc95..427c20ba34045a30cf3b7bf0871f7f977f18b5e4 100644 (file)
@@ -11,7 +11,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 
index 1defd6a40f11daa95b4f42ce007897ce848b9878..18df3888b7f946259a4dd27816e89b7f78b4bc0e 100644 (file)
@@ -7,7 +7,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge_connector.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
index 8dd8b0f912af68aa60e475a2a122abd21ff1fc10..e060fa6cbcb928a7eb20d5199ea9494a1bc5d93a 100644 (file)
@@ -16,7 +16,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_managed.h>
index 0d6c1b478924c8641b1504b787ecb36dc1293a6d..3d5af44bf92d5bd7e985943d98da1c18bd481a16 100644 (file)
@@ -32,7 +32,7 @@
 #include <drm/drm_encoder.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index 2382ccb3ee99dd21abd30c5ee71dfa615aec631b..d29c678f6c912439b41987f75accfd022e8bea39 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index cc9a4e965f779865999ee977f7e2b6816d5430bc..9de24d9f0c9639b1f8dbcbfdf667bd5943df667c 100644 (file)
@@ -17,7 +17,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_print.h>
 
index 38c3907bb151a17c3f982048f4997c6e8177f639..4aedb050d2a599b45f365309ec091540b488e955 100644 (file)
@@ -69,7 +69,7 @@
 #include <drm/drm_bridge.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 91f58db5915f5b9e013e36ab025e9ab5daf91f08..39a42dc8fb851d13a66fe3540c0e6fcdd6e3062f 100644 (file)
@@ -17,7 +17,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_gem_dma_helper.h>
index 3b24a924b7b9786ac896a58ce518500025783f3e..79bfe3938d3c6abfd6829f6435ab98167dcdc490 100644 (file)
@@ -18,7 +18,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_modeset_helper_vtables.h>
index ece6cd102dbb1fafddd99c320f6142996bd4484b..976f0ab2006b5a23533b7e9b42119db91b0ceb0f 100644 (file)
@@ -11,6 +11,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
index 075002ed6fb09c53ce026304f1b44babc06e610c..cc2ceb301b96d9bb918abdc4f14bfb286e58db21 100644 (file)
@@ -16,7 +16,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_mode_config.h>
index b29b332ed38149c3b50459055275156c21239904..810edea0a31e5b157e7c743a4cab92974bd5ced9 100644 (file)
@@ -20,7 +20,7 @@
 #include <drm/drm_bridge.h>
 #include <drm/drm_connector.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index b59472c29a40d1c33b2e86565de0d14108253bf0..384a724f2822ef2588b5c430f1cf42eef13d966f 100644 (file)
@@ -31,7 +31,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index eb25eedb5ee008cb5bc2b35ca33694ed3a9627ae..00deba0b72716ff08fac6fd189d990e334d30f24 100644 (file)
@@ -48,7 +48,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 3044ca948ce22dcc21fbf9c8ccad7bbb37d018c4..a3b83f89e0616e2b16d1651736e580bd68f84174 100644 (file)
@@ -37,6 +37,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_module.h>
index a2776f1d6f2c298bef1180daed2564d8f5162288..d003e8d9e7a26e535923f2fcaf1ae91d26548530 100644 (file)
@@ -20,7 +20,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_probe_helper.h>
index 813f9f8c86982eee793b53041d477459d9d7ff9e..6e0788d14c10fbdc2d52ac96737b438d39098f36 100644 (file)
@@ -17,7 +17,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
index f2795f90ea69303e8d235920be491e730f17b87b..53464afc2b9ac723e42028319d6348e0c2f1b9c1 100644 (file)
@@ -23,7 +23,7 @@
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_edid.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index 7abf010a329351fc89d21e4afc6e05a47fb84e25..ef6a4e63198f50ba07ee79f221fbc29b6d62d2a8 100644 (file)
@@ -14,7 +14,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
index d7914f5122dff046b85fe1d224b9febc186df3f1..50410bd99dfe15268dfdb8ca44a0fb0f366e3ea8 100644 (file)
@@ -18,7 +18,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index d06ffd99d86e157523f082673ca67affd83f392c..cc94efbbf2d4eede4b9f4f95c15303273d056ced 100644 (file)
@@ -17,7 +17,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_module.h>
 #include <drm/drm_of.h>
index 15cd9b91b7e2a46d1618645ff9acadfbee4329db..07d94b1e80895ffd6d002f43dfb0abf4e11495e8 100644 (file)
@@ -14,7 +14,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
 #include <drm/drm_module.h>
index f72755b8ea14c9d3cead4c65b16bf7d5646ad8f7..80615ecdae0b2941afcb69529ed47ec192fd417f 100644 (file)
@@ -16,7 +16,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index bb302a3fd6b5f87403c38de830960e5625c1c7be..611bbee150719f0f97c27fed541b5c401cb8f62c 100644 (file)
@@ -12,7 +12,7 @@
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
index 04682f831544c759af9d52ddb0a21e74e9fb59aa..024346054c70e78e6127645728c89077eeeb58f3 100644 (file)
@@ -7,7 +7,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 354d5e854a6f0979cc9ebc5a208eeb9ef0d211cd..678c2ef1cae705c7d463b325312877bd40e5df97 100644 (file)
@@ -30,7 +30,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_fourcc.h>
index 7441d992a5d7adf809024f626de2ead74297a237..130fd07a967d8c6ed897f61ee1c61fcda9b9872e 100644 (file)
@@ -12,7 +12,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_fourcc.h>
index 48c24aa8c28a11fcfebb79b7ceff40f976ebb0bc..9f634f720817b84d642e9b30ab9e76aab8d2d3e4 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index 9a1a5943bee013b0129a4473526e62bdd91c2585..ca0451f7996259759bea8f945569c40f8f128106 100644 (file)
@@ -9,7 +9,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_mipi_dbi.h>
index a79da2b4af647159f5db4a2fdfcb415235a2a1c4..815bab2858231d1456e026922c467a238b421ddf 100644 (file)
@@ -20,7 +20,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index 69b265e78096b063fff318971a3ae38f50d976e2..420f6005a9568b13554927ad85e2346f0729f3ba 100644 (file)
@@ -17,7 +17,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index c80028bb1d1102211abfbfdbcb8457e2f3efed70..1bb847466b107a4653463b6f028c765e98af98f6 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index bc522fb3d94d127ffe77b33760f650a4425e5050..47df2b5a3048f07186aad8e1ff72043f5a38c574 100644 (file)
@@ -15,7 +15,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index d7f98dcf233009cad7a30d4a939c7f0e84760591..dc9e4d71b12ae9644e00d84b9c26598d00ec8585 100644 (file)
@@ -11,7 +11,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index 955a61d628e7c1f8381993c23e0e83365a297d92..03a7d569cd5683a3bc3c4538084c1f181f45c8f3 100644 (file)
@@ -16,7 +16,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index e62f4d16b2c6bffd9320fee8e55433a70fd48ca0..c2677d081a7b6b41e03229678cc32b4a059edb7b 100644 (file)
@@ -26,7 +26,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index cbb100753154ea2d7b7c27c53a305f3155e5a16c..162eb44dcba8961cb2120aff13ee5090df0aed18 100644 (file)
@@ -15,7 +15,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index b6f620b902e6dabb2337a08a9e25e0bab291d725..ce57fa9917e5112f2babadb4972c0a1d325804b3 100644 (file)
@@ -16,7 +16,7 @@
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fb_dma_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_format_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index c36ba08acda1896376a56c79efbfed3ecd8fd7ce..15d9cf283c66a24e2a90eabfc43301a74817ef0e 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_atomic_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_managed.h>
index 611785e09757657869c4fca591ad2a4eb4ecdfc3..0d05c386d30302b81acdf7594a32aab5dc2d128a 100644 (file)
@@ -40,7 +40,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_module.h>
index 91effdcefb6d5b2adcf5f11b4f1f048c0ddc7f77..e81352126a0f21510dd6b4334be840dc1c930c87 100644 (file)
@@ -7,7 +7,7 @@
 
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_managed.h>
index 1cd716eb17a1c84f1b98d64608063d290d3269d2..b450f449a3aba267f1086a6593a80e30f1828e5c 100644 (file)
@@ -14,7 +14,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
index 2027063fdc3097c59dae9c865a59c149d5db5484..b66bf7aea63275ead6fc3b753f0e076b0c7ffe8b 100644 (file)
@@ -33,7 +33,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_vblank.h>
 
 #include <soc/bcm2835/raspberrypi-firmware.h>
index 0035affc3e590f1f10dc2e6574acaeeaed311dad..ae97b98750b6d5f4baf5ed9d2f7c663d738bfaf1 100644 (file)
@@ -35,6 +35,7 @@
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 
 #include "virtgpu_drv.h"
index 0ffe5f0e33f75b96adacdc5f607e1a373e8bf7c2..293dbca50c316e28654c2d4d63963a08e2222eb6 100644 (file)
@@ -17,7 +17,7 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_ioctl.h>
index 63496773f7142cc4b15149308485c875094ca3bc..bd02cb0e6837fea2f0b8e81f1774201f58590b4f 100644 (file)
@@ -35,7 +35,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_module.h>
index 1847792cf13db9505458e65b12f35ba8e964d562..776ef5480206403cd0c47ad65d66adef0c28614b 100644 (file)
@@ -19,7 +19,7 @@
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_fbdev_generic.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
index 3dfb5d10938718eccf9ec46ed229f803d7077d1c..ecfcd2c56d95a7613b45eb022058d3e9a50cdcbb 100644 (file)
@@ -287,9 +287,6 @@ int drm_fb_helper_debug_leave(struct fb_info *info);
 
 void drm_fb_helper_lastclose(struct drm_device *dev);
 void drm_fb_helper_output_poll_changed(struct drm_device *dev);
-
-void drm_fbdev_generic_setup(struct drm_device *dev,
-                            unsigned int preferred_bpp);
 #else
 static inline void drm_fb_helper_prepare(struct drm_device *dev,
                                        struct drm_fb_helper *helper,
@@ -474,12 +471,6 @@ static inline void drm_fb_helper_lastclose(struct drm_device *dev)
 static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
 {
 }
-
-static inline void
-drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
-{
-}
-
 #endif
 
 #endif
diff --git a/include/drm/drm_fbdev_generic.h b/include/drm/drm_fbdev_generic.h
new file mode 100644 (file)
index 0000000..7579934
--- /dev/null
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: MIT */
+
+#ifndef DRM_FBDEV_GENERIC_H
+#define DRM_FBDEV_GENERIC_H
+
+struct drm_device;
+
+#ifdef CONFIG_DRM_FBDEV_EMULATION
+void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp);
+#else
+static inline void drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
+{ }
+#endif
+
+#endif