Subversion Repositories Kolibri OS

Rev

Rev 4103 | Rev 5056 | 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 © 2006 Keith Packard
3
 * Copyright © 2007-2008 Dave Airlie
4
 * Copyright © 2007-2008 Intel Corporation
5
 *   Jesse Barnes 
6
 *
7
 * Permission is hereby granted, free of charge, to any person obtaining a
8
 * copy of this software and associated documentation files (the "Software"),
9
 * to deal in the Software without restriction, including without limitation
10
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11
 * and/or sell copies of the Software, and to permit persons to whom the
12
 * Software is furnished to do so, subject to the following conditions:
13
 *
14
 * The above copyright notice and this permission notice shall be included in
15
 * all copies or substantial portions of the Software.
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
21
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
 * OTHER DEALINGS IN THE SOFTWARE.
24
 */
25
#ifndef __DRM_CRTC_H__
26
#define __DRM_CRTC_H__
27
 
28
#include 
1630 serge 29
#include 
1408 serge 30
#include 
31
#include 
32
#include 
4559 Serge 33
#include 
3031 serge 34
#include 
1408 serge 35
 
2967 Serge 36
#include 
37
 
1408 serge 38
struct drm_device;
39
struct drm_mode_set;
40
struct drm_framebuffer;
3031 serge 41
struct drm_object_properties;
3391 Serge 42
struct drm_file;
43
struct drm_clip_rect;
1408 serge 44
 
45
#define DRM_MODE_OBJECT_CRTC 0xcccccccc
46
#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
47
#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
48
#define DRM_MODE_OBJECT_MODE 0xdededede
49
#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
50
#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
51
#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
2967 Serge 52
#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
4103 Serge 53
#define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd
1408 serge 54
 
55
struct drm_mode_object {
56
	uint32_t id;
57
	uint32_t type;
3031 serge 58
	struct drm_object_properties *properties;
1408 serge 59
};
60
 
3031 serge 61
#define DRM_OBJECT_MAX_PROPERTY 24
62
struct drm_object_properties {
63
	int count;
64
	uint32_t ids[DRM_OBJECT_MAX_PROPERTY];
65
	uint64_t values[DRM_OBJECT_MAX_PROPERTY];
66
};
67
 
1408 serge 68
/*
69
 * Note on terminology:  here, for brevity and convenience, we refer to connector
70
 * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS,
71
 * DVI, etc.  And 'screen' refers to the whole of the visible display, which
72
 * may span multiple monitors (and therefore multiple CRTC and connector
73
 * structures).
74
 */
75
 
76
enum drm_mode_status {
77
    MODE_OK	= 0,	/* Mode OK */
78
    MODE_HSYNC,		/* hsync out of range */
79
    MODE_VSYNC,		/* vsync out of range */
80
    MODE_H_ILLEGAL,	/* mode has illegal horizontal timings */
81
    MODE_V_ILLEGAL,	/* mode has illegal horizontal timings */
82
    MODE_BAD_WIDTH,	/* requires an unsupported linepitch */
1964 serge 83
    MODE_NOMODE,	/* no mode with a matching name */
1408 serge 84
    MODE_NO_INTERLACE,	/* interlaced mode not supported */
85
    MODE_NO_DBLESCAN,	/* doublescan mode not supported */
86
    MODE_NO_VSCAN,	/* multiscan mode not supported */
87
    MODE_MEM,		/* insufficient video memory */
88
    MODE_VIRTUAL_X,	/* mode width too large for specified virtual size */
89
    MODE_VIRTUAL_Y,	/* mode height too large for specified virtual size */
90
    MODE_MEM_VIRT,	/* insufficient video memory given virtual size */
91
    MODE_NOCLOCK,	/* no fixed clock available */
92
    MODE_CLOCK_HIGH,	/* clock required is too high */
93
    MODE_CLOCK_LOW,	/* clock required is too low */
94
    MODE_CLOCK_RANGE,	/* clock/mode isn't in a ClockRange */
95
    MODE_BAD_HVALUE,	/* horizontal timing was out of range */
96
    MODE_BAD_VVALUE,	/* vertical timing was out of range */
97
    MODE_BAD_VSCAN,	/* VScan value out of range */
98
    MODE_HSYNC_NARROW,	/* horizontal sync too narrow */
99
    MODE_HSYNC_WIDE,	/* horizontal sync too wide */
100
    MODE_HBLANK_NARROW,	/* horizontal blanking too narrow */
101
    MODE_HBLANK_WIDE,	/* horizontal blanking too wide */
102
    MODE_VSYNC_NARROW,	/* vertical sync too narrow */
103
    MODE_VSYNC_WIDE,	/* vertical sync too wide */
104
    MODE_VBLANK_NARROW,	/* vertical blanking too narrow */
105
    MODE_VBLANK_WIDE,	/* vertical blanking too wide */
106
    MODE_PANEL,         /* exceeds panel dimensions */
107
    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */
108
    MODE_ONE_WIDTH,     /* only one width is supported */
109
    MODE_ONE_HEIGHT,    /* only one height is supported */
110
    MODE_ONE_SIZE,      /* only one resolution is supported */
111
    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */
4559 Serge 112
    MODE_NO_STEREO,	/* stereo modes not supported */
1408 serge 113
    MODE_UNVERIFIED = -3, /* mode needs to reverified */
114
    MODE_BAD = -2,	/* unspecified reason */
115
    MODE_ERROR	= -1	/* error condition */
116
};
117
 
118
#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \
119
				    DRM_MODE_TYPE_CRTC_C)
120
 
121
#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
122
	.name = nm, .status = 0, .type = (t), .clock = (c), \
123
	.hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
124
	.htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
125
	.vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
3747 Serge 126
	.vscan = (vs), .flags = (f), \
3031 serge 127
	.base.type = DRM_MODE_OBJECT_MODE
1408 serge 128
 
4559 Serge 129
#define CRTC_INTERLACE_HALVE_V	(1 << 0) /* halve V values for interlacing */
130
#define CRTC_STEREO_DOUBLE	(1 << 1) /* adjust timings for stereo modes */
1408 serge 131
 
4559 Serge 132
#define DRM_MODE_FLAG_3D_MAX	DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF
133
 
