drm_crtc.h 57.3 KB
Newer Older
D
Dave Airlie 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/*
 * Copyright © 2006 Keith Packard
 * Copyright © 2007-2008 Dave Airlie
 * Copyright © 2007-2008 Intel Corporation
 *   Jesse Barnes <jesse.barnes@intel.com>
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */
#ifndef __DRM_CRTC_H__
#define __DRM_CRTC_H__

#include <linux/i2c.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include <linux/idr.h>
#include <linux/fb.h>
33
#include <linux/hdmi.h>
34
#include <linux/media-bus-format.h>
35 36
#include <uapi/drm/drm_mode.h>
#include <uapi/drm/drm_fourcc.h>
37
#include <drm/drm_modeset_lock.h>
38

D
Dave Airlie 已提交
39 40 41
struct drm_device;
struct drm_mode_set;
struct drm_framebuffer;
42
struct drm_object_properties;
43 44
struct drm_file;
struct drm_clip_rect;
45
struct device_node;
46
struct fence;
D
Dave Airlie 已提交
47 48 49 50 51 52 53 54

#define DRM_MODE_OBJECT_CRTC 0xcccccccc
#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
#define DRM_MODE_OBJECT_MODE 0xdededede
#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
J
Jesse Barnes 已提交
55
#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
R
Rob Clark 已提交
56
#define DRM_MODE_OBJECT_ANY 0
D
Dave Airlie 已提交
57 58 59 60

struct drm_mode_object {
	uint32_t id;
	uint32_t type;
61 62 63
	struct drm_object_properties *properties;
};

64
#define DRM_OBJECT_MAX_PROPERTY 24
65
struct drm_object_properties {
R
Rob Clark 已提交
66
	int count, atomic_count;
67 68 69 70 71 72
	/* NOTE: if we ever start dynamically destroying properties (ie.
	 * not at drm_mode_config_cleanup() time), then we'd have to do
	 * a better job of detaching property from mode objects to avoid
	 * dangling property pointers:
	 */
	struct drm_property *properties[DRM_OBJECT_MAX_PROPERTY];
73 74 75
	/* do not read/write values directly, but use drm_object_property_get_value()
	 * and drm_object_property_set_value():
	 */
76
	uint64_t values[DRM_OBJECT_MAX_PROPERTY];
D
Dave Airlie 已提交
77 78
};

R
Rob Clark 已提交
79 80 81 82 83 84 85 86 87
static inline int64_t U642I64(uint64_t val)
{
	return (int64_t)*((int64_t *)&val);
}
static inline uint64_t I642U64(int64_t val)
{
	return (uint64_t)*((uint64_t *)&val);
}

88 89 90 91 92 93 94 95
/* rotation property bits */
#define DRM_ROTATE_0	0
#define DRM_ROTATE_90	1
#define DRM_ROTATE_180	2
#define DRM_ROTATE_270	3
#define DRM_REFLECT_X	4
#define DRM_REFLECT_Y	5

96 97 98 99 100
enum drm_connector_force {
	DRM_FORCE_UNSPECIFIED,
	DRM_FORCE_OFF,
	DRM_FORCE_ON,         /* force on analog part normally */
	DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
D
Dave Airlie 已提交
101 102
};

103
#include <drm/drm_modes.h>
104

D
Dave Airlie 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
enum drm_connector_status {
	connector_status_connected = 1,
	connector_status_disconnected = 2,
	connector_status_unknown = 3,
};

enum subpixel_order {
	SubPixelUnknown = 0,
	SubPixelHorizontalRGB,
	SubPixelHorizontalBGR,
	SubPixelVerticalRGB,
	SubPixelVerticalBGR,
	SubPixelNone,
};

120 121 122
#define DRM_COLOR_FORMAT_RGB444		(1<<0)
#define DRM_COLOR_FORMAT_YCRCB444	(1<<1)
#define DRM_COLOR_FORMAT_YCRCB422	(1<<2)
D
Dave Airlie 已提交
123 124 125 126 127
/*
 * Describes a given display (e.g. CRT or flat panel) and its limitations.
 */
struct drm_display_info {
	char name[DRM_DISPLAY_INFO_LEN];
128

D
Dave Airlie 已提交
129 130 131 132 133 134 135 136
	/* Physical size */
        unsigned int width_mm;
	unsigned int height_mm;

	/* Clock limits FIXME: storage format */
	unsigned int min_vfreq, max_vfreq;
	unsigned int min_hfreq, max_hfreq;
	unsigned int pixel_clock;
J
Jesse Barnes 已提交
137
	unsigned int bpc;
D
Dave Airlie 已提交
138 139

	enum subpixel_order subpixel_order;
140
	u32 color_formats;
D
Dave Airlie 已提交
141

142 143 144
	const u32 *bus_formats;
	unsigned int num_bus_formats;

145 146 147
	/* Mask of supported hdmi deep color modes */
	u8 edid_hdmi_dc_modes;

148
	u8 cea_rev;
D
Dave Airlie 已提交
149 150
};

D
Dave Airlie 已提交
151 152 153 154 155 156 157 158
/* data corresponds to displayid vend/prod/serial */
struct drm_tile_group {
	struct kref refcount;
	struct drm_device *dev;
	int id;
	u8 group_data[8];
};

D
Dave Airlie 已提交
159
struct drm_framebuffer_funcs {
R
Rob Clark 已提交
160
	/* note: use drm_framebuffer_remove() */
D
Dave Airlie 已提交
161 162 163 164
	void (*destroy)(struct drm_framebuffer *framebuffer);
	int (*create_handle)(struct drm_framebuffer *fb,
			     struct drm_file *file_priv,
			     unsigned int *handle);
165 166
	/*
	 * Optional callback for the dirty fb ioctl.
167 168 169 170 171 172 173 174 175 176
	 *
	 * Userspace can notify the driver via this callback
	 * that a area of the framebuffer has changed and should
	 * be flushed to the display hardware.
	 *
	 * See documentation in drm_mode.h for the struct
	 * drm_mode_fb_dirty_cmd for more information as all
	 * the semantics and arguments have a one to one mapping
	 * on this function.
	 */
177 178
	int (*dirty)(struct drm_framebuffer *framebuffer,
		     struct drm_file *file_priv, unsigned flags,
179 180
		     unsigned color, struct drm_clip_rect *clips,
		     unsigned num_clips);
D
Dave Airlie 已提交
181 182 183 184
};

struct drm_framebuffer {
	struct drm_device *dev;
R
Rob Clark 已提交
185 186 187 188 189 190 191 192 193 194
	/*
	 * Note that the fb is refcounted for the benefit of driver internals,
	 * for example some hw, disabling a CRTC/plane is asynchronous, and
	 * scanout does not actually complete until the next vblank.  So some
	 * cleanup (like releasing the reference(s) on the backing GEM bo(s))
	 * should be deferred.  In cases like this, the driver would like to
	 * hold a ref to the fb even though it has already been removed from
	 * userspace perspective.
	 */
	struct kref refcount;
195 196 197 198
	/*
	 * Place on the dev->mode_config.fb_list, access protected by
	 * dev->mode_config.fb_lock.
	 */
D
Dave Airlie 已提交
199 200 201
	struct list_head head;
	struct drm_mode_object base;
	const struct drm_framebuffer_funcs *funcs;
202 203
	unsigned int pitches[4];
	unsigned int offsets[4];
204
	uint64_t modifier[4];
D
Dave Airlie 已提交
205 206 207 208 209 210
	unsigned int width;
	unsigned int height;
	/* depth can be 15 or 16 */
	unsigned int depth;
	int bits_per_pixel;
	int flags;
211
	uint32_t pixel_format; /* fourcc format */
D
Dave Airlie 已提交
212
	struct list_head filp_head;
213 214
	/* if you are using the helper */
	void *helper_private;
D
Dave Airlie 已提交
215 216 217 218
};

struct drm_property_blob {
	struct drm_mode_object base;
219 220
	struct drm_device *dev;
	struct kref refcount;
221 222
	struct list_head head_global;
	struct list_head head_file;
223
	size_t length;
224
	unsigned char data[];
D
Dave Airlie 已提交
225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
};

struct drm_property_enum {
	uint64_t value;
	struct list_head head;
	char name[DRM_PROP_NAME_LEN];
};

struct drm_property {
	struct list_head head;
	struct drm_mode_object base;
	uint32_t flags;
	char name[DRM_PROP_NAME_LEN];
	uint32_t num_values;
	uint64_t *values;
R
Rob Clark 已提交
240
	struct drm_device *dev;
D
Dave Airlie 已提交
241

242
	struct list_head enum_list;
D
Dave Airlie 已提交
243 244 245 246 247
};

struct drm_crtc;
struct drm_connector;
struct drm_encoder;
248
struct drm_pending_vblank_event;
J
Jesse Barnes 已提交
249
struct drm_plane;
S
Sean Paul 已提交
250
struct drm_bridge;
251 252 253
struct drm_atomic_state;

