Blame view

include/drm/drmP.h 55.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /**
b5e89ed53   Dave Airlie   drm: lindent the ...
2
   * \file drmP.h
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
   * Private header for Direct Rendering Manager
b5e89ed53   Dave Airlie   drm: lindent the ...
4
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
   * \author Rickard E. (Rik) Faith <faith@valinux.com>
   * \author Gareth Hughes <gareth@valinux.com>
   */
  
  /*
   * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
   * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
dcdb16740   Jordan Crouse   drm: Add support ...
12
   * Copyright (c) 2009-2010, Code Aurora Forum.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
   * All rights reserved.
   *
   * 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_
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
37
38
39
40
41
42
  #ifdef __KERNEL__
  #ifdef __alpha__
  /* add include of current.h so that "current" is defined
   * before static inline funcs in wait.h. Doing this so we
   * can build the DRM (part of PI DRI). 4/21/2000 S + B */
  #include <asm/current.h>
b5e89ed53   Dave Airlie   drm: lindent the ...
43
  #endif				/* __alpha__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
48
49
  #include <linux/kernel.h>
  #include <linux/miscdevice.h>
  #include <linux/fs.h>
  #include <linux/proc_fs.h>
  #include <linux/init.h>
  #include <linux/file.h>
dcdb16740   Jordan Crouse   drm: Add support ...
50
  #include <linux/platform_device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
  #include <linux/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  #include <linux/jiffies.h>
b05c23851   Dave Airlie   drm/ati_pcigart: ...
53
  #include <linux/dma-mapping.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
  #include <linux/mm.h>
  #include <linux/cdev.h>
30e2fb188   Dave Airlie   sem2mutex: driver...
56
  #include <linux/mutex.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
57
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
  #if defined(__alpha__) || defined(__powerpc__)
b5e89ed53   Dave Airlie   drm: lindent the ...
59
  #include <asm/pgtable.h>	/* For pte_wrprotect */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
  #endif
  #include <asm/io.h>
  #include <asm/mman.h>
  #include <asm/uaccess.h>
  #ifdef CONFIG_MTRR
  #include <asm/mtrr.h>
  #endif
  #if defined(CONFIG_AGP) || defined(CONFIG_AGP_MODULE)
  #include <linux/types.h>
  #include <linux/agp_backend.h>
  #endif
  #include <linux/workqueue.h>
  #include <linux/poll.h>
  #include <asm/pgalloc.h>
  #include "drm.h"
62968144e   Dave Airlie   drm: convert drm ...
75
  #include <linux/idr.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
  #define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
  #define __OS_HAS_MTRR (defined(CONFIG_MTRR))
de4772542   Paul Gortmaker   include: replace ...
78
  struct module;
c153f45f9   Eric Anholt   drm: Replace DRM_...
79
80
  struct drm_file;
  struct drm_device;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
81
  #include "drm_os_linux.h"
3a1bd924f   Thomas Hellstrom   drm: add simple D...
82
  #include "drm_hashtab.h"
249d6048c   Jerome Glisse   drm: Split out th...
83
  #include "drm_mm.h"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84

4fefcb270   yakui_zhao   drm: add separate...
85
86
87
  #define DRM_UT_CORE 		0x01
  #define DRM_UT_DRIVER		0x02
  #define DRM_UT_KMS		0x04
87fdff81c   Zhao Yakui   DRM: Add the expl...
88
89
90
91
92
  /*
   * Three debug levels are defined.
   * drm_core, drm_driver, drm_kms
   * drm_core level can be used in the generic drm code. For example:
   * 	drm_ioctl, drm_mm, drm_memory
25985edce   Lucas De Marchi   Fix common misspe...
93
   * The macro definition of DRM_DEBUG is used.
87fdff81c   Zhao Yakui   DRM: Add the expl...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
   * 	DRM_DEBUG(fmt, args...)
   * 	The debug info by using the DRM_DEBUG can be obtained by adding
   * 	the boot option of "drm.debug=1".
   *
   * drm_driver level can be used in the specific drm driver. It is used
   * to add the debug info related with the drm driver. For example:
   * i915_drv, i915_dma, i915_gem, radeon_drv,
   * 	The macro definition of DRM_DEBUG_DRIVER can be used.
   * 	DRM_DEBUG_DRIVER(fmt, args...)
   * 	The debug info by using the DRM_DEBUG_DRIVER can be obtained by
   * 	adding the boot option of "drm.debug=0x02"
   *
   * drm_kms level can be used in the KMS code related with specific drm driver.
   * It is used to add the debug info related with KMS mode. For example:
   * the connector/crtc ,
   * 	The macro definition of DRM_DEBUG_KMS can be used.
   * 	DRM_DEBUG_KMS(fmt, args...)
   * 	The debug info by using the DRM_DEBUG_KMS can be obtained by
   * 	adding the boot option of "drm.debug=0x04"
   *
   * If we add the boot option of "drm.debug=0x06", we can get the debug info by
   * using the DRM_DEBUG_KMS and DRM_DEBUG_DRIVER.
   * If we add the boot option of "drm.debug=0x05", we can get the debug info by
   * using the DRM_DEBUG_KMS and DRM_DEBUG.
   */
4fefcb270   yakui_zhao   drm: add separate...
119

b9075fa96   Joe Perches   treewide: use __p...
120
  extern __printf(4, 5)
bbb0aef5c   Joe Perches   drm: Verify debug...
121
  void drm_ut_debug_printk(unsigned int request_level,
b9075fa96   Joe Perches   treewide: use __p...
122
123
124
125
  			 const char *prefix,
  			 const char *function_name,
  			 const char *format, ...);
  extern __printf(2, 3)
5ad3d8831   Joe Perches   drm: Create and u...
126
  int drm_err(const char *func, const char *format, ...);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  /***********************************************************************/
  /** 
  ame DRM template customization defaults */
  /*@{*/
  
  /* driver capabilities and requirements mask */
  #define DRIVER_USE_AGP     0x1
  #define DRIVER_REQUIRE_AGP 0x2
  #define DRIVER_USE_MTRR    0x4
  #define DRIVER_PCI_DMA     0x8
  #define DRIVER_SG          0x10
  #define DRIVER_HAVE_DMA    0x20
  #define DRIVER_HAVE_IRQ    0x40
  #define DRIVER_IRQ_SHARED  0x80
af6061af0   Dave Airlie   Revert "drm/vbl r...
141
  #define DRIVER_IRQ_VBL     0x100
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142
  #define DRIVER_DMA_QUEUE   0x200
b84397d63   Dave Airlie   drm: add framebuf...
143
  #define DRIVER_FB_DMA      0x400
af6061af0   Dave Airlie   Revert "drm/vbl r...
144
  #define DRIVER_IRQ_VBL2    0x800
