i915_drv.h 11.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 47 48
enum pipe {
	PIPE_A = 0,
	PIPE_B,
};

L
Linus Torvalds 已提交
49 50 51
/* Interface history:
 *
 * 1.1: Original.
D
Dave Airlie 已提交
52 53
 * 1.2: Add Power Management
 * 1.3: Add vblank support
54
 * 1.4: Fix cmdbuffer path, add heap destroy
55
 * 1.5: Add vblank pipe configuration
=
=?utf-8?q?Michel_D=C3=A4nzer?= 已提交
56 57
 * 1.6: - New ioctl for scheduling buffer swaps on vertical blank
 *      - Support vertical blank on secondary display pipe
L
Linus Torvalds 已提交
58 59
 */
#define DRIVER_MAJOR		1
=
=?utf-8?q?Michel_D=C3=A4nzer?= 已提交
60
#define DRIVER_MINOR		6
L
Linus Torvalds 已提交
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
#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;
80
	struct drm_file *file_priv; /* NULL: free, -1: heap, other: real files */
L
Linus Torvalds 已提交
81 82
};

83 84 85
typedef struct _drm_i915_vbl_swap {
	struct list_head head;
	drm_drawable_t drw_id;
86
	unsigned int plane;
87 88 89
	unsigned int sequence;
} drm_i915_vbl_swap_t;

90 91 92 93 94
struct opregion_header;
struct opregion_acpi;
struct opregion_swsci;
struct opregion_asle;

95 96 97 98 99 100 101 102
struct intel_opregion {
	struct opregion_header *header;
	struct opregion_acpi *acpi;
	struct opregion_swsci *swsci;
	struct opregion_asle *asle;
	int enabled;
};

L
Linus Torvalds 已提交
103 104 105 106 107 108 109
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;

110
	drm_dma_handle_t *status_page_dmah;
L
Linus Torvalds 已提交
111 112
	void *hw_status_page;
	dma_addr_t dma_status_page;
113
	uint32_t counter;
114 115
	unsigned int status_gfx_addr;
	drm_local_map_t hws_map;
L
Linus Torvalds 已提交
116

117
	unsigned int cpp;
L
Linus Torvalds 已提交
118 119 120 121 122 123 124
	int back_offset;
	int front_offset;
	int current_page;
	int page_flipping;

	wait_queue_head_t irq_queue;
	atomic_t irq_received;
125
	atomic_t irq_emitted;
126 127 128 129 130 131
	/** 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 已提交
132 133 134 135

	int tex_lru_log_granularity;
	int allow_batchbuffer;
	struct mem_block *agp_heap;
D
Dave Airlie 已提交
136
	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
137
	int vblank_pipe;
138 139 140 141

	spinlock_t swaps_lock;
	drm_i915_vbl_swap_t vbl_swaps;
	unsigned int swaps_pending;
J
Jesse Barnes 已提交
142

143 144
	struct intel_opregion opregion;

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

235
extern struct drm_ioctl_desc i915_ioctls[];
236 237
extern int i915_max_ioctl;

L
Linus Torvalds 已提交
238
				/* i915_dma.c */
239
extern void i915_kernel_lost_context(struct drm_device * dev);
240
extern int i915_driver_load(struct drm_device *, unsigned long flags);
J
Jesse Barnes 已提交
241
extern int i915_driver_unload(struct drm_device *);
242
extern void i915_driver_lastclose(struct drm_device * dev);
243 244
extern void i915_driver_preclose(struct drm_device *dev,
				 struct drm_file *file_priv);
245
extern int i915_driver_device_is_agp(struct drm_device * dev);
D
Dave Airlie 已提交
246 247
extern long i915_compat_ioctl(struct file *filp, unsigned int cmd,
			      unsigned long arg);
248

L
Linus Torvalds 已提交
249
/* i915_irq.c */
250 251 252 253
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 已提交
254 255

extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
256
extern void i915_driver_irq_preinstall(struct drm_device * dev);
257
extern int i915_driver_irq_postinstall(struct drm_device *dev);
258
extern void i915_driver_irq_uninstall(struct drm_device * dev);
259 260 261 262
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);
263 264 265
extern int i915_enable_vblank(struct drm_device *dev, int crtc);
extern void i915_disable_vblank(struct drm_device *dev, int crtc);
extern u32 i915_get_vblank_counter(struct drm_device *dev, int crtc);
266 267
extern int i915_vblank_swap(struct drm_device *dev, void *data,
			    struct drm_file *file_priv);
