Subversion Repositories Kolibri OS

Rev

Rev 6936 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1408 serge 1
/*
2
 * Copyright (c) 2006-2009 Red Hat Inc.
3
 * Copyright (c) 2006-2008 Intel Corporation
4
 * Copyright (c) 2007 Dave Airlie 
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 
28
 *      Jesse Barnes 
29
 */
30
#ifndef DRM_FB_HELPER_H
31
#define DRM_FB_HELPER_H
32
 
1964 serge 33
struct drm_fb_helper;
34
 
5056 serge 35
#include 
1964 serge 36
 
6936 serge 37
enum mode_set_atomic {
38
	LEAVE_ATOMIC_MODE_SET,
39
	ENTER_ATOMIC_MODE_SET,
40
};
41
 
5270 serge 42
struct drm_fb_offset {
43
	int x, y;
44
};
45
 
1408 serge 46
struct drm_fb_helper_crtc {
47
	struct drm_mode_set mode_set;
1964 serge 48
	struct drm_display_mode *desired_mode;
5270 serge 49
	int x, y;
1408 serge 50
};
51
 
6082 serge 52
/**
53
 * struct drm_fb_helper_surface_size - describes fbdev size and scanout surface size
54
 * @fb_width: fbdev width
55
 * @fb_height: fbdev height
56
 * @surface_width: scanout buffer width
57
 * @surface_height: scanout buffer height
58
 * @surface_bpp: scanout buffer bpp
59
 * @surface_depth: scanout buffer depth
60
 *
61
 * Note that the scanout surface width/height may be larger than the fbdev
62
 * width/height.  In case of multiple displays, the scanout surface is sized
63
 * according to the largest width/height (so it is large enough for all CRTCs
64
 * to scanout).  But the fbdev width/height is sized to the minimum width/
65
 * height of all the displays.  This ensures that fbcon fits on the smallest
66
 * of the attached displays.
67
 *
68
 * So what is passed to drm_fb_helper_fill_var() should be fb_width/fb_height,
69
 * rather than the surface size.
70
 */
1964 serge 71
struct drm_fb_helper_surface_size {
72
	u32 fb_width;
73
	u32 fb_height;
74
	u32 surface_width;
75
	u32 surface_height;
76
	u32 surface_bpp;
77
	u32 surface_depth;
78
};
1408 serge 79
 
3391 Serge 80
/**
81
 * struct drm_fb_helper_funcs - driver callbacks for the fbdev emulation library
82
 *
83
 * Driver callbacks used by the fbdev emulation helper library.
84
 */
1408 serge 85
struct drm_fb_helper_funcs {
6936 serge 86
	/**
87
	 * @gamma_set:
88
	 *
89
	 * Set the given gamma LUT register on the given CRTC.
90
	 *
91
	 * This callback is optional.
92
	 *
93
	 * FIXME:
94
	 *
95
	 * This callback is functionally redundant with the core gamma table
96
	 * support and simply exists because the fbdev hasn't yet been
97
	 * refactored to use the core gamma table interfaces.
98
	 */
1408 serge 99
	void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green,
100
			  u16 blue, int regno);
6936 serge 101
	/**
102
	 * @gamma_get:
103
	 *
104
	 * Read the given gamma LUT register on the given CRTC, used to save the
105
	 * current LUT when force-restoring the fbdev for e.g. kdbg.
106
	 *
107
	 * This callback is optional.
108
	 *
109
	 * FIXME:
110
	 *
111
	 * This callback is functionally redundant with the core gamma table
112
	 * support and simply exists because the fbdev hasn't yet been
113
	 * refactored to use the core gamma table interfaces.
114
	 */
1408 serge 115
	void (*gamma_get)(struct drm_crtc *crtc, u16 *red, u16 *green,
116
			  u16 *blue, int regno);
117
 
6936 serge 118
	/**
119
	 * @fb_probe:
120
	 *
121
	 * Driver callback to allocate and initialize the fbdev info structure.
122
	 * Furthermore it also needs to allocate the DRM framebuffer used to
123
	 * back the fbdev.
124
	 *
125
	 * This callback is mandatory.
126
	 *
127
	 * RETURNS:
128
	 *
129
	 * The driver should return 0 on success and a negative error code on
130
	 * failure.
131
	 */
