Home | History | Annotate | Line # | Download | only in drm
drm_fb_helper.h revision 1.6.28.1
      1 /*	$NetBSD: drm_fb_helper.h,v 1.6.28.1 2018/09/06 06:56:35 pgoyette Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2006-2009 Red Hat Inc.
      5  * Copyright (c) 2006-2008 Intel Corporation
      6  * Copyright (c) 2007 Dave Airlie <airlied (at) linux.ie>
      7  *
      8  * DRM framebuffer helper functions
      9  *
     10  * Permission to use, copy, modify, distribute, and sell this software and its
     11  * documentation for any purpose is hereby granted without fee, provided that
     12  * the above copyright notice appear in all copies and that both that copyright
     13  * notice and this permission notice appear in supporting documentation, and
     14  * that the name of the copyright holders not be used in advertising or
     15  * publicity pertaining to distribution of the software without specific,
     16  * written prior permission.  The copyright holders make no representations
     17  * about the suitability of this software for any purpose.  It is provided "as
     18  * is" without express or implied warranty.
     19  *
     20  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     21  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     22  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     23  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
     24  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
     25  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
     26  * OF THIS SOFTWARE.
     27  *
     28  * Authors:
     29  *      Dave Airlie <airlied (at) linux.ie>
     30  *      Jesse Barnes <jesse.barnes (at) intel.com>
     31  */
     32 #ifndef DRM_FB_HELPER_H
     33 #define DRM_FB_HELPER_H
     34 
     35 struct drm_fb_helper;
     36 
     37 #include <linux/kgdb.h>
     38 
     39 #ifdef __NetBSD__
     40 #include <sys/device_if.h>
     41 #endif
     42 
     43 struct drm_fb_offset {
     44 	int x, y;
     45 };
     46 
     47 struct drm_fb_helper_crtc {
     48 	struct drm_mode_set mode_set;
     49 	struct drm_display_mode *desired_mode;
     50 	int x, y;
     51 };
     52 
     53 /**
     54  * struct drm_fb_helper_surface_size - describes fbdev size and scanout surface size
     55  * @fb_width: fbdev width
     56  * @fb_height: fbdev height
     57  * @surface_width: scanout buffer width
     58  * @surface_height: scanout buffer height
     59  * @surface_bpp: scanout buffer bpp
     60  * @surface_depth: scanout buffer depth
     61  *
     62  * Note that the scanout surface width/height may be larger than the fbdev
     63  * width/height.  In case of multiple displays, the scanout surface is sized
     64  * according to the largest width/height (so it is large enough for all CRTCs
     65  * to scanout).  But the fbdev width/height is sized to the minimum width/
     66  * height of all the displays.  This ensures that fbcon fits on the smallest
     67  * of the attached displays.
     68  *
     69  * So what is passed to drm_fb_helper_fill_var() should be fb_width/fb_height,
     70  * rather than the surface size.
     71  */
     72 struct drm_fb_helper_surface_size {
     73 	u32 fb_width;
     74 	u32 fb_height;
     75 	u32 surface_width;
     76 	u32 surface_height;
     77 	u32 surface_bpp;
     78 	u32 surface_depth;
     79 };
     80 
     81 /**
     82  * struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library
     83  * @gamma_set: Set the given gamma lut register on the given crtc.
     84  * @gamma_get: Read the given gamma lut register on the given crtc, used to
     85  *             save the current lut when force-restoring the fbdev for e.g.
     86  *             kdbg.
     87  * @fb_probe: Driver callback to allocate and initialize the fbdev info
     88  *            structure. Furthermore it also needs to allocate the drm
     89  *            framebuffer used to back the fbdev.
     90  * @initial_config: Setup an initial fbdev display configuration
     91  *
     92  * Driver callbacks used by the fbdev emulation helper library.
     93  */
     94 struct drm_fb_helper_funcs {
     95 	void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,
     96 			  u16 blue, int regno);
     97 	void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green,
     98 			  u16 *blue, int regno);
     99 
    100 	int (*fb_probe)(struct drm_fb_helper *helper,
    101 			struct drm_fb_helper_surface_size *sizes);
    102 	bool (*initial_config)(struct drm_fb_helper *fb_helper,
    103 			       struct drm_fb_helper_crtc **crtcs,
    104 			       struct drm_display_mode **modes,
    105 			       struct drm_fb_offset *offsets,
    106 			       bool *enabled, int width, int height);
    107 };
    108 
    109 struct drm_fb_helper_connector {
    110 	struct drm_connector *connector;
    111 };
    112 
    113 /**
    114  * struct drm_fb_helper - helper to emulate fbdev on top of kms
    115  * @fb:  Scanout framebuffer object
    116  * @dev:  DRM device
    117  * @crtc_count: number of possible CRTCs
    118  * @crtc_info: per-CRTC helper state (mode, x/y offset, etc)
    119  * @connector_count: number of connected connectors
    120  * @connector_info_alloc_count: size of connector_info
    121  * @funcs: driver callbacks for fb helper
    122  * @fbdev: emulated fbdev device info struct
    123  * @pseudo_palette: fake palette of 16 colors
    124  * @kernel_fb_list: list_head in kernel_fb_helper_list
    125  * @delayed_hotplug: was there a hotplug while kms master active?
    126  */
    127 struct drm_fb_helper {
    128 	struct drm_framebuffer *fb;
    129 	struct drm_device *dev;
    130 	int crtc_count;
    131 	struct drm_fb_helper_crtc *crtc_info;
    132 	int connector_count;
    133 	int connector_info_alloc_count;
    134 	struct drm_fb_helper_connector **connector_info;
    135 	const struct drm_fb_helper_funcs *funcs;
    136 #ifdef __NetBSD__		/* XXX fb info */
    137 	device_t fbdev;
    138 #else
    139 	struct fb_info *fbdev;
    140 #endif
    141 	u32 pseudo_palette[17];
    142 	struct list_head kernel_fb_list;
    143 
    144 	/* we got a hotplug but fbdev wasn't running the console
    145 	   delay until next set_par */
    146 	bool delayed_hotplug;
    147 
    148 	/**
    149 	 * @atomic:
    150 	 *
    151 	 * Use atomic updates for restore_fbdev_mode(), etc.  This defaults to
    152 	 * true if driver has DRIVER_ATOMIC feature flag, but drivers can
    153 	 * override it to true after drm_fb_helper_init() if they support atomic
    154 	 * modeset but do not yet advertise DRIVER_ATOMIC (note that fb-helper
    155 	 * does not require ASYNC commits).
    156 	 */
    157 	bool atomic;
    158 };
    159 
    160 #ifdef CONFIG_DRM_FBDEV_EMULATION
    161 void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
    162 			   const struct drm_fb_helper_funcs *funcs);
    163 int drm_fb_helper_init(struct drm_device *dev,
    164 		       struct drm_fb_helper *helper, int crtc_count,
    165 		       int max_conn);
    166 void drm_fb_helper_fini(struct drm_fb_helper *helper);
    167 #ifndef __NetBSD__		/* XXX fb info */
    168 int drm_fb_helper_blank(int blank, struct fb_info *info);
    169 int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
    170 			      struct fb_info *info);
    171 int drm_fb_helper_set_par(struct fb_info *info);
    172 int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
    173 			    struct fb_info *info);
    174 #endif
    175 
    176 int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
    177 
    178 #ifndef __NetBSD__		/* XXX fb info */
    179 struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);
    180 void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);
    181 void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper);
    182 void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
    183 			    uint32_t fb_width, uint32_t fb_height);
    184 void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
    185 			    uint32_t depth);
    186 
    187 void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper);
    188 
    189 ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
    190 			       size_t count, loff_t *ppos);
    191 ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
    192 				size_t count, loff_t *ppos);
    193 
    194 void drm_fb_helper_sys_fillrect(struct fb_info *info,
    195 				const struct fb_fillrect *rect);
    196 void drm_fb_helper_sys_copyarea(struct fb_info *info,
    197 				const struct fb_copyarea *area);
    198 void drm_fb_helper_sys_imageblit(struct fb_info *info,
    199 				 const struct fb_image *image);
    200 
    201 void drm_fb_helper_cfb_fillrect(struct fb_info *info,
    202 				const struct fb_fillrect *rect);
    203 void drm_fb_helper_cfb_copyarea(struct fb_info *info,
    204 				const struct fb_copyarea *area);
    205 void drm_fb_helper_cfb_imageblit(struct fb_info *info,
    206 				 const struct fb_image *image);
    207 #endif
    208 
    209 void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state);
    210 
    211 #ifndef __NetBSD__		/* XXX fb cmap */
    212 int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
    213 #endif
    214 
    215 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
    216 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
    217 int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
    218 #ifndef __NetBSD__		/* XXX fb info */
    219 int drm_fb_helper_debug_enter(struct fb_info *info);
    220 int drm_fb_helper_debug_leave(struct fb_info *info);
    221 #endif
    222 int drm_fb_helper_debug_enter_fb(struct drm_fb_helper *fb_helper);
    223 int drm_fb_helper_debug_leave_fb(struct drm_fb_helper *fb_helper);
    224 struct drm_display_mode *
    225 drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
    226 			int width, int height);
    227 struct drm_display_mode *
    228 drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
    229 		      int width, int height);
    230 
    231 int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);
    232 int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
    233 				       struct drm_connector *connector);
    234 #else
    235 static inline void drm_fb_helper_prepare(struct drm_device *dev,
    236 					struct drm_fb_helper *helper,
    237 					const struct drm_fb_helper_funcs *funcs)
    238 {
    239 }
    240 
    241 static inline int drm_fb_helper_init(struct drm_device *dev,
    242 		       struct drm_fb_helper *helper, int crtc_count,
    243 		       int max_conn)
    244 {
    245 	return 0;
    246 }
    247 
    248 static inline void drm_fb_helper_fini(struct drm_fb_helper *helper)
    249 {
    250 }
    251 
    252 static inline int drm_fb_helper_blank(int blank, struct fb_info *info)
    253 {
    254 	return 0;
    255 }
    256 
    257 static inline int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
    258 					    struct fb_info *info)
    259 {
    260 	return 0;
    261 }
    262 
    263 static inline int drm_fb_helper_set_par(struct fb_info *info)
    264 {
    265 	return 0;
    266 }
    267 
    268 static inline int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
    269 					  struct fb_info *info)
    270 {
    271 	return 0;
    272 }
    273 
    274 static inline int
    275 drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
    276 {
    277 	return 0;
    278 }
    279 
    280 static inline struct fb_info *
    281 drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
    282 {
    283 	return NULL;
    284 }
    285 
    286 static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
    287 {
    288 }
    289 static inline void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper)
    290 {
    291 }
    292 
    293 static inline void drm_fb_helper_fill_var(struct fb_info *info,
    294 					  struct drm_fb_helper *fb_helper,
    295 					  uint32_t fb_width, uint32_t fb_height)
    296 {
    297 }
    298 
    299 static inline void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
    300 					  uint32_t depth)
    301 {
    302 }
    303 
    304 static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap,
    305 					struct fb_info *info)
    306 {
    307 	return 0;
    308 }
    309 
    310 static inline void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
    311 {
    312 }
    313 
    314 static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info,
    315 					     char __user *buf, size_t count,
    316 					     loff_t *ppos)
    317 {
    318 	return -ENODEV;
    319 }
    320 
    321 static inline ssize_t drm_fb_helper_sys_write(struct fb_info *info,
    322 					      const char __user *buf,
    323 					      size_t count, loff_t *ppos)
    324 {
    325 	return -ENODEV;
    326 }
    327 
    328 static inline void drm_fb_helper_sys_fillrect(struct fb_info *info,
    329 					      const struct fb_fillrect *rect)
    330 {
    331 }
    332 
    333 static inline void drm_fb_helper_sys_copyarea(struct fb_info *info,
    334 					      const struct fb_copyarea *area)
    335 {
    336 }
    337 
    338 static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
    339 					       const struct fb_image *image)
    340 {
    341 }
    342 
    343 static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info,
    344 					      const struct fb_fillrect *rect)
    345 {
    346 }
    347 
    348 static inline void drm_fb_helper_cfb_copyarea(struct fb_info *info,
    349 					      const struct fb_copyarea *area)
    350 {
    351 }
    352 
    353 static inline void drm_fb_helper_cfb_imageblit(struct fb_info *info,
    354 					       const struct fb_image *image)
    355 {
    356 }
    357 
    358 static inline void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper,
    359 					     int state)
    360 {
    361 }
    362 
    363 static inline int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
    364 {
    365 	return 0;
    366 }
    367 
    368 static inline int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper,
    369 					       int bpp_sel)
    370 {
    371 	return 0;
    372 }
    373 
    374 static inline int
    375 drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
    376 {
    377 	return 0;
    378 }
    379 
    380 static inline int drm_fb_helper_debug_enter(struct fb_info *info)
    381 {
    382 	return 0;
    383 }
    384 
    385 static inline int drm_fb_helper_debug_leave(struct fb_info *info)
    386 {
    387 	return 0;
    388 }
    389 
    390 static inline struct drm_display_mode *
    391 drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
    392 		       int width, int height)
    393 {
    394 	return NULL;
    395 }
    396 
    397 static inline struct drm_display_mode *
    398 drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
    399 		      int width, int height)
    400 {
    401 	return NULL;
    402 }
    403 
    404 static inline int
    405 drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper,
    406 				struct drm_connector *connector)
    407 {
    408 	return 0;
    409 }
    410 
    411 static inline int
    412 drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
    413 				   struct drm_connector *connector)
    414 {
    415 	return 0;
    416 }
    417 #endif
    418 #endif
    419