i915_pci.c 31.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 25 26
/*
 * 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.
 *
 */

#include <linux/vga_switcheroo.h>

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

30
#include "i915_drv.h"
D
Daniel Vetter 已提交
31
#include "i915_pci.h"
32

33
#define PLATFORM(x) .platform = (x)
34 35 36 37
#define GEN(x) \
	.graphics_ver = (x), \
	.media_ver = (x), \
	.display.ver = (x)
38

39 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
#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 \
70 71 72 73 74 75 76 77 78 79 80 81
	.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, \
	}
82

83
#define CHV_PIPE_OFFSETS \
84 85 86 87 88 89 90 91 92 93
	.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, \
	}
94

95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
#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, \
	}
112 113

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

120 121 122 123 124 125 126 127
#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, \
	}

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

149
/* Keep in gen based order, and chronological order within a gen */
150 151 152 153

#define GEN_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K

M
Matthew Auld 已提交
154
#define GEN_DEFAULT_REGIONS \
155
	.memory_regions = REGION_SMEM | REGION_STOLEN_SMEM
M
Matthew Auld 已提交
156

157 158 159
#define I830_FEATURES \
	GEN(2), \
	.is_mobile = 1, \
160
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
161
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
162 163 164 165 166 167 168
	.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, \
169
	.platform_engine_mask = BIT(RCS0), \
170 171
	.has_snoop = true, \
	.has_coherent_ggtt = false, \
172
	.dma_mask_size = 32, \
173 174
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
175
	I9XX_COLORS, \
M
Matthew Auld 已提交
176 177
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
178 179

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

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

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

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

215
static const struct intel_device_info i865g_info = {
216
	I845_FEATURES,
217
	PLATFORM(INTEL_I865G),
218
	.display.has_fbc = 1,
219 220
};

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

386
static const struct intel_device_info ilk_m_info = {
387
	GEN5_FEATURES,
388
	PLATFORM(INTEL_IRONLAKE),
389
	.is_mobile = 1,
390
	.has_rps = true,
391
	.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
	.platform_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
	.platform_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_reset_engine = true, \
457
	.has_rps = true, \
458
	.dma_mask_size = 40, \
459
	.ppgtt_type = INTEL_PPGTT_ALIASING, \
460
	.ppgtt_size = 31, \
461 462
	IVB_PIPE_OFFSETS, \
	IVB_CURSOR_OFFSETS, \
463
	IVB_COLORS, \
M
Matthew Auld 已提交
464 465
	GEN_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
466

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

637 638
#define GEN9_FEATURES \
	GEN8_FEATURES, \
639
	GEN(9), \
640
	GEN9_DEFAULT_PAGE_SIZES, \
641
	.display.has_dmc = 1, \
642
	.has_gt_uc = 1, \
643
	.display.has_hdcp = 1, \
644
	.display.has_ipc = 1, \
645
	.dbuf.size = 896 - 4, /* 4 blocks for bypass path allocation */ \
646
	.dbuf.slice_mask = BIT(DBUF_S1)
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
	.platform_engine_mask = \
665
		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
	.dbuf.slice_mask = BIT(DBUF_S1), \
682
	.display.has_hotplug = 1, \
683
	.platform_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
	.display.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_dmc = 1, \
697
	.has_rc6 = 1, \
698
	.has_rps = true, \
699
	.display.has_dp_mst = 1, \
700
	.has_logical_ring_contexts = 1, \
701
	.has_gt_uc = 1, \
702
	.dma_mask_size = 39, \
703
	.ppgtt_type = INTEL_PPGTT_FULL, \
704
	.ppgtt_size = 48, \
705
	.has_reset_engine = 1, \
706
	.has_snoop = true, \
707
	.has_coherent_ggtt = false, \
708
	.display.has_ipc = 1, \
709
	HSW_PIPE_OFFSETS, \
710
	IVB_CURSOR_OFFSETS, \
711
	IVB_COLORS, \
M
Matthew Auld 已提交
712 713
	GEN9_DEFAULT_PAGE_SIZES, \
	GEN_DEFAULT_REGIONS
714

715
static const struct intel_device_info bxt_info = {
716
	GEN9_LP_FEATURES,
717
	PLATFORM(INTEL_BROXTON),
718
	.dbuf.size = 512 - 4, /* 4 blocks for bypass path allocation */
719 720
};

721
static const struct intel_device_info glk_info = {
722
	GEN9_LP_FEATURES,
723
	PLATFORM(INTEL_GEMINILAKE),
724
	.display.ver = 10,
725
	.dbuf.size = 1024 - 4, /* 4 blocks for bypass path allocation */
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
	.platform_engine_mask =
747
		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
	.platform_engine_mask =
768
		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 787 788 789
#define GEN11_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

790
#define GEN11_FEATURES \
791
	GEN9_FEATURES, \
792
	GEN11_DEFAULT_PAGE_SIZES, \
793
	.abox_mask = BIT(0), \
794 795 796
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
		BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
		BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
	.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, \
	}, \
813
	GEN(11), \
814
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }, \
815
	.dbuf.size = 2048, \
