i915_pci.c 27.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * Copyright © 2016 Intel Corporation
 *
 * 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, sublicense,
 * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS 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.
 *
 */

25
#include <linux/console.h>
26 27
#include <linux/vga_switcheroo.h>

28
#include <drm/drm_drv.h>
29
#include <drm/i915_pciids.h>
30

31 32
#include "display/intel_fbdev.h"

33
#include "i915_drv.h"
34
#include "i915_perf.h"
35
#include "i915_globals.h"
36
#include "i915_selftest.h"
37

38
#define PLATFORM(x) .platform = (x)
39 40
#define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)

41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
#define I845_PIPE_OFFSETS \
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET,	\
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
	}

#define I9XX_PIPE_OFFSETS \
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET,	\
		[TRANSCODER_B] = PIPE_B_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
	}

#define IVB_PIPE_OFFSETS \
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET,	\
		[TRANSCODER_B] = PIPE_B_OFFSET, \
		[TRANSCODER_C] = PIPE_C_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
	}

#define HSW_PIPE_OFFSETS \
72 73 74 75 76 77 78 79 80 81 82 83
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET,	\
		[TRANSCODER_B] = PIPE_B_OFFSET, \
		[TRANSCODER_C] = PIPE_C_OFFSET, \
		[TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
		[TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
	}
84

85
#define CHV_PIPE_OFFSETS \
86 87 88 89 90 91 92 93 94 95
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET, \
		[TRANSCODER_B] = PIPE_B_OFFSET, \
		[TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
		[TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
	}
96

97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
#define I845_CURSOR_OFFSETS \
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
	}

#define I9XX_CURSOR_OFFSETS \
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
		[PIPE_B] = CURSOR_B_OFFSET, \
	}

#define CHV_CURSOR_OFFSETS \
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
		[PIPE_B] = CURSOR_B_OFFSET, \
		[PIPE_C] = CHV_CURSOR_C_OFFSET, \
	}
114 115

#define IVB_CURSOR_OFFSETS \
116 117 118 119 120
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
		[PIPE_B] = IVB_CURSOR_B_OFFSET, \
		[PIPE_C] = IVB_CURSOR_C_OFFSET, \
	}
121

122 123 124 125 126 127 128 129
#define TGL_CURSOR_OFFSETS \
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
		[PIPE_B] = IVB_CURSOR_B_OFFSET, \
		[PIPE_C] = IVB_CURSOR_C_OFFSET, \
		[PIPE_D] = TGL_CURSOR_D_OFFSET, \
	}

130 131
#define I9XX_COLORS \
	.color = { .gamma_lut_size = 256 }
132 133 134 135
#define I965_COLORS \
	.color = { .gamma_lut_size = 129, \
		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
	}
136 137
#define ILK_COLORS \
	.color = { .gamma_lut_size = 1024 }
138
#define IVB_COLORS \
139
	.color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
140
#define CHV_COLORS \
141 142 143 144
	.color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
	}
R
Rodrigo Vivi 已提交
145
#define GLK_COLORS \
146
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
147 148 149
		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
					DRM_COLOR_LUT_EQUAL_CHANNELS, \
	}
150

151
/* Keep in gen based order, and chronological order within a gen */
152 153 154 155

#define GEN_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K

M
Matthew Auld 已提交
156
#define GEN_DEFAULT_REGIONS \
M
Matthew Auld 已提交
157
	.memory_regions = REGION_SMEM | REGION_STOLEN
M
Matthew Auld 已提交
158

159 160 161
#define I830_FEATURES \
	GEN(2), \
	.is_mobile = 1, \
162
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
163
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
164 165 166 167 168 169 170 171 172 173
	.display.has_overlay = 1, \
	.display.cursor_needs_physical = 1, \
	.display.overlay_needs_physical = 1, \
	.display.has_gmch = 1, \
	.gpu_reset_clobbers_display = true, \
	.hws_needs_physical = 1, \
	.unfenced_needs_alignment = 1, \
	.engine_mask = BIT(RCS0), \
	.has_snoop = true, \
	.has_coherent_ggtt = false, \
174
	.dma_mask_size = 32, \
175 176
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
177
	I9XX_COLORS, \
M
Matthew Auld 已提交
178 179
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
180 181

#define I845_FEATURES \
182
	GEN(2), \
183
	.pipe_mask = BIT(PIPE_A), \
184
	.cpu_transcoder_mask = BIT(TRANSCODER_A), \
185 186
	.display.has_overlay = 1, \
	.display.overlay_needs_physical = 1, \
R
Rodrigo Vivi 已提交
187
	.display.has_gmch = 1, \
188
	.gpu_reset_clobbers_display = true, \
