drm_crtc.h revision 235783
1235783Skib/*
2235783Skib * Copyright �� 2006 Keith Packard
3235783Skib * Copyright �� 2007-2008 Dave Airlie
4235783Skib * Copyright �� 2007-2008 Intel Corporation
5235783Skib *   Jesse Barnes <jesse.barnes@intel.com>
6235783Skib *
7235783Skib * Permission is hereby granted, free of charge, to any person obtaining a
8235783Skib * copy of this software and associated documentation files (the "Software"),
9235783Skib * to deal in the Software without restriction, including without limitation
10235783Skib * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11235783Skib * and/or sell copies of the Software, and to permit persons to whom the
12235783Skib * Software is furnished to do so, subject to the following conditions:
13235783Skib *
14235783Skib * The above copyright notice and this permission notice shall be included in
15235783Skib * all copies or substantial portions of the Software.
16235783Skib *
17235783Skib * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18235783Skib * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19235783Skib * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20235783Skib * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
21235783Skib * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22235783Skib * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23235783Skib * OTHER DEALINGS IN THE SOFTWARE.
24235783Skib *
25235783Skib * $FreeBSD: head/sys/dev/drm2/drm_crtc.h 235783 2012-05-22 11:07:44Z kib $
26235783Skib */
27235783Skib#ifndef __DRM_CRTC_H__
28235783Skib#define __DRM_CRTC_H__
29235783Skib
30235783Skib#include <dev/drm2/drm_gem_names.h>
31235783Skib#include <dev/drm2/drm_fourcc.h>
32235783Skib
33235783Skibstruct drm_device;
34235783Skibstruct drm_mode_set;
35235783Skibstruct drm_framebuffer;
36235783Skibstruct i2c_adapter;
37235783Skib
38235783Skib#define DRM_MODE_OBJECT_CRTC 0xcccccccc
39235783Skib#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
40235783Skib#define DRM_MODE_OBJECT_ENCODER 0xe0e0e0e0
41235783Skib#define DRM_MODE_OBJECT_MODE 0xdededede
42235783Skib#define DRM_MODE_OBJECT_PROPERTY 0xb0b0b0b0
43235783Skib#define DRM_MODE_OBJECT_FB 0xfbfbfbfb
44235783Skib#define DRM_MODE_OBJECT_BLOB 0xbbbbbbbb
45235783Skib#define DRM_MODE_OBJECT_PLANE 0xeeeeeeee
46235783Skib
47235783Skibstruct drm_mode_object {
48235783Skib	uint32_t id;
49235783Skib	uint32_t type;
50235783Skib};
51235783Skib
52235783Skib/*
53235783Skib * Note on terminology:  here, for brevity and convenience, we refer to connector
54235783Skib * control chips as 'CRTCs'.  They can control any type of connector, VGA, LVDS,
55235783Skib * DVI, etc.  And 'screen' refers to the whole of the visible display, which
56235783Skib * may span multiple monitors (and therefore multiple CRTC and connector
57235783Skib * structures).
58235783Skib */
59235783Skib
60235783Skibenum drm_mode_status {
61235783Skib    MODE_OK	= 0,	/* Mode OK */
62235783Skib    MODE_HSYNC,		/* hsync out of range */
63235783Skib    MODE_VSYNC,		/* vsync out of range */
64235783Skib    MODE_H_ILLEGAL,	/* mode has illegal horizontal timings */
65235783Skib    MODE_V_ILLEGAL,	/* mode has illegal horizontal timings */
66235783Skib    MODE_BAD_WIDTH,	/* requires an unsupported linepitch */
67235783Skib    MODE_NOMODE,	/* no mode with a maching name */
68235783Skib    MODE_NO_INTERLACE,	/* interlaced mode not supported */
69235783Skib    MODE_NO_DBLESCAN,	/* doublescan mode not supported */
70235783Skib    MODE_NO_VSCAN,	/* multiscan mode not supported */
71235783Skib    MODE_MEM,		/* insufficient video memory */
72235783Skib    MODE_VIRTUAL_X,	/* mode width too large for specified virtual size */
73235783Skib    MODE_VIRTUAL_Y,	/* mode height too large for specified virtual size */
74235783Skib    MODE_MEM_VIRT,	/* insufficient video memory given virtual size */
75235783Skib    MODE_NOCLOCK,	/* no fixed clock available */
76235783Skib    MODE_CLOCK_HIGH,	/* clock required is too high */
77235783Skib    MODE_CLOCK_LOW,	/* clock required is too low */
78235783Skib    MODE_CLOCK_RANGE,	/* clock/mode isn't in a ClockRange */
79235783Skib    MODE_BAD_HVALUE,	/* horizontal timing was out of range */
80235783Skib    MODE_BAD_VVALUE,	/* vertical timing was out of range */
81235783Skib    MODE_BAD_VSCAN,	/* VScan value out of range */
82235783Skib    MODE_HSYNC_NARROW,	/* horizontal sync too narrow */
83235783Skib    MODE_HSYNC_WIDE,	/* horizontal sync too wide */
84235783Skib    MODE_HBLANK_NARROW,	/* horizontal blanking too narrow */
85235783Skib    MODE_HBLANK_WIDE,	/* horizontal blanking too wide */
86235783Skib    MODE_VSYNC_NARROW,	/* vertical sync too narrow */
87235783Skib    MODE_VSYNC_WIDE,	/* vertical sync too wide */
88235783Skib    MODE_VBLANK_NARROW,	/* vertical blanking too narrow */
89235783Skib    MODE_VBLANK_WIDE,	/* vertical blanking too wide */
90235783Skib    MODE_PANEL,         /* exceeds panel dimensions */
91235783Skib    MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */
92235783Skib    MODE_ONE_WIDTH,     /* only one width is supported */
93235783Skib    MODE_ONE_HEIGHT,    /* only one height is supported */
94235783Skib    MODE_ONE_SIZE,      /* only one resolution is supported */
95235783Skib    MODE_NO_REDUCED,    /* monitor doesn't accept reduced blanking */
96235783Skib    MODE_UNVERIFIED = -3, /* mode needs to reverified */
97235783Skib    MODE_BAD = -2,	/* unspecified reason */
98235783Skib    MODE_ERROR	= -1	/* error condition */
99235783Skib};
100235783Skib
101235783Skib#define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \
102235783Skib				    DRM_MODE_TYPE_CRTC_C)
103235783Skib
104235783Skib#define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \
105235783Skib	.name = nm, .status = 0, .type = (t), .clock = (c), \
106235783Skib	.hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \
107235783Skib	.htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \
108235783Skib	.vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \
109235783Skib	.vscan = (vs), .flags = (f), .vrefresh = 0
110235783Skib
111235783Skib#define CRTC_INTERLACE_HALVE_V 0x1 /* halve V values for interlacing */
112235783Skib
113235783Skibstruct drm_display_mode {
114235783Skib	/* Header */
115235783Skib	struct list_head head;
116235783Skib	struct drm_mode_object base;
117235783Skib
118235783Skib	char name[DRM_DISPLAY_MODE_LEN];
119235783Skib
120235783Skib	int connector_count;
121235783Skib	enum drm_mode_status status;
122235783Skib	int type;
123235783Skib
124235783Skib	/* Proposed mode values */
125235783Skib	int clock;		/* in kHz */
126235783Skib	int hdisplay;
127235783Skib	int hsync_start;
128235783Skib	int hsync_end;
129235783Skib	int htotal;
130235783Skib	int hskew;
131235783Skib	int vdisplay;
132235783Skib	int vsync_start;
133235783Skib	int vsync_end;
134235783Skib	int vtotal;
135235783Skib	int vscan;
136235783Skib	unsigned int flags;
137235783Skib
138235783Skib	/* Addressable image size (may be 0 for projectors, etc.) */
139235783Skib	int width_mm;
140235783Skib	int height_mm;
141235783Skib
142235783Skib	/* Actual mode we give to hw */
143235783Skib	int clock_index;
144235783Skib	int synth_clock;
145235783Skib	int crtc_hdisplay;
146235783Skib	int crtc_hblank_start;
147235783Skib	int crtc_hblank_end;
148235783Skib	int crtc_hsync_start;
149235783Skib	int crtc_hsync_end;
150235783Skib	int crtc_htotal;
151235783Skib	int crtc_hskew;
152235783Skib	int crtc_vdisplay;
153235783Skib	int crtc_vblank_start;
154235783Skib	int crtc_vblank_end;
155235783Skib	int crtc_vsync_start;
156235783Skib	int crtc_vsync_end;
157235783Skib	int crtc_vtotal;
158235783Skib	int crtc_hadjusted;
159235783Skib	int crtc_vadjusted;
160235783Skib
161235783Skib	/* Driver private mode info */
162235783Skib	int private_size;
163235783Skib	int *private;
164235783Skib	int private_flags;
165235783Skib
166235783Skib	int vrefresh;		/* in Hz */
167235783Skib	int hsync;		/* in kHz */
168235783Skib};
169235783Skib
170235783Skibenum drm_connector_status {
171235783Skib	connector_status_connected = 1,
172235783Skib	connector_status_disconnected = 2,
173235783Skib	connector_status_unknown = 3,
174235783Skib};
175235783Skib
176235783Skibenum subpixel_order {
177235783Skib	SubPixelUnknown = 0,
178235783Skib	SubPixelHorizontalRGB,
179235783Skib	SubPixelHorizontalBGR,
180235783Skib	SubPixelVerticalRGB,
181235783Skib	SubPixelVerticalBGR,
182235783Skib	SubPixelNone,
183235783Skib};
184235783Skib
185235783Skib#define DRM_COLOR_FORMAT_RGB444		(1<<0)
186235783Skib#define DRM_COLOR_FORMAT_YCRCB444	(1<<1)
187235783Skib#define DRM_COLOR_FORMAT_YCRCB422	(1<<2)
188235783Skib/*
189235783Skib * Describes a given display (e.g. CRT or flat panel) and its limitations.
190235783Skib */
191235783Skibstruct drm_display_info {
192235783Skib	char name[DRM_DISPLAY_INFO_LEN];
193235783Skib
194235783Skib	/* Physical size */
195235783Skib        unsigned int width_mm;
196235783Skib	unsigned int height_mm;
197235783Skib
198235783Skib	/* Clock limits FIXME: storage format */
199235783Skib	unsigned int min_vfreq, max_vfreq;
200235783Skib	unsigned int min_hfreq, max_hfreq;
201235783Skib	unsigned int pixel_clock;
202235783Skib	unsigned int bpc;
203235783Skib
204235783Skib	enum subpixel_order subpixel_order;
205235783Skib	u32 color_formats;
206235783Skib
207235783Skib	u8 cea_rev;
208235783Skib
209235783Skib	char *raw_edid; /* if any */
210235783Skib};
211235783Skib
212235783Skibstruct drm_framebuffer_funcs {
213235783Skib	void (*destroy)(struct drm_framebuffer *framebuffer);
214235783Skib	int (*create_handle)(struct drm_framebuffer *fb,
215235783Skib			     struct drm_file *file_priv,
216235783Skib			     unsigned int *handle);
217235783Skib	/**
218235783Skib	 * Optinal callback for the dirty fb ioctl.
219235783Skib	 *
220235783Skib	 * Userspace can notify the driver via this callback
221235783Skib	 * that a area of the framebuffer has changed and should
222235783Skib	 * be flushed to the display hardware.
223235783Skib	 *
224235783Skib	 * See documentation in drm_mode.h for the struct
225235783Skib	 * drm_mode_fb_dirty_cmd for more information as all
226235783Skib	 * the semantics and arguments have a one to one mapping
227235783Skib	 * on this function.
228235783Skib	 */
229235783Skib	int (*dirty)(struct drm_framebuffer *framebuffer,
230235783Skib		     struct drm_file *file_priv, unsigned flags,
231235783Skib		     unsigned color, struct drm_clip_rect *clips,
232235783Skib		     unsigned num_clips);
233235783Skib};
234235783Skib
235235783Skibstruct drm_framebuffer {
236235783Skib	struct drm_device *dev;
237235783Skib	struct list_head head;
238235783Skib	struct drm_mode_object base;
239235783Skib	const struct drm_framebuffer_funcs *funcs;
240235783Skib	unsigned int pitches[4];
241235783Skib	unsigned int offsets[4];
242235783Skib	unsigned int width;
243235783Skib	unsigned int height;
244235783Skib	/* depth can be 15 or 16 */
245235783Skib	unsigned int depth;
246235783Skib	int bits_per_pixel;
247235783Skib	int flags;
248235783Skib	uint32_t pixel_format; /* fourcc format */
249235783Skib	struct list_head filp_head;
250235783Skib	/* if you are using the helper */
251235783Skib	void *helper_private;
252235783Skib};
253235783Skib
254235783Skibstruct drm_property_blob {
255235783Skib	struct drm_mode_object base;
256235783Skib	struct list_head head;
257235783Skib	unsigned int length;
258235783Skib	unsigned char data[];
259235783Skib};
260235783Skib
261235783Skibstruct drm_property_enum {
262235783Skib	uint64_t value;
263235783Skib	struct list_head head;
264235783Skib	char name[DRM_PROP_NAME_LEN];
265235783Skib};
266235783Skib
267235783Skibstruct drm_property {
268235783Skib	struct list_head head;
269235783Skib	struct drm_mode_object base;
270235783Skib	uint32_t flags;
271235783Skib	char name[DRM_PROP_NAME_LEN];
272235783Skib	uint32_t num_values;
273235783Skib	uint64_t *values;
274235783Skib
275235783Skib	struct list_head enum_blob_list;
276235783Skib};
277235783Skib
278235783Skibstruct drm_crtc;
279235783Skibstruct drm_connector;
280235783Skibstruct drm_encoder;
281235783Skibstruct drm_pending_vblank_event;
282235783Skibstruct drm_plane;
283235783Skib
284235783Skib/**
285235783Skib * drm_crtc_funcs - control CRTCs for a given device
286235783Skib * @reset: reset CRTC after state has been invalidate (e.g. resume)
287235783Skib * @dpms: control display power levels
288235783Skib * @save: save CRTC state
289235783Skib * @resore: restore CRTC state
290235783Skib * @lock: lock the CRTC
291235783Skib * @unlock: unlock the CRTC
292235783Skib * @shadow_allocate: allocate shadow pixmap
293235783Skib * @shadow_create: create shadow pixmap for rotation support
294235783Skib * @shadow_destroy: free shadow pixmap
295235783Skib * @mode_fixup: fixup proposed mode
296235783Skib * @mode_set: set the desired mode on the CRTC
297235783Skib * @gamma_set: specify color ramp for CRTC
298235783Skib * @destroy: deinit and free object.
299235783Skib *
300235783Skib * The drm_crtc_funcs structure is the central CRTC management structure
301235783Skib * in the DRM.  Each CRTC controls one or more connectors (note that the name
302235783Skib * CRTC is simply historical, a CRTC may control LVDS, VGA, DVI, TV out, etc.
303235783Skib * connectors, not just CRTs).
304235783Skib *
305235783Skib * Each driver is responsible for filling out this structure at startup time,
306235783Skib * in addition to providing other modesetting features, like i2c and DDC
307235783Skib * bus accessors.
308235783Skib */
309235783Skibstruct drm_crtc_funcs {
310235783Skib	/* Save CRTC state */
311235783Skib	void (*save)(struct drm_crtc *crtc); /* suspend? */
312235783Skib	/* Restore CRTC state */
313235783Skib	void (*restore)(struct drm_crtc *crtc); /* resume? */
314235783Skib	/* Reset CRTC state */
315235783Skib	void (*reset)(struct drm_crtc *crtc);
316235783Skib
317235783Skib	/* cursor controls */
318235783Skib	int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
319235783Skib			  uint32_t handle, uint32_t width, uint32_t height);
320235783Skib	int (*cursor_move)(struct drm_crtc *crtc, int x, int y);
321235783Skib
322235783Skib	/* Set gamma on the CRTC */
323235783Skib	void (*gamma_set)(struct drm_crtc *crtc, u16 *r, u16 *g, u16 *b,
324235783Skib			  uint32_t start, uint32_t size);
325235783Skib	/* Object destroy routine */
326235783Skib	void (*destroy)(struct drm_crtc *crtc);
327235783Skib
328235783Skib	int (*set_config)(struct drm_mode_set *set);
329235783Skib
330235783Skib	/*
331235783Skib	 * Flip to the given framebuffer.  This implements the page
332235783Skib	 * flip ioctl descibed in drm_mode.h, specifically, the
333235783Skib	 * implementation must return immediately and block all
334235783Skib	 * rendering to the current fb until the flip has completed.
335235783Skib	 * If userspace set the event flag in the ioctl, the event
336235783Skib	 * argument will point to an event to send back when the flip
337235783Skib	 * completes, otherwise it will be NULL.
338235783Skib	 */
339235783Skib	int (*page_flip)(struct drm_crtc *crtc,
340235783Skib			 struct drm_framebuffer *fb,
341235783Skib			 struct drm_pending_vblank_event *event);
342235783Skib};
343235783Skib
344235783Skib/**
345235783Skib * drm_crtc - central CRTC control structure
346235783Skib * @enabled: is this CRTC enabled?
347235783Skib * @x: x position on screen
348235783Skib * @y: y position on screen
349235783Skib * @funcs: CRTC control functions
350235783Skib *
351235783Skib * Each CRTC may have one or more connectors associated with it.  This structure
352235783Skib * allows the CRTC to be controlled.
353235783Skib */
354235783Skibstruct drm_crtc {
355235783Skib	struct drm_device *dev;
356235783Skib	struct list_head head;
357235783Skib
358235783Skib	struct drm_mode_object base;
359235783Skib
360235783Skib	/* framebuffer the connector is currently bound to */
361235783Skib	struct drm_framebuffer *fb;
362235783Skib
363235783Skib	bool enabled;
364235783Skib
365235783Skib	/* Requested mode from modesetting. */
366235783Skib	struct drm_display_mode mode;
367235783Skib
368235783Skib	/* Programmed mode in hw, after adjustments for encoders,
369235783Skib	 * crtc, panel scaling etc. Needed for timestamping etc.
370235783Skib	 */
371235783Skib	struct drm_display_mode hwmode;
372235783Skib
373235783Skib	int x, y;
374235783Skib	const struct drm_crtc_funcs *funcs;
375235783Skib
376235783Skib	/* CRTC gamma size for reporting to userspace */
377235783Skib	uint32_t gamma_size;
378235783Skib	uint16_t *gamma_store;
379235783Skib
380235783Skib	/* Constants needed for precise vblank and swap timestamping. */
381235783Skib	int64_t framedur_ns, linedur_ns, pixeldur_ns;
382235783Skib
383235783Skib	/* if you are using the helper */
384235783Skib	void *helper_private;
385235783Skib};
386235783Skib
387235783Skib
388235783Skib/**
389235783Skib * drm_connector_funcs - control connectors on a given device
390235783Skib * @dpms: set power state (see drm_crtc_funcs above)
391235783Skib * @save: save connector state
392235783Skib * @restore: restore connector state
393235783Skib * @reset: reset connector after state has been invalidate (e.g. resume)
394235783Skib * @mode_valid: is this mode valid on the given connector?
395235783Skib * @mode_fixup: try to fixup proposed mode for this connector
396235783Skib * @mode_set: set this mode
397235783Skib * @detect: is this connector active?
398235783Skib * @get_modes: get mode list for this connector
399235783Skib * @set_property: property for this connector may need update
400235783Skib * @destroy: make object go away
401235783Skib * @force: notify the driver the connector is forced on
402235783Skib *
403235783Skib * Each CRTC may have one or more connectors attached to it.  The functions
404235783Skib * below allow the core DRM code to control connectors, enumerate available modes,
405235783Skib * etc.
406235783Skib */
407235783Skibstruct drm_connector_funcs {
408235783Skib	void (*dpms)(struct drm_connector *connector, int mode);
409235783Skib	void (*save)(struct drm_connector *connector);
410235783Skib	void (*restore)(struct drm_connector *connector);
411235783Skib	void (*reset)(struct drm_connector *connector);
412235783Skib
413235783Skib	/* Check to see if anything is attached to the connector.
414235783Skib	 * @force is set to false whilst polling, true when checking the
415235783Skib	 * connector due to user request. @force can be used by the driver
416235783Skib	 * to avoid expensive, destructive operations during automated
417235783Skib	 * probing.
418235783Skib	 */
419235783Skib	enum drm_connector_status (*detect)(struct drm_connector *connector,
420235783Skib					    bool force);
421235783Skib	int (*fill_modes)(struct drm_connector *connector, uint32_t max_width, uint32_t max_height);
422235783Skib	int (*set_property)(struct drm_connector *connector, struct drm_property *property,
423235783Skib			     uint64_t val);
424235783Skib	void (*destroy)(struct drm_connector *connector);
425235783Skib	void (*force)(struct drm_connector *connector);
426235783Skib};
427235783Skib
428235783Skibstruct drm_encoder_funcs {
429235783Skib	void (*reset)(struct drm_encoder *encoder);
430235783Skib	void (*destroy)(struct drm_encoder *encoder);
431235783Skib};
432235783Skib
433235783Skib#define DRM_CONNECTOR_MAX_UMODES 16
434235783Skib#define DRM_CONNECTOR_MAX_PROPERTY 16
435235783Skib#define DRM_CONNECTOR_LEN 32
436235783Skib#define DRM_CONNECTOR_MAX_ENCODER 2
437235783Skib
438235783Skib/**
439235783Skib * drm_encoder - central DRM encoder structure
440235783Skib */
441235783Skibstruct drm_encoder {
442235783Skib	struct drm_device *dev;
443235783Skib	struct list_head head;
444235783Skib
445235783Skib	struct drm_mode_object base;
446235783Skib	int encoder_type;
447235783Skib	uint32_t possible_crtcs;
448235783Skib	uint32_t possible_clones;
449235783Skib
450235783Skib	struct drm_crtc *crtc;
451235783Skib	const struct drm_encoder_funcs *funcs;
452235783Skib	void *helper_private;
453235783Skib};
454235783Skib
455235783Skibenum drm_connector_force {
456235783Skib	DRM_FORCE_UNSPECIFIED,
457235783Skib	DRM_FORCE_OFF,
458235783Skib	DRM_FORCE_ON,         /* force on analog part normally */
459235783Skib	DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */
460235783Skib};
461235783Skib
462235783Skib/* should we poll this connector for connects and disconnects */
463235783Skib/* hot plug detectable */
464235783Skib#define DRM_CONNECTOR_POLL_HPD (1 << 0)
465235783Skib/* poll for connections */
466235783Skib#define DRM_CONNECTOR_POLL_CONNECT (1 << 1)
467235783Skib/* can cleanly poll for disconnections without flickering the screen */
468235783Skib/* DACs should rarely do this without a lot of testing */
469235783Skib#define DRM_CONNECTOR_POLL_DISCONNECT (1 << 2)
470235783Skib
471235783Skib#define MAX_ELD_BYTES	128
472235783Skib
473235783Skib/**
474235783Skib * drm_connector - central DRM connector control structure
475235783Skib * @crtc: CRTC this connector is currently connected to, NULL if none
476235783Skib * @interlace_allowed: can this connector handle interlaced modes?
477235783Skib * @doublescan_allowed: can this connector handle doublescan?
478235783Skib * @available_modes: modes available on this connector (from get_modes() + user)
479235783Skib * @initial_x: initial x position for this connector
480235783Skib * @initial_y: initial y position for this connector
481235783Skib * @status: connector connected?
482235783Skib * @funcs: connector control functions
483235783Skib *
484235783Skib * Each connector may be connected to one or more CRTCs, or may be clonable by
485235783Skib * another connector if they can share a CRTC.  Each connector also has a specific
486235783Skib * position in the broader display (referred to as a 'screen' though it could
487235783Skib * span multiple monitors).
488235783Skib */
489235783Skibstruct drm_connector {
490235783Skib	struct drm_device *dev;
491235783Skib	/* struct device kdev; XXXKIB */
492235783Skib	struct device_attribute *attr;
493235783Skib	struct list_head head;
494235783Skib
495235783Skib	struct drm_mode_object base;
496235783Skib
497235783Skib	int connector_type;
498235783Skib	int connector_type_id;
499235783Skib	bool interlace_allowed;
500235783Skib	bool doublescan_allowed;
501235783Skib	struct list_head modes; /* list of modes on this connector */
502235783Skib
503235783Skib	int initial_x, initial_y;
504235783Skib	enum drm_connector_status status;
505235783Skib
506235783Skib	/* these are modes added by probing with DDC or the BIOS */
507235783Skib	struct list_head probed_modes;
508235783Skib
509235783Skib	struct drm_display_info display_info;
510235783Skib	const struct drm_connector_funcs *funcs;
511235783Skib
512235783Skib	struct list_head user_modes;
513235783Skib	struct drm_property_blob *edid_blob_ptr;
514235783Skib	u32 property_ids[DRM_CONNECTOR_MAX_PROPERTY];
515235783Skib	uint64_t property_values[DRM_CONNECTOR_MAX_PROPERTY];
516235783Skib
517235783Skib	uint8_t polled; /* DRM_CONNECTOR_POLL_* */
518235783Skib
519235783Skib	/* requested DPMS state */
520235783Skib	int dpms;
521235783Skib
522235783Skib	void *helper_private;
523235783Skib
524235783Skib	/* forced on connector */
525235783Skib	enum drm_connector_force force;
526235783Skib	uint32_t encoder_ids[DRM_CONNECTOR_MAX_ENCODER];
527235783Skib	uint32_t force_encoder_id;
528235783Skib	struct drm_encoder *encoder; /* currently active encoder */
529235783Skib
530235783Skib	/* EDID bits */
531235783Skib	uint8_t eld[MAX_ELD_BYTES];
532235783Skib	bool dvi_dual;
533235783Skib	int max_tmds_clock;	/* in MHz */
534235783Skib	bool latency_present[2];
535235783Skib	int video_latency[2];	/* [0]: progressive, [1]: interlaced */
536235783Skib	int audio_latency[2];
537235783Skib
538235783Skib	int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
539235783Skib};
540235783Skib
541235783Skib/**
542235783Skib * drm_plane_funcs - driver plane control functions
543235783Skib * @update_plane: update the plane configuration
544235783Skib * @disable_plane: shut down the plane
545235783Skib * @destroy: clean up plane resources
546235783Skib */
547235783Skibstruct drm_plane_funcs {
548235783Skib	int (*update_plane)(struct drm_plane *plane,
549235783Skib			    struct drm_crtc *crtc, struct drm_framebuffer *fb,
550235783Skib			    int crtc_x, int crtc_y,
551235783Skib			    unsigned int crtc_w, unsigned int crtc_h,
552235783Skib			    uint32_t src_x, uint32_t src_y,
553235783Skib			    uint32_t src_w, uint32_t src_h);
554235783Skib	int (*disable_plane)(struct drm_plane *plane);
555235783Skib	void (*destroy)(struct drm_plane *plane);
556235783Skib};
557235783Skib
558235783Skib/**
559235783Skib * drm_plane - central DRM plane control structure
560235783Skib * @dev: DRM device this plane belongs to
561235783Skib * @head: for list management
562235783Skib * @base: base mode object
563235783Skib * @possible_crtcs: pipes this plane can be bound to
564235783Skib * @format_types: array of formats supported by this plane
565235783Skib * @format_count: number of formats supported
566235783Skib * @crtc: currently bound CRTC
567235783Skib * @fb: currently bound fb
568235783Skib * @gamma_size: size of gamma table
569235783Skib * @gamma_store: gamma correction table
570235783Skib * @enabled: enabled flag
571235783Skib * @funcs: helper functions
572235783Skib * @helper_private: storage for drver layer
573235783Skib */
574235783Skibstruct drm_plane {
575235783Skib	struct drm_device *dev;
576235783Skib	struct list_head head;
577235783Skib
578235783Skib	struct drm_mode_object base;
579235783Skib
580235783Skib	uint32_t possible_crtcs;
581235783Skib	uint32_t *format_types;
582235783Skib	uint32_t format_count;
583235783Skib
584235783Skib	struct drm_crtc *crtc;
585235783Skib	struct drm_framebuffer *fb;
586235783Skib
587235783Skib	/* CRTC gamma size for reporting to userspace */
588235783Skib	uint32_t gamma_size;
589235783Skib	uint16_t *gamma_store;
590235783Skib
591235783Skib	bool enabled;
592235783Skib
593235783Skib	const struct drm_plane_funcs *funcs;
594235783Skib	void *helper_private;
595235783Skib};
596235783Skib
597235783Skib/**
598235783Skib * struct drm_mode_set
599235783Skib *
600235783Skib * Represents a single crtc the connectors that it drives with what mode
601235783Skib * and from which framebuffer it scans out from.
602235783Skib *
603235783Skib * This is used to set modes.
604235783Skib */
605235783Skibstruct drm_mode_set {
606235783Skib	struct list_head head;
607235783Skib
608235783Skib	struct drm_framebuffer *fb;
609235783Skib	struct drm_crtc *crtc;
610235783Skib	struct drm_display_mode *mode;
611235783Skib
612235783Skib	uint32_t x;
613235783Skib	uint32_t y;
614235783Skib
615235783Skib	struct drm_connector **connectors;
616235783Skib	size_t num_connectors;
617235783Skib};
618235783Skib
619235783Skib/**
620235783Skib * struct drm_mode_config_funcs - configure CRTCs for a given screen layout
621235783Skib */
622235783Skibstruct drm_mode_config_funcs {
623235783Skib	int (*fb_create)(struct drm_device *dev,
624235783Skib	    struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd,
625235783Skib	    struct drm_framebuffer **res);
626235783Skib	void (*output_poll_changed)(struct drm_device *dev);
627235783Skib};
628235783Skib
629235783Skibstruct drm_mode_group {
630235783Skib	uint32_t num_crtcs;
631235783Skib	uint32_t num_encoders;
632235783Skib	uint32_t num_connectors;
633235783Skib
634235783Skib	/* list of object IDs for this group */
635235783Skib	uint32_t *id_list;
636235783Skib};
637235783Skib
638235783Skib/**
639235783Skib * drm_mode_config - Mode configuration control structure
640235783Skib *
641235783Skib */
642235783Skibstruct drm_mode_config {
643235783Skib	struct sx mutex; /* protects configuration (mode lists etc.) */
644235783Skib	struct drm_gem_names crtc_names; /* use this idr for all IDs, fb, crtc, connector, modes */
645235783Skib	/* this is limited to one for now */
646235783Skib	int num_fb;
647235783Skib	struct list_head fb_list;
648235783Skib	int num_connector;
649235783Skib	struct list_head connector_list;
650235783Skib	int num_encoder;
651235783Skib	struct list_head encoder_list;
652235783Skib	int num_plane;
653235783Skib	struct list_head plane_list;
654235783Skib
655235783Skib	int num_crtc;
656235783Skib	struct list_head crtc_list;
657235783Skib
658235783Skib	struct list_head property_list;
659235783Skib
660235783Skib	int min_width, min_height;
661235783Skib	int max_width, max_height;
662235783Skib	struct drm_mode_config_funcs *funcs;
663235783Skib	resource_size_t fb_base;
664235783Skib
665235783Skib	/* output poll support */
666235783Skib	bool poll_enabled;
667235783Skib	struct timeout_task output_poll_task;
668235783Skib
669235783Skib	/* pointers to standard properties */
670235783Skib	struct list_head property_blob_list;
671235783Skib	struct drm_property *edid_property;
672235783Skib	struct drm_property *dpms_property;
673235783Skib
674235783Skib	/* DVI-I properties */
675235783Skib	struct drm_property *dvi_i_subconnector_property;
676235783Skib	struct drm_property *dvi_i_select_subconnector_property;
677235783Skib
678235783Skib	/* TV properties */
679235783Skib	struct drm_property *tv_subconnector_property;
680235783Skib	struct drm_property *tv_select_subconnector_property;
681235783Skib	struct drm_property *tv_mode_property;
682235783Skib	struct drm_property *tv_left_margin_property;
683235783Skib	struct drm_property *tv_right_margin_property;
684235783Skib	struct drm_property *tv_top_margin_property;
685235783Skib	struct drm_property *tv_bottom_margin_property;
686235783Skib	struct drm_property *tv_brightness_property;
687235783Skib	struct drm_property *tv_contrast_property;
688235783Skib	struct drm_property *tv_flicker_reduction_property;
689235783Skib	struct drm_property *tv_overscan_property;
690235783Skib	struct drm_property *tv_saturation_property;
691235783Skib	struct drm_property *tv_hue_property;
692235783Skib
693235783Skib	/* Optional properties */
694235783Skib	struct drm_property *scaling_mode_property;
695235783Skib	struct drm_property *dithering_mode_property;
696235783Skib	struct drm_property *dirty_info_property;
697235783Skib
698235783Skib	/* dumb ioctl parameters */
699235783Skib	uint32_t preferred_depth, prefer_shadow;
700235783Skib};
701235783Skib
702235783Skib#define obj_to_crtc(x) container_of(x, struct drm_crtc, base)
703235783Skib#define obj_to_connector(x) container_of(x, struct drm_connector, base)
704235783Skib#define obj_to_encoder(x) container_of(x, struct drm_encoder, base)
705235783Skib#define obj_to_mode(x) container_of(x, struct drm_display_mode, base)
706235783Skib#define obj_to_fb(x) container_of(x, struct drm_framebuffer, base)
707235783Skib#define obj_to_property(x) container_of(x, struct drm_property, base)
708235783Skib#define obj_to_blob(x) container_of(x, struct drm_property_blob, base)
709235783Skib#define obj_to_plane(x) container_of(x, struct drm_plane, base)
710235783Skib
711235783Skibstruct drm_prop_enum_list {
712235783Skib	int type;
713235783Skib	char *name;
714235783Skib};
715235783Skib
716235783Skib#if defined(MODE_SETTING_LOCKING_IS_NOT_BROKEN)
717235783Skib#define	DRM_MODE_CONFIG_ASSERT_LOCKED(dev) \
718235783Skib	sx_assert(&dev->mode_config.mutex, SA_XLOCKED)
719235783Skib#else
720235783Skib#define	DRM_MODE_CONFIG_ASSERT_LOCKED(dev)
721235783Skib#endif
722235783Skib
723235783Skibextern char *drm_get_dirty_info_name(int val);
724235783Skibextern char *drm_get_connector_status_name(enum drm_connector_status status);
725235783Skib
726235783Skibextern int drm_crtc_init(struct drm_device *dev,
727235783Skib			 struct drm_crtc *crtc,
728235783Skib			 const struct drm_crtc_funcs *funcs);
729235783Skibextern void drm_crtc_cleanup(struct drm_crtc *crtc);
730235783Skib
731235783Skibextern int drm_connector_init(struct drm_device *dev,
732235783Skib			      struct drm_connector *connector,
733235783Skib			      const struct drm_connector_funcs *funcs,
734235783Skib			      int connector_type);
735235783Skib
736235783Skibextern void drm_connector_cleanup(struct drm_connector *connector);
737235783Skib
738235783Skibextern int drm_encoder_init(struct drm_device *dev,
739235783Skib			    struct drm_encoder *encoder,
740235783Skib			    const struct drm_encoder_funcs *funcs,
741235783Skib			    int encoder_type);
742235783Skib
743235783Skibextern int drm_plane_init(struct drm_device *dev,
744235783Skib			  struct drm_plane *plane,
745235783Skib			  unsigned long possible_crtcs,
746235783Skib			  const struct drm_plane_funcs *funcs,
747235783Skib			  const uint32_t *formats, uint32_t format_count,
748235783Skib			  bool priv);
749235783Skibextern void drm_plane_cleanup(struct drm_plane *plane);
750235783Skib
751235783Skibextern void drm_encoder_cleanup(struct drm_encoder *encoder);
752235783Skib
753235783Skibextern char *drm_get_connector_name(struct drm_connector *connector);
754235783Skibextern char *drm_get_dpms_name(int val);
755235783Skibextern char *drm_get_dvi_i_subconnector_name(int val);
756235783Skibextern char *drm_get_dvi_i_select_name(int val);
757235783Skibextern char *drm_get_tv_subconnector_name(int val);
758235783Skibextern char *drm_get_tv_select_name(int val);
759235783Skibextern void drm_fb_release(struct drm_file *file_priv);
760235783Skibextern int drm_mode_group_init_legacy_group(struct drm_device *dev, struct drm_mode_group *group);
761235783Skibextern struct edid *drm_get_edid(struct drm_connector *connector,
762235783Skib				 device_t adapter);
763235783Skibextern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
764235783Skibextern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode);
765235783Skibextern void drm_mode_remove(struct drm_connector *connector, struct drm_display_mode *mode);
766235783Skibextern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
767235783Skib    const struct drm_display_mode *mode);
768235783Skibextern void drm_mode_debug_printmodeline(struct drm_display_mode *mode);
769235783Skibextern void drm_mode_config_init(struct drm_device *dev);
770235783Skibextern void drm_mode_config_reset(struct drm_device *dev);
771235783Skibextern void drm_mode_config_cleanup(struct drm_device *dev);
772235783Skibextern void drm_mode_set_name(struct drm_display_mode *mode);
773235783Skibextern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2);
774235783Skibextern int drm_mode_width(struct drm_display_mode *mode);
775235783Skibextern int drm_mode_height(struct drm_display_mode *mode);
776235783Skib
777235783Skib/* for us by fb module */
778235783Skibextern int drm_mode_attachmode_crtc(struct drm_device *dev,
779235783Skib				    struct drm_crtc *crtc,
780235783Skib				    const struct drm_display_mode *mode);
781235783Skibextern int drm_mode_detachmode_crtc(struct drm_device *dev, struct drm_display_mode *mode);
782235783Skib
783235783Skibextern struct drm_display_mode *drm_mode_create(struct drm_device *dev);
784235783Skibextern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode);
785235783Skibextern void drm_mode_list_concat(struct list_head *head,
786235783Skib				 struct list_head *new);
787235783Skibextern void drm_mode_validate_size(struct drm_device *dev,
788235783Skib				   struct list_head *mode_list,
789235783Skib				   int maxX, int maxY, int maxPitch);
790235783Skibextern void drm_mode_validate_clocks(struct drm_device *dev,
791235783Skib			      struct list_head *mode_list,
792235783Skib			      int *min, int *max, int n_ranges);
793235783Skibextern void drm_mode_prune_invalid(struct drm_device *dev,
794235783Skib				   struct list_head *mode_list, bool verbose);
795235783Skibextern void drm_mode_sort(struct list_head *mode_list);
796235783Skibextern int drm_mode_hsync(const struct drm_display_mode *mode);
797235783Skibextern int drm_mode_vrefresh(const struct drm_display_mode *mode);
798235783Skibextern void drm_mode_set_crtcinfo(struct drm_display_mode *p,
799235783Skib				  int adjust_flags);
800235783Skibextern void drm_mode_connector_list_update(struct drm_connector *connector);
801235783Skibextern int drm_mode_connector_update_edid_property(struct drm_connector *connector,
802235783Skib						struct edid *edid);
803235783Skibextern int drm_connector_property_set_value(struct drm_connector *connector,
804235783Skib					 struct drm_property *property,
805235783Skib					 uint64_t value);
806235783Skibextern int drm_connector_property_get_value(struct drm_connector *connector,
807235783Skib					 struct drm_property *property,
808235783Skib					 uint64_t *value);
809235783Skibextern struct drm_display_mode *drm_crtc_mode_create(struct drm_device *dev);
810235783Skibextern void drm_framebuffer_set_object(struct drm_device *dev,
811235783Skib				       unsigned long handle);
812235783Skibextern int drm_framebuffer_init(struct drm_device *dev,
813235783Skib				struct drm_framebuffer *fb,
814235783Skib				const struct drm_framebuffer_funcs *funcs);
815235783Skibextern void drm_framebuffer_cleanup(struct drm_framebuffer *fb);
816235783Skibextern int drmfb_probe(struct drm_device *dev, struct drm_crtc *crtc);
817235783Skibextern int drmfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
818235783Skibextern void drm_crtc_probe_connector_modes(struct drm_device *dev, int maxX, int maxY);
819235783Skibextern bool drm_crtc_in_use(struct drm_crtc *crtc);
820235783Skib
821235783Skibextern int drm_connector_attach_property(struct drm_connector *connector,
822235783Skib				      struct drm_property *property, uint64_t init_val);
823235783Skibextern struct drm_property *drm_property_create(struct drm_device *dev, int flags,
824235783Skib						const char *name, int num_values);
825235783Skibextern struct drm_property *drm_property_create_enum(struct drm_device *dev, int flags,
826235783Skib					 const char *name,
827235783Skib					 const struct drm_prop_enum_list *props,
828235783Skib					 int num_values);
829235783Skibstruct drm_property *drm_property_create_range(struct drm_device *dev, int flags,
830235783Skib					 const char *name,
831235783Skib					 uint64_t min, uint64_t max);
832235783Skibextern void drm_property_destroy(struct drm_device *dev, struct drm_property *property);
833235783Skibextern int drm_property_add_enum(struct drm_property *property, int index,
834235783Skib				 uint64_t value, const char *name);
835235783Skibextern int drm_mode_create_dvi_i_properties(struct drm_device *dev);
836235783Skibextern int drm_mode_create_tv_properties(struct drm_device *dev, int num_formats,
837235783Skib				     char *formats[]);
838235783Skibextern int drm_mode_create_scaling_mode_property(struct drm_device *dev);
839235783Skibextern int drm_mode_create_dithering_property(struct drm_device *dev);
840235783Skibextern int drm_mode_create_dirty_info_property(struct drm_device *dev);
841235783Skibextern char *drm_get_encoder_name(struct drm_encoder *encoder);
842235783Skib
843235783Skibextern int drm_mode_connector_attach_encoder(struct drm_connector *connector,
844235783Skib					     struct drm_encoder *encoder);
845235783Skibextern void drm_mode_connector_detach_encoder(struct drm_connector *connector,
846235783Skib					   struct drm_encoder *encoder);
847235783Skibextern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc,
848235783Skib					 int gamma_size);
849235783Skibextern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev,
850235783Skib		uint32_t id, uint32_t type);
851235783Skib/* IOCTLs */
852235783Skibextern int drm_mode_getresources(struct drm_device *dev,
853235783Skib				 void *data, struct drm_file *file_priv);
854235783Skibextern int drm_mode_getplane_res(struct drm_device *dev, void *data,
855235783Skib				   struct drm_file *file_priv);
856235783Skibextern int drm_mode_getcrtc(struct drm_device *dev,
857235783Skib			    void *data, struct drm_file *file_priv);
858235783Skibextern int drm_mode_getconnector(struct drm_device *dev,
859235783Skib			      void *data, struct drm_file *file_priv);
860235783Skibextern int drm_mode_setcrtc(struct drm_device *dev,
861235783Skib			    void *data, struct drm_file *file_priv);
862235783Skibextern int drm_mode_getplane(struct drm_device *dev,
863235783Skib			       void *data, struct drm_file *file_priv);
864235783Skibextern int drm_mode_setplane(struct drm_device *dev,
865235783Skib			       void *data, struct drm_file *file_priv);
866235783Skibextern int drm_mode_cursor_ioctl(struct drm_device *dev,
867235783Skib				void *data, struct drm_file *file_priv);
868235783Skibextern int drm_mode_addfb(struct drm_device *dev,
869235783Skib			  void *data, struct drm_file *file_priv);
870235783Skibextern int drm_mode_addfb2(struct drm_device *dev,
871235783Skib			   void *data, struct drm_file *file_priv);
872235783Skibextern uint32_t drm_mode_legacy_fb_format(uint32_t bpp, uint32_t depth);
873235783Skibextern int drm_mode_rmfb(struct drm_device *dev,
874235783Skib			 void *data, struct drm_file *file_priv);
875235783Skibextern int drm_mode_getfb(struct drm_device *dev,
876235783Skib			  void *data, struct drm_file *file_priv);
877235783Skibextern int drm_mode_dirtyfb_ioctl(struct drm_device *dev,
878235783Skib				  void *data, struct drm_file *file_priv);
879235783Skibextern int drm_mode_addmode_ioctl(struct drm_device *dev,
880235783Skib				  void *data, struct drm_file *file_priv);
881235783Skibextern int drm_mode_rmmode_ioctl(struct drm_device *dev,
882235783Skib				 void *data, struct drm_file *file_priv);
883235783Skibextern int drm_mode_attachmode_ioctl(struct drm_device *dev,
884235783Skib				     void *data, struct drm_file *file_priv);
885235783Skibextern int drm_mode_detachmode_ioctl(struct drm_device *dev,
886235783Skib				     void *data, struct drm_file *file_priv);
887235783Skib
888235783Skibextern int drm_mode_getproperty_ioctl(struct drm_device *dev,
889235783Skib				      void *data, struct drm_file *file_priv);
890235783Skibextern int drm_mode_getblob_ioctl(struct drm_device *dev,
891235783Skib				  void *data, struct drm_file *file_priv);
892235783Skibextern int drm_mode_connector_property_set_ioctl(struct drm_device *dev,
893235783Skib					      void *data, struct drm_file *file_priv);
894235783Skibextern int drm_mode_hotplug_ioctl(struct drm_device *dev,
895235783Skib				  void *data, struct drm_file *file_priv);
896235783Skibextern int drm_mode_replacefb(struct drm_device *dev,
897235783Skib			      void *data, struct drm_file *file_priv);
898235783Skibextern int drm_mode_getencoder(struct drm_device *dev,
899235783Skib			       void *data, struct drm_file *file_priv);
900235783Skibextern int drm_mode_gamma_get_ioctl(struct drm_device *dev,
901235783Skib				    void *data, struct drm_file *file_priv);
902235783Skibextern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
903235783Skib				    void *data, struct drm_file *file_priv);
904235783Skibextern bool drm_detect_hdmi_monitor(struct edid *edid);
905235783Skibextern bool drm_detect_monitor_audio(struct edid *edid);
906235783Skibextern int drm_mode_page_flip_ioctl(struct drm_device *dev,
907235783Skib				    void *data, struct drm_file *file_priv);
908235783Skibextern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev,
909235783Skib				int hdisplay, int vdisplay, int vrefresh,
910235783Skib				bool reduced, bool interlaced, bool margins);
911235783Skibextern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev,
912235783Skib				int hdisplay, int vdisplay, int vrefresh,
913235783Skib				bool interlaced, int margins);
914235783Skibextern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev,
915235783Skib				int hdisplay, int vdisplay, int vrefresh,
916235783Skib				bool interlaced, int margins, int GTF_M,
917235783Skib				int GTF_2C, int GTF_K, int GTF_2J);
918235783Skibextern int drm_add_modes_noedid(struct drm_connector *connector,
919235783Skib				int hdisplay, int vdisplay);
920235783Skib
921235783Skibextern int drm_edid_header_is_valid(const u8 *raw_edid);
922235783Skibextern bool drm_edid_is_valid(struct edid *edid);
923235783Skibstruct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
924235783Skib					   int hsize, int vsize, int fresh);
925235783Skib
926235783Skibextern int drm_mode_create_dumb_ioctl(struct drm_device *dev,
927235783Skib				      void *data, struct drm_file *file_priv);
928235783Skibextern int drm_mode_mmap_dumb_ioctl(struct drm_device *dev,
929235783Skib				    void *data, struct drm_file *file_priv);
930235783Skibextern int drm_mode_destroy_dumb_ioctl(struct drm_device *dev,
931235783Skib				      void *data, struct drm_file *file_priv);
932235783Skib
933235783Skibextern void drm_fb_get_bpp_depth(uint32_t format, unsigned int *depth,
934235783Skib				 int *bpp);
935235783Skib#endif /* __DRM_CRTC_H__ */
936