i915_pci.c 30.4 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 41 42
#define GEN(x) \
	.graphics_ver = (x), \
	.media_ver = (x), \
	.display.ver = (x)
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 72 73 74
#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 \
75 76 77 78 79 80 81 82 83 84 85 86
	.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, \
	}
87

88
#define CHV_PIPE_OFFSETS \
89 90 91 92 93 94 95 96 97 98
	.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, \
	}
99

100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
#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, \
	}
117 118

#define IVB_CURSOR_OFFSETS \
119 120 121 122 123
	.cursor_offsets = { \
		[PIPE_A] = CURSOR_A_OFFSET, \
		[PIPE_B] = IVB_CURSOR_B_OFFSET, \
		[PIPE_C] = IVB_CURSOR_C_OFFSET, \
	}
124

125 126 127 128 129 130 131 132
#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, \
	}

133 134
#define I9XX_COLORS \
	.color = { .gamma_lut_size = 256 }
135 136 137 138
#define I965_COLORS \
	.color = { .gamma_lut_size = 129, \
		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
	}
139 140
#define ILK_COLORS \
	.color = { .gamma_lut_size = 1024 }
141
#define IVB_COLORS \
142
	.color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
143
#define CHV_COLORS \
144 145 146 147
	.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 已提交
148
#define GLK_COLORS \
149
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
150 151 152
		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
					DRM_COLOR_LUT_EQUAL_CHANNELS, \
	}
153

154
/* Keep in gen based order, and chronological order within a gen */
155 156 157 158

#define GEN_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K

M
Matthew Auld 已提交
159
#define GEN_DEFAULT_REGIONS \
160
	.memory_regions = REGION_SMEM | REGION_STOLEN_SMEM
M
Matthew Auld 已提交
161

162 163 164
#define I830_FEATURES \
	GEN(2), \
	.is_mobile = 1, \
165
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
166
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
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, \
174
	.platform_engine_mask = BIT(RCS0), \
175 176
	.has_snoop = true, \
	.has_coherent_ggtt = false, \
177
	.dma_mask_size = 32, \
178 179
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
180
	I9XX_COLORS, \
M
Matthew Auld 已提交
181 182
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
183 184

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

204
static const struct intel_device_info i830_info = {
205
	I830_FEATURES,
206
	PLATFORM(INTEL_I830),
207 208
};

209
static const struct intel_device_info i845g_info = {
210
	I845_FEATURES,
211
	PLATFORM(INTEL_I845G),
212 213
};

214
static const struct intel_device_info i85x_info = {
215
	I830_FEATURES,
216
	PLATFORM(INTEL_I85X),
217
	.display.has_fbc = 1,
218 219
};

