i915_pci.c 24.6 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
#include "i915_drv.h"
32
#include "i915_globals.h"
33
#include "i915_selftest.h"
34
#include "intel_fbdev.h"
35

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

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

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

#define GEN_DEFAULT_PAGE_SIZES \
	.page_sizes = I915_GTT_PAGE_SIZE_4K

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
#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, \
162
	I9XX_COLORS, \
163 164 165
	GEN_DEFAULT_PAGE_SIZES

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

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

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

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

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

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

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

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

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

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

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

272 273 274 275 276 277 278 279
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 = {
280
	GEN3_FEATURES,
281 282
	PLATFORM(INTEL_PINEVIEW),
	.is_mobile = 1,
283 284
	.display.has_hotplug = 1,
	.display.has_overlay = 1,
285 286
};

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

586
#define GEN9_DEFAULT_PAGE_SIZES \
587
	.page_sizes = I915_GTT_PAGE_SIZE_4K | \
588 589
		      I915_GTT_PAGE_SIZE_64K | \
		      I915_GTT_PAGE_SIZE_2M
590

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

601 602
#define SKL_PLATFORM \
	GEN9_FEATURES, \
603
	PLATFORM(INTEL_SKYLAKE)
604

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

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

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


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

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

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

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

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

674
#define KBL_PLATFORM \
675
	GEN9_FEATURES, \
676
	PLATFORM(INTEL_KABYLAKE)
677

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

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

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

695
#define CFL_PLATFORM \
696
	GEN9_FEATURES, \
697
	PLATFORM(INTEL_COFFEELAKE)
698

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

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

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

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

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

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

752
static const struct intel_device_info intel_icelake_11_info = {
753
	GEN11_FEATURES,
754
	PLATFORM(INTEL_ICELAKE),
755 756
	.engine_mask =
		BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
757 758
};

759 760
static const struct intel_device_info intel_elkhartlake_info = {
	GEN11_FEATURES,
761
	PLATFORM(INTEL_ELKHARTLAKE),
762
	.require_force_probe = 1,
763 764 765 766
	.engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0),
	.ppgtt_size = 36,
};

767
#undef GEN
768
#undef PLATFORM
769

770 771 772 773 774 775 776 777
/*
 * 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),
778
	INTEL_I845G_IDS(&intel_i845g_info),
779 780 781 782 783 784 785 786 787 788 789
	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),
790 791
	INTEL_PINEVIEW_G_IDS(&intel_pineview_g_info),
	INTEL_PINEVIEW_M_IDS(&intel_pineview_m_info),
792 793
	INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info),
	INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info),
794 795 796 797
	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),
798
	INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */
799 800 801 802 803 804 805
	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),
806
	INTEL_VLV_IDS(&intel_valleyview_info),
807 808
	INTEL_BDW_GT1_IDS(&intel_broadwell_gt1_info),
	INTEL_BDW_GT2_IDS(&intel_broadwell_gt2_info),
809
	INTEL_BDW_GT3_IDS(&intel_broadwell_gt3_info),
810
	INTEL_BDW_RSVD_IDS(&intel_broadwell_rsvd_info),
811
	INTEL_CHV_IDS(&intel_cherryview_info),
812 813
	INTEL_SKL_GT1_IDS(&intel_skylake_gt1_info),
	INTEL_SKL_GT2_IDS(&intel_skylake_gt2_info),
814
	INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info),
815
	INTEL_SKL_GT4_IDS(&intel_skylake_gt4_info),
816
	INTEL_BXT_IDS(&intel_broxton_info),
817
	INTEL_GLK_IDS(&intel_geminilake_info),
818 819
	INTEL_KBL_GT1_IDS(&intel_kabylake_gt1_info),
	INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info),
820 821
	INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
	INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
822
	INTEL_AML_KBL_GT2_IDS(&intel_kabylake_gt2_info),
823 824
	INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info),
825
	INTEL_CFL_H_GT1_IDS(&intel_coffeelake_gt1_info),
826
	INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info),
827
	INTEL_CFL_U_GT2_IDS(&intel_coffeelake_gt2_info),
828
	INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info),
829 830
	INTEL_WHL_U_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_WHL_U_GT2_IDS(&intel_coffeelake_gt2_info),
831
	INTEL_AML_CFL_GT2_IDS(&intel_coffeelake_gt2_info),
832
	INTEL_WHL_U_GT3_IDS(&intel_coffeelake_gt3_info),
A
Anusha Srivatsa 已提交
833 834
	INTEL_CML_GT1_IDS(&intel_coffeelake_gt1_info),
	INTEL_CML_GT2_IDS(&intel_coffeelake_gt2_info),
835
	INTEL_CNL_IDS(&intel_cannonlake_info),
P
Paulo Zanoni 已提交
836
	INTEL_ICL_11_IDS(&intel_icelake_11_info),
837
	INTEL_EHL_IDS(&intel_elkhartlake_info),
838 839 840 841
	{0, 0, 0}
};
MODULE_DEVICE_TABLE(pci, pciidlist);

842 843
static void i915_pci_remove(struct pci_dev *pdev)
{
844 845 846 847 848
	struct drm_device *dev;

	dev = pci_get_drvdata(pdev);
	if (!dev) /* driver load aborted, nothing to cleanup */
		return;
849 850

	i915_driver_unload(dev);
851
	drm_dev_put(dev);
852 853

	pci_set_drvdata(pdev, NULL);
854 855
}

856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893
/* 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;
}

894 895 896 897
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;
898
	int err;
899

900 901 902 903 904 905 906
	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);
907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
		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;

925 926 927
	err = i915_driver_load(pdev, ent);
	if (err)
		return err;
928

929 930 931 932 933
	if (i915_inject_load_failure()) {
		i915_pci_remove(pdev);
		return -ENODEV;
	}

934 935 936 937 938
	err = i915_live_selftests(pdev);
	if (err) {
		i915_pci_remove(pdev);
		return err > 0 ? -ENOTTY : err;
	}
939

940
	return 0;
941 942
}

943
static struct pci_driver i915_pci_driver = {
944 945 946 947 948 949
	.name = DRIVER_NAME,
	.id_table = pciidlist,
	.probe = i915_pci_probe,
	.remove = i915_pci_remove,
	.driver.pm = &i915_pm_ops,
};
950 951 952 953

static int __init i915_init(void)
{
	bool use_kms = true;
954 955
	int err;

956 957 958
	err = i915_globals_init();
	if (err)
		return err;
959

960 961 962
	err = i915_mock_selftests();
	if (err)
		return err > 0 ? 0 : err;
963 964 965 966 967 968 969

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

970
	if (i915_modparams.modeset == 0)
971 972
		use_kms = false;

973
	if (vgacon_text_force() && i915_modparams.modeset == -1)
974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990
		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);
991
	i915_globals_exit();
992 993 994 995 996 997 998 999 1000 1001
}

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