1408 serge 134
struct drm_display_mode {
135
	/* Header */
136
	struct list_head head;
137
	struct drm_mode_object base;
138
 
139
	char name[DRM_DISPLAY_MODE_LEN];
140
 
141
	enum drm_mode_status status;
3031 serge 142
	unsigned int type;
1408 serge 143
 
144
	/* Proposed mode values */
145
	int clock;		/* in kHz */
146
	int hdisplay;
147
	int hsync_start;
148
	int hsync_end;
149
	int htotal;
150
	int hskew;
151
	int vdisplay;
152
	int vsync_start;
153
	int vsync_end;
154
	int vtotal;
155
	int vscan;
156
	unsigned int flags;
157
 
158
	/* Addressable image size (may be 0 for projectors, etc.) */
159
	int width_mm;
160
	int height_mm;
161
 
162
	/* Actual mode we give to hw */
4559 Serge 163
	int crtc_clock;		/* in KHz */
1408 serge 164
	int crtc_hdisplay;
165
	int crtc_hblank_start;
166
	int crtc_hblank_end;
167
	int crtc_hsync_start;
168
	int crtc_hsync_end;
169
	int crtc_htotal;
170
	int crtc_hskew;
171
	int crtc_vdisplay;
172
	int crtc_vblank_start;
173
	int crtc_vblank_end;
174
	int crtc_vsync_start;
175
	int crtc_vsync_end;
176
	int crtc_vtotal;
177
 
178
	/* Driver private mode info */
179
	int private_size;
180
	int *private;
181
	int private_flags;
182
 
183
	int vrefresh;		/* in Hz */
184
	int hsync;		/* in kHz */
4559 Serge 185
	enum hdmi_picture_aspect picture_aspect_ratio;
1408 serge 186
};
187
 
4559 Serge 188
static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode)
189
{
190
	return mode->flags & DRM_MODE_FLAG_3D_MASK;
191
}
192
 
1408 serge 193
enum drm_connector_status {
194
	connector_status_connected = 1,
195
	connector_status_disconnected = 2,
196
	connector_status_unknown = 3,
197
};
198
 
199
enum subpixel_order {
200
	SubPixelUnknown = 0,
201
	SubPixelHorizontalRGB,
202
	SubPixelHorizontalBGR,
203
	SubPixelVerticalRGB,
204
	SubPixelVerticalBGR,
205
	SubPixelNone,
206
};
207
 
1964 serge 208
#define DRM_COLOR_FORMAT_RGB444		(1<<0)
209
#define DRM_COLOR_FORMAT_YCRCB444	(1<<1)
210
#define DRM_COLOR_FORMAT_YCRCB422	(1<<2)
1408 serge 211
/*
212
 * Describes a given display (e.g. CRT or flat panel) and its limitations.
213
 */
214
struct drm_display_info {
215
	char name[DRM_DISPLAY_INFO_LEN];
1964 serge 216
 
1408 serge 217
	/* Physical size */
218
        unsigned int width_mm;
219
	unsigned int height_mm;
220
 
221
	/* Clock limits FIXME: storage format */
222
	unsigned int min_vfreq, max_vfreq;
223
	unsigned int min_hfreq, max_hfreq;
224
	unsigned int pixel_clock;
1964 serge 225
	unsigned int bpc;
1408 serge 226
 
227
	enum subpixel_order subpixel_order;
1964 serge 228
	u32 color_formats;
1408 serge 229
 
2161 serge 230
	u8 cea_rev;
1408 serge 231
};
232
 
233
struct drm_framebuffer_funcs {
3031 serge 234
	/* note: use drm_framebuffer_remove() */
1408 serge 235
	void (*destroy)(struct drm_framebuffer *framebuffer);
236
	int (*create_handle)(struct drm_framebuffer *fb,
237
			     struct drm_file *file_priv,
238
			     unsigned int *handle);
239
	/**
240
	 * Optinal callback for the dirty fb ioctl.
241
	 *
242
	 * Userspace can notify the driver via this callback
243
	 * that a area of the framebuffer has changed and should
244
	 * be flushed to the display hardware.
245
	 *
246
	 * See documentation in drm_mode.h for the struct
247
	 * drm_mode_fb_dirty_cmd for more information as all
248
	 * the semantics and arguments have a one to one mapping
249
	 * on this function.
250
	 */
1964 serge 251
	int (*dirty)(struct drm_framebuffer *framebuffer,
252
		     struct drm_file *file_priv, unsigned flags,
1408 serge 253
		     unsigned color, struct drm_clip_rect *clips,
254
		     unsigned num_clips);
255
};
256
 
257
struct drm_framebuffer {
258
	struct drm_device *dev;
3262 Serge 259
	/*
260
	 * Note that the fb is refcounted for the benefit of driver internals,
261
	 * for example some hw, disabling a CRTC/plane is asynchronous, and
262
	 * scanout does not actually complete until the next vblank.  So some
263
	 * cleanup (like releasing the reference(s) on the backing GEM bo(s))
264
	 * should be deferred.  In cases like this, the driver would like to
265
	 * hold a ref to the fb even though it has already been removed from
266
	 * userspace perspective.
267
	 */
268
	struct kref refcount;
3391 Serge 269
	/*
270
	 * Place on the dev->mode_config.fb_list, access protected by
271
	 * dev->mode_config.fb_lock.
272
	 */
1408 serge 273
	struct list_head head;
274
	struct drm_mode_object base;
275
	const struct drm_framebuffer_funcs *funcs;
2967 Serge 276
	unsigned int pitches[4];
277
	unsigned int offsets[4];
1408 serge 278
	unsigned int width;
279
	unsigned int height;
280
	/* depth can be 15 or 16 */
281
	unsigned int depth;
282
	int bits_per_pixel;
283
	int flags;
2967 Serge 284
	uint32_t pixel_format; /* fourcc format */
1408 serge 285
	struct list_head filp_head;
286
	/* if you are using the helper */
287
	void *helper_private;
288
};
289
 
290
struct drm_property_blob {
291
	struct drm_mode_object base;
292
	struct list_head head;
293
	unsigned int length;
3031 serge 294
	unsigned char data[];
1408 serge 295
};
296
 
297
struct drm_property_enum {
298
	uint64_t value;
299
	struct list_head head;
300
	char name[DRM_PROP_NAME_LEN];
301
};
302
 
303
struct drm_property {
304
    struct      list_head head;
305
    struct      drm_mode_object base;
306
    uint32_t    flags;
307
    char        name[DRM_PROP_NAME_LEN];
308
    uint32_t    num_values;
309
    uint64_t    *values;
310
 
311
	struct list_head enum_blob_list;
312
};
313
 