189
	.hws_needs_physical = 1, \
190
	.unfenced_needs_alignment = 1, \
191
	.engine_mask = BIT(RCS0), \
192
	.has_snoop = true, \
193
	.has_coherent_ggtt = false, \
194
	.dma_mask_size = 32, \
195 196
	I845_PIPE_OFFSETS, \
	I845_CURSOR_OFFSETS, \
197
	I9XX_COLORS, \
M
Matthew Auld 已提交
198 199
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
200

201
static const struct intel_device_info i830_info = {
202
	I830_FEATURES,
203
	PLATFORM(INTEL_I830),
204 205
};

206
static const struct intel_device_info i845g_info = {
207
	I845_FEATURES,
208
	PLATFORM(INTEL_I845G),
209 210
};

211
static const struct intel_device_info i85x_info = {
212
	I830_FEATURES,
213
	PLATFORM(INTEL_I85X),
214
	.display.has_fbc = 1,
215 216
};

217
static const struct intel_device_info i865g_info = {
218
	I845_FEATURES,
219
	PLATFORM(INTEL_I865G),
220 221
};

222
#define GEN3_FEATURES \
223
	GEN(3), \
224
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
225
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
R
Rodrigo Vivi 已提交
226
	.display.has_gmch = 1, \
227
	.gpu_reset_clobbers_display = true, \
228
	.engine_mask = BIT(RCS0), \
229
	.has_snoop = true, \
230
	.has_coherent_ggtt = true, \
231
	.dma_mask_size = 32, \
232 233
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
234
	I9XX_COLORS, \
M
Matthew Auld 已提交
235 236
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
237

238
static const struct intel_device_info i915g_info = {
239
	GEN3_FEATURES,
240
	PLATFORM(INTEL_I915G),
241
	.has_coherent_ggtt = false,
242 243 244
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
245
	.hws_needs_physical = 1,
246
	.unfenced_needs_alignment = 1,
247
};
248

249
static const struct intel_device_info i915gm_info = {
250
	GEN3_FEATURES,
251
	PLATFORM(INTEL_I915GM),
252
	.is_mobile = 1,
253 254 255 256 257
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
	.display.supports_tv = 1,
	.display.has_fbc = 1,
258
	.hws_needs_physical = 1,
259
	.unfenced_needs_alignment = 1,
260
};
261

262
static const struct intel_device_info i945g_info = {
263
	GEN3_FEATURES,
264
	PLATFORM(INTEL_I945G),
265 266 267 268
	.display.has_hotplug = 1,
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
269
	.hws_needs_physical = 1,
270
	.unfenced_needs_alignment = 1,
271
};
272

273
static const struct intel_device_info i945gm_info = {
274
	GEN3_FEATURES,
275 276
	PLATFORM(INTEL_I945GM),
	.is_mobile = 1,
277 278 279 280 281 282
	.display.has_hotplug = 1,
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
	.display.supports_tv = 1,
	.display.has_fbc = 1,
283
	.hws_needs_physical = 1,
284
	.unfenced_needs_alignment = 1,
285 286
};

287
static const struct intel_device_info g33_info = {
288
	GEN3_FEATURES,
289
	PLATFORM(INTEL_G33),
290 291
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
292
	.dma_mask_size = 36,
293 294
};

295
static const struct intel_device_info pnv_g_info = {
296 297 298 299
	GEN3_FEATURES,
	PLATFORM(INTEL_PINEVIEW),
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
300
	.dma_mask_size = 36,
301 302
};

303
static const struct intel_device_info pnv_m_info = {
304
	GEN3_FEATURES,
305 306
	PLATFORM(INTEL_PINEVIEW),
	.is_mobile = 1,
307 308
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
309
	.dma_mask_size = 36,
310 311
};

312
#define GEN4_FEATURES \
313
	GEN(4), \
314
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
315
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
316
	.display.has_hotplug = 1, \
R
Rodrigo Vivi 已提交
317
	.display.has_gmch = 1, \
318
	.gpu_reset_clobbers_display = true, \
319
	.engine_mask = BIT(RCS0), \
320
	.has_snoop = true, \
321
	.has_coherent_ggtt = true, \
322
	.dma_mask_size = 36, \
323 324
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
325
	I965_COLORS, \
M
Matthew Auld 已提交
326 327
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
328

329
static const struct intel_device_info i965g_info = {
330
	GEN4_FEATURES,
331
	PLATFORM(INTEL_I965G),
332
	.display.has_overlay = 1,
333
	.hws_needs_physical = 1,
334
	.has_snoop = false,
335 336
};