/**
D
Daniel Vetter 已提交
254
 * struct drm_crtc_state - mutable CRTC state
255
 * @crtc: backpointer to the CRTC
256
 * @enable: whether the CRTC should be enabled, gates all other state
257
 * @active: whether the CRTC is actively displaying (used for DPMS)
258 259 260 261
 * @planes_changed: planes on this crtc are updated
 * @mode_changed: crtc_state->mode or crtc_state->enable has been changed
 * @active_changed: crtc_state->active has been toggled.
 * @connectors_changed: connectors to this crtc have been updated
262
 * @plane_mask: bitmask of (1 << drm_plane_index(plane)) of attached planes
263 264
 * @last_vblank_count: for helpers and drivers to capture the vblank of the
 * 	update to ensure framebuffer cleanup isn't done too early
265
 * @adjusted_mode: for use by helpers and drivers to compute adjusted mode timings
266 267 268 269
 * @mode: current mode timings
 * @event: optional pointer to a DRM event to signal upon completion of the
 * 	state update
 * @state: backpointer to global drm_atomic_state
270 271 272 273 274 275
 *
 * Note that the distinction between @enable and @active is rather subtile:
 * Flipping @active while @enable is set without changing anything else may
 * never return in a failure from the ->atomic_check callback. Userspace assumes
 * that a DPMS On will always succeed. In other words: @enable controls resource
 * assignment, @active controls the actual hardware state.
276 277
 */
struct drm_crtc_state {
278 279
	struct drm_crtc *crtc;

D
Daniel Vetter 已提交
280
	bool enable;
281
	bool active;
282

D
Daniel Vetter 已提交
283 284
	/* computed state bits used by helpers and drivers */
	bool planes_changed : 1;
285
	bool mode_changed : 1;
286
	bool active_changed : 1;
287
	bool connectors_changed : 1;
288

289 290 291 292 293 294 295
	/* attached planes bitmask:
	 * WARNING: transitional helpers do not maintain plane_mask so
	 * drivers not converted over to atomic helpers should not rely
	 * on plane_mask being accurate!
	 */
	u32 plane_mask;

296 297
	/* last_vblank_count: for vblank waits before cleanup */
	u32 last_vblank_count;
D
Daniel Vetter 已提交
298

299 300 301
	/* adjusted_mode: for use by helpers and drivers */
	struct drm_display_mode adjusted_mode;

302 303
	struct drm_display_mode mode;

304 305 306
	/* blob property to expose current mode to atomic userspace */
	struct drm_property_blob *mode_blob;

307 308 309 310
	struct drm_pending_vblank_event *event;

	struct drm_atomic_state *state;
};
D
Dave Airlie 已提交
311 312

/**
313
 * struct drm_crtc_funcs - control CRTCs for a given device
D
Dave Airlie 已提交
314
 * @save: save CRTC state
315
 * @restore: restore CRTC state
C
Christopher Harvey 已提交
316
 * @reset: reset CRTC after state has been invalidated (e.g. resume)
317
 * @cursor_set: setup the cursor
D
Daniel Vetter 已提交
318
 * @cursor_set2: setup the cursor with hotspot, superseeds @cursor_set if set
319
 * @cursor_move: move the cursor
D
Dave Airlie 已提交
320
 * @gamma_set: specify color ramp for CRTC
P
Paulo Zanoni 已提交
321 322
 * @destroy: deinit and free object
 * @set_property: called when a property is changed
323 324
 * @set_config: apply a new CRTC configuration
 * @page_flip: initiate a page flip
325 326 327
 * @atomic_duplicate_state: duplicate the atomic state for this CRTC
 * @atomic_destroy_state: destroy an atomic state for this CRTC
 * @atomic_set_property: set a property on an atomic state for this CRTC
R
Rob Clark 已提交
328
 *    (do not call directly, use drm_atomic_crtc_set_property())
R
Rob Clark 已提交
329 330
 * @atomic_get_property: get a property on an atomic state for this CRTC
 *    (do not call directly, use drm_atomic_crtc_get_property())
D
Dave Airlie 已提交
331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
 *
 * The drm_crtc_funcs structure is the central CRTC management structure
 * in the DRM.  Each CRTC controls one or more connectors (note that the name
 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
 * connectors, not just CRTs).
 *
 * Each driver is responsible for filling out this structure at startup time,
 * in addition to providing other modesetting features, like i2c and DDC
 * bus accessors.
 */
struct drm_crtc_funcs {
	/* Save CRTC state */
	void (*save)(struct drm_crtc *crtc); /* suspend? */
	/* Restore CRTC state */
	void (*restore)(struct drm_crtc *crtc); /* resume? */
346 347
	/* Reset CRTC state */
	void (*reset)(struct drm_crtc *crtc);
D
Dave Airlie 已提交
348 349 350 351

	/* cursor controls */
	int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
			  uint32_t handle, uint32_t width, uint32_t height);
352 353 354
	int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
			   uint32_t handle, uint32_t width, uint32_t height,
			   int32_t hot_x, int32_t hot_y);
D
Dave Airlie 已提交
355 356 357 358
	int (*cursor_move)(struct drm_crtc *crtc, int x, int y);

	/* Set gamma on the CRTC */
	void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
J
James Simmons 已提交
359
			  uint32_t start, uint32_t size);
D
Dave Airlie 已提交
360 361 362 363
	/* Object destroy routine */
	void (*destroy)(struct drm_crtc *crtc);

	int (*set_config)(struct drm_mode_set *set);
364 365 366

	/*
	 * Flip to the given framebuffer.  This implements the page
L
Lucas De Marchi 已提交
367
	 * flip ioctl described in drm_mode.h, specifically, the
368 369 370 371 372 373 374 375
	 * implementation must return immediately and block all
	 * rendering to the current fb until the flip has completed.
	 * If userspace set the event flag in the ioctl, the event
	 * argument will point to an event to send back when the flip
	 * completes, otherwise it will be NULL.
	 */
	int (*page_flip)(struct drm_crtc *crtc,
			 struct drm_framebuffer *fb,
376 377
			 struct drm_pending_vblank_event *event,
			 uint32_t flags);
P
Paulo Zanoni 已提交
378 379 380

	int (*set_property)(struct drm_crtc *crtc,
			    struct drm_property *property, uint64_t val);
381 382 383 384

	/* atomic update handling */
	struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc);
	void (*atomic_destroy_state)(struct drm_crtc *crtc,
D
Daniel Vetter 已提交
385
				     struct drm_crtc_state *state);
386 387 388 389
	int (*atomic_set_property)(struct drm_crtc *crtc,
				   struct drm_crtc_state *state,
				   struct drm_property *property,
				   uint64_t val);
R
Rob Clark 已提交
390 391 392 393
	int (*atomic_get_property)(struct drm_crtc *crtc,
				   const struct drm_crtc_state *state,
				   struct drm_property *property,
				   uint64_t *val);
D
Dave Airlie 已提交
394 395 396
};

/**
397
 * struct drm_crtc - central CRTC control structure
398
 * @dev: parent DRM device
D
Daniel Vetter 已提交
399
 * @port: OF node used by drm_of_find_possible_crtcs()
400
 * @head: list management
401
 * @mutex: per-CRTC locking
402
 * @base: base KMS object for ID tracking etc.
403 404
 * @primary: primary plane for this CRTC
 * @cursor: cursor plane for this CRTC
D
Daniel Vetter 已提交
405 406
 * @cursor_x: current x position of the cursor, used for universal cursor planes
 * @cursor_y: current y position of the cursor, used for universal cursor planes
D
Dave Airlie 已提交
407
 * @enabled: is this CRTC enabled?
408 409
 * @mode: current mode timings
 * @hwmode: mode timings as programmed to hw regs
R
Rob Clark 已提交
410 411 412
 * @invert_dimensions: for purposes of error checking crtc vs fb sizes,
 *    invert the width/height of the crtc.  This is used if the driver
 *    is performing 90 or 270 degree rotated scanout
D
Dave Airlie 已提交
413 414 415
 * @x: x position on screen
 * @y: y position on screen
 * @funcs: CRTC control functions
416 417 418
 * @gamma_size: size of gamma ramp
 * @gamma_store: gamma ramp values
 * @framedur_ns: precise frame timing
D
Daniel Vetter 已提交
419
 * @linedur_ns: precise line timing
420 421
 * @pixeldur_ns: precise pixel timing
 * @helper_private: mid-layer private data
P
Paulo Zanoni 已提交
422
 * @properties: property tracking for this CRTC
423
 * @state: current atomic state for this CRTC
D
Daniel Vetter 已提交
424 425
 * @acquire_ctx: per-CRTC implicit acquire context used by atomic drivers for
 * 	legacy ioctls
D
Dave Airlie 已提交
426 427 428 429 430 431
 *
 * Each CRTC may have one or more connectors associated with it.  This structure
 * allows the CRTC to be controlled.
 */
