i915_drv.c 20.9 KB
Newer Older
L
Linus Torvalds 已提交
1 2
/* i915_drv.c -- i830,i845,i855,i865,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
#include <linux/device.h>
L
Linus Torvalds 已提交
31 32 33 34
#include "drmP.h"
#include "drm.h"
#include "i915_drm.h"
#include "i915_drv.h"
35
#include "intel_drv.h"
L
Linus Torvalds 已提交
36

J
Jesse Barnes 已提交
37
#include <linux/console.h>
38
#include "drm_crtc_helper.h"
J
Jesse Barnes 已提交
39

K
Kyle McMartin 已提交
40
static int i915_modeset = -1;
J
Jesse Barnes 已提交
41 42 43 44
module_param_named(modeset, i915_modeset, int, 0400);

unsigned int i915_fbpercrtc = 0;
module_param_named(fbpercrtc, i915_fbpercrtc, int, 0400);
L
Linus Torvalds 已提交
45

46
unsigned int i915_powersave = 1;
47
module_param_named(powersave, i915_powersave, int, 0600);
48

C
Chris Wilson 已提交
49 50 51
unsigned int i915_enable_rc6 = 0;
module_param_named(i915_enable_rc6, i915_enable_rc6, int, 0600);

52 53 54
unsigned int i915_lvds_downclock = 0;
module_param_named(lvds_downclock, i915_lvds_downclock, int, 0400);

55 56 57
unsigned int i915_panel_use_ssc = 1;
module_param_named(lvds_use_ssc, i915_panel_use_ssc, int, 0600);

C
Chris Wilson 已提交
58 59 60
bool i915_try_reset = true;
module_param_named(reset, i915_try_reset, bool, 0600);

61
static struct drm_driver driver;
62
extern int intel_agp_enabled;
63

64
#define INTEL_VGA_DEVICE(id, info) {		\
65
	.class = PCI_CLASS_DISPLAY_VGA << 8,	\
66
	.class_mask = 0xff0000,			\
67 68 69 70
	.vendor = 0x8086,			\
	.device = id,				\
	.subvendor = PCI_ANY_ID,		\
	.subdevice = PCI_ANY_ID,		\
71 72
	.driver_data = (unsigned long) info }

73
static const struct intel_device_info intel_i830_info = {
74
	.gen = 2, .is_mobile = 1, .cursor_needs_physical = 1,
75
	.has_overlay = 1, .overlay_needs_physical = 1,
76 77
};

78
static const struct intel_device_info intel_845g_info = {
79
	.gen = 2,
80
	.has_overlay = 1, .overlay_needs_physical = 1,
81 82
};

83
static const struct intel_device_info intel_i85x_info = {
84
	.gen = 2, .is_i85x = 1, .is_mobile = 1,
85
	.cursor_needs_physical = 1,
86
	.has_overlay = 1, .overlay_needs_physical = 1,
87 88
};

89
static const struct intel_device_info intel_i865g_info = {
90
	.gen = 2,
91
	.has_overlay = 1, .overlay_needs_physical = 1,
92 93
};

94
static const struct intel_device_info intel_i915g_info = {
95
	.gen = 3, .is_i915g = 1, .cursor_needs_physical = 1,
96
	.has_overlay = 1, .overlay_needs_physical = 1,
97
};
98
static const struct intel_device_info intel_i915gm_info = {
99
	.gen = 3, .is_mobile = 1,
100
	.cursor_needs_physical = 1,
101
	.has_overlay = 1, .overlay_needs_physical = 1,
102
	.supports_tv = 1,
103
};
104
static const struct intel_device_info intel_i945g_info = {
105
	.gen = 3, .has_hotplug = 1, .cursor_needs_physical = 1,
106
	.has_overlay = 1, .overlay_needs_physical = 1,
107
};
108
static const struct intel_device_info intel_i945gm_info = {
109
	.gen = 3, .is_i945gm = 1, .is_mobile = 1,
110
	.has_hotplug = 1, .cursor_needs_physical = 1,
111
	.has_overlay = 1, .overlay_needs_physical = 1,
112
	.supports_tv = 1,
113 114
};

115
static const struct intel_device_info intel_i965g_info = {
116
	.gen = 4, .is_broadwater = 1,
117
	.has_hotplug = 1,
118
	.has_overlay = 1,
119 120
};

121
static const struct intel_device_info intel_i965gm_info = {
122
	.gen = 4, .is_crestline = 1,
123
	.is_mobile = 1, .has_fbc = 1, .has_hotplug = 1,
124
	.has_overlay = 1,
125
	.supports_tv = 1,
126 127
};

128
static const struct intel_device_info intel_g33_info = {
129
	.gen = 3, .is_g33 = 1,
130
	.need_gfx_hws = 1, .has_hotplug = 1,
131
	.has_overlay = 1,
132 133
};

134
static const struct intel_device_info intel_g45_info = {
135
	.gen = 4, .is_g4x = 1, .need_gfx_hws = 1,
136
	.has_pipe_cxsr = 1, .has_hotplug = 1,
137
	.has_bsd_ring = 1,
138 139
};

140
static const struct intel_device_info intel_gm45_info = {
141
	.gen = 4, .is_g4x = 1,
142
	.is_mobile = 1, .need_gfx_hws = 1, .has_fbc = 1,
143
	.has_pipe_cxsr = 1, .has_hotplug = 1,
144
	.supports_tv = 1,
145
	.has_bsd_ring = 1,
146 147
};

148
static const struct intel_device_info intel_pineview_info = {
149
	.gen = 3, .is_g33 = 1, .is_pineview = 1, .is_mobile = 1,
150
	.need_gfx_hws = 1, .has_hotplug = 1,
151
	.has_overlay = 1,
152 153
};

154
static const struct intel_device_info intel_ironlake_d_info = {
155
	.gen = 5,
156
	.need_gfx_hws = 1, .has_pipe_cxsr = 1, .has_hotplug = 1,
157
	.has_bsd_ring = 1,
158 159
};

160
static const struct intel_device_info intel_ironlake_m_info = {
161
	.gen = 5, .is_mobile = 1,
162
	.need_gfx_hws = 1, .has_hotplug = 1,
163
	.has_fbc = 0, /* disabled due to buggy hardware */
