i915_drv.h 11.5 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 pipe;
87 88 89
	unsigned int sequence;
} drm_i915_vbl_swap_t;

90 91 92 93 94 95 96 97
struct intel_opregion {
	struct opregion_header *header;
	struct opregion_acpi *acpi;
	struct opregion_swsci *swsci;
	struct opregion_asle *asle;
	int enabled;
};

L
Linus Torvalds 已提交
98 99 100 101 102 103 104
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;

105
	drm_dma_handle_t *status_page_dmah;
L
Linus Torvalds 已提交
106 107
	void *hw_status_page;
	dma_addr_t dma_status_page;
108
	unsigned long counter;
109 110
	unsigned int status_gfx_addr;
	drm_local_map_t hws_map;
L
Linus Torvalds 已提交
111

112
	unsigned int cpp;
L
Linus Torvalds 已提交
113 114 115 116 117 118 119
	int back_offset;
	int front_offset;
	int current_page;
	int page_flipping;

	wait_queue_head_t irq_queue;
	atomic_t irq_received;
120
	atomic_t irq_emitted;
121 122 123 124 125 126
	/** 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 已提交
127 128 129 130

	int tex_lru_log_granularity;
	int allow_batchbuffer;
	struct mem_block *agp_heap;
D
Dave Airlie 已提交
131
	unsigned int sr01, adpa, ppcr, dvob, dvoc, lvds;
132
	int vblank_pipe;
133 134 135 136

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

138 139
	struct intel_opregion opregion;

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

230
extern struct drm_ioctl_desc i915_ioctls[];
231 232
extern int i915_max_ioctl;

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

L
Linus Torvalds 已提交
244
/* i915_irq.c */
245 246 247 248
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 已提交
249

250 251
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 已提交
252
extern irqreturn_t i915_driver_irq_handler(DRM_IRQ_ARGS);
253
extern void i915_driver_irq_preinstall(struct drm_device * dev);
254
extern void i915_driver_irq_postinstall(struct drm_device * dev);
255
extern void i915_driver_irq_uninstall(struct drm_device * dev);
256 257 258 259 260 261
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);
262
extern void i915_enable_irq(drm_i915_private_t *dev_priv, u32 mask);
L
Linus Torvalds 已提交
263 264

/* i915_mem.c */
265 266 267 268 269 270 271 272
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 已提交
273
extern void i915_mem_takedown(struct mem_block **heap);
274
extern void i915_mem_release(struct drm_device * dev,
275
			     struct drm_file *file_priv, struct mem_block *heap);
L
Linus Torvalds 已提交
276

277 278 279 280
/* i915_suspend.c */
extern int i915_save_state(struct drm_device *dev);
extern int i915_restore_state(struct drm_device *dev);

281 282 283 284 285 286
/* 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 已提交
287 288
#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 已提交
289
#define I915_READ16(reg)	DRM_READ16(dev_priv->mmio_map, (reg))
D
Dave Airlie 已提交
290
#define I915_WRITE16(reg,val)	DRM_WRITE16(dev_priv->mmio_map, (reg), (val))
291 292
#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 已提交
293 294 295 296 297 298 299 300

#define I915_VERBOSE 0

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

#define BEGIN_LP_RING(n) do {				\
	if (I915_VERBOSE)				\
301 302
		DRM_DEBUG("BEGIN_LP_RING(%d)\n", (n));	\
	if (dev_priv->ring.space < (n)*4)		\
303
		i915_wait_ring(dev, (n)*4, __func__);		\
L
Linus Torvalds 已提交
304 305 306 307 308 309 310 311
	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));	\
312
	*(volatile unsigned int *)(virt + outring) = (n);	\
L
Linus Torvalds 已提交
313 314 315 316 317 318 319 320 321
        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;				\
322
	I915_WRITE(PRB0_TAIL, outring);			\
L
Linus Torvalds 已提交
323 324
} while(0)

J
Jesse Barnes 已提交
325
/**
326 327 328
 * 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 已提交
329
 *
330 331 332 333 334
 * 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 已提交
335
 *
336
 * The area from dword 0x10 to 0x3ff is available for driver usage.
J
Jesse Barnes 已提交
337
 */
338 339
#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 已提交
340

341
extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
J
Jesse Barnes 已提交
342 343 344 345 346 347 348

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

349
#define IS_I915G(dev) ((dev)->pci_device == 0x2582 || (dev)->pci_device == 0x258a)
J
Jesse Barnes 已提交
350 351
#define IS_I915GM(dev) ((dev)->pci_device == 0x2592)
#define IS_I945G(dev) ((dev)->pci_device == 0x2772)
352 353
#define IS_I945GM(dev) ((dev)->pci_device == 0x27A2 ||\
		        (dev)->pci_device == 0x27AE)
J
Jesse Barnes 已提交
354 355 356 357 358
#define IS_I965G(dev) ((dev)->pci_device == 0x2972 || \
		       (dev)->pci_device == 0x2982 || \
		       (dev)->pci_device == 0x2992 || \
		       (dev)->pci_device == 0x29A2 || \
		       (dev)->pci_device == 0x2A02 || \
359
		       (dev)->pci_device == 0x2A12 || \
360 361 362 363
		       (dev)->pci_device == 0x2A42 || \
		       (dev)->pci_device == 0x2E02 || \
		       (dev)->pci_device == 0x2E12 || \
		       (dev)->pci_device == 0x2E22)
J
Jesse Barnes 已提交
364 365 366

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

367 368
#define IS_IGD_GM(dev) ((dev)->pci_device == 0x2A42)

369 370 371 372
#define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
		     (dev)->pci_device == 0x2E12 || \
		     (dev)->pci_device == 0x2E22)

J
Jesse Barnes 已提交
373 374 375 376 377 378 379 380
#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) || \
381
			IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev))
J
Jesse Barnes 已提交
382

383
#define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev) || IS_G4X(dev))
384

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

L
Linus Torvalds 已提交
387
#endif