LCOV - code coverage report
Current view: top level - include/drm - drm_fb_helper.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 2 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 1 0.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (c) 2006-2009 Red Hat Inc.
       3             :  * Copyright (c) 2006-2008 Intel Corporation
       4             :  * Copyright (c) 2007 Dave Airlie <airlied@linux.ie>
       5             :  *
       6             :  * DRM framebuffer helper functions
       7             :  *
       8             :  * Permission to use, copy, modify, distribute, and sell this software and its
       9             :  * documentation for any purpose is hereby granted without fee, provided that
      10             :  * the above copyright notice appear in all copies and that both that copyright
      11             :  * notice and this permission notice appear in supporting documentation, and
      12             :  * that the name of the copyright holders not be used in advertising or
      13             :  * publicity pertaining to distribution of the software without specific,
      14             :  * written prior permission.  The copyright holders make no representations
      15             :  * about the suitability of this software for any purpose.  It is provided "as
      16             :  * is" without express or implied warranty.
      17             :  *
      18             :  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
      19             :  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
      20             :  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
      21             :  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
      22             :  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
      23             :  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      24             :  * OF THIS SOFTWARE.
      25             :  *
      26             :  * Authors:
      27             :  *      Dave Airlie <airlied@linux.ie>
      28             :  *      Jesse Barnes <jesse.barnes@intel.com>
      29             :  */
      30             : #ifndef DRM_FB_HELPER_H
      31             : #define DRM_FB_HELPER_H
      32             : 
      33             : struct drm_fb_helper;
      34             : 
      35             : #include <drm/drm_client.h>
      36             : #include <drm/drm_crtc.h>
      37             : #include <drm/drm_device.h>
      38             : #include <linux/kgdb.h>
      39             : 
      40             : enum mode_set_atomic {
      41             :         LEAVE_ATOMIC_MODE_SET,
      42             :         ENTER_ATOMIC_MODE_SET,
      43             : };
      44             : 
      45             : /**
      46             :  * struct drm_fb_helper_surface_size - describes fbdev size and scanout surface size
      47             :  * @fb_width: fbdev width
      48             :  * @fb_height: fbdev height
      49             :  * @surface_width: scanout buffer width
      50             :  * @surface_height: scanout buffer height
      51             :  * @surface_bpp: scanout buffer bpp
      52             :  * @surface_depth: scanout buffer depth
      53             :  *
      54             :  * Note that the scanout surface width/height may be larger than the fbdev
      55             :  * width/height.  In case of multiple displays, the scanout surface is sized
      56             :  * according to the largest width/height (so it is large enough for all CRTCs
      57             :  * to scanout).  But the fbdev width/height is sized to the minimum width/
      58             :  * height of all the displays.  This ensures that fbcon fits on the smallest
      59             :  * of the attached displays. fb_width/fb_height is used by
      60             :  * drm_fb_helper_fill_info() to fill out the &fb_info.var structure.
      61             :  */
      62             : struct drm_fb_helper_surface_size {
      63             :         u32 fb_width;
      64             :         u32 fb_height;
      65             :         u32 surface_width;
      66             :         u32 surface_height;
      67             :         u32 surface_bpp;
      68             :         u32 surface_depth;
      69             : };
      70             : 
      71             : /**
      72             :  * struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library
      73             :  *
      74             :  * Driver callbacks used by the fbdev emulation helper library.
      75             :  */
      76             : struct drm_fb_helper_funcs {
      77             :         /**
      78             :          * @fb_probe:
      79             :          *
      80             :          * Driver callback to allocate and initialize the fbdev info structure.
      81             :          * Furthermore it also needs to allocate the DRM framebuffer used to
      82             :          * back the fbdev.
      83             :          *
      84             :          * This callback is mandatory.
      85             :          *
      86             :          * RETURNS:
      87             :          *
      88             :          * The driver should return 0 on success and a negative error code on
      89             :          * failure.
      90             :          */
      91             :         int (*fb_probe)(struct drm_fb_helper *helper,
      92             :                         struct drm_fb_helper_surface_size *sizes);
      93             : };
      94             : 
      95             : /**
      96             :  * struct drm_fb_helper - main structure to emulate fbdev on top of KMS
      97             :  * @fb: Scanout framebuffer object
      98             :  * @dev: DRM device
      99             :  * @funcs: driver callbacks for fb helper
     100             :  * @fbdev: emulated fbdev device info struct
     101             :  * @pseudo_palette: fake palette of 16 colors
     102             :  * @damage_clip: clip rectangle used with deferred_io to accumulate damage to
     103             :  *                the screen buffer
     104             :  * @damage_lock: spinlock protecting @damage_clip
     105             :  * @damage_work: worker used to flush the framebuffer
     106             :  * @resume_work: worker used during resume if the console lock is already taken
     107             :  *
     108             :  * This is the main structure used by the fbdev helpers. Drivers supporting
     109             :  * fbdev emulation should embedded this into their overall driver structure.
     110             :  * Drivers must also fill out a &struct drm_fb_helper_funcs with a few
     111             :  * operations.
     112             :  */
     113             : struct drm_fb_helper {
     114             :         /**
     115             :          * @client:
     116             :          *
     117             :          * DRM client used by the generic fbdev emulation.
     118             :          */
     119             :         struct drm_client_dev client;
     120             : 
     121             :         /**
     122             :          * @buffer:
     123             :          *
     124             :          * Framebuffer used by the generic fbdev emulation.
     125             :          */
     126             :         struct drm_client_buffer *buffer;
     127             : 
     128             :         struct drm_framebuffer *fb;
     129             :         struct drm_device *dev;
     130             :         const struct drm_fb_helper_funcs *funcs;
     131             :         struct fb_info *fbdev;
     132             :         u32 pseudo_palette[17];
     133             :         struct drm_clip_rect damage_clip;
     134             :         spinlock_t damage_lock;
     135             :         struct work_struct damage_work;
     136             :         struct work_struct resume_work;
     137             : 
     138             :         /**
     139             :          * @lock:
     140             :          *
     141             :          * Top-level FBDEV helper lock. This protects all internal data
     142             :          * structures and lists, such as @connector_info and @crtc_info.
     143             :          *
     144             :          * FIXME: fbdev emulation locking is a mess and long term we want to
     145             :          * protect all helper internal state with this lock as well as reduce
     146             :          * core KMS locking as much as possible.
     147             :          */
     148             :         struct mutex lock;
     149             : 
     150             :         /**
     151             :          * @kernel_fb_list:
     152             :          *
     153             :          * Entry on the global kernel_fb_helper_list, used for kgdb entry/exit.
     154             :          */
     155             :         struct list_head kernel_fb_list;
     156             : 
     157             :         /**
     158             :          * @delayed_hotplug:
     159             :          *
     160             :          * A hotplug was received while fbdev wasn't in control of the DRM
     161             :          * device, i.e. another KMS master was active. The output configuration
     162             :          * needs to be reprobe when fbdev is in control again.
     163             :          */
     164             :         bool delayed_hotplug;
     165             : 
     166             :         /**
     167             :          * @deferred_setup:
     168             :          *
     169             :          * If no outputs are connected (disconnected or unknown) the FB helper
     170             :          * code will defer setup until at least one of the outputs shows up.
     171             :          * This field keeps track of the status so that setup can be retried
     172             :          * at every hotplug event until it succeeds eventually.
     173             :          *
     174             :          * Protected by @lock.
     175             :          */
     176             :         bool deferred_setup;
     177             : 
     178             :         /**
     179             :          * @preferred_bpp:
     180             :          *
     181             :          * Temporary storage for the driver's preferred BPP setting passed to
     182             :          * FB helper initialization. This needs to be tracked so that deferred
     183             :          * FB helper setup can pass this on.
     184             :          *
     185             :          * See also: @deferred_setup
     186             :          */
     187             :         int preferred_bpp;
     188             : };
     189             : 
     190             : static inline struct drm_fb_helper *
     191             : drm_fb_helper_from_client(struct drm_client_dev *client)
     192             : {
     193             :         return container_of(client, struct drm_fb_helper, client);
     194             : }
     195             : 
     196             : /**
     197             :  * define DRM_FB_HELPER_DEFAULT_OPS - helper define for drm drivers
     198             :  *
     199             :  * Helper define to register default implementations of drm_fb_helper
     200             :  * functions. To be used in struct fb_ops of drm drivers.
     201             :  */
     202             : #define DRM_FB_HELPER_DEFAULT_OPS \
     203             :         .fb_check_var   = drm_fb_helper_check_var, \
     204             :         .fb_set_par     = drm_fb_helper_set_par, \
     205             :         .fb_setcmap     = drm_fb_helper_setcmap, \
     206             :         .fb_blank       = drm_fb_helper_blank, \
     207             :         .fb_pan_display = drm_fb_helper_pan_display, \
     208             :         .fb_debug_enter = drm_fb_helper_debug_enter, \
     209             :         .fb_debug_leave = drm_fb_helper_debug_leave, \
     210             :         .fb_ioctl       = drm_fb_helper_ioctl
     211             : 
     212             : #ifdef CONFIG_DRM_FBDEV_EMULATION
     213             : void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
     214             :                            const struct drm_fb_helper_funcs *funcs);
     215             : int drm_fb_helper_init(struct drm_device *dev, struct drm_fb_helper *helper);
     216             : void drm_fb_helper_fini(struct drm_fb_helper *helper);
     217             : int drm_fb_helper_blank(int blank, struct fb_info *info);
     218             : int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
     219             :                               struct fb_info *info);
     220             : int drm_fb_helper_set_par(struct fb_info *info);
     221             : int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
     222             :                             struct fb_info *info);
     223             : 
     224             : int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
     225             : 
     226             : struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);
     227             : void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);
     228             : void drm_fb_helper_fill_info(struct fb_info *info,
     229             :                              struct drm_fb_helper *fb_helper,
     230             :                              struct drm_fb_helper_surface_size *sizes);
     231             : 
     232             : void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist);
     233             : 
     234             : ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
     235             :                                size_t count, loff_t *ppos);
     236             : ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
     237             :                                 size_t count, loff_t *ppos);
     238             : 
     239             : void drm_fb_helper_sys_fillrect(struct fb_info *info,
     240             :                                 const struct fb_fillrect *rect);
     241             : void drm_fb_helper_sys_copyarea(struct fb_info *info,
     242             :                                 const struct fb_copyarea *area);
     243             : void drm_fb_helper_sys_imageblit(struct fb_info *info,
     244             :                                  const struct fb_image *image);
     245             : 
     246             : void drm_fb_helper_cfb_fillrect(struct fb_info *info,
     247             :                                 const struct fb_fillrect *rect);
     248             : void drm_fb_helper_cfb_copyarea(struct fb_info *info,
     249             :                                 const struct fb_copyarea *area);
     250             : void drm_fb_helper_cfb_imageblit(struct fb_info *info,
     251             :                                  const struct fb_image *image);
     252             : 
     253             : void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend);
     254             : void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper,
     255             :                                         bool suspend);
     256             : 
     257             : int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
     258             : 
     259             : int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
     260             :                         unsigned long arg);
     261             : 
     262             : int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
     263             : int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
     264             : int drm_fb_helper_debug_enter(struct fb_info *info);
     265             : int drm_fb_helper_debug_leave(struct fb_info *info);
     266             : 
     267             : void drm_fb_helper_lastclose(struct drm_device *dev);
     268             : void drm_fb_helper_output_poll_changed(struct drm_device *dev);
     269             : 
     270             : void drm_fbdev_generic_setup(struct drm_device *dev,
     271             :                              unsigned int preferred_bpp);
     272             : #else
     273             : static inline void drm_fb_helper_prepare(struct drm_device *dev,
     274             :                                         struct drm_fb_helper *helper,
     275             :                                         const struct drm_fb_helper_funcs *funcs)
     276             : {
     277             : }
     278             : 
     279             : static inline int drm_fb_helper_init(struct drm_device *dev,
     280             :                        struct drm_fb_helper *helper)
     281             : {
     282             :         /* So drivers can use it to free the struct */
     283             :         helper->dev = dev;
     284             :         dev->fb_helper = helper;
     285             : 
     286             :         return 0;
     287             : }
     288             : 
     289             : static inline void drm_fb_helper_fini(struct drm_fb_helper *helper)
     290             : {
     291             :         if (helper && helper->dev)
     292             :                 helper->dev->fb_helper = NULL;
     293             : }
     294             : 
     295             : static inline int drm_fb_helper_blank(int blank, struct fb_info *info)
     296             : {
     297             :         return 0;
     298             : }
     299             : 
     300             : static inline int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
     301             :                                             struct fb_info *info)
     302             : {
     303             :         return 0;
     304             : }
     305             : 
     306             : static inline int drm_fb_helper_set_par(struct fb_info *info)
     307             : {
     308             :         return 0;
     309             : }
     310             : 
     311             : static inline int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
     312             :                                           struct fb_info *info)
     313             : {
     314             :         return 0;
     315             : }
     316             : 
     317             : static inline int
     318             : drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
     319             : {
     320             :         return 0;
     321             : }
     322             : 
     323             : static inline struct fb_info *
     324             : drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
     325             : {
     326             :         return NULL;
     327             : }
     328             : 
     329             : static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
     330             : {
     331             : }
     332             : 
     333             : static inline void
     334             : drm_fb_helper_fill_info(struct fb_info *info,
     335             :                         struct drm_fb_helper *fb_helper,
     336             :                         struct drm_fb_helper_surface_size *sizes)
     337             : {
     338             : }
     339             : 
     340             : static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap,
     341             :                                         struct fb_info *info)
     342             : {
     343             :         return 0;
     344             : }
     345             : 
     346             : static inline int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
     347             :                                       unsigned long arg)
     348             : {
     349             :         return 0;
     350             : }
     351             : 
     352             : static inline void drm_fb_helper_deferred_io(struct fb_info *info,
     353             :                                              struct list_head *pagelist)
     354             : {
     355             : }
     356             : 
     357             : static inline int drm_fb_helper_defio_init(struct drm_fb_helper *fb_helper)
     358             : {
     359             :         return -ENODEV;
     360             : }
     361             : 
     362             : static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info,
     363             :                                              char __user *buf, size_t count,
     364             :                                              loff_t *ppos)
     365             : {
     366             :         return -ENODEV;
     367             : }
     368             : 
     369             : static inline ssize_t drm_fb_helper_sys_write(struct fb_info *info,
     370             :                                               const char __user *buf,
     371             :                                               size_t count, loff_t *ppos)
     372             : {
     373             :         return -ENODEV;
     374             : }
     375             : 
     376             : static inline void drm_fb_helper_sys_fillrect(struct fb_info *info,
     377             :                                               const struct fb_fillrect *rect)
     378             : {
     379             : }
     380             : 
     381             : static inline void drm_fb_helper_sys_copyarea(struct fb_info *info,
     382             :                                               const struct fb_copyarea *area)
     383             : {
     384             : }
     385             : 
     386             : static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
     387             :                                                const struct fb_image *image)
     388             : {
     389             : }
     390             : 
     391             : static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info,
     392             :                                               const struct fb_fillrect *rect)
     393             : {
     394             : }
     395             : 
     396             : static inline void drm_fb_helper_cfb_copyarea(struct fb_info *info,
     397             :                                               const struct fb_copyarea *area)
     398             : {
     399             : }
     400             : 
     401             : static inline void drm_fb_helper_cfb_imageblit(struct fb_info *info,
     402             :                                                const struct fb_image *image)
     403             : {
     404             : }
     405             : 
     406             : static inline void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper,
     407             :                                              bool suspend)
     408             : {
     409             : }
     410             : 
     411             : static inline void
     412             : drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, bool suspend)
     413             : {
     414             : }
     415             : 
     416             : static inline int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
     417             : {
     418             :         return 0;
     419             : }
     420             : 
     421             : static inline int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper,
     422             :                                                int bpp_sel)
     423             : {
     424             :         return 0;
     425             : }
     426             : 
     427             : static inline int drm_fb_helper_debug_enter(struct fb_info *info)
     428             : {
     429             :         return 0;
     430             : }
     431             : 
     432             : static inline int drm_fb_helper_debug_leave(struct fb_info *info)
     433             : {
     434             :         return 0;
     435             : }
     436             : 
     437             : static inline void drm_fb_helper_lastclose(struct drm_device *dev)
     438             : {
     439             : }
     440             : 
     441           0 : static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
     442             : {
     443           0 : }
     444             : 
     445             : static inline void
     446             : drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
     447             : {
     448             : }
     449             : 
     450             : #endif
     451             : 
     452             : #endif

Generated by: LCOV version 1.14