164
	.has_bsd_ring = 1,
165 166
};

167
static const struct intel_device_info intel_sandybridge_d_info = {
168
	.gen = 6,
169
	.need_gfx_hws = 1, .has_hotplug = 1,
170
	.has_bsd_ring = 1,
171
	.has_blt_ring = 1,
172 173
};

174
static const struct intel_device_info intel_sandybridge_m_info = {
175
	.gen = 6, .is_mobile = 1,
176
	.need_gfx_hws = 1, .has_hotplug = 1,
177
	.has_fbc = 1,
178
	.has_bsd_ring = 1,
179
	.has_blt_ring = 1,
180 181
};

182 183 184 185
static const struct pci_device_id pciidlist[] = {		/* aka */
	INTEL_VGA_DEVICE(0x3577, &intel_i830_info),		/* I830_M */
	INTEL_VGA_DEVICE(0x2562, &intel_845g_info),		/* 845_G */
	INTEL_VGA_DEVICE(0x3582, &intel_i85x_info),		/* I855_GM */
186
	INTEL_VGA_DEVICE(0x358e, &intel_i85x_info),
187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
	INTEL_VGA_DEVICE(0x2572, &intel_i865g_info),		/* I865_G */
	INTEL_VGA_DEVICE(0x2582, &intel_i915g_info),		/* I915_G */
	INTEL_VGA_DEVICE(0x258a, &intel_i915g_info),		/* E7221_G */
	INTEL_VGA_DEVICE(0x2592, &intel_i915gm_info),		/* I915_GM */
	INTEL_VGA_DEVICE(0x2772, &intel_i945g_info),		/* I945_G */
	INTEL_VGA_DEVICE(0x27a2, &intel_i945gm_info),		/* I945_GM */
	INTEL_VGA_DEVICE(0x27ae, &intel_i945gm_info),		/* I945_GME */
	INTEL_VGA_DEVICE(0x2972, &intel_i965g_info),		/* I946_GZ */
	INTEL_VGA_DEVICE(0x2982, &intel_i965g_info),		/* G35_G */
	INTEL_VGA_DEVICE(0x2992, &intel_i965g_info),		/* I965_Q */
	INTEL_VGA_DEVICE(0x29a2, &intel_i965g_info),		/* I965_G */
	INTEL_VGA_DEVICE(0x29b2, &intel_g33_info),		/* Q35_G */
	INTEL_VGA_DEVICE(0x29c2, &intel_g33_info),		/* G33_G */
	INTEL_VGA_DEVICE(0x29d2, &intel_g33_info),		/* Q33_G */
	INTEL_VGA_DEVICE(0x2a02, &intel_i965gm_info),		/* I965_GM */
	INTEL_VGA_DEVICE(0x2a12, &intel_i965gm_info),		/* I965_GME */
	INTEL_VGA_DEVICE(0x2a42, &intel_gm45_info),		/* GM45_G */
	INTEL_VGA_DEVICE(0x2e02, &intel_g45_info),		/* IGD_E_G */
	INTEL_VGA_DEVICE(0x2e12, &intel_g45_info),		/* Q45_G */
	INTEL_VGA_DEVICE(0x2e22, &intel_g45_info),		/* G45_G */
	INTEL_VGA_DEVICE(0x2e32, &intel_g45_info),		/* G41_G */
	INTEL_VGA_DEVICE(0x2e42, &intel_g45_info),		/* B43_G */
209
	INTEL_VGA_DEVICE(0x2e92, &intel_g45_info),		/* B43_G.1 */
210 211 212 213
	INTEL_VGA_DEVICE(0xa001, &intel_pineview_info),
	INTEL_VGA_DEVICE(0xa011, &intel_pineview_info),
	INTEL_VGA_DEVICE(0x0042, &intel_ironlake_d_info),
	INTEL_VGA_DEVICE(0x0046, &intel_ironlake_m_info),
214
	INTEL_VGA_DEVICE(0x0102, &intel_sandybridge_d_info),
215 216
	INTEL_VGA_DEVICE(0x0112, &intel_sandybridge_d_info),
	INTEL_VGA_DEVICE(0x0122, &intel_sandybridge_d_info),
217
	INTEL_VGA_DEVICE(0x0106, &intel_sandybridge_m_info),
218
	INTEL_VGA_DEVICE(0x0116, &intel_sandybridge_m_info),
219
	INTEL_VGA_DEVICE(0x0126, &intel_sandybridge_m_info),
220
	INTEL_VGA_DEVICE(0x010A, &intel_sandybridge_d_info),
221
	{0, 0, 0}
L
Linus Torvalds 已提交
222 223
};