314
struct drm_crtc;
315
struct drm_connector;
316
struct drm_encoder;
317
struct drm_pending_vblank_event;
2967 Serge 318
struct drm_plane;
4103 Serge 319
struct drm_bridge;
1408 serge 320
 
321
/**
322
 * drm_crtc_funcs - control CRTCs for a given device
3031 serge 323
 * @save: save CRTC state
324
 * @restore: restore CRTC state
3747 Serge 325
 * @reset: reset CRTC after state has been invalidated (e.g. resume)
3031 serge 326
 * @cursor_set: setup the cursor
327
 * @cursor_move: move the cursor
1408 serge 328
 * @gamma_set: specify color ramp for CRTC
3031 serge 329
 * @destroy: deinit and free object
330
 * @set_property: called when a property is changed
331
 * @set_config: apply a new CRTC configuration
332
 * @page_flip: initiate a page flip
1408 serge 333
 *
334
 * The drm_crtc_funcs structure is the central CRTC management structure
335
 * in the DRM.  Each CRTC controls one or more connectors (note that the name
336
 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
337
 * connectors, not just CRTs).
338
 *
339
 * Each driver is responsible for filling out this structure at startup time,
340
 * in addition to providing other modesetting features, like i2c and DDC
341
 * bus accessors.
342
 */
343
struct drm_crtc_funcs {
344
	/* Save CRTC state */
345
	void (*save)(struct drm_crtc *crtc); /* suspend? */
346
	/* Restore CRTC state */
347
	void (*restore)(struct drm_crtc *crtc); /* resume? */
1964 serge 348
	/* Reset CRTC state */
349
	void (*reset)(struct drm_crtc *crtc);
1408 serge 350
 
351
	/* cursor controls */
352
	int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
353
			  uint32_t handle, uint32_t width, uint32_t height);
4065 Serge 354
	int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
355
			   uint32_t handle, uint32_t width, uint32_t height,
356
			   int32_t hot_x, int32_t hot_y);
1408 serge 357
	int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
358
 
359
	/* Set gamma on the CRTC */
360
	void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
1964 serge 361
			  uint32_t start, uint32_t size);
1408 serge 362
	/* Object destroy routine */
363
	void (*destroy)(struct drm_crtc *crtc);
364
 
365
	int (*set_config)(struct drm_mode_set *set);
366
 
367
	/*
368
	 * Flip to the given framebuffer.  This implements the page
1964 serge 369
	 * flip ioctl described in drm_mode.h, specifically, the
1408 serge 370
	 * implementation must return immediately and block all
371
	 * rendering to the current fb until the flip has completed.
372
	 * If userspace set the event flag in the ioctl, the event
373
	 * argument will point to an event to send back when the flip
374
	 * completes, otherwise it will be NULL.
375
	 */
376
	int (*page_flip)(struct drm_crtc *crtc,
377
			 struct drm_framebuffer *fb,
4103 Serge 378
			 struct drm_pending_vblank_event *event,
379
			 uint32_t flags);
3031 serge 380
 
381
	int (*set_property)(struct drm_crtc *crtc,
382
			    struct drm_property *property, uint64_t val);
1408 serge 383
};
384
 
385
/**
386
 * drm_crtc - central CRTC control structure
2967 Serge 387
 * @dev: parent DRM device
388
 * @head: list management
389
 * @base: base KMS object for ID tracking etc.
1408 serge 390
 * @enabled: is this CRTC enabled?
2967 Serge 391
 * @mode: current mode timings
392
 * @hwmode: mode timings as programmed to hw regs
3031 serge 393
 * @invert_dimensions: for purposes of error checking crtc vs fb sizes,
394
 *    invert the width/height of the crtc.  This is used if the driver
395
 *    is performing 90 or 270 degree rotated scanout
1408 serge 396
 * @x: x position on screen
397
 * @y: y position on screen
398
 * @funcs: CRTC control functions
2967 Serge 399
 * @gamma_size: size of gamma ramp
400
 * @gamma_store: gamma ramp values
401
 * @framedur_ns: precise frame timing
402
 * @framedur_ns: precise line timing
403
 * @pixeldur_ns: precise pixel timing
404
 * @helper_private: mid-layer private data
3031 serge 405
 * @properties: property tracking for this CRTC
1408 serge 406
 *
407
 * Each CRTC may have one or more connectors associated with it.  This structure
408
 * allows the CRTC to be controlled.
409
 */
410
struct drm_crtc {
411
	struct drm_device *dev;
412
	struct list_head head;
413
 
3391 Serge 414
	/**
415
	 * crtc mutex
416
	 *
417
	 * This provides a read lock for the overall crtc state (mode, dpms
418
	 * state, ...) and a write lock for everything which can be update
419
	 * without a full modeset (fb, cursor data, ...)
420
	 */
421
	struct mutex mutex;
422
 
1408 serge 423
	struct drm_mode_object base;
424
 
425
	/* framebuffer the connector is currently bound to */
426
	struct drm_framebuffer *fb;
427
 
4065 Serge 428
	/* Temporary tracking of the old fb while a modeset is ongoing. Used
429
	 * by drm_mode_set_config_internal to implement correct refcounting. */
430
	struct drm_framebuffer *old_fb;
431
 
1408 serge 432
	bool enabled;
433
 
1964 serge 434
	/* Requested mode from modesetting. */
1408 serge 435
	struct drm_display_mode mode;
436
 
1964 serge 437
	/* Programmed mode in hw, after adjustments for encoders,
438
	 * crtc, panel scaling etc. Needed for timestamping etc.
439
	 */
440
	struct drm_display_mode hwmode;
441
 
3031 serge 442
	bool invert_dimensions;
443
 
1408 serge 444
	int x, y;
445
	const struct drm_crtc_funcs *funcs;
446
 
447
	/* CRTC gamma size for reporting to userspace */
448
	uint32_t gamma_size;
449
	uint16_t *gamma_store;
450
 
1964 serge 451
	/* Constants needed for precise vblank and swap timestamping. */
4559 Serge 452
	int framedur_ns, linedur_ns, pixeldur_ns;
1964 serge 453
 
1408 serge 454
	/* if you are using the helper */
455
	void *helper_private;
3031 serge 456
 
457
	struct drm_object_properties properties;
1408 serge 458
};
459
 
460
 