struct drm_crtc {
	struct drm_device *dev;
432
	struct device_node *port;
D
Dave Airlie 已提交
433 434
	struct list_head head;

435
	/*
D
Daniel Vetter 已提交
436 437 438 439 440 441
	 * crtc mutex
	 *
	 * This provides a read lock for the overall crtc state (mode, dpms
	 * state, ...) and a write lock for everything which can be update
	 * without a full modeset (fb, cursor data, ...)
	 */
442
	struct drm_modeset_lock mutex;
D
Daniel Vetter 已提交
443

D
Dave Airlie 已提交
444 445
	struct drm_mode_object base;

446 447 448 449
	/* primary and cursor planes for CRTC */
	struct drm_plane *primary;
	struct drm_plane *cursor;

450 451 452 453
	/* position of cursor plane on crtc */
	int cursor_x;
	int cursor_y;

D
Dave Airlie 已提交
454 455
	bool enabled;

456
	/* Requested mode from modesetting. */
D
Dave Airlie 已提交
457 458
	struct drm_display_mode mode;

459 460 461 462 463
	/* Programmed mode in hw, after adjustments for encoders,
	 * crtc, panel scaling etc. Needed for timestamping etc.
	 */
	struct drm_display_mode hwmode;

R
Rob Clark 已提交
464 465
	bool invert_dimensions;

D
Dave Airlie 已提交
466 467 468 469 470 471 472
	int x, y;
	const struct drm_crtc_funcs *funcs;

	/* CRTC gamma size for reporting to userspace */
	uint32_t gamma_size;
	uint16_t *gamma_store;

473
	/* Constants needed for precise vblank and swap timestamping. */
474
	int framedur_ns, linedur_ns, pixeldur_ns;
475

D
Dave Airlie 已提交
476
	/* if you are using the helper */
477
	const void *helper_private;
P
Paulo Zanoni 已提交
478 479

	struct drm_object_properties properties;
480

481 482
	struct drm_crtc_state *state;

483 484 485 486 487
	/*
	 * For legacy crtc ioctls so that atomic drivers can get at the locking
	 * acquire context.
	 */
	struct drm_modeset_acquire_ctx *acquire_ctx;
D
Dave Airlie 已提交
488 489
};

490 491
/**
 * struct drm_connector_state - mutable connector state
492
 * @connector: backpointer to the connector
D
Daniel Vetter 已提交
493
 * @crtc: CRTC to connect connector to, NULL if disabled
494
 * @best_encoder: can be used by helpers and drivers to select the encoder
495 496 497
 * @state: backpointer to global drm_atomic_state
 */
struct drm_connector_state {
498 499
	struct drm_connector *connector;

500
	struct drm_crtc *crtc;  /* do not write directly, use drm_atomic_set_crtc_for_connector() */
501

502 503
	struct drm_encoder *best_encoder;

504 505
	struct drm_atomic_state *state;
};
D
Dave Airlie 已提交
506 507

/**
508
 * struct drm_connector_funcs - control connectors on a given device
T
Thierry Reding 已提交
509
 * @dpms: set power state
D
Dave Airlie 已提交
510 511
 * @save: save connector state
 * @restore: restore connector state
512
 * @reset: reset connector after state has been invalidated (e.g. resume)
D
Dave Airlie 已提交
513
 * @detect: is this connector active?
514
 * @fill_modes: fill mode list for this connector
515
 * @set_property: property for this connector may need an update
D
Dave Airlie 已提交
516
 * @destroy: make object go away
517
 * @force: notify the driver that the connector is forced on
518 519 520
 * @atomic_duplicate_state: duplicate the atomic state for this connector
 * @atomic_destroy_state: destroy an atomic state for this connector
 * @atomic_set_property: set a property on an atomic state for this connector
R
Rob Clark 已提交
521
 *    (do not call directly, use drm_atomic_connector_set_property())
R
Rob Clark 已提交
522 523
 * @atomic_get_property: get a property on an atomic state for this connector
 *    (do not call directly, use drm_atomic_connector_get_property())
524
 *
D
Dave Airlie 已提交
525 526 527 528 529
 * Each CRTC may have one or more connectors attached to it.  The functions
 * below allow the core DRM code to control connectors, enumerate available modes,
 * etc.
 */
struct drm_connector_funcs {
530
	int (*dpms)(struct drm_connector *connector, int mode);
D
Dave Airlie 已提交
531 532
	void (*save)(struct drm_connector *connector);
	void (*restore)(struct drm_connector *connector);
533
	void (*reset)(struct drm_connector *connector);
534 535 536 537 538 539 540

	/* Check to see if anything is attached to the connector.
	 * @force is set to false whilst polling, true when checking the
	 * connector due to user request. @force can be used by the driver
	 * to avoid expensive, destructive operations during automated
	 * probing.
	 */
541
	enum drm_connector_status (*detect)(struct drm_connector *connector,
542
					    bool force);
J
Jesse Barnes 已提交
543
	int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
D
Dave Airlie 已提交
544 545 546
	int (*set_property)(struct drm_connector *connector, struct drm_property *property,
			     uint64_t val);
	void (*destroy)(struct drm_connector *connector);
547
	void (*force)(struct drm_connector *connector);
548 549 550 551

	/* atomic update handling */
	struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
	void (*atomic_destroy_state)(struct drm_connector *connector,
D
Daniel Vetter 已提交
552
				     struct drm_connector_state *state);
553 554 555 556
	int (*atomic_set_property)(struct drm_connector *connector,
				   struct drm_connector_state *state,
				   struct drm_property *property,
				   uint64_t val);
R
Rob Clark 已提交
557 558 559 560
	int (*atomic_get_property)(struct drm_connector *connector,
				   const struct drm_connector_state *state,
				   struct drm_property *property,
				   uint64_t *val);
D
Dave Airlie 已提交
561 562
};

563
/**
564
 * struct drm_encoder_funcs - encoder controls
565 566 567 568 569
 * @reset: reset state (e.g. at init or resume time)
 * @destroy: cleanup and free associated data
 *
 * Encoders sit between CRTCs and connectors.
 */
D
Dave Airlie 已提交
570
struct drm_encoder_funcs {
571
	void (*reset)(struct drm_encoder *encoder);
D
Dave Airlie 已提交
572 573 574
	void (*destroy)(struct drm_encoder *encoder);
};

575
#define DRM_CONNECTOR_MAX_ENCODER 3
D
Dave Airlie 已提交
576 577

/**
578
 * struct drm_encoder - central DRM encoder structure
J
Jesse Barnes 已提交
579 580 581
 * @dev: parent DRM device
 * @head: list management
 * @base: base KMS object
582
 * @name: encoder name
J
Jesse Barnes 已提交
583 584 585 586
 * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h
 * @possible_crtcs: bitmask of potential CRTC bindings
 * @possible_clones: bitmask of potential sibling encoders for cloning
 * @crtc: currently bound CRTC
S
Sean Paul 已提交
587
 * @bridge: bridge associated to the encoder
J
Jesse Barnes 已提交
588 589 590 591 592
 * @funcs: control functions
 * @helper_private: mid-layer private data
 *
 * CRTCs drive pixels to encoders, which convert them into signals
 * appropriate for a given connector or set of connectors.
D
Dave Airlie 已提交
593 594 595 596 597 598
 */
struct drm_encoder {
	struct drm_device *dev;
	struct list_head head;

	struct drm_mode_object base;
599
	char *name;
D
Dave Airlie 已提交
600 601 602 603 604
	int encoder_type;
	uint32_t possible_crtcs;
	uint32_t possible_clones;

	struct drm_crtc *crtc;
S
Sean Paul 已提交
605
	struct drm_bridge *bridge;
D
Dave Airlie 已提交
606
	const struct drm_encoder_funcs *funcs;
607
	const void *helper_private;
D
Dave Airlie 已提交
608 609
};

610 611 612 613 614 615 616 617 618
/* should we poll this connector for connects and disconnects */
/* hot plug detectable */
#define DRM_CONNECTOR_POLL_HPD (1 << 0)
/* poll for connections */
#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
/* can cleanly poll for disconnections without flickering the screen */
/* DACs should rarely do this without a lot of testing */
#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)

619 620
#define MAX_ELD_BYTES	128

