drmP.h 33.3 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2 3
 * Internal Header for the Direct Rendering Manager
 *
L
Linus Torvalds 已提交
4 5
 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
6
 * Copyright (c) 2009-2010, Code Aurora Forum.
L
Linus Torvalds 已提交
7 8
 * All rights reserved.
 *
9 10 11
 * Author: Rickard E. (Rik) Faith <faith@valinux.com>
 * Author: Gareth Hughes <gareth@valinux.com>
 *
L
Linus Torvalds 已提交
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice (including the next
 * paragraph) shall be included in all copies or substantial portions of the
 * Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef _DRM_P_H_
#define _DRM_P_H_

35 36 37 38
#include <linux/agp_backend.h>
#include <linux/cdev.h>
#include <linux/dma-mapping.h>
#include <linux/file.h>
L
Linus Torvalds 已提交
39
#include <linux/fs.h>
40 41
#include <linux/highmem.h>
#include <linux/idr.h>
L
Linus Torvalds 已提交
42
#include <linux/init.h>
43
#include <linux/io.h>
L
Linus Torvalds 已提交
44
#include <linux/jiffies.h>
45 46 47
#include <linux/kernel.h>
#include <linux/kref.h>
#include <linux/miscdevice.h>
L
Linus Torvalds 已提交
48
#include <linux/mm.h>
D
Dave Airlie 已提交
49
#include <linux/mutex.h>
50 51 52
#include <linux/pci.h>
#include <linux/platform_device.h>
#include <linux/poll.h>
R
Rob Clark 已提交
53
#include <linux/ratelimit.h>
54 55
#include <linux/sched.h>
#include <linux/slab.h>
L
Linus Torvalds 已提交
56
#include <linux/types.h>
57
#include <linux/vmalloc.h>
58
#include <linux/workqueue.h>
59
#include <linux/fence.h>
60 61

#include <asm/mman.h>
L
Linus Torvalds 已提交
62
#include <asm/pgalloc.h>
63 64
#include <asm/uaccess.h>

65 66 67 68 69
#include <uapi/drm/drm.h>
#include <uapi/drm/drm_mode.h>

#include <drm/drm_agpsupport.h>
#include <drm/drm_crtc.h>
70
#include <drm/drm_fourcc.h>
71
#include <drm/drm_global.h>
72
#include <drm/drm_hashtab.h>
73
#include <drm/drm_mem_util.h>
74 75
#include <drm/drm_mm.h>
#include <drm/drm_os_linux.h>
76
#include <drm/drm_sarea.h>
77
#include <drm/drm_vma_manager.h>
L
Linus Torvalds 已提交
78

79 80
struct module;

81 82
struct drm_file;
struct drm_device;
83
struct drm_agp_head;
84 85 86
struct drm_local_map;
struct drm_device_dma;
struct drm_dma_handle;
D
Daniel Vetter 已提交
87
struct drm_gem_object;
D
Daniel Vetter 已提交
88
struct drm_master;
D
Daniel Vetter 已提交
89
struct drm_vblank_crtc;
90

91
struct device_node;
92
struct videomode;
93
struct reservation_object;
94
struct dma_buf_attachment;
95

96
/*
97
 * The following categories are defined:
98 99 100 101 102 103
 *
 * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ...
 *	 This is the category used by the DRM_DEBUG() macro.
 *
 * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ...
 *	   This is the category used by the DRM_DEBUG_DRIVER() macro.
104
 *
105 106
 * KMS: used in the modesetting code.
 *	This is the category used by the DRM_DEBUG_KMS() macro.
107
 *
108 109
 * PRIME: used in the prime code.
 *	  This is the category used by the DRM_DEBUG_PRIME() macro.
110
 *
D
Daniel Vetter 已提交
111 112 113
 * ATOMIC: used in the atomic code.
 *	  This is the category used by the DRM_DEBUG_ATOMIC() macro.
 *
V
Ville Syrjälä 已提交
114 115 116
 * VBL: used for verbose debug message in the vblank code
 *	  This is the category used by the DRM_DEBUG_VBL() macro.
 *
117 118 119 120 121 122 123
 * Enabling verbose debug messages is done through the drm.debug parameter,
 * each category being enabled by a bit.
 *
 * drm.debug=0x1 will enable CORE messages
 * drm.debug=0x2 will enable DRIVER messages
 * drm.debug=0x3 will enable CORE and DRIVER messages
 * ...
V
Ville Syrjälä 已提交
124
 * drm.debug=0x3f will enable all messages
125 126 127 128
 *
 * An interesting feature is that it's possible to enable verbose logging at
 * run-time by echoing the debug value in its sysfs node:
 *   # echo 0xf > /sys/module/drm/parameters/debug
129
 */
130 131 132 133
#define DRM_UT_CORE 		0x01
#define DRM_UT_DRIVER		0x02
#define DRM_UT_KMS		0x04
#define DRM_UT_PRIME		0x08
D
Daniel Vetter 已提交
134
#define DRM_UT_ATOMIC		0x10
V
Ville Syrjälä 已提交
135
#define DRM_UT_VBL		0x20
136

137 138
extern __printf(2, 3)
void drm_ut_debug_printk(const char *function_name,
139
			 const char *format, ...);
140 141
extern __printf(1, 2)
void drm_err(const char *format, ...);
J
Joe Perches 已提交
142

L
Linus Torvalds 已提交
143 144 145 146 147
/***********************************************************************/
/** \name DRM template customization defaults */
/*@{*/