461
/**
462
 * drm_connector_funcs - control connectors on a given device
463
 * @dpms: set power state (see drm_crtc_funcs above)
464
 * @save: save connector state
465
 * @restore: restore connector state
3391 Serge 466
 * @reset: reset connector after state has been invalidated (e.g. resume)
1408 serge 467
 * @detect: is this connector active?
3031 serge 468
 * @fill_modes: fill mode list for this connector
3391 Serge 469
 * @set_property: property for this connector may need an update
1408 serge 470
 * @destroy: make object go away
3391 Serge 471
 * @force: notify the driver that the connector is forced on
1408 serge 472
 *
473
 * Each CRTC may have one or more connectors attached to it.  The functions
474
 * below allow the core DRM code to control connectors, enumerate available modes,
475
 * etc.
476
 */
477
struct drm_connector_funcs {
478
	void (*dpms)(struct drm_connector *connector, int mode);
479
	void (*save)(struct drm_connector *connector);
480
	void (*restore)(struct drm_connector *connector);
1964 serge 481
	void (*reset)(struct drm_connector *connector);
482
 
483
	/* Check to see if anything is attached to the connector.
484
	 * @force is set to false whilst polling, true when checking the
485
	 * connector due to user request. @force can be used by the driver
486
	 * to avoid expensive, destructive operations during automated
487
	 * probing.
488
	 */
489
	enum drm_connector_status (*detect)(struct drm_connector *connector,
490
					    bool force);
1408 serge 491
	int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
492
	int (*set_property)(struct drm_connector *connector, struct drm_property *property,
493
			     uint64_t val);
494
	void (*destroy)(struct drm_connector *connector);
495
	void (*force)(struct drm_connector *connector);
496
};
497
 
2967 Serge 498
/**
499
 * drm_encoder_funcs - encoder controls
500
 * @reset: reset state (e.g. at init or resume time)
501
 * @destroy: cleanup and free associated data
502
 *
503
 * Encoders sit between CRTCs and connectors.
504
 */
1408 serge 505
struct drm_encoder_funcs {
1964 serge 506
	void (*reset)(struct drm_encoder *encoder);
1408 serge 507
	void (*destroy)(struct drm_encoder *encoder);
508
};
509
 
2967 Serge 510
#define DRM_CONNECTOR_MAX_ENCODER 3
1408 serge 511
 
512
/**
513
 * drm_encoder - central DRM encoder structure
2967 Serge 514
 * @dev: parent DRM device
515
 * @head: list management
516
 * @base: base KMS object
517
 * @encoder_type: one of the %DRM_MODE_ENCODER_ types in drm_mode.h
518
 * @possible_crtcs: bitmask of potential CRTC bindings
519
 * @possible_clones: bitmask of potential sibling encoders for cloning
520
 * @crtc: currently bound CRTC
4103 Serge 521
 * @bridge: bridge associated to the encoder
2967 Serge 522
 * @funcs: control functions
523
 * @helper_private: mid-layer private data
524
 *
525
 * CRTCs drive pixels to encoders, which convert them into signals
526
 * appropriate for a given connector or set of connectors.
1408 serge 527
 */
528
struct drm_encoder {
529
	struct drm_device *dev;
530
	struct list_head head;
531
 
532
	struct drm_mode_object base;
533
	int encoder_type;
534
	uint32_t possible_crtcs;
535
	uint32_t possible_clones;
536
 
537
	struct drm_crtc *crtc;
4103 Serge 538
	struct drm_bridge *bridge;
1408 serge 539
	const struct drm_encoder_funcs *funcs;
540
	void *helper_private;
541
};
542
 
543
enum drm_connector_force {
544
	DRM_FORCE_UNSPECIFIED,
545
	DRM_FORCE_OFF,
546
	DRM_FORCE_ON,         /* force on analog part normally */
547
	DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
548
};
549
 
1964 serge 550
/* should we poll this connector for connects and disconnects */
551
/* hot plug detectable */
552
#define DRM_CONNECTOR_POLL_HPD (1 << 0)
553
/* poll for connections */
554
#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
555
/* can cleanly poll for disconnections without flickering the screen */
556
/* DACs should rarely do this without a lot of testing */
557
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
558
 
2967 Serge 559
#define MAX_ELD_BYTES	128
560
 
1408 serge 561
/**
562
 * drm_connector - central DRM connector control structure
2967 Serge 563
 * @dev: parent DRM device
564
 * @kdev: kernel device for sysfs attributes
565
 * @attr: sysfs attributes
566
 * @head: list management
567
 * @base: base KMS object
568
 * @connector_type: one of the %DRM_MODE_CONNECTOR_ types from drm_mode.h
569
 * @connector_type_id: index into connector type enum
1408 serge 570
 * @interlace_allowed: can this connector handle interlaced modes?
571
 * @doublescan_allowed: can this connector handle doublescan?
2967 Serge 572
 * @modes: modes available on this connector (from fill_modes() + user)
573
 * @status: one of the drm_connector_status enums (connected, not, or unknown)
574
 * @probed_modes: list of modes derived directly from the display
575
 * @display_info: information about attached display (e.g. from EDID)
1408 serge 576
 * @funcs: connector control functions
2967 Serge 577
 * @edid_blob_ptr: DRM property containing EDID if present
3031 serge 578
 * @properties: property tracking for this connector
2967 Serge 579
 * @polled: a %DRM_CONNECTOR_POLL_ value for core driven polling
580
 * @dpms: current dpms state
581
 * @helper_private: mid-layer private data
582
 * @force: a %DRM_FORCE_ state for forced mode sets
583
 * @encoder_ids: valid encoders for this connector
584
 * @encoder: encoder driving this connector, if any
585
 * @eld: EDID-like data, if present
586
 * @dvi_dual: dual link DVI, if found
587
 * @max_tmds_clock: max clock rate, if found
588
 * @latency_present: AV delay info from ELD, if found
589
 * @video_latency: video latency info from ELD, if found
590
 * @audio_latency: audio latency info from ELD, if found
591
 * @null_edid_counter: track sinks that give us all zeros for the EDID
1408 serge 592
 *
593
 * Each connector may be connected to one or more CRTCs, or may be clonable by
594
 * another connector if they can share a CRTC.  Each connector also has a specific
595
 * position in the broader display (referred to as a 'screen' though it could
596
 * span multiple monitors).
597
 */