1964 serge 132
	int (*fb_probe)(struct drm_fb_helper *helper,
133
			struct drm_fb_helper_surface_size *sizes);
6936 serge 134
 
135
	/**
136
	 * @initial_config:
137
	 *
138
	 * Driver callback to setup an initial fbdev display configuration.
139
	 * Drivers can use this callback to tell the fbdev emulation what the
140
	 * preferred initial configuration is. This is useful to implement
141
	 * smooth booting where the fbdev (and subsequently all userspace) never
142
	 * changes the mode, but always inherits the existing configuration.
143
	 *
144
	 * This callback is optional.
145
	 *
146
	 * RETURNS:
147
	 *
148
	 * The driver should return true if a suitable initial configuration has
149
	 * been filled out and false when the fbdev helper should fall back to
150
	 * the default probing logic.
151
	 */
3747 Serge 152
	bool (*initial_config)(struct drm_fb_helper *fb_helper,
153
			       struct drm_fb_helper_crtc **crtcs,
154
			       struct drm_display_mode **modes,
5270 serge 155
			       struct drm_fb_offset *offsets,
3747 Serge 156
			       bool *enabled, int width, int height);
1408 serge 157
};
158
 
159
struct drm_fb_helper_connector {
1964 serge 160
	struct drm_connector *connector;
1408 serge 161
};
162
 
6082 serge 163
/**
6936 serge 164
 * struct drm_fb_helper - main structure to emulate fbdev on top of KMS
7143 serge 165
 * @fb: Scanout framebuffer object
166
 * @dev: DRM device
6082 serge 167
 * @crtc_count: number of possible CRTCs
168
 * @crtc_info: per-CRTC helper state (mode, x/y offset, etc)
169
 * @connector_count: number of connected connectors
170
 * @connector_info_alloc_count: size of connector_info
6936 serge 171
 * @connector_info: array of per-connector information
6082 serge 172
 * @funcs: driver callbacks for fb helper
173
 * @fbdev: emulated fbdev device info struct
174
 * @pseudo_palette: fake palette of 16 colors
6936 serge 175
 *
176
 * This is the main structure used by the fbdev helpers. Drivers supporting
177
 * fbdev emulation should embedded this into their overall driver structure.
178
 * Drivers must also fill out a struct &drm_fb_helper_funcs with a few
179
 * operations.
6082 serge 180
 */
1408 serge 181
struct drm_fb_helper {
182
	struct drm_framebuffer *fb;
183
	struct drm_device *dev;
184
	int crtc_count;
185
	struct drm_fb_helper_crtc *crtc_info;
1964 serge 186
	int connector_count;
5056 serge 187
	int connector_info_alloc_count;
1964 serge 188
	struct drm_fb_helper_connector **connector_info;
5056 serge 189
	const struct drm_fb_helper_funcs *funcs;
1964 serge 190
	struct fb_info *fbdev;
191
	u32 pseudo_palette[17];
6936 serge 192
 
193
	/**
194
	 * @kernel_fb_list:
195
	 *
196
	 * Entry on the global kernel_fb_helper_list, used for kgdb entry/exit.
197
	 */
1408 serge 198
	struct list_head kernel_fb_list;
1964 serge 199
 
6936 serge 200
	/**
201
	 * @delayed_hotplug:
202
	 *
203
	 * A hotplug was received while fbdev wasn't in control of the DRM
204
	 * device, i.e. another KMS master was active. The output configuration
205
	 * needs to be reprobe when fbdev is in control again.
206
	 */
1964 serge 207
	bool delayed_hotplug;
6082 serge 208
 
209
	/**
210
	 * @atomic:
211
	 *
212
	 * Use atomic updates for restore_fbdev_mode(), etc.  This defaults to
213
	 * true if driver has DRIVER_ATOMIC feature flag, but drivers can
214
	 * override it to true after drm_fb_helper_init() if they support atomic
215
	 * modeset but do not yet advertise DRIVER_ATOMIC (note that fb-helper
216
	 * does not require ASYNC commits).
217
	 */
218
	bool atomic;
1408 serge 219
};
220
 
