i915_drv.h 10.4 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/* i915_drv.h -- Private header for the I915 driver -*- linux-c -*-
 */
D
Dave Airlie 已提交
3
/*
4
 *
L
Linus Torvalds 已提交
5 6
 * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
 * All Rights Reserved.
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
 *
 * 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, sub license, 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 NON-INFRINGEMENT.
 * IN NO EVENT SHALL TUNGSTEN GRAPHICS 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.
 *
D
Dave Airlie 已提交
28
 */
L
Linus Torvalds 已提交
29 30 31 32

#ifndef _I915_DRV_H_
#define _I915_DRV_H_

33 34
#include "i915_reg.h"

L
Linus Torvalds 已提交
35 36 37 38 39 40 41
/* General customization:
 */

#define DRIVER_AUTHOR		"Tungsten Graphics, Inc."

#define DRIVER_NAME		"i915"
#define DRIVER_DESC		"Intel Graphics"
42
#define DRIVER_DATE		"20060119"
L
Linus Torvalds 已提交
43 44 45 46

/* Interface history:
 *
 * 1.1: Original.
D
Dave Airlie 已提交
47 48
 * 1.2: Add Power Management
 * 1.3: Add vblank support
49
 * 1.4: Fix cmdbuffer path, add heap destroy
50
 * 1.5: Add vblank pipe configuration
=
=?utf-8?q?Michel_D=C3=A4nzer?= 已提交
51 52
 * 1.6: - New ioctl for scheduling buffer swaps on vertical blank
 *      - Support vertical blank on secondary display pipe
L
Linus Torvalds 已提交
53 54
 */
#define DRIVER_MAJOR		1
=
=?utf-8?q?Michel_D=C3=A4nzer?= 已提交
55
#define DRIVER_MINOR		6
L
Linus Torvalds 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
#define DRIVER_PATCHLEVEL	0

typedef struct _drm_i915_ring_buffer {
	int tail_mask;
	unsigned long Start;
	unsigned long End;
	unsigned long Size;
	u8 *virtual_start;
	int head;
	int tail;
	int space;
	drm_local_map_t map;
} drm_i915_ring_buffer_t;

struct mem_block {
	struct mem_block *next;
	struct mem_block *prev;
	int start;
	int size;
75
	struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */
L
Linus Torvalds 已提交
76 77
};

78 79 80
typedef struct _drm_i915_vbl_swap {
	struct list_head head;
	drm_drawable_t drw_id;
81
	unsigned int pipe;
82 83 84
	unsigned int sequence;
} drm_i915_vbl_swap_t;