598
struct drm_connector {
599
	struct drm_device *dev;
4559 Serge 600
	struct device *kdev;
1408 serge 601
	struct device_attribute *attr;
602
	struct list_head head;
603
 
604
	struct drm_mode_object base;
605
 
606
	int connector_type;
607
	int connector_type_id;
608
	bool interlace_allowed;
609
	bool doublescan_allowed;
4559 Serge 610
	bool stereo_allowed;
1408 serge 611
	struct list_head modes; /* list of modes on this connector */
612
 
613
	enum drm_connector_status status;
614
 
615
	/* these are modes added by probing with DDC or the BIOS */
616
	struct list_head probed_modes;
617
 
618
	struct drm_display_info display_info;
619
	const struct drm_connector_funcs *funcs;
620
 
621
	struct drm_property_blob *edid_blob_ptr;
3031 serge 622
	struct drm_object_properties properties;
1408 serge 623
 
1964 serge 624
	uint8_t polled; /* DRM_CONNECTOR_POLL_* */
625
 
1408 serge 626
	/* requested DPMS state */
627
	int dpms;
628
 
629
	void *helper_private;
630
 
631
	/* forced on connector */
632
	enum drm_connector_force force;
633
	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
634
	struct drm_encoder *encoder; /* currently active encoder */
1987 serge 635
 
2967 Serge 636
	/* EDID bits */
637
	uint8_t eld[MAX_ELD_BYTES];
638
	bool dvi_dual;
639
	int max_tmds_clock;	/* in MHz */
640
	bool latency_present[2];
641
	int video_latency[2];	/* [0]: progressive, [1]: interlaced */
642
	int audio_latency[2];
1987 serge 643
	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
3031 serge 644
	unsigned bad_edid_counter;
1408 serge 645
};
646
 
647
/**
2967 Serge 648
 * drm_plane_funcs - driver plane control functions
649
 * @update_plane: update the plane configuration
650
 * @disable_plane: shut down the plane
651
 * @destroy: clean up plane resources
3031 serge 652
 * @set_property: called when a property is changed
2967 Serge 653
 */
654
struct drm_plane_funcs {
655
	int (*update_plane)(struct drm_plane *plane,
656
			    struct drm_crtc *crtc, struct drm_framebuffer *fb,
657
			    int crtc_x, int crtc_y,
658
			    unsigned int crtc_w, unsigned int crtc_h,
659
			    uint32_t src_x, uint32_t src_y,
660
			    uint32_t src_w, uint32_t src_h);
661
	int (*disable_plane)(struct drm_plane *plane);
662
	void (*destroy)(struct drm_plane *plane);
3031 serge 663
 
664
	int (*set_property)(struct drm_plane *plane,
665
			    struct drm_property *property, uint64_t val);
2967 Serge 666
};
667
 
668
/**
669
 * drm_plane - central DRM plane control structure
670
 * @dev: DRM device this plane belongs to
671
 * @head: for list management
672
 * @base: base mode object
673
 * @possible_crtcs: pipes this plane can be bound to
674
 * @format_types: array of formats supported by this plane
675
 * @format_count: number of formats supported
676
 * @crtc: currently bound CRTC
677
 * @fb: currently bound fb
678
 * @funcs: helper functions
3031 serge 679
 * @properties: property tracking for this plane
2967 Serge 680
 */
681
struct drm_plane {
682
	struct drm_device *dev;
683
	struct list_head head;
684
 
685
	struct drm_mode_object base;
686
 
687
	uint32_t possible_crtcs;
688
	uint32_t *format_types;
689
	uint32_t format_count;
690
 
691
	struct drm_crtc *crtc;
692
	struct drm_framebuffer *fb;
693
 
694
	const struct drm_plane_funcs *funcs;
3031 serge 695
 
696
	struct drm_object_properties properties;
2967 Serge 697
};
698
 
699
/**
4103 Serge 700
 * drm_bridge_funcs - drm_bridge control functions
701
 * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge
702
 * @disable: Called right before encoder prepare, disables the bridge
703
 * @post_disable: Called right after encoder prepare, for lockstepped disable
704
 * @mode_set: Set this mode to the bridge
705
 * @pre_enable: Called right before encoder commit, for lockstepped commit
706
 * @enable: Called right after encoder commit, enables the bridge
707
 * @destroy: make object go away
708
 */
709
struct drm_bridge_funcs {
710
	bool (*mode_fixup)(struct drm_bridge *bridge,
711
			   const struct drm_display_mode *mode,
712
			   struct drm_display_mode *adjusted_mode);
713
	void (*disable)(struct drm_bridge *bridge);
714
	void (*post_disable)(struct drm_bridge *bridge);
715
	void (*mode_set)(struct drm_bridge *bridge,
716
			 struct drm_display_mode *mode,
717
			 struct drm_display_mode *adjusted_mode);
718
	void (*pre_enable)(struct drm_bridge *bridge);
719
	void (*enable)(struct drm_bridge *bridge);
720
	void (*destroy)(struct drm_bridge *bridge);
721
};
722
 
723
/**
724
 * drm_bridge - central DRM bridge control structure
725
 * @dev: DRM device this bridge belongs to
726
 * @head: list management
727
 * @base: base mode object
728
 * @funcs: control functions
729
 * @driver_private: pointer to the bridge driver's internal context
730
 */
731
struct drm_bridge {
732
	struct drm_device *dev;
733
	struct list_head head;
734
 
735
	struct drm_mode_object base;
736
 
737
	const struct drm_bridge_funcs *funcs;
738
	void *driver_private;
739
};
740
 
741
/**
2967 Serge 742
 * drm_mode_set - new values for a CRTC config change
743
 * @head: list management
744
 * @fb: framebuffer to use for new config
745
 * @crtc: CRTC whose configuration we're about to change
746
 * @mode: mode timings to use
747
 * @x: position of this CRTC relative to @fb
748
 * @y: position of this CRTC relative to @fb
749
 * @connectors: array of connectors to drive with this CRTC if possible
750
 * @num_connectors: size of @connectors array
1408 serge 751
 *
752
 * Represents a single crtc the connectors that it drives with what mode
753
 * and from which framebuffer it scans out from.
754
 *
755
 * This is used to set modes.
756
 */
757
struct drm_mode_set {
758
	struct drm_framebuffer *fb;
759
	struct drm_crtc *crtc;
760
	struct drm_display_mode *mode;
761
 
762
	uint32_t x;
763
	uint32_t y;
764
 
765
	struct drm_connector **connectors;
766
	size_t num_connectors;
767
};
768
 
769
/**
2967 Serge 770
 * struct drm_mode_config_funcs - basic driver provided mode setting functions
771
 * @fb_create: create a new framebuffer object
772
 * @output_poll_changed: function to handle output configuration changes
773
 *
774
 * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that
775
 * involve drivers.
1408 serge 776
 */