J
Jesse Barnes 已提交
224 225 226 227
#if defined(CONFIG_DRM_I915_KMS)
MODULE_DEVICE_TABLE(pci, pciidlist);
#endif

228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
#define INTEL_PCH_DEVICE_ID_MASK	0xff00
#define INTEL_PCH_CPT_DEVICE_ID_TYPE	0x1c00

void intel_detect_pch (struct drm_device *dev)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct pci_dev *pch;

	/*
	 * The reason to probe ISA bridge instead of Dev31:Fun0 is to
	 * make graphics device passthrough work easy for VMM, that only
	 * need to expose ISA bridge to let driver know the real hardware
	 * underneath. This is a requirement from virtualization team.
	 */
	pch = pci_get_class(PCI_CLASS_BRIDGE_ISA << 8, NULL);
	if (pch) {
		if (pch->vendor == PCI_VENDOR_ID_INTEL) {
			int id;
			id = pch->device & INTEL_PCH_DEVICE_ID_MASK;

			if (id == INTEL_PCH_CPT_DEVICE_ID_TYPE) {
				dev_priv->pch_type = PCH_CPT;
				DRM_DEBUG_KMS("Found CougarPoint PCH\n");
			}
		}
		pci_dev_put(pch);
	}
}

257
void __gen6_gt_force_wake_get(struct drm_i915_private *dev_priv)
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
{
	int count;

	count = 0;
	while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1))
		udelay(10);

	I915_WRITE_NOTRACE(FORCEWAKE, 1);
	POSTING_READ(FORCEWAKE);

	count = 0;
	while (count++ < 50 && (I915_READ_NOTRACE(FORCEWAKE_ACK) & 1) == 0)
		udelay(10);
}

