i915_pci.c 25.7 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 28
#include <linux/vgaarb.h>
#include <linux/vga_switcheroo.h>

29 30
#include <drm/drm_drv.h>

31 32
#include "display/intel_fbdev.h"

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

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

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

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

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

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

121 122
#define I9XX_COLORS \
	.color = { .gamma_lut_size = 256 }
123 124 125 126
#define I965_COLORS \
	.color = { .gamma_lut_size = 129, \
		   .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
	}
127 128
#define ILK_COLORS \
	.color = { .gamma_lut_size = 1024 }
129
#define IVB_COLORS \
130
	.color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
131
#define CHV_COLORS \
132 133 134 135
	.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 已提交
136
#define GLK_COLORS \
137
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
138 139 140
		   .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
					DRM_COLOR_LUT_EQUAL_CHANNELS, \
	}
141

142
/* Keep in gen based order, and chronological order within a gen */
143 144 145 146

#define GEN_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K

147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
#define I830_FEATURES \
	GEN(2), \
	.is_mobile = 1, \
	.num_pipes = 2, \
	.display.has_overlay = 1, \
	.display.cursor_needs_physical = 1, \
	.display.overlay_needs_physical = 1, \
	.display.has_gmch = 1, \
	.gpu_reset_clobbers_display = true, \
	.hws_needs_physical = 1, \
	.unfenced_needs_alignment = 1, \
	.engine_mask = BIT(RCS0), \
	.has_snoop = true, \
	.has_coherent_ggtt = false, \
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
163
	I9XX_COLORS, \
164 165 166
	GEN_DEFAULT_PAGE_SIZES

#define I845_FEATURES \
167 168
	GEN(2), \
	.num_pipes = 1, \
169 170
	.display.has_overlay = 1, \
	.display.overlay_needs_physical = 1, \
R
Rodrigo Vivi 已提交
171
	.display.has_gmch = 1, \
172
	.gpu_reset_clobbers_display = true, \
173
	.hws_needs_physical = 1, \
174
	.unfenced_needs_alignment = 1, \
175
	.engine_mask = BIT(RCS0), \
176
	.has_snoop = true, \
177
	.has_coherent_ggtt = false, \
178 179
	I845_PIPE_OFFSETS, \
	I845_CURSOR_OFFSETS, \
180
	I9XX_COLORS, \
181
	GEN_DEFAULT_PAGE_SIZES
182

183
static const struct intel_device_info intel_i830_info = {
184
	I830_FEATURES,
185
	PLATFORM(INTEL_I830),
186 187
};

188
static const struct intel_device_info intel_i845g_info = {
189
	I845_FEATURES,
190
	PLATFORM(INTEL_I845G),
191 192
};

193
static const struct intel_device_info intel_i85x_info = {
194
	I830_FEATURES,
195
	PLATFORM(INTEL_I85X),
196
	.display.has_fbc = 1,
197 198
};

199
static const struct intel_device_info intel_i865g_info = {
200
	I845_FEATURES,
201
	PLATFORM(INTEL_I865G),
202 203
};

204
#define GEN3_FEATURES \
205 206
	GEN(3), \
	.num_pipes = 2, \
R
Rodrigo Vivi 已提交
207
	.display.has_gmch = 1, \
208
	.gpu_reset_clobbers_display = true, \
209
	.engine_mask = BIT(RCS0), \
210
	.has_snoop = true, \
211
	.has_coherent_ggtt = true, \
212 213
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
214
	I9XX_COLORS, \
215
	GEN_DEFAULT_PAGE_SIZES
216

217
static const struct intel_device_info intel_i915g_info = {
218
	GEN3_FEATURES,
219
	PLATFORM(INTEL_I915G),
220
	.has_coherent_ggtt = false,
221 222 223
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
224
	.hws_needs_physical = 1,
225
	.unfenced_needs_alignment = 1,
226
};
227

228
static const struct intel_device_info intel_i915gm_info = {
229
	GEN3_FEATURES,
230
	PLATFORM(INTEL_I915GM),
231
	.is_mobile = 1,
232 233 234 235 236
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
	.display.supports_tv = 1,
	.display.has_fbc = 1,
237
	.hws_needs_physical = 1,
238
	.unfenced_needs_alignment = 1,
239
};
240