D
Dave Airlie 已提交
621
/**
622
 * struct drm_connector - central DRM connector control structure
623 624 625 626 627
 * @dev: parent DRM device
 * @kdev: kernel device for sysfs attributes
 * @attr: sysfs attributes
 * @head: list management
 * @base: base KMS object
628
 * @name: connector name
629 630
 * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
 * @connector_type_id: index into connector type enum
D
Dave Airlie 已提交
631 632
 * @interlace_allowed: can this connector handle interlaced modes?
 * @doublescan_allowed: can this connector handle doublescan?
D
Daniel Vetter 已提交
633
 * @stereo_allowed: can this connector handle stereo modes?
634 635 636 637
 * @modes: modes available on this connector (from fill_modes() + user)
 * @status: one of the drm_connector_status enums (connected, not, or unknown)
 * @probed_modes: list of modes derived directly from the display
 * @display_info: information about attached display (e.g. from EDID)
D
Dave Airlie 已提交
638
 * @funcs: connector control functions
639
 * @edid_blob_ptr: DRM property containing EDID if present
640
 * @properties: property tracking for this connector
D
Daniel Vetter 已提交
641
 * @path_blob_ptr: DRM blob property data for the DP MST path property
642 643 644
 * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling
 * @dpms: current dpms state
 * @helper_private: mid-layer private data
D
Daniel Vetter 已提交
645
 * @cmdline_mode: mode line parsed from the kernel cmdline for this connector
646
 * @force: a %DRM_FORCE_<foo> state for forced mode sets
D
Daniel Vetter 已提交
647
 * @override_edid: has the EDID been overwritten through debugfs for testing?
648 649 650 651 652 653 654 655 656
 * @encoder_ids: valid encoders for this connector
 * @encoder: encoder driving this connector, if any
 * @eld: EDID-like data, if present
 * @dvi_dual: dual link DVI, if found
 * @max_tmds_clock: max clock rate, if found
 * @latency_present: AV delay info from ELD, if found
 * @video_latency: video latency info from ELD, if found
 * @audio_latency: audio latency info from ELD, if found
 * @null_edid_counter: track sinks that give us all zeros for the EDID
D
Daniel Vetter 已提交
657
 * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
658
 * @edid_corrupt: indicates whether the last read EDID was corrupt
D
Daniel Vetter 已提交
659
 * @debugfs_entry: debugfs directory for this connector
660
 * @state: current atomic state for this connector
661 662 663 664 665 666 667 668 669
 * @has_tile: is this connector connected to a tiled monitor
 * @tile_group: tile group for the connected monitor
 * @tile_is_single_monitor: whether the tile is one monitor housing
 * @num_h_tile: number of horizontal tiles in the tile group
 * @num_v_tile: number of vertical tiles in the tile group
 * @tile_h_loc: horizontal location of this tile
 * @tile_v_loc: vertical location of this tile
 * @tile_h_size: horizontal size of this tile.
 * @tile_v_size: vertical size of this tile.
D
Dave Airlie 已提交
670 671 672 673 674 675 676 677
 *
 * Each connector may be connected to one or more CRTCs, or may be clonable by
 * another connector if they can share a CRTC.  Each connector also has a specific
 * position in the broader display (referred to as a 'screen' though it could
 * span multiple monitors).
 */
struct drm_connector {
	struct drm_device *dev;
678
	struct device *kdev;
D
Dave Airlie 已提交
679 680 681 682 683
	struct device_attribute *attr;
	struct list_head head;

	struct drm_mode_object base;

684
	char *name;
D
Dave Airlie 已提交
685 686 687 688
	int connector_type;
	int connector_type_id;
	bool interlace_allowed;
	bool doublescan_allowed;
689
	bool stereo_allowed;
D
Dave Airlie 已提交
690 691 692 693 694 695 696 697 698 699 700
	struct list_head modes; /* list of modes on this connector */

	enum drm_connector_status status;

	/* these are modes added by probing with DDC or the BIOS */
	struct list_head probed_modes;

	struct drm_display_info display_info;
	const struct drm_connector_funcs *funcs;

	struct drm_property_blob *edid_blob_ptr;
701
	struct drm_object_properties properties;
D
Dave Airlie 已提交
702

D
Dave Airlie 已提交
703 704
	struct drm_property_blob *path_blob_ptr;

705 706
	struct drm_property_blob *tile_blob_ptr;

707 708
	uint8_t polled; /* DRM_CONNECTOR_POLL_* */

709 710 711
	/* requested DPMS state */
	int dpms;

712
	const void *helper_private;
D
Dave Airlie 已提交
713

714
	/* forced on connector */
715
	struct drm_cmdline_mode cmdline_mode;
716
	enum drm_connector_force force;
717
	bool override_edid;
D
Dave Airlie 已提交
718 719
	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
	struct drm_encoder *encoder; /* currently active encoder */
720

721 722 723 724 725 726 727
	/* EDID bits */
	uint8_t eld[MAX_ELD_BYTES];
	bool dvi_dual;
	int max_tmds_clock;	/* in MHz */
	bool latency_present[2];
	int video_latency[2];	/* [0]: progressive, [1]: interlaced */
	int audio_latency[2];
728
	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
729
	unsigned bad_edid_counter;
730

731 732 733 734 735
	/* Flag for raw EDID header corruption - used in Displayport
	 * compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6
	 */
	bool edid_corrupt;

736
	struct dentry *debugfs_entry;
737 738

	struct drm_connector_state *state;
739 740 741 742 743 744 745 746 747

	/* DisplayID bits */
	bool has_tile;
	struct drm_tile_group *tile_group;
	bool tile_is_single_monitor;

	uint8_t num_h_tile, num_v_tile;
	uint8_t tile_h_loc, tile_v_loc;
	uint16_t tile_h_size, tile_v_size;
748 749

	struct list_head destroy_list;
750 751 752 753
};

/**
 * struct drm_plane_state - mutable plane state
754
 * @plane: backpointer to the plane
755
 * @crtc: currently bound CRTC, NULL if disabled
D
Daniel Vetter 已提交
756
 * @fb: currently bound framebuffer
757
 * @fence: optional fence to wait for before scanning out @fb
758 759 760 761 762 763 764 765 766 767 768 769 770
 * @crtc_x: left position of visible portion of plane on crtc
 * @crtc_y: upper position of visible portion of plane on crtc
 * @crtc_w: width of visible portion of plane on crtc
 * @crtc_h: height of visible portion of plane on crtc
 * @src_x: left position of visible portion of plane within
 *	plane (in 16.16)
 * @src_y: upper position of visible portion of plane within
 *	plane (in 16.16)
 * @src_w: width of visible portion of plane (in 16.16)
 * @src_h: height of visible portion of plane (in 16.16)
 * @state: backpointer to global drm_atomic_state
 */
struct drm_plane_state {
771 772
	struct drm_plane *plane;

773 774
	struct drm_crtc *crtc;   /* do not write directly, use drm_atomic_set_crtc_for_plane() */
	struct drm_framebuffer *fb;  /* do not write directly, use drm_atomic_set_fb_for_plane() */
775
	struct fence *fence;
776 777 778 779 780 781 782 783 784

	/* Signed dest location allows it to be partially off screen */
	int32_t crtc_x, crtc_y;
	uint32_t crtc_w, crtc_h;

	/* Source values are 16.16 fixed point */
	uint32_t src_x, src_y;
	uint32_t src_h, src_w;

785 786 787
	/* Plane rotation */
	unsigned int rotation;

788
	struct drm_atomic_state *state;
D
Dave Airlie 已提交
789 790
};

791

J
Jesse Barnes 已提交
792
/**
793
 * struct drm_plane_funcs - driver plane control functions
J
Jesse Barnes 已提交
794 795 796
 * @update_plane: update the plane configuration
 * @disable_plane: shut down the plane
 * @destroy: clean up plane resources
D
Daniel Vetter 已提交
797
 * @reset: reset plane after state has been invalidated (e.g. resume)
R
Rob Clark 已提交
798
 * @set_property: called when a property is changed
799 800 801
 * @atomic_duplicate_state: duplicate the atomic state for this plane
 * @atomic_destroy_state: destroy an atomic state for this plane
 * @atomic_set_property: set a property on an atomic state for this plane
R
Rob Clark 已提交
802
 *    (do not call directly, use drm_atomic_plane_set_property())
R
Rob Clark 已提交
803 804
 * @atomic_get_property: get a property on an atomic state for this plane
 *    (do not call directly, use drm_atomic_plane_get_property())
J
Jesse Barnes 已提交
805 806 807 808 809 810 811 812 813 814
 */
struct drm_plane_funcs {
	int (*update_plane)(struct drm_plane *plane,
			    struct drm_crtc *crtc, struct drm_framebuffer *fb,
			    int crtc_x, int crtc_y,
			    unsigned int crtc_w, unsigned int crtc_h,
			    uint32_t src_x, uint32_t src_y,
			    uint32_t src_w, uint32_t src_h);
	int (*disable_plane)(struct drm_plane *plane);
	void (*destroy)(struct drm_plane *plane);
D
Daniel Vetter 已提交
815
	void (*reset)(struct drm_plane *plane);
R
Rob Clark 已提交
816 817 818

	int (*set_property)(struct drm_plane *plane,
			    struct drm_property *property, uint64_t val);
819 820 821 822

	/* atomic update handling */
	struct drm_plane_state *(*atomic_duplicate_state)(struct drm_plane *plane);
	void (*atomic_destroy_state)(struct drm_plane *plane,
D
Daniel Vetter 已提交
823
				     struct drm_plane_state *state);
824 825 826 827
	int (*atomic_set_property)(struct drm_plane *plane,
				   struct drm_plane_state *state,
				   struct drm_property *property,
				   uint64_t val);
R
Rob Clark 已提交
828 829 830 831
	int (*atomic_get_property)(struct drm_plane *plane,
				   const struct drm_plane_state *state,
				   struct drm_property *property,
				   uint64_t *val);
J
Jesse Barnes 已提交
832 833
};

834 835 836 837 838 839
enum drm_plane_type {
	DRM_PLANE_TYPE_OVERLAY,
	DRM_PLANE_TYPE_PRIMARY,
	DRM_PLANE_TYPE_CURSOR,
};