273
void __gen6_gt_force_wake_put(struct drm_i915_private *dev_priv)
274 275 276 277 278
{
	I915_WRITE_NOTRACE(FORCEWAKE, 0);
	POSTING_READ(FORCEWAKE);
}

279 280 281 282 283 284 285 286 287 288
void __gen6_gt_wait_for_fifo(struct drm_i915_private *dev_priv)
{
	int loop = 500;
	u32 fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES);
	while (fifo < 20 && loop--) {
		udelay(10);
		fifo = I915_READ_NOTRACE(GT_FIFO_FREE_ENTRIES);
	}
}

289
static int i915_drm_freeze(struct drm_device *dev)
J
Jesse Barnes 已提交
290
{
291 292
	struct drm_i915_private *dev_priv = dev->dev_private;

293 294
	drm_kms_helper_poll_disable(dev);

J
Jesse Barnes 已提交
295 296
	pci_save_state(dev->pdev);

297
	/* If KMS is active, we do the leavevt stuff here */
298
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
299 300
		int error = i915_gem_idle(dev);
		if (error) {
301
			dev_err(&dev->pdev->dev,
302 303 304
				"GEM idle failed, resume might fail\n");
			return error;
		}
305
		drm_irq_uninstall(dev);
306 307
	}

308 309
	i915_save_state(dev);

310
	intel_opregion_fini(dev);
311

312 313
	/* Modeset on resume, not lid events */
	dev_priv->modeset_on_lid = 0;
314 315

	return 0;
316 317
}

318
int i915_suspend(struct drm_device *dev, pm_message_t state)
319 320 321 322 323 324 325 326 327 328 329 330
{
	int error;

	if (!dev || !dev->dev_private) {
		DRM_ERROR("dev: %p\n", dev);
		DRM_ERROR("DRM not initialized, aborting suspend.\n");
		return -ENODEV;
	}

	if (state.event == PM_EVENT_PRETHAW)
		return 0;

331 332 333

	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
		return 0;
334

335 336 337 338
	error = i915_drm_freeze(dev);
	if (error)
		return error;

339 340 341 342 343
	if (state.event == PM_EVENT_SUSPEND) {
		/* Shut down the device */
		pci_disable_device(dev->pdev);
		pci_set_power_state(dev->pdev, PCI_D3hot);
	}
J
Jesse Barnes 已提交
344 345 346 347

	return 0;
}

348
static int i915_drm_thaw(struct drm_device *dev)
J
Jesse Barnes 已提交
349
{
350
	struct drm_i915_private *dev_priv = dev->dev_private;
351
	int error = 0;
352

353 354 355 356 357 358
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
		mutex_lock(&dev->struct_mutex);
		i915_gem_restore_gtt_mappings(dev);
		mutex_unlock(&dev->struct_mutex);
	}

359
	i915_restore_state(dev);
360
	intel_opregion_setup(dev);