/* driver capabilities and requirements mask */
148
#define DRIVER_USE_AGP			0x1
149
#define DRIVER_LEGACY			0x2
150 151 152 153 154 155 156 157 158 159 160
#define DRIVER_PCI_DMA			0x8
#define DRIVER_SG			0x10
#define DRIVER_HAVE_DMA			0x20
#define DRIVER_HAVE_IRQ			0x40
#define DRIVER_IRQ_SHARED		0x80
#define DRIVER_GEM			0x1000
#define DRIVER_MODESET			0x2000
#define DRIVER_PRIME			0x4000
#define DRIVER_RENDER			0x8000
#define DRIVER_ATOMIC			0x10000
#define DRIVER_KMS_LEGACY_CONTEXT	0x20000
161

L
Linus Torvalds 已提交
162 163 164 165 166 167 168 169 170 171
/***********************************************************************/
/** \name Macros to make printk easier */
/*@{*/

/**
 * Error output.
 *
 * \param fmt printf() like format string.
 * \param arg arguments
 */
J
Joe Perches 已提交
172
#define DRM_ERROR(fmt, ...)				\
173
	drm_err(fmt, ##__VA_ARGS__)
L
Linus Torvalds 已提交
174

R
Rob Clark 已提交
175 176 177 178 179 180 181 182 183 184 185 186 187
/**
 * Rate limited error output.  Like DRM_ERROR() but won't flood the log.
 *
 * \param fmt printf() like format string.
 * \param arg arguments
 */
#define DRM_ERROR_RATELIMITED(fmt, ...)				\
({									\
	static DEFINE_RATELIMIT_STATE(_rs,				\
				      DEFAULT_RATELIMIT_INTERVAL,	\
				      DEFAULT_RATELIMIT_BURST);		\
									\
	if (__ratelimit(&_rs))						\
188
		drm_err(fmt, ##__VA_ARGS__);				\
R
Rob Clark 已提交
189 190
})

J
Joe Perches 已提交
191 192
#define DRM_INFO(fmt, ...)				\
	printk(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__)
L
Linus Torvalds 已提交
193

194 195 196
#define DRM_INFO_ONCE(fmt, ...)				\
	printk_once(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__)

L
Linus Torvalds 已提交
197 198
/**
 * Debug output.
D
Dave Airlie 已提交
199
 *
L
Linus Torvalds 已提交
200 201 202
 * \param fmt printf() like format string.
 * \param arg arguments
 */
203
#define DRM_DEBUG(fmt, args...)						\
L
Linus Torvalds 已提交
204
	do {								\
205
		if (unlikely(drm_debug & DRM_UT_CORE))			\
206
			drm_ut_debug_printk(__func__, fmt, ##args);	\
207 208
	} while (0)

209
#define DRM_DEBUG_DRIVER(fmt, args...)					\
210
	do {								\
211
		if (unlikely(drm_debug & DRM_UT_DRIVER))		\
212
			drm_ut_debug_printk(__func__, fmt, ##args);	\
213
	} while (0)
214
#define DRM_DEBUG_KMS(fmt, args...)					\
215
	do {								\
216
		if (unlikely(drm_debug & DRM_UT_KMS))			\
217
			drm_ut_debug_printk(__func__, fmt, ##args);	\
218
	} while (0)
219 220
#define DRM_DEBUG_PRIME(fmt, args...)					\
	do {								\
221
		if (unlikely(drm_debug & DRM_UT_PRIME))			\
222
			drm_ut_debug_printk(__func__, fmt, ##args);	\
L
Linus Torvalds 已提交
223
	} while (0)
D
Daniel Vetter 已提交
224 225 226 227 228
#define DRM_DEBUG_ATOMIC(fmt, args...)					\
	do {								\
		if (unlikely(drm_debug & DRM_UT_ATOMIC))		\
			drm_ut_debug_printk(__func__, fmt, ##args);	\
	} while (0)
V
Ville Syrjälä 已提交
229 230 231 232 233
#define DRM_DEBUG_VBL(fmt, args...)					\
	do {								\
		if (unlikely(drm_debug & DRM_UT_VBL))			\
			drm_ut_debug_printk(__func__, fmt, ##args);	\
	} while (0)
L
Linus Torvalds 已提交
234

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264
#define _DRM_DEFINE_DEBUG_RATELIMITED(level, fmt, args...)		\
	do {								\
		if (unlikely(drm_debug & DRM_UT_ ## level)) {		\
			static DEFINE_RATELIMIT_STATE(			\
				_rs,					\
				DEFAULT_RATELIMIT_INTERVAL,		\
				DEFAULT_RATELIMIT_BURST);		\
									\
			if (__ratelimit(&_rs)) {			\
				drm_ut_debug_printk(__func__, fmt,	\
						    ##args);		\
			}						\
		}							\
	} while (0)

/**
 * Rate limited debug output. Like DRM_DEBUG() but won't flood the log.
 *
 * \param fmt printf() like format string.
 * \param arg arguments
 */
#define DRM_DEBUG_RATELIMITED(fmt, args...)				\
	_DRM_DEFINE_DEBUG_RATELIMITED(CORE, fmt, ##args)
#define DRM_DEBUG_DRIVER_RATELIMITED(fmt, args...)			\
	_DRM_DEFINE_DEBUG_RATELIMITED(DRIVER, fmt, ##args)
#define DRM_DEBUG_KMS_RATELIMITED(fmt, args...)				\
	_DRM_DEFINE_DEBUG_RATELIMITED(KMS, fmt, ##args)
#define DRM_DEBUG_PRIME_RATELIMITED(fmt, args...)			\
	_DRM_DEFINE_DEBUG_RATELIMITED(PRIME, fmt, ##args)

L
Linus Torvalds 已提交
265 266 267 268 269 270 271 272 273 274 275 276
/*@}*/

/***********************************************************************/
/** \name Internal types and structures */
/*@{*/

#define DRM_IF_VERSION(maj, min) (maj << 16 | min)

/**
 * Ioctl function type.
 *
 * \param inode device inode.
277
 * \param file_priv DRM file private pointer.
L
Linus Torvalds 已提交
278 279 280
 * \param cmd command.
 * \param arg argument.
 */
281 282
typedef int drm_ioctl_t(struct drm_device *dev, void *data,
			struct drm_file *file_priv);
L
Linus Torvalds 已提交
283

284 285 286
typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
			       unsigned long arg);

287 288 289
#define DRM_IOCTL_NR(n)                _IOC_NR(n)
#define DRM_MAJOR       226

290 291 292
#define DRM_AUTH	0x1
#define	DRM_MASTER	0x2
#define DRM_ROOT_ONLY	0x4
D
Dave Airlie 已提交
293
#define DRM_CONTROL_ALLOW 0x8
294
#define DRM_UNLOCKED	0x10
295
#define DRM_RENDER_ALLOW 0x20
296

297 298
struct drm_ioctl_desc {
	unsigned int cmd;
299
	int flags;
300
	drm_ioctl_t *func;
301
	const char *name;
302 303 304 305 306 307
};

/**
 * Creates a driver or general drm_ioctl_desc array entry for the given
 * ioctl, for use by drm_ioctl().
 */
308

309 310 311 312 313 314 315
#define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags)				\
	[DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {	\
		.cmd = DRM_IOCTL_##ioctl,				\
		.func = _func,						\
		.flags = _flags,					\
		.name = #ioctl						\
	 }
L
Linus Torvalds 已提交
316

317 318
/* Event queued up for userspace to read */
struct drm_pending_event {
319
	struct completion *completion;
320
	struct drm_event *event;
321
	struct fence *fence;
322
	struct list_head link;
323
	struct list_head pending_link;
324
	struct drm_file *file_priv;
325 326
	pid_t pid; /* pid of requester, no guarantee it's valid by the time
		      we deliver the event, for tracing only */
327 328
};

329 330 331 332 333 334
/* initial implementaton using a linked list - todo hashtab */
struct drm_prime_file_private {
	struct list_head head;
	struct mutex lock;
};

L
Linus Torvalds 已提交
335
/** File private data */
336
struct drm_file {
337 338 339
	unsigned authenticated :1;
	/* true when the client has asked us to expose stereo 3D mode flags */
	unsigned stereo_allowed :1;
340 341 342 343 344
	/*
	 * true if client understands CRTC primary planes and cursor planes
	 * in the plane list
	 */
	unsigned universal_planes:1;
R
Rob Clark 已提交
345 346
	/* true if client understands atomic properties */
	unsigned atomic:1;
347
	/*
348
	 * This client is the creator of @master.
349 350
	 * Protected by struct drm_device::master_mutex.
	 */
351
	unsigned is_master:1;
352

353 354
	struct pid *pid;
	kuid_t uid;
D
Dave Airlie 已提交
355
	drm_magic_t magic;
356
	struct list_head lhead;
357
	struct drm_minor *minor;
D
Dave Airlie 已提交
358
	unsigned long lock_count;
359

360 361 362 363
	/** Mapping of mm object handles to object pointers. */
	struct idr object_idr;
	/** Lock for synchronization of access to object_idr. */
	spinlock_t table_lock;
364

365
	struct file *filp;
366
	void *driver_priv;
367 368

	struct drm_master *master; /* master this node is currently associated with
369
				      N.B. not always dev->master */
370 371 372 373 374 375
	/**
	 * fbs - List of framebuffers associated with this file.
	 *
	 * Protected by fbs_lock. Note that the fbs list holds a reference on
	 * the fb object to prevent it from untimely disappearing.
	 */
D
Dave Airlie 已提交
376
	struct list_head fbs;
377
	struct mutex fbs_lock;
378

379 380 381 382
	/** User-created blob properties; this retains a reference on the
	 *  property. */
	struct list_head blobs;

383
	wait_queue_head_t event_wait;
384
	struct list_head pending_event_list;
385 386
	struct list_head event_list;
	int event_space;
387

388 389
	struct mutex event_read_lock;

390
	struct drm_prime_file_private prime;
391
};
L
Linus Torvalds 已提交
392 393 394 395

/**
 * Lock data.
 */
D
Dave Airlie 已提交
396
struct drm_lock_data {
397
	struct drm_hw_lock *hw_lock;	/**< Hardware lock */
398 399
	/** Private of lock holder's file (NULL=kernel) */
	struct drm_file *file_priv;
L
Linus Torvalds 已提交
400
	wait_queue_head_t lock_queue;	/**< Queue of blocked processes */
D
Dave Airlie 已提交
401
	unsigned long lock_time;	/**< Time of last lock in jiffies */
402 403 404 405
	spinlock_t spinlock;
	uint32_t kernel_waiters;
	uint32_t user_waiters;
	int idle_has_lock;
D
Dave Airlie 已提交
406
};
L
Linus Torvalds 已提交
407

408 409 410
/* Flags and return codes for get_vblank_timestamp() driver function. */
#define DRM_CALLED_FROM_VBLIRQ 1
#define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0)
411
#define DRM_VBLANKTIME_IN_VBLANK         (1 << 1)
412 413 414

/* get_scanout_position() return flags */
#define DRM_SCANOUTPOS_VALID        (1 << 0)
415
#define DRM_SCANOUTPOS_IN_VBLANK    (1 << 1)
416 417
#define DRM_SCANOUTPOS_ACCURATE     (1 << 2)

L
Linus Torvalds 已提交
418 419 420 421 422 423
/**
 * DRM driver structure. This structure represent the common code for
 * a family of cards. There will one drm_device for each card present
 * in this family
 */
struct drm_driver {
424 425
	int (*load) (struct drm_device *, unsigned long flags);
	int (*firstopen) (struct drm_device *);
426
	int (*open) (struct drm_device *, struct drm_file *);
427
	void (*preclose) (struct drm_device *, struct drm_file *file_priv);
428
	void (*postclose) (struct drm_device *, struct drm_file *);
429 430
	void (*lastclose) (struct drm_device *);
	int (*unload) (struct drm_device *);
431
	int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
D
Dave Airlie 已提交
432
	int (*dma_quiescent) (struct drm_device *);
433
	int (*context_dtor) (struct drm_device *dev, int context);
434
	int (*set_busid)(struct drm_device *dev, struct drm_master *master);
D
Dave Airlie 已提交
435

436 437 438
	/**
	 * get_vblank_counter - get raw hardware vblank counter
	 * @dev: DRM device
439
	 * @pipe: counter to fetch
440
	 *
441 442
	 * Driver callback for fetching a raw hardware vblank counter for @crtc.
	 * If a device doesn't have a hardware counter, the driver can simply
443
	 * use drm_vblank_no_hw_counter() function. The DRM core will account for
444 445
	 * missed vblank events while interrupts where disabled based on system
	 * timestamps.
446 447 448 449 450 451 452
	 *
	 * Wraparound handling and loss of events due to modesetting is dealt
	 * with in the DRM core code.
	 *
	 * RETURNS
	 * Raw vblank counter value.
	 */
453
	u32 (*get_vblank_counter) (struct drm_device *dev, unsigned int pipe);
454 455 456 457

	/**
	 * enable_vblank - enable vblank interrupt events
	 * @dev: DRM device
458
	 * @pipe: which irq to enable
459 460
	 *
	 * Enable vblank interrupts for @crtc.  If the device doesn't have
461 462
	 * a hardware vblank counter, the driver should use the
	 * drm_vblank_no_hw_counter() function that keeps a virtual counter.
463 464 465 466 467
	 *
	 * RETURNS
	 * Zero on success, appropriate errno if the given @crtc's vblank
	 * interrupt cannot be enabled.
	 */
468
	int (*enable_vblank) (struct drm_device *dev, unsigned int pipe);
469 470 471 472

	/**
	 * disable_vblank - disable vblank interrupt events
	 * @dev: DRM device
473
	 * @pipe: which irq to enable
474 475
	 *
	 * Disable vblank interrupts for @crtc.  If the device doesn't have
476 477
	 * a hardware vblank counter, the driver should use the
	 * drm_vblank_no_hw_counter() function that keeps a virtual counter.
478
	 */
479
	void (*disable_vblank) (struct drm_device *dev, unsigned int pipe);
480

481 482 483 484 485 486 487 488 489 490 491
	/**
	 * Called by \c drm_device_is_agp.  Typically used to determine if a
	 * card is really attached to AGP or not.
	 *
	 * \param dev  DRM device handle
	 *
	 * \returns
	 * One of three values is returned depending on whether or not the
	 * card is absolutely \b not AGP (return of 0), absolutely \b is AGP
	 * (return of 1), or may or may not be AGP (return of 2).
	 */
492
	int (*device_is_agp) (struct drm_device *dev);
493

494 495 496
	/**
	 * Called by vblank timestamping code.
	 *
497 498
	 * Return the current display scanout position from a crtc, and an
	 * optional accurate ktime_get timestamp of when position was measured.
499 500
	 *
	 * \param dev  DRM device.
501
	 * \param pipe Id of the crtc to query.
502
	 * \param flags Flags from the caller (DRM_CALLED_FROM_VBLIRQ or 0).
503 504
	 * \param *vpos Target location for current vertical scanout position.
	 * \param *hpos Target location for current horizontal scanout position.
505 506 507 508
	 * \param *stime Target location for timestamp taken immediately before
	 *               scanout position query. Can be NULL to skip timestamp.
	 * \param *etime Target location for timestamp taken immediately after
	 *               scanout position query. Can be NULL to skip timestamp.
509
	 * \param mode Current display timings.
510 511 512 513 514 515 516 517
	 *
	 * Returns vpos as a positive number while in active scanout area.
	 * Returns vpos as a negative number inside vblank, counting the number
	 * of scanlines to go until end of vblank, e.g., -1 means "one scanline
	 * until start of active scanout / end of vblank."
	 *
	 * \return Flags, or'ed together as follows:
	 *
L
Lucas De Marchi 已提交
518
	 * DRM_SCANOUTPOS_VALID = Query successful.
519 520 521 522 523 524
	 * DRM_SCANOUTPOS_INVBL = Inside vblank.
	 * DRM_SCANOUTPOS_ACCURATE = Returned position is accurate. A lack of
	 * this flag means that returned position may be offset by a constant
	 * but unknown small number of scanlines wrt. real scanout position.
	 *
	 */
525 526
	int (*get_scanout_position) (struct drm_device *dev, unsigned int pipe,
				     unsigned int flags, int *vpos, int *hpos,
527 528
				     ktime_t *stime, ktime_t *etime,
				     const struct drm_display_mode *mode);
529 530 531 532 533 534 535 536

	/**
	 * Called by \c drm_get_last_vbltimestamp. Should return a precise
	 * timestamp when the most recent VBLANK interval ended or will end.
	 *
	 * Specifically, the timestamp in @vblank_time should correspond as
	 * closely as possible to the time when the first video scanline of
	 * the video frame after the end of VBLANK will start scanning out,
537
	 * the time immediately after end of the VBLANK interval. If the
538 539 540 541 542 543
	 * @crtc is currently inside VBLANK, this will be a time in the future.
	 * If the @crtc is currently scanning out a frame, this will be the
	 * past start time of the current scanout. This is meant to adhere
	 * to the OpenML OML_sync_control extension specification.
	 *
	 * \param dev dev DRM device handle.
544
	 * \param pipe crtc for which timestamp should be returned.
545 546 547 548 549 550 551 552 553 554 555 556 557 558 559
	 * \param *max_error Maximum allowable timestamp error in nanoseconds.
	 *                   Implementation should strive to provide timestamp
	 *                   with an error of at most *max_error nanoseconds.
	 *                   Returns true upper bound on error for timestamp.
	 * \param *vblank_time Target location for returned vblank timestamp.
	 * \param flags 0 = Defaults, no special treatment needed.
	 * \param       DRM_CALLED_FROM_VBLIRQ = Function is called from vblank
	 *	        irq handler. Some drivers need to apply some workarounds
	 *              for gpu-specific vblank irq quirks if flag is set.
	 *
	 * \returns
	 * Zero if timestamping isn't supported in current display mode or a
	 * negative number on failure. A positive status code on success,
	 * which describes how the vblank_time timestamp was computed.
	 */
560
	int (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
561 562 563 564
				     int *max_error,
				     struct timeval *vblank_time,
				     unsigned flags);

L
Linus Torvalds 已提交
565
	/* these have to be filled in */
D
Dave Airlie 已提交
566

D
Daniel Vetter 已提交
567
	irqreturn_t(*irq_handler) (int irq, void *arg);
568
	void (*irq_preinstall) (struct drm_device *dev);
569
	int (*irq_postinstall) (struct drm_device *dev);
570
	void (*irq_uninstall) (struct drm_device *dev);
571

572 573 574
	/* Master routines */
	int (*master_create)(struct drm_device *dev, struct drm_master *master);
	void (*master_destroy)(struct drm_device *dev, struct drm_master *master);
575 576 577 578 579 580 581
	/**
	 * master_set is called whenever the minor master is set.
	 * master_drop is called whenever the minor master is dropped.
	 */

	int (*master_set)(struct drm_device *dev, struct drm_file *file_priv,
			  bool from_open);
582
	void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv);
583

584 585
	int (*debugfs_init)(struct drm_minor *minor);
	void (*debugfs_cleanup)(struct drm_minor *minor);
586 587

	/**
588
	 * @gem_free_object: deconstructor for drm_gem_objects
589
	 *
590 591
	 * This is deprecated and should not be used by new drivers. Use
	 * @gem_free_object_unlocked instead.
592 593
	 */
	void (*gem_free_object) (struct drm_gem_object *obj);
594 595 596 597 598 599 600 601 602

	/**
	 * @gem_free_object_unlocked: deconstructor for drm_gem_objects
	 *
	 * This is for drivers which are not encumbered with dev->struct_mutex
	 * legacy locking schemes. Use this hook instead of @gem_free_object.
	 */
	void (*gem_free_object_unlocked) (struct drm_gem_object *obj);

603 604
	int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
	void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
605

606 607 608 609 610 611 612
	/**
	 * Hook for allocating the GEM object struct, for use by core
	 * helpers.
	 */
	struct drm_gem_object *(*gem_create_object)(struct drm_device *dev,
						    size_t size);

613 614 615 616 617 618 619 620 621 622 623 624 625
	/* prime: */
	/* export handle -> fd (see drm_gem_prime_handle_to_fd() helper) */
	int (*prime_handle_to_fd)(struct drm_device *dev, struct drm_file *file_priv,
				uint32_t handle, uint32_t flags, int *prime_fd);
	/* import fd -> handle (see drm_gem_prime_fd_to_handle() helper) */
	int (*prime_fd_to_handle)(struct drm_device *dev, struct drm_file *file_priv,
				int prime_fd, uint32_t *handle);
	/* export GEM -> dmabuf */
	struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
				struct drm_gem_object *obj, int flags);
	/* import dmabuf -> GEM */
	struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
				struct dma_buf *dma_buf);
A
Aaron Plattner 已提交
626 627
	/* low-level interface used by drm_gem_prime_{import,export} */
	int (*gem_prime_pin)(struct drm_gem_object *obj);
628
	void (*gem_prime_unpin)(struct drm_gem_object *obj);
629 630
	struct reservation_object * (*gem_prime_res_obj)(
				struct drm_gem_object *obj);
A
Aaron Plattner 已提交
631 632
	struct sg_table *(*gem_prime_get_sg_table)(struct drm_gem_object *obj);
	struct drm_gem_object *(*gem_prime_import_sg_table)(
633 634
				struct drm_device *dev,
				struct dma_buf_attachment *attach,
A
Aaron Plattner 已提交
635 636 637
				struct sg_table *sgt);
	void *(*gem_prime_vmap)(struct drm_gem_object *obj);
	void (*gem_prime_vunmap)(struct drm_gem_object *obj, void *vaddr);
638 639
	int (*gem_prime_mmap)(struct drm_gem_object *obj,
				struct vm_area_struct *vma);
640

641 642 643
	/* vga arb irq handler */
	void (*vgaarb_irq)(struct drm_device *dev, bool state);

644 645 646 647 648 649 650 651 652 653 654
	/* dumb alloc support */
	int (*dumb_create)(struct drm_file *file_priv,
			   struct drm_device *dev,
			   struct drm_mode_create_dumb *args);
	int (*dumb_map_offset)(struct drm_file *file_priv,
			       struct drm_device *dev, uint32_t handle,
			       uint64_t *offset);
	int (*dumb_destroy)(struct drm_file *file_priv,
			    struct drm_device *dev,
			    uint32_t handle);

J
Jesse Barnes 已提交
655
	/* Driver private ops for this object */
656
	const struct vm_operations_struct *gem_vm_ops;
J
Jesse Barnes 已提交
657

658 659 660 661 662 663 664
	int major;
	int minor;
	int patchlevel;
	char *name;
	char *desc;
	char *date;

L
Linus Torvalds 已提交
665 666
	u32 driver_features;
	int dev_priv_size;
R
Rob Clark 已提交
667
	const struct drm_ioctl_desc *ioctls;
L
Linus Torvalds 已提交
668
	int num_ioctls;
669
	const struct file_operations *fops;
670

671 672
	/* List of devices hanging off this driver with stealth attach. */
	struct list_head legacy_dev_list;
L
Linus Torvalds 已提交
673 674
};

D
David Herrmann 已提交
675
enum drm_minor_type {
676
	DRM_MINOR_PRIMARY,
D
David Herrmann 已提交
677 678 679 680
	DRM_MINOR_CONTROL,
	DRM_MINOR_RENDER,
	DRM_MINOR_CNT,
};
681

682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698
/**
 * Info file list entry. This structure represents a debugfs or proc file to
 * be created by the drm core
 */
struct drm_info_list {
	const char *name; /** file name */
	int (*show)(struct seq_file*, void*); /** show callback */
	u32 driver_features; /**< Required driver features for this entry */
	void *data;
};

/**
 * debugfs node structure. This structure represents a debugfs file.
 */
struct drm_info_node {
	struct list_head list;
	struct drm_minor *minor;
D
David Howells 已提交
699
	const struct drm_info_list *info_ent;
700 701 702
	struct dentry *dent;
};

L
Linus Torvalds 已提交
703
/**
704
 * DRM minor structure. This structure represents a drm minor number.
L
Linus Torvalds 已提交
705
 */
706 707 708
struct drm_minor {
	int index;			/**< Minor device number */
	int type;                       /**< Control or render */
709
	struct device *kdev;		/**< Linux device */
L
Linus Torvalds 已提交
710
	struct drm_device *dev;
711 712

	struct dentry *debugfs_root;
713 714 715

	struct list_head debugfs_list;
	struct mutex debugfs_lock; /* Protects debugfs_list. */
716
};
L
Linus Torvalds 已提交
717 718 719 720 721

/**
 * DRM device structure. This structure represent a complete card that
 * may contain multiple heads.
 */
722
struct drm_device {
723
	struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
D
Dave Airlie 已提交
724
	int if_version;			/**< Highest interface version set */
L
Linus Torvalds 已提交
725

726 727
	/** \name Lifetime Management */
	/*@{ */
D
David Herrmann 已提交
728
	struct kref ref;		/**< Object ref-count */
729 730 731 732 733 734
	struct device *dev;		/**< Device structure of bus-device */
	struct drm_driver *driver;	/**< DRM driver managing the device */
	void *dev_private;		/**< DRM driver private data */
	struct drm_minor *control;		/**< Control node */
	struct drm_minor *primary;		/**< Primary node */
	struct drm_minor *render;		/**< Render node */
735 736 737 738

	/* currently active master for this device. Protected by master_mutex */
	struct drm_master *master;

739
	atomic_t unplugged;			/**< Flag whether dev is dead */
740
	struct inode *anon_inode;		/**< inode for private address-space */
741
	char *unique;				/**< unique name of the device */
742 743
	/*@} */

L
Linus Torvalds 已提交
744
	/** \name Locks */
D
Dave Airlie 已提交
745
	/*@{ */
D
Dave Airlie 已提交
746
	struct mutex struct_mutex;	/**< For others */
747
	struct mutex master_mutex;      /**< For drm_minor::master and drm_file::is_master */
D
Dave Airlie 已提交
748
	/*@} */
L
Linus Torvalds 已提交
749 750

	/** \name Usage Counters */
D
Dave Airlie 已提交
751
	/*@{ */
752
	int open_count;			/**< Outstanding files open, protected by drm_global_mutex. */
753
	spinlock_t buf_lock;		/**< For drm_device::buf_use and a few other things. */
D
Dave Airlie 已提交
754 755 756
	int buf_use;			/**< Buffers in use -- cannot alloc */
	atomic_t buf_alloc;		/**< Buffer allocation in progress */
	/*@} */
L
Linus Torvalds 已提交
757

758
	struct mutex filelist_mutex;
759
	struct list_head filelist;
L
Linus Torvalds 已提交
760 761

	/** \name Memory management */
D
Dave Airlie 已提交
762
	/*@{ */
763
	struct list_head maplist;	/**< Linked list of regions */
764
	struct drm_open_hash map_hash;	/**< User token hash table for maps */
L
Linus Torvalds 已提交
765 766

	/** \name Context handle management */
D
Dave Airlie 已提交
767
	/*@{ */
768
	struct list_head ctxlist;	/**< Linked list of context handles */
D
Dave Airlie 已提交
769
	struct mutex ctxlist_mutex;	/**< For ctxlist */
L
Linus Torvalds 已提交
770

771
	struct idr ctx_idr;
L
Linus Torvalds 已提交
772

773
	struct list_head vmalist;	/**< List of vmas (for debugging) */
D
Dave Airlie 已提交
774

D
Dave Airlie 已提交
775
	/*@} */
L
Linus Torvalds 已提交
776

D
Daniel Vetter 已提交
777
	/** \name DMA support */
D
Dave Airlie 已提交
778
	/*@{ */
779
	struct drm_device_dma *dma;		/**< Optional pointer for DMA support */
D
Dave Airlie 已提交
780
	/*@} */
L
Linus Torvalds 已提交
781 782

	/** \name Context support */
D
Dave Airlie 已提交
783
	/*@{ */
784

L
Linus Torvalds 已提交
785
	__volatile__ long context_flag;	/**< Context swapping flag */
D
Dave Airlie 已提交
786 787 788
	int last_context;		/**< Last current context */
	/*@} */

L
Linus Torvalds 已提交
789
	/** \name VBLANK IRQ support */
D
Dave Airlie 已提交
790
	/*@{ */
791 792
	bool irq_enabled;
	int irq;
D
Dave Airlie 已提交
793

794 795 796 797 798 799 800 801 802 803
	/*
	 * If true, vblank interrupt will be disabled immediately when the
	 * refcount drops to zero, as opposed to via the vblank disable
	 * timer.
	 * This can be set to true it the hardware has a working vblank
	 * counter and the driver uses drm_vblank_on() and drm_vblank_off()
	 * appropriately.
	 */
	bool vblank_disable_immediate;

804 805
	/* array of size num_crtcs */
	struct drm_vblank_crtc *vblank;
806

807
	spinlock_t vblank_time_lock;    /**< Protects vblank count and time updates during vblank enable/disable */
D
Dave Airlie 已提交
808
	spinlock_t vbl_lock;
809 810

	u32 max_vblank_count;           /**< size of vblank counter register */
D
Dave Airlie 已提交
811

812 813 814 815 816 817
	/**
	 * List of events
	 */
	struct list_head vblank_event_list;
	spinlock_t event_lock;

D
Dave Airlie 已提交
818 819
	/*@} */

D
Dave Airlie 已提交
820
	struct drm_agp_head *agp;	/**< AGP data */
L
Linus Torvalds 已提交
821

D
Dave Airlie 已提交
822
	struct pci_dev *pdev;		/**< PCI device structure */
L
Linus Torvalds 已提交
823 824 825
#ifdef __alpha__
	struct pci_controller *hose;
#endif
826 827

	struct platform_device *platformdev; /**< Platform device struture */
D
Dave Airlie 已提交
828
	struct virtio_device *virtdev;
829

D
Dave Airlie 已提交
830
	struct drm_sg_mem *sg;	/**< Scatter gather memory */
831
	unsigned int num_crtcs;                  /**< Number of CRTCs on this device */
D
Dave Airlie 已提交
832

833 834 835 836 837
	struct {
		int context;
		struct drm_hw_lock *lock;
	} sigdata;

838
	struct drm_local_map *agp_buffer_map;
839
	unsigned int agp_buffer_token;
840

R
Rob Clark 已提交
841
	struct drm_mode_config mode_config;	/**< Current mode config */
D
Dave Airlie 已提交
842

843 844
	/** \name GEM information */
	/*@{ */
845
	struct mutex object_name_lock;
846
	struct idr object_name_idr;
847
	struct drm_vma_offset_manager *vma_offset_manager;
848
	/*@} */
849
	int switch_power_state;
850
};
L
Linus Torvalds 已提交
851

D
Daniel Vetter 已提交
852 853
#include <drm/drm_irq.h>

854 855 856
#define DRM_SWITCH_POWER_ON 0
#define DRM_SWITCH_POWER_OFF 1
#define DRM_SWITCH_POWER_CHANGING 2
857
#define DRM_SWITCH_POWER_DYNAMIC_OFF 3
858

D
Dave Airlie 已提交
859 860
static __inline__ int drm_core_check_feature(struct drm_device *dev,
					     int feature)
L
Linus Torvalds 已提交
861 862 863 864
{
	return ((dev->driver->driver_features & feature) ? 1 : 0);
}

865 866 867 868 869 870 871 872 873 874 875 876 877
static inline void drm_device_set_unplugged(struct drm_device *dev)
{
	smp_wmb();
	atomic_set(&dev->unplugged, 1);
}

static inline int drm_device_is_unplugged(struct drm_device *dev)
{
	int ret = atomic_read(&dev->unplugged);
	smp_rmb();
	return ret;
}

878
static inline bool drm_is_render_client(const struct drm_file *file_priv)
879 880 881 882
{
	return file_priv->minor->type == DRM_MINOR_RENDER;
}

883 884 885 886 887
static inline bool drm_is_control_client(const struct drm_file *file_priv)
{
	return file_priv->minor->type == DRM_MINOR_CONTROL;
}

888 889
static inline bool drm_is_primary_client(const struct drm_file *file_priv)
{
890
	return file_priv->minor->type == DRM_MINOR_PRIMARY;
891 892
}

L
Linus Torvalds 已提交
893 894 895 896 897
/******************************************************************/
/** \name Internal function definitions */
/*@{*/

				/* Driver support (drm_drv.h) */
898
extern int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);
899 900
extern long drm_ioctl(struct file *filp,
		      unsigned int cmd, unsigned long arg);
D
Dave Airlie 已提交
901 902
extern long drm_compat_ioctl(struct file *filp,
			     unsigned int cmd, unsigned long arg);
903
extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);
L
Linus Torvalds 已提交
904

D
Daniel Vetter 已提交
905 906 907 908 909 910
/* File Operations (drm_fops.c) */
int drm_open(struct inode *inode, struct file *filp);
ssize_t drm_read(struct file *filp, char __user *buffer,
		 size_t count, loff_t *offset);
int drm_release(struct inode *inode, struct file *filp);
unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
911 912 913 914
int drm_event_reserve_init_locked(struct drm_device *dev,
				  struct drm_file *file_priv,
				  struct drm_pending_event *p,
				  struct drm_event *e);
915 916 917 918 919 920
int drm_event_reserve_init(struct drm_device *dev,
			   struct drm_file *file_priv,
			   struct drm_pending_event *p,
			   struct drm_event *e);
void drm_event_cancel_free(struct drm_device *dev,
			   struct drm_pending_event *p);
921 922
void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
void drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
L
Linus Torvalds 已提交
923

924 925 926
/* Misc. IOCTL support (drm_ioctl.c) */
int drm_noop(struct drm_device *dev, void *data,
	     struct drm_file *file_priv);
927 928
int drm_invalid_op(struct drm_device *dev, void *data,
		   struct drm_file *file_priv);
L
Linus Torvalds 已提交
929

930 931
/* Cache management (drm_cache.c) */
void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
932
void drm_clflush_sg(struct sg_table *st);
933
void drm_clflush_virt_range(void *addr, unsigned long length);
934

935 936 937 938 939
/*
 * These are exported to drivers so that they can implement fencing using
 * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
 */

940
/* Modesetting support */
941 942
extern void drm_vblank_pre_modeset(struct drm_device *dev, unsigned int pipe);
extern void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe);
L
Linus Torvalds 已提交
943

944 945 946
/* drm_drv.c */
void drm_put_dev(struct drm_device *dev);
void drm_unplug_dev(struct drm_device *dev);
D
Dave Airlie 已提交
947
extern unsigned int drm_debug;
948

949 950
				/* Debugfs support */
#if defined(CONFIG_DEBUG_FS)
951 952 953 954 955
extern int drm_debugfs_create_files(const struct drm_info_list *files,
				    int count, struct dentry *root,
				    struct drm_minor *minor);
extern int drm_debugfs_remove_files(const struct drm_info_list *files,
				    int count, struct drm_minor *minor);
956 957 958 959 960 961 962 963 964 965 966 967 968
#else
static inline int drm_debugfs_create_files(const struct drm_info_list *files,
					   int count, struct dentry *root,
					   struct drm_minor *minor)
{
	return 0;
}

static inline int drm_debugfs_remove_files(const struct drm_info_list *files,
					   int count, struct drm_minor *minor)
{
	return 0;
}
969 970
#endif

A
Aaron Plattner 已提交
971 972
extern struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
		struct drm_gem_object *obj, int flags);
973 974 975
extern int drm_gem_prime_handle_to_fd(struct drm_device *dev,
		struct drm_file *file_priv, uint32_t handle, uint32_t flags,
		int *prime_fd);
A
Aaron Plattner 已提交
976 977
extern struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
		struct dma_buf *dma_buf);
978 979
extern int drm_gem_prime_fd_to_handle(struct drm_device *dev,
		struct drm_file *file_priv, int prime_fd, uint32_t *handle);
980
extern void drm_gem_dmabuf_release(struct dma_buf *dma_buf);
981

982 983
extern int drm_prime_sg_to_page_addr_arrays(struct sg_table *sgt, struct page **pages,
					    dma_addr_t *addrs, int max_pages);
984
extern struct sg_table *drm_prime_pages_to_sg(struct page **pages, unsigned int nr_pages);
985 986
extern void drm_prime_gem_destroy(struct drm_gem_object *obj, struct sg_table *sg);

L
Linus Torvalds 已提交
987

988 989 990
extern struct drm_dma_handle *drm_pci_alloc(struct drm_device *dev, size_t size,
					    size_t align);
extern void drm_pci_free(struct drm_device *dev, struct drm_dma_handle * dmah);
L
Linus Torvalds 已提交
991 992

			       /* sysfs support (drm_sysfs.c) */
D
Dave Airlie 已提交
993
extern void drm_sysfs_hotplug_event(struct drm_device *dev);
L
Linus Torvalds 已提交
994

995

D
David Herrmann 已提交
996 997
struct drm_device *drm_dev_alloc(struct drm_driver *driver,
				 struct device *parent);
998 999 1000
int drm_dev_init(struct drm_device *dev,
		 struct drm_driver *driver,
		 struct device *parent);
D
David Herrmann 已提交
1001 1002
void drm_dev_ref(struct drm_device *dev);
void drm_dev_unref(struct drm_device *dev);
1003
int drm_dev_register(struct drm_device *dev, unsigned long flags);
1004
void drm_dev_unregister(struct drm_device *dev);
1005 1006 1007 1008

struct drm_minor *drm_minor_acquire(unsigned int minor_id);
void drm_minor_release(struct drm_minor *minor);

1009 1010 1011 1012 1013
/*@}*/

/* PCI section */
static __inline__ int drm_pci_device_is_agp(struct drm_device *dev)
{
D
Dave Airlie 已提交
1014 1015 1016
	if (dev->driver->device_is_agp != NULL) {
		int err = (*dev->driver->device_is_agp) (dev);

1017 1018 1019 1020 1021 1022 1023
		if (err != 2) {
			return err;
		}
	}

	return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
}
1024
void drm_pci_agp_destroy(struct drm_device *dev);
1025

1026 1027
extern int drm_pci_init(struct drm_driver *driver, struct pci_driver *pdriver);
extern void drm_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver);
1028
#ifdef CONFIG_PCI
1029
extern int drm_get_pci_dev(struct pci_dev *pdev,
1030 1031
			   const struct pci_device_id *ent,
			   struct drm_driver *driver);
1032
extern int drm_pci_set_busid(struct drm_device *dev, struct drm_master *master);
1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046
#else
static inline int drm_get_pci_dev(struct pci_dev *pdev,
				  const struct pci_device_id *ent,
				  struct drm_driver *driver)
{
	return -ENOSYS;
}

static inline int drm_pci_set_busid(struct drm_device *dev,
				    struct drm_master *master)
{
	return -ENOSYS;
}
#endif
1047

1048 1049 1050 1051 1052
#define DRM_PCIE_SPEED_25 1
#define DRM_PCIE_SPEED_50 2
#define DRM_PCIE_SPEED_80 4

extern int drm_pcie_get_speed_cap_mask(struct drm_device *dev, u32 *speed_mask);
1053
extern int drm_pcie_get_max_link_width(struct drm_device *dev, u32 *mlw);
1054 1055 1056 1057

/* platform section */
extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device);

1058 1059 1060 1061 1062 1063 1064 1065
/* returns true if currently okay to sleep */
static __inline__ bool drm_can_sleep(void)
{
	if (in_atomic() || in_dbg_master() || irqs_disabled())
		return false;
	return true;
}

1066 1067 1068
/* helper for handling conditionals in various for_each macros */
#define for_each_if(condition) if (!(condition)) {} else

L
Linus Torvalds 已提交
1069
#endif