L
Linus Torvalds 已提交
85 86 87 88 89 90 91
typedef struct drm_i915_private {
	drm_local_map_t *sarea;
	drm_local_map_t *mmio_map;

	drm_i915_sarea_t *sarea_priv;
	drm_i915_ring_buffer_t ring;

92
	drm_dma_handle_t *status_page_dmah;
L
Linus Torvalds 已提交
93 94
	void *hw_status_page;
	dma_addr_t dma_status_page;
95
	unsigned long counter;
96 97
	unsigned int status_gfx_addr;
	drm_local_map_t hws_map;
L
Linus Torvalds 已提交
98

99
	unsigned int cpp;
L
Linus Torvalds 已提交
100 101 102 103 104 105 106
	int back_offset;
	int front_offset;
	int current_page;
	int page_flipping;

	wait_queue_head_t irq_queue;
	atomic_t irq_received;
107
	atomic_t irq_emitted;
L
Linus Torvalds 已提交
108 109 110 111

	int tex_lru_log_granularity;
	int allow_batchbuffer;
	struct mem_block *agp_heap;
D
Dave Airlie 已提交
112
	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
113
	int vblank_pipe;
114 115 116 117

	spinlock_t swaps_lock;
	drm_i915_vbl_swap_t vbl_swaps;
	unsigned int swaps_pending;
J
Jesse Barnes 已提交
118 119 120 121 122

	/* Register state */
	u8 saveLBB;
	u32 saveDSPACNTR;
	u32 saveDSPBCNTR;
123
	u32 saveDSPARB;
J
Jesse Barnes 已提交
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
	u32 savePIPEACONF;
	u32 savePIPEBCONF;
	u32 savePIPEASRC;
	u32 savePIPEBSRC;
	u32 saveFPA0;
	u32 saveFPA1;
	u32 saveDPLL_A;
	u32 saveDPLL_A_MD;
	u32 saveHTOTAL_A;
	u32 saveHBLANK_A;
	u32 saveHSYNC_A;
	u32 saveVTOTAL_A;
	u32 saveVBLANK_A;
	u32 saveVSYNC_A;
	u32 saveBCLRPAT_A;
139
	u32 savePIPEASTAT;
J
Jesse Barnes 已提交
140 141 142
	u32 saveDSPASTRIDE;
	u32 saveDSPASIZE;
	u32 saveDSPAPOS;
143
	u32 saveDSPAADDR;
J
Jesse Barnes 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
	u32 saveDSPASURF;
	u32 saveDSPATILEOFF;
	u32 savePFIT_PGM_RATIOS;
	u32 saveBLC_PWM_CTL;
	u32 saveBLC_PWM_CTL2;
	u32 saveFPB0;
	u32 saveFPB1;
	u32 saveDPLL_B;
	u32 saveDPLL_B_MD;
	u32 saveHTOTAL_B;
	u32 saveHBLANK_B;
	u32 saveHSYNC_B;
	u32 saveVTOTAL_B;
	u32 saveVBLANK_B;
	u32 saveVSYNC_B;
	u32 saveBCLRPAT_B;
160
	u32 savePIPEBSTAT;
J
Jesse Barnes 已提交
161 162 163
	u32 saveDSPBSTRIDE;
	u32 saveDSPBSIZE;
	u32 saveDSPBPOS;
164
	u32 saveDSPBADDR;
J
Jesse Barnes 已提交
165 166
	u32 saveDSPBSURF;
	u32 saveDSPBTILEOFF;
167 168 169
	u32 saveVGA0;
	u32 saveVGA1;
	u32 saveVGA_PD;
J
Jesse Barnes 已提交
170 171 172
	u32 saveVGACNTRL;
	u32 saveADPA;
	u32 saveLVDS;
173 174
	u32 savePP_ON_DELAYS;
	u32 savePP_OFF_DELAYS;
J
Jesse Barnes 已提交
175 176 177 178 179 180
	u32 saveDVOA;
	u32 saveDVOB;
	u32 saveDVOC;
	u32 savePP_ON;
	u32 savePP_OFF;
	u32 savePP_CONTROL;
181
	u32 savePP_DIVISOR;
J
Jesse Barnes 已提交
182 183 184 185 186 187 188
	u32 savePFIT_CONTROL;
	u32 save_palette_a[256];
	u32 save_palette_b[256];
	u32 saveFBC_CFB_BASE;
	u32 saveFBC_LL_BASE;
	u32 saveFBC_CONTROL;
	u32 saveFBC_CONTROL2;
189 190 191
	u32 saveIER;
	u32 saveIIR;
	u32 saveIMR;
192
	u32 saveCACHE_MODE_0;
193
	u32 saveD_STATE;
194
	u32 saveCG_2D_DIS;
195
	u32 saveMI_ARB_STATE;
J
Jesse Barnes 已提交
196 197 198 199 200
	u32 saveSWF0[16];
	u32 saveSWF1[16];
	u32 saveSWF2[3];
	u8 saveMSR;
	u8 saveSR[8];
201
	u8 saveGR[25];
J
Jesse Barnes 已提交
202
	u8 saveAR_INDEX;
203
	u8 saveAR[21];
J
Jesse Barnes 已提交
204 205
	u8 saveDACMASK;
	u8 saveDACDATA[256*3]; /* 256 3-byte colors */
206
	u8 saveCR[37];
L
Linus Torvalds 已提交
207 208
} drm_i915_private_t;