361

362 363 364 365 366
	/* KMS EnterVT equivalent */
	if (drm_core_check_feature(dev, DRIVER_MODESET)) {
		mutex_lock(&dev->struct_mutex);
		dev_priv->mm.suspended = 0;

367
		error = i915_gem_init_ringbuffer(dev);
368
		mutex_unlock(&dev->struct_mutex);
369

370
		drm_mode_config_reset(dev);
371
		drm_irq_install(dev);
372

373 374
		/* Resume the modeset for every activated CRTC */
		drm_helper_resume_force_mode(dev);
375

C
Chris Wilson 已提交
376
		if (IS_IRONLAKE_M(dev))
J
Jesse Barnes 已提交
377 378
			ironlake_enable_rc6(dev);
	}
379

380 381
	intel_opregion_init(dev);

382
	dev_priv->modeset_on_lid = 0;
383

384 385 386
	return error;
}

387
int i915_resume(struct drm_device *dev)
388
{
389 390
	int ret;

391 392 393
	if (dev->switch_power_state == DRM_SWITCH_POWER_OFF)
		return 0;

394 395 396 397 398
	if (pci_enable_device(dev->pdev))
		return -EIO;

	pci_set_master(dev->pdev);

399 400 401 402 403 404
	ret = i915_drm_thaw(dev);
	if (ret)
		return ret;

	drm_kms_helper_poll_enable(dev);
	return 0;
J
Jesse Barnes 已提交
405 406
}

407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436
static int i8xx_do_reset(struct drm_device *dev, u8 flags)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	if (IS_I85X(dev))
		return -ENODEV;

	I915_WRITE(D_STATE, I915_READ(D_STATE) | DSTATE_GFX_RESET_I830);
	POSTING_READ(D_STATE);

	if (IS_I830(dev) || IS_845G(dev)) {
		I915_WRITE(DEBUG_RESET_I830,
			   DEBUG_RESET_DISPLAY |
			   DEBUG_RESET_RENDER |
			   DEBUG_RESET_FULL);
		POSTING_READ(DEBUG_RESET_I830);
		msleep(1);

		I915_WRITE(DEBUG_RESET_I830, 0);
		POSTING_READ(DEBUG_RESET_I830);
	}

	msleep(1);

	I915_WRITE(D_STATE, I915_READ(D_STATE) & ~DSTATE_GFX_RESET_I830);
	POSTING_READ(D_STATE);

	return 0;
}

437 438 439
static int i965_reset_complete(struct drm_device *dev)
{
	u8 gdrst;
440
	pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
441 442 443
	return gdrst & 0x1;
}

444 445 446 447
static int i965_do_reset(struct drm_device *dev, u8 flags)
{
	u8 gdrst;

448 449 450 451 452
	/*
	 * Set the domains we want to reset (GRDOM/bits 2 and 3) as
	 * well as the reset bit (GR/bit 0).  Setting the GR bit
	 * triggers the reset; when done, the hardware will clear it.
	 */
453 454 455 456 457 458 459 460 461 462 463 464
	pci_read_config_byte(dev->pdev, I965_GDRST, &gdrst);
	pci_write_config_byte(dev->pdev, I965_GDRST, gdrst | flags | 0x1);

	return wait_for(i965_reset_complete(dev), 500);
}

static int ironlake_do_reset(struct drm_device *dev, u8 flags)
{
	struct drm_i915_private *dev_priv = dev->dev_private;
	u32 gdrst = I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR);
	I915_WRITE(MCHBAR_MIRROR_BASE + ILK_GDSR, gdrst | flags | 0x1);
	return wait_for(I915_READ(MCHBAR_MIRROR_BASE + ILK_GDSR) & 0x1, 500);
J
Jesse Barnes 已提交
465 466
}

