1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright © 2016 Intel Corporation
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun * Software.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*4882a593Smuzhiyun * IN THE SOFTWARE.
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun */
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include <linux/console.h>
26*4882a593Smuzhiyun #include <linux/vga_switcheroo.h>
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include <drm/drm_drv.h>
29*4882a593Smuzhiyun #include <drm/i915_pciids.h>
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #include "display/intel_fbdev.h"
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun #include "i915_drv.h"
34*4882a593Smuzhiyun #include "i915_perf.h"
35*4882a593Smuzhiyun #include "i915_globals.h"
36*4882a593Smuzhiyun #include "i915_selftest.h"
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #define PLATFORM(x) .platform = (x)
39*4882a593Smuzhiyun #define GEN(x) .gen = (x), .gen_mask = BIT((x) - 1)
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun #define I845_PIPE_OFFSETS \
42*4882a593Smuzhiyun .pipe_offsets = { \
43*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
44*4882a593Smuzhiyun }, \
45*4882a593Smuzhiyun .trans_offsets = { \
46*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun #define I9XX_PIPE_OFFSETS \
50*4882a593Smuzhiyun .pipe_offsets = { \
51*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
52*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
53*4882a593Smuzhiyun }, \
54*4882a593Smuzhiyun .trans_offsets = { \
55*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
56*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
57*4882a593Smuzhiyun }
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun #define IVB_PIPE_OFFSETS \
60*4882a593Smuzhiyun .pipe_offsets = { \
61*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
62*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
63*4882a593Smuzhiyun [TRANSCODER_C] = PIPE_C_OFFSET, \
64*4882a593Smuzhiyun }, \
65*4882a593Smuzhiyun .trans_offsets = { \
66*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
67*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
68*4882a593Smuzhiyun [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
69*4882a593Smuzhiyun }
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun #define HSW_PIPE_OFFSETS \
72*4882a593Smuzhiyun .pipe_offsets = { \
73*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
74*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
75*4882a593Smuzhiyun [TRANSCODER_C] = PIPE_C_OFFSET, \
76*4882a593Smuzhiyun [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
77*4882a593Smuzhiyun }, \
78*4882a593Smuzhiyun .trans_offsets = { \
79*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
80*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
81*4882a593Smuzhiyun [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
82*4882a593Smuzhiyun [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun #define CHV_PIPE_OFFSETS \
86*4882a593Smuzhiyun .pipe_offsets = { \
87*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
88*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
89*4882a593Smuzhiyun [TRANSCODER_C] = CHV_PIPE_C_OFFSET, \
90*4882a593Smuzhiyun }, \
91*4882a593Smuzhiyun .trans_offsets = { \
92*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
93*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
94*4882a593Smuzhiyun [TRANSCODER_C] = CHV_TRANSCODER_C_OFFSET, \
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun #define I845_CURSOR_OFFSETS \
98*4882a593Smuzhiyun .cursor_offsets = { \
99*4882a593Smuzhiyun [PIPE_A] = CURSOR_A_OFFSET, \
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun #define I9XX_CURSOR_OFFSETS \
103*4882a593Smuzhiyun .cursor_offsets = { \
104*4882a593Smuzhiyun [PIPE_A] = CURSOR_A_OFFSET, \
105*4882a593Smuzhiyun [PIPE_B] = CURSOR_B_OFFSET, \
106*4882a593Smuzhiyun }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun #define CHV_CURSOR_OFFSETS \
109*4882a593Smuzhiyun .cursor_offsets = { \
110*4882a593Smuzhiyun [PIPE_A] = CURSOR_A_OFFSET, \
111*4882a593Smuzhiyun [PIPE_B] = CURSOR_B_OFFSET, \
112*4882a593Smuzhiyun [PIPE_C] = CHV_CURSOR_C_OFFSET, \
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun
115*4882a593Smuzhiyun #define IVB_CURSOR_OFFSETS \
116*4882a593Smuzhiyun .cursor_offsets = { \
117*4882a593Smuzhiyun [PIPE_A] = CURSOR_A_OFFSET, \
118*4882a593Smuzhiyun [PIPE_B] = IVB_CURSOR_B_OFFSET, \
119*4882a593Smuzhiyun [PIPE_C] = IVB_CURSOR_C_OFFSET, \
120*4882a593Smuzhiyun }
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun #define TGL_CURSOR_OFFSETS \
123*4882a593Smuzhiyun .cursor_offsets = { \
124*4882a593Smuzhiyun [PIPE_A] = CURSOR_A_OFFSET, \
125*4882a593Smuzhiyun [PIPE_B] = IVB_CURSOR_B_OFFSET, \
126*4882a593Smuzhiyun [PIPE_C] = IVB_CURSOR_C_OFFSET, \
127*4882a593Smuzhiyun [PIPE_D] = TGL_CURSOR_D_OFFSET, \
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
130*4882a593Smuzhiyun #define I9XX_COLORS \
131*4882a593Smuzhiyun .color = { .gamma_lut_size = 256 }
132*4882a593Smuzhiyun #define I965_COLORS \
133*4882a593Smuzhiyun .color = { .gamma_lut_size = 129, \
134*4882a593Smuzhiyun .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
135*4882a593Smuzhiyun }
136*4882a593Smuzhiyun #define ILK_COLORS \
137*4882a593Smuzhiyun .color = { .gamma_lut_size = 1024 }
138*4882a593Smuzhiyun #define IVB_COLORS \
139*4882a593Smuzhiyun .color = { .degamma_lut_size = 1024, .gamma_lut_size = 1024 }
140*4882a593Smuzhiyun #define CHV_COLORS \
141*4882a593Smuzhiyun .color = { .degamma_lut_size = 65, .gamma_lut_size = 257, \
142*4882a593Smuzhiyun .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
143*4882a593Smuzhiyun .gamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING, \
144*4882a593Smuzhiyun }
145*4882a593Smuzhiyun #define GLK_COLORS \
146*4882a593Smuzhiyun .color = { .degamma_lut_size = 33, .gamma_lut_size = 1024, \
147*4882a593Smuzhiyun .degamma_lut_tests = DRM_COLOR_LUT_NON_DECREASING | \
148*4882a593Smuzhiyun DRM_COLOR_LUT_EQUAL_CHANNELS, \
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun /* Keep in gen based order, and chronological order within a gen */
152*4882a593Smuzhiyun
153*4882a593Smuzhiyun #define GEN_DEFAULT_PAGE_SIZES \
154*4882a593Smuzhiyun .page_sizes = I915_GTT_PAGE_SIZE_4K
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun #define GEN_DEFAULT_REGIONS \
157*4882a593Smuzhiyun .memory_regions = REGION_SMEM | REGION_STOLEN
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun #define I830_FEATURES \
160*4882a593Smuzhiyun GEN(2), \
161*4882a593Smuzhiyun .is_mobile = 1, \
162*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
163*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
164*4882a593Smuzhiyun .display.has_overlay = 1, \
165*4882a593Smuzhiyun .display.cursor_needs_physical = 1, \
166*4882a593Smuzhiyun .display.overlay_needs_physical = 1, \
167*4882a593Smuzhiyun .display.has_gmch = 1, \
168*4882a593Smuzhiyun .gpu_reset_clobbers_display = true, \
169*4882a593Smuzhiyun .hws_needs_physical = 1, \
170*4882a593Smuzhiyun .unfenced_needs_alignment = 1, \
171*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0), \
172*4882a593Smuzhiyun .has_snoop = true, \
173*4882a593Smuzhiyun .has_coherent_ggtt = false, \
174*4882a593Smuzhiyun .dma_mask_size = 32, \
175*4882a593Smuzhiyun I9XX_PIPE_OFFSETS, \
176*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS, \
177*4882a593Smuzhiyun I9XX_COLORS, \
178*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
179*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
180*4882a593Smuzhiyun
181*4882a593Smuzhiyun #define I845_FEATURES \
182*4882a593Smuzhiyun GEN(2), \
183*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A), \
184*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A), \
185*4882a593Smuzhiyun .display.has_overlay = 1, \
186*4882a593Smuzhiyun .display.overlay_needs_physical = 1, \
187*4882a593Smuzhiyun .display.has_gmch = 1, \
188*4882a593Smuzhiyun .gpu_reset_clobbers_display = true, \
189*4882a593Smuzhiyun .hws_needs_physical = 1, \
190*4882a593Smuzhiyun .unfenced_needs_alignment = 1, \
191*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0), \
192*4882a593Smuzhiyun .has_snoop = true, \
193*4882a593Smuzhiyun .has_coherent_ggtt = false, \
194*4882a593Smuzhiyun .dma_mask_size = 32, \
195*4882a593Smuzhiyun I845_PIPE_OFFSETS, \
196*4882a593Smuzhiyun I845_CURSOR_OFFSETS, \
197*4882a593Smuzhiyun I9XX_COLORS, \
198*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
199*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun static const struct intel_device_info i830_info = {
202*4882a593Smuzhiyun I830_FEATURES,
203*4882a593Smuzhiyun PLATFORM(INTEL_I830),
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun static const struct intel_device_info i845g_info = {
207*4882a593Smuzhiyun I845_FEATURES,
208*4882a593Smuzhiyun PLATFORM(INTEL_I845G),
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun static const struct intel_device_info i85x_info = {
212*4882a593Smuzhiyun I830_FEATURES,
213*4882a593Smuzhiyun PLATFORM(INTEL_I85X),
214*4882a593Smuzhiyun .display.has_fbc = 1,
215*4882a593Smuzhiyun };
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun static const struct intel_device_info i865g_info = {
218*4882a593Smuzhiyun I845_FEATURES,
219*4882a593Smuzhiyun PLATFORM(INTEL_I865G),
220*4882a593Smuzhiyun .display.has_fbc = 1,
221*4882a593Smuzhiyun };
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun #define GEN3_FEATURES \
224*4882a593Smuzhiyun GEN(3), \
225*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
226*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
227*4882a593Smuzhiyun .display.has_gmch = 1, \
228*4882a593Smuzhiyun .gpu_reset_clobbers_display = true, \
229*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0), \
230*4882a593Smuzhiyun .has_snoop = true, \
231*4882a593Smuzhiyun .has_coherent_ggtt = true, \
232*4882a593Smuzhiyun .dma_mask_size = 32, \
233*4882a593Smuzhiyun I9XX_PIPE_OFFSETS, \
234*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS, \
235*4882a593Smuzhiyun I9XX_COLORS, \
236*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
237*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun static const struct intel_device_info i915g_info = {
240*4882a593Smuzhiyun GEN3_FEATURES,
241*4882a593Smuzhiyun PLATFORM(INTEL_I915G),
242*4882a593Smuzhiyun .has_coherent_ggtt = false,
243*4882a593Smuzhiyun .display.cursor_needs_physical = 1,
244*4882a593Smuzhiyun .display.has_overlay = 1,
245*4882a593Smuzhiyun .display.overlay_needs_physical = 1,
246*4882a593Smuzhiyun .hws_needs_physical = 1,
247*4882a593Smuzhiyun .unfenced_needs_alignment = 1,
248*4882a593Smuzhiyun };
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun static const struct intel_device_info i915gm_info = {
251*4882a593Smuzhiyun GEN3_FEATURES,
252*4882a593Smuzhiyun PLATFORM(INTEL_I915GM),
253*4882a593Smuzhiyun .is_mobile = 1,
254*4882a593Smuzhiyun .display.cursor_needs_physical = 1,
255*4882a593Smuzhiyun .display.has_overlay = 1,
256*4882a593Smuzhiyun .display.overlay_needs_physical = 1,
257*4882a593Smuzhiyun .display.supports_tv = 1,
258*4882a593Smuzhiyun .display.has_fbc = 1,
259*4882a593Smuzhiyun .hws_needs_physical = 1,
260*4882a593Smuzhiyun .unfenced_needs_alignment = 1,
261*4882a593Smuzhiyun };
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun static const struct intel_device_info i945g_info = {
264*4882a593Smuzhiyun GEN3_FEATURES,
265*4882a593Smuzhiyun PLATFORM(INTEL_I945G),
266*4882a593Smuzhiyun .display.has_hotplug = 1,
267*4882a593Smuzhiyun .display.cursor_needs_physical = 1,
268*4882a593Smuzhiyun .display.has_overlay = 1,
269*4882a593Smuzhiyun .display.overlay_needs_physical = 1,
270*4882a593Smuzhiyun .hws_needs_physical = 1,
271*4882a593Smuzhiyun .unfenced_needs_alignment = 1,
272*4882a593Smuzhiyun };
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun static const struct intel_device_info i945gm_info = {
275*4882a593Smuzhiyun GEN3_FEATURES,
276*4882a593Smuzhiyun PLATFORM(INTEL_I945GM),
277*4882a593Smuzhiyun .is_mobile = 1,
278*4882a593Smuzhiyun .display.has_hotplug = 1,
279*4882a593Smuzhiyun .display.cursor_needs_physical = 1,
280*4882a593Smuzhiyun .display.has_overlay = 1,
281*4882a593Smuzhiyun .display.overlay_needs_physical = 1,
282*4882a593Smuzhiyun .display.supports_tv = 1,
283*4882a593Smuzhiyun .display.has_fbc = 1,
284*4882a593Smuzhiyun .hws_needs_physical = 1,
285*4882a593Smuzhiyun .unfenced_needs_alignment = 1,
286*4882a593Smuzhiyun };
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun static const struct intel_device_info g33_info = {
289*4882a593Smuzhiyun GEN3_FEATURES,
290*4882a593Smuzhiyun PLATFORM(INTEL_G33),
291*4882a593Smuzhiyun .display.has_hotplug = 1,
292*4882a593Smuzhiyun .display.has_overlay = 1,
293*4882a593Smuzhiyun .dma_mask_size = 36,
294*4882a593Smuzhiyun };
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun static const struct intel_device_info pnv_g_info = {
297*4882a593Smuzhiyun GEN3_FEATURES,
298*4882a593Smuzhiyun PLATFORM(INTEL_PINEVIEW),
299*4882a593Smuzhiyun .display.has_hotplug = 1,
300*4882a593Smuzhiyun .display.has_overlay = 1,
301*4882a593Smuzhiyun .dma_mask_size = 36,
302*4882a593Smuzhiyun };
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun static const struct intel_device_info pnv_m_info = {
305*4882a593Smuzhiyun GEN3_FEATURES,
306*4882a593Smuzhiyun PLATFORM(INTEL_PINEVIEW),
307*4882a593Smuzhiyun .is_mobile = 1,
308*4882a593Smuzhiyun .display.has_hotplug = 1,
309*4882a593Smuzhiyun .display.has_overlay = 1,
310*4882a593Smuzhiyun .dma_mask_size = 36,
311*4882a593Smuzhiyun };
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun #define GEN4_FEATURES \
314*4882a593Smuzhiyun GEN(4), \
315*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
316*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
317*4882a593Smuzhiyun .display.has_hotplug = 1, \
318*4882a593Smuzhiyun .display.has_gmch = 1, \
319*4882a593Smuzhiyun .gpu_reset_clobbers_display = true, \
320*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0), \
321*4882a593Smuzhiyun .has_snoop = true, \
322*4882a593Smuzhiyun .has_coherent_ggtt = true, \
323*4882a593Smuzhiyun .dma_mask_size = 36, \
324*4882a593Smuzhiyun I9XX_PIPE_OFFSETS, \
325*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS, \
326*4882a593Smuzhiyun I965_COLORS, \
327*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
328*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun static const struct intel_device_info i965g_info = {
331*4882a593Smuzhiyun GEN4_FEATURES,
332*4882a593Smuzhiyun PLATFORM(INTEL_I965G),
333*4882a593Smuzhiyun .display.has_overlay = 1,
334*4882a593Smuzhiyun .hws_needs_physical = 1,
335*4882a593Smuzhiyun .has_snoop = false,
336*4882a593Smuzhiyun };
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun static const struct intel_device_info i965gm_info = {
339*4882a593Smuzhiyun GEN4_FEATURES,
340*4882a593Smuzhiyun PLATFORM(INTEL_I965GM),
341*4882a593Smuzhiyun .is_mobile = 1,
342*4882a593Smuzhiyun .display.has_fbc = 1,
343*4882a593Smuzhiyun .display.has_overlay = 1,
344*4882a593Smuzhiyun .display.supports_tv = 1,
345*4882a593Smuzhiyun .hws_needs_physical = 1,
346*4882a593Smuzhiyun .has_snoop = false,
347*4882a593Smuzhiyun };
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun static const struct intel_device_info g45_info = {
350*4882a593Smuzhiyun GEN4_FEATURES,
351*4882a593Smuzhiyun PLATFORM(INTEL_G45),
352*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0),
353*4882a593Smuzhiyun .gpu_reset_clobbers_display = false,
354*4882a593Smuzhiyun };
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun static const struct intel_device_info gm45_info = {
357*4882a593Smuzhiyun GEN4_FEATURES,
358*4882a593Smuzhiyun PLATFORM(INTEL_GM45),
359*4882a593Smuzhiyun .is_mobile = 1,
360*4882a593Smuzhiyun .display.has_fbc = 1,
361*4882a593Smuzhiyun .display.supports_tv = 1,
362*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0),
363*4882a593Smuzhiyun .gpu_reset_clobbers_display = false,
364*4882a593Smuzhiyun };
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun #define GEN5_FEATURES \
367*4882a593Smuzhiyun GEN(5), \
368*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
369*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
370*4882a593Smuzhiyun .display.has_hotplug = 1, \
371*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0), \
372*4882a593Smuzhiyun .has_snoop = true, \
373*4882a593Smuzhiyun .has_coherent_ggtt = true, \
374*4882a593Smuzhiyun /* ilk does support rc6, but we do not implement [power] contexts */ \
375*4882a593Smuzhiyun .has_rc6 = 0, \
376*4882a593Smuzhiyun .dma_mask_size = 36, \
377*4882a593Smuzhiyun I9XX_PIPE_OFFSETS, \
378*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS, \
379*4882a593Smuzhiyun ILK_COLORS, \
380*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
381*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun static const struct intel_device_info ilk_d_info = {
384*4882a593Smuzhiyun GEN5_FEATURES,
385*4882a593Smuzhiyun PLATFORM(INTEL_IRONLAKE),
386*4882a593Smuzhiyun };
387*4882a593Smuzhiyun
388*4882a593Smuzhiyun static const struct intel_device_info ilk_m_info = {
389*4882a593Smuzhiyun GEN5_FEATURES,
390*4882a593Smuzhiyun PLATFORM(INTEL_IRONLAKE),
391*4882a593Smuzhiyun .is_mobile = 1,
392*4882a593Smuzhiyun .has_rps = true,
393*4882a593Smuzhiyun .display.has_fbc = 1,
394*4882a593Smuzhiyun };
395*4882a593Smuzhiyun
396*4882a593Smuzhiyun #define GEN6_FEATURES \
397*4882a593Smuzhiyun GEN(6), \
398*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B), \
399*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B), \
400*4882a593Smuzhiyun .display.has_hotplug = 1, \
401*4882a593Smuzhiyun .display.has_fbc = 1, \
402*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
403*4882a593Smuzhiyun .has_coherent_ggtt = true, \
404*4882a593Smuzhiyun .has_llc = 1, \
405*4882a593Smuzhiyun .has_rc6 = 1, \
406*4882a593Smuzhiyun .has_rc6p = 1, \
407*4882a593Smuzhiyun .has_rps = true, \
408*4882a593Smuzhiyun .dma_mask_size = 40, \
409*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_ALIASING, \
410*4882a593Smuzhiyun .ppgtt_size = 31, \
411*4882a593Smuzhiyun I9XX_PIPE_OFFSETS, \
412*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS, \
413*4882a593Smuzhiyun ILK_COLORS, \
414*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
415*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
416*4882a593Smuzhiyun
417*4882a593Smuzhiyun #define SNB_D_PLATFORM \
418*4882a593Smuzhiyun GEN6_FEATURES, \
419*4882a593Smuzhiyun PLATFORM(INTEL_SANDYBRIDGE)
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun static const struct intel_device_info snb_d_gt1_info = {
422*4882a593Smuzhiyun SNB_D_PLATFORM,
423*4882a593Smuzhiyun .gt = 1,
424*4882a593Smuzhiyun };
425*4882a593Smuzhiyun
426*4882a593Smuzhiyun static const struct intel_device_info snb_d_gt2_info = {
427*4882a593Smuzhiyun SNB_D_PLATFORM,
428*4882a593Smuzhiyun .gt = 2,
429*4882a593Smuzhiyun };
430*4882a593Smuzhiyun
431*4882a593Smuzhiyun #define SNB_M_PLATFORM \
432*4882a593Smuzhiyun GEN6_FEATURES, \
433*4882a593Smuzhiyun PLATFORM(INTEL_SANDYBRIDGE), \
434*4882a593Smuzhiyun .is_mobile = 1
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun
437*4882a593Smuzhiyun static const struct intel_device_info snb_m_gt1_info = {
438*4882a593Smuzhiyun SNB_M_PLATFORM,
439*4882a593Smuzhiyun .gt = 1,
440*4882a593Smuzhiyun };
441*4882a593Smuzhiyun
442*4882a593Smuzhiyun static const struct intel_device_info snb_m_gt2_info = {
443*4882a593Smuzhiyun SNB_M_PLATFORM,
444*4882a593Smuzhiyun .gt = 2,
445*4882a593Smuzhiyun };
446*4882a593Smuzhiyun
447*4882a593Smuzhiyun #define GEN7_FEATURES \
448*4882a593Smuzhiyun GEN(7), \
449*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
450*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C), \
451*4882a593Smuzhiyun .display.has_hotplug = 1, \
452*4882a593Smuzhiyun .display.has_fbc = 1, \
453*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0), \
454*4882a593Smuzhiyun .has_coherent_ggtt = true, \
455*4882a593Smuzhiyun .has_llc = 1, \
456*4882a593Smuzhiyun .has_rc6 = 1, \
457*4882a593Smuzhiyun .has_rc6p = 1, \
458*4882a593Smuzhiyun .has_rps = true, \
459*4882a593Smuzhiyun .dma_mask_size = 40, \
460*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_ALIASING, \
461*4882a593Smuzhiyun .ppgtt_size = 31, \
462*4882a593Smuzhiyun IVB_PIPE_OFFSETS, \
463*4882a593Smuzhiyun IVB_CURSOR_OFFSETS, \
464*4882a593Smuzhiyun IVB_COLORS, \
465*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES, \
466*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun #define IVB_D_PLATFORM \
469*4882a593Smuzhiyun GEN7_FEATURES, \
470*4882a593Smuzhiyun PLATFORM(INTEL_IVYBRIDGE), \
471*4882a593Smuzhiyun .has_l3_dpf = 1
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun static const struct intel_device_info ivb_d_gt1_info = {
474*4882a593Smuzhiyun IVB_D_PLATFORM,
475*4882a593Smuzhiyun .gt = 1,
476*4882a593Smuzhiyun };
477*4882a593Smuzhiyun
478*4882a593Smuzhiyun static const struct intel_device_info ivb_d_gt2_info = {
479*4882a593Smuzhiyun IVB_D_PLATFORM,
480*4882a593Smuzhiyun .gt = 2,
481*4882a593Smuzhiyun };
482*4882a593Smuzhiyun
483*4882a593Smuzhiyun #define IVB_M_PLATFORM \
484*4882a593Smuzhiyun GEN7_FEATURES, \
485*4882a593Smuzhiyun PLATFORM(INTEL_IVYBRIDGE), \
486*4882a593Smuzhiyun .is_mobile = 1, \
487*4882a593Smuzhiyun .has_l3_dpf = 1
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun static const struct intel_device_info ivb_m_gt1_info = {
490*4882a593Smuzhiyun IVB_M_PLATFORM,
491*4882a593Smuzhiyun .gt = 1,
492*4882a593Smuzhiyun };
493*4882a593Smuzhiyun
494*4882a593Smuzhiyun static const struct intel_device_info ivb_m_gt2_info = {
495*4882a593Smuzhiyun IVB_M_PLATFORM,
496*4882a593Smuzhiyun .gt = 2,
497*4882a593Smuzhiyun };
498*4882a593Smuzhiyun
499*4882a593Smuzhiyun static const struct intel_device_info ivb_q_info = {
500*4882a593Smuzhiyun GEN7_FEATURES,
501*4882a593Smuzhiyun PLATFORM(INTEL_IVYBRIDGE),
502*4882a593Smuzhiyun .gt = 2,
503*4882a593Smuzhiyun .pipe_mask = 0, /* legal, last one wins */
504*4882a593Smuzhiyun .cpu_transcoder_mask = 0,
505*4882a593Smuzhiyun .has_l3_dpf = 1,
506*4882a593Smuzhiyun };
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun static const struct intel_device_info vlv_info = {
509*4882a593Smuzhiyun PLATFORM(INTEL_VALLEYVIEW),
510*4882a593Smuzhiyun GEN(7),
511*4882a593Smuzhiyun .is_lp = 1,
512*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B),
513*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B),
514*4882a593Smuzhiyun .has_runtime_pm = 1,
515*4882a593Smuzhiyun .has_rc6 = 1,
516*4882a593Smuzhiyun .has_rps = true,
517*4882a593Smuzhiyun .display.has_gmch = 1,
518*4882a593Smuzhiyun .display.has_hotplug = 1,
519*4882a593Smuzhiyun .dma_mask_size = 40,
520*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_ALIASING,
521*4882a593Smuzhiyun .ppgtt_size = 31,
522*4882a593Smuzhiyun .has_snoop = true,
523*4882a593Smuzhiyun .has_coherent_ggtt = false,
524*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0),
525*4882a593Smuzhiyun .display_mmio_offset = VLV_DISPLAY_BASE,
526*4882a593Smuzhiyun I9XX_PIPE_OFFSETS,
527*4882a593Smuzhiyun I9XX_CURSOR_OFFSETS,
528*4882a593Smuzhiyun I965_COLORS,
529*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES,
530*4882a593Smuzhiyun GEN_DEFAULT_REGIONS,
531*4882a593Smuzhiyun };
532*4882a593Smuzhiyun
533*4882a593Smuzhiyun #define G75_FEATURES \
534*4882a593Smuzhiyun GEN7_FEATURES, \
535*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
536*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
537*4882a593Smuzhiyun BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP), \
538*4882a593Smuzhiyun .display.has_ddi = 1, \
539*4882a593Smuzhiyun .has_fpga_dbg = 1, \
540*4882a593Smuzhiyun .display.has_psr = 1, \
541*4882a593Smuzhiyun .display.has_psr_hw_tracking = 1, \
542*4882a593Smuzhiyun .display.has_dp_mst = 1, \
543*4882a593Smuzhiyun .has_rc6p = 0 /* RC6p removed-by HSW */, \
544*4882a593Smuzhiyun HSW_PIPE_OFFSETS, \
545*4882a593Smuzhiyun .has_runtime_pm = 1
546*4882a593Smuzhiyun
547*4882a593Smuzhiyun #define HSW_PLATFORM \
548*4882a593Smuzhiyun G75_FEATURES, \
549*4882a593Smuzhiyun PLATFORM(INTEL_HASWELL), \
550*4882a593Smuzhiyun .has_l3_dpf = 1
551*4882a593Smuzhiyun
552*4882a593Smuzhiyun static const struct intel_device_info hsw_gt1_info = {
553*4882a593Smuzhiyun HSW_PLATFORM,
554*4882a593Smuzhiyun .gt = 1,
555*4882a593Smuzhiyun };
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun static const struct intel_device_info hsw_gt2_info = {
558*4882a593Smuzhiyun HSW_PLATFORM,
559*4882a593Smuzhiyun .gt = 2,
560*4882a593Smuzhiyun };
561*4882a593Smuzhiyun
562*4882a593Smuzhiyun static const struct intel_device_info hsw_gt3_info = {
563*4882a593Smuzhiyun HSW_PLATFORM,
564*4882a593Smuzhiyun .gt = 3,
565*4882a593Smuzhiyun };
566*4882a593Smuzhiyun
567*4882a593Smuzhiyun #define GEN8_FEATURES \
568*4882a593Smuzhiyun G75_FEATURES, \
569*4882a593Smuzhiyun GEN(8), \
570*4882a593Smuzhiyun .has_logical_ring_contexts = 1, \
571*4882a593Smuzhiyun .dma_mask_size = 39, \
572*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_FULL, \
573*4882a593Smuzhiyun .ppgtt_size = 48, \
574*4882a593Smuzhiyun .has_64bit_reloc = 1, \
575*4882a593Smuzhiyun .has_reset_engine = 1
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun #define BDW_PLATFORM \
578*4882a593Smuzhiyun GEN8_FEATURES, \
579*4882a593Smuzhiyun PLATFORM(INTEL_BROADWELL)
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun static const struct intel_device_info bdw_gt1_info = {
582*4882a593Smuzhiyun BDW_PLATFORM,
583*4882a593Smuzhiyun .gt = 1,
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun
586*4882a593Smuzhiyun static const struct intel_device_info bdw_gt2_info = {
587*4882a593Smuzhiyun BDW_PLATFORM,
588*4882a593Smuzhiyun .gt = 2,
589*4882a593Smuzhiyun };
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun static const struct intel_device_info bdw_rsvd_info = {
592*4882a593Smuzhiyun BDW_PLATFORM,
593*4882a593Smuzhiyun .gt = 3,
594*4882a593Smuzhiyun /* According to the device ID those devices are GT3, they were
595*4882a593Smuzhiyun * previously treated as not GT3, keep it like that.
596*4882a593Smuzhiyun */
597*4882a593Smuzhiyun };
598*4882a593Smuzhiyun
599*4882a593Smuzhiyun static const struct intel_device_info bdw_gt3_info = {
600*4882a593Smuzhiyun BDW_PLATFORM,
601*4882a593Smuzhiyun .gt = 3,
602*4882a593Smuzhiyun .platform_engine_mask =
603*4882a593Smuzhiyun BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
604*4882a593Smuzhiyun };
605*4882a593Smuzhiyun
606*4882a593Smuzhiyun static const struct intel_device_info chv_info = {
607*4882a593Smuzhiyun PLATFORM(INTEL_CHERRYVIEW),
608*4882a593Smuzhiyun GEN(8),
609*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
610*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | BIT(TRANSCODER_C),
611*4882a593Smuzhiyun .display.has_hotplug = 1,
612*4882a593Smuzhiyun .is_lp = 1,
613*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0),
614*4882a593Smuzhiyun .has_64bit_reloc = 1,
615*4882a593Smuzhiyun .has_runtime_pm = 1,
616*4882a593Smuzhiyun .has_rc6 = 1,
617*4882a593Smuzhiyun .has_rps = true,
618*4882a593Smuzhiyun .has_logical_ring_contexts = 1,
619*4882a593Smuzhiyun .display.has_gmch = 1,
620*4882a593Smuzhiyun .dma_mask_size = 39,
621*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_FULL,
622*4882a593Smuzhiyun .ppgtt_size = 32,
623*4882a593Smuzhiyun .has_reset_engine = 1,
624*4882a593Smuzhiyun .has_snoop = true,
625*4882a593Smuzhiyun .has_coherent_ggtt = false,
626*4882a593Smuzhiyun .display_mmio_offset = VLV_DISPLAY_BASE,
627*4882a593Smuzhiyun CHV_PIPE_OFFSETS,
628*4882a593Smuzhiyun CHV_CURSOR_OFFSETS,
629*4882a593Smuzhiyun CHV_COLORS,
630*4882a593Smuzhiyun GEN_DEFAULT_PAGE_SIZES,
631*4882a593Smuzhiyun GEN_DEFAULT_REGIONS,
632*4882a593Smuzhiyun };
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun #define GEN9_DEFAULT_PAGE_SIZES \
635*4882a593Smuzhiyun .page_sizes = I915_GTT_PAGE_SIZE_4K | \
636*4882a593Smuzhiyun I915_GTT_PAGE_SIZE_64K
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun #define GEN9_FEATURES \
639*4882a593Smuzhiyun GEN8_FEATURES, \
640*4882a593Smuzhiyun GEN(9), \
641*4882a593Smuzhiyun GEN9_DEFAULT_PAGE_SIZES, \
642*4882a593Smuzhiyun .has_logical_ring_preemption = 1, \
643*4882a593Smuzhiyun .display.has_csr = 1, \
644*4882a593Smuzhiyun .has_gt_uc = 1, \
645*4882a593Smuzhiyun .display.has_hdcp = 1, \
646*4882a593Smuzhiyun .display.has_ipc = 1, \
647*4882a593Smuzhiyun .ddb_size = 896, \
648*4882a593Smuzhiyun .num_supported_dbuf_slices = 1
649*4882a593Smuzhiyun
650*4882a593Smuzhiyun #define SKL_PLATFORM \
651*4882a593Smuzhiyun GEN9_FEATURES, \
652*4882a593Smuzhiyun PLATFORM(INTEL_SKYLAKE)
653*4882a593Smuzhiyun
654*4882a593Smuzhiyun static const struct intel_device_info skl_gt1_info = {
655*4882a593Smuzhiyun SKL_PLATFORM,
656*4882a593Smuzhiyun .gt = 1,
657*4882a593Smuzhiyun };
658*4882a593Smuzhiyun
659*4882a593Smuzhiyun static const struct intel_device_info skl_gt2_info = {
660*4882a593Smuzhiyun SKL_PLATFORM,
661*4882a593Smuzhiyun .gt = 2,
662*4882a593Smuzhiyun };
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun #define SKL_GT3_PLUS_PLATFORM \
665*4882a593Smuzhiyun SKL_PLATFORM, \
666*4882a593Smuzhiyun .platform_engine_mask = \
667*4882a593Smuzhiyun BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1)
668*4882a593Smuzhiyun
669*4882a593Smuzhiyun
670*4882a593Smuzhiyun static const struct intel_device_info skl_gt3_info = {
671*4882a593Smuzhiyun SKL_GT3_PLUS_PLATFORM,
672*4882a593Smuzhiyun .gt = 3,
673*4882a593Smuzhiyun };
674*4882a593Smuzhiyun
675*4882a593Smuzhiyun static const struct intel_device_info skl_gt4_info = {
676*4882a593Smuzhiyun SKL_GT3_PLUS_PLATFORM,
677*4882a593Smuzhiyun .gt = 4,
678*4882a593Smuzhiyun };
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun #define GEN9_LP_FEATURES \
681*4882a593Smuzhiyun GEN(9), \
682*4882a593Smuzhiyun .is_lp = 1, \
683*4882a593Smuzhiyun .num_supported_dbuf_slices = 1, \
684*4882a593Smuzhiyun .display.has_hotplug = 1, \
685*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0), \
686*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C), \
687*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
688*4882a593Smuzhiyun BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
689*4882a593Smuzhiyun BIT(TRANSCODER_DSI_A) | BIT(TRANSCODER_DSI_C), \
690*4882a593Smuzhiyun .has_64bit_reloc = 1, \
691*4882a593Smuzhiyun .display.has_ddi = 1, \
692*4882a593Smuzhiyun .has_fpga_dbg = 1, \
693*4882a593Smuzhiyun .display.has_fbc = 1, \
694*4882a593Smuzhiyun .display.has_hdcp = 1, \
695*4882a593Smuzhiyun .display.has_psr = 1, \
696*4882a593Smuzhiyun .display.has_psr_hw_tracking = 1, \
697*4882a593Smuzhiyun .has_runtime_pm = 1, \
698*4882a593Smuzhiyun .display.has_csr = 1, \
699*4882a593Smuzhiyun .has_rc6 = 1, \
700*4882a593Smuzhiyun .has_rps = true, \
701*4882a593Smuzhiyun .display.has_dp_mst = 1, \
702*4882a593Smuzhiyun .has_logical_ring_contexts = 1, \
703*4882a593Smuzhiyun .has_logical_ring_preemption = 1, \
704*4882a593Smuzhiyun .has_gt_uc = 1, \
705*4882a593Smuzhiyun .dma_mask_size = 39, \
706*4882a593Smuzhiyun .ppgtt_type = INTEL_PPGTT_FULL, \
707*4882a593Smuzhiyun .ppgtt_size = 48, \
708*4882a593Smuzhiyun .has_reset_engine = 1, \
709*4882a593Smuzhiyun .has_snoop = true, \
710*4882a593Smuzhiyun .has_coherent_ggtt = false, \
711*4882a593Smuzhiyun .display.has_ipc = 1, \
712*4882a593Smuzhiyun HSW_PIPE_OFFSETS, \
713*4882a593Smuzhiyun IVB_CURSOR_OFFSETS, \
714*4882a593Smuzhiyun IVB_COLORS, \
715*4882a593Smuzhiyun GEN9_DEFAULT_PAGE_SIZES, \
716*4882a593Smuzhiyun GEN_DEFAULT_REGIONS
717*4882a593Smuzhiyun
718*4882a593Smuzhiyun static const struct intel_device_info bxt_info = {
719*4882a593Smuzhiyun GEN9_LP_FEATURES,
720*4882a593Smuzhiyun PLATFORM(INTEL_BROXTON),
721*4882a593Smuzhiyun .ddb_size = 512,
722*4882a593Smuzhiyun };
723*4882a593Smuzhiyun
724*4882a593Smuzhiyun static const struct intel_device_info glk_info = {
725*4882a593Smuzhiyun GEN9_LP_FEATURES,
726*4882a593Smuzhiyun PLATFORM(INTEL_GEMINILAKE),
727*4882a593Smuzhiyun .ddb_size = 1024,
728*4882a593Smuzhiyun GLK_COLORS,
729*4882a593Smuzhiyun };
730*4882a593Smuzhiyun
731*4882a593Smuzhiyun #define KBL_PLATFORM \
732*4882a593Smuzhiyun GEN9_FEATURES, \
733*4882a593Smuzhiyun PLATFORM(INTEL_KABYLAKE)
734*4882a593Smuzhiyun
735*4882a593Smuzhiyun static const struct intel_device_info kbl_gt1_info = {
736*4882a593Smuzhiyun KBL_PLATFORM,
737*4882a593Smuzhiyun .gt = 1,
738*4882a593Smuzhiyun };
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun static const struct intel_device_info kbl_gt2_info = {
741*4882a593Smuzhiyun KBL_PLATFORM,
742*4882a593Smuzhiyun .gt = 2,
743*4882a593Smuzhiyun };
744*4882a593Smuzhiyun
745*4882a593Smuzhiyun static const struct intel_device_info kbl_gt3_info = {
746*4882a593Smuzhiyun KBL_PLATFORM,
747*4882a593Smuzhiyun .gt = 3,
748*4882a593Smuzhiyun .platform_engine_mask =
749*4882a593Smuzhiyun BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
750*4882a593Smuzhiyun };
751*4882a593Smuzhiyun
752*4882a593Smuzhiyun #define CFL_PLATFORM \
753*4882a593Smuzhiyun GEN9_FEATURES, \
754*4882a593Smuzhiyun PLATFORM(INTEL_COFFEELAKE)
755*4882a593Smuzhiyun
756*4882a593Smuzhiyun static const struct intel_device_info cfl_gt1_info = {
757*4882a593Smuzhiyun CFL_PLATFORM,
758*4882a593Smuzhiyun .gt = 1,
759*4882a593Smuzhiyun };
760*4882a593Smuzhiyun
761*4882a593Smuzhiyun static const struct intel_device_info cfl_gt2_info = {
762*4882a593Smuzhiyun CFL_PLATFORM,
763*4882a593Smuzhiyun .gt = 2,
764*4882a593Smuzhiyun };
765*4882a593Smuzhiyun
766*4882a593Smuzhiyun static const struct intel_device_info cfl_gt3_info = {
767*4882a593Smuzhiyun CFL_PLATFORM,
768*4882a593Smuzhiyun .gt = 3,
769*4882a593Smuzhiyun .platform_engine_mask =
770*4882a593Smuzhiyun BIT(RCS0) | BIT(VCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS1),
771*4882a593Smuzhiyun };
772*4882a593Smuzhiyun
773*4882a593Smuzhiyun #define CML_PLATFORM \
774*4882a593Smuzhiyun GEN9_FEATURES, \
775*4882a593Smuzhiyun PLATFORM(INTEL_COMETLAKE)
776*4882a593Smuzhiyun
777*4882a593Smuzhiyun static const struct intel_device_info cml_gt1_info = {
778*4882a593Smuzhiyun CML_PLATFORM,
779*4882a593Smuzhiyun .gt = 1,
780*4882a593Smuzhiyun };
781*4882a593Smuzhiyun
782*4882a593Smuzhiyun static const struct intel_device_info cml_gt2_info = {
783*4882a593Smuzhiyun CML_PLATFORM,
784*4882a593Smuzhiyun .gt = 2,
785*4882a593Smuzhiyun };
786*4882a593Smuzhiyun
787*4882a593Smuzhiyun #define GEN10_FEATURES \
788*4882a593Smuzhiyun GEN9_FEATURES, \
789*4882a593Smuzhiyun GEN(10), \
790*4882a593Smuzhiyun .ddb_size = 1024, \
791*4882a593Smuzhiyun .display.has_dsc = 1, \
792*4882a593Smuzhiyun .has_coherent_ggtt = false, \
793*4882a593Smuzhiyun GLK_COLORS
794*4882a593Smuzhiyun
795*4882a593Smuzhiyun static const struct intel_device_info cnl_info = {
796*4882a593Smuzhiyun GEN10_FEATURES,
797*4882a593Smuzhiyun PLATFORM(INTEL_CANNONLAKE),
798*4882a593Smuzhiyun .gt = 2,
799*4882a593Smuzhiyun };
800*4882a593Smuzhiyun
801*4882a593Smuzhiyun #define GEN11_DEFAULT_PAGE_SIZES \
802*4882a593Smuzhiyun .page_sizes = I915_GTT_PAGE_SIZE_4K | \
803*4882a593Smuzhiyun I915_GTT_PAGE_SIZE_64K | \
804*4882a593Smuzhiyun I915_GTT_PAGE_SIZE_2M
805*4882a593Smuzhiyun
806*4882a593Smuzhiyun #define GEN11_FEATURES \
807*4882a593Smuzhiyun GEN10_FEATURES, \
808*4882a593Smuzhiyun GEN11_DEFAULT_PAGE_SIZES, \
809*4882a593Smuzhiyun .abox_mask = BIT(0), \
810*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
811*4882a593Smuzhiyun BIT(TRANSCODER_C) | BIT(TRANSCODER_EDP) | \
812*4882a593Smuzhiyun BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
813*4882a593Smuzhiyun .pipe_offsets = { \
814*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
815*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
816*4882a593Smuzhiyun [TRANSCODER_C] = PIPE_C_OFFSET, \
817*4882a593Smuzhiyun [TRANSCODER_EDP] = PIPE_EDP_OFFSET, \
818*4882a593Smuzhiyun [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
819*4882a593Smuzhiyun [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
820*4882a593Smuzhiyun }, \
821*4882a593Smuzhiyun .trans_offsets = { \
822*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
823*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
824*4882a593Smuzhiyun [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
825*4882a593Smuzhiyun [TRANSCODER_EDP] = TRANSCODER_EDP_OFFSET, \
826*4882a593Smuzhiyun [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
827*4882a593Smuzhiyun [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
828*4882a593Smuzhiyun }, \
829*4882a593Smuzhiyun GEN(11), \
830*4882a593Smuzhiyun .ddb_size = 2048, \
831*4882a593Smuzhiyun .num_supported_dbuf_slices = 2, \
832*4882a593Smuzhiyun .has_logical_ring_elsq = 1, \
833*4882a593Smuzhiyun .color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }
834*4882a593Smuzhiyun
835*4882a593Smuzhiyun static const struct intel_device_info icl_info = {
836*4882a593Smuzhiyun GEN11_FEATURES,
837*4882a593Smuzhiyun PLATFORM(INTEL_ICELAKE),
838*4882a593Smuzhiyun .platform_engine_mask =
839*4882a593Smuzhiyun BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
840*4882a593Smuzhiyun };
841*4882a593Smuzhiyun
842*4882a593Smuzhiyun static const struct intel_device_info ehl_info = {
843*4882a593Smuzhiyun GEN11_FEATURES,
844*4882a593Smuzhiyun PLATFORM(INTEL_ELKHARTLAKE),
845*4882a593Smuzhiyun .require_force_probe = 1,
846*4882a593Smuzhiyun .platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0),
847*4882a593Smuzhiyun .ppgtt_size = 36,
848*4882a593Smuzhiyun };
849*4882a593Smuzhiyun
850*4882a593Smuzhiyun #define GEN12_FEATURES \
851*4882a593Smuzhiyun GEN11_FEATURES, \
852*4882a593Smuzhiyun GEN(12), \
853*4882a593Smuzhiyun .abox_mask = GENMASK(2, 1), \
854*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \
855*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \
856*4882a593Smuzhiyun BIT(TRANSCODER_C) | BIT(TRANSCODER_D) | \
857*4882a593Smuzhiyun BIT(TRANSCODER_DSI_0) | BIT(TRANSCODER_DSI_1), \
858*4882a593Smuzhiyun .pipe_offsets = { \
859*4882a593Smuzhiyun [TRANSCODER_A] = PIPE_A_OFFSET, \
860*4882a593Smuzhiyun [TRANSCODER_B] = PIPE_B_OFFSET, \
861*4882a593Smuzhiyun [TRANSCODER_C] = PIPE_C_OFFSET, \
862*4882a593Smuzhiyun [TRANSCODER_D] = PIPE_D_OFFSET, \
863*4882a593Smuzhiyun [TRANSCODER_DSI_0] = PIPE_DSI0_OFFSET, \
864*4882a593Smuzhiyun [TRANSCODER_DSI_1] = PIPE_DSI1_OFFSET, \
865*4882a593Smuzhiyun }, \
866*4882a593Smuzhiyun .trans_offsets = { \
867*4882a593Smuzhiyun [TRANSCODER_A] = TRANSCODER_A_OFFSET, \
868*4882a593Smuzhiyun [TRANSCODER_B] = TRANSCODER_B_OFFSET, \
869*4882a593Smuzhiyun [TRANSCODER_C] = TRANSCODER_C_OFFSET, \
870*4882a593Smuzhiyun [TRANSCODER_D] = TRANSCODER_D_OFFSET, \
871*4882a593Smuzhiyun [TRANSCODER_DSI_0] = TRANSCODER_DSI0_OFFSET, \
872*4882a593Smuzhiyun [TRANSCODER_DSI_1] = TRANSCODER_DSI1_OFFSET, \
873*4882a593Smuzhiyun }, \
874*4882a593Smuzhiyun TGL_CURSOR_OFFSETS, \
875*4882a593Smuzhiyun .has_global_mocs = 1, \
876*4882a593Smuzhiyun .display.has_dsb = 1
877*4882a593Smuzhiyun
878*4882a593Smuzhiyun static const struct intel_device_info tgl_info = {
879*4882a593Smuzhiyun GEN12_FEATURES,
880*4882a593Smuzhiyun PLATFORM(INTEL_TIGERLAKE),
881*4882a593Smuzhiyun .display.has_modular_fia = 1,
882*4882a593Smuzhiyun .platform_engine_mask =
883*4882a593Smuzhiyun BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2),
884*4882a593Smuzhiyun };
885*4882a593Smuzhiyun
886*4882a593Smuzhiyun static const struct intel_device_info rkl_info = {
887*4882a593Smuzhiyun GEN12_FEATURES,
888*4882a593Smuzhiyun PLATFORM(INTEL_ROCKETLAKE),
889*4882a593Smuzhiyun .abox_mask = BIT(0),
890*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C),
891*4882a593Smuzhiyun .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) |
892*4882a593Smuzhiyun BIT(TRANSCODER_C),
893*4882a593Smuzhiyun .require_force_probe = 1,
894*4882a593Smuzhiyun .display.has_hti = 1,
895*4882a593Smuzhiyun .display.has_psr_hw_tracking = 0,
896*4882a593Smuzhiyun .platform_engine_mask =
897*4882a593Smuzhiyun BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0),
898*4882a593Smuzhiyun };
899*4882a593Smuzhiyun
900*4882a593Smuzhiyun #define GEN12_DGFX_FEATURES \
901*4882a593Smuzhiyun GEN12_FEATURES, \
902*4882a593Smuzhiyun .memory_regions = REGION_SMEM | REGION_LMEM, \
903*4882a593Smuzhiyun .has_master_unit_irq = 1, \
904*4882a593Smuzhiyun .is_dgfx = 1
905*4882a593Smuzhiyun
906*4882a593Smuzhiyun static const struct intel_device_info dg1_info __maybe_unused = {
907*4882a593Smuzhiyun GEN12_DGFX_FEATURES,
908*4882a593Smuzhiyun PLATFORM(INTEL_DG1),
909*4882a593Smuzhiyun .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D),
910*4882a593Smuzhiyun .require_force_probe = 1,
911*4882a593Smuzhiyun .platform_engine_mask =
912*4882a593Smuzhiyun BIT(RCS0) | BIT(BCS0) | BIT(VECS0) |
913*4882a593Smuzhiyun BIT(VCS0) | BIT(VCS2),
914*4882a593Smuzhiyun };
915*4882a593Smuzhiyun
916*4882a593Smuzhiyun #undef GEN
917*4882a593Smuzhiyun #undef PLATFORM
918*4882a593Smuzhiyun
919*4882a593Smuzhiyun /*
920*4882a593Smuzhiyun * Make sure any device matches here are from most specific to most
921*4882a593Smuzhiyun * general. For example, since the Quanta match is based on the subsystem
922*4882a593Smuzhiyun * and subvendor IDs, we need it to come before the more general IVB
923*4882a593Smuzhiyun * PCI ID matches, otherwise we'll use the wrong info struct above.
924*4882a593Smuzhiyun */
925*4882a593Smuzhiyun static const struct pci_device_id pciidlist[] = {
926*4882a593Smuzhiyun INTEL_I830_IDS(&i830_info),
927*4882a593Smuzhiyun INTEL_I845G_IDS(&i845g_info),
928*4882a593Smuzhiyun INTEL_I85X_IDS(&i85x_info),
929*4882a593Smuzhiyun INTEL_I865G_IDS(&i865g_info),
930*4882a593Smuzhiyun INTEL_I915G_IDS(&i915g_info),
931*4882a593Smuzhiyun INTEL_I915GM_IDS(&i915gm_info),
932*4882a593Smuzhiyun INTEL_I945G_IDS(&i945g_info),
933*4882a593Smuzhiyun INTEL_I945GM_IDS(&i945gm_info),
934*4882a593Smuzhiyun INTEL_I965G_IDS(&i965g_info),
935*4882a593Smuzhiyun INTEL_G33_IDS(&g33_info),
936*4882a593Smuzhiyun INTEL_I965GM_IDS(&i965gm_info),
937*4882a593Smuzhiyun INTEL_GM45_IDS(&gm45_info),
938*4882a593Smuzhiyun INTEL_G45_IDS(&g45_info),
939*4882a593Smuzhiyun INTEL_PINEVIEW_G_IDS(&pnv_g_info),
940*4882a593Smuzhiyun INTEL_PINEVIEW_M_IDS(&pnv_m_info),
941*4882a593Smuzhiyun INTEL_IRONLAKE_D_IDS(&ilk_d_info),
942*4882a593Smuzhiyun INTEL_IRONLAKE_M_IDS(&ilk_m_info),
943*4882a593Smuzhiyun INTEL_SNB_D_GT1_IDS(&snb_d_gt1_info),
944*4882a593Smuzhiyun INTEL_SNB_D_GT2_IDS(&snb_d_gt2_info),
945*4882a593Smuzhiyun INTEL_SNB_M_GT1_IDS(&snb_m_gt1_info),
946*4882a593Smuzhiyun INTEL_SNB_M_GT2_IDS(&snb_m_gt2_info),
947*4882a593Smuzhiyun INTEL_IVB_Q_IDS(&ivb_q_info), /* must be first IVB */
948*4882a593Smuzhiyun INTEL_IVB_M_GT1_IDS(&ivb_m_gt1_info),
949*4882a593Smuzhiyun INTEL_IVB_M_GT2_IDS(&ivb_m_gt2_info),
950*4882a593Smuzhiyun INTEL_IVB_D_GT1_IDS(&ivb_d_gt1_info),
951*4882a593Smuzhiyun INTEL_IVB_D_GT2_IDS(&ivb_d_gt2_info),
952*4882a593Smuzhiyun INTEL_HSW_GT1_IDS(&hsw_gt1_info),
953*4882a593Smuzhiyun INTEL_HSW_GT2_IDS(&hsw_gt2_info),
954*4882a593Smuzhiyun INTEL_HSW_GT3_IDS(&hsw_gt3_info),
955*4882a593Smuzhiyun INTEL_VLV_IDS(&vlv_info),
956*4882a593Smuzhiyun INTEL_BDW_GT1_IDS(&bdw_gt1_info),
957*4882a593Smuzhiyun INTEL_BDW_GT2_IDS(&bdw_gt2_info),
958*4882a593Smuzhiyun INTEL_BDW_GT3_IDS(&bdw_gt3_info),
959*4882a593Smuzhiyun INTEL_BDW_RSVD_IDS(&bdw_rsvd_info),
960*4882a593Smuzhiyun INTEL_CHV_IDS(&chv_info),
961*4882a593Smuzhiyun INTEL_SKL_GT1_IDS(&skl_gt1_info),
962*4882a593Smuzhiyun INTEL_SKL_GT2_IDS(&skl_gt2_info),
963*4882a593Smuzhiyun INTEL_SKL_GT3_IDS(&skl_gt3_info),
964*4882a593Smuzhiyun INTEL_SKL_GT4_IDS(&skl_gt4_info),
965*4882a593Smuzhiyun INTEL_BXT_IDS(&bxt_info),
966*4882a593Smuzhiyun INTEL_GLK_IDS(&glk_info),
967*4882a593Smuzhiyun INTEL_KBL_GT1_IDS(&kbl_gt1_info),
968*4882a593Smuzhiyun INTEL_KBL_GT2_IDS(&kbl_gt2_info),
969*4882a593Smuzhiyun INTEL_KBL_GT3_IDS(&kbl_gt3_info),
970*4882a593Smuzhiyun INTEL_KBL_GT4_IDS(&kbl_gt3_info),
971*4882a593Smuzhiyun INTEL_AML_KBL_GT2_IDS(&kbl_gt2_info),
972*4882a593Smuzhiyun INTEL_CFL_S_GT1_IDS(&cfl_gt1_info),
973*4882a593Smuzhiyun INTEL_CFL_S_GT2_IDS(&cfl_gt2_info),
974*4882a593Smuzhiyun INTEL_CFL_H_GT1_IDS(&cfl_gt1_info),
975*4882a593Smuzhiyun INTEL_CFL_H_GT2_IDS(&cfl_gt2_info),
976*4882a593Smuzhiyun INTEL_CFL_U_GT2_IDS(&cfl_gt2_info),
977*4882a593Smuzhiyun INTEL_CFL_U_GT3_IDS(&cfl_gt3_info),
978*4882a593Smuzhiyun INTEL_WHL_U_GT1_IDS(&cfl_gt1_info),
979*4882a593Smuzhiyun INTEL_WHL_U_GT2_IDS(&cfl_gt2_info),
980*4882a593Smuzhiyun INTEL_AML_CFL_GT2_IDS(&cfl_gt2_info),
981*4882a593Smuzhiyun INTEL_WHL_U_GT3_IDS(&cfl_gt3_info),
982*4882a593Smuzhiyun INTEL_CML_GT1_IDS(&cml_gt1_info),
983*4882a593Smuzhiyun INTEL_CML_GT2_IDS(&cml_gt2_info),
984*4882a593Smuzhiyun INTEL_CML_U_GT1_IDS(&cml_gt1_info),
985*4882a593Smuzhiyun INTEL_CML_U_GT2_IDS(&cml_gt2_info),
986*4882a593Smuzhiyun INTEL_CNL_IDS(&cnl_info),
987*4882a593Smuzhiyun INTEL_ICL_11_IDS(&icl_info),
988*4882a593Smuzhiyun INTEL_EHL_IDS(&ehl_info),
989*4882a593Smuzhiyun INTEL_TGL_12_IDS(&tgl_info),
990*4882a593Smuzhiyun INTEL_RKL_IDS(&rkl_info),
991*4882a593Smuzhiyun {0, 0, 0}
992*4882a593Smuzhiyun };
993*4882a593Smuzhiyun MODULE_DEVICE_TABLE(pci, pciidlist);
994*4882a593Smuzhiyun
i915_pci_remove(struct pci_dev * pdev)995*4882a593Smuzhiyun static void i915_pci_remove(struct pci_dev *pdev)
996*4882a593Smuzhiyun {
997*4882a593Smuzhiyun struct drm_i915_private *i915;
998*4882a593Smuzhiyun
999*4882a593Smuzhiyun i915 = pci_get_drvdata(pdev);
1000*4882a593Smuzhiyun if (!i915) /* driver load aborted, nothing to cleanup */
1001*4882a593Smuzhiyun return;
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun i915_driver_remove(i915);
1004*4882a593Smuzhiyun pci_set_drvdata(pdev, NULL);
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun
1007*4882a593Smuzhiyun /* is device_id present in comma separated list of ids */
force_probe(u16 device_id,const char * devices)1008*4882a593Smuzhiyun static bool force_probe(u16 device_id, const char *devices)
1009*4882a593Smuzhiyun {
1010*4882a593Smuzhiyun char *s, *p, *tok;
1011*4882a593Smuzhiyun bool ret;
1012*4882a593Smuzhiyun
1013*4882a593Smuzhiyun if (!devices || !*devices)
1014*4882a593Smuzhiyun return false;
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun /* match everything */
1017*4882a593Smuzhiyun if (strcmp(devices, "*") == 0)
1018*4882a593Smuzhiyun return true;
1019*4882a593Smuzhiyun
1020*4882a593Smuzhiyun s = kstrdup(devices, GFP_KERNEL);
1021*4882a593Smuzhiyun if (!s)
1022*4882a593Smuzhiyun return false;
1023*4882a593Smuzhiyun
1024*4882a593Smuzhiyun for (p = s, ret = false; (tok = strsep(&p, ",")) != NULL; ) {
1025*4882a593Smuzhiyun u16 val;
1026*4882a593Smuzhiyun
1027*4882a593Smuzhiyun if (kstrtou16(tok, 16, &val) == 0 && val == device_id) {
1028*4882a593Smuzhiyun ret = true;
1029*4882a593Smuzhiyun break;
1030*4882a593Smuzhiyun }
1031*4882a593Smuzhiyun }
1032*4882a593Smuzhiyun
1033*4882a593Smuzhiyun kfree(s);
1034*4882a593Smuzhiyun
1035*4882a593Smuzhiyun return ret;
1036*4882a593Smuzhiyun }
1037*4882a593Smuzhiyun
i915_pci_probe(struct pci_dev * pdev,const struct pci_device_id * ent)1038*4882a593Smuzhiyun static int i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1039*4882a593Smuzhiyun {
1040*4882a593Smuzhiyun struct intel_device_info *intel_info =
1041*4882a593Smuzhiyun (struct intel_device_info *) ent->driver_data;
1042*4882a593Smuzhiyun int err;
1043*4882a593Smuzhiyun
1044*4882a593Smuzhiyun if (intel_info->require_force_probe &&
1045*4882a593Smuzhiyun !force_probe(pdev->device, i915_modparams.force_probe)) {
1046*4882a593Smuzhiyun dev_info(&pdev->dev,
1047*4882a593Smuzhiyun "Your graphics device %04x is not properly supported by the driver in this\n"
1048*4882a593Smuzhiyun "kernel version. To force driver probe anyway, use i915.force_probe=%04x\n"
1049*4882a593Smuzhiyun "module parameter or CONFIG_DRM_I915_FORCE_PROBE=%04x configuration option,\n"
1050*4882a593Smuzhiyun "or (recommended) check for kernel updates.\n",
1051*4882a593Smuzhiyun pdev->device, pdev->device, pdev->device);
1052*4882a593Smuzhiyun return -ENODEV;
1053*4882a593Smuzhiyun }
1054*4882a593Smuzhiyun
1055*4882a593Smuzhiyun /* Only bind to function 0 of the device. Early generations
1056*4882a593Smuzhiyun * used function 1 as a placeholder for multi-head. This causes
1057*4882a593Smuzhiyun * us confusion instead, especially on the systems where both
1058*4882a593Smuzhiyun * functions have the same PCI-ID!
1059*4882a593Smuzhiyun */
1060*4882a593Smuzhiyun if (PCI_FUNC(pdev->devfn))
1061*4882a593Smuzhiyun return -ENODEV;
1062*4882a593Smuzhiyun
1063*4882a593Smuzhiyun /*
1064*4882a593Smuzhiyun * apple-gmux is needed on dual GPU MacBook Pro
1065*4882a593Smuzhiyun * to probe the panel if we're the inactive GPU.
1066*4882a593Smuzhiyun */
1067*4882a593Smuzhiyun if (vga_switcheroo_client_probe_defer(pdev))
1068*4882a593Smuzhiyun return -EPROBE_DEFER;
1069*4882a593Smuzhiyun
1070*4882a593Smuzhiyun err = i915_driver_probe(pdev, ent);
1071*4882a593Smuzhiyun if (err)
1072*4882a593Smuzhiyun return err;
1073*4882a593Smuzhiyun
1074*4882a593Smuzhiyun if (i915_inject_probe_failure(pci_get_drvdata(pdev))) {
1075*4882a593Smuzhiyun i915_pci_remove(pdev);
1076*4882a593Smuzhiyun return -ENODEV;
1077*4882a593Smuzhiyun }
1078*4882a593Smuzhiyun
1079*4882a593Smuzhiyun err = i915_live_selftests(pdev);
1080*4882a593Smuzhiyun if (err) {
1081*4882a593Smuzhiyun i915_pci_remove(pdev);
1082*4882a593Smuzhiyun return err > 0 ? -ENOTTY : err;
1083*4882a593Smuzhiyun }
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun err = i915_perf_selftests(pdev);
1086*4882a593Smuzhiyun if (err) {
1087*4882a593Smuzhiyun i915_pci_remove(pdev);
1088*4882a593Smuzhiyun return err > 0 ? -ENOTTY : err;
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun return 0;
1092*4882a593Smuzhiyun }
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun static struct pci_driver i915_pci_driver = {
1095*4882a593Smuzhiyun .name = DRIVER_NAME,
1096*4882a593Smuzhiyun .id_table = pciidlist,
1097*4882a593Smuzhiyun .probe = i915_pci_probe,
1098*4882a593Smuzhiyun .remove = i915_pci_remove,
1099*4882a593Smuzhiyun .driver.pm = &i915_pm_ops,
1100*4882a593Smuzhiyun };
1101*4882a593Smuzhiyun
i915_init(void)1102*4882a593Smuzhiyun static int __init i915_init(void)
1103*4882a593Smuzhiyun {
1104*4882a593Smuzhiyun bool use_kms = true;
1105*4882a593Smuzhiyun int err;
1106*4882a593Smuzhiyun
1107*4882a593Smuzhiyun err = i915_globals_init();
1108*4882a593Smuzhiyun if (err)
1109*4882a593Smuzhiyun return err;
1110*4882a593Smuzhiyun
1111*4882a593Smuzhiyun err = i915_mock_selftests();
1112*4882a593Smuzhiyun if (err)
1113*4882a593Smuzhiyun return err > 0 ? 0 : err;
1114*4882a593Smuzhiyun
1115*4882a593Smuzhiyun /*
1116*4882a593Smuzhiyun * Enable KMS by default, unless explicitly overriden by
1117*4882a593Smuzhiyun * either the i915.modeset prarameter or by the
1118*4882a593Smuzhiyun * vga_text_mode_force boot option.
1119*4882a593Smuzhiyun */
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun if (i915_modparams.modeset == 0)
1122*4882a593Smuzhiyun use_kms = false;
1123*4882a593Smuzhiyun
1124*4882a593Smuzhiyun if (vgacon_text_force() && i915_modparams.modeset == -1)
1125*4882a593Smuzhiyun use_kms = false;
1126*4882a593Smuzhiyun
1127*4882a593Smuzhiyun if (!use_kms) {
1128*4882a593Smuzhiyun /* Silently fail loading to not upset userspace. */
1129*4882a593Smuzhiyun DRM_DEBUG_DRIVER("KMS disabled.\n");
1130*4882a593Smuzhiyun return 0;
1131*4882a593Smuzhiyun }
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun err = pci_register_driver(&i915_pci_driver);
1134*4882a593Smuzhiyun if (err)
1135*4882a593Smuzhiyun return err;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun i915_perf_sysctl_register();
1138*4882a593Smuzhiyun return 0;
1139*4882a593Smuzhiyun }
1140*4882a593Smuzhiyun
i915_exit(void)1141*4882a593Smuzhiyun static void __exit i915_exit(void)
1142*4882a593Smuzhiyun {
1143*4882a593Smuzhiyun if (!i915_pci_driver.driver.owner)
1144*4882a593Smuzhiyun return;
1145*4882a593Smuzhiyun
1146*4882a593Smuzhiyun i915_perf_sysctl_unregister();
1147*4882a593Smuzhiyun pci_unregister_driver(&i915_pci_driver);
1148*4882a593Smuzhiyun i915_globals_exit();
1149*4882a593Smuzhiyun }
1150*4882a593Smuzhiyun
1151*4882a593Smuzhiyun module_init(i915_init);
1152*4882a593Smuzhiyun module_exit(i915_exit);
1153*4882a593Smuzhiyun
1154*4882a593Smuzhiyun MODULE_AUTHOR("Tungsten Graphics, Inc.");
1155*4882a593Smuzhiyun MODULE_AUTHOR("Intel Corporation");
1156*4882a593Smuzhiyun
1157*4882a593Smuzhiyun MODULE_DESCRIPTION(DRIVER_DESC);
1158*4882a593Smuzhiyun MODULE_LICENSE("GPL and additional rights");
1159