1 /* 2 * Copyright © 2016 Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 * 23 */ 24 25 #include <linux/console.h> 26 #include <linux/vgaarb.h> 27 #include <linux/vga_switcheroo.h> 28 29 #include "i915_drv.h" 30 #include "i915_selftest.h" 31 32 #define GEN_DEFAULT_PIPEOFFSETS \ 33 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ 34 PIPE_C_OFFSET, PIPE_EDP_OFFSET }, \ 35 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ 36 TRANSCODER_C_OFFSET, TRANSCODER_EDP_OFFSET }, \ 37 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET } 38 39 #define GEN_CHV_PIPEOFFSETS \ 40 .pipe_offsets = { PIPE_A_OFFSET, PIPE_B_OFFSET, \ 41 CHV_PIPE_C_OFFSET }, \ 42 .trans_offsets = { TRANSCODER_A_OFFSET, TRANSCODER_B_OFFSET, \ 43 CHV_TRANSCODER_C_OFFSET, }, \ 44 .palette_offsets = { PALETTE_A_OFFSET, PALETTE_B_OFFSET, \ 45 CHV_PALETTE_C_OFFSET } 46 47 #define CURSOR_OFFSETS \ 48 .cursor_offsets = { CURSOR_A_OFFSET, CURSOR_B_OFFSET, CHV_CURSOR_C_OFFSET } 49 50 #define IVB_CURSOR_OFFSETS \ 51 .cursor_offsets = { CURSOR_A_OFFSET, IVB_CURSOR_B_OFFSET, IVB_CURSOR_C_OFFSET } 52 53 #define BDW_COLORS \ 54 .color = { .degamma_lut_size = 512, .gamma_lut_size = 512 } 55 #define CHV_COLORS \ 56 .color = { .degamma_lut_size = 65, .gamma_lut_size = 257 } 57 #define GLK_COLORS \ 58 .color = { .degamma_lut_size = 0, .gamma_lut_size = 1024 } 59 60 /* Keep in gen based order, and chronological order within a gen */ 61 62 #define GEN_DEFAULT_PAGE_SIZES \ 63 .page_sizes = I915_GTT_PAGE_SIZE_4K 64 65 #define GEN2_FEATURES \ 66 .gen = 2, .num_pipes = 1, \ 67 .has_overlay = 1, .overlay_needs_physical = 1, \ 68 .has_gmch_display = 1, \ 69 .hws_needs_physical = 1, \ 70 .unfenced_needs_alignment = 1, \ 71 .ring_mask = RENDER_RING, \ 72 .has_snoop = true, \ 73 GEN_DEFAULT_PIPEOFFSETS, \ 74 GEN_DEFAULT_PAGE_SIZES, \ 75 CURSOR_OFFSETS 76 77 static const struct intel_device_info intel_i830_info __initconst = { 78 GEN2_FEATURES, 79 .platform = INTEL_I830, 80 .is_mobile = 1, .cursor_needs_physical = 1, 81 .num_pipes = 2, /* legal, last one wins */ 82 }; 83 84 static const struct intel_device_info intel_i845g_info __initconst = { 85 GEN2_FEATURES, 86 .platform = INTEL_I845G, 87 }; 88 89 static const struct intel_device_info intel_i85x_info __initconst = { 90 GEN2_FEATURES, 91 .platform = INTEL_I85X, .is_mobile = 1, 92 .num_pipes = 2, /* legal, last one wins */ 93 .cursor_needs_physical = 1, 94 .has_fbc = 1, 95 }; 96 97 static const struct intel_device_info intel_i865g_info __initconst = { 98 GEN2_FEATURES, 99 .platform = INTEL_I865G, 100 }; 101 102 #define GEN3_FEATURES \ 103 .gen = 3, .num_pipes = 2, \ 104 .has_gmch_display = 1, \ 105 .ring_mask = RENDER_RING, \ 106 .has_snoop = true, \ 107 GEN_DEFAULT_PIPEOFFSETS, \ 108 GEN_DEFAULT_PAGE_SIZES, \ 109 CURSOR_OFFSETS 110 111 static const struct intel_device_info intel_i915g_info __initconst = { 112 GEN3_FEATURES, 113 .platform = INTEL_I915G, .cursor_needs_physical = 1, 114 .has_overlay = 1, .overlay_needs_physical = 1, 115 .hws_needs_physical = 1, 116 .unfenced_needs_alignment = 1, 117 }; 118 119 static const struct intel_device_info intel_i915gm_info __initconst = { 120 GEN3_FEATURES, 121 .platform = INTEL_I915GM, 122 .is_mobile = 1, 123 .cursor_needs_physical = 1, 124 .has_overlay = 1, .overlay_needs_physical = 1, 125 .supports_tv = 1, 126 .has_fbc = 1, 127 .hws_needs_physical = 1, 128 .unfenced_needs_alignment = 1, 129 }; 130 131 static const struct intel_device_info intel_i945g_info __initconst = { 132 GEN3_FEATURES, 133 .platform = INTEL_I945G, 134 .has_hotplug = 1, .cursor_needs_physical = 1, 135 .has_overlay = 1, .overlay_needs_physical = 1, 136 .hws_needs_physical = 1, 137 .unfenced_needs_alignment = 1, 138 }; 139 140 static const struct intel_device_info intel_i945gm_info __initconst = { 141 GEN3_FEATURES, 142 .platform = INTEL_I945GM, .is_mobile = 1, 143 .has_hotplug = 1, .cursor_needs_physical = 1, 144 .has_overlay = 1, .overlay_needs_physical = 1, 145 .supports_tv = 1, 146 .has_fbc = 1, 147 .hws_needs_physical = 1, 148 .unfenced_needs_alignment = 1, 149 }; 150 151 static const struct intel_device_info intel_g33_info __initconst = { 152 GEN3_FEATURES, 153 .platform = INTEL_G33, 154 .has_hotplug = 1, 155 .has_overlay = 1, 156 }; 157 158 static const struct intel_device_info intel_pineview_info __initconst = { 159 GEN3_FEATURES, 160 .platform = INTEL_PINEVIEW, .is_mobile = 1, 161 .has_hotplug = 1, 162 .has_overlay = 1, 163 }; 164 165 #define GEN4_FEATURES \ 166 .gen = 4, .num_pipes = 2, \ 167 .has_hotplug = 1, \ 168 .has_gmch_display = 1, \ 169 .ring_mask = RENDER_RING, \ 170 .has_snoop = true, \ 171 GEN_DEFAULT_PIPEOFFSETS, \ 172 GEN_DEFAULT_PAGE_SIZES, \ 173 CURSOR_OFFSETS 174 175 static const struct intel_device_info intel_i965g_info __initconst = { 176 GEN4_FEATURES, 177 .platform = INTEL_I965G, 178 .has_overlay = 1, 179 .hws_needs_physical = 1, 180 .has_snoop = false, 181 }; 182 183 static const struct intel_device_info intel_i965gm_info __initconst = { 184 GEN4_FEATURES, 185 .platform = INTEL_I965GM, 186 .is_mobile = 1, .has_fbc = 1, 187 .has_overlay = 1, 188 .supports_tv = 1, 189 .hws_needs_physical = 1, 190 .has_snoop = false, 191 }; 192 193 static const struct intel_device_info intel_g45_info __initconst = { 194 GEN4_FEATURES, 195 .platform = INTEL_G45, 196 .ring_mask = RENDER_RING | BSD_RING, 197 }; 198 199 static const struct intel_device_info intel_gm45_info __initconst = { 200 GEN4_FEATURES, 201 .platform = INTEL_GM45, 202 .is_mobile = 1, .has_fbc = 1, 203 .supports_tv = 1, 204 .ring_mask = RENDER_RING | BSD_RING, 205 }; 206 207 #define GEN5_FEATURES \ 208 .gen = 5, .num_pipes = 2, \ 209 .has_hotplug = 1, \ 210 .ring_mask = RENDER_RING | BSD_RING, \ 211 .has_snoop = true, \ 212 GEN_DEFAULT_PIPEOFFSETS, \ 213 GEN_DEFAULT_PAGE_SIZES, \ 214 CURSOR_OFFSETS 215 216 static const struct intel_device_info intel_ironlake_d_info __initconst = { 217 GEN5_FEATURES, 218 .platform = INTEL_IRONLAKE, 219 }; 220 221 static const struct intel_device_info intel_ironlake_m_info __initconst = { 222 GEN5_FEATURES, 223 .platform = INTEL_IRONLAKE, 224 .is_mobile = 1, .has_fbc = 1, 225 }; 226 227 #define GEN6_FEATURES \ 228 .gen = 6, .num_pipes = 2, \ 229 .has_hotplug = 1, \ 230 .has_fbc = 1, \ 231 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \ 232 .has_llc = 1, \ 233 .has_rc6 = 1, \ 234 .has_rc6p = 1, \ 235 .has_aliasing_ppgtt = 1, \ 236 GEN_DEFAULT_PIPEOFFSETS, \ 237 GEN_DEFAULT_PAGE_SIZES, \ 238 CURSOR_OFFSETS 239 240 #define SNB_D_PLATFORM \ 241 GEN6_FEATURES, \ 242 .platform = INTEL_SANDYBRIDGE 243 244 static const struct intel_device_info intel_sandybridge_d_gt1_info __initconst = { 245 SNB_D_PLATFORM, 246 .gt = 1, 247 }; 248 249 static const struct intel_device_info intel_sandybridge_d_gt2_info __initconst = { 250 SNB_D_PLATFORM, 251 .gt = 2, 252 }; 253 254 #define SNB_M_PLATFORM \ 255 GEN6_FEATURES, \ 256 .platform = INTEL_SANDYBRIDGE, \ 257 .is_mobile = 1 258 259 260 static const struct intel_device_info intel_sandybridge_m_gt1_info __initconst = { 261 SNB_M_PLATFORM, 262 .gt = 1, 263 }; 264 265 static const struct intel_device_info intel_sandybridge_m_gt2_info __initconst = { 266 SNB_M_PLATFORM, 267 .gt = 2, 268 }; 269 270 #define GEN7_FEATURES \ 271 .gen = 7, .num_pipes = 3, \ 272 .has_hotplug = 1, \ 273 .has_fbc = 1, \ 274 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, \ 275 .has_llc = 1, \ 276 .has_rc6 = 1, \ 277 .has_rc6p = 1, \ 278 .has_aliasing_ppgtt = 1, \ 279 .has_full_ppgtt = 1, \ 280 GEN_DEFAULT_PIPEOFFSETS, \ 281 GEN_DEFAULT_PAGE_SIZES, \ 282 IVB_CURSOR_OFFSETS 283 284 #define IVB_D_PLATFORM \ 285 GEN7_FEATURES, \ 286 .platform = INTEL_IVYBRIDGE, \ 287 .has_l3_dpf = 1 288 289 static const struct intel_device_info intel_ivybridge_d_gt1_info __initconst = { 290 IVB_D_PLATFORM, 291 .gt = 1, 292 }; 293 294 static const struct intel_device_info intel_ivybridge_d_gt2_info __initconst = { 295 IVB_D_PLATFORM, 296 .gt = 2, 297 }; 298 299 #define IVB_M_PLATFORM \ 300 GEN7_FEATURES, \ 301 .platform = INTEL_IVYBRIDGE, \ 302 .is_mobile = 1, \ 303 .has_l3_dpf = 1 304 305 static const struct intel_device_info intel_ivybridge_m_gt1_info __initconst = { 306 IVB_M_PLATFORM, 307 .gt = 1, 308 }; 309 310 static const struct intel_device_info intel_ivybridge_m_gt2_info __initconst = { 311 IVB_M_PLATFORM, 312 .gt = 2, 313 }; 314 315 static const struct intel_device_info intel_ivybridge_q_info __initconst = { 316 GEN7_FEATURES, 317 .platform = INTEL_IVYBRIDGE, 318 .gt = 2, 319 .num_pipes = 0, /* legal, last one wins */ 320 .has_l3_dpf = 1, 321 }; 322 323 static const struct intel_device_info intel_valleyview_info __initconst = { 324 .platform = INTEL_VALLEYVIEW, 325 .gen = 7, 326 .is_lp = 1, 327 .num_pipes = 2, 328 .has_psr = 1, 329 .has_runtime_pm = 1, 330 .has_rc6 = 1, 331 .has_gmch_display = 1, 332 .has_hotplug = 1, 333 .has_aliasing_ppgtt = 1, 334 .has_full_ppgtt = 1, 335 .has_snoop = true, 336 .ring_mask = RENDER_RING | BSD_RING | BLT_RING, 337 .display_mmio_offset = VLV_DISPLAY_BASE, 338 GEN_DEFAULT_PAGE_SIZES, 339 GEN_DEFAULT_PIPEOFFSETS, 340 CURSOR_OFFSETS 341 }; 342 343 #define G75_FEATURES \ 344 GEN7_FEATURES, \ 345 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, \ 346 .has_ddi = 1, \ 347 .has_fpga_dbg = 1, \ 348 .has_psr = 1, \ 349 .has_resource_streamer = 1, \ 350 .has_dp_mst = 1, \ 351 .has_rc6p = 0 /* RC6p removed-by HSW */, \ 352 .has_runtime_pm = 1 353 354 #define HSW_PLATFORM \ 355 G75_FEATURES, \ 356 .platform = INTEL_HASWELL, \ 357 .has_l3_dpf = 1 358 359 static const struct intel_device_info intel_haswell_gt1_info __initconst = { 360 HSW_PLATFORM, 361 .gt = 1, 362 }; 363 364 static const struct intel_device_info intel_haswell_gt2_info __initconst = { 365 HSW_PLATFORM, 366 .gt = 2, 367 }; 368 369 static const struct intel_device_info intel_haswell_gt3_info __initconst = { 370 HSW_PLATFORM, 371 .gt = 3, 372 }; 373 374 #define GEN8_FEATURES \ 375 G75_FEATURES, \ 376 BDW_COLORS, \ 377 .page_sizes = I915_GTT_PAGE_SIZE_4K | \ 378 I915_GTT_PAGE_SIZE_2M, \ 379 .has_logical_ring_contexts = 1, \ 380 .has_full_48bit_ppgtt = 1, \ 381 .has_64bit_reloc = 1, \ 382 .has_reset_engine = 1 383 384 #define BDW_PLATFORM \ 385 GEN8_FEATURES, \ 386 .gen = 8, \ 387 .platform = INTEL_BROADWELL 388 389 static const struct intel_device_info intel_broadwell_gt1_info __initconst = { 390 BDW_PLATFORM, 391 .gt = 1, 392 }; 393 394 static const struct intel_device_info intel_broadwell_gt2_info __initconst = { 395 BDW_PLATFORM, 396 .gt = 2, 397 }; 398 399 static const struct intel_device_info intel_broadwell_rsvd_info __initconst = { 400 BDW_PLATFORM, 401 .gt = 3, 402 /* According to the device ID those devices are GT3, they were 403 * previously treated as not GT3, keep it like that. 404 */ 405 }; 406 407 static const struct intel_device_info intel_broadwell_gt3_info __initconst = { 408 BDW_PLATFORM, 409 .gt = 3, 410 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, 411 }; 412 413 static const struct intel_device_info intel_cherryview_info __initconst = { 414 .gen = 8, .num_pipes = 3, 415 .has_hotplug = 1, 416 .is_lp = 1, 417 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, 418 .platform = INTEL_CHERRYVIEW, 419 .has_64bit_reloc = 1, 420 .has_psr = 1, 421 .has_runtime_pm = 1, 422 .has_resource_streamer = 1, 423 .has_rc6 = 1, 424 .has_logical_ring_contexts = 1, 425 .has_gmch_display = 1, 426 .has_aliasing_ppgtt = 1, 427 .has_full_ppgtt = 1, 428 .has_reset_engine = 1, 429 .has_snoop = true, 430 .display_mmio_offset = VLV_DISPLAY_BASE, 431 GEN_DEFAULT_PAGE_SIZES, 432 GEN_CHV_PIPEOFFSETS, 433 CURSOR_OFFSETS, 434 CHV_COLORS, 435 }; 436 437 #define GEN9_DEFAULT_PAGE_SIZES \ 438 .page_sizes = I915_GTT_PAGE_SIZE_4K | \ 439 I915_GTT_PAGE_SIZE_64K | \ 440 I915_GTT_PAGE_SIZE_2M 441 442 #define GEN9_FEATURES \ 443 GEN8_FEATURES, \ 444 GEN9_DEFAULT_PAGE_SIZES, \ 445 .has_logical_ring_preemption = 1, \ 446 .has_csr = 1, \ 447 .has_guc = 1, \ 448 .has_ipc = 1, \ 449 .ddb_size = 896 450 451 #define SKL_PLATFORM \ 452 GEN9_FEATURES, \ 453 .gen = 9, \ 454 .platform = INTEL_SKYLAKE 455 456 static const struct intel_device_info intel_skylake_gt1_info __initconst = { 457 SKL_PLATFORM, 458 .gt = 1, 459 }; 460 461 static const struct intel_device_info intel_skylake_gt2_info __initconst = { 462 SKL_PLATFORM, 463 .gt = 2, 464 }; 465 466 #define SKL_GT3_PLUS_PLATFORM \ 467 SKL_PLATFORM, \ 468 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING 469 470 471 static const struct intel_device_info intel_skylake_gt3_info __initconst = { 472 SKL_GT3_PLUS_PLATFORM, 473 .gt = 3, 474 }; 475 476 static const struct intel_device_info intel_skylake_gt4_info __initconst = { 477 SKL_GT3_PLUS_PLATFORM, 478 .gt = 4, 479 }; 480 481 #define GEN9_LP_FEATURES \ 482 .gen = 9, \ 483 .is_lp = 1, \ 484 .has_hotplug = 1, \ 485 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING, \ 486 .num_pipes = 3, \ 487 .has_64bit_reloc = 1, \ 488 .has_ddi = 1, \ 489 .has_fpga_dbg = 1, \ 490 .has_fbc = 1, \ 491 .has_psr = 1, \ 492 .has_runtime_pm = 1, \ 493 .has_pooled_eu = 0, \ 494 .has_csr = 1, \ 495 .has_resource_streamer = 1, \ 496 .has_rc6 = 1, \ 497 .has_dp_mst = 1, \ 498 .has_logical_ring_contexts = 1, \ 499 .has_logical_ring_preemption = 1, \ 500 .has_guc = 1, \ 501 .has_aliasing_ppgtt = 1, \ 502 .has_full_ppgtt = 1, \ 503 .has_full_48bit_ppgtt = 1, \ 504 .has_reset_engine = 1, \ 505 .has_snoop = true, \ 506 .has_ipc = 1, \ 507 GEN9_DEFAULT_PAGE_SIZES, \ 508 GEN_DEFAULT_PIPEOFFSETS, \ 509 IVB_CURSOR_OFFSETS, \ 510 BDW_COLORS 511 512 static const struct intel_device_info intel_broxton_info __initconst = { 513 GEN9_LP_FEATURES, 514 .platform = INTEL_BROXTON, 515 .ddb_size = 512, 516 }; 517 518 static const struct intel_device_info intel_geminilake_info __initconst = { 519 GEN9_LP_FEATURES, 520 .platform = INTEL_GEMINILAKE, 521 .ddb_size = 1024, 522 GLK_COLORS, 523 }; 524 525 #define KBL_PLATFORM \ 526 GEN9_FEATURES, \ 527 .gen = 9, \ 528 .platform = INTEL_KABYLAKE 529 530 static const struct intel_device_info intel_kabylake_gt1_info __initconst = { 531 KBL_PLATFORM, 532 .gt = 1, 533 }; 534 535 static const struct intel_device_info intel_kabylake_gt2_info __initconst = { 536 KBL_PLATFORM, 537 .gt = 2, 538 }; 539 540 static const struct intel_device_info intel_kabylake_gt3_info __initconst = { 541 KBL_PLATFORM, 542 .gt = 3, 543 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, 544 }; 545 546 #define CFL_PLATFORM \ 547 GEN9_FEATURES, \ 548 .gen = 9, \ 549 .platform = INTEL_COFFEELAKE 550 551 static const struct intel_device_info intel_coffeelake_gt1_info __initconst = { 552 CFL_PLATFORM, 553 .gt = 1, 554 }; 555 556 static const struct intel_device_info intel_coffeelake_gt2_info __initconst = { 557 CFL_PLATFORM, 558 .gt = 2, 559 }; 560 561 static const struct intel_device_info intel_coffeelake_gt3_info __initconst = { 562 CFL_PLATFORM, 563 .gt = 3, 564 .ring_mask = RENDER_RING | BSD_RING | BLT_RING | VEBOX_RING | BSD2_RING, 565 }; 566 567 #define GEN10_FEATURES \ 568 GEN9_FEATURES, \ 569 .ddb_size = 1024, \ 570 GLK_COLORS 571 572 static const struct intel_device_info intel_cannonlake_gt2_info __initconst = { 573 GEN10_FEATURES, 574 .is_alpha_support = 1, 575 .platform = INTEL_CANNONLAKE, 576 .gen = 10, 577 .gt = 2, 578 }; 579 580 /* 581 * Make sure any device matches here are from most specific to most 582 * general. For example, since the Quanta match is based on the subsystem 583 * and subvendor IDs, we need it to come before the more general IVB 584 * PCI ID matches, otherwise we'll use the wrong info struct above. 585 */ 586 static const struct pci_device_id pciidlist[] = { 587 INTEL_I830_IDS(&intel_i830_info), 588 INTEL_I845G_IDS(&intel_i845g_info), 589 INTEL_I85X_IDS(&intel_i85x_info), 590 INTEL_I865G_IDS(&intel_i865g_info), 591 INTEL_I915G_IDS(&intel_i915g_info), 592 INTEL_I915GM_IDS(&intel_i915gm_info), 593 INTEL_I945G_IDS(&intel_i945g_info), 594 INTEL_I945GM_IDS(&intel_i945gm_info), 595 INTEL_I965G_IDS(&intel_i965g_info), 596 INTEL_G33_IDS(&intel_g33_info), 597 INTEL_I965GM_IDS(&intel_i965gm_info), 598 INTEL_GM45_IDS(&intel_gm45_info), 599 INTEL_G45_IDS(&intel_g45_info), 600 INTEL_PINEVIEW_IDS(&intel_pineview_info), 601 INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info), 602 INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info), 603 INTEL_SNB_D_GT1_IDS(&intel_sandybridge_d_gt1_info), 604 INTEL_SNB_D_GT2_IDS(&intel_sandybridge_d_gt2_info), 605 INTEL_SNB_M_GT1_IDS(&intel_sandybridge_m_gt1_info), 606 INTEL_SNB_M_GT2_IDS(&intel_sandybridge_m_gt2_info), 607 INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */ 608 INTEL_IVB_M_GT1_IDS(&intel_ivybridge_m_gt1_info), 609 INTEL_IVB_M_GT2_IDS(&intel_ivybridge_m_gt2_info), 610 INTEL_IVB_D_GT1_IDS(&intel_ivybridge_d_gt1_info), 611 INTEL_IVB_D_GT2_IDS(&intel_ivybridge_d_gt2_info), 612 INTEL_HSW_GT1_IDS(&intel_haswell_gt1_info), 613 INTEL_HSW_GT2_IDS(&intel_haswell_gt2_info), 614 INTEL_HSW_GT3_IDS(&intel_haswell_gt3_info), 615 INTEL_VLV_IDS(&intel_valleyview_info), 616 INTEL_BDW_GT1_IDS(&intel_broadwell_gt1_info), 617 INTEL_BDW_GT2_IDS(&intel_broadwell_gt2_info), 618 INTEL_BDW_GT3_IDS(&intel_broadwell_gt3_info), 619 INTEL_BDW_RSVD_IDS(&intel_broadwell_rsvd_info), 620 INTEL_CHV_IDS(&intel_cherryview_info), 621 INTEL_SKL_GT1_IDS(&intel_skylake_gt1_info), 622 INTEL_SKL_GT2_IDS(&intel_skylake_gt2_info), 623 INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info), 624 INTEL_SKL_GT4_IDS(&intel_skylake_gt4_info), 625 INTEL_BXT_IDS(&intel_broxton_info), 626 INTEL_GLK_IDS(&intel_geminilake_info), 627 INTEL_KBL_GT1_IDS(&intel_kabylake_gt1_info), 628 INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info), 629 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info), 630 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info), 631 INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info), 632 INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info), 633 INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info), 634 INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info), 635 INTEL_CNL_U_GT2_IDS(&intel_cannonlake_gt2_info), 636 INTEL_CNL_Y_GT2_IDS(&intel_cannonlake_gt2_info), 637 {0, 0, 0} 638 }; 639 MODULE_DEVICE_TABLE(pci, pciidlist); 640 641 static void i915_pci_remove(struct pci_dev *pdev) 642 { 643 struct drm_device *dev = pci_get_drvdata(pdev); 644 645 i915_driver_unload(dev); 646 drm_dev_put(dev); 647 } 648 649 static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) 650 { 651 struct intel_device_info *intel_info = 652 (struct intel_device_info *) ent->driver_data; 653 int err; 654 655 if (IS_ALPHA_SUPPORT(intel_info) && !i915_modparams.alpha_support) { 656 DRM_INFO("The driver support for your hardware in this kernel version is alpha quality\n" 657 "See CONFIG_DRM_I915_ALPHA_SUPPORT or i915.alpha_support module parameter\n" 658 "to enable support in this kernel version, or check for kernel updates.\n"); 659 return -ENODEV; 660 } 661 662 /* Only bind to function 0 of the device. Early generations 663 * used function 1 as a placeholder for multi-head. This causes 664 * us confusion instead, especially on the systems where both 665 * functions have the same PCI-ID! 666 */ 667 if (PCI_FUNC(pdev->devfn)) 668 return -ENODEV; 669 670 /* 671 * apple-gmux is needed on dual GPU MacBook Pro 672 * to probe the panel if we're the inactive GPU. 673 */ 674 if (vga_switcheroo_client_probe_defer(pdev)) 675 return -EPROBE_DEFER; 676 677 err = i915_driver_load(pdev, ent); 678 if (err) 679 return err; 680 681 err = i915_live_selftests(pdev); 682 if (err) { 683 i915_pci_remove(pdev); 684 return err > 0 ? -ENOTTY : err; 685 } 686 687 return 0; 688 } 689 690 static struct pci_driver i915_pci_driver = { 691 .name = DRIVER_NAME, 692 .id_table = pciidlist, 693 .probe = i915_pci_probe, 694 .remove = i915_pci_remove, 695 .driver.pm = &i915_pm_ops, 696 }; 697 698 static int __init i915_init(void) 699 { 700 bool use_kms = true; 701 int err; 702 703 err = i915_mock_selftests(); 704 if (err) 705 return err > 0 ? 0 : err; 706 707 /* 708 * Enable KMS by default, unless explicitly overriden by 709 * either the i915.modeset prarameter or by the 710 * vga_text_mode_force boot option. 711 */ 712 713 if (i915_modparams.modeset == 0) 714 use_kms = false; 715 716 if (vgacon_text_force() && i915_modparams.modeset == -1) 717 use_kms = false; 718 719 if (!use_kms) { 720 /* Silently fail loading to not upset userspace. */ 721 DRM_DEBUG_DRIVER("KMS disabled.\n"); 722 return 0; 723 } 724 725 return pci_register_driver(&i915_pci_driver); 726 } 727 728 static void __exit i915_exit(void) 729 { 730 if (!i915_pci_driver.driver.owner) 731 return; 732 733 pci_unregister_driver(&i915_pci_driver); 734 } 735 736 module_init(i915_init); 737 module_exit(i915_exit); 738 739 MODULE_AUTHOR("Tungsten Graphics, Inc."); 740 MODULE_AUTHOR("Intel Corporation"); 741 742 MODULE_DESCRIPTION(DRIVER_DESC); 743 MODULE_LICENSE("GPL and additional rights"); 744