777
struct drm_mode_config_funcs {
2967 Serge 778
	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
779
					     struct drm_file *file_priv,
780
					     struct drm_mode_fb_cmd2 *mode_cmd);
1964 serge 781
	void (*output_poll_changed)(struct drm_device *dev);
1408 serge 782
};
783
 
2967 Serge 784
/**
785
 * drm_mode_group - group of mode setting resources for potential sub-grouping
786
 * @num_crtcs: CRTC count
787
 * @num_encoders: encoder count
788
 * @num_connectors: connector count
789
 * @id_list: list of KMS object IDs in this group
790
 *
791
 * Currently this simply tracks the global mode setting state.  But in the
792
 * future it could allow groups of objects to be set aside into independent
793
 * control groups for use by different user level processes (e.g. two X servers
794
 * running simultaneously on different heads, each with their own mode
795
 * configuration and freedom of mode setting).
796
 */
1408 serge 797
struct drm_mode_group {
798
	uint32_t num_crtcs;
799
	uint32_t num_encoders;
800
	uint32_t num_connectors;
4103 Serge 801
	uint32_t num_bridges;
1408 serge 802
 
803
	/* list of object IDs for this group */
804
	uint32_t *id_list;
805
};
806
 
807
/**
808
 * drm_mode_config - Mode configuration control structure
2967 Serge 809
 * @mutex: mutex protecting KMS related lists and structures
810
 * @idr_mutex: mutex for KMS ID allocation and management
811
 * @crtc_idr: main KMS ID tracking object
812
 * @num_fb: number of fbs available
813
 * @fb_list: list of framebuffers available
814
 * @num_connector: number of connectors on this device
815
 * @connector_list: list of connector objects
4103 Serge 816
 * @num_bridge: number of bridges on this device
817
 * @bridge_list: list of bridge objects
2967 Serge 818
 * @num_encoder: number of encoders on this device
819
 * @encoder_list: list of encoder objects
820
 * @num_crtc: number of CRTCs on this device
821
 * @crtc_list: list of CRTC objects
822
 * @min_width: minimum pixel width on this device
823
 * @min_height: minimum pixel height on this device
824
 * @max_width: maximum pixel width on this device
825
 * @max_height: maximum pixel height on this device
826
 * @funcs: core driver provided mode setting functions
827
 * @fb_base: base address of the framebuffer
828
 * @poll_enabled: track polling status for this device
829
 * @output_poll_work: delayed work for polling in process context
830
 * @*_property: core property tracking
1408 serge 831
 *
2967 Serge 832
 * Core mode resource tracking structure.  All CRTC, encoders, and connectors
833
 * enumerated by the driver are added here, as are global properties.  Some
834
 * global restrictions are also here, e.g. dimension restrictions.
1408 serge 835
 */
836
struct drm_mode_config {
1630 serge 837
	struct mutex mutex; /* protects configuration (mode lists etc.) */
838
	struct mutex idr_mutex; /* for IDR management */
1408 serge 839
    struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
840
	/* this is limited to one for now */
3391 Serge 841
 
842
 
843
	/**
844
	 * fb_lock - mutex to protect fb state
845
	 *
846
	 * Besides the global fb list his also protects the fbs list in the
847
	 * file_priv
848
	 */
849
	struct mutex fb_lock;
1408 serge 850
	int num_fb;
851
	struct list_head fb_list;
3391 Serge 852
 
1408 serge 853
	int num_connector;
854
	struct list_head connector_list;
4103 Serge 855
	int num_bridge;
856
	struct list_head bridge_list;
1408 serge 857
	int num_encoder;
858
	struct list_head encoder_list;
2967 Serge 859
	int num_plane;
860
	struct list_head plane_list;
1408 serge 861
 
862
	int num_crtc;
863
	struct list_head crtc_list;
864
 
865
	struct list_head property_list;
866
 
867
	int min_width, min_height;
868
	int max_width, max_height;
3031 serge 869
	const struct drm_mode_config_funcs *funcs;
1408 serge 870
	resource_size_t fb_base;
871
 
1964 serge 872
	/* output poll support */
873
	bool poll_enabled;
3192 Serge 874
	bool poll_running;
3480 Serge 875
	struct delayed_work output_poll_work;
1964 serge 876
 
1408 serge 877
	/* pointers to standard properties */
878
	struct list_head property_blob_list;
879
	struct drm_property *edid_property;
880
	struct drm_property *dpms_property;
881
 
882
	/* DVI-I properties */
883
	struct drm_property *dvi_i_subconnector_property;
884
	struct drm_property *dvi_i_select_subconnector_property;
885
 
886
	/* TV properties */
887
	struct drm_property *tv_subconnector_property;
888
	struct drm_property *tv_select_subconnector_property;
889
	struct drm_property *tv_mode_property;
890
	struct drm_property *tv_left_margin_property;
891
	struct drm_property *tv_right_margin_property;
892
	struct drm_property *tv_top_margin_property;
893
	struct drm_property *tv_bottom_margin_property;
894
	struct drm_property *tv_brightness_property;
895
	struct drm_property *tv_contrast_property;
896
	struct drm_property *tv_flicker_reduction_property;
897
	struct drm_property *tv_overscan_property;
898
	struct drm_property *tv_saturation_property;
899
	struct drm_property *tv_hue_property;
900
 
901
	/* Optional properties */
902
	struct drm_property *scaling_mode_property;
903
	struct drm_property *dirty_info_property;
3031 serge 904
 
905
	/* dumb ioctl parameters */
906
	uint32_t preferred_depth, prefer_shadow;
4103 Serge 907
 
908
	/* whether async page flip is supported or not */
909
	bool async_page_flip;
1408 serge 910
};
911
 
912
#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
913
#define obj_to_connector(x) container_of(x, struct drm_connector, base)
914
#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
915
#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
916
#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
917
#define obj_to_property(x) container_of(x, struct drm_property, base)
918
#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
2967 Serge 919
#define obj_to_plane(x) container_of(x, struct drm_plane, base)
1408 serge 920
 
3031 serge 921
struct drm_prop_enum_list {
922
	int type;
923
	char *name;
924
};
1408 serge 925
 
3391 Serge 926
extern void drm_modeset_lock_all(struct drm_device *dev);
927
extern void drm_modeset_unlock_all(struct drm_device *dev);
928
extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev);
929
 