337
static const struct intel_device_info i965gm_info = {
338
	GEN4_FEATURES,
339
	PLATFORM(INTEL_I965GM),
340 341 342 343
	.is_mobile = 1,
	.display.has_fbc = 1,
	.display.has_overlay = 1,
	.display.supports_tv = 1,
344
	.hws_needs_physical = 1,
345
	.has_snoop = false,
346 347
};

348
static const struct intel_device_info g45_info = {
349
	GEN4_FEATURES,
350
	PLATFORM(INTEL_G45),
351
	.engine_mask = BIT(RCS0) | BIT(VCS0),
352
	.gpu_reset_clobbers_display = false,
353 354
};

355
static const struct intel_device_info gm45_info = {
356
	GEN4_FEATURES,
357
	PLATFORM(INTEL_GM45),
358 359 360
	.is_mobile = 1,
	.display.has_fbc = 1,
	.display.supports_tv = 1,
361
	.engine_mask = BIT(RCS0) | BIT(VCS0),
362
	.gpu_reset_clobbers_display = false,
363 364
};

365
#define GEN5_FEATURES \
366
	GEN(5), \
367
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
368
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
369
	.display.has_hotplug = 1, \
370
	.engine_mask = BIT(RCS0) | BIT(VCS0), \
371
	.has_snoop = true, \
372
	.has_coherent_ggtt = true, \
373 374
	/* ilk does support rc6, but we do not implement [power] contexts */ \
	.has_rc6 = 0, \
375
	.dma_mask_size = 36, \
376 377
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
378
	ILK_COLORS, \
M
Matthew Auld 已提交
379 380
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
381

382
static const struct intel_device_info ilk_d_info = {
383
	GEN5_FEATURES,
384
	PLATFORM(INTEL_IRONLAKE),
385 386
};

387
static const struct intel_device_info ilk_m_info = {
388
	GEN5_FEATURES,
389
	PLATFORM(INTEL_IRONLAKE),
390 391
	.is_mobile = 1,
	.display.has_fbc = 1,
392 393
};

394
#define GEN6_FEATURES \
395
	GEN(6), \
396
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
397
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
398 399
	.display.has_hotplug = 1, \
	.display.has_fbc = 1, \
400
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
401
	.has_coherent_ggtt = true, \
402
	.has_llc = 1, \
403
	.has_rc6 = 1, \
404
	.has_rc6p = 1, \
405
	.has_rps = true, \
406
	.dma_mask_size = 40, \
407 408
	.ppgtt_type = INTEL_PPGTT_ALIASING, \
	.ppgtt_size = 31, \
409 410
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
411
	ILK_COLORS, \
M
Matthew Auld 已提交
412 413
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
414

415 416
#define SNB_D_PLATFORM \
	GEN6_FEATURES, \
417
	PLATFORM(INTEL_SANDYBRIDGE)
418

419
static const struct intel_device_info snb_d_gt1_info = {
420 421
	SNB_D_PLATFORM,
	.gt = 1,
422 423
};

424
static const struct intel_device_info snb_d_gt2_info = {
425 426 427 428 429 430
	SNB_D_PLATFORM,
	.gt = 2,
};

#define SNB_M_PLATFORM \
	GEN6_FEATURES, \
431
	PLATFORM(INTEL_SANDYBRIDGE), \
432 433 434
	.is_mobile = 1


435
static const struct intel_device_info snb_m_gt1_info = {
436 437 438 439
	SNB_M_PLATFORM,
	.gt = 1,
};

440
static const struct intel_device_info snb_m_gt2_info = {
441 442
	SNB_M_PLATFORM,
	.gt = 2,
443 444 445
};

#define GEN7_FEATURES  \
446
	GEN(7), \
447
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
448
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), \
449 450
	.display.has_hotplug = 1, \
	.display.has_fbc = 1, \
451
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
452
	.has_coherent_ggtt = true, \
453
	.has_llc = 1, \
454
	.has_rc6 = 1, \
455
	.has_rc6p = 1, \
456
	.has_rps = true, \
457
	.dma_mask_size = 40, \
458
	.ppgtt_type = INTEL_PPGTT_ALIASING, \
459
	.ppgtt_size = 31, \
460 461
	IVB_PIPE_OFFSETS, \
	IVB_CURSOR_OFFSETS, \
462
	IVB_COLORS, \
M
Matthew Auld 已提交
463 464
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
465

466 467
#define IVB_D_PLATFORM \
	GEN7_FEATURES, \
468
	PLATFORM(INTEL_IVYBRIDGE), \
469 470
	.has_l3_dpf = 1

471
static const struct intel_device_info ivb_d_gt1_info = {
472 473
	IVB_D_PLATFORM,
	.gt = 1,
474 475
};