241
static const struct intel_device_info intel_i945g_info = {
242
	GEN3_FEATURES,
243
	PLATFORM(INTEL_I945G),
244 245 246 247
	.display.has_hotplug = 1,
	.display.cursor_needs_physical = 1,
	.display.has_overlay = 1,
	.display.overlay_needs_physical = 1,
248
	.hws_needs_physical = 1,
249
	.unfenced_needs_alignment = 1,
250
};
251

252
static const struct intel_device_info intel_i945gm_info = {
253
	GEN3_FEATURES,
254 255
	PLATFORM(INTEL_I945GM),
	.is_mobile = 1,
256 257 258 259 260 261
	.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,
262
	.hws_needs_physical = 1,
263
	.unfenced_needs_alignment = 1,
264 265
};

266
static const struct intel_device_info intel_g33_info = {
267
	GEN3_FEATURES,
268
	PLATFORM(INTEL_G33),
269 270
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
271 272
};

273 274 275 276 277 278 279 280
static const struct intel_device_info intel_pineview_g_info = {
	GEN3_FEATURES,
	PLATFORM(INTEL_PINEVIEW),
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
};

static const struct intel_device_info intel_pineview_m_info = {
281
	GEN3_FEATURES,
282 283
	PLATFORM(INTEL_PINEVIEW),
	.is_mobile = 1,
284 285
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
286 287
};

288
#define GEN4_FEATURES \
289 290
	GEN(4), \
	.num_pipes = 2, \
291
	.display.has_hotplug = 1, \
R
Rodrigo Vivi 已提交
292
	.display.has_gmch = 1, \
293
	.gpu_reset_clobbers_display = true, \
294
	.engine_mask = BIT(RCS0), \
295
	.has_snoop = true, \
296
	.has_coherent_ggtt = true, \
297 298
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
299
	I965_COLORS, \
300
	GEN_DEFAULT_PAGE_SIZES
301

302
static const struct intel_device_info intel_i965g_info = {
303
	GEN4_FEATURES,
304
	PLATFORM(INTEL_I965G),
305
	.display.has_overlay = 1,
306
	.hws_needs_physical = 1,
307
	.has_snoop = false,
308 309
};

310
static const struct intel_device_info intel_i965gm_info = {
311
	GEN4_FEATURES,
312
	PLATFORM(INTEL_I965GM),
313 314 315 316
	.is_mobile = 1,
	.display.has_fbc = 1,
	.display.has_overlay = 1,
	.display.supports_tv = 1,
317
	.hws_needs_physical = 1,
318
	.has_snoop = false,
319 320
};

321
static const struct intel_device_info intel_g45_info = {
322
	GEN4_FEATURES,
323
	PLATFORM(INTEL_G45),
324
	.engine_mask = BIT(RCS0) | BIT(VCS0),
325
	.gpu_reset_clobbers_display = false,
326 327
};

328
static const struct intel_device_info intel_gm45_info = {
329
	GEN4_FEATURES,
330
	PLATFORM(INTEL_GM45),
331 332 333
	.is_mobile = 1,
	.display.has_fbc = 1,
	.display.supports_tv = 1,
334
	.engine_mask = BIT(RCS0) | BIT(VCS0),
335
	.gpu_reset_clobbers_display = false,
336 337
};

338
#define GEN5_FEATURES \
339 340
	GEN(5), \
	.num_pipes = 2, \
341
	.display.has_hotplug = 1, \
342
	.engine_mask = BIT(RCS0) | BIT(VCS0), \
343
	.has_snoop = true, \
344
	.has_coherent_ggtt = true, \
345 346
	/* ilk does support rc6, but we do not implement [power] contexts */ \
	.has_rc6 = 0, \
347 348
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
349
	ILK_COLORS, \
350
	GEN_DEFAULT_PAGE_SIZES
351

352
static const struct intel_device_info intel_ironlake_d_info = {
353
	GEN5_FEATURES,
354
	PLATFORM(INTEL_IRONLAKE),
355 356
};

357
static const struct intel_device_info intel_ironlake_m_info = {
358
	GEN5_FEATURES,
359
	PLATFORM(INTEL_IRONLAKE),
360 361
	.is_mobile = 1,
	.display.has_fbc = 1,
362 363
};