3031 serge 930
extern int drm_crtc_init(struct drm_device *dev,
1408 serge 931
			  struct drm_crtc *crtc,
932
			  const struct drm_crtc_funcs *funcs);
933
extern void drm_crtc_cleanup(struct drm_crtc *crtc);
4559 Serge 934
extern unsigned int drm_crtc_index(struct drm_crtc *crtc);
1408 serge 935
 
4559 Serge 936
/**
937
 * drm_crtc_mask - find the mask of a registered CRTC
938
 * @crtc: CRTC to find mask for
939
 *
940
 * Given a registered CRTC, return the mask bit of that CRTC for an
941
 * encoder's possible_crtcs field.
942
 */
943
static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc)
944
{
945
	return 1 << drm_crtc_index(crtc);
946
}
947
 
4103 Serge 948
extern void drm_connector_ida_init(void);
949
extern void drm_connector_ida_destroy(void);
3031 serge 950
extern int drm_connector_init(struct drm_device *dev,
1408 serge 951
			    struct drm_connector *connector,
952
			    const struct drm_connector_funcs *funcs,
953
			    int connector_type);
954
 
955
extern void drm_connector_cleanup(struct drm_connector *connector);
3031 serge 956
/* helper to unplug all connectors from sysfs for device */
957
extern void drm_connector_unplug_all(struct drm_device *dev);
1408 serge 958
 
4103 Serge 959
extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge,
960
			   const struct drm_bridge_funcs *funcs);
961
extern void drm_bridge_cleanup(struct drm_bridge *bridge);
962
 
3031 serge 963
extern int drm_encoder_init(struct drm_device *dev,
1408 serge 964
			     struct drm_encoder *encoder,
965
			     const struct drm_encoder_funcs *funcs,
966
			     int encoder_type);
967
 
4559 Serge 968
/**
969
 * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
970
 * @encoder: encoder to test
971
 * @crtc: crtc to test
972
 *
973
 * Return false if @encoder can't be driven by @crtc, true otherwise.
974
 */
975
static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
976
				       struct drm_crtc *crtc)
977
{
978
	return !!(encoder->possible_crtcs & drm_crtc_mask(crtc));
979
}
980
 
2967 Serge 981
extern int drm_plane_init(struct drm_device *dev,
982
			  struct drm_plane *plane,
983
			  unsigned long possible_crtcs,
984
			  const struct drm_plane_funcs *funcs,
985
			  const uint32_t *formats, uint32_t format_count,
986
			  bool priv);
987
extern void drm_plane_cleanup(struct drm_plane *plane);
4065 Serge 988
extern void drm_plane_force_disable(struct drm_plane *plane);
2967 Serge 989
 
1408 serge 990
extern void drm_encoder_cleanup(struct drm_encoder *encoder);
991
 
4065 Serge 992
extern const char *drm_get_connector_name(const struct drm_connector *connector);
993
extern const char *drm_get_connector_status_name(enum drm_connector_status status);
994
extern const char *drm_get_dpms_name(int val);
995
extern const char *drm_get_dvi_i_subconnector_name(int val);
996
extern const char *drm_get_dvi_i_select_name(int val);
997
extern const char *drm_get_tv_subconnector_name(int val);
998
extern const char *drm_get_tv_select_name(int val);
1987 serge 999
extern void drm_fb_release(struct drm_file *file_priv);
1408 serge 1000
extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
3031 serge 1001
extern bool drm_probe_ddc(struct i2c_adapter *adapter);
1408 serge 1002
extern struct edid *drm_get_edid(struct drm_connector *connector,
1003
				 struct i2c_adapter *adapter);
4559 Serge 1004
extern struct edid *drm_edid_duplicate(const struct edid *edid);
1408 serge 1005
extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
1006
extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
3031 serge 1007
extern void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src);
1408 serge 1008
extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
1964 serge 1009
						   const struct drm_display_mode *mode);
3192 Serge 1010
extern void drm_mode_debug_printmodeline(const struct drm_display_mode *mode);
1408 serge 1011
extern void drm_mode_config_init(struct drm_device *dev);
1964 serge 1012
extern void drm_mode_config_reset(struct drm_device *dev);
1408 serge 1013
extern void drm_mode_config_cleanup(struct drm_device *dev);
1014
extern void drm_mode_set_name(struct drm_display_mode *mode);
3192 Serge 1015
extern bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2);
4559 Serge 1016
extern bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2);
3192 Serge 1017
extern int drm_mode_width(const struct drm_display_mode *mode);
1018
extern int drm_mode_height(const struct drm_display_mode *mode);
1408 serge 1019
 
1020
/* for us by fb module */
1021
extern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
1022
extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
1023
extern void drm_mode_validate_size(struct drm_device *dev,
1024
                  struct list_head *mode_list,
1025
                  int maxX, int maxY, int maxPitch);
1026
extern void drm_mode_prune_invalid(struct drm_device *dev,
1027
                  struct list_head *mode_list, bool verbose);
1028
extern void drm_mode_sort(struct list_head *mode_list);
1964 serge 1029
extern int drm_mode_hsync(const struct drm_display_mode *mode);
1030
extern int drm_mode_vrefresh(const struct drm_display_mode *mode);
1408 serge 1031
extern void drm_mode_set_crtcinfo(struct drm_display_mode *p,
1032
				  int adjust_flags);
1033
extern void drm_mode_connector_list_update(struct drm_connector *connector);
1034
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
1035
                       struct edid *edid);
3031 serge 1036
extern int drm_object_property_set_value(struct drm_mode_object *obj,
1037
					 struct drm_property *property,
1038
					 uint64_t val);
1039
extern int drm_object_property_get_value(struct drm_mode_object *obj,
1040
					 struct drm_property *property,
1041
					 uint64_t *value);
1408 serge 1042
extern int drm_framebuffer_init(struct drm_device *dev,
1043
				struct drm_framebuffer *fb,
1044
				const struct drm_framebuffer_funcs *funcs);
3391 Serge 1045
extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
1046
						      uint32_t id);
3031 serge 1047
extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
1048
extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
1049
extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
1408 serge 1050
extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
3391 Serge 1051
extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
1408 serge 1052
 
3031 serge 1053
extern void drm_object_attach_property(struct drm_mode_object *obj,
1054
				       struct drm_property *property,
1055
				       uint64_t init_val);
1408 serge 1056
extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
1057
						const char *name, int num_values);
