i915_pci.c 29.5 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
#define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1), .display.ver = (x)
40

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 \
157
	.memory_regions = REGION_SMEM | REGION_STOLEN_SMEM
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
	.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, \
171
	.platform_engine_mask = BIT(RCS0), \
172 173
	.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
	.platform_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
	.display.has_fbc = 1,
221 222
};

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

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

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

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

274
static const struct intel_device_info i945gm_info = {
275
	GEN3_FEATURES,
276 277
	PLATFORM(INTEL_I945GM),
	.is_mobile = 1,
278 279 280 281 282 283
	.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,
284
	.hws_needs_physical = 1,
285
	.unfenced_needs_alignment = 1,
286 287
};

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

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

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

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

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

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

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

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

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

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

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

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

417 418
#define SNB_D_PLATFORM \
	GEN6_FEATURES, \
419
	PLATFORM(INTEL_SANDYBRIDGE)
420

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

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

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


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

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

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

469 470
#define IVB_D_PLATFORM \
	GEN7_FEATURES, \
471
	PLATFORM(INTEL_IVYBRIDGE), \
472 473
	.has_l3_dpf = 1

474
static const struct intel_device_info ivb_d_gt1_info = {
475 476
	IVB_D_PLATFORM,
	.gt = 1,
477 478
};

479
static const struct intel_device_info ivb_d_gt2_info = {
480 481 482 483 484 485
	IVB_D_PLATFORM,
	.gt = 2,
};

#define IVB_M_PLATFORM \
	GEN7_FEATURES, \
486
	PLATFORM(INTEL_IVYBRIDGE), \
487 488 489
	.is_mobile = 1, \
	.has_l3_dpf = 1

490
static const struct intel_device_info ivb_m_gt1_info = {
491 492 493 494
	IVB_M_PLATFORM,
	.gt = 1,
};

495
static const struct intel_device_info ivb_m_gt2_info = {
496 497
	IVB_M_PLATFORM,
	.gt = 2,
498 499
};

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

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

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

549
#define HSW_PLATFORM \
550
	G75_FEATURES, \
551
	PLATFORM(INTEL_HASWELL), \
552 553
	.has_l3_dpf = 1

554
static const struct intel_device_info hsw_gt1_info = {
555 556 557 558
	HSW_PLATFORM,
	.gt = 1,
};

559
static const struct intel_device_info hsw_gt2_info = {
560 561 562 563
	HSW_PLATFORM,
	.gt = 2,
};

564
static const struct intel_device_info hsw_gt3_info = {
565 566
	HSW_PLATFORM,
	.gt = 3,
567 568
};

569 570
#define GEN8_FEATURES \
	G75_FEATURES, \
571
	GEN(8), \
572
	.has_logical_ring_contexts = 1, \
573
	.dma_mask_size = 39, \
574
	.ppgtt_type = INTEL_PPGTT_FULL, \
575
	.ppgtt_size = 48, \
576
	.has_64bit_reloc = 1
577

578
#define BDW_PLATFORM \
579
	GEN8_FEATURES, \
580
	PLATFORM(INTEL_BROADWELL)
581

582
static const struct intel_device_info bdw_gt1_info = {
583 584 585 586
	BDW_PLATFORM,
	.gt = 1,
};

587
static const struct intel_device_info bdw_gt2_info = {
588
	BDW_PLATFORM,
589 590 591
	.gt = 2,
};

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

600
static const struct intel_device_info bdw_gt3_info = {
601
	BDW_PLATFORM,
602
	.gt = 3,
603
	.platform_engine_mask =
604
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
605 606
};

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

635
#define GEN9_DEFAULT_PAGE_SIZES \
636
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
637
		      I915_GTT_PAGE_SIZE_64K
638

639 640
#define GEN9_FEATURES \
	GEN8_FEATURES, \
641
	GEN(9), \
642
	GEN9_DEFAULT_PAGE_SIZES, \
643
	.display.has_csr = 1, \
644
	.has_gt_uc = 1, \