J
Jesse Barnes 已提交
840
/**
841
 * struct drm_plane - central DRM plane control structure
J
Jesse Barnes 已提交
842 843 844 845 846 847
 * @dev: DRM device this plane belongs to
 * @head: for list management
 * @base: base mode object
 * @possible_crtcs: pipes this plane can be bound to
 * @format_types: array of formats supported by this plane
 * @format_count: number of formats supported
848
 * @format_default: driver hasn't supplied supported formats for the plane
J
Jesse Barnes 已提交
849 850
 * @crtc: currently bound CRTC
 * @fb: currently bound fb
D
Daniel Vetter 已提交
851 852
 * @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used by
 * 	drm_mode_set_config_internal() to implement correct refcounting.
J
Jesse Barnes 已提交
853
 * @funcs: helper functions
R
Rob Clark 已提交
854
 * @properties: property tracking for this plane
855
 * @type: type of plane (overlay, primary, cursor)
856
 * @state: current atomic state for this plane
J
Jesse Barnes 已提交
857 858 859 860 861
 */
struct drm_plane {
	struct drm_device *dev;
	struct list_head head;

D
Daniel Vetter 已提交
862 863
	struct drm_modeset_lock mutex;

J
Jesse Barnes 已提交
864 865 866 867 868
	struct drm_mode_object base;

	uint32_t possible_crtcs;
	uint32_t *format_types;
	uint32_t format_count;
869
	bool format_default;
J
Jesse Barnes 已提交
870 871 872 873

	struct drm_crtc *crtc;
	struct drm_framebuffer *fb;

874 875
	struct drm_framebuffer *old_fb;

J
Jesse Barnes 已提交
876
	const struct drm_plane_funcs *funcs;
R
Rob Clark 已提交
877 878

	struct drm_object_properties properties;
879 880

	enum drm_plane_type type;
881

882
	const void *helper_private;
D
Daniel Vetter 已提交
883

884
	struct drm_plane_state *state;
J
Jesse Barnes 已提交
885 886
};

S
Sean Paul 已提交
887
/**
888
 * struct drm_bridge_funcs - drm_bridge control functions
889
 * @attach: Called during drm_bridge_attach
S
Sean Paul 已提交
890 891 892 893 894 895 896 897
 * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge
 * @disable: Called right before encoder prepare, disables the bridge
 * @post_disable: Called right after encoder prepare, for lockstepped disable
 * @mode_set: Set this mode to the bridge
 * @pre_enable: Called right before encoder commit, for lockstepped commit
 * @enable: Called right after encoder commit, enables the bridge
 */
struct drm_bridge_funcs {
898
	int (*attach)(struct drm_bridge *bridge);
S
Sean Paul 已提交
899 900 901 902 903 904 905 906 907 908 909 910 911
	bool (*mode_fixup)(struct drm_bridge *bridge,
			   const struct drm_display_mode *mode,
			   struct drm_display_mode *adjusted_mode);
	void (*disable)(struct drm_bridge *bridge);
	void (*post_disable)(struct drm_bridge *bridge);
	void (*mode_set)(struct drm_bridge *bridge,
			 struct drm_display_mode *mode,
			 struct drm_display_mode *adjusted_mode);
	void (*pre_enable)(struct drm_bridge *bridge);
	void (*enable)(struct drm_bridge *bridge);
};

/**
912
 * struct drm_bridge - central DRM bridge control structure
S
Sean Paul 已提交
913
 * @dev: DRM device this bridge belongs to
914 915
 * @encoder: encoder to which this bridge is connected
 * @next: the next bridge in the encoder chain
916 917
 * @of_node: device node pointer to the bridge
 * @list: to keep track of all added bridges
S
Sean Paul 已提交
918 919 920 921 922 923
 * @base: base mode object
 * @funcs: control functions
 * @driver_private: pointer to the bridge driver's internal context
 */
struct drm_bridge {
	struct drm_device *dev;
924
	struct drm_encoder *encoder;
925
	struct drm_bridge *next;
926 927 928 929
#ifdef CONFIG_OF
	struct device_node *of_node;
#endif
	struct list_head list;
S
Sean Paul 已提交
930 931 932 933 934

	const struct drm_bridge_funcs *funcs;
	void *driver_private;
};

D
Daniel Vetter 已提交
935
/**
R
Rob Clark 已提交
936
 * struct drm_atomic_state - the global state object for atomic updates
D
Daniel Vetter 已提交
937
 * @dev: parent DRM device
R
Rob Clark 已提交
938
 * @allow_modeset: allow full modeset
939
 * @legacy_cursor_update: hint to enforce legacy cursor ioctl semantics
D
Daniel Vetter 已提交
940 941 942 943
 * @planes: pointer to array of plane pointers
 * @plane_states: pointer to array of plane states pointers
 * @crtcs: pointer to array of CRTC pointers
 * @crtc_states: pointer to array of CRTC states pointers
944
 * @num_connector: size of the @connectors and @connector_states arrays
D
Daniel Vetter 已提交
945 946 947 948 949 950
 * @connectors: pointer to array of connector pointers
 * @connector_states: pointer to array of connector states pointers
 * @acquire_ctx: acquire context for this atomic modeset state update
 */
struct drm_atomic_state {
	struct drm_device *dev;
R
Rob Clark 已提交
951
	bool allow_modeset : 1;
952
	bool legacy_cursor_update : 1;
D
Daniel Vetter 已提交
953 954 955 956
	struct drm_plane **planes;
	struct drm_plane_state **plane_states;
	struct drm_crtc **crtcs;
	struct drm_crtc_state **crtc_states;
957
	int num_connector;
D
Daniel Vetter 已提交
958 959 960 961 962 963 964
	struct drm_connector **connectors;
	struct drm_connector_state **connector_states;

	struct drm_modeset_acquire_ctx *acquire_ctx;
};


D
Dave Airlie 已提交
965
/**
966
 * struct drm_mode_set - new values for a CRTC config change
967 968 969 970 971 972 973
 * @fb: framebuffer to use for new config
 * @crtc: CRTC whose configuration we're about to change
 * @mode: mode timings to use
 * @x: position of this CRTC relative to @fb
 * @y: position of this CRTC relative to @fb
 * @connectors: array of connectors to drive with this CRTC if possible
 * @num_connectors: size of @connectors array
D
Dave Airlie 已提交
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992
 *
 * Represents a single crtc the connectors that it drives with what mode
 * and from which framebuffer it scans out from.
 *
 * This is used to set modes.
 */
struct drm_mode_set {
	struct drm_framebuffer *fb;
	struct drm_crtc *crtc;
	struct drm_display_mode *mode;

	uint32_t x;
	uint32_t y;

	struct drm_connector **connectors;
	size_t num_connectors;
};

/**
993 994 995
 * struct drm_mode_config_funcs - basic driver provided mode setting functions
 * @fb_create: create a new framebuffer object
 * @output_poll_changed: function to handle output configuration changes
J
John Hunter 已提交
996
 * @atomic_check: check whether a given atomic state update is possible
D
Daniel Vetter 已提交
997 998
 * @atomic_commit: commit an atomic state update previously verified with
 * 	atomic_check()
999 1000 1001
 * @atomic_state_alloc: allocate a new atomic state
 * @atomic_state_clear: clear the atomic state
 * @atomic_state_free: free the atomic state
1002 1003 1004
 *
 * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that
 * involve drivers.
D
Dave Airlie 已提交
1005 1006
 */
struct drm_mode_config_funcs {
1007 1008 1009
	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
					     struct drm_file *file_priv,
					     struct drm_mode_fb_cmd2 *mode_cmd);
1010
	void (*output_poll_changed)(struct drm_device *dev);
D
Daniel Vetter 已提交
1011 1012 1013 1014 1015 1016

	int (*atomic_check)(struct drm_device *dev,
			    struct drm_atomic_state *a);
	int (*atomic_commit)(struct drm_device *dev,
			     struct drm_atomic_state *a,
			     bool async);
1017 1018 1019
	struct drm_atomic_state *(*atomic_state_alloc)(struct drm_device *dev);
	void (*atomic_state_clear)(struct drm_atomic_state *state);
	void (*atomic_state_free)(struct drm_atomic_state *state);
D
Dave Airlie 已提交
1020 1021 1022
};