6082 serge 221
#ifdef CONFIG_DRM_FBDEV_EMULATION
7143 serge 222
int drm_fb_helper_modinit(void);
5056 serge 223
void drm_fb_helper_prepare(struct drm_device *dev, struct drm_fb_helper *helper,
224
			   const struct drm_fb_helper_funcs *funcs);
1964 serge 225
int drm_fb_helper_init(struct drm_device *dev,
226
		       struct drm_fb_helper *helper, int crtc_count,
6082 serge 227
		       int max_conn);
1964 serge 228
void drm_fb_helper_fini(struct drm_fb_helper *helper);
1408 serge 229
int drm_fb_helper_blank(int blank, struct fb_info *info);
230
int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
231
			      struct fb_info *info);
232
int drm_fb_helper_set_par(struct fb_info *info);
233
int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
234
			    struct fb_info *info);
235
 
6082 serge 236
int drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper);
237
 
238
struct fb_info *drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper);
239
void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper);
240
void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper);
1964 serge 241
void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helper,
1408 serge 242
			    uint32_t fb_width, uint32_t fb_height);
243
void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
244
			    uint32_t depth);
245
 
6082 serge 246
void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper);
247
 
248
ssize_t drm_fb_helper_sys_read(struct fb_info *info, char __user *buf,
249
			       size_t count, loff_t *ppos);
250
ssize_t drm_fb_helper_sys_write(struct fb_info *info, const char __user *buf,
251
				size_t count, loff_t *ppos);
252
 
253
void drm_fb_helper_sys_fillrect(struct fb_info *info,
254
				const struct fb_fillrect *rect);
255
void drm_fb_helper_sys_copyarea(struct fb_info *info,
256
				const struct fb_copyarea *area);
257
void drm_fb_helper_sys_imageblit(struct fb_info *info,
258
				 const struct fb_image *image);
259
 
260
void drm_fb_helper_cfb_fillrect(struct fb_info *info,
261
				const struct fb_fillrect *rect);
262
void drm_fb_helper_cfb_copyarea(struct fb_info *info,
263
				const struct fb_copyarea *area);
264
void drm_fb_helper_cfb_imageblit(struct fb_info *info,
265
				 const struct fb_image *image);
266
 
267
void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper, int state);
268
 
1408 serge 269
int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info);
270
 
1964 serge 271
int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
6082 serge 272
int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel);
1964 serge 273
int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper);
274
int drm_fb_helper_debug_enter(struct fb_info *info);
275
int drm_fb_helper_debug_leave(struct fb_info *info);
5056 serge 276
struct drm_display_mode *
277
drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
278
			int width, int height);
279
struct drm_display_mode *
280
drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
281
		      int width, int height);
1964 serge 282
 
5056 serge 283
int drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper, struct drm_connector *connector);
284
int drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
285
				       struct drm_connector *connector);
6082 serge 286
#else
7143 serge 287
static inline int drm_fb_helper_modinit(void)
288
{
289
	return 0;
290
}
291
 
6082 serge 292
static inline void drm_fb_helper_prepare(struct drm_device *dev,
293
					struct drm_fb_helper *helper,
294
					const struct drm_fb_helper_funcs *funcs)
295
{
296
}
297
 
298
static inline int drm_fb_helper_init(struct drm_device *dev,
299
		       struct drm_fb_helper *helper, int crtc_count,
300
		       int max_conn)
301
{
302
	return 0;
303
}
304
 
305
static inline void drm_fb_helper_fini(struct drm_fb_helper *helper)
306
{
307
}
308
 
309
static inline int drm_fb_helper_blank(int blank, struct fb_info *info)
310
{
311
	return 0;
312
}
313
 
314
static inline int drm_fb_helper_pan_display(struct fb_var_screeninfo *var,
315
					    struct fb_info *info)
316
{
317
	return 0;
318
}
319
 
320
static inline int drm_fb_helper_set_par(struct fb_info *info)
321
{
322
	return 0;
323
}
324
 