467 468 469 470 471 472 473 474
static int gen6_do_reset(struct drm_device *dev, u8 flags)
{
	struct drm_i915_private *dev_priv = dev->dev_private;

	I915_WRITE(GEN6_GDRST, GEN6_GRDOM_FULL);
	return wait_for((I915_READ(GEN6_GDRST) & GEN6_GRDOM_FULL) == 0, 500);
}

475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490
/**
 * i965_reset - reset chip after a hang
 * @dev: drm device to reset
 * @flags: reset domains
 *
 * Reset the chip.  Useful if a hang is detected. Returns zero on successful
 * reset or otherwise an error code.
 *
 * Procedure is fairly simple:
 *   - reset the chip using the reset reg
 *   - re-init context state
 *   - re-init hardware status page
 *   - re-init ring buffer
 *   - re-init interrupt state
 *   - re-init display
 */
491
int i915_reset(struct drm_device *dev, u8 flags)
492 493 494 495 496 497 498
{
	drm_i915_private_t *dev_priv = dev->dev_private;
	/*
	 * We really should only reset the display subsystem if we actually
	 * need to
	 */
	bool need_display = true;
499
	int ret;
500

C
Chris Wilson 已提交
501 502 503
	if (!i915_try_reset)
		return 0;

504 505
	if (!mutex_trylock(&dev->struct_mutex))
		return -EBUSY;
506

507
	i915_gem_reset(dev);
508

509
	ret = -ENODEV;
510 511 512
	if (get_seconds() - dev_priv->last_gpu_reset < 5) {
		DRM_ERROR("GPU hanging too fast, declaring wedged!\n");
	} else switch (INTEL_INFO(dev)->gen) {
513 514 515
	case 6:
		ret = gen6_do_reset(dev, flags);
		break;
516
	case 5:
517
		ret = ironlake_do_reset(dev, flags);
518 519
		break;
	case 4:
520
		ret = i965_do_reset(dev, flags);
521
		break;
522 523 524
	case 2:
		ret = i8xx_do_reset(dev, flags);
		break;
525
	}
526
	dev_priv->last_gpu_reset = get_seconds();
527
	if (ret) {
528
		DRM_ERROR("Failed to reset chip.\n");
529
		mutex_unlock(&dev->struct_mutex);
530
		return ret;
531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547
	}

	/* Ok, now get things going again... */

	/*
	 * Everything depends on having the GTT running, so we need to start
	 * there.  Fortunately we don't need to do this unless we reset the
	 * chip at a PCI level.
	 *
	 * Next we need to restore the context, but we don't use those
	 * yet either...
	 *
	 * Ring buffer needs to be re-initialized in the KMS case, or if X
	 * was running at the time of the reset (i.e. we weren't VT
	 * switched away).
	 */
	if (drm_core_check_feature(dev, DRIVER_MODESET) ||
548
			!dev_priv->mm.suspended) {
549
		dev_priv->mm.suspended = 0;
550

551
		dev_priv->ring[RCS].init(&dev_priv->ring[RCS]);
552
		if (HAS_BSD(dev))
553
		    dev_priv->ring[VCS].init(&dev_priv->ring[VCS]);
554
		if (HAS_BLT(dev))
555
		    dev_priv->ring[BCS].init(&dev_priv->ring[BCS]);
556

557 558
		mutex_unlock(&dev->struct_mutex);
		drm_irq_uninstall(dev);
559
		drm_mode_config_reset(dev);
560 561 562 563
		drm_irq_install(dev);
		mutex_lock(&dev->struct_mutex);
	}

564 565
	mutex_unlock(&dev->struct_mutex);

566
	/*
567 568 569
	 * Perform a full modeset as on later generations, e.g. Ironlake, we may
	 * need to retrain the display link and cannot just restore the register
	 * values.
570
	 */
571 572 573 574 575
	if (need_display) {
		mutex_lock(&dev->mode_config.mutex);
		drm_helper_resume_force_mode(dev);
		mutex_unlock(&dev->mode_config.mutex);
	}
576 577 578 579 580

	return 0;
}