/**
D
Daniel Vetter 已提交
1023
 * struct drm_mode_config - Mode configuration control structure
1024
 * @mutex: mutex protecting KMS related lists and structures
D
Daniel Vetter 已提交
1025 1026 1027
 * @connection_mutex: ww mutex protecting connector state and routing
 * @acquire_ctx: global implicit acquire context used by atomic drivers for
 * 	legacy ioctls
1028 1029
 * @idr_mutex: mutex for KMS ID allocation and management
 * @crtc_idr: main KMS ID tracking object
D
Daniel Vetter 已提交
1030
 * @fb_lock: mutex to protect fb state and lists
1031 1032 1033 1034 1035 1036
 * @num_fb: number of fbs available
 * @fb_list: list of framebuffers available
 * @num_connector: number of connectors on this device
 * @connector_list: list of connector objects
 * @num_encoder: number of encoders on this device
 * @encoder_list: list of encoder objects
D
Daniel Vetter 已提交
1037 1038 1039
 * @num_overlay_plane: number of overlay planes on this device
 * @num_total_plane: number of universal (i.e. with primary/curso) planes on this device
 * @plane_list: list of plane objects
1040 1041
 * @num_crtc: number of CRTCs on this device
 * @crtc_list: list of CRTC objects
D
Daniel Vetter 已提交
1042
 * @property_list: list of property objects
1043 1044 1045 1046 1047 1048
 * @min_width: minimum pixel width on this device
 * @min_height: minimum pixel height on this device
 * @max_width: maximum pixel width on this device
 * @max_height: maximum pixel height on this device
 * @funcs: core driver provided mode setting functions
 * @fb_base: base address of the framebuffer
D
Daniel Vetter 已提交
1049 1050
 * @poll_enabled: track polling support for this device
 * @poll_running: track polling status for this device
1051
 * @output_poll_work: delayed work for polling in process context
D
Daniel Vetter 已提交
1052
 * @property_blob_list: list of all the blob property objects
D
Daniel Stone 已提交
1053
 * @blob_lock: mutex for blob property allocation and management
1054
 * @*_property: core property tracking
D
Daniel Vetter 已提交
1055 1056 1057 1058 1059
 * @preferred_depth: preferred RBG pixel depth, used by fb helpers
 * @prefer_shadow: hint to userspace to prefer shadow-fb rendering
 * @async_page_flip: does this device support async flips on the primary plane?
 * @cursor_width: hint to userspace for max cursor width
 * @cursor_height: hint to userspace for max cursor height
D
Dave Airlie 已提交
1060
 *
1061 1062 1063
 * Core mode resource tracking structure.  All CRTC, encoders, and connectors
 * enumerated by the driver are added here, as are global properties.  Some
 * global restrictions are also here, e.g. dimension restrictions.
D
Dave Airlie 已提交
1064 1065
 */
struct drm_mode_config {
J
Jesse Barnes 已提交
1066
	struct mutex mutex; /* protects configuration (mode lists etc.) */
1067 1068
	struct drm_modeset_lock connection_mutex; /* protects connector->encoder and encoder->crtc links */
	struct drm_modeset_acquire_ctx *acquire_ctx; /* for legacy _lock_all() / _unlock_all() */
J
Jesse Barnes 已提交
1069
	struct mutex idr_mutex; /* for IDR management */
D
Dave Airlie 已提交
1070
	struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
D
Dave Airlie 已提交
1071
	struct idr tile_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
D
Dave Airlie 已提交
1072
	/* this is limited to one for now */
1073

D
Daniel Vetter 已提交
1074
	struct mutex fb_lock; /* proctects global and per-file fb lists */
D
Dave Airlie 已提交
1075 1076
	int num_fb;
	struct list_head fb_list;
1077

D
Dave Airlie 已提交
1078 1079 1080 1081
	int num_connector;
	struct list_head connector_list;
	int num_encoder;
	struct list_head encoder_list;
1082 1083 1084 1085 1086 1087 1088 1089 1090

	/*
	 * Track # of overlay planes separately from # of total planes.  By
	 * default we only advertise overlay planes to userspace; if userspace
	 * sets the "universal plane" capability bit, we'll go ahead and
	 * expose all planes.
	 */
	int num_overlay_plane;
	int num_total_plane;
J
Jesse Barnes 已提交
1091
	struct list_head plane_list;
D
Dave Airlie 已提交
1092 1093 1094 1095 1096 1097 1098 1099

	int num_crtc;
	struct list_head crtc_list;

	struct list_head property_list;

	int min_width, min_height;
	int max_width, max_height;
1100
	const struct drm_mode_config_funcs *funcs;
1101
	resource_size_t fb_base;
D
Dave Airlie 已提交
1102

1103 1104
	/* output poll support */
	bool poll_enabled;
1105
	bool poll_running;
1106
	bool delayed_event;
1107
	struct delayed_work output_poll_work;
1108

D
Daniel Stone 已提交
1109 1110
	struct mutex blob_lock;

D
Dave Airlie 已提交
1111 1112 1113 1114
	/* pointers to standard properties */
	struct list_head property_blob_list;
	struct drm_property *edid_property;
	struct drm_property *dpms_property;
D
Dave Airlie 已提交
1115
	struct drm_property *path_property;
1116
	struct drm_property *tile_property;
R
Rob Clark 已提交
1117
	struct drm_property *plane_type_property;
1118
	struct drm_property *rotation_property;
R
Rob Clark 已提交
1119 1120 1121 1122 1123 1124 1125 1126 1127 1128
	struct drm_property *prop_src_x;
	struct drm_property *prop_src_y;
	struct drm_property *prop_src_w;
	struct drm_property *prop_src_h;
	struct drm_property *prop_crtc_x;
	struct drm_property *prop_crtc_y;
	struct drm_property *prop_crtc_w;
	struct drm_property *prop_crtc_h;
	struct drm_property *prop_fb_id;
	struct drm_property *prop_crtc_id;
1129
	struct drm_property *prop_active;
D
Daniel Stone 已提交
1130
	struct drm_property *prop_mode_id;
D
Dave Airlie 已提交
1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143

	/* DVI-I properties */
	struct drm_property *dvi_i_subconnector_property;
	struct drm_property *dvi_i_select_subconnector_property;

	/* TV properties */
	struct drm_property *tv_subconnector_property;
	struct drm_property *tv_select_subconnector_property;
	struct drm_property *tv_mode_property;
	struct drm_property *tv_left_margin_property;
	struct drm_property *tv_right_margin_property;
	struct drm_property *tv_top_margin_property;
	struct drm_property *tv_bottom_margin_property;
1144 1145 1146
	struct drm_property *tv_brightness_property;
	struct drm_property *tv_contrast_property;
	struct drm_property *tv_flicker_reduction_property;
1147 1148 1149
	struct drm_property *tv_overscan_property;
	struct drm_property *tv_saturation_property;
	struct drm_property *tv_hue_property;
D
Dave Airlie 已提交
1150 1151 1152

	/* Optional properties */
	struct drm_property *scaling_mode_property;
1153
	struct drm_property *aspect_ratio_property;
1154
	struct drm_property *dirty_info_property;
1155

1156 1157 1158 1159
	/* properties for virtual machine layout */
	struct drm_property *suggested_x_property;
	struct drm_property *suggested_y_property;

1160 1161
	/* dumb ioctl parameters */
	uint32_t preferred_depth, prefer_shadow;
1162 1163 1164

	/* whether async page flip is supported or not */
	bool async_page_flip;
A
Alex Deucher 已提交
1165

1166 1167 1168
	/* whether the driver supports fb modifiers */
	bool allow_fb_modifiers;

A
Alex Deucher 已提交
1169 1170
	/* cursor size */
	uint32_t cursor_width, cursor_height;
D
Dave Airlie 已提交
1171 1172
};

R
Rob Clark 已提交
1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185
/**
 * drm_for_each_plane_mask - iterate over planes specified by bitmask
 * @plane: the loop cursor
 * @dev: the DRM device
 * @plane_mask: bitmask of plane indices
 *
 * Iterate over all planes specified by bitmask.
 */
#define drm_for_each_plane_mask(plane, dev, plane_mask) \
	list_for_each_entry((plane), &(dev)->mode_config.plane_list, head) \
		if ((plane_mask) & (1 << drm_plane_index(plane)))


D
Dave Airlie 已提交
1186 1187 1188 1189 1190 1191 1192
#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
#define obj_to_connector(x) container_of(x, struct drm_connector, base)
#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
#define obj_to_property(x) container_of(x, struct drm_property, base)
#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
J
Jesse Barnes 已提交
1193
#define obj_to_plane(x) container_of(x, struct drm_plane, base)
D
Dave Airlie 已提交
1194

1195 1196 1197 1198
struct drm_prop_enum_list {
	int type;
	char *name;
};
D
Dave Airlie 已提交
1199

1200 1201 1202
extern int drm_crtc_init_with_planes(struct drm_device *dev,
				     struct drm_crtc *crtc,
				     struct drm_plane *primary,
1203
				     struct drm_plane *cursor,
1204
				     const struct drm_crtc_funcs *funcs);
D
Dave Airlie 已提交
1205
extern void drm_crtc_cleanup(struct drm_crtc *crtc);
1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218
extern unsigned int drm_crtc_index(struct drm_crtc *crtc);

/**
 * drm_crtc_mask - find the mask of a registered CRTC
 * @crtc: CRTC to find mask for
 *
 * Given a registered CRTC, return the mask bit of that CRTC for an
 * encoder's possible_crtcs field.
 */
static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc)
{
	return 1 << drm_crtc_index(crtc);
}
D
Dave Airlie 已提交
1219

1220 1221
extern void drm_connector_ida_init(void);
extern void drm_connector_ida_destroy(void);
1222 1223 1224 1225
extern int drm_connector_init(struct drm_device *dev,
			      struct drm_connector *connector,
			      const struct drm_connector_funcs *funcs,
			      int connector_type);