364
#define GEN6_FEATURES \
365 366
	GEN(6), \
	.num_pipes = 2, \
367 368
	.display.has_hotplug = 1, \
	.display.has_fbc = 1, \
369
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
370
	.has_coherent_ggtt = true, \
371
	.has_llc = 1, \
372
	.has_rc6 = 1, \
373
	.has_rc6p = 1, \
374
	.has_rps = true, \
375 376
	.ppgtt_type = INTEL_PPGTT_ALIASING, \
	.ppgtt_size = 31, \
377 378
	I9XX_PIPE_OFFSETS, \
	I9XX_CURSOR_OFFSETS, \
379
	ILK_COLORS, \
380
	GEN_DEFAULT_PAGE_SIZES
381

382 383
#define SNB_D_PLATFORM \
	GEN6_FEATURES, \
384
	PLATFORM(INTEL_SANDYBRIDGE)
385

386
static const struct intel_device_info intel_sandybridge_d_gt1_info = {
387 388
	SNB_D_PLATFORM,
	.gt = 1,
389 390
};

391
static const struct intel_device_info intel_sandybridge_d_gt2_info = {
392 393 394 395 396 397
	SNB_D_PLATFORM,
	.gt = 2,
};

#define SNB_M_PLATFORM \
	GEN6_FEATURES, \
398
	PLATFORM(INTEL_SANDYBRIDGE), \
399 400 401
	.is_mobile = 1


402
static const struct intel_device_info intel_sandybridge_m_gt1_info = {
403 404 405 406
	SNB_M_PLATFORM,
	.gt = 1,
};

407
static const struct intel_device_info intel_sandybridge_m_gt2_info = {
408 409
	SNB_M_PLATFORM,
	.gt = 2,
410 411 412
};

#define GEN7_FEATURES  \
413 414
	GEN(7), \
	.num_pipes = 3, \
415 416
	.display.has_hotplug = 1, \
	.display.has_fbc = 1, \
417
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
418
	.has_coherent_ggtt = true, \
419
	.has_llc = 1, \
420
	.has_rc6 = 1, \
421
	.has_rc6p = 1, \
422
	.has_rps = true, \
423
	.ppgtt_type = INTEL_PPGTT_ALIASING, \
424
	.ppgtt_size = 31, \
425 426
	IVB_PIPE_OFFSETS, \
	IVB_CURSOR_OFFSETS, \
427
	IVB_COLORS, \
428
	GEN_DEFAULT_PAGE_SIZES
429

430 431
#define IVB_D_PLATFORM \
	GEN7_FEATURES, \
432
	PLATFORM(INTEL_IVYBRIDGE), \
433 434
	.has_l3_dpf = 1

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

440
static const struct intel_device_info intel_ivybridge_d_gt2_info = {
441 442 443 444 445 446
	IVB_D_PLATFORM,
	.gt = 2,
};

#define IVB_M_PLATFORM \
	GEN7_FEATURES, \
447
	PLATFORM(INTEL_IVYBRIDGE), \
448 449 450
	.is_mobile = 1, \
	.has_l3_dpf = 1

451
static const struct intel_device_info intel_ivybridge_m_gt1_info = {
452 453 454 455
	IVB_M_PLATFORM,
	.gt = 1,
};

456
static const struct intel_device_info intel_ivybridge_m_gt2_info = {
457 458
	IVB_M_PLATFORM,
	.gt = 2,
459 460
};

461
static const struct intel_device_info intel_ivybridge_q_info = {
462
	GEN7_FEATURES,
463
	PLATFORM(INTEL_IVYBRIDGE),
464
	.gt = 2,
465
	.num_pipes = 0, /* legal, last one wins */
466
	.has_l3_dpf = 1,
467 468
};

469
static const struct intel_device_info intel_valleyview_info = {
470
	PLATFORM(INTEL_VALLEYVIEW),
471
	GEN(7),
472 473 474 475
	.is_lp = 1,
	.num_pipes = 2,
	.has_runtime_pm = 1,
	.has_rc6 = 1,
476
	.has_rps = true,
R
Rodrigo Vivi 已提交
477
	.display.has_gmch = 1,
478
	.display.has_hotplug = 1,
479
	.ppgtt_type = INTEL_PPGTT_ALIASING,
480
	.ppgtt_size = 31,
481
	.has_snoop = true,
482
	.has_coherent_ggtt = false,
483
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
484
	.display_mmio_offset = VLV_DISPLAY_BASE,
485 486
	I9XX_PIPE_OFFSETS,
	I9XX_CURSOR_OFFSETS,
487
	I965_COLORS,
488
	GEN_DEFAULT_PAGE_SIZES,
489 490
};