581 582 583
static int __devinit
i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
584 585 586 587 588 589 590 591
	/* Only bind to function 0 of the device. Early generations
	 * used function 1 as a placeholder for multi-head. This causes
	 * us confusion instead, especially on the systems where both
	 * functions have the same PCI-ID!
	 */
	if (PCI_FUNC(pdev->devfn))
		return -ENODEV;

592
	return drm_get_pci_dev(pdev, ent, &driver);
593 594 595 596 597 598 599 600 601 602
}

static void
i915_pci_remove(struct pci_dev *pdev)
{
	struct drm_device *dev = pci_get_drvdata(pdev);

	drm_put_dev(dev);
}

603
static int i915_pm_suspend(struct device *dev)
604
{
605 606 607
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
	int error;
608

609 610 611 612
	if (!drm_dev || !drm_dev->dev_private) {
		dev_err(dev, "DRM not initialized, aborting suspend.\n");
		return -ENODEV;
	}
613

614 615 616
	if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF)
		return 0;

617 618 619
	error = i915_drm_freeze(drm_dev);
	if (error)
		return error;
620

621 622
	pci_disable_device(pdev);
	pci_set_power_state(pdev, PCI_D3hot);
623

624
	return 0;
625 626
}

627
static int i915_pm_resume(struct device *dev)
628
{
629 630 631 632
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);

	return i915_resume(drm_dev);
633 634
}

635
static int i915_pm_freeze(struct device *dev)
636
{
637 638 639 640 641 642 643 644 645
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);

	if (!drm_dev || !drm_dev->dev_private) {
		dev_err(dev, "DRM not initialized, aborting suspend.\n");
		return -ENODEV;
	}

	return i915_drm_freeze(drm_dev);
646 647
}

648
static int i915_pm_thaw(struct device *dev)
649
{
650 651 652 653
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);

	return i915_drm_thaw(drm_dev);
654 655
}

656
static int i915_pm_poweroff(struct device *dev)
657
{
658 659 660
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);

661
	return i915_drm_freeze(drm_dev);
662 663
}

664
static const struct dev_pm_ops i915_pm_ops = {
665 666 667 668 669
     .suspend = i915_pm_suspend,
     .resume = i915_pm_resume,
     .freeze = i915_pm_freeze,
     .thaw = i915_pm_thaw,
     .poweroff = i915_pm_poweroff,
670
     .restore = i915_pm_resume,
671 672
};

673 674
static struct vm_operations_struct i915_gem_vm_ops = {
	.fault = i915_gem_fault,
675 676
	.open = drm_gem_vm_open,
	.close = drm_gem_vm_close,
677 678
};

L
Linus Torvalds 已提交
679
static struct drm_driver driver = {
D
Dave Airlie 已提交
680 681 682
	/* don't use mtrr's here, the Xserver or user space app should
	 * deal with them for intel hardware.
	 */
683 684 685
	.driver_features =
	    DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/
	    DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM,
686
	.load = i915_driver_load,
J
Jesse Barnes 已提交
687
	.unload = i915_driver_unload,
688
	.open = i915_driver_open,
689 690
	.lastclose = i915_driver_lastclose,
	.preclose = i915_driver_preclose,
691
	.postclose = i915_driver_postclose,
692 693 694 695 696