268
extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask);
L
Linus Torvalds 已提交
269 270

/* i915_mem.c */
271 272 273 274 275 276 277 278
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 已提交
279
extern void i915_mem_takedown(struct mem_block **heap);
280
extern void i915_mem_release(struct drm_device * dev,
281
			     struct drm_file *file_priv, struct mem_block *heap);
L
Linus Torvalds 已提交
282

283 284 285
/* i915_suspend.c */
extern int i915_save_state(struct drm_device *dev);
extern int i915_restore_state(struct drm_device *dev);
286 287 288 289

/* i915_suspend.c */
extern int i915_save_state(struct drm_device *dev);
extern int i915_restore_state(struct drm_device *dev);
290

291 292 293 294 295 296
/* i915_opregion.c */
extern int intel_opregion_init(struct drm_device *dev);
extern void intel_opregion_free(struct drm_device *dev);
extern void opregion_asle_intr(struct drm_device *dev);
extern void opregion_enable_asle(struct drm_device *dev);

D
Dave Airlie 已提交
297 298
#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 已提交
299
#define I915_READ16(reg)	DRM_READ16(dev_priv->mmio_map, (reg))
D
Dave Airlie 已提交
300
#define I915_WRITE16(reg,val)	DRM_WRITE16(dev_priv->mmio_map, (reg), (val))
301 302
#define I915_READ8(reg)		DRM_READ8(dev_priv->mmio_map, (reg))
#define I915_WRITE8(reg,val)	DRM_WRITE8(dev_priv->mmio_map, (reg), (val))
L
Linus Torvalds 已提交
303 304 305 306 307 308 309 310

#define I915_VERBOSE 0

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

#define BEGIN_LP_RING(n) do {				\
	if (I915_VERBOSE)				\
311 312
		DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));	\
	if (dev_priv->ring.space < (n)*4)		\
313
		i915_wait_ring(dev, (n)*4, __func__);		\
L
Linus Torvalds 已提交
314 315 316 317 318 319 320 321
	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));	\
322
	*(volatile unsigned int *)(virt + outring) = (n);	\
L
Linus Torvalds 已提交
323 324 325 326 327 328 329 330 331
        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;				\
332
	I915_WRITE(PRB0_TAIL, outring);			\
L
Linus Torvalds 已提交
333 334
} while(0)

J
Jesse Barnes 已提交
335
/**
336 337 338
 * 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 已提交
339
 *
340 341 342 343 344
 * 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 已提交
345
 *
346
 * The area from dword 0x10 to 0x3ff is available for driver usage.
J
Jesse Barnes 已提交
347
 */
348 349
#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 已提交
350

351
extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
J
Jesse Barnes 已提交
352 353 354 355 356 357 358

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

359
#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a)
J
Jesse Barnes 已提交
360 361
#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
362 363
#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2 ||\
		        (dev)->pci_device == 0x27AE)
J
Jesse Barnes 已提交
364 365 366 367 368
#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \
		       (dev)->pci_device == 0x2982 || \
		       (dev)->pci_device == 0x2992 || \
		       (dev)->pci_device == 0x29A2 || \
		       (dev)->pci_device == 0x2A02 || \
369
		       (dev)->pci_device == 0x2A12 || \
370 371 372 373
		       (dev)->pci_device == 0x2A42 || \
		       (dev)->pci_device == 0x2E02 || \
		       (dev)->pci_device == 0x2E12 || \
		       (dev)->pci_device == 0x2E22)
J
Jesse Barnes 已提交
374 375 376

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

J
Jesse Barnes 已提交
377
#define IS_GM45(dev) ((dev)->pci_device == 0x2A42)
378

379 380 381 382
#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
		     (dev)->pci_device == 0x2E12 || \
		     (dev)->pci_device == 0x2E22)

J
Jesse Barnes 已提交
383 384 385 386 387 388 389 390
#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) || \
J
Jesse Barnes 已提交
391
			IS_I945GM(dev) || IS_I965GM(dev) || IS_GM45(dev))
J
Jesse Barnes 已提交
392

J
Jesse Barnes 已提交
393
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_GM45(dev) || IS_G4X(dev))
394

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

L
Linus Torvalds 已提交
397
#endif