491
#define G75_FEATURES  \
492
	GEN7_FEATURES, \
493
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
494
	.display.has_ddi = 1, \
495
	.has_fpga_dbg = 1, \
496 497
	.display.has_psr = 1, \
	.display.has_dp_mst = 1, \
498
	.has_rc6p = 0 /* RC6p removed-by HSW */, \
499
	HSW_PIPE_OFFSETS, \
500
	.has_runtime_pm = 1
501

502
#define HSW_PLATFORM \
503
	G75_FEATURES, \
504
	PLATFORM(INTEL_HASWELL), \
505 506
	.has_l3_dpf = 1

507
static const struct intel_device_info intel_haswell_gt1_info = {
508 509 510 511
	HSW_PLATFORM,
	.gt = 1,
};

512
static const struct intel_device_info intel_haswell_gt2_info = {
513 514 515 516
	HSW_PLATFORM,
	.gt = 2,
};

517
static const struct intel_device_info intel_haswell_gt3_info = {
518 519
	HSW_PLATFORM,
	.gt = 3,
520 521
};

522 523
#define GEN8_FEATURES \
	G75_FEATURES, \
524
	GEN(8), \
525
	.has_logical_ring_contexts = 1, \
526
	.ppgtt_type = INTEL_PPGTT_FULL, \
527
	.ppgtt_size = 48, \
528 529
	.has_64bit_reloc = 1, \
	.has_reset_engine = 1
530

531
#define BDW_PLATFORM \
532
	GEN8_FEATURES, \
533
	PLATFORM(INTEL_BROADWELL)
534

535
static const struct intel_device_info intel_broadwell_gt1_info = {
536 537 538 539
	BDW_PLATFORM,
	.gt = 1,
};

540
static const struct intel_device_info intel_broadwell_gt2_info = {
541
	BDW_PLATFORM,
542 543 544
	.gt = 2,
};

545
static const struct intel_device_info intel_broadwell_rsvd_info = {
546 547 548 549 550
	BDW_PLATFORM,
	.gt = 3,
	/* According to the device ID those devices are GT3, they were
	 * previously treated as not GT3, keep it like that.
	 */
551 552
};

553
static const struct intel_device_info intel_broadwell_gt3_info = {
554
	BDW_PLATFORM,
555
	.gt = 3,
556 557
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
558 559
};

560
static const struct intel_device_info intel_cherryview_info = {
561
	PLATFORM(INTEL_CHERRYVIEW),
562 563
	GEN(8),
	.num_pipes = 3,
564
	.display.has_hotplug = 1,
565
	.is_lp = 1,
566
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
567
	.has_64bit_reloc = 1,
568
	.has_runtime_pm = 1,
569
	.has_rc6 = 1,
570
	.has_rps = true,
571
	.has_logical_ring_contexts = 1,
R
Rodrigo Vivi 已提交
572
	.display.has_gmch = 1,
573
	.ppgtt_type = INTEL_PPGTT_ALIASING,
574
	.ppgtt_size = 32,
575
	.has_reset_engine = 1,
576
	.has_snoop = true,
577
	.has_coherent_ggtt = false,
578
	.display_mmio_offset = VLV_DISPLAY_BASE,
579 580
	CHV_PIPE_OFFSETS,
	CHV_CURSOR_OFFSETS,
581
	CHV_COLORS,
582
	GEN_DEFAULT_PAGE_SIZES,
583 584
};

585
#define GEN9_DEFAULT_PAGE_SIZES \
586
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
587
		      I915_GTT_PAGE_SIZE_64K
588

589 590
#define GEN9_FEATURES \
	GEN8_FEATURES, \
591
	GEN(9), \
592
	GEN9_DEFAULT_PAGE_SIZES, \
C
Chris Wilson 已提交
593
	.has_logical_ring_preemption = 1, \
594
	.display.has_csr = 1, \
595
	.has_gt_uc = 1, \
