blob: 56147409408d73c119991da93e1a0848d3a5eb52 [file] [log] [blame]
Dave Airlief453ba02008-11-07 14:05:41 -08001/*
2 * Copyright © 2006 Keith Packard
3 * Copyright © 2007-2008 Dave Airlie
4 * Copyright © 2007-2008 Intel Corporation
5 * Jesse Barnes <jesse.barnes@intel.com>
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 <linux/i2c.h>
29#include <linux/spinlock.h>
30#include <linux/types.h>
31#include <linux/idr.h>
Dave Airlief453ba02008-11-07 14:05:41 -080032#include <linux/fb.h>
Vandana Kannan985e5dc2013-12-19 15:34:07 +053033#include <linux/hdmi.h>
David Herrmannd7d2c482014-08-29 12:12:40 +020034#include <uapi/drm/drm_mode.h>
35#include <uapi/drm/drm_fourcc.h>
Rob Clark51fd3712013-11-19 12:10:12 -050036#include <drm/drm_modeset_lock.h>
Jesse Barnes308e5bc2011-11-14 14:51:28 -080037
Dave Airlief453ba02008-11-07 14:05:41 -080038struct drm_device;
39struct drm_mode_set;
40struct drm_framebuffer;
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -030041struct drm_object_properties;
Thierry Reding595887e2012-11-21 15:00:47 +010042struct drm_file;
43struct drm_clip_rect;
Russell King7e435aa2014-06-15 11:07:12 +010044struct device_node;
Dave Airlief453ba02008-11-07 14:05:41 -080045
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
Jesse Barnes8cf5c912011-11-14 14:51:27 -080053#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
Sean Paul3b336ec2013-08-14 16:47:37 -040054#define DRM_MODE_OBJECT_BRIDGE 0xbdbdbdbd
Rob Clark98f75de2014-05-30 11:37:03 -040055#define DRM_MODE_OBJECT_ANY 0
Dave Airlief453ba02008-11-07 14:05:41 -080056
57struct drm_mode_object {
58 uint32_t id;
59 uint32_t type;
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -030060 struct drm_object_properties *properties;
61};
62
Paulo Zanonife456162012-06-12 11:27:01 -030063#define DRM_OBJECT_MAX_PROPERTY 24
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -030064struct drm_object_properties {
Paulo Zanoni7f88a9b2012-05-15 18:09:04 -030065 int count;
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -030066 uint32_t ids[DRM_OBJECT_MAX_PROPERTY];
67 uint64_t values[DRM_OBJECT_MAX_PROPERTY];
Dave Airlief453ba02008-11-07 14:05:41 -080068};
69
Rob Clarkebc44cf2012-09-12 22:22:31 -050070static inline int64_t U642I64(uint64_t val)
71{
72 return (int64_t)*((int64_t *)&val);
73}
74static inline uint64_t I642U64(int64_t val)
75{
76 return (uint64_t)*((uint64_t *)&val);
77}
78
Ville Syrjälä06596962014-07-08 10:31:51 +053079/* 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
86
Daniel Vetter55310002014-01-23 15:52:20 +010087enum 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 */
Dave Airlief453ba02008-11-07 14:05:41 -080092};
93
Daniel Vetter55310002014-01-23 15:52:20 +010094#include <drm/drm_modes.h>
Damien Lespiau4aa17cf2013-09-25 16:45:21 +010095
Dave Airlief453ba02008-11-07 14:05:41 -080096enum drm_connector_status {
97 connector_status_connected = 1,
98 connector_status_disconnected = 2,
99 connector_status_unknown = 3,
100};
101
102enum subpixel_order {
103 SubPixelUnknown = 0,
104 SubPixelHorizontalRGB,
105 SubPixelHorizontalBGR,
106 SubPixelVerticalRGB,
107 SubPixelVerticalBGR,
108 SubPixelNone,
109};
110
Jesse Barnesda05a5a72011-04-15 13:48:57 -0700111#define DRM_COLOR_FORMAT_RGB444 (1<<0)
112#define DRM_COLOR_FORMAT_YCRCB444 (1<<1)
113#define DRM_COLOR_FORMAT_YCRCB422 (1<<2)
Dave Airlief453ba02008-11-07 14:05:41 -0800114/*
115 * Describes a given display (e.g. CRT or flat panel) and its limitations.
116 */
117struct drm_display_info {
118 char name[DRM_DISPLAY_INFO_LEN];
Adam Jacksonfb439642010-08-03 14:38:16 -0400119
Dave Airlief453ba02008-11-07 14:05:41 -0800120 /* Physical size */
121 unsigned int width_mm;
122 unsigned int height_mm;
123
Dave Airlief453ba02008-11-07 14:05:41 -0800124 /* Clock limits FIXME: storage format */
125 unsigned int min_vfreq, max_vfreq;
126 unsigned int min_hfreq, max_hfreq;
127 unsigned int pixel_clock;
Jesse Barnes3b112282011-04-15 12:49:23 -0700128 unsigned int bpc;
Dave Airlief453ba02008-11-07 14:05:41 -0800129
Dave Airlief453ba02008-11-07 14:05:41 -0800130 enum subpixel_order subpixel_order;
Jesse Barnesda05a5a72011-04-15 13:48:57 -0700131 u32 color_formats;
Dave Airlief453ba02008-11-07 14:05:41 -0800132
Mario Kleiner5d02626d2014-06-05 09:52:10 -0400133 /* Mask of supported hdmi deep color modes */
134 u8 edid_hdmi_dc_modes;
135
Jesse Barnesebec9a72011-08-03 09:22:54 -0700136 u8 cea_rev;
Dave Airlief453ba02008-11-07 14:05:41 -0800137};
138
139struct drm_framebuffer_funcs {
Rob Clarkf7eff602012-09-05 21:48:38 +0000140 /* note: use drm_framebuffer_remove() */
Dave Airlief453ba02008-11-07 14:05:41 -0800141 void (*destroy)(struct drm_framebuffer *framebuffer);
142 int (*create_handle)(struct drm_framebuffer *fb,
143 struct drm_file *file_priv,
144 unsigned int *handle);
Daniel Vetter3bf04012014-10-27 16:54:27 +0100145 /*
146 * Optional callback for the dirty fb ioctl.
Jakob Bornecrantz884840a2009-12-03 23:25:47 +0000147 *
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 */
Thomas Hellstrom02b00162010-10-05 12:43:02 +0200157 int (*dirty)(struct drm_framebuffer *framebuffer,
158 struct drm_file *file_priv, unsigned flags,
Jakob Bornecrantz884840a2009-12-03 23:25:47 +0000159 unsigned color, struct drm_clip_rect *clips,
160 unsigned num_clips);
Dave Airlief453ba02008-11-07 14:05:41 -0800161};
162
163struct drm_framebuffer {
164 struct drm_device *dev;
Rob Clarkf7eff602012-09-05 21:48:38 +0000165 /*
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;
Daniel Vetter4b096ac2012-12-10 21:19:18 +0100175 /*
176 * Place on the dev->mode_config.fb_list, access protected by
177 * dev->mode_config.fb_lock.
178 */
Dave Airlief453ba02008-11-07 14:05:41 -0800179 struct list_head head;
180 struct drm_mode_object base;
181 const struct drm_framebuffer_funcs *funcs;
Ville Syrjälä01f2c772011-12-20 00:06:49 +0200182 unsigned int pitches[4];
183 unsigned int offsets[4];
Dave Airlief453ba02008-11-07 14:05:41 -0800184 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;
Jesse Barnes308e5bc2011-11-14 14:51:28 -0800190 uint32_t pixel_format; /* fourcc format */
Dave Airlief453ba02008-11-07 14:05:41 -0800191 struct list_head filp_head;
Dave Airlie785b93e2009-08-28 15:46:53 +1000192 /* if you are using the helper */
193 void *helper_private;
Dave Airlief453ba02008-11-07 14:05:41 -0800194};
195
196struct drm_property_blob {
197 struct drm_mode_object base;
198 struct list_head head;
199 unsigned int length;
Ville Syrjäläd63f5e62012-03-13 12:35:49 +0200200 unsigned char data[];
Dave Airlief453ba02008-11-07 14:05:41 -0800201};
202
203struct drm_property_enum {
204 uint64_t value;
205 struct list_head head;
206 char name[DRM_PROP_NAME_LEN];
207};
208
209struct 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;
Rob Clark98f75de2014-05-30 11:37:03 -0400216 struct drm_device *dev;
Dave Airlief453ba02008-11-07 14:05:41 -0800217
218 struct list_head enum_blob_list;
219};
220
221struct drm_crtc;
222struct drm_connector;
223struct drm_encoder;
Kristian Høgsbergd91d8a32009-11-17 12:43:55 -0500224struct drm_pending_vblank_event;
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800225struct drm_plane;
Sean Paul3b336ec2013-08-14 16:47:37 -0400226struct drm_bridge;
Daniel Vetter144ecb92014-10-27 20:28:44 +0100227struct drm_atomic_state;
228
229/**
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200230 * struct drm_crtc_state - mutable CRTC state
Daniel Vetter144ecb92014-10-27 20:28:44 +0100231 * @enable: whether the CRTC should be enabled, gates all other state
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100232 * @planes_changed: for use by helpers and drivers when computing state updates
Daniel Vetter144ecb92014-10-27 20:28:44 +0100233 * @mode: current mode timings
234 * @event: optional pointer to a DRM event to signal upon completion of the
235 * state update
236 * @state: backpointer to global drm_atomic_state
237 */
238struct drm_crtc_state {
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200239 bool enable;
Daniel Vetter144ecb92014-10-27 20:28:44 +0100240
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100241 /* computed state bits used by helpers and drivers */
242 bool planes_changed : 1;
243
Daniel Vetter144ecb92014-10-27 20:28:44 +0100244 struct drm_display_mode mode;
245
246 struct drm_pending_vblank_event *event;
247
248 struct drm_atomic_state *state;
249};
Dave Airlief453ba02008-11-07 14:05:41 -0800250
251/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100252 * struct drm_crtc_funcs - control CRTCs for a given device
Dave Airlief453ba02008-11-07 14:05:41 -0800253 * @save: save CRTC state
Laurent Pinchart3b02ab82012-05-17 13:27:20 +0200254 * @restore: restore CRTC state
Christopher Harvey715f59c2013-04-05 15:28:32 +0000255 * @reset: reset CRTC after state has been invalidated (e.g. resume)
Laurent Pinchart3b02ab82012-05-17 13:27:20 +0200256 * @cursor_set: setup the cursor
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100257 * @cursor_set2: setup the cursor with hotspot, superseeds @cursor_set if set
Laurent Pinchart3b02ab82012-05-17 13:27:20 +0200258 * @cursor_move: move the cursor
Dave Airlief453ba02008-11-07 14:05:41 -0800259 * @gamma_set: specify color ramp for CRTC
Paulo Zanonibffd9de02012-05-15 18:09:05 -0300260 * @destroy: deinit and free object
261 * @set_property: called when a property is changed
Laurent Pinchart3b02ab82012-05-17 13:27:20 +0200262 * @set_config: apply a new CRTC configuration
263 * @page_flip: initiate a page flip
Daniel Vetter144ecb92014-10-27 20:28:44 +0100264 * @atomic_duplicate_state: duplicate the atomic state for this CRTC
265 * @atomic_destroy_state: destroy an atomic state for this CRTC
266 * @atomic_set_property: set a property on an atomic state for this CRTC
Dave Airlief453ba02008-11-07 14:05:41 -0800267 *
268 * The drm_crtc_funcs structure is the central CRTC management structure
269 * in the DRM. Each CRTC controls one or more connectors (note that the name
270 * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
271 * connectors, not just CRTs).
272 *
273 * Each driver is responsible for filling out this structure at startup time,
274 * in addition to providing other modesetting features, like i2c and DDC
275 * bus accessors.
276 */
277struct drm_crtc_funcs {
278 /* Save CRTC state */
279 void (*save)(struct drm_crtc *crtc); /* suspend? */
280 /* Restore CRTC state */
281 void (*restore)(struct drm_crtc *crtc); /* resume? */
Chris Wilsoneb033552011-01-24 15:11:08 +0000282 /* Reset CRTC state */
283 void (*reset)(struct drm_crtc *crtc);
Dave Airlief453ba02008-11-07 14:05:41 -0800284
285 /* cursor controls */
286 int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
287 uint32_t handle, uint32_t width, uint32_t height);
Dave Airlie4c813d42013-06-20 11:48:52 +1000288 int (*cursor_set2)(struct drm_crtc *crtc, struct drm_file *file_priv,
289 uint32_t handle, uint32_t width, uint32_t height,
290 int32_t hot_x, int32_t hot_y);
Dave Airlief453ba02008-11-07 14:05:41 -0800291 int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
292
293 /* Set gamma on the CRTC */
294 void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
James Simmons72034252010-08-03 01:33:19 +0100295 uint32_t start, uint32_t size);
Dave Airlief453ba02008-11-07 14:05:41 -0800296 /* Object destroy routine */
297 void (*destroy)(struct drm_crtc *crtc);
298
299 int (*set_config)(struct drm_mode_set *set);
Kristian Høgsbergd91d8a32009-11-17 12:43:55 -0500300
301 /*
302 * Flip to the given framebuffer. This implements the page
Lucas De Marchi25985ed2011-03-30 22:57:33 -0300303 * flip ioctl described in drm_mode.h, specifically, the
Kristian Høgsbergd91d8a32009-11-17 12:43:55 -0500304 * implementation must return immediately and block all
305 * rendering to the current fb until the flip has completed.
306 * If userspace set the event flag in the ioctl, the event
307 * argument will point to an event to send back when the flip
308 * completes, otherwise it will be NULL.
309 */
310 int (*page_flip)(struct drm_crtc *crtc,
311 struct drm_framebuffer *fb,
Keith Packarded8d1972013-07-22 18:49:58 -0700312 struct drm_pending_vblank_event *event,
313 uint32_t flags);
Paulo Zanonibffd9de02012-05-15 18:09:05 -0300314
315 int (*set_property)(struct drm_crtc *crtc,
316 struct drm_property *property, uint64_t val);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100317
318 /* atomic update handling */
319 struct drm_crtc_state *(*atomic_duplicate_state)(struct drm_crtc *crtc);
320 void (*atomic_destroy_state)(struct drm_crtc *crtc,
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200321 struct drm_crtc_state *state);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100322 int (*atomic_set_property)(struct drm_crtc *crtc,
323 struct drm_crtc_state *state,
324 struct drm_property *property,
325 uint64_t val);
Dave Airlief453ba02008-11-07 14:05:41 -0800326};
327
328/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100329 * struct drm_crtc - central CRTC control structure
Jesse Barnes77491632011-11-07 12:03:14 -0800330 * @dev: parent DRM device
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100331 * @port: OF node used by drm_of_find_possible_crtcs()
Jesse Barnes77491632011-11-07 12:03:14 -0800332 * @head: list management
Rob Clark51fd3712013-11-19 12:10:12 -0500333 * @mutex: per-CRTC locking
Jesse Barnes77491632011-11-07 12:03:14 -0800334 * @base: base KMS object for ID tracking etc.
Matt Ropere13161a2014-04-01 15:22:38 -0700335 * @primary: primary plane for this CRTC
336 * @cursor: cursor plane for this CRTC
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100337 * @cursor_x: current x position of the cursor, used for universal cursor planes
338 * @cursor_y: current y position of the cursor, used for universal cursor planes
Dave Airlief453ba02008-11-07 14:05:41 -0800339 * @enabled: is this CRTC enabled?
Jesse Barnes77491632011-11-07 12:03:14 -0800340 * @mode: current mode timings
341 * @hwmode: mode timings as programmed to hw regs
Rob Clark7c80e122012-09-04 16:35:56 +0000342 * @invert_dimensions: for purposes of error checking crtc vs fb sizes,
343 * invert the width/height of the crtc. This is used if the driver
344 * is performing 90 or 270 degree rotated scanout
Dave Airlief453ba02008-11-07 14:05:41 -0800345 * @x: x position on screen
346 * @y: y position on screen
Dave Airlief453ba02008-11-07 14:05:41 -0800347 * @funcs: CRTC control functions
Jesse Barnes77491632011-11-07 12:03:14 -0800348 * @gamma_size: size of gamma ramp
349 * @gamma_store: gamma ramp values
350 * @framedur_ns: precise frame timing
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100351 * @linedur_ns: precise line timing
Jesse Barnes77491632011-11-07 12:03:14 -0800352 * @pixeldur_ns: precise pixel timing
353 * @helper_private: mid-layer private data
Paulo Zanonibffd9de02012-05-15 18:09:05 -0300354 * @properties: property tracking for this CRTC
Daniel Vetter144ecb92014-10-27 20:28:44 +0100355 * @state: current atomic state for this CRTC
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100356 * @acquire_ctx: per-CRTC implicit acquire context used by atomic drivers for
357 * legacy ioctls
Dave Airlief453ba02008-11-07 14:05:41 -0800358 *
359 * Each CRTC may have one or more connectors associated with it. This structure
360 * allows the CRTC to be controlled.
361 */
362struct drm_crtc {
363 struct drm_device *dev;
Russell King7e435aa2014-06-15 11:07:12 +0100364 struct device_node *port;
Dave Airlief453ba02008-11-07 14:05:41 -0800365 struct list_head head;
366
Daniel Vetter3bf04012014-10-27 16:54:27 +0100367 /*
Daniel Vetter29494c12012-12-02 02:18:25 +0100368 * crtc mutex
369 *
370 * This provides a read lock for the overall crtc state (mode, dpms
371 * state, ...) and a write lock for everything which can be update
372 * without a full modeset (fb, cursor data, ...)
373 */
Rob Clark51fd3712013-11-19 12:10:12 -0500374 struct drm_modeset_lock mutex;
Daniel Vetter29494c12012-12-02 02:18:25 +0100375
Dave Airlief453ba02008-11-07 14:05:41 -0800376 struct drm_mode_object base;
377
Matt Ropere13161a2014-04-01 15:22:38 -0700378 /* primary and cursor planes for CRTC */
379 struct drm_plane *primary;
380 struct drm_plane *cursor;
381
Matt Roper161d0dc2014-06-10 08:28:10 -0700382 /* position of cursor plane on crtc */
383 int cursor_x;
384 int cursor_y;
385
Dave Airlief453ba02008-11-07 14:05:41 -0800386 bool enabled;
387
Mario Kleiner27641c32010-10-23 04:20:23 +0200388 /* Requested mode from modesetting. */
Dave Airlief453ba02008-11-07 14:05:41 -0800389 struct drm_display_mode mode;
390
Mario Kleiner27641c32010-10-23 04:20:23 +0200391 /* Programmed mode in hw, after adjustments for encoders,
392 * crtc, panel scaling etc. Needed for timestamping etc.
393 */
394 struct drm_display_mode hwmode;
395
Rob Clark7c80e122012-09-04 16:35:56 +0000396 bool invert_dimensions;
397
Dave Airlief453ba02008-11-07 14:05:41 -0800398 int x, y;
Dave Airlief453ba02008-11-07 14:05:41 -0800399 const struct drm_crtc_funcs *funcs;
400
401 /* CRTC gamma size for reporting to userspace */
402 uint32_t gamma_size;
403 uint16_t *gamma_store;
404
Mario Kleiner27641c32010-10-23 04:20:23 +0200405 /* Constants needed for precise vblank and swap timestamping. */
Ville Syrjälä3c184f62013-10-26 17:38:52 +0300406 int framedur_ns, linedur_ns, pixeldur_ns;
Mario Kleiner27641c32010-10-23 04:20:23 +0200407
Dave Airlief453ba02008-11-07 14:05:41 -0800408 /* if you are using the helper */
409 void *helper_private;
Paulo Zanonibffd9de02012-05-15 18:09:05 -0300410
411 struct drm_object_properties properties;
Daniel Vetterd059f652014-07-25 18:07:40 +0200412
Daniel Vetter144ecb92014-10-27 20:28:44 +0100413 struct drm_crtc_state *state;
414
Daniel Vetterd059f652014-07-25 18:07:40 +0200415 /*
416 * For legacy crtc ioctls so that atomic drivers can get at the locking
417 * acquire context.
418 */
419 struct drm_modeset_acquire_ctx *acquire_ctx;
Dave Airlief453ba02008-11-07 14:05:41 -0800420};
421
Daniel Vetter144ecb92014-10-27 20:28:44 +0100422/**
423 * struct drm_connector_state - mutable connector state
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200424 * @crtc: CRTC to connect connector to, NULL if disabled
Daniel Vetter144ecb92014-10-27 20:28:44 +0100425 * @state: backpointer to global drm_atomic_state
426 */
427struct drm_connector_state {
428 struct drm_crtc *crtc;
429
430 struct drm_atomic_state *state;
431};
Dave Airlief453ba02008-11-07 14:05:41 -0800432
433/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100434 * struct drm_connector_funcs - control connectors on a given device
Dave Airlief453ba02008-11-07 14:05:41 -0800435 * @dpms: set power state (see drm_crtc_funcs above)
436 * @save: save connector state
437 * @restore: restore connector state
Christopher Harvey13bcf012013-03-07 10:42:25 -0500438 * @reset: reset connector after state has been invalidated (e.g. resume)
Dave Airlief453ba02008-11-07 14:05:41 -0800439 * @detect: is this connector active?
Laurent Pinchart3b02ab82012-05-17 13:27:20 +0200440 * @fill_modes: fill mode list for this connector
Christopher Harvey13bcf012013-03-07 10:42:25 -0500441 * @set_property: property for this connector may need an update
Dave Airlief453ba02008-11-07 14:05:41 -0800442 * @destroy: make object go away
Christopher Harvey13bcf012013-03-07 10:42:25 -0500443 * @force: notify the driver that the connector is forced on
Daniel Vetter144ecb92014-10-27 20:28:44 +0100444 * @atomic_duplicate_state: duplicate the atomic state for this connector
445 * @atomic_destroy_state: destroy an atomic state for this connector
446 * @atomic_set_property: set a property on an atomic state for this connector
447 *
Dave Airlief453ba02008-11-07 14:05:41 -0800448 * Each CRTC may have one or more connectors attached to it. The functions
449 * below allow the core DRM code to control connectors, enumerate available modes,
450 * etc.
451 */
452struct drm_connector_funcs {
453 void (*dpms)(struct drm_connector *connector, int mode);
454 void (*save)(struct drm_connector *connector);
455 void (*restore)(struct drm_connector *connector);
Chris Wilsoneb033552011-01-24 15:11:08 +0000456 void (*reset)(struct drm_connector *connector);
Chris Wilson930a9e22010-09-14 11:07:23 +0100457
458 /* Check to see if anything is attached to the connector.
459 * @force is set to false whilst polling, true when checking the
460 * connector due to user request. @force can be used by the driver
461 * to avoid expensive, destructive operations during automated
462 * probing.
463 */
Chris Wilson7b334fc2010-09-09 23:51:02 +0100464 enum drm_connector_status (*detect)(struct drm_connector *connector,
Chris Wilson930a9e22010-09-14 11:07:23 +0100465 bool force);
Jesse Barnes40a518d2009-01-12 12:05:32 -0800466 int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
Dave Airlief453ba02008-11-07 14:05:41 -0800467 int (*set_property)(struct drm_connector *connector, struct drm_property *property,
468 uint64_t val);
469 void (*destroy)(struct drm_connector *connector);
Dave Airlied50ba252009-09-23 14:44:08 +1000470 void (*force)(struct drm_connector *connector);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100471
472 /* atomic update handling */
473 struct drm_connector_state *(*atomic_duplicate_state)(struct drm_connector *connector);
474 void (*atomic_destroy_state)(struct drm_connector *connector,
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200475 struct drm_connector_state *state);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100476 int (*atomic_set_property)(struct drm_connector *connector,
477 struct drm_connector_state *state,
478 struct drm_property *property,
479 uint64_t val);
Dave Airlief453ba02008-11-07 14:05:41 -0800480};
481
Jesse Barnes6c3db922011-11-07 12:03:16 -0800482/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100483 * struct drm_encoder_funcs - encoder controls
Jesse Barnes6c3db922011-11-07 12:03:16 -0800484 * @reset: reset state (e.g. at init or resume time)
485 * @destroy: cleanup and free associated data
486 *
487 * Encoders sit between CRTCs and connectors.
488 */
Dave Airlief453ba02008-11-07 14:05:41 -0800489struct drm_encoder_funcs {
Chris Wilsoneb033552011-01-24 15:11:08 +0000490 void (*reset)(struct drm_encoder *encoder);
Dave Airlief453ba02008-11-07 14:05:41 -0800491 void (*destroy)(struct drm_encoder *encoder);
492};
493
Ben Skeggsafe887d2012-01-12 16:00:57 +1000494#define DRM_CONNECTOR_MAX_ENCODER 3
Dave Airlief453ba02008-11-07 14:05:41 -0800495
496/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100497 * struct drm_encoder - central DRM encoder structure
Jesse Barnesdb3e4492011-11-07 12:03:17 -0800498 * @dev: parent DRM device
499 * @head: list management
500 * @base: base KMS object
Jani Nikulae5748942014-05-14 16:58:20 +0300501 * @name: encoder name
Jesse Barnesdb3e4492011-11-07 12:03:17 -0800502 * @encoder_type: one of the %DRM_MODE_ENCODER_<foo> types in drm_mode.h
503 * @possible_crtcs: bitmask of potential CRTC bindings
504 * @possible_clones: bitmask of potential sibling encoders for cloning
505 * @crtc: currently bound CRTC
Sean Paul3b336ec2013-08-14 16:47:37 -0400506 * @bridge: bridge associated to the encoder
Jesse Barnesdb3e4492011-11-07 12:03:17 -0800507 * @funcs: control functions
508 * @helper_private: mid-layer private data
509 *
510 * CRTCs drive pixels to encoders, which convert them into signals
511 * appropriate for a given connector or set of connectors.
Dave Airlief453ba02008-11-07 14:05:41 -0800512 */
513struct drm_encoder {
514 struct drm_device *dev;
515 struct list_head head;
516
517 struct drm_mode_object base;
Jani Nikulae5748942014-05-14 16:58:20 +0300518 char *name;
Dave Airlief453ba02008-11-07 14:05:41 -0800519 int encoder_type;
520 uint32_t possible_crtcs;
521 uint32_t possible_clones;
522
523 struct drm_crtc *crtc;
Sean Paul3b336ec2013-08-14 16:47:37 -0400524 struct drm_bridge *bridge;
Dave Airlief453ba02008-11-07 14:05:41 -0800525 const struct drm_encoder_funcs *funcs;
526 void *helper_private;
527};
528
Dave Airlieeb1f8e42010-05-07 06:42:51 +0000529/* should we poll this connector for connects and disconnects */
530/* hot plug detectable */
531#define DRM_CONNECTOR_POLL_HPD (1 << 0)
532/* poll for connections */
533#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
534/* can cleanly poll for disconnections without flickering the screen */
535/* DACs should rarely do this without a lot of testing */
536#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
537
Wu Fengguang76adaa342011-09-05 14:23:20 +0800538#define MAX_ELD_BYTES 128
539
Dave Airlief453ba02008-11-07 14:05:41 -0800540/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100541 * struct drm_connector - central DRM connector control structure
Jesse Barnes72252542011-11-07 12:03:18 -0800542 * @dev: parent DRM device
543 * @kdev: kernel device for sysfs attributes
544 * @attr: sysfs attributes
545 * @head: list management
546 * @base: base KMS object
Jani Nikula2abdd312014-05-14 16:58:19 +0300547 * @name: connector name
Jesse Barnes72252542011-11-07 12:03:18 -0800548 * @connector_type: one of the %DRM_MODE_CONNECTOR_<foo> types from drm_mode.h
549 * @connector_type_id: index into connector type enum
Dave Airlief453ba02008-11-07 14:05:41 -0800550 * @interlace_allowed: can this connector handle interlaced modes?
551 * @doublescan_allowed: can this connector handle doublescan?
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100552 * @stereo_allowed: can this connector handle stereo modes?
Jesse Barnes72252542011-11-07 12:03:18 -0800553 * @modes: modes available on this connector (from fill_modes() + user)
554 * @status: one of the drm_connector_status enums (connected, not, or unknown)
555 * @probed_modes: list of modes derived directly from the display
556 * @display_info: information about attached display (e.g. from EDID)
Dave Airlief453ba02008-11-07 14:05:41 -0800557 * @funcs: connector control functions
Jesse Barnes72252542011-11-07 12:03:18 -0800558 * @edid_blob_ptr: DRM property containing EDID if present
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -0300559 * @properties: property tracking for this connector
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100560 * @path_blob_ptr: DRM blob property data for the DP MST path property
Jesse Barnes72252542011-11-07 12:03:18 -0800561 * @polled: a %DRM_CONNECTOR_POLL_<foo> value for core driven polling
562 * @dpms: current dpms state
563 * @helper_private: mid-layer private data
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100564 * @cmdline_mode: mode line parsed from the kernel cmdline for this connector
Jesse Barnes72252542011-11-07 12:03:18 -0800565 * @force: a %DRM_FORCE_<foo> state for forced mode sets
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100566 * @override_edid: has the EDID been overwritten through debugfs for testing?
Jesse Barnes72252542011-11-07 12:03:18 -0800567 * @encoder_ids: valid encoders for this connector
568 * @encoder: encoder driving this connector, if any
569 * @eld: EDID-like data, if present
570 * @dvi_dual: dual link DVI, if found
571 * @max_tmds_clock: max clock rate, if found
572 * @latency_present: AV delay info from ELD, if found
573 * @video_latency: video latency info from ELD, if found
574 * @audio_latency: audio latency info from ELD, if found
575 * @null_edid_counter: track sinks that give us all zeros for the EDID
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100576 * @bad_edid_counter: track sinks that give us an EDID with invalid checksum
577 * @debugfs_entry: debugfs directory for this connector
Daniel Vetter144ecb92014-10-27 20:28:44 +0100578 * @state: current atomic state for this connector
Dave Airlief453ba02008-11-07 14:05:41 -0800579 *
580 * Each connector may be connected to one or more CRTCs, or may be clonable by
581 * another connector if they can share a CRTC. Each connector also has a specific
582 * position in the broader display (referred to as a 'screen' though it could
583 * span multiple monitors).
584 */
585struct drm_connector {
586 struct drm_device *dev;
Dave Airlie5bdebb12013-10-11 14:07:25 +1000587 struct device *kdev;
Dave Airlief453ba02008-11-07 14:05:41 -0800588 struct device_attribute *attr;
589 struct list_head head;
590
591 struct drm_mode_object base;
592
Jani Nikula2abdd312014-05-14 16:58:19 +0300593 char *name;
Dave Airlief453ba02008-11-07 14:05:41 -0800594 int connector_type;
595 int connector_type_id;
596 bool interlace_allowed;
597 bool doublescan_allowed;
Damien Lespiau560a0672013-09-25 16:45:29 +0100598 bool stereo_allowed;
Dave Airlief453ba02008-11-07 14:05:41 -0800599 struct list_head modes; /* list of modes on this connector */
600
Dave Airlief453ba02008-11-07 14:05:41 -0800601 enum drm_connector_status status;
602
603 /* these are modes added by probing with DDC or the BIOS */
604 struct list_head probed_modes;
605
606 struct drm_display_info display_info;
607 const struct drm_connector_funcs *funcs;
608
Dave Airlief453ba02008-11-07 14:05:41 -0800609 struct drm_property_blob *edid_blob_ptr;
Paulo Zanoni7e3bdf42012-05-15 18:09:01 -0300610 struct drm_object_properties properties;
Dave Airlief453ba02008-11-07 14:05:41 -0800611
Dave Airlie43aba7e2014-06-05 14:01:31 +1000612 struct drm_property_blob *path_blob_ptr;
613
Dave Airlieeb1f8e42010-05-07 06:42:51 +0000614 uint8_t polled; /* DRM_CONNECTOR_POLL_* */
615
Keith Packardc9fb15f2009-05-30 20:42:28 -0700616 /* requested DPMS state */
617 int dpms;
618
Dave Airlief453ba02008-11-07 14:05:41 -0800619 void *helper_private;
620
Dave Airlied50ba252009-09-23 14:44:08 +1000621 /* forced on connector */
Chris Wilsoneaf99c72014-08-06 10:08:32 +0200622 struct drm_cmdline_mode cmdline_mode;
Dave Airlied50ba252009-09-23 14:44:08 +1000623 enum drm_connector_force force;
Thomas Wood4cf2b282014-06-18 17:52:33 +0100624 bool override_edid;
Dave Airlief453ba02008-11-07 14:05:41 -0800625 uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
Dave Airlief453ba02008-11-07 14:05:41 -0800626 struct drm_encoder *encoder; /* currently active encoder */
Dave Airlie4a9a8b72011-06-14 06:13:55 +0000627
Wu Fengguang76adaa342011-09-05 14:23:20 +0800628 /* EDID bits */
629 uint8_t eld[MAX_ELD_BYTES];
630 bool dvi_dual;
631 int max_tmds_clock; /* in MHz */
632 bool latency_present[2];
633 int video_latency[2]; /* [0]: progressive, [1]: interlaced */
634 int audio_latency[2];
Dave Airlie4a9a8b72011-06-14 06:13:55 +0000635 int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
Jerome Glisse0b2443e2012-08-09 11:25:51 -0400636 unsigned bad_edid_counter;
Thomas Wood30f65702014-06-18 17:52:32 +0100637
638 struct dentry *debugfs_entry;
Daniel Vetter144ecb92014-10-27 20:28:44 +0100639
640 struct drm_connector_state *state;
Dave Airlief453ba02008-11-07 14:05:41 -0800641};
642
643/**
Daniel Vetter144ecb92014-10-27 20:28:44 +0100644 * struct drm_plane_state - mutable plane state
645 * @crtc: currently bound CRTC, NULL if disabled
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200646 * @fb: currently bound framebuffer
Daniel Vetter144ecb92014-10-27 20:28:44 +0100647 * @crtc_x: left position of visible portion of plane on crtc
648 * @crtc_y: upper position of visible portion of plane on crtc
649 * @crtc_w: width of visible portion of plane on crtc
650 * @crtc_h: height of visible portion of plane on crtc
651 * @src_x: left position of visible portion of plane within
652 * plane (in 16.16)
653 * @src_y: upper position of visible portion of plane within
654 * plane (in 16.16)
655 * @src_w: width of visible portion of plane (in 16.16)
656 * @src_h: height of visible portion of plane (in 16.16)
657 * @state: backpointer to global drm_atomic_state
658 */
659struct drm_plane_state {
660 struct drm_crtc *crtc;
661 struct drm_framebuffer *fb;
662
663 /* Signed dest location allows it to be partially off screen */
664 int32_t crtc_x, crtc_y;
665 uint32_t crtc_w, crtc_h;
666
667 /* Source values are 16.16 fixed point */
668 uint32_t src_x, src_y;
669 uint32_t src_h, src_w;
670
671 struct drm_atomic_state *state;
672};
673
674
675/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100676 * struct drm_plane_funcs - driver plane control functions
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800677 * @update_plane: update the plane configuration
678 * @disable_plane: shut down the plane
679 * @destroy: clean up plane resources
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100680 * @reset: reset plane after state has been invalidated (e.g. resume)
Rob Clark4d939142012-05-17 02:23:27 -0600681 * @set_property: called when a property is changed
Daniel Vetter144ecb92014-10-27 20:28:44 +0100682 * @atomic_duplicate_state: duplicate the atomic state for this plane
683 * @atomic_destroy_state: destroy an atomic state for this plane
684 * @atomic_set_property: set a property on an atomic state for this plane
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800685 */
686struct drm_plane_funcs {
687 int (*update_plane)(struct drm_plane *plane,
688 struct drm_crtc *crtc, struct drm_framebuffer *fb,
689 int crtc_x, int crtc_y,
690 unsigned int crtc_w, unsigned int crtc_h,
691 uint32_t src_x, uint32_t src_y,
692 uint32_t src_w, uint32_t src_h);
693 int (*disable_plane)(struct drm_plane *plane);
694 void (*destroy)(struct drm_plane *plane);
Daniel Vetter2a0d7cf2014-07-29 15:32:37 +0200695 void (*reset)(struct drm_plane *plane);
Rob Clark4d939142012-05-17 02:23:27 -0600696
697 int (*set_property)(struct drm_plane *plane,
698 struct drm_property *property, uint64_t val);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100699
700 /* atomic update handling */
701 struct drm_plane_state *(*atomic_duplicate_state)(struct drm_plane *plane);
702 void (*atomic_destroy_state)(struct drm_plane *plane,
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200703 struct drm_plane_state *state);
Daniel Vetter144ecb92014-10-27 20:28:44 +0100704 int (*atomic_set_property)(struct drm_plane *plane,
705 struct drm_plane_state *state,
706 struct drm_property *property,
707 uint64_t val);
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800708};
709
Matt Ropere27dde32014-04-01 15:22:30 -0700710enum drm_plane_type {
711 DRM_PLANE_TYPE_OVERLAY,
712 DRM_PLANE_TYPE_PRIMARY,
713 DRM_PLANE_TYPE_CURSOR,
714};
715
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800716/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100717 * struct drm_plane - central DRM plane control structure
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800718 * @dev: DRM device this plane belongs to
719 * @head: for list management
720 * @base: base mode object
721 * @possible_crtcs: pipes this plane can be bound to
722 * @format_types: array of formats supported by this plane
723 * @format_count: number of formats supported
724 * @crtc: currently bound CRTC
725 * @fb: currently bound fb
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100726 * @old_fb: Temporary tracking of the old fb while a modeset is ongoing. Used by
727 * drm_mode_set_config_internal() to implement correct refcounting.
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800728 * @funcs: helper functions
Rob Clark4d939142012-05-17 02:23:27 -0600729 * @properties: property tracking for this plane
Matt Ropere27dde32014-04-01 15:22:30 -0700730 * @type: type of plane (overlay, primary, cursor)
Daniel Vetter144ecb92014-10-27 20:28:44 +0100731 * @state: current atomic state for this plane
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800732 */
733struct drm_plane {
734 struct drm_device *dev;
735 struct list_head head;
736
737 struct drm_mode_object base;
738
739 uint32_t possible_crtcs;
740 uint32_t *format_types;
741 uint32_t format_count;
742
743 struct drm_crtc *crtc;
744 struct drm_framebuffer *fb;
745
Daniel Vetter3d30a592014-07-27 13:42:42 +0200746 struct drm_framebuffer *old_fb;
747
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800748 const struct drm_plane_funcs *funcs;
Rob Clark4d939142012-05-17 02:23:27 -0600749
750 struct drm_object_properties properties;
Matt Ropere27dde32014-04-01 15:22:30 -0700751
752 enum drm_plane_type type;
Daniel Vetter144ecb92014-10-27 20:28:44 +0100753
Daniel Vetterc2fcd272014-11-05 00:14:14 +0100754 void *helper_private;
755
Daniel Vetter144ecb92014-10-27 20:28:44 +0100756 struct drm_plane_state *state;
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800757};
758
759/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100760 * struct drm_bridge_funcs - drm_bridge control functions
Sean Paul3b336ec2013-08-14 16:47:37 -0400761 * @mode_fixup: Try to fixup (or reject entirely) proposed mode for this bridge
762 * @disable: Called right before encoder prepare, disables the bridge
763 * @post_disable: Called right after encoder prepare, for lockstepped disable
764 * @mode_set: Set this mode to the bridge
765 * @pre_enable: Called right before encoder commit, for lockstepped commit
766 * @enable: Called right after encoder commit, enables the bridge
767 * @destroy: make object go away
768 */
769struct drm_bridge_funcs {
770 bool (*mode_fixup)(struct drm_bridge *bridge,
771 const struct drm_display_mode *mode,
772 struct drm_display_mode *adjusted_mode);
773 void (*disable)(struct drm_bridge *bridge);
774 void (*post_disable)(struct drm_bridge *bridge);
775 void (*mode_set)(struct drm_bridge *bridge,
776 struct drm_display_mode *mode,
777 struct drm_display_mode *adjusted_mode);
778 void (*pre_enable)(struct drm_bridge *bridge);
779 void (*enable)(struct drm_bridge *bridge);
780 void (*destroy)(struct drm_bridge *bridge);
781};
782
783/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100784 * struct drm_bridge - central DRM bridge control structure
Sean Paul3b336ec2013-08-14 16:47:37 -0400785 * @dev: DRM device this bridge belongs to
786 * @head: list management
787 * @base: base mode object
788 * @funcs: control functions
789 * @driver_private: pointer to the bridge driver's internal context
790 */
791struct drm_bridge {
792 struct drm_device *dev;
793 struct list_head head;
794
795 struct drm_mode_object base;
796
797 const struct drm_bridge_funcs *funcs;
798 void *driver_private;
799};
800
801/**
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200802 * struct struct drm_atomic_state - the global state object for atomic updates
803 * @dev: parent DRM device
804 * @flags: state flags like async update
805 * @planes: pointer to array of plane pointers
806 * @plane_states: pointer to array of plane states pointers
807 * @crtcs: pointer to array of CRTC pointers
808 * @crtc_states: pointer to array of CRTC states pointers
809 * @connectors: pointer to array of connector pointers
810 * @connector_states: pointer to array of connector states pointers
811 * @acquire_ctx: acquire context for this atomic modeset state update
812 */
813struct drm_atomic_state {
814 struct drm_device *dev;
815 uint32_t flags;
816 struct drm_plane **planes;
817 struct drm_plane_state **plane_states;
818 struct drm_crtc **crtcs;
819 struct drm_crtc_state **crtc_states;
820 struct drm_connector **connectors;
821 struct drm_connector_state **connector_states;
822
823 struct drm_modeset_acquire_ctx *acquire_ctx;
824};
825
826
827/**
Daniel Vetter3bf04012014-10-27 16:54:27 +0100828 * struct drm_mode_set - new values for a CRTC config change
Jesse Barnesef273512011-11-07 12:03:19 -0800829 * @fb: framebuffer to use for new config
830 * @crtc: CRTC whose configuration we're about to change
831 * @mode: mode timings to use
832 * @x: position of this CRTC relative to @fb
833 * @y: position of this CRTC relative to @fb
834 * @connectors: array of connectors to drive with this CRTC if possible
835 * @num_connectors: size of @connectors array
Dave Airlief453ba02008-11-07 14:05:41 -0800836 *
837 * Represents a single crtc the connectors that it drives with what mode
838 * and from which framebuffer it scans out from.
839 *
840 * This is used to set modes.
841 */
842struct drm_mode_set {
Dave Airlief453ba02008-11-07 14:05:41 -0800843 struct drm_framebuffer *fb;
844 struct drm_crtc *crtc;
845 struct drm_display_mode *mode;
846
847 uint32_t x;
848 uint32_t y;
849
850 struct drm_connector **connectors;
851 size_t num_connectors;
852};
853
854/**
Jesse Barnes550cebc2011-11-07 12:03:20 -0800855 * struct drm_mode_config_funcs - basic driver provided mode setting functions
856 * @fb_create: create a new framebuffer object
857 * @output_poll_changed: function to handle output configuration changes
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200858 * @atomic_check: check whether a give atomic state update is possible
859 * @atomic_commit: commit an atomic state update previously verified with
860 * atomic_check()
Jesse Barnes550cebc2011-11-07 12:03:20 -0800861 *
862 * Some global (i.e. not per-CRTC, connector, etc) mode setting functions that
863 * involve drivers.
Dave Airlief453ba02008-11-07 14:05:41 -0800864 */
865struct drm_mode_config_funcs {
Jesse Barnes550cebc2011-11-07 12:03:20 -0800866 struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
867 struct drm_file *file_priv,
868 struct drm_mode_fb_cmd2 *mode_cmd);
Dave Airlieeb1f8e42010-05-07 06:42:51 +0000869 void (*output_poll_changed)(struct drm_device *dev);
Daniel Vettercc4ceb42014-07-25 21:30:38 +0200870
871 int (*atomic_check)(struct drm_device *dev,
872 struct drm_atomic_state *a);
873 int (*atomic_commit)(struct drm_device *dev,
874 struct drm_atomic_state *a,
875 bool async);
Dave Airlief453ba02008-11-07 14:05:41 -0800876};
877
Jesse Barnesc1aaca22011-11-07 12:03:21 -0800878/**
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100879 * struct drm_mode_group - group of mode setting resources for potential sub-grouping
Jesse Barnesc1aaca22011-11-07 12:03:21 -0800880 * @num_crtcs: CRTC count
881 * @num_encoders: encoder count
882 * @num_connectors: connector count
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100883 * @num_bridges: bridge count
Jesse Barnesc1aaca22011-11-07 12:03:21 -0800884 * @id_list: list of KMS object IDs in this group
885 *
886 * Currently this simply tracks the global mode setting state. But in the
887 * future it could allow groups of objects to be set aside into independent
888 * control groups for use by different user level processes (e.g. two X servers
889 * running simultaneously on different heads, each with their own mode
890 * configuration and freedom of mode setting).
891 */
Dave Airlief453ba02008-11-07 14:05:41 -0800892struct drm_mode_group {
893 uint32_t num_crtcs;
894 uint32_t num_encoders;
895 uint32_t num_connectors;
Sean Paul3b336ec2013-08-14 16:47:37 -0400896 uint32_t num_bridges;
Dave Airlief453ba02008-11-07 14:05:41 -0800897
898 /* list of object IDs for this group */
899 uint32_t *id_list;
900};
901
902/**
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100903 * struct drm_mode_config - Mode configuration control structure
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800904 * @mutex: mutex protecting KMS related lists and structures
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100905 * @connection_mutex: ww mutex protecting connector state and routing
906 * @acquire_ctx: global implicit acquire context used by atomic drivers for
907 * legacy ioctls
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800908 * @idr_mutex: mutex for KMS ID allocation and management
909 * @crtc_idr: main KMS ID tracking object
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100910 * @fb_lock: mutex to protect fb state and lists
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800911 * @num_fb: number of fbs available
912 * @fb_list: list of framebuffers available
913 * @num_connector: number of connectors on this device
914 * @connector_list: list of connector objects
Sean Paul3b336ec2013-08-14 16:47:37 -0400915 * @num_bridge: number of bridges on this device
916 * @bridge_list: list of bridge objects
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800917 * @num_encoder: number of encoders on this device
918 * @encoder_list: list of encoder objects
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100919 * @num_overlay_plane: number of overlay planes on this device
920 * @num_total_plane: number of universal (i.e. with primary/curso) planes on this device
921 * @plane_list: list of plane objects
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800922 * @num_crtc: number of CRTCs on this device
923 * @crtc_list: list of CRTC objects
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100924 * @property_list: list of property objects
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800925 * @min_width: minimum pixel width on this device
926 * @min_height: minimum pixel height on this device
927 * @max_width: maximum pixel width on this device
928 * @max_height: maximum pixel height on this device
929 * @funcs: core driver provided mode setting functions
930 * @fb_base: base address of the framebuffer
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100931 * @poll_enabled: track polling support for this device
932 * @poll_running: track polling status for this device
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800933 * @output_poll_work: delayed work for polling in process context
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100934 * @property_blob_list: list of all the blob property objects
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800935 * @*_property: core property tracking
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100936 * @preferred_depth: preferred RBG pixel depth, used by fb helpers
937 * @prefer_shadow: hint to userspace to prefer shadow-fb rendering
938 * @async_page_flip: does this device support async flips on the primary plane?
939 * @cursor_width: hint to userspace for max cursor width
940 * @cursor_height: hint to userspace for max cursor height
Dave Airlief453ba02008-11-07 14:05:41 -0800941 *
Jesse Barnesa62c93d2011-11-07 12:03:22 -0800942 * Core mode resource tracking structure. All CRTC, encoders, and connectors
943 * enumerated by the driver are added here, as are global properties. Some
944 * global restrictions are also here, e.g. dimension restrictions.
Dave Airlief453ba02008-11-07 14:05:41 -0800945 */
946struct drm_mode_config {
Jesse Barnesad2563c2009-01-19 17:21:45 +1000947 struct mutex mutex; /* protects configuration (mode lists etc.) */
Rob Clark51fd3712013-11-19 12:10:12 -0500948 struct drm_modeset_lock connection_mutex; /* protects connector->encoder and encoder->crtc links */
949 struct drm_modeset_acquire_ctx *acquire_ctx; /* for legacy _lock_all() / _unlock_all() */
Jesse Barnesad2563c2009-01-19 17:21:45 +1000950 struct mutex idr_mutex; /* for IDR management */
Dave Airlief453ba02008-11-07 14:05:41 -0800951 struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */
952 /* this is limited to one for now */
Daniel Vetter4b096ac2012-12-10 21:19:18 +0100953
Daniel Vetter2c0c33d2014-10-27 20:19:38 +0100954 struct mutex fb_lock; /* proctects global and per-file fb lists */
Dave Airlief453ba02008-11-07 14:05:41 -0800955 int num_fb;
956 struct list_head fb_list;
Daniel Vetter4b096ac2012-12-10 21:19:18 +0100957
Dave Airlief453ba02008-11-07 14:05:41 -0800958 int num_connector;
959 struct list_head connector_list;
Sean Paul3b336ec2013-08-14 16:47:37 -0400960 int num_bridge;
961 struct list_head bridge_list;
Dave Airlief453ba02008-11-07 14:05:41 -0800962 int num_encoder;
963 struct list_head encoder_list;
Matt Ropere27dde32014-04-01 15:22:30 -0700964
965 /*
966 * Track # of overlay planes separately from # of total planes. By
967 * default we only advertise overlay planes to userspace; if userspace
968 * sets the "universal plane" capability bit, we'll go ahead and
969 * expose all planes.
970 */
971 int num_overlay_plane;
972 int num_total_plane;
Jesse Barnes8cf5c912011-11-14 14:51:27 -0800973 struct list_head plane_list;
Dave Airlief453ba02008-11-07 14:05:41 -0800974
975 int num_crtc;
976 struct list_head crtc_list;
977
978 struct list_head property_list;
979
Dave Airlief453ba02008-11-07 14:05:41 -0800980 int min_width, min_height;
981 int max_width, max_height;
Laurent Pincharte6ecefa2012-05-17 13:27:23 +0200982 const struct drm_mode_config_funcs *funcs;
Benjamin Herrenschmidtd883f7f2009-02-02 16:55:45 +1100983 resource_size_t fb_base;
Dave Airlief453ba02008-11-07 14:05:41 -0800984
Dave Airlieeb1f8e42010-05-07 06:42:51 +0000985 /* output poll support */
986 bool poll_enabled;
Daniel Vetter905bc9f2012-10-23 18:23:36 +0000987 bool poll_running;
Tejun Heo991ea752010-07-20 22:09:02 +0200988 struct delayed_work output_poll_work;
Dave Airlieeb1f8e42010-05-07 06:42:51 +0000989
Dave Airlief453ba02008-11-07 14:05:41 -0800990 /* pointers to standard properties */
991 struct list_head property_blob_list;
992 struct drm_property *edid_property;
993 struct drm_property *dpms_property;
Dave Airlie43aba7e2014-06-05 14:01:31 +1000994 struct drm_property *path_property;
Rob Clark9922ab52014-04-01 20:16:57 -0400995 struct drm_property *plane_type_property;
Sonika Jindal2a297cc2014-08-05 11:26:54 +0530996 struct drm_property *rotation_property;
Dave Airlief453ba02008-11-07 14:05:41 -0800997
998 /* DVI-I properties */
999 struct drm_property *dvi_i_subconnector_property;
1000 struct drm_property *dvi_i_select_subconnector_property;
1001
1002 /* TV properties */
1003 struct drm_property *tv_subconnector_property;
1004 struct drm_property *tv_select_subconnector_property;
1005 struct drm_property *tv_mode_property;
1006 struct drm_property *tv_left_margin_property;
1007 struct drm_property *tv_right_margin_property;
1008 struct drm_property *tv_top_margin_property;
1009 struct drm_property *tv_bottom_margin_property;
Francisco Jerezb6b79022009-08-02 04:19:20 +02001010 struct drm_property *tv_brightness_property;
1011 struct drm_property *tv_contrast_property;
1012 struct drm_property *tv_flicker_reduction_property;
Francisco Jereza75f0232009-08-12 02:30:10 +02001013 struct drm_property *tv_overscan_property;
1014 struct drm_property *tv_saturation_property;
1015 struct drm_property *tv_hue_property;
Dave Airlief453ba02008-11-07 14:05:41 -08001016
1017 /* Optional properties */
1018 struct drm_property *scaling_mode_property;
Vandana Kannanff587e42014-06-11 10:46:48 +05301019 struct drm_property *aspect_ratio_property;
Jakob Bornecrantz884840a2009-12-03 23:25:47 +00001020 struct drm_property *dirty_info_property;
Dave Airlie019d96c2011-09-29 16:20:42 +01001021
1022 /* dumb ioctl parameters */
1023 uint32_t preferred_depth, prefer_shadow;
Keith Packard62f21042013-07-22 18:50:00 -07001024
1025 /* whether async page flip is supported or not */
1026 bool async_page_flip;
Alex Deucher8716ed42014-02-12 12:48:23 -05001027
1028 /* cursor size */
1029 uint32_t cursor_width, cursor_height;
Dave Airlief453ba02008-11-07 14:05:41 -08001030};
1031
1032#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
1033#define obj_to_connector(x) container_of(x, struct drm_connector, base)
1034#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
1035#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
1036#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
1037#define obj_to_property(x) container_of(x, struct drm_property, base)
1038#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001039#define obj_to_plane(x) container_of(x, struct drm_plane, base)
Dave Airlief453ba02008-11-07 14:05:41 -08001040
Sascha Hauer4a67d392012-02-06 10:58:17 +01001041struct drm_prop_enum_list {
1042 int type;
1043 char *name;
1044};
Dave Airlief453ba02008-11-07 14:05:41 -08001045
Matt Ropere13161a2014-04-01 15:22:38 -07001046extern int drm_crtc_init_with_planes(struct drm_device *dev,
1047 struct drm_crtc *crtc,
1048 struct drm_plane *primary,
Matt Roperfc1d3e42014-06-10 08:28:11 -07001049 struct drm_plane *cursor,
Matt Ropere13161a2014-04-01 15:22:38 -07001050 const struct drm_crtc_funcs *funcs);
Dave Airlief453ba02008-11-07 14:05:41 -08001051extern void drm_crtc_cleanup(struct drm_crtc *crtc);
Russell Kingdb5f7a62014-01-02 21:27:33 +00001052extern unsigned int drm_crtc_index(struct drm_crtc *crtc);
1053
1054/**
1055 * drm_crtc_mask - find the mask of a registered CRTC
1056 * @crtc: CRTC to find mask for
1057 *
1058 * Given a registered CRTC, return the mask bit of that CRTC for an
1059 * encoder's possible_crtcs field.
1060 */
1061static inline uint32_t drm_crtc_mask(struct drm_crtc *crtc)
1062{
1063 return 1 << drm_crtc_index(crtc);
1064}
Dave Airlief453ba02008-11-07 14:05:41 -08001065
Ilia Mirkinb21e3af2013-08-07 22:34:48 -04001066extern void drm_connector_ida_init(void);
1067extern void drm_connector_ida_destroy(void);
Ville Syrjälä6bfc56a2012-03-13 12:35:48 +02001068extern int drm_connector_init(struct drm_device *dev,
1069 struct drm_connector *connector,
1070 const struct drm_connector_funcs *funcs,
1071 int connector_type);
Thomas Wood34ea3d32014-05-29 16:57:41 +01001072int drm_connector_register(struct drm_connector *connector);
1073void drm_connector_unregister(struct drm_connector *connector);
Dave Airlief453ba02008-11-07 14:05:41 -08001074
1075extern void drm_connector_cleanup(struct drm_connector *connector);
Daniel Vetter10f637b2014-07-29 13:47:11 +02001076extern unsigned int drm_connector_index(struct drm_connector *connector);
Dave Airliecbc7e222012-02-20 14:16:40 +00001077/* helper to unplug all connectors from sysfs for device */
1078extern void drm_connector_unplug_all(struct drm_device *dev);
Dave Airlief453ba02008-11-07 14:05:41 -08001079
Sean Paul3b336ec2013-08-14 16:47:37 -04001080extern int drm_bridge_init(struct drm_device *dev, struct drm_bridge *bridge,
1081 const struct drm_bridge_funcs *funcs);
1082extern void drm_bridge_cleanup(struct drm_bridge *bridge);
1083
Ville Syrjälä6bfc56a2012-03-13 12:35:48 +02001084extern int drm_encoder_init(struct drm_device *dev,
1085 struct drm_encoder *encoder,
1086 const struct drm_encoder_funcs *funcs,
1087 int encoder_type);
Dave Airlief453ba02008-11-07 14:05:41 -08001088
Thierry Reding3d887362014-01-13 14:33:20 +01001089/**
1090 * drm_encoder_crtc_ok - can a given crtc drive a given encoder?
1091 * @encoder: encoder to test
1092 * @crtc: crtc to test
1093 *
1094 * Return false if @encoder can't be driven by @crtc, true otherwise.
1095 */
1096static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder,
1097 struct drm_crtc *crtc)
1098{
1099 return !!(encoder->possible_crtcs & drm_crtc_mask(crtc));
1100}
1101
Matt Roperdc415ff2014-04-01 15:22:36 -07001102extern int drm_universal_plane_init(struct drm_device *dev,
1103 struct drm_plane *plane,
1104 unsigned long possible_crtcs,
1105 const struct drm_plane_funcs *funcs,
1106 const uint32_t *formats,
1107 uint32_t format_count,
1108 enum drm_plane_type type);
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001109extern int drm_plane_init(struct drm_device *dev,
1110 struct drm_plane *plane,
1111 unsigned long possible_crtcs,
1112 const struct drm_plane_funcs *funcs,
Rob Clark0a7eb242011-12-13 20:19:36 -06001113 const uint32_t *formats, uint32_t format_count,
Matt Roperdc415ff2014-04-01 15:22:36 -07001114 bool is_primary);
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001115extern void drm_plane_cleanup(struct drm_plane *plane);
Daniel Vetter10f637b2014-07-29 13:47:11 +02001116extern unsigned int drm_plane_index(struct drm_plane *plane);
Ville Syrjälä9125e612013-06-03 16:10:40 +03001117extern void drm_plane_force_disable(struct drm_plane *plane);
Matt Roperaf936292014-04-01 15:22:34 -07001118extern int drm_crtc_check_viewport(const struct drm_crtc *crtc,
1119 int x, int y,
1120 const struct drm_display_mode *mode,
1121 const struct drm_framebuffer *fb);
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001122
Dave Airlief453ba02008-11-07 14:05:41 -08001123extern void drm_encoder_cleanup(struct drm_encoder *encoder);
1124
Ville Syrjäläd20d3172013-06-07 15:43:07 +00001125extern const char *drm_get_connector_status_name(enum drm_connector_status status);
Jesse Barnesac1bb362014-02-10 15:32:44 -08001126extern const char *drm_get_subpixel_order_name(enum subpixel_order order);
Ville Syrjäläd20d3172013-06-07 15:43:07 +00001127extern const char *drm_get_dpms_name(int val);
1128extern const char *drm_get_dvi_i_subconnector_name(int val);
1129extern const char *drm_get_dvi_i_select_name(int val);
1130extern const char *drm_get_tv_subconnector_name(int val);
1131extern const char *drm_get_tv_select_name(int val);
Kristian Høgsbergea39f832009-02-12 14:37:56 -05001132extern void drm_fb_release(struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001133extern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
Dave Airliead222792014-05-02 13:22:19 +10001134extern void drm_mode_group_destroy(struct drm_mode_group *group);
Dave Airlie2390cd12014-06-05 14:01:29 +10001135extern void drm_reinit_primary_mode_group(struct drm_device *dev);
Adam Jacksonfbff4692012-09-18 10:58:47 -04001136extern bool drm_probe_ddc(struct i2c_adapter *adapter);
Dave Airlief453ba02008-11-07 14:05:41 -08001137extern struct edid *drm_get_edid(struct drm_connector *connector,
1138 struct i2c_adapter *adapter);
Jani Nikula51f8da52013-09-27 15:08:27 +03001139extern struct edid *drm_edid_duplicate(const struct edid *edid);
Dave Airlief453ba02008-11-07 14:05:41 -08001140extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
Dave Airlief453ba02008-11-07 14:05:41 -08001141extern void drm_mode_config_init(struct drm_device *dev);
Chris Wilsoneb033552011-01-24 15:11:08 +00001142extern void drm_mode_config_reset(struct drm_device *dev);
Dave Airlief453ba02008-11-07 14:05:41 -08001143extern void drm_mode_config_cleanup(struct drm_device *dev);
Dave Airlief453ba02008-11-07 14:05:41 -08001144
Dave Airlie43aba7e2014-06-05 14:01:31 +10001145extern int drm_mode_connector_set_path_property(struct drm_connector *connector,
1146 char *path);
Dave Airlief453ba02008-11-07 14:05:41 -08001147extern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
1148 struct edid *edid);
Rob Clark5ea22f22014-05-30 11:34:01 -04001149
1150static inline bool drm_property_type_is(struct drm_property *property,
1151 uint32_t type)
1152{
1153 /* instanceof for props.. handles extended type vs original types: */
1154 if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
1155 return (property->flags & DRM_MODE_PROP_EXTENDED_TYPE) == type;
1156 return property->flags & type;
1157}
1158
1159static inline bool drm_property_type_valid(struct drm_property *property)
1160{
1161 if (property->flags & DRM_MODE_PROP_EXTENDED_TYPE)
1162 return !(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
1163 return !!(property->flags & DRM_MODE_PROP_LEGACY_TYPE);
1164}
1165
Paulo Zanonic5431882012-05-15 18:09:02 -03001166extern int drm_object_property_set_value(struct drm_mode_object *obj,
1167 struct drm_property *property,
1168 uint64_t val);
1169extern int drm_object_property_get_value(struct drm_mode_object *obj,
1170 struct drm_property *property,
1171 uint64_t *value);
Dave Airlief453ba02008-11-07 14:05:41 -08001172extern int drm_framebuffer_init(struct drm_device *dev,
1173 struct drm_framebuffer *fb,
1174 const struct drm_framebuffer_funcs *funcs);
Daniel Vetter786b99e2012-12-02 21:53:40 +01001175extern struct drm_framebuffer *drm_framebuffer_lookup(struct drm_device *dev,
1176 uint32_t id);
Rob Clarkf7eff602012-09-05 21:48:38 +00001177extern void drm_framebuffer_unreference(struct drm_framebuffer *fb);
1178extern void drm_framebuffer_reference(struct drm_framebuffer *fb);
1179extern void drm_framebuffer_remove(struct drm_framebuffer *fb);
Dave Airlief453ba02008-11-07 14:05:41 -08001180extern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
Daniel Vetter36206362012-12-10 20:42:17 +01001181extern void drm_framebuffer_unregister_private(struct drm_framebuffer *fb);
Dave Airlief453ba02008-11-07 14:05:41 -08001182
Paulo Zanonic5431882012-05-15 18:09:02 -03001183extern void drm_object_attach_property(struct drm_mode_object *obj,
1184 struct drm_property *property,
1185 uint64_t init_val);
Dave Airlief453ba02008-11-07 14:05:41 -08001186extern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
1187 const char *name, int num_values);
Sascha Hauer4a67d392012-02-06 10:58:17 +01001188extern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
1189 const char *name,
1190 const struct drm_prop_enum_list *props,
1191 int num_values);
Rob Clark49e27542012-05-17 02:23:26 -06001192struct drm_property *drm_property_create_bitmask(struct drm_device *dev,
1193 int flags, const char *name,
1194 const struct drm_prop_enum_list *props,
Ville Syrjälä7689ffb2014-07-08 10:31:52 +05301195 int num_props,
1196 uint64_t supported_bits);
Sascha Hauerd9bc3c02012-02-06 10:58:18 +01001197struct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
1198 const char *name,
1199 uint64_t min, uint64_t max);
Rob Clarkebc44cf2012-09-12 22:22:31 -05001200struct drm_property *drm_property_create_signed_range(struct drm_device *dev,
1201 int flags, const char *name,
1202 int64_t min, int64_t max);
Rob Clark98f75de2014-05-30 11:37:03 -04001203struct drm_property *drm_property_create_object(struct drm_device *dev,
1204 int flags, const char *name, uint32_t type);
Dave Airlief453ba02008-11-07 14:05:41 -08001205extern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
1206extern int drm_property_add_enum(struct drm_property *property, int index,
1207 uint64_t value, const char *name);
1208extern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
1209extern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
1210 char *formats[]);
1211extern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
Vandana Kannanff587e42014-06-11 10:46:48 +05301212extern int drm_mode_create_aspect_ratio_property(struct drm_device *dev);
Jakob Bornecrantz884840a2009-12-03 23:25:47 +00001213extern int drm_mode_create_dirty_info_property(struct drm_device *dev);
Dave Airlief453ba02008-11-07 14:05:41 -08001214
1215extern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
1216 struct drm_encoder *encoder);
Sascha Hauer4cae5b82012-02-01 11:38:23 +01001217extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
Dave Airlief453ba02008-11-07 14:05:41 -08001218 int gamma_size);
Daniel Vetter7a9c9062009-09-15 22:57:31 +02001219extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
1220 uint32_t id, uint32_t type);
Rob Clark98f75de2014-05-30 11:37:03 -04001221
Dave Airlief453ba02008-11-07 14:05:41 -08001222/* IOCTLs */
1223extern int drm_mode_getresources(struct drm_device *dev,
1224 void *data, struct drm_file *file_priv);
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001225extern int drm_mode_getplane_res(struct drm_device *dev, void *data,
1226 struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001227extern int drm_mode_getcrtc(struct drm_device *dev,
1228 void *data, struct drm_file *file_priv);
1229extern int drm_mode_getconnector(struct drm_device *dev,
1230 void *data, struct drm_file *file_priv);
Daniel Vetter2d13b672012-12-11 13:47:23 +01001231extern int drm_mode_set_config_internal(struct drm_mode_set *set);
Dave Airlief453ba02008-11-07 14:05:41 -08001232extern int drm_mode_setcrtc(struct drm_device *dev,
1233 void *data, struct drm_file *file_priv);
Jesse Barnes8cf5c912011-11-14 14:51:27 -08001234extern int drm_mode_getplane(struct drm_device *dev,
1235 void *data, struct drm_file *file_priv);
1236extern int drm_mode_setplane(struct drm_device *dev,
1237 void *data, struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001238extern int drm_mode_cursor_ioctl(struct drm_device *dev,
1239 void *data, struct drm_file *file_priv);
Dave Airlie4c813d42013-06-20 11:48:52 +10001240extern int drm_mode_cursor2_ioctl(struct drm_device *dev,
1241 void *data, struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001242extern int drm_mode_addfb(struct drm_device *dev,
1243 void *data, struct drm_file *file_priv);
Jesse Barnes308e5bc2011-11-14 14:51:28 -08001244extern int drm_mode_addfb2(struct drm_device *dev,
1245 void *data, struct drm_file *file_priv);
1246extern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
Dave Airlief453ba02008-11-07 14:05:41 -08001247extern int drm_mode_rmfb(struct drm_device *dev,
1248 void *data, struct drm_file *file_priv);
1249extern int drm_mode_getfb(struct drm_device *dev,
1250 void *data, struct drm_file *file_priv);
Jakob Bornecrantz884840a2009-12-03 23:25:47 +00001251extern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
1252 void *data, struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001253
1254extern int drm_mode_getproperty_ioctl(struct drm_device *dev,
1255 void *data, struct drm_file *file_priv);
1256extern int drm_mode_getblob_ioctl(struct drm_device *dev,
1257 void *data, struct drm_file *file_priv);
1258extern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
1259 void *data, struct drm_file *file_priv);
Dave Airlief453ba02008-11-07 14:05:41 -08001260extern int drm_mode_getencoder(struct drm_device *dev,
1261 void *data, struct drm_file *file_priv);
1262extern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
1263 void *data, struct drm_file *file_priv);
1264extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
1265 void *data, struct drm_file *file_priv);
Thierry Reding18316c82012-12-20 15:41:44 +01001266extern u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
Vandana Kannan0967e6a2014-04-01 16:26:59 +05301267extern enum hdmi_picture_aspect drm_get_cea_aspect_ratio(const u8 video_code);
Ma Lingf23c20c2009-03-26 19:26:23 +08001268extern bool drm_detect_hdmi_monitor(struct edid *edid);
Zhenyu Wang8fe97902010-09-19 14:27:28 +08001269extern bool drm_detect_monitor_audio(struct edid *edid);
Ville Syrjäläb1edd6a2013-01-17 16:31:30 +02001270extern bool drm_rgb_quant_range_selectable(struct edid *edid);
Kristian Høgsbergd91d8a32009-11-17 12:43:55 -05001271extern int drm_mode_page_flip_ioctl(struct drm_device *dev,
1272 void *data, struct drm_file *file_priv);
Zhao Yakuif0fda0a2009-09-03 09:33:48 +08001273extern int drm_add_modes_noedid(struct drm_connector *connector,
1274 int hdisplay, int vdisplay);
Gerd Hoffmann3cf70da2013-10-11 10:01:08 +02001275extern void drm_set_preferred_mode(struct drm_connector *connector,
1276 int hpref, int vpref);
Alex Deucher3c537882010-02-05 04:21:19 -05001277
Thomas Reim051963d2011-07-29 14:28:57 +00001278extern int drm_edid_header_is_valid(const u8 *raw_edid);
Jerome Glisse0b2443e2012-08-09 11:25:51 -04001279extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid);
Alex Deucher3c537882010-02-05 04:21:19 -05001280extern bool drm_edid_is_valid(struct edid *edid);
Dave Airlie1d42bbc2010-05-07 05:02:30 +00001281struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
Adam Jacksonf6e252b2012-04-13 16:33:31 -04001282 int hsize, int vsize, int fresh,
1283 bool rb);
Dave Airlieff72145b2011-02-07 12:16:14 +10001284
1285extern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
1286 void *data, struct drm_file *file_priv);
1287extern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
1288 void *data, struct drm_file *file_priv);
1289extern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
1290 void *data, struct drm_file *file_priv);
Paulo Zanonic5431882012-05-15 18:09:02 -03001291extern int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data,
1292 struct drm_file *file_priv);
1293extern int drm_mode_obj_set_property_ioctl(struct drm_device *dev, void *data,
1294 struct drm_file *file_priv);
Thomas Wood3a5f87c2014-08-20 14:45:00 +01001295extern int drm_mode_plane_set_obj_prop(struct drm_plane *plane,
1296 struct drm_property *property,
1297 uint64_t value);
Dave Airlie248dbc22011-11-29 20:02:54 +00001298
1299extern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
1300 int *bpp);
Ville Syrjälä141670e2012-04-05 21:35:15 +03001301extern int drm_format_num_planes(uint32_t format);
Ville Syrjälä5a86bd52012-04-05 21:35:16 +03001302extern int drm_format_plane_cpp(uint32_t format, int plane);
Ville Syrjälä01b68b02012-04-05 21:35:17 +03001303extern int drm_format_horz_chroma_subsampling(uint32_t format);
1304extern int drm_format_vert_chroma_subsampling(uint32_t format);
Ville Syrjäläd20d3172013-06-07 15:43:07 +00001305extern const char *drm_get_format_name(uint32_t format);
Ville Syrjäläc1df5f32014-07-08 10:31:53 +05301306extern struct drm_property *drm_mode_create_rotation_property(struct drm_device *dev,
1307 unsigned int supported_rotations);
Ville Syrjälä3c9855f2014-07-08 10:31:56 +05301308extern unsigned int drm_rotation_simplify(unsigned int rotation,
1309 unsigned int supported_rotations);
Ville Syrjälä141670e2012-04-05 21:35:15 +03001310
Russell King96f60e32012-08-15 13:59:49 +01001311/* Helpers */
Rob Clarka2b34e22013-10-05 16:36:52 -04001312
1313static inline struct drm_plane *drm_plane_find(struct drm_device *dev,
1314 uint32_t id)
1315{
1316 struct drm_mode_object *mo;
1317 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PLANE);
1318 return mo ? obj_to_plane(mo) : NULL;
1319}
1320
Russell King96f60e32012-08-15 13:59:49 +01001321static inline struct drm_crtc *drm_crtc_find(struct drm_device *dev,
1322 uint32_t id)
1323{
1324 struct drm_mode_object *mo;
1325 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CRTC);
1326 return mo ? obj_to_crtc(mo) : NULL;
1327}
1328
1329static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev,
1330 uint32_t id)
1331{
1332 struct drm_mode_object *mo;
1333 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_ENCODER);
1334 return mo ? obj_to_encoder(mo) : NULL;
1335}
1336
Rob Clarka2b34e22013-10-05 16:36:52 -04001337static inline struct drm_connector *drm_connector_find(struct drm_device *dev,
1338 uint32_t id)
1339{
1340 struct drm_mode_object *mo;
1341 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_CONNECTOR);
1342 return mo ? obj_to_connector(mo) : NULL;
1343}
1344
1345static inline struct drm_property *drm_property_find(struct drm_device *dev,
1346 uint32_t id)
1347{
1348 struct drm_mode_object *mo;
1349 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_PROPERTY);
1350 return mo ? obj_to_property(mo) : NULL;
1351}
1352
1353static inline struct drm_property_blob *
1354drm_property_blob_find(struct drm_device *dev, uint32_t id)
1355{
1356 struct drm_mode_object *mo;
1357 mo = drm_mode_object_find(dev, id, DRM_MODE_OBJECT_BLOB);
1358 return mo ? obj_to_blob(mo) : NULL;
1359}
1360
Matt Ropere27dde32014-04-01 15:22:30 -07001361/* Plane list iterator for legacy (overlay only) planes. */
1362#define drm_for_each_legacy_plane(plane, planelist) \
1363 list_for_each_entry(plane, planelist, head) \
1364 if (plane->type == DRM_PLANE_TYPE_OVERLAY)
1365
Dave Airlief453ba02008-11-07 14:05:41 -08001366#endif /* __DRM_CRTC_H__ */