476
static const struct intel_device_info ivb_d_gt2_info = {
477 478 479 480 481 482
	IVB_D_PLATFORM,
	.gt = 2,
};

#define IVB_M_PLATFORM \
	GEN7_FEATURES, \
483
	PLATFORM(INTEL_IVYBRIDGE), \
484 485 486
	.is_mobile = 1, \
	.has_l3_dpf = 1

487
static const struct intel_device_info ivb_m_gt1_info = {
488 489 490 491
	IVB_M_PLATFORM,
	.gt = 1,
};

492
static const struct intel_device_info ivb_m_gt2_info = {
493 494
	IVB_M_PLATFORM,
	.gt = 2,
495 496
};

497
static const struct intel_device_info ivb_q_info = {
498
	GEN7_FEATURES,
499
	PLATFORM(INTEL_IVYBRIDGE),
500
	.gt = 2,
501
	.pipe_mask = 0, /* legal, last one wins */
502
	.cpu_transcoder_mask = 0,
503
	.has_l3_dpf = 1,
504 505
};

506
static const struct intel_device_info vlv_info = {
507
	PLATFORM(INTEL_VALLEYVIEW),
508
	GEN(7),
509
	.is_lp = 1,
510
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
511
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B),
512 513
	.has_runtime_pm = 1,
	.has_rc6 = 1,
514
	.has_rps = true,
R
Rodrigo Vivi 已提交
515
	.display.has_gmch = 1,
516
	.display.has_hotplug = 1,
517
	.dma_mask_size = 40,
518
	.ppgtt_type = INTEL_PPGTT_ALIASING,
519
	.ppgtt_size = 31,
520
	.has_snoop = true,
521
	.has_coherent_ggtt = false,
522
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
523
	.display_mmio_offset = VLV_DISPLAY_BASE,
524 525
	I9XX_PIPE_OFFSETS,
	I9XX_CURSOR_OFFSETS,
526
	I965_COLORS,
527
	GEN_DEFAULT_PAGE_SIZES,
M
Matthew Auld 已提交
528
	GEN_DEFAULT_REGIONS,
529 530
};

531
#define G75_FEATURES  \
532
	GEN7_FEATURES, \
533
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
534 535
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), \
536
	.display.has_ddi = 1, \
537
	.has_fpga_dbg = 1, \
538
	.display.has_psr = 1, \
539
	.display.has_psr_hw_tracking = 1, \
540
	.display.has_dp_mst = 1, \
541
	.has_rc6p = 0 /* RC6p removed-by HSW */, \
542
	HSW_PIPE_OFFSETS, \
543
	.has_runtime_pm = 1
544

545
#define HSW_PLATFORM \
546
	G75_FEATURES, \
547
	PLATFORM(INTEL_HASWELL), \
548 549
	.has_l3_dpf = 1

550
static const struct intel_device_info hsw_gt1_info = {
551 552 553 554
	HSW_PLATFORM,
	.gt = 1,
};

555
static const struct intel_device_info hsw_gt2_info = {
556 557 558 559
	HSW_PLATFORM,
	.gt = 2,
};

560
static const struct intel_device_info hsw_gt3_info = {
561 562
	HSW_PLATFORM,
	.gt = 3,
563 564
};

565 566
#define GEN8_FEATURES \
	G75_FEATURES, \
567
	GEN(8), \
568
	.has_logical_ring_contexts = 1, \
569
	.dma_mask_size = 39, \
570
	.ppgtt_type = INTEL_PPGTT_FULL, \
571
	.ppgtt_size = 48, \
572 573
	.has_64bit_reloc = 1, \
	.has_reset_engine = 1
574

575
#define BDW_PLATFORM \
576
	GEN8_FEATURES, \
577
	PLATFORM(INTEL_BROADWELL)
578

579
static const struct intel_device_info bdw_gt1_info = {
580 581 582 583
	BDW_PLATFORM,
	.gt = 1,
};

584
static const struct intel_device_info bdw_gt2_info = {
585
	BDW_PLATFORM,
586 587 588
	.gt = 2,
};

589
static const struct intel_device_info bdw_rsvd_info = {
590 591 592 593 594
	BDW_PLATFORM,
	.gt = 3,
	/* According to the device ID those devices are GT3, they were
	 * previously treated as not GT3, keep it like that.
	 */
595 596
};

597
static const struct intel_device_info bdw_gt3_info = {
598
	BDW_PLATFORM,
599
	.gt = 3,
600 601
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
602 603
};