673a394b1   Eric Anholt   drm: Add GEM ("gr...
145
  #define DRIVER_GEM         0x1000
f453ba046   Dave Airlie   DRM: add mode set...
146
  #define DRIVER_MODESET     0x2000
8410ea3b9   Dave Airlie   drm: rework PCI/p...
147
148
149
150
  
  #define DRIVER_BUS_PCI 0x1
  #define DRIVER_BUS_PLATFORM 0x2
  #define DRIVER_BUS_USB 0x3
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
151
152
153
154
155
156
157
158
  
  /***********************************************************************/
  /** 
  ame Begin the DRM... */
  /*@{*/
  
  #define DRM_DEBUG_CODE 2	  /**< Include debugging code if > 1, then
  				     also include looping detection. */
8669cbc5e   Thomas Hellstrom   drm: move drm aut...
159
  #define DRM_MAGIC_HASH_ORDER  4  /**< Size of key hash table. Must be power of 2. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
160
161
162
  #define DRM_KERNEL_CONTEXT    0	 /**< Change drm_resctx if changed */
  #define DRM_RESERVED_CONTEXTS 1	 /**< Change drm_resctx if changed */
  #define DRM_LOOPING_LIMIT     5000000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163
164
165
166
  #define DRM_TIME_SLICE	      (HZ/20)  /**< Time slice for GLXContexts */
  #define DRM_LOCK_SLICE	      1	/**< Time slice for lock, in jiffies */
  
  #define DRM_FLAG_DEBUG	  0x01
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
  #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
8d153f710   Thomas Hellstrom   drm: update user ...
168
  #define DRM_MAP_HASH_OFFSET 0x10000000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
169

b5e89ed53   Dave Airlie   drm: lindent the ...
170
  /*@}*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171
172
  
  /***********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
173
174
175
176
177
178
179
180
181
182
  /** 
  ame Macros to make printk easier */
  /*@{*/
  
  /**
   * Error output.
   *
   * \param fmt printf() like format string.
   * \param arg arguments
   */
5ad3d8831   Joe Perches   drm: Create and u...
183
184
  #define DRM_ERROR(fmt, ...)				\
  	drm_err(__func__, fmt, ##__VA_ARGS__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
185

5ad3d8831   Joe Perches   drm: Create and u...
186
187
  #define DRM_INFO(fmt, ...)				\
  	printk(KERN_INFO "[" DRM_NAME "] " fmt, ##__VA_ARGS__)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188
189
190
  
  /**
   * Debug output.
b5e89ed53   Dave Airlie   drm: lindent the ...
191
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
192
193
194
195
   * \param fmt printf() like format string.
   * \param arg arguments
   */
  #if DRM_DEBUG_CODE
4fefcb270   yakui_zhao   drm: add separate...
196
  #define DRM_DEBUG(fmt, args...)						\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
197
  	do {								\
4fefcb270   yakui_zhao   drm: add separate...
198
199
200
  		drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, 		\
  					__func__, fmt, ##args);		\
  	} while (0)
8a4c47f34   Zhao Yakui   drm: Remove the u...
201
  #define DRM_DEBUG_DRIVER(fmt, args...)					\
4fefcb270   yakui_zhao   drm: add separate...
202
  	do {								\
8a4c47f34   Zhao Yakui   drm: Remove the u...
203
  		drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME,		\
4fefcb270   yakui_zhao   drm: add separate...
204
205
  					__func__, fmt, ##args);		\
  	} while (0)
8a4c47f34   Zhao Yakui   drm: Remove the u...
206
  #define DRM_DEBUG_KMS(fmt, args...)				\
4fefcb270   yakui_zhao   drm: add separate...
207
  	do {								\
8a4c47f34   Zhao Yakui   drm: Remove the u...
208
  		drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, 		\
4fefcb270   yakui_zhao   drm: add separate...
209
210
  					 __func__, fmt, ##args);	\
  	} while (0)
4fefcb270   yakui_zhao   drm: add separate...
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
  #define DRM_LOG(fmt, args...)						\
  	do {								\
  		drm_ut_debug_printk(DRM_UT_CORE, NULL,			\
  					NULL, fmt, ##args);		\
  	} while (0)
  #define DRM_LOG_KMS(fmt, args...)					\
  	do {								\
  		drm_ut_debug_printk(DRM_UT_KMS, NULL,			\
  					NULL, fmt, ##args);		\
  	} while (0)
  #define DRM_LOG_MODE(fmt, args...)					\
  	do {								\
  		drm_ut_debug_printk(DRM_UT_MODE, NULL,			\
  					NULL, fmt, ##args);		\
  	} while (0)
  #define DRM_LOG_DRIVER(fmt, args...)					\
  	do {								\
  		drm_ut_debug_printk(DRM_UT_DRIVER, NULL,		\
  					NULL, fmt, ##args);		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
231
  	} while (0)
  #else
8a4c47f34   Zhao Yakui   drm: Remove the u...
232
233
  #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0)
  #define DRM_DEBUG_KMS(fmt, args...)	do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
234
  #define DRM_DEBUG(fmt, arg...)		 do { } while (0)
4fefcb270   yakui_zhao   drm: add separate...
235
236
237
238
  #define DRM_LOG(fmt, arg...)		do { } while (0)
  #define DRM_LOG_KMS(fmt, args...) do { } while (0)
  #define DRM_LOG_MODE(fmt, arg...) do { } while (0)
  #define DRM_LOG_DRIVER(fmt, arg...) do { } while (0)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
239
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240
  /*@}*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
241
242
243
244
  /***********************************************************************/
  /** 
  ame Internal types and structures */
  /*@{*/
99a2657a2   Dave Airlie   drm: use kernel m...
245
  #define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
247
248
  
  #define DRM_LEFTCOUNT(x) (((x)->rp + (x)->count - (x)->wp) % ((x)->count + 1))
  #define DRM_BUFCOUNT(x) ((x)->count - DRM_LEFTCOUNT(x))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
250
  
  #define DRM_IF_VERSION(maj, min) (maj << 16 | min)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
256
257
  
  /**
   * Test that the hardware lock is held by the caller, returning otherwise.
   *
   * \param dev DRM device.
   * \param filp file pointer of the caller.
   */
dcae3626d   Roel Kluin   drm: fix LOCK_TES...
258
259
260
261
  #define LOCK_TEST_WITH_RETURN( dev, _file_priv )				\
  do {										\
  	if (!_DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock) ||	\
  	    _file_priv->master->lock.file_priv != _file_priv)	{		\
c153f45f9   Eric Anholt   drm: Replace DRM_...
262
263
  		DRM_ERROR( "%s called without lock held, held  %d owner %p %p
  ",\
dcae3626d   Roel Kluin   drm: fix LOCK_TES...
264
265
266
267
  			   __func__, _DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock),\
  			   _file_priv->master->lock.file_priv, _file_priv);	\
  		return -EINVAL;							\
  	}									\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
268
269
270
  } while (0)
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
271
272
273
   * Ioctl function type.
   *
   * \param inode device inode.
6c340eac0   Eric Anholt   drm: Replace filp...
274
   * \param file_priv DRM file private pointer.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
   * \param cmd command.
   * \param arg argument.
   */
c153f45f9   Eric Anholt   drm: Replace DRM_...
278
279
  typedef int drm_ioctl_t(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280

9a1866450   Dave Airlie   drm: 32/64-bit DR...
281
282
  typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
  			       unsigned long arg);
1a95916f5   Kristian Høgsberg   drm: Add compatib...
283
284
  #define DRM_IOCTL_NR(n)                _IOC_NR(n)
  #define DRM_MAJOR       226
a7a2cc315   Dave Airlie   drm: move ioctl f...
285
286
287
  #define DRM_AUTH	0x1
  #define	DRM_MASTER	0x2
  #define DRM_ROOT_ONLY	0x4
f453ba046   Dave Airlie   DRM: add mode set...
288
  #define DRM_CONTROL_ALLOW 0x8
ed8b67040   Arnd Bergmann   drm: convert drm_...
289
  #define DRM_UNLOCKED	0x10
a7a2cc315   Dave Airlie   drm: move ioctl f...
290

c153f45f9   Eric Anholt   drm: Replace DRM_...
291
292
  struct drm_ioctl_desc {
  	unsigned int cmd;
a7a2cc315   Dave Airlie   drm: move ioctl f...
293
  	int flags;
c972d750e   Richard Kennedy   drm: reorder stru...
294
  	drm_ioctl_t *func;
1b2f14896   Dave Airlie   drm: block usersp...
295
  	unsigned int cmd_drv;
c153f45f9   Eric Anholt   drm: Replace DRM_...
296
297
298
299
300
301
  };
  
  /**
   * Creates a driver or general drm_ioctl_desc array entry for the given
   * ioctl, for use by drm_ioctl().
   */
1b2f14896   Dave Airlie   drm: block usersp...
302
303
304
  
  #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags)			\
  	[DRM_IOCTL_NR(DRM_##ioctl)] = {.cmd = DRM_##ioctl, .func = _func, .flags = _flags, .cmd_drv = DRM_IOCTL_##ioctl}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305

8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
306
  struct drm_magic_entry {
8669cbc5e   Thomas Hellstrom   drm: move drm aut...
307
  	struct list_head head;
e0be428e6   Dave Airlie   drm: detypedef th...
308
  	struct drm_hash_item hash_item;
b5e89ed53   Dave Airlie   drm: lindent the ...
309
  	struct drm_file *priv;
8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
310
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
311

8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
312
  struct drm_vma_entry {
bd1b331fa   Dave Airlie   drm: cleanup use ...
313
  	struct list_head head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
314
  	struct vm_area_struct *vma;
b5e89ed53   Dave Airlie   drm: lindent the ...
315
  	pid_t pid;
8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
316
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
317
318
319
320
  
  /**
   * DMA buffer.
   */
056219e2f   Dave Airlie   drm: drop drm_buf...
321
  struct drm_buf {
b5e89ed53   Dave Airlie   drm: lindent the ...
322
323
324
325
326
327
328
329
330
331
  	int idx;		       /**< Index into master buflist */
  	int total;		       /**< Buffer size */
  	int order;		       /**< log-base-2(total) */
  	int used;		       /**< Amount of buffer in use (for DMA) */
  	unsigned long offset;	       /**< Byte offset (used internally) */
  	void *address;		       /**< Address of buffer */
  	unsigned long bus_address;     /**< Bus address of buffer */
  	struct drm_buf *next;	       /**< Kernel-only: used for free list */
  	__volatile__ int waiting;      /**< On kernel DMA queue */
  	__volatile__ int pending;      /**< On hardware DMA queue */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
332
  	wait_queue_head_t dma_wait;    /**< Processes waiting */
6c340eac0   Eric Anholt   drm: Replace filp...
333
  	struct drm_file *file_priv;    /**< Private of holding file descr */
b5e89ed53   Dave Airlie   drm: lindent the ...
334
335
  	int context;		       /**< Kernel queue for this buffer */
  	int while_locked;	       /**< Dispatch this buffer while locked */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
336
  	enum {
b5e89ed53   Dave Airlie   drm: lindent the ...
337
338
339
340
341
  		DRM_LIST_NONE = 0,
  		DRM_LIST_FREE = 1,
  		DRM_LIST_WAIT = 2,
  		DRM_LIST_PEND = 3,
  		DRM_LIST_PRIO = 4,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
342
  		DRM_LIST_RECLAIM = 5
b5e89ed53   Dave Airlie   drm: lindent the ...
343
  	} list;			       /**< Which list we're on */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
344

b5e89ed53   Dave Airlie   drm: lindent the ...
345
346
  	int dev_priv_size;		 /**< Size of buffer private storage */
  	void *dev_private;		 /**< Per-buffer private storage */
056219e2f   Dave Airlie   drm: drop drm_buf...
347
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
348

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  /** bufs is one longer than it has to be */
cdd55a294   Dave Airlie   drm: detypef wait...
350
  struct drm_waitlist {
b5e89ed53   Dave Airlie   drm: lindent the ...
351
  	int count;			/**< Number of possible buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
352
353
354
355
  	struct drm_buf **bufs;		/**< List of pointers to buffers */
  	struct drm_buf **rp;			/**< Read pointer */
  	struct drm_buf **wp;			/**< Write pointer */
  	struct drm_buf **end;		/**< End pointer */
b5e89ed53   Dave Airlie   drm: lindent the ...
356
357
  	spinlock_t read_lock;
  	spinlock_t write_lock;
cdd55a294   Dave Airlie   drm: detypef wait...
358
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
359

cdd55a294   Dave Airlie   drm: detypef wait...
360
  struct drm_freelist {
b5e89ed53   Dave Airlie   drm: lindent the ...
361
362
  	int initialized;	       /**< Freelist in use */
  	atomic_t count;		       /**< Number of free buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
363
  	struct drm_buf *next;	       /**< End pointer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
365
  
  	wait_queue_head_t waiting;     /**< Processes waiting on free bufs */
b5e89ed53   Dave Airlie   drm: lindent the ...
366
367
368
369
  	int low_mark;		       /**< Low water mark */
  	int high_mark;		       /**< High water mark */
  	atomic_t wfh;		       /**< If waiting for high mark */
  	spinlock_t lock;
cdd55a294   Dave Airlie   drm: detypef wait...
370
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371

ddf19b973   Dave Airlie   drm: fixup PCI DM...
372
373
374
375
376
  typedef struct drm_dma_handle {
  	dma_addr_t busaddr;
  	void *vaddr;
  	size_t size;
  } drm_dma_handle_t;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
377
378
379
  /**
   * Buffer entry.  There is one of this for each buffer size order.
   */
cdd55a294   Dave Airlie   drm: detypef wait...
380
  struct drm_buf_entry {
b5e89ed53   Dave Airlie   drm: lindent the ...
381
382
  	int buf_size;			/**< size */
  	int buf_count;			/**< number of buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
383
  	struct drm_buf *buflist;		/**< buffer list */
b5e89ed53   Dave Airlie   drm: lindent the ...
384
385
  	int seg_count;
  	int page_order;
cdd55a294   Dave Airlie   drm: detypef wait...
386
  	struct drm_dma_handle **seglist;
b5e89ed53   Dave Airlie   drm: lindent the ...
387

cdd55a294   Dave Airlie   drm: detypef wait...
388
389
  	struct drm_freelist freelist;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
390

c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
391
392
393
394
395
  /* Event queued up for userspace to read */
  struct drm_pending_event {
  	struct drm_event *event;
  	struct list_head link;
  	struct drm_file *file_priv;
b9c2c9ae8   Jesse Barnes   drm: add per-even...
396
397
  	pid_t pid; /* pid of requester, no guarantee it's valid by the time
  		      we deliver the event, for tracing only */
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
398
399
  	void (*destroy)(struct drm_pending_event *event);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400
  /** File private data */
84b1fd103   Dave Airlie   drm: remove drm_f...
401
  struct drm_file {
b5e89ed53   Dave Airlie   drm: lindent the ...
402
  	int authenticated;
b5e89ed53   Dave Airlie   drm: lindent the ...
403
404
405
406
  	pid_t pid;
  	uid_t uid;
  	drm_magic_t magic;
  	unsigned long ioctl_count;
bd1b331fa   Dave Airlie   drm: cleanup use ...
407
  	struct list_head lhead;
2c14f28be   Dave Airlie   drm: reorganise m...
408
  	struct drm_minor *minor;
b5e89ed53   Dave Airlie   drm: lindent the ...
409
  	unsigned long lock_count;
7c1c2871a   Dave Airlie   drm: move to kref...
410

673a394b1   Eric Anholt   drm: Add GEM ("gr...
411
412
413
414
  	/** Mapping of mm object handles to object pointers. */
  	struct idr object_idr;
  	/** Lock for synchronization of access to object_idr. */
  	spinlock_t table_lock;
7c1c2871a   Dave Airlie   drm: move to kref...
415

6c340eac0   Eric Anholt   drm: Replace filp...
416
  	struct file *filp;
8562b3f25   Dave Airlie   drm: some minor c...
417
  	void *driver_priv;
7c1c2871a   Dave Airlie   drm: move to kref...
418
419
420
421
  
  	int is_master; /* this file private is a master for a minor */
  	struct drm_master *master; /* master this node is currently associated with
  				      N.B. not always minor->master */
f453ba046   Dave Airlie   DRM: add mode set...
422
  	struct list_head fbs;
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
423
424
425
426
  
  	wait_queue_head_t event_wait;
  	struct list_head event_list;
  	int event_space;
84b1fd103   Dave Airlie   drm: remove drm_f...
427
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
428
429
  
  /** Wait queue */
cdd55a294   Dave Airlie   drm: detypef wait...
430
  struct drm_queue {
b5e89ed53   Dave Airlie   drm: lindent the ...
431
432
433
434
  	atomic_t use_count;		/**< Outstanding uses (+1) */
  	atomic_t finalization;		/**< Finalization in progress */
  	atomic_t block_count;		/**< Count of processes waiting */
  	atomic_t block_read;		/**< Queue blocked for reads */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
435
  	wait_queue_head_t read_queue;	/**< Processes waiting on block_read */
b5e89ed53   Dave Airlie   drm: lindent the ...
436
  	atomic_t block_write;		/**< Queue blocked for writes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
437
  	wait_queue_head_t write_queue;	/**< Processes waiting on block_write */
b5e89ed53   Dave Airlie   drm: lindent the ...
438
439
440
  	atomic_t total_queued;		/**< Total queued statistic */
  	atomic_t total_flushed;		/**< Total flushes statistic */
  	atomic_t total_locks;		/**< Total locks statistics */
c60ce623b   Dave Airlie   drm: remove a bun...
441
  	enum drm_ctx_flags flags;	/**< Context preserving and 2D-only */
cdd55a294   Dave Airlie   drm: detypef wait...
442
  	struct drm_waitlist waitlist;	/**< Pending buffers */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
443
  	wait_queue_head_t flush_queue;	/**< Processes waiting until flush */
cdd55a294   Dave Airlie   drm: detypef wait...
444
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
446
447
448
  
  /**
   * Lock data.
   */
55910517a   Dave Airlie   drm: detypedeffin...
449
  struct drm_lock_data {
c60ce623b   Dave Airlie   drm: remove a bun...
450
  	struct drm_hw_lock *hw_lock;	/**< Hardware lock */
8562b3f25   Dave Airlie   drm: some minor c...
451
452
  	/** Private of lock holder's file (NULL=kernel) */
  	struct drm_file *file_priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
453
  	wait_queue_head_t lock_queue;	/**< Queue of blocked processes */
b5e89ed53   Dave Airlie   drm: lindent the ...
454
  	unsigned long lock_time;	/**< Time of last lock in jiffies */
040ac3204   Thomas Hellstrom   drm: fix driver d...
455
456
457
458
  	spinlock_t spinlock;
  	uint32_t kernel_waiters;
  	uint32_t user_waiters;
  	int idle_has_lock;
55910517a   Dave Airlie   drm: detypedeffin...
459
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
460
461
462
463
  
  /**
   * DMA data.
   */
cdd55a294   Dave Airlie   drm: detypef wait...
464
  struct drm_device_dma {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
465

cdd55a294   Dave Airlie   drm: detypef wait...
466
  	struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];	/**< buffers, grouped by their size order */
b5e89ed53   Dave Airlie   drm: lindent the ...
467
  	int buf_count;			/**< total number of buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
468
  	struct drm_buf **buflist;		/**< Vector of pointers into drm_device_dma::bufs */
b5e89ed53   Dave Airlie   drm: lindent the ...
469
470
471
472
  	int seg_count;
  	int page_count;			/**< number of pages */
  	unsigned long *pagelist;	/**< page list */
  	unsigned long byte_count;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
473
474
  	enum {
  		_DRM_DMA_USE_AGP = 0x01,
b5e89ed53   Dave Airlie   drm: lindent the ...
475
  		_DRM_DMA_USE_SG = 0x02,
3417f33e7   George Sapountzis   drm: add flag for...
476
477
  		_DRM_DMA_USE_FB = 0x04,
  		_DRM_DMA_USE_PCI_RO = 0x08
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
478
  	} flags;
cdd55a294   Dave Airlie   drm: detypef wait...
479
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
480

b5e89ed53   Dave Airlie   drm: lindent the ...
481
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
483
   * AGP memory entry.  Stored as a doubly linked list.
   */
55910517a   Dave Airlie   drm: detypedeffin...
484
  struct drm_agp_mem {
b5e89ed53   Dave Airlie   drm: lindent the ...
485
486
487
488
  	unsigned long handle;		/**< handle */
  	DRM_AGP_MEM *memory;
  	unsigned long bound;		/**< address */
  	int pages;
bd1b331fa   Dave Airlie   drm: cleanup use ...
489
  	struct list_head head;
55910517a   Dave Airlie   drm: detypedeffin...
490
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
491
492
493
494
495
496
  
  /**
   * AGP data.
   *
   * \sa drm_agp_init() and drm_device::agp.
   */
55910517a   Dave Airlie   drm: detypedeffin...
497
  struct drm_agp_head {
b5e89ed53   Dave Airlie   drm: lindent the ...
498
  	DRM_AGP_KERN agp_info;		/**< AGP device information */
bd1b331fa   Dave Airlie   drm: cleanup use ...
499
  	struct list_head memory;
b5e89ed53   Dave Airlie   drm: lindent the ...
500
501
502
503
504
505
506
507
  	unsigned long mode;		/**< AGP mode */
  	struct agp_bridge_data *bridge;
  	int enabled;			/**< whether the AGP bus as been enabled */
  	int acquired;			/**< whether the AGP device has been acquired */
  	unsigned long base;
  	int agp_mtrr;
  	int cant_use_aperture;
  	unsigned long page_mask;
55910517a   Dave Airlie   drm: detypedeffin...
508
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
509
510
511
512
  
  /**
   * Scatter-gather memory.
   */
55910517a   Dave Airlie   drm: detypedeffin...
513
  struct drm_sg_mem {
b5e89ed53   Dave Airlie   drm: lindent the ...
514
515
516
517
518
  	unsigned long handle;
  	void *virtual;
  	int pages;
  	struct page **pagelist;
  	dma_addr_t *busaddr;
55910517a   Dave Airlie   drm: detypedeffin...
519
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
520

55910517a   Dave Airlie   drm: detypedeffin...
521
  struct drm_sigdata {
b5e89ed53   Dave Airlie   drm: lindent the ...
522
  	int context;
c60ce623b   Dave Airlie   drm: remove a bun...
523
  	struct drm_hw_lock *lock;
55910517a   Dave Airlie   drm: detypedeffin...
524
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
525

8562b3f25   Dave Airlie   drm: some minor c...
526

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
527
  /**
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
528
529
530
   * Kernel side of a mapping
   */
  struct drm_local_map {
41c2e75e6   Benjamin Herrenschmidt   drm: Make drm_loc...
531
  	resource_size_t offset;	 /**< Requested physical address (0 for SAREA)*/
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
532
533
534
535
536
537
538
539
540
541
542
  	unsigned long size;	 /**< Requested physical size (bytes) */
  	enum drm_map_type type;	 /**< Type of memory to map */
  	enum drm_map_flags flags;	 /**< Flags */
  	void *handle;		 /**< User-space: "Handle" to pass to mmap() */
  				 /**< Kernel-space: kernel-virtual address */
  	int mtrr;		 /**< MTRR slot used */
  };
  
  typedef struct drm_local_map drm_local_map_t;
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
543
544
   * Mappings list
   */
55910517a   Dave Airlie   drm: detypedeffin...
545
  struct drm_map_list {
b5e89ed53   Dave Airlie   drm: lindent the ...
546
  	struct list_head head;		/**< list head */
e0be428e6   Dave Airlie   drm: detypedef th...
547
  	struct drm_hash_item hash;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
548
  	struct drm_local_map *map;	/**< mapping */
8562b3f25   Dave Airlie   drm: some minor c...
549
  	uint64_t user_token;
7c1c2871a   Dave Airlie   drm: move to kref...
550
  	struct drm_master *master;
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
551
  	struct drm_mm_node *file_offset_node;	/**< fake offset */
55910517a   Dave Airlie   drm: detypedeffin...
552
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
553

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
554
555
556
  /**
   * Context handle list
   */
55910517a   Dave Airlie   drm: detypedeffin...
557
  struct drm_ctx_list {
b5e89ed53   Dave Airlie   drm: lindent the ...
558
559
  	struct list_head head;		/**< list head */
  	drm_context_t handle;		/**< context handle */
84b1fd103   Dave Airlie   drm: remove drm_f...
560
  	struct drm_file *tag;		/**< associated fd private data */
55910517a   Dave Airlie   drm: detypedeffin...
561
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
562

ea98a92ff   Dave Airlie   drm: add radeon P...
563
564
565
  /* location of GART table */
  #define DRM_ATI_GART_MAIN 1
  #define DRM_ATI_GART_FB   2
f2b04cd21   Dave Airlie   drm/radeon: upgra...
566
567
568
  #define DRM_ATI_GART_PCI 1
  #define DRM_ATI_GART_PCIE 2
  #define DRM_ATI_GART_IGP 3
55910517a   Dave Airlie   drm: detypedeffin...
569
  struct drm_ati_pcigart_info {
ea98a92ff   Dave Airlie   drm: add radeon P...
570
  	int gart_table_location;
f2b04cd21   Dave Airlie   drm/radeon: upgra...
571
  	int gart_reg_if;
f26c473cd   Dave Airlie   drm: update PCIGA...
572
  	void *addr;
ea98a92ff   Dave Airlie   drm: add radeon P...
573
  	dma_addr_t bus_addr;
b05c23851   Dave Airlie   drm/ati_pcigart: ...
574
575
  	dma_addr_t table_mask;
  	struct drm_dma_handle *table_handle;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
576
  	struct drm_local_map mapping;
f2b04cd21   Dave Airlie   drm/radeon: upgra...
577
  	int table_size;
55910517a   Dave Airlie   drm: detypedeffin...
578
  };
ea98a92ff   Dave Airlie   drm: add radeon P...
579

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
580
  /**
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
581
582
583
584
585
586
587
588
   * GEM specific mm private for tracking GEM objects
   */
  struct drm_gem_mm {
  	struct drm_mm offset_manager;	/**< Offset mgmt for buffer objects */
  	struct drm_open_hash offset_hash; /**< User token hash table for maps */
  };
  
  /**
673a394b1   Eric Anholt   drm: Add GEM ("gr...
589
590
591
592
593
594
595
596
   * This structure defines the drm_mm memory object, which will be used by the
   * DRM for its buffer objects.
   */
  struct drm_gem_object {
  	/** Reference count of this object */
  	struct kref refcount;
  
  	/** Handle count of this object. Each handle also holds a reference */
29d08b3ef   Dave Airlie   drm/gem: handleco...
597
  	atomic_t handle_count; /* number of handles on this object */
673a394b1   Eric Anholt   drm: Add GEM ("gr...
598
599
600
601
602
603
  
  	/** Related drm device */
  	struct drm_device *dev;
  
  	/** File representing the shmem storage */
  	struct file *filp;
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
604
605
  	/* Mapping info for this object */
  	struct drm_map_list map_list;
673a394b1   Eric Anholt   drm: Add GEM ("gr...
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
  	/**
  	 * Size of the object, in bytes.  Immutable over the object's
  	 * lifetime.
  	 */
  	size_t size;
  
  	/**
  	 * Global name for this object, starts at 1. 0 means unnamed.
  	 * Access is covered by the object_name_lock in the related drm_device
  	 */
  	int name;
  
  	/**
  	 * Memory domains. These monitor which caches contain read/write data
  	 * related to the object. When transitioning from one set of domains
  	 * to another, the driver is called to ensure that caches are suitably
  	 * flushed and invalidated
  	 */
  	uint32_t read_domains;
  	uint32_t write_domain;
  
  	/**
  	 * While validating an exec operation, the
  	 * new read/write domain values are computed here.
  	 * They will be transferred to the above values
  	 * at the point that any cache flushing occurs
  	 */
  	uint32_t pending_read_domains;
  	uint32_t pending_write_domain;
  
  	void *driver_private;
  };
f453ba046   Dave Airlie   DRM: add mode set...
638
  #include "drm_crtc.h"
7c1c2871a   Dave Airlie   drm: move to kref...
639
640
641
642
643
644
645
646
647
648
  /* per-master structure */
  struct drm_master {
  
  	struct kref refcount; /* refcount for this master */
  
  	struct list_head head; /**< each minor contains a list of masters */
  	struct drm_minor *minor; /**< link back to minor we are a master for */
  
  	char *unique;			/**< Unique identifier: e.g., busid */
  	int unique_len;			/**< Length of unique field */
1147c9cdd   Vegard Nossum   drm: fix leak of ...
649
  	int unique_size;		/**< amount allocated */
7c1c2871a   Dave Airlie   drm: move to kref...
650
651
652
653
654
655
656
657
658
659
660
661
662
663
  
  	int blocked;			/**< Blocked due to VC switch? */
  
  	/** 
  ame Authentication */
  	/*@{ */
  	struct drm_open_hash magiclist;
  	struct list_head magicfree;
  	/*@} */
  
  	struct drm_lock_data lock;	/**< Information on hardware lock */
  
  	void *driver_priv; /**< Private structure for driver to use */
  };
27641c3f0   Mario Kleiner   drm/vblank: Add s...
664
665
666
667
668
669
670
671
672
673
674
675
676
677
  /* Size of ringbuffer for vblank timestamps. Just double-buffer
   * in initial implementation.
   */
  #define DRM_VBLANKTIME_RBSIZE 2
  
  /* Flags and return codes for get_vblank_timestamp() driver function. */
  #define DRM_CALLED_FROM_VBLIRQ 1
  #define DRM_VBLANKTIME_SCANOUTPOS_METHOD (1 << 0)
  #define DRM_VBLANKTIME_INVBL             (1 << 1)
  
  /* get_scanout_position() return flags */
  #define DRM_SCANOUTPOS_VALID        (1 << 0)
  #define DRM_SCANOUTPOS_INVBL        (1 << 1)
  #define DRM_SCANOUTPOS_ACCURATE     (1 << 2)
8410ea3b9   Dave Airlie   drm: rework PCI/p...
678
679
680
681
682
683
684
685
686
687
688
689
  struct drm_bus {
  	int bus_type;
  	int (*get_irq)(struct drm_device *dev);
  	const char *(*get_name)(struct drm_device *dev);
  	int (*set_busid)(struct drm_device *dev, struct drm_master *master);
  	int (*set_unique)(struct drm_device *dev, struct drm_master *master,
  			  struct drm_unique *unique);
  	int (*irq_by_busid)(struct drm_device *dev, struct drm_irq_busid *p);
  	/* hooks that are for PCI */
  	int (*agp_init)(struct drm_device *dev);
  
  };
673a394b1   Eric Anholt   drm: Add GEM ("gr...
690
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
691
692
693
694
   * 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
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
695
  struct drm_driver {
22eae947b   Dave Airlie   drm: rename drive...
696
697
  	int (*load) (struct drm_device *, unsigned long flags);
  	int (*firstopen) (struct drm_device *);
84b1fd103   Dave Airlie   drm: remove drm_f...
698
  	int (*open) (struct drm_device *, struct drm_file *);
6c340eac0   Eric Anholt   drm: Replace filp...
699
  	void (*preclose) (struct drm_device *, struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
700
  	void (*postclose) (struct drm_device *, struct drm_file *);
22eae947b   Dave Airlie   drm: rename drive...
701
702
  	void (*lastclose) (struct drm_device *);
  	int (*unload) (struct drm_device *);
b932ccb56   Dave Airlie   drm: add support ...
703
  	int (*suspend) (struct drm_device *, pm_message_t state);
e8b962b6d   Jesse Barnes   drm: update DRM s...
704
  	int (*resume) (struct drm_device *);
c153f45f9   Eric Anholt   drm: Replace DRM_...
705
  	int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
706
  	int (*dma_quiescent) (struct drm_device *);
84b1fd103   Dave Airlie   drm: remove drm_f...
707
  	int (*context_dtor) (struct drm_device *dev, int context);
b5e89ed53   Dave Airlie   drm: lindent the ...
708

cda173806   Dave Airlie   drm: add test for...
709
  	/**
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
  	 * get_vblank_counter - get raw hardware vblank counter
  	 * @dev: DRM device
  	 * @crtc: counter to fetch
  	 *
  	 * Driver callback for fetching a raw hardware vblank counter
  	 * for @crtc.  If a device doesn't have a hardware counter, the
  	 * driver can simply return the value of drm_vblank_count and
  	 * make the enable_vblank() and disable_vblank() hooks into no-ops,
  	 * leaving interrupts enabled at all times.
  	 *
  	 * Wraparound handling and loss of events due to modesetting is dealt
  	 * with in the DRM core code.
  	 *
  	 * RETURNS
  	 * Raw vblank counter value.
  	 */
  	u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
  
  	/**
  	 * enable_vblank - enable vblank interrupt events
  	 * @dev: DRM device
  	 * @crtc: which irq to enable
  	 *
  	 * Enable vblank interrupts for @crtc.  If the device doesn't have
  	 * a hardware vblank counter, this routine should be a no-op, since
  	 * interrupts will have to stay on to keep the count accurate.
  	 *
  	 * RETURNS
  	 * Zero on success, appropriate errno if the given @crtc's vblank
  	 * interrupt cannot be enabled.
  	 */
  	int (*enable_vblank) (struct drm_device *dev, int crtc);
  
  	/**
  	 * disable_vblank - disable vblank interrupt events
  	 * @dev: DRM device
  	 * @crtc: which irq to enable
  	 *
  	 * Disable vblank interrupts for @crtc.  If the device doesn't have
  	 * a hardware vblank counter, this routine should be a no-op, since
  	 * interrupts will have to stay on to keep the count accurate.
  	 */
  	void (*disable_vblank) (struct drm_device *dev, int crtc);
  
  	/**
cda173806   Dave Airlie   drm: add test for...
755
756
757
758
759
760
761
762
763
764
  	 * 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).
  	 */
84b1fd103   Dave Airlie   drm: remove drm_f...
765
  	int (*device_is_agp) (struct drm_device *dev);
cda173806   Dave Airlie   drm: add test for...
766

27641c3f0   Mario Kleiner   drm/vblank: Add s...
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
  	/**
  	 * Called by vblank timestamping code.
  	 *
  	 * Return the current display scanout position from a crtc.
  	 *
  	 * \param dev  DRM device.
  	 * \param crtc Id of the crtc to query.
  	 * \param *vpos Target location for current vertical scanout position.
  	 * \param *hpos Target location for current horizontal scanout position.
  	 *
  	 * 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:
  	 *
25985edce   Lucas De Marchi   Fix common misspe...
784
  	 * DRM_SCANOUTPOS_VALID = Query successful.
27641c3f0   Mario Kleiner   drm/vblank: Add s...
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
  	 * 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.
  	 *
  	 */
  	int (*get_scanout_position) (struct drm_device *dev, int crtc,
  				     int *vpos, int *hpos);
  
  	/**
  	 * 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,
42b2aa86c   Justin P. Mattock   treewide: Fix typ...
801
  	 * the time immediately after end of the VBLANK interval. If the
27641c3f0   Mario Kleiner   drm/vblank: Add s...
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
  	 * @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.
  	 * \param crtc crtc for which timestamp should be returned.
  	 * \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.
  	 */
  	int (*get_vblank_timestamp) (struct drm_device *dev, int crtc,
  				     int *max_error,
  				     struct timeval *vblank_time,
  				     unsigned flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
828
  	/* these have to be filled in */
b5e89ed53   Dave Airlie   drm: lindent the ...
829

22eae947b   Dave Airlie   drm: rename drive...
830
  	irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
84b1fd103   Dave Airlie   drm: remove drm_f...
831
  	void (*irq_preinstall) (struct drm_device *dev);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
832
  	int (*irq_postinstall) (struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
833
  	void (*irq_uninstall) (struct drm_device *dev);
6c340eac0   Eric Anholt   drm: Replace filp...
834
835
  	void (*reclaim_buffers) (struct drm_device *dev,
  				 struct drm_file * file_priv);
d985c1088   Dave Airlie   drm: major update...
836
  	void (*reclaim_buffers_locked) (struct drm_device *dev,
6c340eac0   Eric Anholt   drm: Replace filp...
837
  					struct drm_file *file_priv);
040ac3204   Thomas Hellstrom   drm: fix driver d...
838
  	void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
6c340eac0   Eric Anholt   drm: Replace filp...
839
  					    struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
840
  	void (*set_version) (struct drm_device *dev,
c60ce623b   Dave Airlie   drm: remove a bun...
841
  			     struct drm_set_version *sv);
22eae947b   Dave Airlie   drm: rename drive...
842

7c1c2871a   Dave Airlie   drm: move to kref...
843
844
845
  	/* Master routines */
  	int (*master_create)(struct drm_device *dev, struct drm_master *master);
  	void (*master_destroy)(struct drm_device *dev, struct drm_master *master);
862302ffe   Thomas Hellstrom   drm: Add support ...
846
847
848
849
850
851
852
853
854
  	/**
  	 * 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);
  	void (*master_drop)(struct drm_device *dev, struct drm_file *file_priv,
  			    bool from_release);
7c1c2871a   Dave Airlie   drm: move to kref...
855

955b12def   Ben Gamari   drm: Convert proc...
856
857
  	int (*debugfs_init)(struct drm_minor *minor);
  	void (*debugfs_cleanup)(struct drm_minor *minor);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
858
859
860
861
862
863
864
865
866
  
  	/**
  	 * Driver-specific constructor for drm_gem_objects, to set up
  	 * obj->driver_private.
  	 *
  	 * Returns 0 on success.
  	 */
  	int (*gem_init_object) (struct drm_gem_object *obj);
  	void (*gem_free_object) (struct drm_gem_object *obj);
304eda329   Ben Skeggs   drm/gem: add hook...
867
868
  	int (*gem_open_object) (struct drm_gem_object *, struct drm_file *);
  	void (*gem_close_object) (struct drm_gem_object *, struct drm_file *);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
869

28d520433   Dave Airlie   drm/vgaarb: add V...
870
871
  	/* vga arb irq handler */
  	void (*vgaarb_irq)(struct drm_device *dev, bool state);
ff72145ba   Dave Airlie   drm: dumb scanout...
872
873
874
875
876
877
878
879
880
881
  	/* 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);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
882
883
  	/* Driver private ops for this object */
  	struct vm_operations_struct *gem_vm_ops;
22eae947b   Dave Airlie   drm: rename drive...
884
885
886
887
888
889
  	int major;
  	int minor;
  	int patchlevel;
  	char *name;
  	char *desc;
  	char *date;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
890
891
  	u32 driver_features;
  	int dev_priv_size;
c153f45f9   Eric Anholt   drm: Replace DRM_...
892
  	struct drm_ioctl_desc *ioctls;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
893
  	int num_ioctls;
e08e96de9   Arjan van de Ven   drm: Make the per...
894
  	const struct file_operations *fops;
8410ea3b9   Dave Airlie   drm: rework PCI/p...
895
896
897
  	union {
  		struct pci_driver *pci;
  		struct platform_device *platform_device;
a250b9fdc   Dave Airlie   drm: add usb fram...
898
  		struct usb_driver *usb;
8410ea3b9   Dave Airlie   drm: rework PCI/p...
899
900
  	} kdriver;
  	struct drm_bus *bus;
e7f7ab45e   Dave Airlie   drm: cleanup exit...
901
902
  	/* List of devices hanging off this driver */
  	struct list_head device_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
903
  };
2c14f28be   Dave Airlie   drm: reorganise m...
904
905
  #define DRM_MINOR_UNASSIGNED 0
  #define DRM_MINOR_LEGACY 1
f453ba046   Dave Airlie   DRM: add mode set...
906
907
  #define DRM_MINOR_CONTROL 2
  #define DRM_MINOR_RENDER 3
2c14f28be   Dave Airlie   drm: reorganise m...
908

955b12def   Ben Gamari   drm: Convert proc...
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
  
  /**
   * debugfs node list. This structure represents a debugfs file to
   * be created by the drm core
   */
  struct drm_debugfs_list {
  	const char *name; /** file name */
  	int (*show)(struct seq_file*, void*); /** show callback */
  	u32 driver_features; /**< Required driver features for this entry */
  };
  
  /**
   * debugfs node structure. This structure represents a debugfs file.
   */
  struct drm_debugfs_node {
  	struct list_head list;
  	struct drm_minor *minor;
  	struct drm_debugfs_list *debugfs_ent;
  	struct dentry *dent;
  };
  
  /**
   * 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;
  	struct drm_info_list *info_ent;
  	struct dentry *dent;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
950
  /**
2c14f28be   Dave Airlie   drm: reorganise m...
951
   * DRM minor structure. This structure represents a drm minor number.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
952
   */
2c14f28be   Dave Airlie   drm: reorganise m...
953
954
955
956
957
  struct drm_minor {
  	int index;			/**< Minor device number */
  	int type;                       /**< Control or render */
  	dev_t device;			/**< Device number for mknod */
  	struct device kdev;		/**< Linux device */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
958
  	struct drm_device *dev;
955b12def   Ben Gamari   drm: Convert proc...
959
960
961
962
  
  	struct proc_dir_entry *proc_root;  /**< proc directory entry */
  	struct drm_info_node proc_nodes;
  	struct dentry *debugfs_root;
b3e067c0b   Marcin Slusarz   drm: serialize ac...
963
964
965
  
  	struct list_head debugfs_list;
  	struct mutex debugfs_lock; /* Protects debugfs_list. */
955b12def   Ben Gamari   drm: Convert proc...
966

7c1c2871a   Dave Airlie   drm: move to kref...
967
968
  	struct drm_master *master; /* currently active master for this node */
  	struct list_head master_list;
f453ba046   Dave Airlie   DRM: add mode set...
969
  	struct drm_mode_group mode_group;
84b1fd103   Dave Airlie   drm: remove drm_f...
970
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
971

1794d257f   Chris Wilson   drm: Export the c...
972
973
974
975
976
977
978
979
980
981
982
983
984
985
  /* mode specified on the command line */
  struct drm_cmdline_mode {
  	bool specified;
  	bool refresh_specified;
  	bool bpp_specified;
  	int xres, yres;
  	int bpp;
  	int refresh;
  	bool rb;
  	bool interlace;
  	bool cvt;
  	bool margins;
  	enum drm_connector_force force;
  };
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
986
987
988
989
990
  struct drm_pending_vblank_event {
  	struct drm_pending_event base;
  	int pipe;
  	struct drm_event_vblank event;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
991
992
993
994
  /**
   * DRM device structure. This structure represent a complete card that
   * may contain multiple heads.
   */
84b1fd103   Dave Airlie   drm: remove drm_f...
995
  struct drm_device {
e7f7ab45e   Dave Airlie   drm: cleanup exit...
996
  	struct list_head driver_item;	/**< list of devices per driver */
b5e89ed53   Dave Airlie   drm: lindent the ...
997
998
  	char *devname;			/**< For /proc/interrupts */
  	int if_version;			/**< Highest interface version set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
999

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1000
1001
  	/** 
  ame Locks */
b5e89ed53   Dave Airlie   drm: lindent the ...
1002
1003
  	/*@{ */
  	spinlock_t count_lock;		/**< For inuse, drm_device::open_count, drm_device::buf_use */
30e2fb188   Dave Airlie   sem2mutex: driver...
1004
  	struct mutex struct_mutex;	/**< For others */
b5e89ed53   Dave Airlie   drm: lindent the ...
1005
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
1007
1008
  
  	/** 
  ame Usage Counters */
b5e89ed53   Dave Airlie   drm: lindent the ...
1009
1010
1011
1012
1013
1014
1015
  	/*@{ */
  	int open_count;			/**< Outstanding files open */
  	atomic_t ioctl_count;		/**< Outstanding IOCTLs pending */
  	atomic_t vma_count;		/**< Outstanding vma areas open */
  	int buf_use;			/**< Buffers in use -- cannot alloc */
  	atomic_t buf_alloc;		/**< Buffer allocation in progress */
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1016
1017
1018
  
  	/** 
  ame Performance counters */
b5e89ed53   Dave Airlie   drm: lindent the ...
1019
1020
  	/*@{ */
  	unsigned long counters;
c60ce623b   Dave Airlie   drm: remove a bun...
1021
  	enum drm_stat_type types[15];
b5e89ed53   Dave Airlie   drm: lindent the ...
1022
1023
  	atomic_t counts[15];
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1024

bd1b331fa   Dave Airlie   drm: cleanup use ...
1025
  	struct list_head filelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1026
1027
1028
  
  	/** 
  ame Memory management */
b5e89ed53   Dave Airlie   drm: lindent the ...
1029
  	/*@{ */
bd1b331fa   Dave Airlie   drm: cleanup use ...
1030
  	struct list_head maplist;	/**< Linked list of regions */
b5e89ed53   Dave Airlie   drm: lindent the ...
1031
  	int map_count;			/**< Number of mappable regions */
e0be428e6   Dave Airlie   drm: detypedef th...
1032
  	struct drm_open_hash map_hash;	/**< User token hash table for maps */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1033
1034
1035
  
  	/** 
  ame Context handle management */
b5e89ed53   Dave Airlie   drm: lindent the ...
1036
  	/*@{ */
bd1b331fa   Dave Airlie   drm: cleanup use ...
1037
  	struct list_head ctxlist;	/**< Linked list of context handles */
b5e89ed53   Dave Airlie   drm: lindent the ...
1038
  	int ctx_count;			/**< Number of context handles */
30e2fb188   Dave Airlie   sem2mutex: driver...
1039
  	struct mutex ctxlist_mutex;	/**< For ctxlist */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1040

62968144e   Dave Airlie   drm: convert drm ...
1041
  	struct idr ctx_idr;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1042

bd1b331fa   Dave Airlie   drm: cleanup use ...
1043
  	struct list_head vmalist;	/**< List of vmas (for debugging) */
f453ba046   Dave Airlie   DRM: add mode set...
1044

b5e89ed53   Dave Airlie   drm: lindent the ...
1045
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1046
1047
1048
  
  	/** 
  ame DMA queues (contexts) */
b5e89ed53   Dave Airlie   drm: lindent the ...
1049
1050
1051
1052
  	/*@{ */
  	int queue_count;		/**< Number of active DMA queues */
  	int queue_reserved;		  /**< Number of reserved DMA queues */
  	int queue_slots;		/**< Actual length of queuelist */
cdd55a294   Dave Airlie   drm: detypef wait...
1053
1054
  	struct drm_queue **queuelist;	/**< Vector of pointers to DMA queues */
  	struct drm_device_dma *dma;		/**< Optional pointer for DMA support */
b5e89ed53   Dave Airlie   drm: lindent the ...
1055
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1056
1057
1058
  
  	/** 
  ame Context support */
b5e89ed53   Dave Airlie   drm: lindent the ...
1059
  	/*@{ */
b5e89ed53   Dave Airlie   drm: lindent the ...
1060
  	int irq_enabled;		/**< True if irq handler is enabled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1061
1062
1063
  	__volatile__ long context_flag;	/**< Context swapping flag */
  	__volatile__ long interrupt_flag; /**< Interruption handler flag */
  	__volatile__ long dma_flag;	/**< DMA dispatch flag */
b5e89ed53   Dave Airlie   drm: lindent the ...
1064
1065
1066
1067
1068
1069
1070
  	wait_queue_head_t context_wait;	/**< Processes waiting on ctx switch */
  	int last_checked;		/**< Last context checked for DMA */
  	int last_context;		/**< Last current context */
  	unsigned long last_switch;	/**< jiffies at last context switch */
  	/*@} */
  
  	struct work_struct work;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1071
1072
  	/** 
  ame VBLANK IRQ support */
b5e89ed53   Dave Airlie   drm: lindent the ...
1073
  	/*@{ */
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
  	/*
  	 * At load time, disabling the vblank interrupt won't be allowed since
  	 * old clients may not call the modeset ioctl and therefore misbehave.
  	 * Once the modeset ioctl *has* been called though, we can safely
  	 * disable them when unused.
  	 */
  	int vblank_disable_allowed;
  
  	wait_queue_head_t *vbl_queue;   /**< VBLANK wait queue */
  	atomic_t *_vblank_count;        /**< number of VBLANK interrupts (driver must alloc the right number of counters) */
27641c3f0   Mario Kleiner   drm/vblank: Add s...
1084
1085
  	struct timeval *_vblank_time;   /**< timestamp of current vblank_count (drivers must alloc right number of fields) */
  	spinlock_t vblank_time_lock;    /**< Protects vblank count and time updates during vblank enable/disable */
b5e89ed53   Dave Airlie   drm: lindent the ...
1086
  	spinlock_t vbl_lock;
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1087
1088
1089
1090
1091
1092
  	atomic_t *vblank_refcount;      /* number of users of vblank interruptsper crtc */
  	u32 *last_vblank;               /* protected by dev->vbl_lock, used */
  					/* for wraparound handling */
  	int *vblank_enabled;            /* so we don't call enable more than
  					   once per disable */
  	int *vblank_inmodeset;          /* Display driver is setting mode */
fede5c91c   Eric Anholt   drm: Add a debug ...
1093
  	u32 *last_vblank_wait;		/* Last vblank seqno waited per CRTC */
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1094
1095
1096
  	struct timer_list vblank_disable_timer;
  
  	u32 max_vblank_count;           /**< size of vblank counter register */
b5e89ed53   Dave Airlie   drm: lindent the ...
1097

c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
1098
1099
1100
1101
1102
  	/**
  	 * List of events
  	 */
  	struct list_head vblank_event_list;
  	spinlock_t event_lock;
b5e89ed53   Dave Airlie   drm: lindent the ...
1103
1104
1105
  	/*@} */
  	cycles_t ctx_start;
  	cycles_t lck_start;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1106
1107
1108
  	struct fasync_struct *buf_async;/**< Processes waiting for SIGIO */
  	wait_queue_head_t buf_readers;	/**< Processes waiting to read */
  	wait_queue_head_t buf_writers;	/**< Processes waiting to ctx switch */
55910517a   Dave Airlie   drm: detypedeffin...
1109
  	struct drm_agp_head *agp;	/**< AGP data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1110

dcdb16740   Jordan Crouse   drm: Add support ...
1111
  	struct device *dev;             /**< Device structure */
b5e89ed53   Dave Airlie   drm: lindent the ...
1112
  	struct pci_dev *pdev;		/**< PCI device structure */
2f02cc3fb   Eric Anholt   drm: add device/v...
1113
1114
  	int pci_vendor;			/**< PCI vendor id */
  	int pci_device;			/**< PCI device id */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1115
  #ifdef __alpha__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1116
1117
  	struct pci_controller *hose;
  #endif
dcdb16740   Jordan Crouse   drm: Add support ...
1118
1119
  
  	struct platform_device *platformdev; /**< Platform device struture */
a250b9fdc   Dave Airlie   drm: add usb fram...
1120
  	struct usb_device *usbdev;
dcdb16740   Jordan Crouse   drm: Add support ...
1121

55910517a   Dave Airlie   drm: detypedeffin...
1122
  	struct drm_sg_mem *sg;	/**< Scatter gather memory */
192275612   Dave Airlie   drm: fix unsigned...
1123
  	unsigned int num_crtcs;                  /**< Number of CRTCs on this device */
b5e89ed53   Dave Airlie   drm: lindent the ...
1124
  	void *dev_private;		/**< device private data */
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1125
1126
  	void *mm_private;
  	struct address_space *dev_mapping;
55910517a   Dave Airlie   drm: detypedeffin...
1127
  	struct drm_sigdata sigdata;	   /**< For block_all_signals */
b5e89ed53   Dave Airlie   drm: lindent the ...
1128
1129
1130
  	sigset_t sigmask;
  
  	struct drm_driver *driver;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1131
  	struct drm_local_map *agp_buffer_map;
d1f2b55ad   Dave Airlie   drm: updated DRM ...
1132
  	unsigned int agp_buffer_token;
f453ba046   Dave Airlie   DRM: add mode set...
1133
  	struct drm_minor *control;		/**< Control node for card */
2c14f28be   Dave Airlie   drm: reorganise m...
1134
  	struct drm_minor *primary;		/**< render type primary screen head */
bea5679f9   Michel Dänzer   drm: Add support ...
1135

f453ba046   Dave Airlie   DRM: add mode set...
1136
          struct drm_mode_config mode_config;	/**< Current mode config */
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1137
1138
1139
1140
1141
  	/** 
  ame GEM information */
  	/*@{ */
  	spinlock_t object_name_lock;
  	struct idr object_name_idr;
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1142
  	/*@} */
5bcf719b7   Dave Airlie   drm/switcheroo: t...
1143
  	int switch_power_state;
84b1fd103   Dave Airlie   drm: remove drm_f...
1144
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1145

5bcf719b7   Dave Airlie   drm/switcheroo: t...
1146
1147
1148
  #define DRM_SWITCH_POWER_ON 0
  #define DRM_SWITCH_POWER_OFF 1
  #define DRM_SWITCH_POWER_CHANGING 2
b5e89ed53   Dave Airlie   drm: lindent the ...
1149
1150
  static __inline__ int drm_core_check_feature(struct drm_device *dev,
  					     int feature)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1151
1152
1153
  {
  	return ((dev->driver->driver_features & feature) ? 1 : 0);
  }
dcdb16740   Jordan Crouse   drm: Add support ...
1154
1155
  static inline int drm_dev_to_irq(struct drm_device *dev)
  {
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1156
  	return dev->driver->bus->get_irq(dev);
dcdb16740   Jordan Crouse   drm: Add support ...
1157
  }
332296016   Dave Airlie   drm: remove the D...
1158

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1159
1160
1161
  #if __OS_HAS_AGP
  static inline int drm_core_has_AGP(struct drm_device *dev)
  {
b5e89ed53   Dave Airlie   drm: lindent the ...
1162
  	return drm_core_check_feature(dev, DRIVER_USE_AGP);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1163
1164
1165
1166
1167
1168
1169
1170
  }
  #else
  #define drm_core_has_AGP(dev) (0)
  #endif
  
  #if __OS_HAS_MTRR
  static inline int drm_core_has_MTRR(struct drm_device *dev)
  {
b5e89ed53   Dave Airlie   drm: lindent the ...
1171
  	return drm_core_check_feature(dev, DRIVER_USE_MTRR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172
  }
269dc5129   Dave Airlie   drm: bring savage...
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
  
  #define DRM_MTRR_WC		MTRR_TYPE_WRCOMB
  
  static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
  			       unsigned int flags)
  {
  	return mtrr_add(offset, size, flags, 1);
  }
  
  static inline int drm_mtrr_del(int handle, unsigned long offset,
  			       unsigned long size, unsigned int flags)
  {
  	return mtrr_del(handle, offset, size);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1187
1188
  #else
  #define drm_core_has_MTRR(dev) (0)
9c7d462ed   Dave Airlie   drm: fix issues w...
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
  
  #define DRM_MTRR_WC		0
  
  static inline int drm_mtrr_add(unsigned long offset, unsigned long size,
  			       unsigned int flags)
  {
  	return 0;
  }
  
  static inline int drm_mtrr_del(int handle, unsigned long offset,
  			       unsigned long size, unsigned int flags)
  {
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1203
1204
1205
1206
1207
1208
  #endif
  
  /******************************************************************/
  /** 
  ame Internal function definitions */
  /*@{*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1209
  				/* Driver support (drm_drv.h) */
ed8b67040   Arnd Bergmann   drm: convert drm_...
1210
1211
  extern long drm_ioctl(struct file *filp,
  		      unsigned int cmd, unsigned long arg);
b5e89ed53   Dave Airlie   drm: lindent the ...
1212
1213
  extern long drm_compat_ioctl(struct file *filp,
  			     unsigned int cmd, unsigned long arg);
84b1fd103   Dave Airlie   drm: remove drm_f...
1214
  extern int drm_lastclose(struct drm_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1215
1216
  
  				/* Device support (drm_fops.h) */
58374713c   Arnd Bergmann   drm: kill BKL fro...
1217
  extern struct mutex drm_global_mutex;
b5e89ed53   Dave Airlie   drm: lindent the ...
1218
1219
  extern int drm_open(struct inode *inode, struct file *filp);
  extern int drm_stub_open(struct inode *inode, struct file *filp);
b5e89ed53   Dave Airlie   drm: lindent the ...
1220
  extern int drm_fasync(int fd, struct file *filp, int on);
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
1221
1222
  extern ssize_t drm_read(struct file *filp, char __user *buffer,
  			size_t count, loff_t *offset);
b5e89ed53   Dave Airlie   drm: lindent the ...
1223
  extern int drm_release(struct inode *inode, struct file *filp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1224
1225
  
  				/* Mapping support (drm_vm.h) */
b5e89ed53   Dave Airlie   drm: lindent the ...
1226
  extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1227
1228
  extern int drm_mmap_locked(struct file *filp, struct vm_area_struct *vma);
  extern void drm_vm_open_locked(struct vm_area_struct *vma);
31dfbc939   Chris Wilson   drm: Prune GEM vm...
1229
  extern void drm_vm_close_locked(struct vm_area_struct *vma);
b5e89ed53   Dave Airlie   drm: lindent the ...
1230
  extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1231
1232
1233
  
  				/* Memory management support (drm_memory.h) */
  #include "drm_memory.h"
b5e89ed53   Dave Airlie   drm: lindent the ...
1234
1235
1236
1237
  extern void drm_mem_init(void);
  extern int drm_mem_info(char *buf, char **start, off_t offset,
  			int request, int *eof, void *data);
  extern void *drm_realloc(void *oldpt, size_t oldsize, size_t size, int area);
b5e89ed53   Dave Airlie   drm: lindent the ...
1238

690bb51b5   Daniel Vetter   drm: drop return ...
1239
  extern void drm_free_agp(DRM_AGP_MEM * handle, int pages);
b5e89ed53   Dave Airlie   drm: lindent the ...
1240
  extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1241
1242
1243
  extern DRM_AGP_MEM *drm_agp_bind_pages(struct drm_device *dev,
  				       struct page **pages,
  				       unsigned long num_pages,
ba1eb1d82   Keith Packard   i915: Map status ...
1244
1245
  				       uint32_t gtt_offset,
  				       uint32_t type);
b5e89ed53   Dave Airlie   drm: lindent the ...
1246
  extern int drm_unbind_agp(DRM_AGP_MEM * handle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1247
1248
  
  				/* Misc. IOCTL support (drm_ioctl.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
  extern int drm_irq_by_busid(struct drm_device *dev, void *data,
  			    struct drm_file *file_priv);
  extern int drm_getunique(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
  extern int drm_setunique(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
  extern int drm_getmap(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_getclient(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
  extern int drm_getstats(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
9f35421e0   Ben Skeggs   drm/core: add ioc...
1261
1262
  extern int drm_getcap(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1263
1264
1265
1266
  extern int drm_setversion(struct drm_device *dev, void *data,
  			  struct drm_file *file_priv);
  extern int drm_noop(struct drm_device *dev, void *data,
  		    struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1267
1268
  
  				/* Context IOCTL support (drm_context.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
  extern int drm_resctx(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_addctx(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_modctx(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_getctx(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_switchctx(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
  extern int drm_newctx(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_rmctx(struct drm_device *dev, void *data,
  		     struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
1283

84b1fd103   Dave Airlie   drm: remove drm_f...
1284
1285
1286
  extern int drm_ctxbitmap_init(struct drm_device *dev);
  extern void drm_ctxbitmap_cleanup(struct drm_device *dev);
  extern void drm_ctxbitmap_free(struct drm_device *dev, int ctx_handle);
b5e89ed53   Dave Airlie   drm: lindent the ...
1287

c153f45f9   Eric Anholt   drm: Replace DRM_...
1288
1289
1290
1291
  extern int drm_setsareactx(struct drm_device *dev, void *data,
  			   struct drm_file *file_priv);
  extern int drm_getsareactx(struct drm_device *dev, void *data,
  			   struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1292

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1293
  				/* Authentication IOCTL support (drm_auth.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1294
1295
1296
1297
  extern int drm_getmagic(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern int drm_authmagic(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1298

673a394b1   Eric Anholt   drm: Add GEM ("gr...
1299
1300
  /* Cache management (drm_cache.c) */
  void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1301
  				/* Locking IOCTL support (drm_lock.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1302
1303
1304
1305
  extern int drm_lock(struct drm_device *dev, void *data,
  		    struct drm_file *file_priv);
  extern int drm_unlock(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
55910517a   Dave Airlie   drm: detypedeffin...
1306
1307
1308
  extern int drm_lock_free(struct drm_lock_data *lock_data, unsigned int context);
  extern void drm_idlelock_take(struct drm_lock_data *lock_data);
  extern void drm_idlelock_release(struct drm_lock_data *lock_data);
040ac3204   Thomas Hellstrom   drm: fix driver d...
1309
1310
1311
1312
1313
  
  /*
   * These are exported to drivers so that they can implement fencing using
   * DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
   */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1314
  extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1315
1316
  
  				/* Buffer management support (drm_bufs.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1317
1318
  extern int drm_addbufs_agp(struct drm_device *dev, struct drm_buf_desc * request);
  extern int drm_addbufs_pci(struct drm_device *dev, struct drm_buf_desc * request);
41c2e75e6   Benjamin Herrenschmidt   drm: Make drm_loc...
1319
  extern int drm_addmap(struct drm_device *dev, resource_size_t offset,
c60ce623b   Dave Airlie   drm: remove a bun...
1320
  		      unsigned int size, enum drm_map_type type,
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1321
  		      enum drm_map_flags flags, struct drm_local_map **map_ptr);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1322
1323
  extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
  			    struct drm_file *file_priv);
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1324
1325
  extern int drm_rmmap(struct drm_device *dev, struct drm_local_map *map);
  extern int drm_rmmap_locked(struct drm_device *dev, struct drm_local_map *map);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
  extern int drm_rmmap_ioctl(struct drm_device *dev, void *data,
  			   struct drm_file *file_priv);
  extern int drm_addbufs(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
  extern int drm_infobufs(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern int drm_markbufs(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern int drm_freebufs(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern int drm_mapbufs(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
1338
  extern int drm_order(unsigned long size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1339
1340
  
  				/* DMA support (drm_dma.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1341
1342
  extern int drm_dma_setup(struct drm_device *dev);
  extern void drm_dma_takedown(struct drm_device *dev);
056219e2f   Dave Airlie   drm: drop drm_buf...
1343
  extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
6c340eac0   Eric Anholt   drm: Replace filp...
1344
1345
  extern void drm_core_reclaim_buffers(struct drm_device *dev,
  				     struct drm_file *filp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1346
1347
  
  				/* IRQ support (drm_irq.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1348
1349
  extern int drm_control(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
1350
  extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
dbb19d302   Kristian Høgsberg   i915 gem: install...
1351
  extern int drm_irq_install(struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
1352
1353
1354
1355
  extern int drm_irq_uninstall(struct drm_device *dev);
  extern void drm_driver_irq_preinstall(struct drm_device *dev);
  extern void drm_driver_irq_postinstall(struct drm_device *dev);
  extern void drm_driver_irq_uninstall(struct drm_device *dev);
b5e89ed53   Dave Airlie   drm: lindent the ...
1356

0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1357
  extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
af6061af0   Dave Airlie   Revert "drm/vbl r...
1358
  extern int drm_wait_vblank(struct drm_device *dev, void *data,
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1359
  			   struct drm_file *filp);
af6061af0   Dave Airlie   Revert "drm/vbl r...
1360
  extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1361
  extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
27641c3f0   Mario Kleiner   drm/vblank: Add s...
1362
1363
  extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
  				     struct timeval *vblanktime);
78c6e170b   Chris Wilson   drm/i915: Suppres...
1364
  extern bool drm_handle_vblank(struct drm_device *dev, int crtc);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1365
1366
  extern int drm_vblank_get(struct drm_device *dev, int crtc);
  extern void drm_vblank_put(struct drm_device *dev, int crtc);
778c90264   Li Peng   drm/i915: Fix syn...
1367
  extern void drm_vblank_off(struct drm_device *dev, int crtc);
52440211d   Keith Packard   drm: move drm vbl...
1368
  extern void drm_vblank_cleanup(struct drm_device *dev);
27641c3f0   Mario Kleiner   drm/vblank: Add s...
1369
1370
1371
1372
1373
1374
1375
1376
  extern u32 drm_get_last_vbltimestamp(struct drm_device *dev, int crtc,
  				     struct timeval *tvblank, unsigned flags);
  extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
  						 int crtc, int *max_error,
  						 struct timeval *vblank_time,
  						 unsigned flags,
  						 struct drm_crtc *refcrtc);
  extern void drm_calc_timestamping_constants(struct drm_crtc *crtc);
1794d257f   Chris Wilson   drm: Export the c...
1377
1378
1379
1380
1381
1382
1383
1384
  extern bool
  drm_mode_parse_command_line_for_connector(const char *mode_option,
  					  struct drm_connector *connector,
  					  struct drm_cmdline_mode *mode);
  
  extern struct drm_display_mode *
  drm_mode_create_from_cmdline_mode(struct drm_device *dev,
  				  struct drm_cmdline_mode *cmd);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1385
  /* Modesetting support */
f453ba046   Dave Airlie   DRM: add mode set...
1386
1387
  extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
  extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1388
1389
  extern int drm_modeset_ctl(struct drm_device *dev, void *data,
  			   struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1390
1391
  
  				/* AGP/GART support (drm_agpsupport.h) */
55910517a   Dave Airlie   drm: detypedeffin...
1392
  extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
1393
  extern int drm_agp_acquire(struct drm_device *dev);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1394
1395
  extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
  				 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1396
  extern int drm_agp_release(struct drm_device *dev);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1397
1398
  extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
  				 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1399
  extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1400
1401
1402
1403
1404
  extern int drm_agp_enable_ioctl(struct drm_device *dev, void *data,
  				struct drm_file *file_priv);
  extern int drm_agp_info(struct drm_device *dev, struct drm_agp_info *info);
  extern int drm_agp_info_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1405
  extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1406
1407
  extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1408
  extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1409
1410
  extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1411
  extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1412
1413
  extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
  			  struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1414
  extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1415
1416
  extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1417
1418
  
  				/* Stub support (drm_stub.h) */
7c1c2871a   Dave Airlie   drm: move to kref...
1419
1420
1421
1422
1423
1424
1425
  extern int drm_setmaster_ioctl(struct drm_device *dev, void *data,
  			       struct drm_file *file_priv);
  extern int drm_dropmaster_ioctl(struct drm_device *dev, void *data,
  				struct drm_file *file_priv);
  struct drm_master *drm_master_create(struct drm_minor *minor);
  extern struct drm_master *drm_master_get(struct drm_master *master);
  extern void drm_master_put(struct drm_master **master);
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1426

112b715e8   Kristian Høgsberg   drm: claim PCI de...
1427
  extern void drm_put_dev(struct drm_device *dev);
2c14f28be   Dave Airlie   drm: reorganise m...
1428
  extern int drm_put_minor(struct drm_minor **minor);
b5e89ed53   Dave Airlie   drm: lindent the ...
1429
  extern unsigned int drm_debug;
2c14f28be   Dave Airlie   drm: reorganise m...
1430

27641c3f0   Mario Kleiner   drm/vblank: Add s...
1431
1432
  extern unsigned int drm_vblank_offdelay;
  extern unsigned int drm_timestamp_precision;
0650fd582   Greg Kroah-Hartman   [PATCH] DRM: fix ...
1433
  extern struct class *drm_class;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1434
  extern struct proc_dir_entry *drm_proc_root;
955b12def   Ben Gamari   drm: Convert proc...
1435
  extern struct dentry *drm_debugfs_root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1436

2c14f28be   Dave Airlie   drm: reorganise m...
1437
  extern struct idr drm_minors_idr;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1438
  extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
da509d7a0   Dave Airlie   drm: remove DRM_G...
1439

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1440
  				/* Proc support (drm_proc.h) */
2c14f28be   Dave Airlie   drm: reorganise m...
1441
1442
1443
  extern int drm_proc_init(struct drm_minor *minor, int minor_id,
  			 struct proc_dir_entry *root);
  extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1444

955b12def   Ben Gamari   drm: Convert proc...
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
  				/* Debugfs support */
  #if defined(CONFIG_DEBUG_FS)
  extern int drm_debugfs_init(struct drm_minor *minor, int minor_id,
  			    struct dentry *root);
  extern int drm_debugfs_create_files(struct drm_info_list *files, int count,
  				    struct dentry *root, struct drm_minor *minor);
  extern int drm_debugfs_remove_files(struct drm_info_list *files, int count,
                                      struct drm_minor *minor);
  extern int drm_debugfs_cleanup(struct drm_minor *minor);
  #endif
  
  				/* Info file support */
  extern int drm_name_info(struct seq_file *m, void *data);
  extern int drm_vm_info(struct seq_file *m, void *data);
  extern int drm_queues_info(struct seq_file *m, void *data);
  extern int drm_bufs_info(struct seq_file *m, void *data);
  extern int drm_vblank_info(struct seq_file *m, void *data);
  extern int drm_clients_info(struct seq_file *m, void* data);
  extern int drm_gem_name_info(struct seq_file *m, void *data);
955b12def   Ben Gamari   drm: Convert proc...
1464
1465
1466
1467
  
  #if DRM_DEBUG_CODE
  extern int drm_vma_info(struct seq_file *m, void *data);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1468
  				/* Scatter Gather Support (drm_scatter.h) */
55910517a   Dave Airlie   drm: detypedeffin...
1469
  extern void drm_sg_cleanup(struct drm_sg_mem * entry);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1470
1471
1472
1473
1474
  extern int drm_sg_alloc_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern int drm_sg_alloc(struct drm_device *dev, struct drm_scatter_gather * request);
  extern int drm_sg_free(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1475

b5e89ed53   Dave Airlie   drm: lindent the ...
1476
  			       /* ATI PCIGART support (ati_pcigart.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1477
  extern int drm_ati_pcigart_init(struct drm_device *dev,
55910517a   Dave Airlie   drm: detypedeffin...
1478
  				struct drm_ati_pcigart_info * gart_info);
84b1fd103   Dave Airlie   drm: remove drm_f...
1479
  extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
55910517a   Dave Airlie   drm: detypedeffin...
1480
  				   struct drm_ati_pcigart_info * gart_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1481

84b1fd103   Dave Airlie   drm: remove drm_f...
1482
  extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
e6be8d9d1   Zhenyu Wang   drm: remove addre...
1483
  				       size_t align);
84b1fd103   Dave Airlie   drm: remove drm_f...
1484
1485
  extern void __drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
  extern void drm_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1486
1487
  
  			       /* sysfs support (drm_sysfs.c) */
e8b962b6d   Jesse Barnes   drm: update DRM s...
1488
  struct drm_sysfs_class;
0650fd582   Greg Kroah-Hartman   [PATCH] DRM: fix ...
1489
  extern struct class *drm_sysfs_create(struct module *owner, char *name);
e8b962b6d   Jesse Barnes   drm: update DRM s...
1490
  extern void drm_sysfs_destroy(void);
2c14f28be   Dave Airlie   drm: reorganise m...
1491
  extern int drm_sysfs_device_add(struct drm_minor *minor);
f453ba046   Dave Airlie   DRM: add mode set...
1492
  extern void drm_sysfs_hotplug_event(struct drm_device *dev);
2c14f28be   Dave Airlie   drm: reorganise m...
1493
  extern void drm_sysfs_device_remove(struct drm_minor *minor);
f453ba046   Dave Airlie   DRM: add mode set...
1494
1495
1496
  extern char *drm_get_connector_status_name(enum drm_connector_status status);
  extern int drm_sysfs_connector_add(struct drm_connector *connector);
  extern void drm_sysfs_connector_remove(struct drm_connector *connector);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1497

673a394b1   Eric Anholt   drm: Add GEM ("gr...
1498
1499
  /* Graphics Execution Manager library functions (drm_gem.c) */
  int drm_gem_init(struct drm_device *dev);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1500
  void drm_gem_destroy(struct drm_device *dev);
fd632aa34   Daniel Vetter   drm: free core ge...
1501
  void drm_gem_object_release(struct drm_gem_object *obj);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1502
1503
1504
  void drm_gem_object_free(struct kref *kref);
  struct drm_gem_object *drm_gem_object_alloc(struct drm_device *dev,
  					    size_t size);
1d397043b   Daniel Vetter   drm: extract drm_...
1505
1506
  int drm_gem_object_init(struct drm_device *dev,
  			struct drm_gem_object *obj, size_t size);
62cb70118   Alan Cox   drm/gem: add supp...
1507
1508
  int drm_gem_private_object_init(struct drm_device *dev,
  			struct drm_gem_object *obj, size_t size);
29d08b3ef   Dave Airlie   drm/gem: handleco...
1509
  void drm_gem_object_handle_free(struct drm_gem_object *obj);
ab00b3e52   Jesse Barnes   drm/i915: Keep re...
1510
1511
  void drm_gem_vm_open(struct vm_area_struct *vma);
  void drm_gem_vm_close(struct vm_area_struct *vma);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1512
  int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1513

ba4420c22   Dave Airlie   drm: move ttm glo...
1514
  #include "drm_global.h"
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1515
1516
1517
1518
1519
1520
1521
1522
1523
  static inline void
  drm_gem_object_reference(struct drm_gem_object *obj)
  {
  	kref_get(&obj->refcount);
  }
  
  static inline void
  drm_gem_object_unreference(struct drm_gem_object *obj)
  {
c3ae90c09   Luca Barbieri   drm: introduce dr...
1524
1525
1526
  	if (obj != NULL)
  		kref_put(&obj->refcount, drm_gem_object_free);
  }
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1527

c3ae90c09   Luca Barbieri   drm: introduce dr...
1528
1529
1530
  static inline void
  drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
  {
39b4d07aa   Chris Wilson   drm: Hold the mut...
1531
1532
1533
1534
1535
1536
  	if (obj != NULL) {
  		struct drm_device *dev = obj->dev;
  		mutex_lock(&dev->struct_mutex);
  		kref_put(&obj->refcount, drm_gem_object_free);
  		mutex_unlock(&dev->struct_mutex);
  	}
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1537
1538
1539
1540
  }
  
  int drm_gem_handle_create(struct drm_file *file_priv,
  			  struct drm_gem_object *obj,
a1a2d1d32   Pekka Paalanen   drm: GEM handles ...
1541
  			  u32 *handlep);
ff72145ba   Dave Airlie   drm: dumb scanout...
1542
  int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1543
1544
1545
1546
1547
  
  static inline void
  drm_gem_object_handle_reference(struct drm_gem_object *obj)
  {
  	drm_gem_object_reference(obj);
29d08b3ef   Dave Airlie   drm/gem: handleco...
1548
  	atomic_inc(&obj->handle_count);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1549
1550
1551
1552
1553
1554
1555
  }
  
  static inline void
  drm_gem_object_handle_unreference(struct drm_gem_object *obj)
  {
  	if (obj == NULL)
  		return;
29d08b3ef   Dave Airlie   drm/gem: handleco...
1556
1557
  	if (atomic_read(&obj->handle_count) == 0)
  		return;
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1558
1559
1560
1561
1562
  	/*
  	 * Must bump handle count first as this may be the last
  	 * ref, in which case the object would disappear before we
  	 * checked for a name
  	 */
29d08b3ef   Dave Airlie   drm/gem: handleco...
1563
1564
  	if (atomic_dec_and_test(&obj->handle_count))
  		drm_gem_object_handle_free(obj);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1565
1566
  	drm_gem_object_unreference(obj);
  }
c3ae90c09   Luca Barbieri   drm: introduce dr...
1567
1568
1569
1570
1571
  static inline void
  drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
  {
  	if (obj == NULL)
  		return;
29d08b3ef   Dave Airlie   drm/gem: handleco...
1572
1573
  	if (atomic_read(&obj->handle_count) == 0)
  		return;
c3ae90c09   Luca Barbieri   drm: introduce dr...
1574
1575
1576
1577
1578
  	/*
  	* Must bump handle count first as this may be the last
  	* ref, in which case the object would disappear before we
  	* checked for a name
  	*/
29d08b3ef   Dave Airlie   drm/gem: handleco...
1579
1580
1581
  
  	if (atomic_dec_and_test(&obj->handle_count))
  		drm_gem_object_handle_free(obj);
c3ae90c09   Luca Barbieri   drm: introduce dr...
1582
1583
  	drm_gem_object_unreference_unlocked(obj);
  }
75ef8b3b9   Rob Clark   drm/gem: add func...
1584
1585
  void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
  int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1586
1587
  struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
  					     struct drm_file *filp,
a1a2d1d32   Pekka Paalanen   drm: GEM handles ...
1588
  					     u32 handle);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1589
1590
1591
1592
1593
1594
1595
1596
  int drm_gem_close_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  int drm_gem_flink_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  int drm_gem_open_ioctl(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
  void drm_gem_open(struct drm_device *dev, struct drm_file *file_private);
  void drm_gem_release(struct drm_device *dev, struct drm_file *file_private);
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1597
1598
1599
  extern void drm_core_ioremap(struct drm_local_map *map, struct drm_device *dev);
  extern void drm_core_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
  extern void drm_core_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1600

f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1601
1602
  static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
  							 unsigned int token)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1603
  {
55910517a   Dave Airlie   drm: detypedeffin...
1604
  	struct drm_map_list *_entry;
bd1b331fa   Dave Airlie   drm: cleanup use ...
1605
  	list_for_each_entry(_entry, &dev->maplist, head)
b5e89ed53   Dave Airlie   drm: lindent the ...
1606
1607
  	    if (_entry->user_token == token)
  		return _entry->map;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1608
1609
  	return NULL;
  }
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1610
  static __inline__ void drm_core_dropmap(struct drm_local_map *map)
cda173806   Dave Airlie   drm: add test for...
1611
  {
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1612
1613
1614
  }
  
  #include "drm_mem_util.h"
dcdb16740   Jordan Crouse   drm: Add support ...
1615

8410ea3b9   Dave Airlie   drm: rework PCI/p...
1616
1617
1618
1619
1620
1621
1622
1623
1624
  extern int drm_fill_in_dev(struct drm_device *dev,
  			   const struct pci_device_id *ent,
  			   struct drm_driver *driver);
  int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type);
  /*@}*/
  
  /* PCI section */
  static __inline__ int drm_pci_device_is_agp(struct drm_device *dev)
  {
b5e89ed53   Dave Airlie   drm: lindent the ...
1625
1626
  	if (dev->driver->device_is_agp != NULL) {
  		int err = (*dev->driver->device_is_agp) (dev);
cda173806   Dave Airlie   drm: add test for...
1627
1628
1629
1630
1631
1632
1633
  		if (err != 2) {
  			return err;
  		}
  	}
  
  	return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
  }
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1634
1635
1636
  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);
  extern int drm_get_pci_dev(struct pci_dev *pdev,
dcdb16740   Jordan Crouse   drm: Add support ...
1637
1638
  			   const struct pci_device_id *ent,
  			   struct drm_driver *driver);
8410ea3b9   Dave Airlie   drm: rework PCI/p...
1639
1640
1641
1642
1643
1644
1645
1646
  
  
  /* platform section */
  extern int drm_platform_init(struct drm_driver *driver, struct platform_device *platform_device);
  extern void drm_platform_exit(struct drm_driver *driver, struct platform_device *platform_device);
  
  extern int drm_get_platform_dev(struct platform_device *pdev,
  				struct drm_driver *driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1647

cc1f71942   Dave Airlie   drm: introduce dr...
1648
1649
1650
1651
1652
1653
1654
  /* 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;
  }
b5e89ed53   Dave Airlie   drm: lindent the ...
1655
  #endif				/* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1656
  #endif