596
	.display.has_ipc = 1, \
597 598
	.ddb_size = 896

599 600
#define SKL_PLATFORM \
	GEN9_FEATURES, \
601
	PLATFORM(INTEL_SKYLAKE)
602

603
static const struct intel_device_info intel_skylake_gt1_info = {
604
	SKL_PLATFORM,
605
	.gt = 1,
606 607
};

608
static const struct intel_device_info intel_skylake_gt2_info = {
609
	SKL_PLATFORM,
610 611 612 613 614
	.gt = 2,
};

#define SKL_GT3_PLUS_PLATFORM \
	SKL_PLATFORM, \
615 616
	.engine_mask = \
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
617 618


619
static const struct intel_device_info intel_skylake_gt3_info = {
620 621 622 623
	SKL_GT3_PLUS_PLATFORM,
	.gt = 3,
};

624
static const struct intel_device_info intel_skylake_gt4_info = {
625 626
	SKL_GT3_PLUS_PLATFORM,
	.gt = 4,
627 628
};

629
#define GEN9_LP_FEATURES \
630
	GEN(9), \
631
	.is_lp = 1, \
632
	.display.has_hotplug = 1, \
633
	.engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
634 635
	.num_pipes = 3, \
	.has_64bit_reloc = 1, \
636
	.display.has_ddi = 1, \
637
	.has_fpga_dbg = 1, \
638 639
	.display.has_fbc = 1, \
	.display.has_psr = 1, \
640
	.has_runtime_pm = 1, \
641
	.display.has_csr = 1, \
642
	.has_rc6 = 1, \
643
	.has_rps = true, \
644
	.display.has_dp_mst = 1, \
645
	.has_logical_ring_contexts = 1, \
C
Chris Wilson 已提交
646
	.has_logical_ring_preemption = 1, \
647
	.has_gt_uc = 1, \
648
	.ppgtt_type = INTEL_PPGTT_FULL, \
649
	.ppgtt_size = 48, \
650
	.has_reset_engine = 1, \
651
	.has_snoop = true, \
652
	.has_coherent_ggtt = false, \
653
	.display.has_ipc = 1, \
654
	HSW_PIPE_OFFSETS, \
655
	IVB_CURSOR_OFFSETS, \
656
	IVB_COLORS, \
657
	GEN9_DEFAULT_PAGE_SIZES
658

659
static const struct intel_device_info intel_broxton_info = {
660
	GEN9_LP_FEATURES,
661
	PLATFORM(INTEL_BROXTON),
662
	.ddb_size = 512,
663 664
};

665
static const struct intel_device_info intel_geminilake_info = {
666
	GEN9_LP_FEATURES,
667
	PLATFORM(INTEL_GEMINILAKE),
668
	.ddb_size = 1024,
R
Rodrigo Vivi 已提交
669
	GLK_COLORS,
670 671
};

672
#define KBL_PLATFORM \
673
	GEN9_FEATURES, \
674
	PLATFORM(INTEL_KABYLAKE)
675

676
static const struct intel_device_info intel_kabylake_gt1_info = {
677
	KBL_PLATFORM,
678 679 680
	.gt = 1,
};

681
static const struct intel_device_info intel_kabylake_gt2_info = {
682 683
	KBL_PLATFORM,
	.gt = 2,
684 685
};

686
static const struct intel_device_info intel_kabylake_gt3_info = {
687
	KBL_PLATFORM,
688
	.gt = 3,
689 690
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
691 692
};

693
#define CFL_PLATFORM \
694
	GEN9_FEATURES, \
695
	PLATFORM(INTEL_COFFEELAKE)
696

697
static const struct intel_device_info intel_coffeelake_gt1_info = {
698 699 700 701
	CFL_PLATFORM,
	.gt = 1,
};

702
static const struct intel_device_info intel_coffeelake_gt2_info = {
703
	CFL_PLATFORM,
704
	.gt = 2,
705 706
};

707
static const struct intel_device_info intel_coffeelake_gt3_info = {
708
	CFL_PLATFORM,
709
	.gt = 3,
710 711
	.engine_mask =
		BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
712 713
};

714 715
#define GEN10_FEATURES \
	GEN9_FEATURES, \
716
	GEN(10), \
717
	.ddb_size = 1024, \
718
	.has_coherent_ggtt = false, \
