Subversion Repositories Kolibri OS

Rev

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