645
	.display.has_hdcp = 1, \
646
	.display.has_ipc = 1, \
647 648
	.ddb_size = 896, \
	.num_supported_dbuf_slices = 1
649

650 651
#define SKL_PLATFORM \
	GEN9_FEATURES, \
652
	PLATFORM(INTEL_SKYLAKE)
653

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

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

#define SKL_GT3_PLUS_PLATFORM \
	SKL_PLATFORM, \
666
	.platform_engine_mask = \
667
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
668 669


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

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

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

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

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

731
#define KBL_PLATFORM \
732
	GEN9_FEATURES, \
733
	PLATFORM(INTEL_KABYLAKE)
734

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

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

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

752
#define CFL_PLATFORM \
753
	GEN9_FEATURES, \
754
	PLATFORM(INTEL_COFFEELAKE)
755

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

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

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

773 774 775 776 777 778 779 780 781 782 783 784 785 786
#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,
};

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

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

801 802 803 804 805
#define GEN11_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

806 807
#define GEN11_FEATURES \
	GEN10_FEATURES, \
808
	GEN11_DEFAULT_PAGE_SIZES, \
809
	.abox_mask = BIT(0), \
810 811 812
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828
	.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, \
	}, \
829
	GEN(11), \
830
	.ddb_size = 2048, \
831
	.num_supported_dbuf_slices = 2, \
832
	.has_logical_ring_elsq = 1, \
833
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
834

835
static const struct intel_device_info icl_info = {
836
	GEN11_FEATURES,
837
	PLATFORM(INTEL_ICELAKE),
838
	.platform_engine_mask =
839
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
840 841
};

842
static const struct intel_device_info ehl_info = {
843
	GEN11_FEATURES,
844
	PLATFORM(INTEL_ELKHARTLAKE),
845
	.require_force_probe = 1,
846
	.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
847 848 849
	.ppgtt_size = 36,
};

850 851 852 853 854 855 856 857
static const struct intel_device_info jsl_info = {
	GEN11_FEATURES,
	PLATFORM(INTEL_JASPERLAKE),
	.require_force_probe = 1,
	.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
	.ppgtt_size = 36,
};

858 859 860
#define GEN12_FEATURES \
	GEN11_FEATURES, \
	GEN(12), \
861
	.abox_mask = GENMASK(2, 1), \
862 863 864 865
	.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), \
866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
	.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, \
881
	}, \
882
	TGL_CURSOR_OFFSETS, \
883 884
	.has_global_mocs = 1, \
	.display.has_dsb = 1
885

886
static const struct intel_device_info tgl_info = {
887 888
	GEN12_FEATURES,
	PLATFORM(INTEL_TIGERLAKE),
889
	.display.has_modular_fia = 1,
890
	.platform_engine_mask =
891 892 893
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
};

894 895 896
static const struct intel_device_info rkl_info = {
	GEN12_FEATURES,
	PLATFORM(INTEL_ROCKETLAKE),
897
	.abox_mask = BIT(0),
898
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
899 900
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
		BIT(TRANSCODER_C),
M
Matt Roper 已提交
901
	.display.has_hti = 1,
902
	.display.has_psr_hw_tracking = 0,
903
	.platform_engine_mask =
904 905 906
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0),
};

907 908
#define GEN12_DGFX_FEATURES \
	GEN12_FEATURES, \
909 910
	.memory_regions = REGION_SMEM | REGION_LMEM, \
	.has_master_unit_irq = 1, \
911 912
	.has_llc = 0, \
	.has_snoop = 1, \
913 914
	.is_dgfx = 1

915 916 917 918 919 920 921 922
static const struct intel_device_info dg1_info __maybe_unused = {
	GEN12_DGFX_FEATURES,
	PLATFORM(INTEL_DG1),
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
	.require_force_probe = 1,
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) |
		BIT(VCS0) | BIT(VCS2),
923 924
	/* Wa_16011227922 */
	.ppgtt_size = 47,
925 926
};