220
static const struct intel_device_info i865g_info = {
221
	I845_FEATURES,
222
	PLATFORM(INTEL_I865G),
223
	.display.has_fbc = 1,
224 225
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

386
static const struct intel_device_info ilk_d_info = {
387
	GEN5_FEATURES,
388
	PLATFORM(INTEL_IRONLAKE),
389 390
};

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

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

420 421
#define SNB_D_PLATFORM \
	GEN6_FEATURES, \
422
	PLATFORM(INTEL_SANDYBRIDGE)
423

424
static const struct intel_device_info snb_d_gt1_info = {
425 426
	SNB_D_PLATFORM,
	.gt = 1,
427 428
};

429
static const struct intel_device_info snb_d_gt2_info = {
430 431 432 433 434 435
	SNB_D_PLATFORM,
	.gt = 2,
};

#define SNB_M_PLATFORM \
	GEN6_FEATURES, \
436
	PLATFORM(INTEL_SANDYBRIDGE), \
437 438 439
	.is_mobile = 1


440
static const struct intel_device_info snb_m_gt1_info = {
441 442 443 444
	SNB_M_PLATFORM,
	.gt = 1,
};

445
static const struct intel_device_info snb_m_gt2_info = {
446 447
	SNB_M_PLATFORM,
	.gt = 2,
448 449 450
};

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

472 473
#define IVB_D_PLATFORM \
	GEN7_FEATURES, \
474
	PLATFORM(INTEL_IVYBRIDGE), \
475 476
	.has_l3_dpf = 1

477
static const struct intel_device_info ivb_d_gt1_info = {
478 479
	IVB_D_PLATFORM,
	.gt = 1,
480 481
};

482
static const struct intel_device_info ivb_d_gt2_info = {
483 484 485 486 487 488
	IVB_D_PLATFORM,
	.gt = 2,
};

#define IVB_M_PLATFORM \
	GEN7_FEATURES, \
489
	PLATFORM(INTEL_IVYBRIDGE), \
490 491 492
	.is_mobile = 1, \
	.has_l3_dpf = 1

493
static const struct intel_device_info ivb_m_gt1_info = {
494 495 496 497
	IVB_M_PLATFORM,
	.gt = 1,
};

498
static const struct intel_device_info ivb_m_gt2_info = {
499 500
	IVB_M_PLATFORM,
	.gt = 2,
501 502
};

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

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

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

552
#define HSW_PLATFORM \
553
	G75_FEATURES, \
554
	PLATFORM(INTEL_HASWELL), \
555 556
	.has_l3_dpf = 1

557
static const struct intel_device_info hsw_gt1_info = {
558 559 560 561
	HSW_PLATFORM,
	.gt = 1,
};

562
static const struct intel_device_info hsw_gt2_info = {
563 564 565 566
	HSW_PLATFORM,
	.gt = 2,
};

567
static const struct intel_device_info hsw_gt3_info = {
568 569
	HSW_PLATFORM,
	.gt = 3,
570 571
};

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

581
#define BDW_PLATFORM \
582
	GEN8_FEATURES, \
583
	PLATFORM(INTEL_BROADWELL)
584

585
static const struct intel_device_info bdw_gt1_info = {
586 587 588 589
	BDW_PLATFORM,
	.gt = 1,
};

590
static const struct intel_device_info bdw_gt2_info = {
591
	BDW_PLATFORM,
592 593 594
	.gt = 2,
};

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

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

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

638
#define GEN9_DEFAULT_PAGE_SIZES \
639
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
640
		      I915_GTT_PAGE_SIZE_64K
641

642 643
#define GEN9_FEATURES \
	GEN8_FEATURES, \
644
	GEN(9), \
645
	GEN9_DEFAULT_PAGE_SIZES, \
646
	.display.has_csr = 1, \
647
	.has_gt_uc = 1, \
648
	.display.has_hdcp = 1, \
649
	.display.has_ipc = 1, \
650
	.dbuf.size = 896 - 4, /* 4 blocks for bypass path allocation */ \
651
	.dbuf.slice_mask = BIT(DBUF_S1)
652

653 654
#define SKL_PLATFORM \
	GEN9_FEATURES, \
655
	PLATFORM(INTEL_SKYLAKE)
656

657
static const struct intel_device_info skl_gt1_info = {
658
	SKL_PLATFORM,
659
	.gt = 1,
660 661
};

662
static const struct intel_device_info skl_gt2_info = {
663
	SKL_PLATFORM,
664 665 666 667 668
	.gt = 2,
};

#define SKL_GT3_PLUS_PLATFORM \
	SKL_PLATFORM, \
669
	.platform_engine_mask = \
670
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
671 672


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

678
static const struct intel_device_info skl_gt4_info = {
679 680
	SKL_GT3_PLUS_PLATFORM,
	.gt = 4,
681 682
};

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

720
static const struct intel_device_info bxt_info = {
721
	GEN9_LP_FEATURES,
722
	PLATFORM(INTEL_BROXTON),
723
	.dbuf.size = 512 - 4, /* 4 blocks for bypass path allocation */
724 725
};

726
static const struct intel_device_info glk_info = {
727
	GEN9_LP_FEATURES,
728
	PLATFORM(INTEL_GEMINILAKE),
729
	.display.ver = 10,
730
	.dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */
R
Rodrigo Vivi 已提交
731
	GLK_COLORS,
732 733
};

734
#define KBL_PLATFORM \
735
	GEN9_FEATURES, \
736
	PLATFORM(INTEL_KABYLAKE)
737

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

743
static const struct intel_device_info kbl_gt2_info = {
744 745
	KBL_PLATFORM,
	.gt = 2,
746 747
};

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

755
#define CFL_PLATFORM \
756
	GEN9_FEATURES, \
757
	PLATFORM(INTEL_COFFEELAKE)
758

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

764
static const struct intel_device_info cfl_gt2_info = {
765
	CFL_PLATFORM,
766
	.gt = 2,
767 768
};

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

776 777 778 779 780 781 782 783 784 785 786 787 788 789
#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,
};

790 791
#define GEN10_FEATURES \
	GEN9_FEATURES, \
792
	GEN(10), \
793
	.dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */ \
794
	.display.has_dsc = 1, \
795
	.has_coherent_ggtt = false, \
R
Rodrigo Vivi 已提交
796
	GLK_COLORS
797

798
static const struct intel_device_info cnl_info = {
799
	GEN10_FEATURES,
800
	PLATFORM(INTEL_CANNONLAKE),
801
	.gt = 2,
802 803
};

804 805 806 807 808
#define GEN11_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

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

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

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

853 854 855 856 857 858 859 860
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,
};

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

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

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

910
#define DGFX_FEATURES \
911 912
	.memory_regions = REGION_SMEM | REGION_LMEM, \
	.has_master_unit_irq = 1, \
