cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_fb_helper.h (13008B)


      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
     33struct 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
     40enum 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 */
     62struct 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 */
     76struct 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 */
    113struct 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
    190static inline struct drm_fb_helper *
    191drm_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
    213void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
    214			   const struct drm_fb_helper_funcs *funcs);
    215int drm_fb_helper_init(struct drm_device *dev, struct drm_fb_helper *helper);
    216void drm_fb_helper_fini(struct drm_fb_helper *helper);
    217int drm_fb_helper_blank(int blank, struct fb_info *info);
    218int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
    219			      struct fb_info *info);
    220int drm_fb_helper_set_par(struct fb_info *info);
    221int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
    222			    struct fb_info *info);
    223
    224int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
    225
    226struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);
    227void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);
    228void 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
    232void drm_fb_helper_deferred_io(struct fb_info *info, struct list_head *pagereflist);
    233
    234ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
    235			       size_t count, loff_t *ppos);
    236ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
    237				size_t count, loff_t *ppos);
    238
    239void drm_fb_helper_sys_fillrect(struct fb_info *info,
    240				const struct fb_fillrect *rect);
    241void drm_fb_helper_sys_copyarea(struct fb_info *info,
    242				const struct fb_copyarea *area);
    243void drm_fb_helper_sys_imageblit(struct fb_info *info,
    244				 const struct fb_image *image);
    245
    246void drm_fb_helper_cfb_fillrect(struct fb_info *info,
    247				const struct fb_fillrect *rect);
    248void drm_fb_helper_cfb_copyarea(struct fb_info *info,
    249				const struct fb_copyarea *area);
    250void drm_fb_helper_cfb_imageblit(struct fb_info *info,
    251				 const struct fb_image *image);
    252
    253void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, bool suspend);
    254void drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper,
    255					bool suspend);
    256
    257int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
    258
    259int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
    260			unsigned long arg);
    261
    262int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
    263int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
    264int drm_fb_helper_debug_enter(struct fb_info *info);
    265int drm_fb_helper_debug_leave(struct fb_info *info);
    266
    267void drm_fb_helper_lastclose(struct drm_device *dev);
    268void drm_fb_helper_output_poll_changed(struct drm_device *dev);
    269
    270void drm_fbdev_generic_setup(struct drm_device *dev,
    271			     unsigned int preferred_bpp);
    272#else
    273static 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
    279static 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
    289static 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
    295static inline int drm_fb_helper_blank(int blank, struct fb_info *info)
    296{
    297	return 0;
    298}
    299
    300static inline int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
    301					    struct fb_info *info)
    302{
    303	return 0;
    304}
    305
    306static inline int drm_fb_helper_set_par(struct fb_info *info)
    307{
    308	return 0;
    309}
    310
    311static inline int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
    312					  struct fb_info *info)
    313{
    314	return 0;
    315}
    316
    317static inline int
    318drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
    319{
    320	return 0;
    321}
    322
    323static inline struct fb_info *
    324drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
    325{
    326	return NULL;
    327}
    328
    329static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
    330{
    331}
    332
    333static inline void
    334drm_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
    340static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap,
    341					struct fb_info *info)
    342{
    343	return 0;
    344}
    345
    346static inline int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
    347				      unsigned long arg)
    348{
    349	return 0;
    350}
    351
    352static inline void drm_fb_helper_deferred_io(struct fb_info *info,
    353					     struct list_head *pagelist)
    354{
    355}
    356
    357static inline int drm_fb_helper_defio_init(struct drm_fb_helper *fb_helper)
    358{
    359	return -ENODEV;
    360}
    361
    362static 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
    369static 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
    376static inline void drm_fb_helper_sys_fillrect(struct fb_info *info,
    377					      const struct fb_fillrect *rect)
    378{
    379}
    380
    381static inline void drm_fb_helper_sys_copyarea(struct fb_info *info,
    382					      const struct fb_copyarea *area)
    383{
    384}
    385
    386static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
    387					       const struct fb_image *image)
    388{
    389}
    390
    391static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info,
    392					      const struct fb_fillrect *rect)
    393{
    394}
    395
    396static inline void drm_fb_helper_cfb_copyarea(struct fb_info *info,
    397					      const struct fb_copyarea *area)
    398{
    399}
    400
    401static inline void drm_fb_helper_cfb_imageblit(struct fb_info *info,
    402					       const struct fb_image *image)
    403{
    404}
    405
    406static inline void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper,
    407					     bool suspend)
    408{
    409}
    410
    411static inline void
    412drm_fb_helper_set_suspend_unlocked(struct drm_fb_helper *fb_helper, bool suspend)
    413{
    414}
    415
    416static inline int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
    417{
    418	return 0;
    419}
    420
    421static inline int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper,
    422					       int bpp_sel)
    423{
    424	return 0;
    425}
    426
    427static inline int drm_fb_helper_debug_enter(struct fb_info *info)
    428{
    429	return 0;
    430}
    431
    432static inline int drm_fb_helper_debug_leave(struct fb_info *info)
    433{
    434	return 0;
    435}
    436
    437static inline void drm_fb_helper_lastclose(struct drm_device *dev)
    438{
    439}
    440
    441static inline void drm_fb_helper_output_poll_changed(struct drm_device *dev)
    442{
    443}
    444
    445static inline void
    446drm_fbdev_generic_setup(struct drm_device *dev, unsigned int preferred_bpp)
    447{
    448}
    449
    450#endif
    451
    452#endif