927 928 929 930 931 932 933 934 935 936 937 938
static const struct intel_device_info adl_s_info = {
	GEN12_FEATURES,
	PLATFORM(INTEL_ALDERLAKE_S),
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
	.require_force_probe = 1,
	.display.has_hti = 1,
	.display.has_psr_hw_tracking = 0,
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
	.dma_mask_size = 46,
};

939
#undef GEN
940
#undef PLATFORM
941

942 943 944 945 946 947 948
/*
 * 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[] = {
949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004
	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),
1005 1006 1007 1008
	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),
1009 1010 1011
	INTEL_CNL_IDS(&cnl_info),
	INTEL_ICL_11_IDS(&icl_info),
	INTEL_EHL_IDS(&ehl_info),
1012
	INTEL_JSL_IDS(&jsl_info),
1013
	INTEL_TGL_12_IDS(&tgl_info),
1014
	INTEL_RKL_IDS(&rkl_info),
1015
	INTEL_ADLS_IDS(&adl_s_info),
1016 1017 1018 1019
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

1020 1021
static void i915_pci_remove(struct pci_dev *pdev)
{
1022
	struct drm_i915_private *i915;
1023

1024 1025
	i915 = pci_get_drvdata(pdev);
	if (!i915) /* driver load aborted, nothing to cleanup */
1026
		return;
1027

1028
	i915_driver_remove(i915);
1029
	pci_set_drvdata(pdev, NULL);
1030 1031
}

1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062
/* 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;
}

1063 1064 1065 1066
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;
1067
	int err;
1068

1069 1070
	if (intel_info->require_force_probe &&
	    !force_probe(pdev->device, i915_modparams.force_probe)) {
1071
		dev_info(&pdev->dev,
1072
			 "Your graphics device %04x is not properly supported by the driver in this\n"
1073 1074 1075 1076
			 "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);
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
		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;

1095
	err = i915_driver_probe(pdev, ent);
1096 1097
	if (err)
		return err;
1098

1099
	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
1100 1101 1102 1103
		i915_pci_remove(pdev);
		return -ENODEV;
	}

1104 1105 1106 1107 1108
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
1109

1110 1111 1112 1113 1114 1115
	err = i915_perf_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}

1116
	return 0;
1117 1118
}

1119 1120 1121 1122 1123 1124 1125
static void i915_pci_shutdown(struct pci_dev *pdev)
{
	struct drm_i915_private *i915 = pci_get_drvdata(pdev);

	i915_driver_shutdown(i915);
}

1126
static struct pci_driver i915_pci_driver = {
1127 1128 1129 1130
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
1131
	.shutdown = i915_pci_shutdown,
1132 1133
	.driver.pm = &i915_pm_ops,
};
1134 1135 1136 1137

static int __init i915_init(void)
{
	bool use_kms = true;
1138 1139
	int err;

1140 1141 1142
	err = i915_globals_init();
	if (err)
		return err;
1143

1144 1145 1146
	err = i915_mock_selftests();
	if (err)
		return err > 0 ? 0 : err;
1147 1148 1149 1150 1151 1152 1153

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

1154
	if (i915_modparams.modeset == 0)
1155 1156
		use_kms = false;

1157
	if (vgacon_text_force() && i915_modparams.modeset == -1)
1158 1159 1160 1161 1162 1163 1164 1165
		use_kms = false;

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

1166 1167
	i915_pmu_init();

1168
	err = pci_register_driver(&i915_pci_driver);
1169 1170
	if (err) {
		i915_pmu_exit();
1171
		return err;
1172
	}
1173 1174 1175

	i915_perf_sysctl_register();
	return 0;
1176 1177 1178 1179 1180 1181 1182
}

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

1183
	i915_perf_sysctl_unregister();
1184
	pci_unregister_driver(&i915_pci_driver);
1185
	i915_globals_exit();
1186
	i915_pmu_exit();
1187 1188 1189 1190 1191 1192 1193 1194 1195 1196
}

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");