Skip to content
Snippets Groups Projects
Select Git revision
  • 740b8dad05bee39e1e3b926f05bb4a8274b8ba49
  • drm-misc-templates default
  • wip/final/kci-gitlab-lava-v1
  • wip/vignesh/kci-lava-gitlab-runner
  • kci-gitlab-igt-v8
  • kci-gitlab-igt-v4
  • drm-misc-fixes-2024-10-02
  • drm-misc-next-2024-09-26
  • drm-misc-fixes-2024-09-26
  • drm-misc-next-2024-09-20
  • drm-misc-fixes-2024-09-12
  • drm-misc-fixes-2024-09-05
  • drm-misc-next-fixes-2024-09-05
  • drm-misc-fixes-2024-08-29
  • drm-misc-next-2024-08-29
  • drm-misc-next-2024-08-22
  • drm-misc-fixes-2024-08-22
  • drm-misc-next-2024-08-16
  • drm-misc-fixes-2024-08-15
  • drm-misc-next-2024-08-09
  • drm-misc-fixes-2024-08-08
  • drm-misc-next-2024-08-01
  • drm-misc-fixes-2024-08-01
  • drm-misc-next-fixes-2024-07-25
  • drm-misc-next-fixes-2024-07-19
  • drm-misc-next-fixes-2024-07-11
26 results

drm_fbdev_generic.c

Blame
  • drm_fbdev_generic.c 9.37 KiB
    // SPDX-License-Identifier: MIT
    
    #include <linux/moduleparam.h>
    #include <linux/vmalloc.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_gem.h>
    #include <drm/drm_print.h>
    
    #include <drm/drm_fbdev_generic.h>
    
    /* @user: 1=userspace, 0=fbcon */
    static int drm_fbdev_generic_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_generic_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;
    }
    
    FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(drm_fbdev_generic,
    				   drm_fb_helper_damage_range,
    				   drm_fb_helper_damage_area);
    
    static void drm_fbdev_generic_fb_destroy(struct fb_info *info)
    {
    	struct drm_fb_helper *fb_helper = info->par;
    	void *shadow = info->screen_buffer;
    
    	if (!fb_helper->dev)
    		return;
    
    	fb_deferred_io_cleanup(info);
    	drm_fb_helper_fini(fb_helper);
    	vfree(shadow);
    	drm_client_framebuffer_delete(fb_helper->buffer);
    
    	drm_client_release(&fb_helper->client);
    	drm_fb_helper_unprepare(fb_helper);
    	kfree(fb_helper);
    }
    
    static const struct fb_ops drm_fbdev_generic_fb_ops = {
    	.owner		= THIS_MODULE,
    	.fb_open	= drm_fbdev_generic_fb_open,
    	.fb_release	= drm_fbdev_generic_fb_release,
    	FB_DEFAULT_DEFERRED_OPS(drm_fbdev_generic),
    	DRM_FB_HELPER_DEFAULT_OPS,
    	.fb_destroy	= drm_fbdev_generic_fb_destroy,
    };
    
    /*
     * This function uses the client API to create a framebuffer backed by a dumb buffer.
     */