R
Rodrigo Vivi 已提交
719
	GLK_COLORS
720

721
static const struct intel_device_info intel_cannonlake_info = {
722
	GEN10_FEATURES,
723
	PLATFORM(INTEL_CANNONLAKE),
724
	.gt = 2,
725 726
};

727 728 729 730 731
#define GEN11_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M

732 733
#define GEN11_FEATURES \
	GEN10_FEATURES, \
734
	GEN11_DEFAULT_PAGE_SIZES, \
735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750
	.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, \
	}, \
751
	GEN(11), \
752
	.ddb_size = 2048, \
753
	.has_logical_ring_elsq = 1, \
754
	.color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
755

756
static const struct intel_device_info intel_icelake_11_info = {
757
	GEN11_FEATURES,
758
	PLATFORM(INTEL_ICELAKE),
759 760
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
761 762
};

763 764
static const struct intel_device_info intel_elkhartlake_info = {
	GEN11_FEATURES,
765
	PLATFORM(INTEL_ELKHARTLAKE),
766
	.require_force_probe = 1,
767
	.engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
768 769 770
	.ppgtt_size = 36,
};

771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788
#define GEN12_FEATURES \
	GEN11_FEATURES, \
	GEN(12), \
	.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, \
789 790
	}, \
	.has_global_mocs = 1
791 792 793 794 795 796

static const struct intel_device_info intel_tigerlake_12_info = {
	GEN12_FEATURES,
	PLATFORM(INTEL_TIGERLAKE),
	.num_pipes = 4,
	.require_force_probe = 1,
797
	.display.has_modular_fia = 1,
798 799
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
800
	.has_rc6 = false, /* XXX disabled for debugging */
801 802
};

803
#undef GEN
804
#undef PLATFORM
805

806 807 808 809 810 811 812 813
/*
 * 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[] = {
	INTEL_I830_IDS(&intel_i830_info),
814
	INTEL_I845G_IDS(&intel_i845g_info),
815 816 817 818 819 820 821 822 823 824 825
	INTEL_I85X_IDS(&intel_i85x_info),
	INTEL_I865G_IDS(&intel_i865g_info),
	INTEL_I915G_IDS(&intel_i915g_info),
	INTEL_I915GM_IDS(&intel_i915gm_info),
	INTEL_I945G_IDS(&intel_i945g_info),
	INTEL_I945GM_IDS(&intel_i945gm_info),
	INTEL_I965G_IDS(&intel_i965g_info),
	INTEL_G33_IDS(&intel_g33_info),
	INTEL_I965GM_IDS(&intel_i965gm_info),
	INTEL_GM45_IDS(&intel_gm45_info),
	INTEL_G45_IDS(&intel_g45_info),
826 827
	INTEL_PINEVIEW_G_IDS(&intel_pineview_g_info),
	INTEL_PINEVIEW_M_IDS(&intel_pineview_m_info),
828 829
	INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info),
	INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info),
830 831 832 833
	INTEL_SNB_D_GT1_IDS(&intel_sandybridge_d_gt1_info),
	INTEL_SNB_D_GT2_IDS(&intel_sandybridge_d_gt2_info),
	INTEL_SNB_M_GT1_IDS(&intel_sandybridge_m_gt1_info),
	INTEL_SNB_M_GT2_IDS(&intel_sandybridge_m_gt2_info),
834
	INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */
835 836 837 838 839 840 841
	INTEL_IVB_M_GT1_IDS(&intel_ivybridge_m_gt1_info),
	INTEL_IVB_M_GT2_IDS(&intel_ivybridge_m_gt2_info),
	INTEL_IVB_D_GT1_IDS(&intel_ivybridge_d_gt1_info),
	INTEL_IVB_D_GT2_IDS(&intel_ivybridge_d_gt2_info),
	INTEL_HSW_GT1_IDS(&intel_haswell_gt1_info),
	INTEL_HSW_GT2_IDS(&intel_haswell_gt2_info),
	INTEL_HSW_GT3_IDS(&intel_haswell_gt3_info),
842
	INTEL_VLV_IDS(&intel_valleyview_info),
843 844
	INTEL_BDW_GT1_IDS(&intel_broadwell_gt1_info),
	INTEL_BDW_GT2_IDS(&intel_broadwell_gt2_info),