209
extern struct drm_ioctl_desc i915_ioctls[];
210 211
extern int i915_max_ioctl;

L
Linus Torvalds 已提交
212
				/* i915_dma.c */
213
extern void i915_kernel_lost_context(struct drm_device * dev);
214
extern int i915_driver_load(struct drm_device *, unsigned long flags);
J
Jesse Barnes 已提交
215
extern int i915_driver_unload(struct drm_device *);
216
extern void i915_driver_lastclose(struct drm_device * dev);
217 218
extern void i915_driver_preclose(struct drm_device *dev,
				 struct drm_file *file_priv);
219
extern int i915_driver_device_is_agp(struct drm_device * dev);
D
Dave Airlie 已提交
220 221
extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
			      unsigned long arg);
222

L
Linus Torvalds 已提交
223
/* i915_irq.c */
224 225 226 227
extern int i915_irq_emit(struct drm_device *dev, void *data,
			 struct drm_file *file_priv);
extern int i915_irq_wait(struct drm_device *dev, void *data,
			 struct drm_file *file_priv);
L
Linus Torvalds 已提交
228

229 230
extern int i915_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence);
extern int i915_driver_vblank_wait2(struct drm_device *dev, unsigned int *sequence);
L
Linus Torvalds 已提交
231
extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
232
extern void i915_driver_irq_preinstall(struct drm_device * dev);
233
extern void i915_driver_irq_postinstall(struct drm_device * dev);
234
extern void i915_driver_irq_uninstall(struct drm_device * dev);
235 236 237 238 239 240
extern int i915_vblank_pipe_set(struct drm_device *dev, void *data,
				struct drm_file *file_priv);
extern int i915_vblank_pipe_get(struct drm_device *dev, void *data,
				struct drm_file *file_priv);
extern int i915_vblank_swap(struct drm_device *dev, void *data,
			    struct drm_file *file_priv);
L
Linus Torvalds 已提交
241 242

/* i915_mem.c */
243 244 245 246 247 248 249 250
extern int i915_mem_alloc(struct drm_device *dev, void *data,
			  struct drm_file *file_priv);
extern int i915_mem_free(struct drm_device *dev, void *data,
			 struct drm_file *file_priv);
extern int i915_mem_init_heap(struct drm_device *dev, void *data,
			      struct drm_file *file_priv);
extern int i915_mem_destroy_heap(struct drm_device *dev, void *data,
				 struct drm_file *file_priv);
L
Linus Torvalds 已提交
251
extern void i915_mem_takedown(struct mem_block **heap);
252
extern void i915_mem_release(struct drm_device * dev,
253
			     struct drm_file *file_priv, struct mem_block *heap);
L
Linus Torvalds 已提交
254

D
Dave Airlie 已提交
255 256
#define I915_READ(reg)          DRM_READ32(dev_priv->mmio_map, (reg))
#define I915_WRITE(reg,val)     DRM_WRITE32(dev_priv->mmio_map, (reg), (val))
D
Dave Airlie 已提交
257
#define I915_READ16(reg)	DRM_READ16(dev_priv->mmio_map, (reg))
D
Dave Airlie 已提交
258
#define I915_WRITE16(reg,val)	DRM_WRITE16(dev_priv->mmio_map, (reg), (val))
L
Linus Torvalds 已提交
259 260 261 262 263 264 265 266

#define I915_VERBOSE 0

#define RING_LOCALS	unsigned int outring, ringmask, outcount; \
                        volatile char *virt;

#define BEGIN_LP_RING(n) do {				\
	if (I915_VERBOSE)				\
267 268
		DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));	\
	if (dev_priv->ring.space < (n)*4)		\
269
		i915_wait_ring(dev, (n)*4, __func__);		\
L
Linus Torvalds 已提交
270 271 272 273 274 275 276 277
	outcount = 0;					\
	outring = dev_priv->ring.tail;			\
	ringmask = dev_priv->ring.tail_mask;		\
	virt = dev_priv->ring.virtual_start;		\
} while (0)