	/* Used in place of i915_pm_ops for non-DRIVER_MODESET */
	.suspend = i915_suspend,
	.resume = i915_resume,

697
	.device_is_agp = i915_driver_device_is_agp,
698 699
	.enable_vblank = i915_enable_vblank,
	.disable_vblank = i915_disable_vblank,
700 701
	.get_vblank_timestamp = i915_get_vblank_timestamp,
	.get_scanout_position = i915_get_crtc_scanoutpos,
L
Linus Torvalds 已提交
702 703 704 705 706
	.irq_preinstall = i915_driver_irq_preinstall,
	.irq_postinstall = i915_driver_irq_postinstall,
	.irq_uninstall = i915_driver_irq_uninstall,
	.irq_handler = i915_driver_irq_handler,
	.reclaim_buffers = drm_core_reclaim_buffers,
707 708
	.master_create = i915_master_create,
	.master_destroy = i915_master_destroy,
709
#if defined(CONFIG_DEBUG_FS)
710 711
	.debugfs_init = i915_debugfs_init,
	.debugfs_cleanup = i915_debugfs_cleanup,
712
#endif
713 714
	.gem_init_object = i915_gem_init_object,
	.gem_free_object = i915_gem_free_object,
715
	.gem_vm_ops = &i915_gem_vm_ops,
L
Linus Torvalds 已提交
716 717
	.ioctls = i915_ioctls,
	.fops = {
D
Dave Airlie 已提交
718 719 720
		 .owner = THIS_MODULE,
		 .open = drm_open,
		 .release = drm_release,
721
		 .unlocked_ioctl = drm_ioctl,
722
		 .mmap = drm_gem_mmap,
D
Dave Airlie 已提交
723 724
		 .poll = drm_poll,
		 .fasync = drm_fasync,
725
		 .read = drm_read,
726
#ifdef CONFIG_COMPAT
D
Dave Airlie 已提交
727
		 .compat_ioctl = i915_compat_ioctl,
728
#endif
A
Arnd Bergmann 已提交
729
		 .llseek = noop_llseek,
730 731
	},

L
Linus Torvalds 已提交
732
	.pci_driver = {
733 734
		 .name = DRIVER_NAME,
		 .id_table = pciidlist,
735 736
		 .probe = i915_pci_probe,
		 .remove = i915_pci_remove,
737
		 .driver.pm = &i915_pm_ops,
738
	},
D
Dave Airlie 已提交
739

740 741 742 743 744 745
	.name = DRIVER_NAME,
	.desc = DRIVER_DESC,
	.date = DRIVER_DATE,
	.major = DRIVER_MAJOR,
	.minor = DRIVER_MINOR,
	.patchlevel = DRIVER_PATCHLEVEL,
L
Linus Torvalds 已提交
746 747 748 749
};

static int __init i915_init(void)
{
750 751 752 753 754
	if (!intel_agp_enabled) {
		DRM_ERROR("drm/i915 can't work without intel_agp module!\n");
		return -ENODEV;
	}

L
Linus Torvalds 已提交
755
	driver.num_ioctls = i915_max_ioctl;
J
Jesse Barnes 已提交
756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777

	/*
	 * If CONFIG_DRM_I915_KMS is set, default to KMS unless
	 * explicitly disabled with the module pararmeter.
	 *
	 * Otherwise, just follow the parameter (defaulting to off).
	 *
	 * Allow optional vga_text_mode_force boot option to override
	 * the default behavior.
	 */
#if defined(CONFIG_DRM_I915_KMS)
	if (i915_modeset != 0)
		driver.driver_features |= DRIVER_MODESET;
#endif
	if (i915_modeset == 1)
		driver.driver_features |= DRIVER_MODESET;

#ifdef CONFIG_VGA_CONSOLE
	if (vgacon_text_force() && i915_modeset == -1)
		driver.driver_features &= ~DRIVER_MODESET;
#endif

778 779 780
	if (!(driver.driver_features & DRIVER_MODESET))
		driver.get_vblank_timestamp = NULL;

L
Linus Torvalds 已提交
781 782 783 784 785 786 787 788 789 790 791
	return drm_init(&driver);
}

static void __exit i915_exit(void)
{
	drm_exit(&driver);
}

module_init(i915_init);
module_exit(i915_exit);

D
Dave Airlie 已提交
792 793
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
L
Linus Torvalds 已提交
794
MODULE_LICENSE("GPL and additional rights");