816
	.dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2), \
817 818 819
	.display.has_dsc = 1, \
	.has_coherent_ggtt = false, \
	.has_logical_ring_elsq = 1
820

821
static const struct intel_device_info icl_info = {
822
	GEN11_FEATURES,
823
	PLATFORM(INTEL_ICELAKE),
824
	.platform_engine_mask =
825
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
826 827
};

828
static const struct intel_device_info ehl_info = {
829
	GEN11_FEATURES,
830
	PLATFORM(INTEL_ELKHARTLAKE),
831
	.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
832 833 834
	.ppgtt_size = 36,
};

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

842 843 844
#define GEN12_FEATURES \
	GEN11_FEATURES, \
	GEN(12), \
845
	.abox_mask = GENMASK(2, 1), \
846 847 848 849
	.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), \
850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
	.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, \
865
	}, \
866
	TGL_CURSOR_OFFSETS, \
867
	.has_global_mocs = 1, \
868
	.has_pxp = 1, \
869
	.display.has_dsb = 1
870

871
static const struct intel_device_info tgl_info = {
872 873
	GEN12_FEATURES,
	PLATFORM(INTEL_TIGERLAKE),
874
	.display.has_modular_fia = 1,
875
	.platform_engine_mask =
876 877 878
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
};

879 880 881
static const struct intel_device_info rkl_info = {
	GEN12_FEATURES,
	PLATFORM(INTEL_ROCKETLAKE),
882
	.abox_mask = BIT(0),
883
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
884 885
	.cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
		BIT(TRANSCODER_C),
M
Matt Roper 已提交
886
	.display.has_hti = 1,
887
	.display.has_psr_hw_tracking = 0,
888
	.platform_engine_mask =
889 890 891
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0),
};

892
#define DGFX_FEATURES \
893
	.memory_regions = REGION_SMEM | REGION_LMEM | REGION_STOLEN_LMEM, \
894
	.has_llc = 0, \
895
	.has_pxp = 0, \
896
	.has_snoop = 1, \
897 898
	.is_dgfx = 1

899
static const struct intel_device_info dg1_info = {
900 901
	GEN12_FEATURES,
	DGFX_FEATURES,
902
	.graphics_rel = 10,
903 904 905 906 907 908
	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),
909 910
	/* Wa_16011227922 */
	.ppgtt_size = 47,
911 912
};

913 914 915 916 917 918 919 920
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),
	.display.has_hti = 1,
	.display.has_psr_hw_tracking = 0,
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
921
	.dma_mask_size = 39,
922 923
};

924 925 926 927 928 929 930 931
#define XE_LPD_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, \
	}

932
#define XE_LPD_FEATURES \
933
	.abox_mask = GENMASK(1, 0),						\
934
	.color = { .degamma_lut_size = 0, .gamma_lut_size = 0 },		\
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 964 965
	.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),							\
	.display.has_ddi = 1,							\
	.display.has_dmc = 1,							\
	.display.has_dp_mst = 1,						\
	.display.has_dsb = 1,							\
	.display.has_dsc = 1,							\
	.display.has_fbc = 1,							\
	.display.has_fpga_dbg = 1,						\
	.display.has_hdcp = 1,							\
	.display.has_hotplug = 1,						\
	.display.has_ipc = 1,							\
	.display.has_psr = 1,							\
	.display.ver = 13,							\
	.pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),	\
	.pipe_offsets = {							\
		[TRANSCODER_A] = PIPE_A_OFFSET,					\
		[TRANSCODER_B] = PIPE_B_OFFSET,					\
		[TRANSCODER_C] = PIPE_C_OFFSET,					\
		[TRANSCODER_D] = PIPE_D_OFFSET,					\
	},									\
	.trans_offsets = {							\
		[TRANSCODER_A] = TRANSCODER_A_OFFSET,				\
		[TRANSCODER_B] = TRANSCODER_B_OFFSET,				\
		[TRANSCODER_C] = TRANSCODER_C_OFFSET,				\
		[TRANSCODER_D] = TRANSCODER_D_OFFSET,				\
	},									\
	XE_LPD_CURSOR_OFFSETS
966

967 968 969 970 971
static const struct intel_device_info adl_p_info = {
	GEN12_FEATURES,
	XE_LPD_FEATURES,
	PLATFORM(INTEL_ALDERLAKE_P),
	.require_force_probe = 1,
972
	.display.has_cdclk_crawl = 1,
973
	.display.has_modular_fia = 1,
974
	.display.has_psr_hw_tracking = 0,
975 976 977 978 979 980
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
	.ppgtt_size = 48,
	.dma_mask_size = 39,
};