1226 1227
int drm_connector_register(struct drm_connector *connector);
void drm_connector_unregister(struct drm_connector *connector);
D
Dave Airlie 已提交
1228 1229

extern void drm_connector_cleanup(struct drm_connector *connector);
1230
extern unsigned int drm_connector_index(struct drm_connector *connector);
1231 1232
/* helper to unplug all connectors from sysfs for device */
extern void drm_connector_unplug_all(struct drm_device *dev);
D
Dave Airlie 已提交
1233

1234 1235 1236 1237
extern int drm_bridge_add(struct drm_bridge *bridge);
extern void drm_bridge_remove(struct drm_bridge *bridge);
extern struct drm_bridge *of_drm_find_bridge(struct device_node *np);
extern int drm_bridge_attach(struct drm_device *dev, struct drm_bridge *bridge);
S
Sean Paul 已提交
1238

1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249
bool drm_bridge_mode_fixup(struct drm_bridge *bridge,
			const struct drm_display_mode *mode,
			struct drm_display_mode *adjusted_mode);
void drm_bridge_disable(struct drm_bridge *bridge);
void drm_bridge_post_disable(struct drm_bridge *bridge);
void drm_bridge_mode_set(struct drm_bridge *bridge,
			struct drm_display_mode *mode,
			struct drm_display_mode *adjusted_mode);
void drm_bridge_pre_enable(struct drm_bridge *bridge);
void drm_bridge_enable(struct drm_bridge *bridge);

1250 1251 1252 1253
extern int drm_encoder_init(struct drm_device *dev,
			    struct drm_encoder *encoder,
			    const struct drm_encoder_funcs *funcs,
			    int encoder_type);
D
Dave Airlie 已提交
1254

1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
/**
 * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
 * @encoder: encoder to test
 * @crtc: crtc to test
 *
 * Return false if @encoder can't be driven by @crtc, true otherwise.
 */
static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
				       struct drm_crtc *crtc)
{
	return !!(encoder->possible_crtcs & drm_crtc_mask(crtc));
}

M
Matt Roper 已提交
1268 1269 1270 1271 1272 1273 1274
extern int drm_universal_plane_init(struct drm_device *dev,
				    struct drm_plane *plane,
				    unsigned long possible_crtcs,
				    const struct drm_plane_funcs *funcs,
				    const uint32_t *formats,
				    uint32_t format_count,
				    enum drm_plane_type type);
J
Jesse Barnes 已提交
1275 1276 1277 1278
extern int drm_plane_init(struct drm_device *dev,
			  struct drm_plane *plane,
			  unsigned long possible_crtcs,
			  const struct drm_plane_funcs *funcs,
R
Rob Clark 已提交
1279
			  const uint32_t *formats, uint32_t format_count,
M
Matt Roper 已提交
1280
			  bool is_primary);
J
Jesse Barnes 已提交
1281
extern void drm_plane_cleanup(struct drm_plane *plane);
1282
extern unsigned int drm_plane_index(struct drm_plane *plane);
1283
extern struct drm_plane * drm_plane_from_index(struct drm_device *dev, int idx);
1284
extern void drm_plane_force_disable(struct drm_plane *plane);
1285 1286
extern int drm_plane_check_pixel_format(const struct drm_plane *plane,
					u32 format);
1287 1288
extern void drm_crtc_get_hv_timing(const struct drm_display_mode *mode,
				   int *hdisplay, int *vdisplay);
1289 1290 1291 1292
extern int drm_crtc_check_viewport(const struct drm_crtc *crtc,
				   int x, int y,
				   const struct drm_display_mode *mode,
				   const struct drm_framebuffer *fb);
J
Jesse Barnes 已提交
1293

D
Dave Airlie 已提交
1294 1295
extern void drm_encoder_cleanup(struct drm_encoder *encoder);

1296
extern const char *drm_get_connector_status_name(enum drm_connector_status status);
1297
extern const char *drm_get_subpixel_order_name(enum subpixel_order order);
1298 1299 1300 1301 1302
extern const char *drm_get_dpms_name(int val);
extern const char *drm_get_dvi_i_subconnector_name(int val);
extern const char *drm_get_dvi_i_select_name(int val);
extern const char *drm_get_tv_subconnector_name(int val);
extern const char *drm_get_tv_select_name(int val);
1303
extern void drm_fb_release(struct drm_file *file_priv);
1304 1305
extern void drm_property_destroy_user_blobs(struct drm_device *dev,
                                            struct drm_file *file_priv);
A
Adam Jackson 已提交
1306
extern bool drm_probe_ddc(struct i2c_adapter *adapter);
D
Dave Airlie 已提交
1307 1308
extern struct edid *drm_get_edid(struct drm_connector *connector,
				 struct i2c_adapter *adapter);
J
Jani Nikula 已提交
1309
extern struct edid *drm_edid_duplicate(const struct edid *edid);
D
Dave Airlie 已提交
1310 1311
extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
extern void drm_mode_config_init(struct drm_device *dev);
1312
extern void drm_mode_config_reset(struct drm_device *dev);
D
Dave Airlie 已提交
1313
extern void drm_mode_config_cleanup(struct drm_device *dev);
1314

D
Dave Airlie 已提交
1315
extern int drm_mode_connector_set_path_property(struct drm_connector *connector,
1316
						const char *path);
1317
int drm_mode_connector_set_tile_property(struct drm_connector *connector);
D
Dave Airlie 已提交
1318
extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
1319
						   const struct edid *edid);
R
Rob Clark 已提交
1320

1321 1322 1323 1324
extern int drm_display_info_set_bus_formats(struct drm_display_info *info,
					    const u32 *formats,
					    unsigned int num_formats);

R
Rob Clark 已提交
1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340
static inline bool drm_property_type_is(struct drm_property *property,
		uint32_t type)
{
	/* instanceof for props.. handles extended type vs original types: */
	if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
		return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type;
	return property->flags & type;
}

static inline bool drm_property_type_valid(struct drm_property *property)
{
	if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
		return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
	return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
}

1341 1342 1343 1344 1345 1346
extern int drm_object_property_set_value(struct drm_mode_object *obj,
					 struct drm_property *property,
					 uint64_t val);
extern int drm_object_property_get_value(struct drm_mode_object *obj,
					 struct drm_property *property,
					 uint64_t *value);
D
Dave Airlie 已提交
1347 1348 1349
extern int drm_framebuffer_init(struct drm_device *dev,
				struct drm_framebuffer *fb,
				const struct drm_framebuffer_funcs *funcs);
1350 1351
extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
						      uint32_t id);
R
Rob Clark 已提交
1352 1353 1354
extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
D
Dave Airlie 已提交
1355
extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
1356
extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
D
Dave Airlie 已提交
1357

1358 1359 1360
extern void drm_object_attach_property(struct drm_mode_object *obj,
				       struct drm_property *property,
				       uint64_t init_val);
D
Dave Airlie 已提交
1361 1362
extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
						const char *name, int num_values);
1363 1364
extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
					 const char *name,
R
Rob Clark 已提交
1365 1366 1367 1368
					 const struct drm_prop_enum_list *props,
					 int num_values);
struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
					 int flags, const char *name,
1369
					 const struct drm_prop_enum_list *props,
1370 1371
					 int num_props,
					 uint64_t supported_bits);
1372 1373 1374
struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
					 const char *name,
					 uint64_t min, uint64_t max);
R
Rob Clark 已提交
1375 1376 1377
struct drm_property *drm_property_create_signed_range(struct drm_device *dev,
					 int flags, const char *name,
					 int64_t min, int64_t max);
R
Rob Clark 已提交
1378 1379
struct drm_property *drm_property_create_object(struct drm_device *dev,
					 int flags, const char *name, uint32_t type);
1380 1381
struct drm_property *drm_property_create_bool(struct drm_device *dev, int flags,
					 const char *name);
1382 1383 1384 1385 1386 1387 1388
struct drm_property_blob *drm_property_create_blob(struct drm_device *dev,
                                                   size_t length,
                                                   const void *data);
struct drm_property_blob *drm_property_lookup_blob(struct drm_device *dev,
                                                   uint32_t id);
struct drm_property_blob *drm_property_reference_blob(struct drm_property_blob *blob);
void drm_property_unreference_blob(struct drm_property_blob *blob);
D
Dave Airlie 已提交
1389 1390 1391 1392
extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
extern int drm_property_add_enum(struct drm_property *property, int index,
				 uint64_t value, const char *name);
extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
1393 1394 1395
extern int drm_mode_create_tv_properties(struct drm_device *dev,
					 unsigned int num_modes,
					 char *modes[]);
D
Dave Airlie 已提交
1396
extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
1397
extern int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
1398
extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
1399
extern int drm_mode_create_suggested_offset_properties(struct drm_device *dev);
R
Rob Clark 已提交
1400 1401 1402 1403
extern bool drm_property_change_valid_get(struct drm_property *property,
					 uint64_t value, struct drm_mode_object **ref);
