Blame view

include/drm/drmP.h 51.9 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
50
  #include <linux/module.h>
  #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 ...
51
  #include <linux/platform_device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
  #include <linux/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
53
  #include <linux/jiffies.h>
b05c23851   Dave Airlie   drm/ati_pcigart: ...
54
  #include <linux/dma-mapping.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
  #include <linux/mm.h>
  #include <linux/cdev.h>
30e2fb188   Dave Airlie   sem2mutex: driver...
57
  #include <linux/mutex.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
58
  #include <linux/slab.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59
  #if defined(__alpha__) || defined(__powerpc__)
b5e89ed53   Dave Airlie   drm: lindent the ...
60
  #include <asm/pgtable.h>	/* For pte_wrprotect */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  #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 ...
76
  #include <linux/idr.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
  #define __OS_HAS_AGP (defined(CONFIG_AGP) || (defined(CONFIG_AGP_MODULE) && defined(MODULE)))
  #define __OS_HAS_MTRR (defined(CONFIG_MTRR))
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
93
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
  /*
   * 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
   * The macro definiton of DRM_DEBUG is used.
   * 	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
120
121
122
123
  
  extern void drm_ut_debug_printk(unsigned int request_level,
  				const char *prefix,
  				const char *function_name,
  				const char *format, ...);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
124
125
126
127
128
129
130
131
132
133
134
135
136
137
  /***********************************************************************/
  /** 
  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...
138
  #define DRIVER_IRQ_VBL     0x100
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
139
  #define DRIVER_DMA_QUEUE   0x200
b84397d63   Dave Airlie   drm: add framebuf...
140
  #define DRIVER_FB_DMA      0x400
af6061af0   Dave Airlie   Revert "drm/vbl r...
141
  #define DRIVER_IRQ_VBL2    0x800
673a394b1   Eric Anholt   drm: Add GEM ("gr...
142
  #define DRIVER_GEM         0x1000
f453ba046   Dave Airlie   DRM: add mode set...
143
  #define DRIVER_MODESET     0x2000
dcdb16740   Jordan Crouse   drm: Add support ...
144
  #define DRIVER_USE_PLATFORM_DEVICE  0x4000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
145
146
147
148
149
150
151
152
  
  /***********************************************************************/
  /** 
  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...
153
  #define DRM_MAGIC_HASH_ORDER  4  /**< Size of key hash table. Must be power of 2. */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
155
156
  #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
157
158
159
160
  #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
161
  #define DRM_MAX_CTXBITMAP (PAGE_SIZE * 8)
8d153f710   Thomas Hellstrom   drm: update user ...
162
  #define DRM_MAP_HASH_OFFSET 0x10000000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
163

b5e89ed53   Dave Airlie   drm: lindent the ...
164
  /*@}*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
165
166
  
  /***********************************************************************/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
167
168
169
170
171
172
173
174
175
176
177
  /** 
  ame Macros to make printk easier */
  /*@{*/
  
  /**
   * Error output.
   *
   * \param fmt printf() like format string.
   * \param arg arguments
   */
  #define DRM_ERROR(fmt, arg...) \