604
static const struct intel_device_info chv_info = {
605
	PLATFORM(INTEL_CHERRYVIEW),
606
	GEN(8),
607
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
608
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
609
	.display.has_hotplug = 1,
610
	.is_lp = 1,
611
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
612
	.has_64bit_reloc = 1,
613
	.has_runtime_pm = 1,
614
	.has_rc6 = 1,
615
	.has_rps = true,
616
	.has_logical_ring_contexts = 1,
R
Rodrigo Vivi 已提交
617
	.display.has_gmch = 1,
618
	.dma_mask_size = 39,
619
	.ppgtt_type = INTEL_PPGTT_FULL,
620
	.ppgtt_size = 32,
621
	.has_reset_engine = 1,
622
	.has_snoop = true,
623
	.has_coherent_ggtt = false,
624
	.display_mmio_offset = VLV_DISPLAY_BASE,
625 626
	CHV_PIPE_OFFSETS,
	CHV_CURSOR_OFFSETS,
627
	CHV_COLORS,
628
	GEN_DEFAULT_PAGE_SIZES,
M
Matthew Auld 已提交
629
	GEN_DEFAULT_REGIONS,
630 631
};

632
#define GEN9_DEFAULT_PAGE_SIZES \
633
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
634
		      I915_GTT_PAGE_SIZE_64K
635

636 637
#define GEN9_FEATURES \
	GEN8_FEATURES, \
638
	GEN(9), \
639
	GEN9_DEFAULT_PAGE_SIZES, \
C
Chris Wilson 已提交
640
	.has_logical_ring_preemption = 1, \
641
	.display.has_csr = 1, \
642
	.has_gt_uc = 1, \
643
	.display.has_hdcp = 1, \
644
	.display.has_ipc = 1, \
645 646
	.ddb_size = 896, \
	.num_supported_dbuf_slices = 1
647

648 649
#define SKL_PLATFORM \
	GEN9_FEATURES, \
650
	PLATFORM(INTEL_SKYLAKE)
651

652
static const struct intel_device_info skl_gt1_info = {
653
	SKL_PLATFORM,
654
	.gt = 1,
655 656
};

657
static const struct intel_device_info skl_gt2_info = {
658
	SKL_PLATFORM,
659 660 661 662 663
	.gt = 2,
};

#define SKL_GT3_PLUS_PLATFORM \
	SKL_PLATFORM, \
664 665
	.engine_mask = \
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
666 667


668
static const struct intel_device_info skl_gt3_info = {
669 670 671 672
	SKL_GT3_PLUS_PLATFORM,
	.gt = 3,
};

673
static const struct intel_device_info skl_gt4_info = {
674 675
	SKL_GT3_PLUS_PLATFORM,
	.gt = 4,
676 677
};

678
#define GEN9_LP_FEATURES \
679
	GEN(9), \
680
	.is_lp = 1, \
681
	.num_supported_dbuf_slices = 1, \
682
	.display.has_hotplug = 1, \
683
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
684
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
685 686 687
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
		BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \
688
	.has_64bit_reloc = 1, \
689
	.display.has_ddi = 1, \
690
	.has_fpga_dbg = 1, \
691
	.display.has_fbc = 1, \
692
	.display.has_hdcp = 1, \
693
	.display.has_psr = 1, \
694
	.display.has_psr_hw_tracking = 1, \
695
	.has_runtime_pm = 1, \
696
	.display.has_csr = 1, \
697
	.has_rc6 = 1, \
698
	.has_rps = true, \
699
	.display.has_dp_mst = 1, \
700
	.has_logical_ring_contexts = 1, \
C
Chris Wilson 已提交
701
	.has_logical_ring_preemption = 1, \
702
	.has_gt_uc = 1, \
703
	.dma_mask_size = 39, \
704
	.ppgtt_type = INTEL_PPGTT_FULL, \
705
	.ppgtt_size = 48, \
706
	.has_reset_engine = 1, \
707
	.has_snoop = true, \
708
	.has_coherent_ggtt = false, \
709
	.display.has_ipc = 1, \
710
	HSW_PIPE_OFFSETS, \
711
	IVB_CURSOR_OFFSETS, \
712
	IVB_COLORS, \
M
Matthew Auld 已提交
713 714
	GEN9_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
715

716
static const struct intel_device_info bxt_info = {
717
	GEN9_LP_FEATURES,
718
	PLATFORM(INTEL_BROXTON),
719
	.ddb_size = 512,
720 721
};

722
static const struct intel_device_info glk_info = {
723
	GEN9_LP_FEATURES,
724
	PLATFORM(INTEL_GEMINILAKE),
725
	.ddb_size = 1024,
R
Rodrigo Vivi 已提交
726
	GLK_COLORS,
727 728
};

729
#define KBL_PLATFORM \
730
	GEN9_FEATURES, \
731
	PLATFORM(INTEL_KABYLAKE)