#define OUT_RING(n) do {					\
	if (I915_VERBOSE) DRM_DEBUG("   OUT_RING %x\n", (int)(n));	\
278
	*(volatile unsigned int *)(virt + outring) = (n);	\
L
Linus Torvalds 已提交
279 280 281 282 283 284 285 286 287
        outcount++;						\
	outring += 4;						\
	outring &= ringmask;					\
} while (0)

#define ADVANCE_LP_RING() do {						\
	if (I915_VERBOSE) DRM_DEBUG("ADVANCE_LP_RING %x\n", outring);	\
	dev_priv->ring.tail = outring;					\
	dev_priv->ring.space -= outcount * 4;				\
288
	I915_WRITE(PRB0_TAIL, outring);			\
L
Linus Torvalds 已提交
289 290
} while(0)

J
Jesse Barnes 已提交
291
/**
292 293 294
 * Reads a dword out of the status page, which is written to from the command
 * queue by automatic updates, MI_REPORT_HEAD, MI_STORE_DATA_INDEX, or
 * MI_STORE_DATA_IMM.
J
Jesse Barnes 已提交
295
 *
296 297 298 299 300
 * The following dwords have a reserved meaning:
 * 0: ISR copy, updated when an ISR bit not set in the HWSTAM changes.
 * 4: ring 0 head pointer
 * 5: ring 1 head pointer (915-class)
 * 6: ring 2 head pointer (915-class)
J
Jesse Barnes 已提交
301
 *
302
 * The area from dword 0x10 to 0x3ff is available for driver usage.
J
Jesse Barnes 已提交
303
 */
304 305
#define READ_HWSP(dev_priv, reg)  (((volatile u32*)(dev_priv->hw_status_page))[reg])
#define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, 5)
J
Jesse Barnes 已提交
306

307
extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
J
Jesse Barnes 已提交
308 309 310 311 312 313 314

#define IS_I830(dev) ((dev)->pci_device == 0x3577)
#define IS_845G(dev) ((dev)->pci_device == 0x2562)
#define IS_I85X(dev) ((dev)->pci_device == 0x3582)
#define IS_I855(dev) ((dev)->pci_device == 0x3582)
#define IS_I865G(dev) ((dev)->pci_device == 0x2572)

315
#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a)
J
Jesse Barnes 已提交
316 317
#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
318 319
#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2 ||\
		        (dev)->pci_device == 0x27AE)
J
Jesse Barnes 已提交
320 321 322 323 324
#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \
		       (dev)->pci_device == 0x2982 || \
		       (dev)->pci_device == 0x2992 || \
		       (dev)->pci_device == 0x29A2 || \
		       (dev)->pci_device == 0x2A02 || \
325
		       (dev)->pci_device == 0x2A12 || \
326 327 328 329
		       (dev)->pci_device == 0x2A42 || \
		       (dev)->pci_device == 0x2E02 || \
		       (dev)->pci_device == 0x2E12 || \
		       (dev)->pci_device == 0x2E22)
J
Jesse Barnes 已提交
330 331 332

#define IS_I965GM(dev) ((dev)->pci_device == 0x2A02)

333 334
#define IS_IGD_GM(dev) ((dev)->pci_device == 0x2A42)

335 336 337 338
#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
		     (dev)->pci_device == 0x2E12 || \
		     (dev)->pci_device == 0x2E22)

J
Jesse Barnes 已提交
339 340 341 342 343 344 345 346
#define IS_G33(dev)    ((dev)->pci_device == 0x29C2 ||	\
			(dev)->pci_device == 0x29B2 ||	\
			(dev)->pci_device == 0x29D2)

#define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \
		      IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev))

#define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
347
			IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev))
J
Jesse Barnes 已提交
348

349
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev) || IS_G4X(dev))
350

J
Jesse Barnes 已提交
351
#define PRIMARY_RINGBUFFER_SIZE         (128*1024)
D
Dave Airlie 已提交
352

L
Linus Torvalds 已提交
353
#endif