3031 serge 1058
extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
1059
					 const char *name,
1060
					 const struct drm_prop_enum_list *props,
1061
					 int num_values);
1062
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
1063
					 int flags, const char *name,
1064
					 const struct drm_prop_enum_list *props,
1065
					 int num_values);
1066
struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
1067
					 const char *name,
1068
					 uint64_t min, uint64_t max);
1408 serge 1069
extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
1070
extern int drm_property_add_enum(struct drm_property *property, int index,
1071
				 uint64_t value, const char *name);
1072
extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
1073
extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
1074
				     char *formats[]);
1075
extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
1076
extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
4065 Serge 1077
extern const char *drm_get_encoder_name(const struct drm_encoder *encoder);
1408 serge 1078
 
1079
extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
1080
					     struct drm_encoder *encoder);
1081
extern void drm_mode_connector_detach_encoder(struct drm_connector *connector,
1082
					   struct drm_encoder *encoder);
3031 serge 1083
extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
1408 serge 1084
					 int gamma_size);
1085
extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
1086
		uint32_t id, uint32_t type);
1087
/* IOCTLs */
1088
extern int drm_mode_getresources(struct drm_device *dev,
1089
				 void *data, struct drm_file *file_priv);
2967 Serge 1090
extern int drm_mode_getplane_res(struct drm_device *dev, void *data,
1091
				   struct drm_file *file_priv);
1408 serge 1092
extern int drm_mode_getcrtc(struct drm_device *dev,
1093
			    void *data, struct drm_file *file_priv);
1094
extern int drm_mode_getconnector(struct drm_device *dev,
1095
			      void *data, struct drm_file *file_priv);
3391 Serge 1096
extern int drm_mode_set_config_internal(struct drm_mode_set *set);
1408 serge 1097
extern int drm_mode_setcrtc(struct drm_device *dev,
1098
			    void *data, struct drm_file *file_priv);
2967 Serge 1099
extern int drm_mode_getplane(struct drm_device *dev,
1100
			       void *data, struct drm_file *file_priv);
1101
extern int drm_mode_setplane(struct drm_device *dev,
1102
			       void *data, struct drm_file *file_priv);
1408 serge 1103
extern int drm_mode_cursor_ioctl(struct drm_device *dev,
1104
				void *data, struct drm_file *file_priv);
4065 Serge 1105
extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
1106
				void *data, struct drm_file *file_priv);
1408 serge 1107
extern int drm_mode_addfb(struct drm_device *dev,
1108
			  void *data, struct drm_file *file_priv);
2967 Serge 1109
extern int drm_mode_addfb2(struct drm_device *dev,
1110
			   void *data, struct drm_file *file_priv);
1111
extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
1408 serge 1112
extern int drm_mode_rmfb(struct drm_device *dev,
1113
			 void *data, struct drm_file *file_priv);
1114
extern int drm_mode_getfb(struct drm_device *dev,
1115
			  void *data, struct drm_file *file_priv);
1116
extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1117
				  void *data, struct drm_file *file_priv);
1118
 
1119
extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
1120
				      void *data, struct drm_file *file_priv);
1121
extern int drm_mode_getblob_ioctl(struct drm_device *dev,
1122
				  void *data, struct drm_file *file_priv);
1123
extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
1124
					      void *data, struct drm_file *file_priv);
1125
extern int drm_mode_getencoder(struct drm_device *dev,
1126
			       void *data, struct drm_file *file_priv);
1127
extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
1128
				    void *data, struct drm_file *file_priv);
1129
extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
1130
				    void *data, struct drm_file *file_priv);
3391 Serge 1131
extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
1408 serge 1132
extern bool drm_detect_hdmi_monitor(struct edid *edid);
1964 serge 1133
extern bool drm_detect_monitor_audio(struct edid *edid);
3391 Serge 1134
extern bool drm_rgb_quant_range_selectable(struct edid *edid);
1408 serge 1135
extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
1136
				    void *data, struct drm_file *file_priv);
1137
extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
1138
				int hdisplay, int vdisplay, int vrefresh,
1139
				bool reduced, bool interlaced, bool margins);
1140
extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
1141
				int hdisplay, int vdisplay, int vrefresh,
1142
				bool interlaced, int margins);
1964 serge 1143
extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
1144
				int hdisplay, int vdisplay, int vrefresh,
1145
				bool interlaced, int margins, int GTF_M,
1146
				int GTF_2C, int GTF_K, int GTF_2J);
1408 serge 1147
extern int drm_add_modes_noedid(struct drm_connector *connector,
1148
				int hdisplay, int vdisplay);
4559 Serge 1149
extern void drm_set_preferred_mode(struct drm_connector *connector,
1150
				   int hpref, int vpref);
1430 serge 1151
 
2161 serge 1152
extern int drm_edid_header_is_valid(const u8 *raw_edid);
3031 serge 1153
extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid);
1430 serge 1154
extern bool drm_edid_is_valid(struct edid *edid);
1964 serge 1155
struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
3031 serge 1156
					   int hsize, int vsize, int fresh,
1157
					   bool rb);
1158
 
1159
extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
1160
				      void *data, struct drm_file *file_priv);
1161
extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
1162
				    void *data, struct drm_file *file_priv);
1163
extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
1164
				      void *data, struct drm_file *file_priv);
1165
extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
1166
					     struct drm_file *file_priv);
1167
extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
1168
					   struct drm_file *file_priv);
1169
 
1170
extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
1171
				 int *bpp);
1172
extern int drm_format_num_planes(uint32_t format);
1173
extern int drm_format_plane_cpp(uint32_t format, int plane);
1174
extern int drm_format_horz_chroma_subsampling(uint32_t format);
1175
extern int drm_format_vert_chroma_subsampling(uint32_t format);
4065 Serge 1176
extern const char *drm_get_format_name(uint32_t format);
3031 serge 1177
 
4559 Serge 1178
/* Helpers */
1179
static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
1180
	uint32_t id)
1181
{
1182
	struct drm_mode_object *mo;
1183
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC);
1184
	return mo ? obj_to_crtc(mo) : NULL;
1185
}
1186
 
1187
static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
1188
	uint32_t id)
1189
{
1190
	struct drm_mode_object *mo;
1191
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
1192
	return mo ? obj_to_encoder(mo) : NULL;
1193
}
1194
 
1408 serge 1195
#endif /* __DRM_CRTC_H__ */