extern void drm_property_change_valid_put(struct drm_property *property,
		struct drm_mode_object *ref);
D
Dave Airlie 已提交
1404 1405 1406

extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
					     struct drm_encoder *encoder);
1407
extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
D
Dave Airlie 已提交
1408
					 int gamma_size);
1409 1410
extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
		uint32_t id, uint32_t type);
R
Rob Clark 已提交
1411

D
Dave Airlie 已提交
1412 1413 1414
/* IOCTLs */
extern int drm_mode_getresources(struct drm_device *dev,
				 void *data, struct drm_file *file_priv);
J
Jesse Barnes 已提交
1415 1416
extern int drm_mode_getplane_res(struct drm_device *dev, void *data,
				   struct drm_file *file_priv);
D
Dave Airlie 已提交
1417 1418 1419 1420
extern int drm_mode_getcrtc(struct drm_device *dev,
			    void *data, struct drm_file *file_priv);
extern int drm_mode_getconnector(struct drm_device *dev,
			      void *data, struct drm_file *file_priv);
1421
extern int drm_mode_set_config_internal(struct drm_mode_set *set);
D
Dave Airlie 已提交
1422 1423
extern int drm_mode_setcrtc(struct drm_device *dev,
			    void *data, struct drm_file *file_priv);
J
Jesse Barnes 已提交
1424 1425 1426 1427
extern int drm_mode_getplane(struct drm_device *dev,
			       void *data, struct drm_file *file_priv);
extern int drm_mode_setplane(struct drm_device *dev,
			       void *data, struct drm_file *file_priv);
D
Dave Airlie 已提交
1428 1429
extern int drm_mode_cursor_ioctl(struct drm_device *dev,
				void *data, struct drm_file *file_priv);
1430 1431
extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
				void *data, struct drm_file *file_priv);
D
Dave Airlie 已提交
1432 1433
extern int drm_mode_addfb(struct drm_device *dev,
			  void *data, struct drm_file *file_priv);
1434 1435 1436
extern int drm_mode_addfb2(struct drm_device *dev,
			   void *data, struct drm_file *file_priv);
extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
D
Dave Airlie 已提交
1437 1438 1439 1440
extern int drm_mode_rmfb(struct drm_device *dev,
			 void *data, struct drm_file *file_priv);
extern int drm_mode_getfb(struct drm_device *dev,
			  void *data, struct drm_file *file_priv);
1441 1442
extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
				  void *data, struct drm_file *file_priv);
D
Dave Airlie 已提交
1443 1444 1445 1446 1447

extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
				      void *data, struct drm_file *file_priv);
extern int drm_mode_getblob_ioctl(struct drm_device *dev,
				  void *data, struct drm_file *file_priv);
1448 1449 1450 1451
extern int drm_mode_createblob_ioctl(struct drm_device *dev,
				     void *data, struct drm_file *file_priv);
extern int drm_mode_destroyblob_ioctl(struct drm_device *dev,
				      void *data, struct drm_file *file_priv);
D
Dave Airlie 已提交
1452 1453 1454 1455 1456 1457 1458 1459
extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
					      void *data, struct drm_file *file_priv);
extern int drm_mode_getencoder(struct drm_device *dev,
			       void *data, struct drm_file *file_priv);
extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
				    void *data, struct drm_file *file_priv);
extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
				    void *data, struct drm_file *file_priv);
1460
extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
1461
extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
1462
extern bool drm_detect_hdmi_monitor(struct edid *edid);
1463
extern bool drm_detect_monitor_audio(struct edid *edid);
1464
extern bool drm_rgb_quant_range_selectable(struct edid *edid);
1465 1466
extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
				    void *data, struct drm_file *file_priv);
1467 1468
extern int drm_add_modes_noedid(struct drm_connector *connector,
				int hdisplay, int vdisplay);
G
Gerd Hoffmann 已提交
1469 1470
extern void drm_set_preferred_mode(struct drm_connector *connector,
				   int hpref, int vpref);
1471

1472
extern int drm_edid_header_is_valid(const u8 *raw_edid);
1473 1474
extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
				 bool *edid_corrupt);
1475
extern bool drm_edid_is_valid(struct edid *edid);
D
Dave Airlie 已提交
1476 1477 1478 1479 1480 1481 1482

extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,
							 char topology[8]);
extern struct drm_tile_group *drm_mode_get_tile_group(struct drm_device *dev,
					       char topology[8]);
extern void drm_mode_put_tile_group(struct drm_device *dev,
				   struct drm_tile_group *tg);
D
Dave Airlie 已提交
1483
struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
1484 1485
					   int hsize, int vsize, int fresh,
					   bool rb);
1486 1487 1488 1489 1490 1491 1492

extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
				      void *data, struct drm_file *file_priv);
extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
				    void *data, struct drm_file *file_priv);
extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
				      void *data, struct drm_file *file_priv);
1493 1494 1495 1496
extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
					     struct drm_file *file_priv);
extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
					   struct drm_file *file_priv);
1497 1498 1499
extern int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
				       struct drm_property *property,
				       uint64_t value);
R
Rob Clark 已提交
1500 1501
extern int drm_mode_atomic_ioctl(struct drm_device *dev,
				 void *data, struct drm_file *file_priv);
1502 1503 1504

extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
				 int *bpp);
1505
extern int drm_format_num_planes(uint32_t format);
1506
extern int drm_format_plane_cpp(uint32_t format, int plane);
1507 1508
extern int drm_format_horz_chroma_subsampling(uint32_t format);
extern int drm_format_vert_chroma_subsampling(uint32_t format);
1509
extern const char *drm_get_format_name(uint32_t format);
1510 1511
extern struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
							      unsigned int supported_rotations);
1512 1513
extern unsigned int drm_rotation_simplify(unsigned int rotation,
					  unsigned int supported_rotations);
1514

R
Russell King 已提交
1515
/* Helpers */
R
Rob Clark 已提交
1516 1517 1518 1519 1520 1521 1522 1523 1524

static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
		uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PLANE);
	return mo ? obj_to_plane(mo) : NULL;
}

R
Russell King 已提交
1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540
static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
	uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC);
	return mo ? obj_to_crtc(mo) : NULL;
}

static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
	uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
	return mo ? obj_to_encoder(mo) : NULL;
}

R
Rob Clark 已提交
1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556
static inline struct drm_connector *drm_connector_find(struct drm_device *dev,
		uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
	return mo ? obj_to_connector(mo) : NULL;
}

static inline struct drm_property *drm_property_find(struct drm_device *dev,
		uint32_t id)
{
	struct drm_mode_object *mo;
	mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY);
	return mo ? obj_to_property(mo) : NULL;
}

1557
/* Plane list iterator for legacy (overlay only) planes. */
1558 1559
#define drm_for_each_legacy_plane(plane, dev) \
	list_for_each_entry(plane, &(dev)->mode_config.plane_list, head) \
1560 1561
		if (plane->type == DRM_PLANE_TYPE_OVERLAY)

1562 1563 1564 1565 1566 1567
#define drm_for_each_plane(plane, dev) \
	list_for_each_entry(plane, &(dev)->mode_config.plane_list, head)

#define drm_for_each_crtc(crtc, dev) \
	list_for_each_entry(crtc, &(dev)->mode_config.crtc_list, head)

1568 1569 1570
static inline void
assert_drm_connector_list_read_locked(struct drm_mode_config *mode_config)
{
1571 1572 1573 1574 1575 1576 1577 1578 1579
	/*
	 * The connector hotadd/remove code currently grabs both locks when
	 * updating lists. Hence readers need only hold either of them to be
	 * safe and the check amounts to
	 *
	 * WARN_ON(not_holding(A) && not_holding(B)).
	 */
	WARN_ON(!mutex_is_locked(&mode_config->mutex) &&
		!drm_modeset_is_locked(&mode_config->connection_mutex));
1580 1581
}

1582
#define drm_for_each_connector(connector, dev) \
1583 1584 1585 1586 1587
	for (assert_drm_connector_list_read_locked(&(dev)->mode_config),	\
	     connector = list_first_entry(&(dev)->mode_config.connector_list,	\
					  struct drm_connector, head);		\
	     &connector->head != (&(dev)->mode_config.connector_list);		\
	     connector = list_next_entry(connector, head))
1588 1589 1590 1591 1592

#define drm_for_each_encoder(encoder, dev) \
	list_for_each_entry(encoder, &(dev)->mode_config.encoder_list, head)

#define drm_for_each_fb(fb, dev) \
1593 1594 1595 1596 1597
	for (WARN_ON(!mutex_is_locked(&(dev)->mode_config.fb_lock)),		\
	     fb = list_first_entry(&(dev)->mode_config.fb_list,	\
					  struct drm_framebuffer, head);	\
	     &fb->head != (&(dev)->mode_config.fb_list);			\
	     fb = list_next_entry(fb, head))
1598

D
Dave Airlie 已提交
1599
#endif /* __DRM_CRTC_H__ */