xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/i915/i915_pci.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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