913 914
	.has_llc = 0, \
	.has_snoop = 1, \
915 916
	.is_dgfx = 1

917
static const struct intel_device_info dg1_info __maybe_unused = {
918 919
	GEN12_FEATURES,
	DGFX_FEATURES,
920 921 922 923 924 925
	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),
926 927
	/* Wa_16011227922 */
	.ppgtt_size = 47,
928 929
};

930 931 932 933 934 935 936 937 938 939 940 941
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,
};

942 943 944 945 946 947 948 949 950 951
#define XE_LPD_FEATURES \
	.display.ver = 13,						\
	.display.has_psr_hw_tracking = 0,				\
	.abox_mask = GENMASK(1, 0),					\
	.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),			\
	.dbuf.size = 4096,						\
	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | BIT(DBUF_S4)

952 953 954 955 956
static const struct intel_device_info adl_p_info = {
	GEN12_FEATURES,
	XE_LPD_FEATURES,
	PLATFORM(INTEL_ALDERLAKE_P),
	.require_force_probe = 1,
957
	.display.has_modular_fia = 1,
958 959 960 961 962 963
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
	.ppgtt_size = 48,
	.dma_mask_size = 39,
};

964
#undef GEN
965
#undef PLATFORM
966

967 968 969 970 971 972 973
/*
 * 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[] = {
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 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029
	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),
1030 1031 1032 1033
	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),
1034 1035 1036
	INTEL_CNL_IDS(&cnl_info),
	INTEL_ICL_11_IDS(&icl_info),
	INTEL_EHL_IDS(&ehl_info),
1037
	INTEL_JSL_IDS(&jsl_info),
1038
	INTEL_TGL_12_IDS(&tgl_info),
1039
	INTEL_RKL_IDS(&rkl_info),
1040
	INTEL_ADLS_IDS(&adl_s_info),
1041
	INTEL_ADLP_IDS(&adl_p_info),
1042 1043 1044 1045
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

1046 1047
static void i915_pci_remove(struct pci_dev *pdev)
{
1048
	struct drm_i915_private *i915;
1049

1050 1051
	i915 = pci_get_drvdata(pdev);
	if (!i915) /* driver load aborted, nothing to cleanup */
1052
		return;
1053

1054
	i915_driver_remove(i915);
1055
	pci_set_drvdata(pdev, NULL);
1056 1057
}

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
/* 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;
}

1089 1090 1091 1092
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;
1093
	int err;
1094

1095 1096
	if (intel_info->require_force_probe &&
	    !force_probe(pdev->device, i915_modparams.force_probe)) {
1097
		dev_info(&pdev->dev,
1098
			 "Your graphics device %04x is not properly supported by the driver in this\n"
1099 1100 1101 1102
			 "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);
1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120
		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;

1121
	err = i915_driver_probe(pdev, ent);
1122 1123
	if (err)
		return err;
1124

1125
	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
1126 1127 1128 1129
		i915_pci_remove(pdev);
		return -ENODEV;
	}

1130 1131 1132 1133 1134
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
1135

1136 1137 1138 1139 1140 1141
	err = i915_perf_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}

1142
	return 0;
1143 1144
}

1145 1146 1147 1148 1149 1150 1151
static void i915_pci_shutdown(struct pci_dev *pdev)
{
	struct drm_i915_private *i915 = pci_get_drvdata(pdev);

	i915_driver_shutdown(i915);
}

1152
static struct pci_driver i915_pci_driver = {
1153 1154 1155 1156
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
1157
	.shutdown = i915_pci_shutdown,
1158 1159
	.driver.pm = &i915_pm_ops,
};
1160 1161 1162 1163

static int __init i915_init(void)
{
	bool use_kms = true;
1164 1165
	int err;

1166 1167 1168
	err = i915_globals_init();
	if (err)
		return err;
1169

1170 1171 1172
	err = i915_mock_selftests();
	if (err)
		return err > 0 ? 0 : err;
1173 1174 1175 1176 1177 1178 1179

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

1180
	if (i915_modparams.modeset == 0)
1181 1182
		use_kms = false;

1183
	if (vgacon_text_force() && i915_modparams.modeset == -1)
1184 1185 1186 1187 1188 1189 1190 1191
		use_kms = false;

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

1192 1193
	i915_pmu_init();

1194
	err = pci_register_driver(&i915_pci_driver);
1195 1196
	if (err) {
		i915_pmu_exit();
1197
		return err;
1198
	}
1199 1200 1201

	i915_perf_sysctl_register();
	return 0;
1202 1203 1204 1205 1206 1207 1208
}

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

1209
	i915_perf_sysctl_unregister();
1210
	pci_unregister_driver(&i915_pci_driver);
1211
	i915_globals_exit();
1212
	i915_pmu_exit();
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
}

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