bf9d89295   Harvey Harrison   drivers/char: rep...
178
  	printk(KERN_ERR "[" DRM_NAME ":%s] *ERROR* " fmt , __func__ , ##arg)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
179
180
181
182
183
184
185
186
187
  
  /**
   * Memory error output.
   *
   * \param area memory area where the error occurred.
   * \param fmt printf() like format string.
   * \param arg arguments
   */
  #define DRM_MEM_ERROR(area, fmt, arg...) \
bf9d89295   Harvey Harrison   drivers/char: rep...
188
  	printk(KERN_ERR "[" DRM_NAME ":%s:%s] *ERROR* " fmt , __func__, \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
189
190
191
192
193
194
  	       drm_mem_stats[area].name , ##arg)
  
  #define DRM_INFO(fmt, arg...)  printk(KERN_INFO "[" DRM_NAME "] " fmt , ##arg)
  
  /**
   * Debug output.
b5e89ed53   Dave Airlie   drm: lindent the ...
195
   *
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
196
197
198
199
   * \param fmt printf() like format string.
   * \param arg arguments
   */
  #if DRM_DEBUG_CODE
4fefcb270   yakui_zhao   drm: add separate...
200
  #define DRM_DEBUG(fmt, args...)						\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
201
  	do {								\
4fefcb270   yakui_zhao   drm: add separate...
202
203
204
  		drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, 		\
  					__func__, fmt, ##args);		\
  	} while (0)
8a4c47f34   Zhao Yakui   drm: Remove the u...
205
  #define DRM_DEBUG_DRIVER(fmt, args...)					\
4fefcb270   yakui_zhao   drm: add separate...
206
  	do {								\
8a4c47f34   Zhao Yakui   drm: Remove the u...
207
  		drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME,		\
4fefcb270   yakui_zhao   drm: add separate...
208
209
  					__func__, fmt, ##args);		\
  	} while (0)
8a4c47f34   Zhao Yakui   drm: Remove the u...
210
  #define DRM_DEBUG_KMS(fmt, args...)				\
4fefcb270   yakui_zhao   drm: add separate...
211
  	do {								\
8a4c47f34   Zhao Yakui   drm: Remove the u...
212
  		drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, 		\
4fefcb270   yakui_zhao   drm: add separate...
213
214
  					 __func__, fmt, ##args);	\
  	} while (0)
4fefcb270   yakui_zhao   drm: add separate...
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  #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
234
235
  	} while (0)
  #else
8a4c47f34   Zhao Yakui   drm: Remove the u...
236
237
  #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
238
  #define DRM_DEBUG(fmt, arg...)		 do { } while (0)
4fefcb270   yakui_zhao   drm: add separate...
239
240
241
242
  #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
243
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
244
  /*@}*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
246
247
248
  /***********************************************************************/
  /** 
  ame Internal types and structures */
  /*@{*/
99a2657a2   Dave Airlie   drm: use kernel m...
249
  #define DRM_ARRAY_SIZE(x) ARRAY_SIZE(x)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
250
251
252
  
  #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
253
254
  
  #define DRM_IF_VERSION(maj, min) (maj << 16 | min)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
255
256
257
258
259
260
261
  
  /**
   * 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...
262
263
264
265
  #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_...
266
267
  		DRM_ERROR( "%s called without lock held, held  %d owner %p %p
  ",\
dcae3626d   Roel Kluin   drm: fix LOCK_TES...
268
269
270
271
  			   __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
272
273
274
  } while (0)
  
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
275
276
277
   * Ioctl function type.
   *
   * \param inode device inode.
6c340eac0   Eric Anholt   drm: Replace filp...
278
   * \param file_priv DRM file private pointer.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
279
280
281
   * \param cmd command.
   * \param arg argument.
   */
c153f45f9   Eric Anholt   drm: Replace DRM_...
282
283
  typedef int drm_ioctl_t(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284

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

c153f45f9   Eric Anholt   drm: Replace DRM_...
295
296
  struct drm_ioctl_desc {
  	unsigned int cmd;
a7a2cc315   Dave Airlie   drm: move ioctl f...
297
  	int flags;
c972d750e   Richard Kennedy   drm: reorder stru...
298
  	drm_ioctl_t *func;
1b2f14896   Dave Airlie   drm: block usersp...
299
  	unsigned int cmd_drv;
c153f45f9   Eric Anholt   drm: Replace DRM_...
300
301
302
303
304
305
  };
  
  /**
   * 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...
306
307
308
  
  #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
309

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

8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
316
  struct drm_vma_entry {
bd1b331fa   Dave Airlie   drm: cleanup use ...
317
  	struct list_head head;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
  	struct vm_area_struct *vma;
b5e89ed53   Dave Airlie   drm: lindent the ...
319
  	pid_t pid;
8fc2fdf4c   Dave Airlie   drm: drop drm_vma...
320
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
321
322
323
324
  
  /**
   * DMA buffer.
   */
056219e2f   Dave Airlie   drm: drop drm_buf...
325
  struct drm_buf {
b5e89ed53   Dave Airlie   drm: lindent the ...
326
327
328
329
330
331
332
333
334
335
  	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
336
  	wait_queue_head_t dma_wait;    /**< Processes waiting */
6c340eac0   Eric Anholt   drm: Replace filp...
337
  	struct drm_file *file_priv;    /**< Private of holding file descr */
b5e89ed53   Dave Airlie   drm: lindent the ...
338
339
  	int context;		       /**< Kernel queue for this buffer */
  	int while_locked;	       /**< Dispatch this buffer while locked */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
  	enum {
b5e89ed53   Dave Airlie   drm: lindent the ...
341
342
343
344
345
  		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
346
  		DRM_LIST_RECLAIM = 5
b5e89ed53   Dave Airlie   drm: lindent the ...
347
  	} list;			       /**< Which list we're on */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
348

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
353
  /** bufs is one longer than it has to be */
cdd55a294   Dave Airlie   drm: detypef wait...
354
  struct drm_waitlist {
b5e89ed53   Dave Airlie   drm: lindent the ...
355
  	int count;			/**< Number of possible buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
356
357
358
359
  	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 ...
360
361
  	spinlock_t read_lock;
  	spinlock_t write_lock;
cdd55a294   Dave Airlie   drm: detypef wait...
362
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363

cdd55a294   Dave Airlie   drm: detypef wait...
364
  struct drm_freelist {
b5e89ed53   Dave Airlie   drm: lindent the ...
365
366
  	int initialized;	       /**< Freelist in use */
  	atomic_t count;		       /**< Number of free buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
367
  	struct drm_buf *next;	       /**< End pointer */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
369
  
  	wait_queue_head_t waiting;     /**< Processes waiting on free bufs */
b5e89ed53   Dave Airlie   drm: lindent the ...
370
371
372
373
  	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...
374
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
375

ddf19b973   Dave Airlie   drm: fixup PCI DM...
376
377
378
379
380
  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
381
382
383
  /**
   * Buffer entry.  There is one of this for each buffer size order.
   */
cdd55a294   Dave Airlie   drm: detypef wait...
384
  struct drm_buf_entry {
b5e89ed53   Dave Airlie   drm: lindent the ...
385
386
  	int buf_size;			/**< size */
  	int buf_count;			/**< number of buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
387
  	struct drm_buf *buflist;		/**< buffer list */
b5e89ed53   Dave Airlie   drm: lindent the ...
388
389
  	int seg_count;
  	int page_order;
cdd55a294   Dave Airlie   drm: detypef wait...
390
  	struct drm_dma_handle **seglist;
b5e89ed53   Dave Airlie   drm: lindent the ...
391

cdd55a294   Dave Airlie   drm: detypef wait...
392
393
  	struct drm_freelist freelist;
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
394

c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
395
396
397
398
399
  /* 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...
400
401
  	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...
402
403
  	void (*destroy)(struct drm_pending_event *event);
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
404
  /** File private data */
84b1fd103   Dave Airlie   drm: remove drm_f...
405
  struct drm_file {
b5e89ed53   Dave Airlie   drm: lindent the ...
406
  	int authenticated;
b5e89ed53   Dave Airlie   drm: lindent the ...
407
408
409
410
  	pid_t pid;
  	uid_t uid;
  	drm_magic_t magic;
  	unsigned long ioctl_count;
bd1b331fa   Dave Airlie   drm: cleanup use ...
411
  	struct list_head lhead;
2c14f28be   Dave Airlie   drm: reorganise m...
412
  	struct drm_minor *minor;
b5e89ed53   Dave Airlie   drm: lindent the ...
413
  	unsigned long lock_count;
7c1c2871a   Dave Airlie   drm: move to kref...
414

673a394b1   Eric Anholt   drm: Add GEM ("gr...
415
416
417
418
  	/** 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...
419

6c340eac0   Eric Anholt   drm: Replace filp...
420
  	struct file *filp;
8562b3f25   Dave Airlie   drm: some minor c...
421
  	void *driver_priv;
7c1c2871a   Dave Airlie   drm: move to kref...
422
423
424
425
  
  	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...
426
  	struct list_head fbs;
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
427
428
429
430
  
  	wait_queue_head_t event_wait;
  	struct list_head event_list;
  	int event_space;
84b1fd103   Dave Airlie   drm: remove drm_f...
431
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
432
433
  
  /** Wait queue */
cdd55a294   Dave Airlie   drm: detypef wait...
434
  struct drm_queue {
b5e89ed53   Dave Airlie   drm: lindent the ...
435
436
437
438
  	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
439
  	wait_queue_head_t read_queue;	/**< Processes waiting on block_read */
b5e89ed53   Dave Airlie   drm: lindent the ...
440
  	atomic_t block_write;		/**< Queue blocked for writes */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
441
  	wait_queue_head_t write_queue;	/**< Processes waiting on block_write */
b5e89ed53   Dave Airlie   drm: lindent the ...
442
443
444
  	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...
445
  	enum drm_ctx_flags flags;	/**< Context preserving and 2D-only */
cdd55a294   Dave Airlie   drm: detypef wait...
446
  	struct drm_waitlist waitlist;	/**< Pending buffers */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
447
  	wait_queue_head_t flush_queue;	/**< Processes waiting until flush */
cdd55a294   Dave Airlie   drm: detypef wait...
448
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
449
450
451
452
  
  /**
   * Lock data.
   */
55910517a   Dave Airlie   drm: detypedeffin...
453
  struct drm_lock_data {
c60ce623b   Dave Airlie   drm: remove a bun...
454
  	struct drm_hw_lock *hw_lock;	/**< Hardware lock */
8562b3f25   Dave Airlie   drm: some minor c...
455
456
  	/** Private of lock holder's file (NULL=kernel) */
  	struct drm_file *file_priv;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
457
  	wait_queue_head_t lock_queue;	/**< Queue of blocked processes */
b5e89ed53   Dave Airlie   drm: lindent the ...
458
  	unsigned long lock_time;	/**< Time of last lock in jiffies */
040ac3204   Thomas Hellstrom   drm: fix driver d...
459
460
461
462
  	spinlock_t spinlock;
  	uint32_t kernel_waiters;
  	uint32_t user_waiters;
  	int idle_has_lock;
55910517a   Dave Airlie   drm: detypedeffin...
463
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
464
465
466
467
  
  /**
   * DMA data.
   */
cdd55a294   Dave Airlie   drm: detypef wait...
468
  struct drm_device_dma {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
469

cdd55a294   Dave Airlie   drm: detypef wait...
470
  	struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];	/**< buffers, grouped by their size order */
b5e89ed53   Dave Airlie   drm: lindent the ...
471
  	int buf_count;			/**< total number of buffers */
056219e2f   Dave Airlie   drm: drop drm_buf...
472
  	struct drm_buf **buflist;		/**< Vector of pointers into drm_device_dma::bufs */
b5e89ed53   Dave Airlie   drm: lindent the ...
473
474
475
476
  	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
477
478
  	enum {
  		_DRM_DMA_USE_AGP = 0x01,
b5e89ed53   Dave Airlie   drm: lindent the ...
479
  		_DRM_DMA_USE_SG = 0x02,
3417f33e7   George Sapountzis   drm: add flag for...
480
481
  		_DRM_DMA_USE_FB = 0x04,
  		_DRM_DMA_USE_PCI_RO = 0x08
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
482
  	} flags;
cdd55a294   Dave Airlie   drm: detypef wait...
483
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
484

b5e89ed53   Dave Airlie   drm: lindent the ...
485
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
486
487
   * AGP memory entry.  Stored as a doubly linked list.
   */
55910517a   Dave Airlie   drm: detypedeffin...
488
  struct drm_agp_mem {
b5e89ed53   Dave Airlie   drm: lindent the ...
489
490
491
492
  	unsigned long handle;		/**< handle */
  	DRM_AGP_MEM *memory;
  	unsigned long bound;		/**< address */
  	int pages;
bd1b331fa   Dave Airlie   drm: cleanup use ...
493
  	struct list_head head;
55910517a   Dave Airlie   drm: detypedeffin...
494
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
495
496
497
498
499
500
  
  /**
   * AGP data.
   *
   * \sa drm_agp_init() and drm_device::agp.
   */
55910517a   Dave Airlie   drm: detypedeffin...
501
  struct drm_agp_head {
b5e89ed53   Dave Airlie   drm: lindent the ...
502
  	DRM_AGP_KERN agp_info;		/**< AGP device information */
bd1b331fa   Dave Airlie   drm: cleanup use ...
503
  	struct list_head memory;
b5e89ed53   Dave Airlie   drm: lindent the ...
504
505
506
507
508
509
510
511
  	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...
512
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
513
514
515
516
  
  /**
   * Scatter-gather memory.
   */
55910517a   Dave Airlie   drm: detypedeffin...
517
  struct drm_sg_mem {
b5e89ed53   Dave Airlie   drm: lindent the ...
518
519
520
521
522
  	unsigned long handle;
  	void *virtual;
  	int pages;
  	struct page **pagelist;
  	dma_addr_t *busaddr;
55910517a   Dave Airlie   drm: detypedeffin...
523
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
524

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
531
  /**
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
532
533
534
   * Kernel side of a mapping
   */
  struct drm_local_map {
41c2e75e6   Benjamin Herrenschmidt   drm: Make drm_loc...
535
  	resource_size_t offset;	 /**< Requested physical address (0 for SAREA)*/
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
536
537
538
539
540
541
542
543
544
545
546
  	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
547
548
   * Mappings list
   */
55910517a   Dave Airlie   drm: detypedeffin...
549
  struct drm_map_list {
b5e89ed53   Dave Airlie   drm: lindent the ...
550
  	struct list_head head;		/**< list head */
e0be428e6   Dave Airlie   drm: detypedef th...
551
  	struct drm_hash_item hash;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
552
  	struct drm_local_map *map;	/**< mapping */
8562b3f25   Dave Airlie   drm: some minor c...
553
  	uint64_t user_token;
7c1c2871a   Dave Airlie   drm: move to kref...
554
  	struct drm_master *master;
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
555
  	struct drm_mm_node *file_offset_node;	/**< fake offset */
55910517a   Dave Airlie   drm: detypedeffin...
556
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
557

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

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
584
  /**
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
585
586
587
588
589
590
591
592
   * 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...
593
594
595
596
597
598
599
600
   * 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...
601
  	atomic_t handle_count; /* number of handles on this object */
673a394b1   Eric Anholt   drm: Add GEM ("gr...
602
603
604
605
606
607
  
  	/** Related drm device */
  	struct drm_device *dev;
  
  	/** File representing the shmem storage */
  	struct file *filp;
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
608
609
  	/* Mapping info for this object */
  	struct drm_map_list map_list;
673a394b1   Eric Anholt   drm: Add GEM ("gr...
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
638
639
640
641
  	/**
  	 * 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...
642
  #include "drm_crtc.h"
7c1c2871a   Dave Airlie   drm: move to kref...
643
644
645
646
647
648
649
650
651
652
  /* 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 ...
653
  	int unique_size;		/**< amount allocated */
7c1c2871a   Dave Airlie   drm: move to kref...
654
655
656
657
658
659
660
661
662
663
664
665
666
667
  
  	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 */
  };
673a394b1   Eric Anholt   drm: Add GEM ("gr...
668
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
669
670
671
672
   * 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
673
  struct drm_driver {
22eae947b   Dave Airlie   drm: rename drive...
674
675
  	int (*load) (struct drm_device *, unsigned long flags);
  	int (*firstopen) (struct drm_device *);
84b1fd103   Dave Airlie   drm: remove drm_f...
676
  	int (*open) (struct drm_device *, struct drm_file *);
6c340eac0   Eric Anholt   drm: Replace filp...
677
  	void (*preclose) (struct drm_device *, struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
678
  	void (*postclose) (struct drm_device *, struct drm_file *);
22eae947b   Dave Airlie   drm: rename drive...
679
680
  	void (*lastclose) (struct drm_device *);
  	int (*unload) (struct drm_device *);
b932ccb56   Dave Airlie   drm: add support ...
681
  	int (*suspend) (struct drm_device *, pm_message_t state);
e8b962b6d   Jesse Barnes   drm: update DRM s...
682
  	int (*resume) (struct drm_device *);
c153f45f9   Eric Anholt   drm: Replace DRM_...
683
  	int (*dma_ioctl) (struct drm_device *dev, void *data, struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
684
685
  	void (*dma_ready) (struct drm_device *);
  	int (*dma_quiescent) (struct drm_device *);
84b1fd103   Dave Airlie   drm: remove drm_f...
686
687
688
  	int (*context_ctor) (struct drm_device *dev, int context);
  	int (*context_dtor) (struct drm_device *dev, int context);
  	int (*kernel_context_switch) (struct drm_device *dev, int old,
b5e89ed53   Dave Airlie   drm: lindent the ...
689
  				      int new);
af6061af0   Dave Airlie   Revert "drm/vbl r...
690
  	void (*kernel_context_switch_unlock) (struct drm_device *dev);
b5e89ed53   Dave Airlie   drm: lindent the ...
691

cda173806   Dave Airlie   drm: add test for...
692
  	/**
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
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
  	 * 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...
738
739
740
741
742
743
744
745
746
747
  	 * 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...
748
  	int (*device_is_agp) (struct drm_device *dev);
cda173806   Dave Airlie   drm: add test for...
749

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
750
  	/* these have to be filled in */
b5e89ed53   Dave Airlie   drm: lindent the ...
751

22eae947b   Dave Airlie   drm: rename drive...
752
  	irqreturn_t(*irq_handler) (DRM_IRQ_ARGS);
84b1fd103   Dave Airlie   drm: remove drm_f...
753
  	void (*irq_preinstall) (struct drm_device *dev);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
754
  	int (*irq_postinstall) (struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
755
  	void (*irq_uninstall) (struct drm_device *dev);
6c340eac0   Eric Anholt   drm: Replace filp...
756
757
  	void (*reclaim_buffers) (struct drm_device *dev,
  				 struct drm_file * file_priv);
d985c1088   Dave Airlie   drm: major update...
758
  	void (*reclaim_buffers_locked) (struct drm_device *dev,
6c340eac0   Eric Anholt   drm: Replace filp...
759
  					struct drm_file *file_priv);
040ac3204   Thomas Hellstrom   drm: fix driver d...
760
  	void (*reclaim_buffers_idlelocked) (struct drm_device *dev,
6c340eac0   Eric Anholt   drm: Replace filp...
761
  					    struct drm_file *file_priv);
41c2e75e6   Benjamin Herrenschmidt   drm: Make drm_loc...
762
763
  	resource_size_t (*get_map_ofs) (struct drm_local_map * map);
  	resource_size_t (*get_reg_ofs) (struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
764
  	void (*set_version) (struct drm_device *dev,
c60ce623b   Dave Airlie   drm: remove a bun...
765
  			     struct drm_set_version *sv);
22eae947b   Dave Airlie   drm: rename drive...
766

7c1c2871a   Dave Airlie   drm: move to kref...
767
768
769
  	/* 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 ...
770
771
772
773
774
775
776
777
778
  	/**
  	 * 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...
779

673a394b1   Eric Anholt   drm: Add GEM ("gr...
780
781
  	int (*proc_init)(struct drm_minor *minor);
  	void (*proc_cleanup)(struct drm_minor *minor);
955b12def   Ben Gamari   drm: Convert proc...
782
783
  	int (*debugfs_init)(struct drm_minor *minor);
  	void (*debugfs_cleanup)(struct drm_minor *minor);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
784
785
786
787
788
789
790
791
792
  
  	/**
  	 * 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);
28d520433   Dave Airlie   drm/vgaarb: add V...
793
794
  	/* vga arb irq handler */
  	void (*vgaarb_irq)(struct drm_device *dev, bool state);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
795
796
  	/* Driver private ops for this object */
  	struct vm_operations_struct *gem_vm_ops;
22eae947b   Dave Airlie   drm: rename drive...
797
798
799
800
801
802
  	int major;
  	int minor;
  	int patchlevel;
  	char *name;
  	char *desc;
  	char *date;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
803
804
  	u32 driver_features;
  	int dev_priv_size;
c153f45f9   Eric Anholt   drm: Replace DRM_...
805
  	struct drm_ioctl_desc *ioctls;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
806
807
808
  	int num_ioctls;
  	struct file_operations fops;
  	struct pci_driver pci_driver;
dcdb16740   Jordan Crouse   drm: Add support ...
809
  	struct platform_device *platform_device;
e7f7ab45e   Dave Airlie   drm: cleanup exit...
810
811
  	/* List of devices hanging off this driver */
  	struct list_head device_list;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
812
  };
2c14f28be   Dave Airlie   drm: reorganise m...
813
814
  #define DRM_MINOR_UNASSIGNED 0
  #define DRM_MINOR_LEGACY 1
f453ba046   Dave Airlie   DRM: add mode set...
815
816
  #define DRM_MINOR_CONTROL 2
  #define DRM_MINOR_RENDER 3
2c14f28be   Dave Airlie   drm: reorganise m...
817

955b12def   Ben Gamari   drm: Convert proc...
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
  
  /**
   * 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
859
  /**
2c14f28be   Dave Airlie   drm: reorganise m...
860
   * DRM minor structure. This structure represents a drm minor number.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
861
   */
2c14f28be   Dave Airlie   drm: reorganise m...
862
863
864
865
866
  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
867
  	struct drm_device *dev;
955b12def   Ben Gamari   drm: Convert proc...
868
869
870
871
872
  
  	struct proc_dir_entry *proc_root;  /**< proc directory entry */
  	struct drm_info_node proc_nodes;
  	struct dentry *debugfs_root;
  	struct drm_info_node debugfs_nodes;
7c1c2871a   Dave Airlie   drm: move to kref...
873
874
  	struct drm_master *master; /* currently active master for this node */
  	struct list_head master_list;
f453ba046   Dave Airlie   DRM: add mode set...
875
  	struct drm_mode_group mode_group;
84b1fd103   Dave Airlie   drm: remove drm_f...
876
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
877

c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
878
879
880
881
882
  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
883
884
885
886
  /**
   * DRM device structure. This structure represent a complete card that
   * may contain multiple heads.
   */
84b1fd103   Dave Airlie   drm: remove drm_f...
887
  struct drm_device {
e7f7ab45e   Dave Airlie   drm: cleanup exit...
888
  	struct list_head driver_item;	/**< list of devices per driver */
b5e89ed53   Dave Airlie   drm: lindent the ...
889
890
  	char *devname;			/**< For /proc/interrupts */
  	int if_version;			/**< Highest interface version set */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
891

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
892
893
  	/** 
  ame Locks */
b5e89ed53   Dave Airlie   drm: lindent the ...
894
895
  	/*@{ */
  	spinlock_t count_lock;		/**< For inuse, drm_device::open_count, drm_device::buf_use */
30e2fb188   Dave Airlie   sem2mutex: driver...
896
  	struct mutex struct_mutex;	/**< For others */
b5e89ed53   Dave Airlie   drm: lindent the ...
897
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
898
899
900
  
  	/** 
  ame Usage Counters */
b5e89ed53   Dave Airlie   drm: lindent the ...
901
902
903
904
905
906
907
  	/*@{ */
  	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
908
909
910
  
  	/** 
  ame Performance counters */
b5e89ed53   Dave Airlie   drm: lindent the ...
911
912
  	/*@{ */
  	unsigned long counters;
c60ce623b   Dave Airlie   drm: remove a bun...
913
  	enum drm_stat_type types[15];
b5e89ed53   Dave Airlie   drm: lindent the ...
914
915
  	atomic_t counts[15];
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
916

bd1b331fa   Dave Airlie   drm: cleanup use ...
917
  	struct list_head filelist;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
918
919
920
  
  	/** 
  ame Memory management */
b5e89ed53   Dave Airlie   drm: lindent the ...
921
  	/*@{ */
bd1b331fa   Dave Airlie   drm: cleanup use ...
922
  	struct list_head maplist;	/**< Linked list of regions */
b5e89ed53   Dave Airlie   drm: lindent the ...
923
  	int map_count;			/**< Number of mappable regions */
e0be428e6   Dave Airlie   drm: detypedef th...
924
  	struct drm_open_hash map_hash;	/**< User token hash table for maps */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
925
926
927
  
  	/** 
  ame Context handle management */
b5e89ed53   Dave Airlie   drm: lindent the ...
928
  	/*@{ */
bd1b331fa   Dave Airlie   drm: cleanup use ...
929
  	struct list_head ctxlist;	/**< Linked list of context handles */
b5e89ed53   Dave Airlie   drm: lindent the ...
930
  	int ctx_count;			/**< Number of context handles */
30e2fb188   Dave Airlie   sem2mutex: driver...
931
  	struct mutex ctxlist_mutex;	/**< For ctxlist */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
932

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

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

b5e89ed53   Dave Airlie   drm: lindent the ...
937
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
938
939
940
  
  	/** 
  ame DMA queues (contexts) */
b5e89ed53   Dave Airlie   drm: lindent the ...
941
942
943
944
  	/*@{ */
  	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...
945
946
  	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 ...
947
  	/*@} */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
948
949
950
  
  	/** 
  ame Context support */
b5e89ed53   Dave Airlie   drm: lindent the ...
951
  	/*@{ */
b5e89ed53   Dave Airlie   drm: lindent the ...
952
  	int irq_enabled;		/**< True if irq handler is enabled */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
953
954
955
956
  	__volatile__ long context_flag;	/**< Context swapping flag */
  	__volatile__ long interrupt_flag; /**< Interruption handler flag */
  	__volatile__ long dma_flag;	/**< DMA dispatch flag */
  	struct timer_list timer;	/**< Timer for delaying ctx switch */
b5e89ed53   Dave Airlie   drm: lindent the ...
957
958
959
960
961
962
963
  	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
964
965
  	/** 
  ame VBLANK IRQ support */
b5e89ed53   Dave Airlie   drm: lindent the ...
966
  	/*@{ */
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
967
968
969
970
971
972
973
974
975
976
  	/*
  	 * 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) */
b5e89ed53   Dave Airlie   drm: lindent the ...
977
  	spinlock_t vbl_lock;
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
978
979
980
981
982
983
  	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 ...
984
  	u32 *last_vblank_wait;		/* Last vblank seqno waited per CRTC */
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
985
986
987
  	struct timer_list vblank_disable_timer;
  
  	u32 max_vblank_count;           /**< size of vblank counter register */
b5e89ed53   Dave Airlie   drm: lindent the ...
988

c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
989
990
991
992
993
  	/**
  	 * List of events
  	 */
  	struct list_head vblank_event_list;
  	spinlock_t event_lock;
b5e89ed53   Dave Airlie   drm: lindent the ...
994
995
996
  	/*@} */
  	cycles_t ctx_start;
  	cycles_t lck_start;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
997
998
999
  	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...
1000
  	struct drm_agp_head *agp;	/**< AGP data */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1001

dcdb16740   Jordan Crouse   drm: Add support ...
1002
  	struct device *dev;             /**< Device structure */
b5e89ed53   Dave Airlie   drm: lindent the ...
1003
  	struct pci_dev *pdev;		/**< PCI device structure */
2f02cc3fb   Eric Anholt   drm: add device/v...
1004
1005
  	int pci_vendor;			/**< PCI vendor id */
  	int pci_device;			/**< PCI device id */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1006
  #ifdef __alpha__
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1007
1008
  	struct pci_controller *hose;
  #endif
dcdb16740   Jordan Crouse   drm: Add support ...
1009
1010
  
  	struct platform_device *platformdev; /**< Platform device struture */
55910517a   Dave Airlie   drm: detypedeffin...
1011
  	struct drm_sg_mem *sg;	/**< Scatter gather memory */
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1012
  	int num_crtcs;                  /**< Number of CRTCs on this device */
b5e89ed53   Dave Airlie   drm: lindent the ...
1013
  	void *dev_private;		/**< device private data */
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1014
1015
  	void *mm_private;
  	struct address_space *dev_mapping;
55910517a   Dave Airlie   drm: detypedeffin...
1016
  	struct drm_sigdata sigdata;	   /**< For block_all_signals */
b5e89ed53   Dave Airlie   drm: lindent the ...
1017
1018
1019
  	sigset_t sigmask;
  
  	struct drm_driver *driver;
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1020
  	struct drm_local_map *agp_buffer_map;
d1f2b55ad   Dave Airlie   drm: updated DRM ...
1021
  	unsigned int agp_buffer_token;
f453ba046   Dave Airlie   DRM: add mode set...
1022
  	struct drm_minor *control;		/**< Control node for card */
2c14f28be   Dave Airlie   drm: reorganise m...
1023
  	struct drm_minor *primary;		/**< render type primary screen head */
bea5679f9   Michel Dänzer   drm: Add support ...
1024
1025
1026
1027
1028
  
  	/** 
  ame Drawable information */
  	/*@{ */
  	spinlock_t drw_lock;
d4e2cbe9c   Dave Airlie   drm: convert draw...
1029
  	struct idr drw_idr;
bea5679f9   Michel Dänzer   drm: Add support ...
1030
  	/*@} */
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1031

f453ba046   Dave Airlie   DRM: add mode set...
1032
          struct drm_mode_config mode_config;	/**< Current mode config */
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
  	/** 
  ame GEM information */
  	/*@{ */
  	spinlock_t object_name_lock;
  	struct idr object_name_idr;
  	atomic_t object_count;
  	atomic_t object_memory;
  	atomic_t pin_count;
  	atomic_t pin_memory;
  	atomic_t gtt_count;
  	atomic_t gtt_memory;
  	uint32_t gtt_total;
  	uint32_t invalidate_domains;    /* domains pending invalidation */
  	uint32_t flush_domains;         /* domains pending flush */
  	/*@} */
84b1fd103   Dave Airlie   drm: remove drm_f...
1048
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1049

b5e89ed53   Dave Airlie   drm: lindent the ...
1050
1051
  static __inline__ int drm_core_check_feature(struct drm_device *dev,
  					     int feature)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1052
1053
1054
  {
  	return ((dev->driver->driver_features & feature) ? 1 : 0);
  }
dcdb16740   Jordan Crouse   drm: Add support ...
1055
1056
1057
1058
1059
1060
1061
  static inline int drm_dev_to_irq(struct drm_device *dev)
  {
  	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
  		return platform_get_irq(dev->platformdev, 0);
  	else
  		return dev->pdev->irq;
  }
c17c2f892   Benjamin Herrenschmidt   drm: Fix support ...
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
  static inline int drm_get_pci_domain(struct drm_device *dev)
  {
  	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
  		return 0;
  
  #ifndef __alpha__
  	/* For historical reasons, drm_get_pci_domain() is busticated
  	 * on most archs and has to remain so for userspace interface
  	 * < 1.4, except on alpha which was right from the beginning
  	 */
  	if (dev->if_version < 0x10004)
  		return 0;
  #endif /* __alpha__ */
  
  	return pci_domain_nr(dev->pdev->bus);
  }
332296016   Dave Airlie   drm: remove the D...
1078

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1079
1080
1081
  #if __OS_HAS_AGP
  static inline int drm_core_has_AGP(struct drm_device *dev)
  {
b5e89ed53   Dave Airlie   drm: lindent the ...
1082
  	return drm_core_check_feature(dev, DRIVER_USE_AGP);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1083
1084
1085
1086
1087
1088
1089
1090
  }
  #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 ...
1091
  	return drm_core_check_feature(dev, DRIVER_USE_MTRR);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1092
  }
269dc5129   Dave Airlie   drm: bring savage...
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
  
  #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
1107
1108
  #else
  #define drm_core_has_MTRR(dev) (0)
9c7d462ed   Dave Airlie   drm: fix issues w...
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
  
  #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
1123
1124
1125
1126
1127
1128
  #endif
  
  /******************************************************************/
  /** 
  ame Internal function definitions */
  /*@{*/
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1129
  				/* Driver support (drm_drv.h) */
b5e89ed53   Dave Airlie   drm: lindent the ...
1130
1131
  extern int drm_init(struct drm_driver *driver);
  extern void drm_exit(struct drm_driver *driver);
ed8b67040   Arnd Bergmann   drm: convert drm_...
1132
1133
  extern long drm_ioctl(struct file *filp,
  		      unsigned int cmd, unsigned long arg);
b5e89ed53   Dave Airlie   drm: lindent the ...
1134
1135
  extern long drm_compat_ioctl(struct file *filp,
  			     unsigned int cmd, unsigned long arg);
84b1fd103   Dave Airlie   drm: remove drm_f...
1136
  extern int drm_lastclose(struct drm_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1137
1138
  
  				/* Device support (drm_fops.h) */
58374713c   Arnd Bergmann   drm: kill BKL fro...
1139
  extern struct mutex drm_global_mutex;
b5e89ed53   Dave Airlie   drm: lindent the ...
1140
1141
  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 ...
1142
  extern int drm_fasync(int fd, struct file *filp, int on);
c9a9c5e02   Kristian Høgsberg   drm: Add async ev...
1143
1144
  extern ssize_t drm_read(struct file *filp, char __user *buffer,
  			size_t count, loff_t *offset);
b5e89ed53   Dave Airlie   drm: lindent the ...
1145
  extern int drm_release(struct inode *inode, struct file *filp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1146
1147
  
  				/* Mapping support (drm_vm.h) */
b5e89ed53   Dave Airlie   drm: lindent the ...
1148
  extern int drm_mmap(struct file *filp, struct vm_area_struct *vma);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1149
1150
  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...
1151
  extern void drm_vm_close_locked(struct vm_area_struct *vma);
41c2e75e6   Benjamin Herrenschmidt   drm: Make drm_loc...
1152
1153
  extern resource_size_t drm_core_get_map_ofs(struct drm_local_map * map);
  extern resource_size_t drm_core_get_reg_ofs(struct drm_device *dev);
b5e89ed53   Dave Airlie   drm: lindent the ...
1154
  extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1155
1156
1157
  
  				/* Memory management support (drm_memory.h) */
  #include "drm_memory.h"
b5e89ed53   Dave Airlie   drm: lindent the ...
1158
1159
1160
1161
  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 ...
1162

84b1fd103   Dave Airlie   drm: remove drm_f...
1163
  extern DRM_AGP_MEM *drm_alloc_agp(struct drm_device *dev, int pages, u32 type);
b5e89ed53   Dave Airlie   drm: lindent the ...
1164
1165
  extern int drm_free_agp(DRM_AGP_MEM * handle, int pages);
  extern int drm_bind_agp(DRM_AGP_MEM * handle, unsigned int start);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1166
1167
1168
  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 ...
1169
1170
  				       uint32_t gtt_offset,
  				       uint32_t type);
b5e89ed53   Dave Airlie   drm: lindent the ...
1171
  extern int drm_unbind_agp(DRM_AGP_MEM * handle);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1172
1173
  
  				/* Misc. IOCTL support (drm_ioctl.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
  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);
  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
1190
1191
  
  				/* Context IOCTL support (drm_context.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
  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 ...
1206

84b1fd103   Dave Airlie   drm: remove drm_f...
1207
1208
1209
  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 ...
1210

c153f45f9   Eric Anholt   drm: Replace DRM_...
1211
1212
1213
1214
  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
1215
1216
  
  				/* Drawable IOCTL support (drm_drawable.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1217
1218
1219
1220
1221
1222
  extern int drm_adddraw(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
  extern int drm_rmdraw(struct drm_device *dev, void *data,
  		      struct drm_file *file_priv);
  extern int drm_update_drawable_info(struct drm_device *dev, void *data,
  				    struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1223
  extern struct drm_drawable_info *drm_get_drawable_info(struct drm_device *dev,
bea5679f9   Michel Dänzer   drm: Add support ...
1224
  						  drm_drawable_t id);
d4e2cbe9c   Dave Airlie   drm: convert draw...
1225
  extern void drm_drawable_free_all(struct drm_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1226
1227
  
  				/* Authentication IOCTL support (drm_auth.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1228
1229
1230
1231
  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
1232

673a394b1   Eric Anholt   drm: Add GEM ("gr...
1233
1234
  /* Cache management (drm_cache.c) */
  void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1235
  				/* Locking IOCTL support (drm_lock.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1236
1237
1238
1239
  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...
1240
1241
1242
1243
  extern int drm_lock_take(struct drm_lock_data *lock_data, unsigned int context);
  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...
1244
1245
1246
1247
1248
  
  /*
   * 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_...
1249
  extern int drm_i_have_hw_lock(struct drm_device *dev, struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1250
1251
  
  				/* Buffer management support (drm_bufs.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1252
1253
  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...
1254
  extern int drm_addmap(struct drm_device *dev, resource_size_t offset,
c60ce623b   Dave Airlie   drm: remove a bun...
1255
  		      unsigned int size, enum drm_map_type type,
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1256
  		      enum drm_map_flags flags, struct drm_local_map **map_ptr);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1257
1258
  extern int drm_addmap_ioctl(struct drm_device *dev, void *data,
  			    struct drm_file *file_priv);
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1259
1260
  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_...
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
  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 ...
1273
  extern int drm_order(unsigned long size);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1274
1275
  
  				/* DMA support (drm_dma.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1276
1277
  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...
1278
  extern void drm_free_buffer(struct drm_device *dev, struct drm_buf * buf);
6c340eac0   Eric Anholt   drm: Replace filp...
1279
1280
  extern void drm_core_reclaim_buffers(struct drm_device *dev,
  				     struct drm_file *filp);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1281
1282
  
  				/* IRQ support (drm_irq.h) */
c153f45f9   Eric Anholt   drm: Replace DRM_...
1283
1284
  extern int drm_control(struct drm_device *dev, void *data,
  		       struct drm_file *file_priv);
b5e89ed53   Dave Airlie   drm: lindent the ...
1285
  extern irqreturn_t drm_irq_handler(DRM_IRQ_ARGS);
dbb19d302   Kristian Høgsberg   i915 gem: install...
1286
  extern int drm_irq_install(struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
1287
1288
1289
1290
  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 ...
1291

0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1292
  extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
af6061af0   Dave Airlie   Revert "drm/vbl r...
1293
  extern int drm_wait_vblank(struct drm_device *dev, void *data,
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1294
  			   struct drm_file *filp);
af6061af0   Dave Airlie   Revert "drm/vbl r...
1295
  extern int drm_vblank_wait(struct drm_device *dev, unsigned int *vbl_seq);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1296
1297
1298
1299
  extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
  extern void drm_handle_vblank(struct drm_device *dev, int crtc);
  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...
1300
  extern void drm_vblank_off(struct drm_device *dev, int crtc);
52440211d   Keith Packard   drm: move drm vbl...
1301
  extern void drm_vblank_cleanup(struct drm_device *dev);
0a3e67a4c   Jesse Barnes   drm: Rework vblan...
1302
  /* Modesetting support */
f453ba046   Dave Airlie   DRM: add mode set...
1303
1304
  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...
1305
1306
  extern int drm_modeset_ctl(struct drm_device *dev, void *data,
  			   struct drm_file *file_priv);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1307
1308
  
  				/* AGP/GART support (drm_agpsupport.h) */
55910517a   Dave Airlie   drm: detypedeffin...
1309
  extern struct drm_agp_head *drm_agp_init(struct drm_device *dev);
84b1fd103   Dave Airlie   drm: remove drm_f...
1310
  extern int drm_agp_acquire(struct drm_device *dev);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1311
1312
  extern int drm_agp_acquire_ioctl(struct drm_device *dev, void *data,
  				 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1313
  extern int drm_agp_release(struct drm_device *dev);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1314
1315
  extern int drm_agp_release_ioctl(struct drm_device *dev, void *data,
  				 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1316
  extern int drm_agp_enable(struct drm_device *dev, struct drm_agp_mode mode);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1317
1318
1319
1320
1321
  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...
1322
  extern int drm_agp_alloc(struct drm_device *dev, struct drm_agp_buffer *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1323
1324
  extern int drm_agp_alloc_ioctl(struct drm_device *dev, void *data,
  			 struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1325
  extern int drm_agp_free(struct drm_device *dev, struct drm_agp_buffer *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1326
1327
  extern int drm_agp_free_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1328
  extern int drm_agp_unbind(struct drm_device *dev, struct drm_agp_binding *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1329
1330
  extern int drm_agp_unbind_ioctl(struct drm_device *dev, void *data,
  			  struct drm_file *file_priv);
84b1fd103   Dave Airlie   drm: remove drm_f...
1331
  extern int drm_agp_bind(struct drm_device *dev, struct drm_agp_binding *request);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1332
1333
1334
  extern int drm_agp_bind_ioctl(struct drm_device *dev, void *data,
  			struct drm_file *file_priv);
  extern DRM_AGP_MEM *drm_agp_allocate_memory(struct agp_bridge_data *bridge, size_t pages, u32 type);
b5e89ed53   Dave Airlie   drm: lindent the ...
1335
1336
1337
  extern int drm_agp_free_memory(DRM_AGP_MEM * handle);
  extern int drm_agp_bind_memory(DRM_AGP_MEM * handle, off_t start);
  extern int drm_agp_unbind_memory(DRM_AGP_MEM * handle);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1338
  extern void drm_agp_chipset_flush(struct drm_device *dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1339
1340
  
  				/* Stub support (drm_stub.h) */
7c1c2871a   Dave Airlie   drm: move to kref...
1341
1342
1343
1344
1345
1346
1347
  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);
dcdb16740   Jordan Crouse   drm: Add support ...
1348
1349
1350
1351
1352
  extern int drm_get_pci_dev(struct pci_dev *pdev,
  			   const struct pci_device_id *ent,
  			   struct drm_driver *driver);
  extern int drm_get_platform_dev(struct platform_device *pdev,
  				struct drm_driver *driver);
112b715e8   Kristian Høgsberg   drm: claim PCI de...
1353
  extern void drm_put_dev(struct drm_device *dev);
2c14f28be   Dave Airlie   drm: reorganise m...
1354
  extern int drm_put_minor(struct drm_minor **minor);
b5e89ed53   Dave Airlie   drm: lindent the ...
1355
  extern unsigned int drm_debug;
2c14f28be   Dave Airlie   drm: reorganise m...
1356

0650fd582   Greg Kroah-Hartman   [PATCH] DRM: fix ...
1357
  extern struct class *drm_class;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1358
  extern struct proc_dir_entry *drm_proc_root;
955b12def   Ben Gamari   drm: Convert proc...
1359
  extern struct dentry *drm_debugfs_root;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1360

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

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1364
  				/* Proc support (drm_proc.h) */
2c14f28be   Dave Airlie   drm: reorganise m...
1365
1366
1367
  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
1368

955b12def   Ben Gamari   drm: Convert proc...
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
  				/* 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);
  extern int drm_gem_object_info(struct seq_file *m, void* data);
  
  #if DRM_DEBUG_CODE
  extern int drm_vma_info(struct seq_file *m, void *data);
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1393
  				/* Scatter Gather Support (drm_scatter.h) */
55910517a   Dave Airlie   drm: detypedeffin...
1394
  extern void drm_sg_cleanup(struct drm_sg_mem * entry);
c153f45f9   Eric Anholt   drm: Replace DRM_...
1395
1396
1397
1398
1399
  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
1400

b5e89ed53   Dave Airlie   drm: lindent the ...
1401
  			       /* ATI PCIGART support (ati_pcigart.h) */
84b1fd103   Dave Airlie   drm: remove drm_f...
1402
  extern int drm_ati_pcigart_init(struct drm_device *dev,
55910517a   Dave Airlie   drm: detypedeffin...
1403
  				struct drm_ati_pcigart_info * gart_info);
84b1fd103   Dave Airlie   drm: remove drm_f...
1404
  extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
55910517a   Dave Airlie   drm: detypedeffin...
1405
  				   struct drm_ati_pcigart_info * gart_info);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1406

84b1fd103   Dave Airlie   drm: remove drm_f...
1407
  extern drm_dma_handle_t *drm_pci_alloc(struct drm_device *dev, size_t size,
e6be8d9d1   Zhenyu Wang   drm: remove addre...
1408
  				       size_t align);
84b1fd103   Dave Airlie   drm: remove drm_f...
1409
1410
  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
1411
1412
  
  			       /* sysfs support (drm_sysfs.c) */
e8b962b6d   Jesse Barnes   drm: update DRM s...
1413
  struct drm_sysfs_class;
0650fd582   Greg Kroah-Hartman   [PATCH] DRM: fix ...
1414
  extern struct class *drm_sysfs_create(struct module *owner, char *name);
e8b962b6d   Jesse Barnes   drm: update DRM s...
1415
  extern void drm_sysfs_destroy(void);
2c14f28be   Dave Airlie   drm: reorganise m...
1416
  extern int drm_sysfs_device_add(struct drm_minor *minor);
f453ba046   Dave Airlie   DRM: add mode set...
1417
  extern void drm_sysfs_hotplug_event(struct drm_device *dev);
2c14f28be   Dave Airlie   drm: reorganise m...
1418
  extern void drm_sysfs_device_remove(struct drm_minor *minor);
f453ba046   Dave Airlie   DRM: add mode set...
1419
1420
1421
  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
1422

673a394b1   Eric Anholt   drm: Add GEM ("gr...
1423
1424
  /* Graphics Execution Manager library functions (drm_gem.c) */
  int drm_gem_init(struct drm_device *dev);
a2c0a97b7   Jesse Barnes   drm: GEM mmap sup...
1425
  void drm_gem_destroy(struct drm_device *dev);
fd632aa34   Daniel Vetter   drm: free core ge...
1426
  void drm_gem_object_release(struct drm_gem_object *obj);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1427
1428
1429
  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_...
1430
1431
  int drm_gem_object_init(struct drm_device *dev,
  			struct drm_gem_object *obj, size_t size);
29d08b3ef   Dave Airlie   drm/gem: handleco...
1432
  void drm_gem_object_handle_free(struct drm_gem_object *obj);
ab00b3e52   Jesse Barnes   drm/i915: Keep re...
1433
1434
  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...
1435
  int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1436

ba4420c22   Dave Airlie   drm: move ttm glo...
1437
  #include "drm_global.h"
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1438
1439
1440
1441
1442
1443
1444
1445
1446
  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...
1447
1448
1449
  	if (obj != NULL)
  		kref_put(&obj->refcount, drm_gem_object_free);
  }
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1450

c3ae90c09   Luca Barbieri   drm: introduce dr...
1451
1452
1453
  static inline void
  drm_gem_object_unreference_unlocked(struct drm_gem_object *obj)
  {
39b4d07aa   Chris Wilson   drm: Hold the mut...
1454
1455
1456
1457
1458
1459
  	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...
1460
1461
1462
1463
  }
  
  int drm_gem_handle_create(struct drm_file *file_priv,
  			  struct drm_gem_object *obj,
a1a2d1d32   Pekka Paalanen   drm: GEM handles ...
1464
  			  u32 *handlep);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1465
1466
1467
1468
1469
  
  static inline void
  drm_gem_object_handle_reference(struct drm_gem_object *obj)
  {
  	drm_gem_object_reference(obj);
29d08b3ef   Dave Airlie   drm/gem: handleco...
1470
  	atomic_inc(&obj->handle_count);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1471
1472
1473
1474
1475
1476
1477
  }
  
  static inline void
  drm_gem_object_handle_unreference(struct drm_gem_object *obj)
  {
  	if (obj == NULL)
  		return;
29d08b3ef   Dave Airlie   drm/gem: handleco...
1478
1479
  	if (atomic_read(&obj->handle_count) == 0)
  		return;
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1480
1481
1482
1483
1484
  	/*
  	 * 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...
1485
1486
  	if (atomic_dec_and_test(&obj->handle_count))
  		drm_gem_object_handle_free(obj);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1487
1488
  	drm_gem_object_unreference(obj);
  }
c3ae90c09   Luca Barbieri   drm: introduce dr...
1489
1490
1491
1492
1493
  static inline void
  drm_gem_object_handle_unreference_unlocked(struct drm_gem_object *obj)
  {
  	if (obj == NULL)
  		return;
29d08b3ef   Dave Airlie   drm/gem: handleco...
1494
1495
  	if (atomic_read(&obj->handle_count) == 0)
  		return;
c3ae90c09   Luca Barbieri   drm: introduce dr...
1496
1497
1498
1499
1500
  	/*
  	* 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...
1501
1502
1503
  
  	if (atomic_dec_and_test(&obj->handle_count))
  		drm_gem_object_handle_free(obj);
c3ae90c09   Luca Barbieri   drm: introduce dr...
1504
1505
  	drm_gem_object_unreference_unlocked(obj);
  }
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1506
1507
  struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev,
  					     struct drm_file *filp,
a1a2d1d32   Pekka Paalanen   drm: GEM handles ...
1508
  					     u32 handle);
673a394b1   Eric Anholt   drm: Add GEM ("gr...
1509
1510
1511
1512
1513
1514
1515
1516
  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...
1517
1518
1519
  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
1520

f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1521
1522
  static __inline__ struct drm_local_map *drm_core_findmap(struct drm_device *dev,
  							 unsigned int token)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1523
  {
55910517a   Dave Airlie   drm: detypedeffin...
1524
  	struct drm_map_list *_entry;
bd1b331fa   Dave Airlie   drm: cleanup use ...
1525
  	list_for_each_entry(_entry, &dev->maplist, head)
b5e89ed53   Dave Airlie   drm: lindent the ...
1526
1527
  	    if (_entry->user_token == token)
  		return _entry->map;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1528
1529
  	return NULL;
  }
84b1fd103   Dave Airlie   drm: remove drm_f...
1530
  static __inline__ int drm_device_is_agp(struct drm_device *dev)
cda173806   Dave Airlie   drm: add test for...
1531
  {
dcdb16740   Jordan Crouse   drm: Add support ...
1532
1533
  	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
  		return 0;
b5e89ed53   Dave Airlie   drm: lindent the ...
1534
1535
  	if (dev->driver->device_is_agp != NULL) {
  		int err = (*dev->driver->device_is_agp) (dev);
cda173806   Dave Airlie   drm: add test for...
1536
1537
1538
1539
1540
1541
1542
  		if (err != 2) {
  			return err;
  		}
  	}
  
  	return pci_find_capability(dev->pdev, PCI_CAP_ID_AGP);
  }
84b1fd103   Dave Airlie   drm: remove drm_f...
1543
  static __inline__ int drm_device_is_pcie(struct drm_device *dev)
ea98a92ff   Dave Airlie   drm: add radeon P...
1544
  {
dcdb16740   Jordan Crouse   drm: Add support ...
1545
1546
1547
1548
  	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
  		return 0;
  	else
  		return pci_find_capability(dev->pdev, PCI_CAP_ID_EXP);
ea98a92ff   Dave Airlie   drm: add radeon P...
1549
  }
f77d390c9   Benjamin Herrenschmidt   drm: Split drm_ma...
1550
  static __inline__ void drm_core_dropmap(struct drm_local_map *map)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1551
1552
  {
  }
72e942dd8   Dave Airlie   drm/ttm: use drm ...
1553
  #include "drm_mem_util.h"
dcdb16740   Jordan Crouse   drm: Add support ...
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
  
  static inline void *drm_get_device(struct drm_device *dev)
  {
  	if (drm_core_check_feature(dev, DRIVER_USE_PLATFORM_DEVICE))
  		return dev->platformdev;
  	else
  		return dev->pdev;
  }
  
  extern int drm_platform_init(struct drm_driver *driver);
  extern int drm_pci_init(struct drm_driver *driver);
  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);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1569
  /*@}*/
b5e89ed53   Dave Airlie   drm: lindent the ...
1570
  #endif				/* __KERNEL__ */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1571
  #endif