845
	INTEL_BDW_GT3_IDS(&intel_broadwell_gt3_info),
846
	INTEL_BDW_RSVD_IDS(&intel_broadwell_rsvd_info),
847
	INTEL_CHV_IDS(&intel_cherryview_info),
848 849
	INTEL_SKL_GT1_IDS(&intel_skylake_gt1_info),
	INTEL_SKL_GT2_IDS(&intel_skylake_gt2_info),
850
	INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info),
851
	INTEL_SKL_GT4_IDS(&intel_skylake_gt4_info),
852
	INTEL_BXT_IDS(&intel_broxton_info),
853
	INTEL_GLK_IDS(&intel_geminilake_info),
854 855
	INTEL_KBL_GT1_IDS(&intel_kabylake_gt1_info),
	INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info),
856 857
	INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
	INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
858
	INTEL_AML_KBL_GT2_IDS(&intel_kabylake_gt2_info),
859 860
	INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info),
861
	INTEL_CFL_H_GT1_IDS(&intel_coffeelake_gt1_info),
862
	INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info),
863
	INTEL_CFL_U_GT2_IDS(&intel_coffeelake_gt2_info),
864
	INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info),
865 866
	INTEL_WHL_U_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_WHL_U_GT2_IDS(&intel_coffeelake_gt2_info),
867
	INTEL_AML_CFL_GT2_IDS(&intel_coffeelake_gt2_info),
868
	INTEL_WHL_U_GT3_IDS(&intel_coffeelake_gt3_info),
A
Anusha Srivatsa 已提交
869 870
	INTEL_CML_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_CML_GT2_IDS(&intel_coffeelake_gt2_info),
871
	INTEL_CNL_IDS(&intel_cannonlake_info),
P
Paulo Zanoni 已提交
872
	INTEL_ICL_11_IDS(&intel_icelake_11_info),
873
	INTEL_EHL_IDS(&intel_elkhartlake_info),
L
Lucas De Marchi 已提交
874
	INTEL_TGL_12_IDS(&intel_tigerlake_12_info),
875 876 877 878
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

879 880
static void i915_pci_remove(struct pci_dev *pdev)
{
881
	struct drm_i915_private *i915;
882

883 884
	i915 = pci_get_drvdata(pdev);
	if (!i915) /* driver load aborted, nothing to cleanup */
885
		return;
886

887
	i915_driver_remove(i915);
888
	pci_set_drvdata(pdev, NULL);
889 890

	drm_dev_put(&i915->drm);
891 892
}

893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
/* 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;

	/* FIXME: transitional */
	if (i915_modparams.alpha_support) {
		DRM_INFO("i915.alpha_support is deprecated, use i915.force_probe=%04x instead\n",
			 device_id);
		return true;
	}

	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;
}

931 932 933 934
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;
935
	int err;
936

937 938 939 940 941 942 943
	if (intel_info->require_force_probe &&
	    !force_probe(pdev->device, i915_modparams.force_probe)) {
		DRM_INFO("Your graphics device %04x is not properly supported by the driver in this\n"
			 "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);
944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
		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;

962
	err = i915_driver_probe(pdev, ent);
963 964
	if (err)
		return err;
965

966
	if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
967 968 969 970
		i915_pci_remove(pdev);
		return -ENODEV;
	}

971 972 973 974 975
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
976

977
	return 0;
978 979
}

980
static struct pci_driver i915_pci_driver = {
981 982 983 984 985 986
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
	.driver.pm = &i915_pm_ops,
};
987 988 989 990

static int __init i915_init(void)
{
	bool use_kms = true;
991 992
	int err;

993 994 995
	err = i915_globals_init();
	if (err)
		return err;
996

997 998 999
	err = i915_mock_selftests();
	if (err)
		return err > 0 ? 0 : err;
1000 1001 1002 1003 1004 1005 1006

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

1007
	if (i915_modparams.modeset == 0)
1008 1009
		use_kms = false;

1010
	if (vgacon_text_force() && i915_modparams.modeset == -1)
1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027
		use_kms = false;

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

	return pci_register_driver(&i915_pci_driver);
}

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

	pci_unregister_driver(&i915_pci_driver);
1028
	i915_globals_exit();
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038
}

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