i915_drv.h 10.7 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;
108 109 110 111 112 113
	/** Protects user_irq_refcount and irq_mask_reg */
	spinlock_t user_irq_lock;
	/** Refcount for i915_user_irq_get() versus i915_user_irq_put(). */
	int user_irq_refcount;
	/** Cached value of IMR to avoid reads in updating the bitfield */
	u32 irq_mask_reg;
L
Linus Torvalds 已提交
114 115 116 117

	int tex_lru_log_granularity;
	int allow_batchbuffer;
	struct mem_block *agp_heap;
D
Dave Airlie 已提交
118
	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
119
	int vblank_pipe;
120 121 122 123

	spinlock_t swaps_lock;
	drm_i915_vbl_swap_t vbl_swaps;
	unsigned int swaps_pending;
J
Jesse Barnes 已提交
124 125 126 127 128

	/* Register state */
	u8 saveLBB;
	u32 saveDSPACNTR;
	u32 saveDSPBCNTR;
129
	u32 saveDSPARB;
J
Jesse Barnes 已提交
130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
	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;
145
	u32 savePIPEASTAT;
J
Jesse Barnes 已提交
146 147 148
	u32 saveDSPASTRIDE;
	u32 saveDSPASIZE;
	u32 saveDSPAPOS;
149
	u32 saveDSPAADDR;
J
Jesse Barnes 已提交
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
	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;
166
	u32 savePIPEBSTAT;
J
Jesse Barnes 已提交
167 168 169
	u32 saveDSPBSTRIDE;
	u32 saveDSPBSIZE;
	u32 saveDSPBPOS;
170
	u32 saveDSPBADDR;
J
Jesse Barnes 已提交
171 172
	u32 saveDSPBSURF;
	u32 saveDSPBTILEOFF;
173 174 175
	u32 saveVGA0;
	u32 saveVGA1;
	u32 saveVGA_PD;
J
Jesse Barnes 已提交
176 177 178
	u32 saveVGACNTRL;
	u32 saveADPA;
	u32 saveLVDS;
179 180
	u32 savePP_ON_DELAYS;
	u32 savePP_OFF_DELAYS;
J
Jesse Barnes 已提交
181 182 183 184 185 186
	u32 saveDVOA;
	u32 saveDVOB;
	u32 saveDVOC;
	u32 savePP_ON;
	u32 savePP_OFF;
	u32 savePP_CONTROL;
187
	u32 savePP_DIVISOR;
J
Jesse Barnes 已提交
188 189 190 191 192 193 194
	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;
195 196 197
	u32 saveIER;
	u32 saveIIR;
	u32 saveIMR;
198
	u32 saveCACHE_MODE_0;
199
	u32 saveD_STATE;
200
	u32 saveCG_2D_DIS;
201
	u32 saveMI_ARB_STATE;
J
Jesse Barnes 已提交
202 203 204 205 206
	u32 saveSWF0[16];
	u32 saveSWF1[16];
	u32 saveSWF2[3];
	u8 saveMSR;
	u8 saveSR[8];
207
	u8 saveGR[25];
J
Jesse Barnes 已提交
208
	u8 saveAR_INDEX;
209
	u8 saveAR[21];
J
Jesse Barnes 已提交
210 211
	u8 saveDACMASK;
	u8 saveDACDATA[256*3]; /* 256 3-byte colors */
212
	u8 saveCR[37];
L
Linus Torvalds 已提交
213 214
} drm_i915_private_t;

215
extern struct drm_ioctl_desc i915_ioctls[];
216 217
extern int i915_max_ioctl;

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

L
Linus Torvalds 已提交
229
/* i915_irq.c */
230 231 232 233
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 已提交
234

235 236
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 已提交
237
extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
238
extern void i915_driver_irq_preinstall(struct drm_device * dev);
239
extern void i915_driver_irq_postinstall(struct drm_device * dev);
240
extern void i915_driver_irq_uninstall(struct drm_device * dev);
241 242 243 244 245 246
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 已提交
247 248

/* i915_mem.c */
249 250 251 252 253 254 255 256
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 已提交
257
extern void i915_mem_takedown(struct mem_block **heap);
258
extern void i915_mem_release(struct drm_device * dev,
259
			     struct drm_file *file_priv, struct mem_block *heap);
L
Linus Torvalds 已提交
260

D
Dave Airlie 已提交
261 262
#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 已提交
263
#define I915_READ16(reg)	DRM_READ16(dev_priv->mmio_map, (reg))
D
Dave Airlie 已提交
264
#define I915_WRITE16(reg,val)	DRM_WRITE16(dev_priv->mmio_map, (reg), (val))
L
Linus Torvalds 已提交
265 266 267 268 269 270 271 272

#define I915_VERBOSE 0

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

#define BEGIN_LP_RING(n) do {				\
	if (I915_VERBOSE)				\
273 274
		DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));	\
	if (dev_priv->ring.space < (n)*4)		\
275
		i915_wait_ring(dev, (n)*4, __func__);		\
L
Linus Torvalds 已提交
276 277 278 279 280 281 282 283
	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));	\
284
	*(volatile unsigned int *)(virt + outring) = (n);	\
L
Linus Torvalds 已提交
285 286 287 288 289 290 291 292 293
        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;				\
294
	I915_WRITE(PRB0_TAIL, outring);			\
L
Linus Torvalds 已提交
295 296
} while(0)

J
Jesse Barnes 已提交
297
/**
298 299 300
 * 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 已提交
301
 *
302 303 304 305 306
 * 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 已提交
307
 *
308
 * The area from dword 0x10 to 0x3ff is available for driver usage.
J
Jesse Barnes 已提交
309
 */
310 311
#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 已提交
312

313
extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
J
Jesse Barnes 已提交
314 315 316 317 318 319 320

#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)

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

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

339 340
#define IS_IGD_GM(dev) ((dev)->pci_device == 0x2A42)

341 342 343 344
#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
		     (dev)->pci_device == 0x2E12 || \
		     (dev)->pci_device == 0x2E22)

J
Jesse Barnes 已提交
345 346 347 348 349 350 351 352
#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) || \
353
			IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev))
J
Jesse Barnes 已提交
354

355
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev) || IS_G4X(dev))
356

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

L
Linus Torvalds 已提交
359
#endif