732

733
static const struct intel_device_info kbl_gt1_info = {
734
	KBL_PLATFORM,
735 736 737
	.gt = 1,
};

738
static const struct intel_device_info kbl_gt2_info = {
739 740
	KBL_PLATFORM,
	.gt = 2,
741 742
};

743
static const struct intel_device_info kbl_gt3_info = {
744
	KBL_PLATFORM,
745
	.gt = 3,
746 747
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
748 749
};

750
#define CFL_PLATFORM \
751
	GEN9_FEATURES, \
752
	PLATFORM(INTEL_COFFEELAKE)
753

754
static const struct intel_device_info cfl_gt1_info = {
755 756 757 758
	CFL_PLATFORM,
	.gt = 1,
};

759
static const struct intel_device_info cfl_gt2_info = {
760
	CFL_PLATFORM,
761
	.gt = 2,
762 763
};

764
static const struct intel_device_info cfl_gt3_info = {
765
	CFL_PLATFORM,
766
	.gt = 3,
767 768
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
769 770
};

771 772 773 774 775 776 777 778 779 780 781 782 783 784
#define CML_PLATFORM \
	GEN9_FEATURES, \
	PLATFORM(INTEL_COMETLAKE)

static const struct intel_device_info cml_gt1_info = {
	CML_PLATFORM,
	.gt = 1,
};

static const struct intel_device_info cml_gt2_info = {
	CML_PLATFORM,
	.gt = 2,
};

785 786
#define GEN10_FEATURES \
	GEN9_FEATURES, \
787
	GEN(10), \
788
	.ddb_size = 1024, \
789
	.display.has_dsc = 1, \
790
	.has_coherent_ggtt = false, \
R
Rodrigo Vivi 已提交
791
	GLK_COLORS
792

793
static const struct intel_device_info cnl_info = {
794
	GEN10_FEATURES,
795
	PLATFORM(INTEL_CANNONLAKE),
796
	.gt = 2,
797 798
};

799 800 801 802 803
#define GEN11_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

804 805
#define GEN11_FEATURES \
	GEN10_FEATURES, \
806
	GEN11_DEFAULT_PAGE_SIZES, \