325
static inline int drm_fb_helper_check_var(struct fb_var_screeninfo *var,
326
					  struct fb_info *info)
327
{
328
	return 0;
329
}
330
 
331
static inline int
332
drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper)
333
{
334
	return 0;
335
}
336
 
337
static inline struct fb_info *
338
drm_fb_helper_alloc_fbi(struct drm_fb_helper *fb_helper)
339
{
340
	return NULL;
341
}
342
 
343
static inline void drm_fb_helper_unregister_fbi(struct drm_fb_helper *fb_helper)
344
{
345
}
346
static inline void drm_fb_helper_release_fbi(struct drm_fb_helper *fb_helper)
347
{
348
}
349
 
350
static inline void drm_fb_helper_fill_var(struct fb_info *info,
351
					  struct drm_fb_helper *fb_helper,
352
					  uint32_t fb_width, uint32_t fb_height)
353
{
354
}
355
 
356
static inline void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch,
357
					  uint32_t depth)
358
{
359
}
360
 
361
static inline int drm_fb_helper_setcmap(struct fb_cmap *cmap,
362
					struct fb_info *info)
363
{
364
	return 0;
365
}
366
 
367
static inline void drm_fb_helper_unlink_fbi(struct drm_fb_helper *fb_helper)
368
{
369
}
370
 
371
static inline ssize_t drm_fb_helper_sys_read(struct fb_info *info,
372
					     char __user *buf, size_t count,
373
					     loff_t *ppos)
374
{
375
	return -ENODEV;
376
}
377
 
378
static inline ssize_t drm_fb_helper_sys_write(struct fb_info *info,
379
					      const char __user *buf,
380
					      size_t count, loff_t *ppos)
381
{
382
	return -ENODEV;
383
}
384
 
385
static inline void drm_fb_helper_sys_fillrect(struct fb_info *info,
386
					      const struct fb_fillrect *rect)
387
{
388
}
389
 
390
static inline void drm_fb_helper_sys_copyarea(struct fb_info *info,
391
					      const struct fb_copyarea *area)
392
{
393
}
394
 
395
static inline void drm_fb_helper_sys_imageblit(struct fb_info *info,
396
					       const struct fb_image *image)
397
{
398
}
399
 
400
static inline void drm_fb_helper_cfb_fillrect(struct fb_info *info,
401
					      const struct fb_fillrect *rect)
402
{
403
}
404
 
405
static inline void drm_fb_helper_cfb_copyarea(struct fb_info *info,
406
					      const struct fb_copyarea *area)
407
{
408
}
409
 
410
static inline void drm_fb_helper_cfb_imageblit(struct fb_info *info,
411
					       const struct fb_image *image)
412
{
413
}
414
 
415
static inline void drm_fb_helper_set_suspend(struct drm_fb_helper *fb_helper,
416
					     int state)
417
{
418
}
419
 
420
static inline int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
421
{
422
	return 0;
423
}
424
 
425
static inline int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper,
426
					       int bpp_sel)
427
{
428
	return 0;
429
}
430
 
431
static inline int
432
drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper)
433
{
434
	return 0;
435
}
436
 
437
static inline int drm_fb_helper_debug_enter(struct fb_info *info)
438
{
439
	return 0;
440
}
441
 
442
static inline int drm_fb_helper_debug_leave(struct fb_info *info)
443
{
444
	return 0;
445
}
446
 
447
static inline struct drm_display_mode *
448
drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector,
449
		       int width, int height)
450
{
451
	return NULL;
452
}
453
 
454
static inline struct drm_display_mode *
455
drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn,
456
		      int width, int height)
457
{
458
	return NULL;
459
}
460
 
461
static inline int
462
drm_fb_helper_add_one_connector(struct drm_fb_helper *fb_helper,
463
				struct drm_connector *connector)
464
{
465
	return 0;
466
}
467
 
468
static inline int
469
drm_fb_helper_remove_one_connector(struct drm_fb_helper *fb_helper,
470
				   struct drm_connector *connector)
471
{
472
	return 0;
473
}
1408 serge 474
#endif
6082 serge 475
#endif