981
#undef GEN
982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998

#define XE_HP_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

#define XE_HP_FEATURES \
	.graphics_ver = 12, \
	.graphics_rel = 50, \
	XE_HP_PAGE_SIZES, \
	.dma_mask_size = 46, \
	.has_64bit_reloc = 1, \
	.has_global_mocs = 1, \
	.has_gt_uc = 1, \
	.has_llc = 1, \
	.has_logical_ring_contexts = 1, \
	.has_logical_ring_elsq = 1, \
999
	.has_mslices = 1, \
1000 1001 1002 1003 1004 1005 1006
	.has_rc6 = 1, \
	.has_reset_engine = 1, \
	.has_rps = 1, \
	.has_runtime_pm = 1, \
	.ppgtt_size = 48, \
	.ppgtt_type = INTEL_PPGTT_FULL

1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020
#define XE_HPM_FEATURES \
	.media_ver = 12, \
	.media_rel = 50

__maybe_unused
static const struct intel_device_info xehpsdv_info = {
	XE_HP_FEATURES,
	XE_HPM_FEATURES,
	DGFX_FEATURES,
	PLATFORM(INTEL_XEHPSDV),
	.display = { },
	.pipe_mask = 0,
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) |
1021 1022 1023
		BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) |
		BIT(VCS0) | BIT(VCS1) | BIT(VCS2) | BIT(VCS3) |
		BIT(VCS4) | BIT(VCS5) | BIT(VCS6) | BIT(VCS7),
1024 1025 1026
	.require_force_probe = 1,
};

M
Matt Roper 已提交
1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042
__maybe_unused
static const struct intel_device_info dg2_info = {
	XE_HP_FEATURES,
	XE_HPM_FEATURES,
	XE_LPD_FEATURES,
	DGFX_FEATURES,
	.graphics_rel = 55,
	.media_rel = 55,
	PLATFORM(INTEL_DG2),
	.platform_engine_mask =
		BIT(RCS0) | BIT(BCS0) |
		BIT(VECS0) | BIT(VECS1) |
		BIT(VCS0) | BIT(VCS2),
	.require_force_probe = 1,
};

1043
#undef PLATFORM
1044

1045 1046 1047 1048 1049 1050 1051
/*
 * 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[] = {
1052 1053 1054 1055 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 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107
	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),
1108 1109 1110 1111
	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),
1112 1113
	INTEL_ICL_11_IDS(&icl_info),
	INTEL_EHL_IDS(&ehl_info),
1114
	INTEL_JSL_IDS(&jsl_info),
1115
	INTEL_TGL_12_IDS(&tgl_info),
1116
	INTEL_RKL_IDS(&rkl_info),
1117
	INTEL_ADLS_IDS(&adl_s_info),
1118
	INTEL_ADLP_IDS(&adl_p_info),
1119
	INTEL_DG1_IDS(&dg1_info),
1120 1121 1122 1123
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

1124 1125
static void i915_pci_remove(struct pci_dev *pdev)
{
1126
	struct drm_i915_private *i915;
1127

1128 1129
	i915 = pci_get_drvdata(pdev);
	if (!i915) /* driver load aborted, nothing to cleanup */
1130
		return;
1131

1132
	i915_driver_remove(i915);
1133
	pci_set_drvdata(pdev, NULL);
1134 1135
}

1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166
/* 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;
}

1167 1168 1169 1170
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;
1171
	int err;
1172

1173 1174
	if (intel_info->require_force_probe &&
	    !force_probe(pdev->device, i915_modparams.force_probe)) {
1175
		dev_info(&pdev->dev,
1176
			 "Your graphics device %04x is not properly supported by the driver in this\n"
1177 1178 1179 1180
			 "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);
1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198
		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;

1199
	err = i915_driver_probe(pdev, ent);
1200 1201
	if (err)
		return err;
1202

1203
	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
1204 1205 1206 1207
		i915_pci_remove(pdev);
		return -ENODEV;
	}

1208 1209 1210 1211 1212
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
1213

1214 1215 1216 1217 1218 1219
	err = i915_perf_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}

1220
	return 0;
1221 1222
}

1223 1224 1225 1226 1227 1228 1229
static void i915_pci_shutdown(struct pci_dev *pdev)
{
	struct drm_i915_private *i915 = pci_get_drvdata(pdev);

	i915_driver_shutdown(i915);
}

1230 1231 1232 1233 1234 1235 1236 1237 1238
static struct pci_driver i915_pci_driver = {
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
	.shutdown = i915_pci_shutdown,
	.driver.pm = &i915_pm_ops,
};

1239
int i915_pci_register_driver(void)
1240 1241 1242 1243
{
	return pci_register_driver(&i915_pci_driver);
}

1244
void i915_pci_unregister_driver(void)
1245 1246 1247
{
	pci_unregister_driver(&i915_pci_driver);
}