807 808 809
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET, \
		[TRANSCODER_B] = PIPE_B_OFFSET, \
		[TRANSCODER_C] = PIPE_C_OFFSET, \
		[TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
		[TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
	}, \
826
	GEN(11), \
827
	.ddb_size = 2048, \
828
	.num_supported_dbuf_slices = 2, \
829
	.has_logical_ring_elsq = 1, \
830
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
831

832
static const struct intel_device_info icl_info = {
833
	GEN11_FEATURES,
834
	PLATFORM(INTEL_ICELAKE),
835 836
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
837 838
};

839
static const struct intel_device_info ehl_info = {
840
	GEN11_FEATURES,
841
	PLATFORM(INTEL_ELKHARTLAKE),
842
	.require_force_probe = 1,
843
	.engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
844 845 846
	.ppgtt_size = 36,
};

847 848 849
#define GEN12_FEATURES \
	GEN11_FEATURES, \
	GEN(12), \
850 851 852 853
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \
		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
	.pipe_offsets = { \
		[TRANSCODER_A] = PIPE_A_OFFSET, \
		[TRANSCODER_B] = PIPE_B_OFFSET, \
		[TRANSCODER_C] = PIPE_C_OFFSET, \
		[TRANSCODER_D] = PIPE_D_OFFSET, \
		[TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
		[TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
	}, \
	.trans_offsets = { \
		[TRANSCODER_A] = TRANSCODER_A_OFFSET, \
		[TRANSCODER_B] = TRANSCODER_B_OFFSET, \
		[TRANSCODER_C] = TRANSCODER_C_OFFSET, \
		[TRANSCODER_D] = TRANSCODER_D_OFFSET, \
		[TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
		[TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
869
	}, \
870
	TGL_CURSOR_OFFSETS, \
871 872
	.has_global_mocs = 1, \
	.display.has_dsb = 1
873

874
static const struct intel_device_info tgl_info = {
875 876
	GEN12_FEATURES,
	PLATFORM(INTEL_TIGERLAKE),
877
	.display.has_modular_fia = 1,
878 879 880 881
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
};

882 883 884 885
static const struct intel_device_info rkl_info = {
	GEN12_FEATURES,
	PLATFORM(INTEL_ROCKETLAKE),
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
886 887
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
		BIT(TRANSCODER_C),
888
	.require_force_probe = 1,
889
	.display.has_psr_hw_tracking = 0,
890 891 892 893
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0),
};

894 895 896 897
#define GEN12_DGFX_FEATURES \
	GEN12_FEATURES, \
	.is_dgfx = 1

898
#undef GEN
899
#undef PLATFORM
900

901 902 903 904 905 906 907
/*
 * Make sure any device matches here are from most specific to most
 * general.  For example, since the Quanta match is based on the subsystem
 * and subvendor IDs, we need it to come before the more general IVB
 * PCI ID matches, otherwise we'll use the wrong info struct above.
 */
static const struct pci_device_id pciidlist[] = {
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963
	INTEL_I830_IDS(&i830_info),
	INTEL_I845G_IDS(&i845g_info),
	INTEL_I85X_IDS(&i85x_info),
	INTEL_I865G_IDS(&i865g_info),
	INTEL_I915G_IDS(&i915g_info),
	INTEL_I915GM_IDS(&i915gm_info),
	INTEL_I945G_IDS(&i945g_info),
	INTEL_I945GM_IDS(&i945gm_info),
	INTEL_I965G_IDS(&i965g_info),
	INTEL_G33_IDS(&g33_info),
	INTEL_I965GM_IDS(&i965gm_info),
	INTEL_GM45_IDS(&gm45_info),
	INTEL_G45_IDS(&g45_info),
	INTEL_PINEVIEW_G_IDS(&pnv_g_info),
	INTEL_PINEVIEW_M_IDS(&pnv_m_info),
	INTEL_IRONLAKE_D_IDS(&ilk_d_info),
	INTEL_IRONLAKE_M_IDS(&ilk_m_info),
	INTEL_SNB_D_GT1_IDS(&snb_d_gt1_info),
	INTEL_SNB_D_GT2_IDS(&snb_d_gt2_info),
	INTEL_SNB_M_GT1_IDS(&snb_m_gt1_info),
	INTEL_SNB_M_GT2_IDS(&snb_m_gt2_info),
	INTEL_IVB_Q_IDS(&ivb_q_info), /* must be first IVB */
	INTEL_IVB_M_GT1_IDS(&ivb_m_gt1_info),
	INTEL_IVB_M_GT2_IDS(&ivb_m_gt2_info),
	INTEL_IVB_D_GT1_IDS(&ivb_d_gt1_info),
	INTEL_IVB_D_GT2_IDS(&ivb_d_gt2_info),
	INTEL_HSW_GT1_IDS(&hsw_gt1_info),
	INTEL_HSW_GT2_IDS(&hsw_gt2_info),
	INTEL_HSW_GT3_IDS(&hsw_gt3_info),
	INTEL_VLV_IDS(&vlv_info),
	INTEL_BDW_GT1_IDS(&bdw_gt1_info),
	INTEL_BDW_GT2_IDS(&bdw_gt2_info),
	INTEL_BDW_GT3_IDS(&bdw_gt3_info),
	INTEL_BDW_RSVD_IDS(&bdw_rsvd_info),
	INTEL_CHV_IDS(&chv_info),
	INTEL_SKL_GT1_IDS(&skl_gt1_info),
	INTEL_SKL_GT2_IDS(&skl_gt2_info),
	INTEL_SKL_GT3_IDS(&skl_gt3_info),
	INTEL_SKL_GT4_IDS(&skl_gt4_info),
	INTEL_BXT_IDS(&bxt_info),
	INTEL_GLK_IDS(&glk_info),
	INTEL_KBL_GT1_IDS(&kbl_gt1_info),
	INTEL_KBL_GT2_IDS(&kbl_gt2_info),
	INTEL_KBL_GT3_IDS(&kbl_gt3_info),
	INTEL_KBL_GT4_IDS(&kbl_gt3_info),
	INTEL_AML_KBL_GT2_IDS(&kbl_gt2_info),
	INTEL_CFL_S_GT1_IDS(&cfl_gt1_info),
	INTEL_CFL_S_GT2_IDS(&cfl_gt2_info),
	INTEL_CFL_H_GT1_IDS(&cfl_gt1_info),
	INTEL_CFL_H_GT2_IDS(&cfl_gt2_info),
	INTEL_CFL_U_GT2_IDS(&cfl_gt2_info),
	INTEL_CFL_U_GT3_IDS(&cfl_gt3_info),
	INTEL_WHL_U_GT1_IDS(&cfl_gt1_info),
	INTEL_WHL_U_GT2_IDS(&cfl_gt2_info),
	INTEL_AML_CFL_GT2_IDS(&cfl_gt2_info),
	INTEL_WHL_U_GT3_IDS(&cfl_gt3_info),
964 965 966 967
	INTEL_CML_GT1_IDS(&cml_gt1_info),
	INTEL_CML_GT2_IDS(&cml_gt2_info),
	INTEL_CML_U_GT1_IDS(&cml_gt1_info),
	INTEL_CML_U_GT2_IDS(&cml_gt2_info),
968 969 970 971
	INTEL_CNL_IDS(&cnl_info),
	INTEL_ICL_11_IDS(&icl_info),
	INTEL_EHL_IDS(&ehl_info),
	INTEL_TGL_12_IDS(&tgl_info),
972
	INTEL_RKL_IDS(&rkl_info),
973 974 975 976
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

977 978
static void i915_pci_remove(struct pci_dev *pdev)
{
979
	struct drm_i915_private *i915;
980

981 982
	i915 = pci_get_drvdata(pdev);
	if (!i915) /* driver load aborted, nothing to cleanup */
983
		return;
984

985
	i915_driver_remove(i915);
986
	pci_set_drvdata(pdev, NULL);
987 988

	drm_dev_put(&i915->drm);
989 990
}

991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021
/* is device_id present in comma separated list of ids */
static bool force_probe(u16 device_id, const char *devices)
{
	char *s, *p, *tok;
	bool ret;

	if (!devices || !*devices)
		return false;

	/* match everything */
	if (strcmp(devices, "*") == 0)
		return true;

	s = kstrdup(devices, GFP_KERNEL);
	if (!s)
		return false;

	for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
		u16 val;

		if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
			ret = true;
			break;
		}
	}

	kfree(s);

	return ret;
}

1022 1023 1024 1025
static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
{
	struct intel_device_info *intel_info =
		(struct intel_device_info *) ent->driver_data;
1026
	int err;
1027

1028 1029
	if (intel_info->require_force_probe &&
	    !force_probe(pdev->device, i915_modparams.force_probe)) {
1030
		dev_info(&pdev->dev,
1031
			 "Your graphics device %04x is not properly supported by the driver in this\n"
1032 1033 1034 1035
			 "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
			 "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
			 "or (recommended) check for kernel updates.\n",
			 pdev->device, pdev->device, pdev->device);
1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053
		return -ENODEV;
	}

	/* 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;

	/*
	 * apple-gmux is needed on dual GPU MacBook Pro
	 * to probe the panel if we're the inactive GPU.
	 */
	if (vga_switcheroo_client_probe_defer(pdev))
		return -EPROBE_DEFER;

1054
	err = i915_driver_probe(pdev, ent);
1055 1056
	if (err)
		return err;
1057

1058
	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
1059 1060 1061 1062
		i915_pci_remove(pdev);
		return -ENODEV;
	}

1063 1064 1065 1066 1067
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
1068

1069 1070 1071 1072 1073 1074
	err = i915_perf_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}

1075
	return 0;
1076 1077
}

1078
static struct pci_driver i915_pci_driver = {
1079 1080 1081 1082 1083 1084
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
	.driver.pm = &i915_pm_ops,
};
1085 1086 1087 1088

static int __init i915_init(void)
{
	bool use_kms = true;
1089 1090
	int err;

1091 1092 1093
	err = i915_globals_init();
	if (err)
		return err;
1094

1095 1096 1097
	err = i915_mock_selftests();
	if (err)
		return err > 0 ? 0 : err;
1098 1099 1100 1101 1102 1103 1104

	/*
	 * Enable KMS by default, unless explicitly overriden by
	 * either the i915.modeset prarameter or by the
	 * vga_text_mode_force boot option.
	 */

1105
	if (i915_modparams.modeset == 0)
1106 1107
		use_kms = false;

1108
	if (vgacon_text_force() && i915_modparams.modeset == -1)
1109 1110 1111 1112 1113 1114 1115 1116
		use_kms = false;

	if (!use_kms) {
		/* Silently fail loading to not upset userspace. */
		DRM_DEBUG_DRIVER("KMS disabled.\n");
		return 0;
	}

1117 1118 1119 1120 1121 1122
	err = pci_register_driver(&i915_pci_driver);
	if (err)
		return err;

	i915_perf_sysctl_register();
	return 0;
1123 1124 1125 1126 1127 1128 1129
}

static void __exit i915_exit(void)
{
	if (!i915_pci_driver.driver.owner)
		return;

1130
	i915_perf_sysctl_unregister();
1131
	pci_unregister_driver(&i915_pci_driver);
1132
	i915_globals_exit();
1133 1134 1135 1136 1137 1138 1139 1140 1141 1142
}

module_init(i915_init);
module_exit(i915_exit);

MODULE_AUTHOR("Tungsten Graphics, Inc.");
MODULE_AUTHOR("Intel Corporation");

MODULE_DESCRIPTION(DRIVER_DESC);
MODULE_LICENSE("GPL and additional rights");