2 * Copyright © 2016 Intel Corporation
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:
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
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
25 #include <linux/console.h>
26 #include <linux/vga_switcheroo.h>
28 #include <drm/drm_drv.h>
30 #include "display/intel_fbdev.h"
33 #include "i915_globals.h"
34 #include "i915_selftest.h"
36 #define PLATFORM(x) .platform = (x)
37 #define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
39 #define I845_PIPE_OFFSETS \
41 [TRANSCODER_A] = PIPE_A_OFFSET, \
44 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
47 #define I9XX_PIPE_OFFSETS \
49 [TRANSCODER_A] = PIPE_A_OFFSET, \
50 [TRANSCODER_B] = PIPE_B_OFFSET, \
53 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
54 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
57 #define IVB_PIPE_OFFSETS \
59 [TRANSCODER_A] = PIPE_A_OFFSET, \
60 [TRANSCODER_B] = PIPE_B_OFFSET, \
61 [TRANSCODER_C] = PIPE_C_OFFSET, \
64 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
65 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
66 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
69 #define HSW_PIPE_OFFSETS \
71 [TRANSCODER_A] = PIPE_A_OFFSET, \
72 [TRANSCODER_B] = PIPE_B_OFFSET, \
73 [TRANSCODER_C] = PIPE_C_OFFSET, \
74 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
77 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
78 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
79 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
80 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
83 #define CHV_PIPE_OFFSETS \
85 [TRANSCODER_A] = PIPE_A_OFFSET, \
86 [TRANSCODER_B] = PIPE_B_OFFSET, \
87 [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
90 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
91 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
92 [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
95 #define I845_CURSOR_OFFSETS \
97 [PIPE_A] = CURSOR_A_OFFSET, \
100 #define I9XX_CURSOR_OFFSETS \
101 .cursor_offsets = { \
102 [PIPE_A] = CURSOR_A_OFFSET, \
103 [PIPE_B] = CURSOR_B_OFFSET, \
106 #define CHV_CURSOR_OFFSETS \
107 .cursor_offsets = { \
108 [PIPE_A] = CURSOR_A_OFFSET, \
109 [PIPE_B] = CURSOR_B_OFFSET, \
110 [PIPE_C] = CHV_CURSOR_C_OFFSET, \
113 #define IVB_CURSOR_OFFSETS \
114 .cursor_offsets = { \
115 [PIPE_A] = CURSOR_A_OFFSET, \
116 [PIPE_B] = IVB_CURSOR_B_OFFSET, \
117 [PIPE_C] = IVB_CURSOR_C_OFFSET, \
120 #define TGL_CURSOR_OFFSETS \
121 .cursor_offsets = { \
122 [PIPE_A] = CURSOR_A_OFFSET, \
123 [PIPE_B] = IVB_CURSOR_B_OFFSET, \
124 [PIPE_C] = IVB_CURSOR_C_OFFSET, \
125 [PIPE_D] = TGL_CURSOR_D_OFFSET, \
128 #define I9XX_COLORS \
129 .color = { .gamma_lut_size = 256 }
130 #define I965_COLORS \
131 .color = { .gamma_lut_size = 129, \
132 .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
135 .color = { .gamma_lut_size = 1024 }
137 .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
139 .color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
140 .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
141 .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
144 .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
145 .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
146 DRM_COLOR_LUT_EQUAL_CHANNELS, \
149 /* Keep in gen based order, and chronological order within a gen */
151 #define GEN_DEFAULT_PAGE_SIZES \
152 .page_sizes = I915_GTT_PAGE_SIZE_4K
154 #define GEN_DEFAULT_REGIONS \
155 .memory_regions = REGION_SMEM | REGION_STOLEN
157 #define I830_FEATURES \
160 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
161 .display.has_overlay = 1, \
162 .display.cursor_needs_physical = 1, \
163 .display.overlay_needs_physical = 1, \
164 .display.has_gmch = 1, \
165 .gpu_reset_clobbers_display = true, \
166 .hws_needs_physical = 1, \
167 .unfenced_needs_alignment = 1, \
168 .engine_mask = BIT(RCS0), \
170 .has_coherent_ggtt = false, \
172 I9XX_CURSOR_OFFSETS, \
174 GEN_DEFAULT_PAGE_SIZES, \
177 #define I845_FEATURES \
179 .pipe_mask = BIT(PIPE_A), \
180 .display.has_overlay = 1, \
181 .display.overlay_needs_physical = 1, \
182 .display.has_gmch = 1, \
183 .gpu_reset_clobbers_display = true, \
184 .hws_needs_physical = 1, \
185 .unfenced_needs_alignment = 1, \
186 .engine_mask = BIT(RCS0), \
188 .has_coherent_ggtt = false, \
190 I845_CURSOR_OFFSETS, \
192 GEN_DEFAULT_PAGE_SIZES, \
195 static const struct intel_device_info intel_i830_info = {
197 PLATFORM(INTEL_I830),
200 static const struct intel_device_info intel_i845g_info = {
202 PLATFORM(INTEL_I845G),
205 static const struct intel_device_info intel_i85x_info = {
207 PLATFORM(INTEL_I85X),
208 .display.has_fbc = 1,
211 static const struct intel_device_info intel_i865g_info = {
213 PLATFORM(INTEL_I865G),
216 #define GEN3_FEATURES \
218 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
219 .display.has_gmch = 1, \
220 .gpu_reset_clobbers_display = true, \
221 .engine_mask = BIT(RCS0), \
223 .has_coherent_ggtt = true, \
225 I9XX_CURSOR_OFFSETS, \
227 GEN_DEFAULT_PAGE_SIZES, \
230 static const struct intel_device_info intel_i915g_info = {
232 PLATFORM(INTEL_I915G),
233 .has_coherent_ggtt = false,
234 .display.cursor_needs_physical = 1,
235 .display.has_overlay = 1,
236 .display.overlay_needs_physical = 1,
237 .hws_needs_physical = 1,
238 .unfenced_needs_alignment = 1,
241 static const struct intel_device_info intel_i915gm_info = {
243 PLATFORM(INTEL_I915GM),
245 .display.cursor_needs_physical = 1,
246 .display.has_overlay = 1,
247 .display.overlay_needs_physical = 1,
248 .display.supports_tv = 1,
249 .display.has_fbc = 1,
250 .hws_needs_physical = 1,
251 .unfenced_needs_alignment = 1,
254 static const struct intel_device_info intel_i945g_info = {
256 PLATFORM(INTEL_I945G),
257 .display.has_hotplug = 1,
258 .display.cursor_needs_physical = 1,
259 .display.has_overlay = 1,
260 .display.overlay_needs_physical = 1,
261 .hws_needs_physical = 1,
262 .unfenced_needs_alignment = 1,
265 static const struct intel_device_info intel_i945gm_info = {
267 PLATFORM(INTEL_I945GM),
269 .display.has_hotplug = 1,
270 .display.cursor_needs_physical = 1,
271 .display.has_overlay = 1,
272 .display.overlay_needs_physical = 1,
273 .display.supports_tv = 1,
274 .display.has_fbc = 1,
275 .hws_needs_physical = 1,
276 .unfenced_needs_alignment = 1,
279 static const struct intel_device_info intel_g33_info = {
282 .display.has_hotplug = 1,
283 .display.has_overlay = 1,
286 static const struct intel_device_info intel_pineview_g_info = {
288 PLATFORM(INTEL_PINEVIEW),
289 .display.has_hotplug = 1,
290 .display.has_overlay = 1,
293 static const struct intel_device_info intel_pineview_m_info = {
295 PLATFORM(INTEL_PINEVIEW),
297 .display.has_hotplug = 1,
298 .display.has_overlay = 1,
301 #define GEN4_FEATURES \
303 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
304 .display.has_hotplug = 1, \
305 .display.has_gmch = 1, \
306 .gpu_reset_clobbers_display = true, \
307 .engine_mask = BIT(RCS0), \
309 .has_coherent_ggtt = true, \
311 I9XX_CURSOR_OFFSETS, \
313 GEN_DEFAULT_PAGE_SIZES, \
316 static const struct intel_device_info intel_i965g_info = {
318 PLATFORM(INTEL_I965G),
319 .display.has_overlay = 1,
320 .hws_needs_physical = 1,
324 static const struct intel_device_info intel_i965gm_info = {
326 PLATFORM(INTEL_I965GM),
328 .display.has_fbc = 1,
329 .display.has_overlay = 1,
330 .display.supports_tv = 1,
331 .hws_needs_physical = 1,
335 static const struct intel_device_info intel_g45_info = {
338 .engine_mask = BIT(RCS0) | BIT(VCS0),
339 .gpu_reset_clobbers_display = false,
342 static const struct intel_device_info intel_gm45_info = {
344 PLATFORM(INTEL_GM45),
346 .display.has_fbc = 1,
347 .display.supports_tv = 1,
348 .engine_mask = BIT(RCS0) | BIT(VCS0),
349 .gpu_reset_clobbers_display = false,
352 #define GEN5_FEATURES \
354 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
355 .display.has_hotplug = 1, \
356 .engine_mask = BIT(RCS0) | BIT(VCS0), \
358 .has_coherent_ggtt = true, \
359 /* ilk does support rc6, but we do not implement [power] contexts */ \
362 I9XX_CURSOR_OFFSETS, \
364 GEN_DEFAULT_PAGE_SIZES, \
367 static const struct intel_device_info intel_ironlake_d_info = {
369 PLATFORM(INTEL_IRONLAKE),
372 static const struct intel_device_info intel_ironlake_m_info = {
374 PLATFORM(INTEL_IRONLAKE),
376 .display.has_fbc = 1,
379 #define GEN6_FEATURES \
381 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
382 .display.has_hotplug = 1, \
383 .display.has_fbc = 1, \
384 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
385 .has_coherent_ggtt = true, \
390 .ppgtt_type = INTEL_PPGTT_ALIASING, \
393 I9XX_CURSOR_OFFSETS, \
395 GEN_DEFAULT_PAGE_SIZES, \
398 #define SNB_D_PLATFORM \
400 PLATFORM(INTEL_SANDYBRIDGE)
402 static const struct intel_device_info intel_sandybridge_d_gt1_info = {
407 static const struct intel_device_info intel_sandybridge_d_gt2_info = {
412 #define SNB_M_PLATFORM \
414 PLATFORM(INTEL_SANDYBRIDGE), \
418 static const struct intel_device_info intel_sandybridge_m_gt1_info = {
423 static const struct intel_device_info intel_sandybridge_m_gt2_info = {
428 #define GEN7_FEATURES \
430 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
431 .display.has_hotplug = 1, \
432 .display.has_fbc = 1, \
433 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
434 .has_coherent_ggtt = true, \
439 .ppgtt_type = INTEL_PPGTT_ALIASING, \
442 IVB_CURSOR_OFFSETS, \
444 GEN_DEFAULT_PAGE_SIZES, \
447 #define IVB_D_PLATFORM \
449 PLATFORM(INTEL_IVYBRIDGE), \
452 static const struct intel_device_info intel_ivybridge_d_gt1_info = {
457 static const struct intel_device_info intel_ivybridge_d_gt2_info = {
462 #define IVB_M_PLATFORM \
464 PLATFORM(INTEL_IVYBRIDGE), \
468 static const struct intel_device_info intel_ivybridge_m_gt1_info = {
473 static const struct intel_device_info intel_ivybridge_m_gt2_info = {
478 static const struct intel_device_info intel_ivybridge_q_info = {
480 PLATFORM(INTEL_IVYBRIDGE),
482 .pipe_mask = 0, /* legal, last one wins */
486 static const struct intel_device_info intel_valleyview_info = {
487 PLATFORM(INTEL_VALLEYVIEW),
490 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
494 .display.has_gmch = 1,
495 .display.has_hotplug = 1,
496 .ppgtt_type = INTEL_PPGTT_ALIASING,
499 .has_coherent_ggtt = false,
500 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
501 .display_mmio_offset = VLV_DISPLAY_BASE,
505 GEN_DEFAULT_PAGE_SIZES,
509 #define G75_FEATURES \
511 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
512 .display.has_ddi = 1, \
514 .display.has_psr = 1, \
515 .display.has_dp_mst = 1, \
516 .has_rc6p = 0 /* RC6p removed-by HSW */, \
520 #define HSW_PLATFORM \
522 PLATFORM(INTEL_HASWELL), \
525 static const struct intel_device_info intel_haswell_gt1_info = {
530 static const struct intel_device_info intel_haswell_gt2_info = {
535 static const struct intel_device_info intel_haswell_gt3_info = {
540 #define GEN8_FEATURES \
543 .has_logical_ring_contexts = 1, \
544 .ppgtt_type = INTEL_PPGTT_FULL, \
546 .has_64bit_reloc = 1, \
547 .has_reset_engine = 1
549 #define BDW_PLATFORM \
551 PLATFORM(INTEL_BROADWELL)
553 static const struct intel_device_info intel_broadwell_gt1_info = {
558 static const struct intel_device_info intel_broadwell_gt2_info = {
563 static const struct intel_device_info intel_broadwell_rsvd_info = {
566 /* According to the device ID those devices are GT3, they were
567 * previously treated as not GT3, keep it like that.
571 static const struct intel_device_info intel_broadwell_gt3_info = {
575 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
578 static const struct intel_device_info intel_cherryview_info = {
579 PLATFORM(INTEL_CHERRYVIEW),
581 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
582 .display.has_hotplug = 1,
584 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
585 .has_64bit_reloc = 1,
589 .has_logical_ring_contexts = 1,
590 .display.has_gmch = 1,
591 .ppgtt_type = INTEL_PPGTT_ALIASING,
593 .has_reset_engine = 1,
595 .has_coherent_ggtt = false,
596 .display_mmio_offset = VLV_DISPLAY_BASE,
600 GEN_DEFAULT_PAGE_SIZES,
604 #define GEN9_DEFAULT_PAGE_SIZES \
605 .page_sizes = I915_GTT_PAGE_SIZE_4K | \
606 I915_GTT_PAGE_SIZE_64K
608 #define GEN9_FEATURES \
611 GEN9_DEFAULT_PAGE_SIZES, \
612 .has_logical_ring_preemption = 1, \
613 .display.has_csr = 1, \
615 .display.has_hdcp = 1, \
616 .display.has_ipc = 1, \
619 #define SKL_PLATFORM \
621 PLATFORM(INTEL_SKYLAKE)
623 static const struct intel_device_info intel_skylake_gt1_info = {
628 static const struct intel_device_info intel_skylake_gt2_info = {
633 #define SKL_GT3_PLUS_PLATFORM \
636 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
639 static const struct intel_device_info intel_skylake_gt3_info = {
640 SKL_GT3_PLUS_PLATFORM,
644 static const struct intel_device_info intel_skylake_gt4_info = {
645 SKL_GT3_PLUS_PLATFORM,
649 #define GEN9_LP_FEATURES \
652 .display.has_hotplug = 1, \
653 .engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
654 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
655 .has_64bit_reloc = 1, \
656 .display.has_ddi = 1, \
658 .display.has_fbc = 1, \
659 .display.has_hdcp = 1, \
660 .display.has_psr = 1, \
661 .has_runtime_pm = 1, \
662 .display.has_csr = 1, \
665 .display.has_dp_mst = 1, \
666 .has_logical_ring_contexts = 1, \
667 .has_logical_ring_preemption = 1, \
669 .ppgtt_type = INTEL_PPGTT_FULL, \
671 .has_reset_engine = 1, \
673 .has_coherent_ggtt = false, \
674 .display.has_ipc = 1, \
676 IVB_CURSOR_OFFSETS, \
678 GEN9_DEFAULT_PAGE_SIZES, \
681 static const struct intel_device_info intel_broxton_info = {
683 PLATFORM(INTEL_BROXTON),
687 static const struct intel_device_info intel_geminilake_info = {
689 PLATFORM(INTEL_GEMINILAKE),
694 #define KBL_PLATFORM \
696 PLATFORM(INTEL_KABYLAKE)
698 static const struct intel_device_info intel_kabylake_gt1_info = {
703 static const struct intel_device_info intel_kabylake_gt2_info = {
708 static const struct intel_device_info intel_kabylake_gt3_info = {
712 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
715 #define CFL_PLATFORM \
717 PLATFORM(INTEL_COFFEELAKE)
719 static const struct intel_device_info intel_coffeelake_gt1_info = {
724 static const struct intel_device_info intel_coffeelake_gt2_info = {
729 static const struct intel_device_info intel_coffeelake_gt3_info = {
733 BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
736 #define GEN10_FEATURES \
740 .display.has_dsc = 1, \
741 .has_coherent_ggtt = false, \
744 static const struct intel_device_info intel_cannonlake_info = {
746 PLATFORM(INTEL_CANNONLAKE),
750 #define GEN11_DEFAULT_PAGE_SIZES \
751 .page_sizes = I915_GTT_PAGE_SIZE_4K | \
752 I915_GTT_PAGE_SIZE_64K | \
753 I915_GTT_PAGE_SIZE_2M
755 #define GEN11_FEATURES \
757 GEN11_DEFAULT_PAGE_SIZES, \
759 [TRANSCODER_A] = PIPE_A_OFFSET, \
760 [TRANSCODER_B] = PIPE_B_OFFSET, \
761 [TRANSCODER_C] = PIPE_C_OFFSET, \
762 [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
763 [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
764 [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
767 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
768 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
769 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
770 [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
771 [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
772 [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
776 .has_logical_ring_elsq = 1, \
777 .color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
779 static const struct intel_device_info intel_icelake_11_info = {
781 PLATFORM(INTEL_ICELAKE),
783 BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
786 static const struct intel_device_info intel_elkhartlake_info = {
788 PLATFORM(INTEL_ELKHARTLAKE),
789 .require_force_probe = 1,
790 .engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
794 #define GEN12_FEATURES \
798 [TRANSCODER_A] = PIPE_A_OFFSET, \
799 [TRANSCODER_B] = PIPE_B_OFFSET, \
800 [TRANSCODER_C] = PIPE_C_OFFSET, \
801 [TRANSCODER_D] = PIPE_D_OFFSET, \
802 [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
803 [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
806 [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
807 [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
808 [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
809 [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
810 [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
811 [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
813 TGL_CURSOR_OFFSETS, \
814 .has_global_mocs = 1, \
817 static const struct intel_device_info intel_tigerlake_12_info = {
819 PLATFORM(INTEL_TIGERLAKE),
820 .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
821 .require_force_probe = 1,
822 .display.has_modular_fia = 1,
824 BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
825 .has_rps = false, /* XXX disabled for debugging */
828 #define GEN12_DGFX_FEATURES \
836 * Make sure any device matches here are from most specific to most
837 * general. For example, since the Quanta match is based on the subsystem
838 * and subvendor IDs, we need it to come before the more general IVB
839 * PCI ID matches, otherwise we'll use the wrong info struct above.
841 static const struct pci_device_id pciidlist[] = {
842 INTEL_I830_IDS(&intel_i830_info),
843 INTEL_I845G_IDS(&intel_i845g_info),
844 INTEL_I85X_IDS(&intel_i85x_info),
845 INTEL_I865G_IDS(&intel_i865g_info),
846 INTEL_I915G_IDS(&intel_i915g_info),
847 INTEL_I915GM_IDS(&intel_i915gm_info),
848 INTEL_I945G_IDS(&intel_i945g_info),
849 INTEL_I945GM_IDS(&intel_i945gm_info),
850 INTEL_I965G_IDS(&intel_i965g_info),
851 INTEL_G33_IDS(&intel_g33_info),
852 INTEL_I965GM_IDS(&intel_i965gm_info),
853 INTEL_GM45_IDS(&intel_gm45_info),
854 INTEL_G45_IDS(&intel_g45_info),
855 INTEL_PINEVIEW_G_IDS(&intel_pineview_g_info),
856 INTEL_PINEVIEW_M_IDS(&intel_pineview_m_info),
857 INTEL_IRONLAKE_D_IDS(&intel_ironlake_d_info),
858 INTEL_IRONLAKE_M_IDS(&intel_ironlake_m_info),
859 INTEL_SNB_D_GT1_IDS(&intel_sandybridge_d_gt1_info),
860 INTEL_SNB_D_GT2_IDS(&intel_sandybridge_d_gt2_info),
861 INTEL_SNB_M_GT1_IDS(&intel_sandybridge_m_gt1_info),
862 INTEL_SNB_M_GT2_IDS(&intel_sandybridge_m_gt2_info),
863 INTEL_IVB_Q_IDS(&intel_ivybridge_q_info), /* must be first IVB */
864 INTEL_IVB_M_GT1_IDS(&intel_ivybridge_m_gt1_info),
865 INTEL_IVB_M_GT2_IDS(&intel_ivybridge_m_gt2_info),
866 INTEL_IVB_D_GT1_IDS(&intel_ivybridge_d_gt1_info),
867 INTEL_IVB_D_GT2_IDS(&intel_ivybridge_d_gt2_info),
868 INTEL_HSW_GT1_IDS(&intel_haswell_gt1_info),
869 INTEL_HSW_GT2_IDS(&intel_haswell_gt2_info),
870 INTEL_HSW_GT3_IDS(&intel_haswell_gt3_info),
871 INTEL_VLV_IDS(&intel_valleyview_info),
872 INTEL_BDW_GT1_IDS(&intel_broadwell_gt1_info),
873 INTEL_BDW_GT2_IDS(&intel_broadwell_gt2_info),
874 INTEL_BDW_GT3_IDS(&intel_broadwell_gt3_info),
875 INTEL_BDW_RSVD_IDS(&intel_broadwell_rsvd_info),
876 INTEL_CHV_IDS(&intel_cherryview_info),
877 INTEL_SKL_GT1_IDS(&intel_skylake_gt1_info),
878 INTEL_SKL_GT2_IDS(&intel_skylake_gt2_info),
879 INTEL_SKL_GT3_IDS(&intel_skylake_gt3_info),
880 INTEL_SKL_GT4_IDS(&intel_skylake_gt4_info),
881 INTEL_BXT_IDS(&intel_broxton_info),
882 INTEL_GLK_IDS(&intel_geminilake_info),
883 INTEL_KBL_GT1_IDS(&intel_kabylake_gt1_info),
884 INTEL_KBL_GT2_IDS(&intel_kabylake_gt2_info),
885 INTEL_KBL_GT3_IDS(&intel_kabylake_gt3_info),
886 INTEL_KBL_GT4_IDS(&intel_kabylake_gt3_info),
887 INTEL_AML_KBL_GT2_IDS(&intel_kabylake_gt2_info),
888 INTEL_CFL_S_GT1_IDS(&intel_coffeelake_gt1_info),
889 INTEL_CFL_S_GT2_IDS(&intel_coffeelake_gt2_info),
890 INTEL_CFL_H_GT1_IDS(&intel_coffeelake_gt1_info),
891 INTEL_CFL_H_GT2_IDS(&intel_coffeelake_gt2_info),
892 INTEL_CFL_U_GT2_IDS(&intel_coffeelake_gt2_info),
893 INTEL_CFL_U_GT3_IDS(&intel_coffeelake_gt3_info),
894 INTEL_WHL_U_GT1_IDS(&intel_coffeelake_gt1_info),
895 INTEL_WHL_U_GT2_IDS(&intel_coffeelake_gt2_info),
896 INTEL_AML_CFL_GT2_IDS(&intel_coffeelake_gt2_info),
897 INTEL_WHL_U_GT3_IDS(&intel_coffeelake_gt3_info),
898 INTEL_CML_GT1_IDS(&intel_coffeelake_gt1_info),
899 INTEL_CML_GT2_IDS(&intel_coffeelake_gt2_info),
900 INTEL_CNL_IDS(&intel_cannonlake_info),
901 INTEL_ICL_11_IDS(&intel_icelake_11_info),
902 INTEL_EHL_IDS(&intel_elkhartlake_info),
903 INTEL_TGL_12_IDS(&intel_tigerlake_12_info),
906 MODULE_DEVICE_TABLE(pci, pciidlist);
908 static void i915_pci_remove(struct pci_dev *pdev)
910 struct drm_i915_private *i915;
912 i915 = pci_get_drvdata(pdev);
913 if (!i915) /* driver load aborted, nothing to cleanup */
916 i915_driver_remove(i915);
917 pci_set_drvdata(pdev, NULL);
919 drm_dev_put(&i915->drm);
922 /* is device_id present in comma separated list of ids */
923 static bool force_probe(u16 device_id, const char *devices)
928 /* FIXME: transitional */
929 if (i915_modparams.alpha_support) {
930 DRM_INFO("i915.alpha_support is deprecated, use i915.force_probe=%04x instead\n",
935 if (!devices || !*devices)
938 /* match everything */
939 if (strcmp(devices, "*") == 0)
942 s = kstrdup(devices, GFP_KERNEL);
946 for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
949 if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
960 static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
962 struct intel_device_info *intel_info =
963 (struct intel_device_info *) ent->driver_data;
966 if (intel_info->require_force_probe &&
967 !force_probe(pdev->device, i915_modparams.force_probe)) {
968 DRM_INFO("Your graphics device %04x is not properly supported by the driver in this\n"
969 "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
970 "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
971 "or (recommended) check for kernel updates.\n",
972 pdev->device, pdev->device, pdev->device);
976 /* Only bind to function 0 of the device. Early generations
977 * used function 1 as a placeholder for multi-head. This causes
978 * us confusion instead, especially on the systems where both
979 * functions have the same PCI-ID!
981 if (PCI_FUNC(pdev->devfn))
985 * apple-gmux is needed on dual GPU MacBook Pro
986 * to probe the panel if we're the inactive GPU.
988 if (vga_switcheroo_client_probe_defer(pdev))
989 return -EPROBE_DEFER;
991 err = i915_driver_probe(pdev, ent);
995 if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
996 i915_pci_remove(pdev);
1000 err = i915_live_selftests(pdev);
1002 i915_pci_remove(pdev);
1003 return err > 0 ? -ENOTTY : err;
1009 static struct pci_driver i915_pci_driver = {
1010 .name = DRIVER_NAME,
1011 .id_table = pciidlist,
1012 .probe = i915_pci_probe,
1013 .remove = i915_pci_remove,
1014 .driver.pm = &i915_pm_ops,
1017 static int __init i915_init(void)
1019 bool use_kms = true;
1022 err = i915_globals_init();
1026 err = i915_mock_selftests();
1028 return err > 0 ? 0 : err;
1031 * Enable KMS by default, unless explicitly overriden by
1032 * either the i915.modeset prarameter or by the
1033 * vga_text_mode_force boot option.
1036 if (i915_modparams.modeset == 0)
1039 if (vgacon_text_force() && i915_modparams.modeset == -1)
1043 /* Silently fail loading to not upset userspace. */
1044 DRM_DEBUG_DRIVER("KMS disabled.\n");
1048 return pci_register_driver(&i915_pci_driver);
1051 static void __exit i915_exit(void)
1053 if (!i915_pci_driver.driver.owner)
1056 pci_unregister_driver(&i915_pci_driver);
1057 i915_globals_exit();
1060 module_init(i915_init);
1061 module_exit(i915_exit);
1063 MODULE_AUTHOR("Tungsten Graphics, Inc.");
1064 MODULE_AUTHOR("Intel Corporation");
1066 MODULE_DESCRIPTION(DRIVER_DESC);
1067 MODULE_LICENSE("GPL and additional rights");